Henri Verbeet : wined3d: Add a separate function for pixel shader initialization.
Alexandre Julliard
julliard at winehq.org
Thu Sep 24 10:54:24 CDT 2009
Module: wine
Branch: master
Commit: 8aea1b13026b91692b3cf81369f652ad07224c07
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8aea1b13026b91692b3cf81369f652ad07224c07
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Wed Sep 23 18:42:09 2009 +0200
wined3d: Add a separate function for pixel shader initialization.
---
dlls/wined3d/device.c | 31 +++++++++++--------------------
dlls/wined3d/pixelshader.c | 26 +++++++++++++++++++++++++-
dlls/wined3d/wined3d_private.h | 4 +++-
3 files changed, 39 insertions(+), 22 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index b19f846..5a53899 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1795,37 +1795,28 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreatePixelShader(IWineD3DDevice *iface
IWineD3DPixelShader **ppPixelShader, IUnknown *parent)
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- IWineD3DPixelShaderImpl *object; /* NOTE: impl allowed, this is a create */
- HRESULT hr = WINED3D_OK;
-
- if (!pFunction) return WINED3DERR_INVALIDCALL;
+ IWineD3DPixelShaderImpl *object;
+ HRESULT hr;
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
if (!object)
{
- ERR("Out of memory\n");
- *ppPixelShader = NULL;
- return WINED3DERR_OUTOFVIDEOMEMORY;
+ ERR("Failed to allocate shader memory.\n");
+ return E_OUTOFMEMORY;
}
- object->lpVtbl = &IWineD3DPixelShader_Vtbl;
- object->parent = parent;
- shader_init(&object->baseShader, iface);
- list_add_head(&This->shaders, &object->baseShader.shader_list_entry);
- *ppPixelShader = (IWineD3DPixelShader *)object;
-
- TRACE("(%p) : Created pixel shader %p\n", This, *ppPixelShader);
-
- hr = IWineD3DPixelShader_SetFunction(*ppPixelShader, pFunction, output_signature);
+ hr = pixelshader_init(object, This, pFunction, output_signature, parent);
if (FAILED(hr))
{
- WARN("(%p) : Failed to set function, returning %#x\n", iface, hr);
- IWineD3DPixelShader_Release(*ppPixelShader);
- *ppPixelShader = NULL;
+ WARN("Failed to initialize pixel shader, hr %#x.\n", hr);
+ HeapFree(GetProcessHeap(), 0, object);
return hr;
}
- return hr;
+ TRACE("Created pixel shader %p.\n", object);
+ *ppPixelShader = (IWineD3DPixelShader *)object;
+
+ return WINED3D_OK;
}
static HRESULT WINAPI IWineD3DDeviceImpl_CreatePalette(IWineD3DDevice *iface, DWORD Flags,
diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c
index 6ac145c..ba7be4b 100644
--- a/dlls/wined3d/pixelshader.c
+++ b/dlls/wined3d/pixelshader.c
@@ -343,7 +343,7 @@ void pixelshader_update_samplers(struct shader_reg_maps *reg_maps, IWineD3DBaseT
}
}
-const IWineD3DPixelShaderVtbl IWineD3DPixelShader_Vtbl =
+static const IWineD3DPixelShaderVtbl IWineD3DPixelShader_Vtbl =
{
/*** IUnknown methods ***/
IWineD3DPixelShaderImpl_QueryInterface,
@@ -421,3 +421,27 @@ void find_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWineD3DStateBlockImp
}
}
}
+
+HRESULT pixelshader_init(IWineD3DPixelShaderImpl *shader, IWineD3DDeviceImpl *device,
+ const DWORD *byte_code, const struct wined3d_shader_signature *output_signature,
+ IUnknown *parent)
+{
+ HRESULT hr;
+
+ if (!byte_code) return WINED3DERR_INVALIDCALL;
+
+ shader->lpVtbl = &IWineD3DPixelShader_Vtbl;
+ shader->parent = parent;
+ shader_init(&shader->baseShader, (IWineD3DDevice *)device);
+ list_add_head(&device->shaders, &shader->baseShader.shader_list_entry);
+
+ hr = IWineD3DPixelShader_SetFunction((IWineD3DPixelShader *)shader, byte_code, output_signature);
+ if (FAILED(hr))
+ {
+ WARN("Failed to set function, hr %#x.\n", hr);
+ shader_cleanup((IWineD3DBaseShader *)shader);
+ return hr;
+ }
+
+ return WINED3D_OK;
+}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 1c93b22..f4e1845 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2831,7 +2831,9 @@ typedef struct IWineD3DPixelShaderImpl {
} IWineD3DPixelShaderImpl;
-extern const IWineD3DPixelShaderVtbl IWineD3DPixelShader_Vtbl DECLSPEC_HIDDEN;
+HRESULT pixelshader_init(IWineD3DPixelShaderImpl *shader, IWineD3DDeviceImpl *device,
+ const DWORD *byte_code, const struct wined3d_shader_signature *output_signature,
+ IUnknown *parent) DECLSPEC_HIDDEN;
void pixelshader_update_samplers(struct shader_reg_maps *reg_maps,
IWineD3DBaseTexture * const *textures) DECLSPEC_HIDDEN;
void find_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWineD3DStateBlockImpl *stateblock,
More information about the wine-cvs
mailing list