Henri Verbeet : wined3d: Get rid of D3DCREATESHADEROBJECTINSTANCE.
Alexandre Julliard
julliard at winehq.org
Mon Jan 12 10:41:00 CST 2009
Module: wine
Branch: master
Commit: 894edc49cc1b5159e6801cdfc933099d22d1696a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=894edc49cc1b5159e6801cdfc933099d22d1696a
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Mon Jan 12 10:17:50 2009 +0100
wined3d: Get rid of D3DCREATESHADEROBJECTINSTANCE.
---
dlls/wined3d/baseshader.c | 9 +++++++++
dlls/wined3d/device.c | 40 +++++++++++++++++++++++++---------------
dlls/wined3d/wined3d_private.h | 2 ++
3 files changed, 36 insertions(+), 15 deletions(-)
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index ade4586..a270b0c 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -90,6 +90,15 @@ int shader_addline(
return 0;
}
+void shader_init(struct IWineD3DBaseShaderClass *shader,
+ IWineD3DDevice *device, const SHADER_OPCODE *instruction_table)
+{
+ shader->ref = 1;
+ shader->device = device;
+ shader->shader_ins = instruction_table;
+ list_init(&shader->linked_programs);
+}
+
const SHADER_OPCODE *shader_get_opcode(const SHADER_OPCODE *opcode_table, DWORD shader_version, DWORD code)
{
DWORD i = 0;
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 9fb7485..09f2db5 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -67,17 +67,6 @@ static void IWineD3DDeviceImpl_AddResource(IWineD3DDevice *iface, IWineD3DResour
*pp##type = (IWineD3D##type *) object; \
}
-#define D3DCREATESHADEROBJECTINSTANCE(object, type) { \
- object=HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3D##type##Impl)); \
- D3DMEMCHECK(object, pp##type); \
- object->lpVtbl = &IWineD3D##type##_Vtbl; \
- object->parent = parent; \
- object->baseShader.ref = 1; \
- object->baseShader.device = (IWineD3DDevice*) This; \
- list_init(&object->baseShader.linked_programs); \
- *pp##type = (IWineD3D##type *) object; \
-}
-
#define D3DCREATERESOURCEOBJECTINSTANCE(object, type, d3dtype, _size){ \
object=HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3D##type##Impl)); \
D3DMEMCHECK(object, pp##type); \
@@ -1890,8 +1879,18 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexShader(IWineD3DDevice *ifac
if (!pFunction) return WINED3DERR_INVALIDCALL;
- D3DCREATESHADEROBJECTINSTANCE(object, VertexShader)
- object->baseShader.shader_ins = IWineD3DVertexShaderImpl_shader_ins;
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+ if (!object)
+ {
+ ERR("Out of memory\n");
+ *ppVertexShader = NULL;
+ return WINED3DERR_OUTOFVIDEOMEMORY;
+ }
+
+ object->lpVtbl = &IWineD3DVertexShader_Vtbl;
+ object->parent = parent;
+ shader_init(&object->baseShader, iface, IWineD3DVertexShaderImpl_shader_ins);
+ *ppVertexShader = (IWineD3DVertexShader *)object;
TRACE("(%p) : Created Vertex shader %p\n", This, *ppVertexShader);
@@ -1918,8 +1917,19 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreatePixelShader(IWineD3DDevice *iface
if (!pFunction) return WINED3DERR_INVALIDCALL;
- D3DCREATESHADEROBJECTINSTANCE(object, PixelShader)
- object->baseShader.shader_ins = IWineD3DPixelShaderImpl_shader_ins;
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+ if (!object)
+ {
+ ERR("Out of memory\n");
+ *ppPixelShader = NULL;
+ return WINED3DERR_OUTOFVIDEOMEMORY;
+ }
+
+ object->lpVtbl = &IWineD3DPixelShader_Vtbl;
+ object->parent = parent;
+ shader_init(&object->baseShader, iface, IWineD3DPixelShaderImpl_shader_ins);
+ *ppPixelShader = (IWineD3DPixelShader *)object;
+
hr = IWineD3DPixelShader_SetFunction(*ppPixelShader, pFunction);
if (WINED3D_OK == hr) {
TRACE("(%p) : Created Pixel shader %p\n", This, *ppPixelShader);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 03b5242..0b5029f 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2243,6 +2243,8 @@ void shader_buffer_free(struct SHADER_BUFFER *buffer);
void shader_cleanup(IWineD3DBaseShader *iface);
HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, struct shader_reg_maps *reg_maps,
struct semantic *semantics_in, struct semantic *semantics_out, const DWORD *byte_code);
+void shader_init(struct IWineD3DBaseShaderClass *shader,
+ IWineD3DDevice *device, const SHADER_OPCODE *instruction_table);
void shader_trace_init(const DWORD *byte_code, const SHADER_OPCODE *opcode_table);
extern void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER *buffer,
More information about the wine-cvs
mailing list