Module: wine Branch: master Commit: 894edc49cc1b5159e6801cdfc933099d22d1696a URL: http://source.winehq.org/git/wine.git/?a=commit;h=894edc49cc1b5159e6801cdfc9...
Author: Henri Verbeet hverbeet@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,