Module: wine Branch: master Commit: 0a72acc7f487731ab259b6dd88cb72dd0a677622 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0a72acc7f487731ab259b6dd88...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Wed Sep 23 18:42:05 2009 +0200
d3d10core: Add a separate function for d3d10_vertex_shader initialization.
---
dlls/d3d10core/d3d10core_private.h | 4 +++- dlls/d3d10core/device.c | 21 +++------------------ dlls/d3d10core/shader.c | 32 +++++++++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 20 deletions(-)
diff --git a/dlls/d3d10core/d3d10core_private.h b/dlls/d3d10core/d3d10core_private.h index 5d1e6ee..320ca69 100644 --- a/dlls/d3d10core/d3d10core_private.h +++ b/dlls/d3d10core/d3d10core_private.h @@ -132,7 +132,6 @@ HRESULT d3d10_input_layout_init(struct d3d10_input_layout *layout, struct d3d10_ const void *shader_byte_code, SIZE_T shader_byte_code_length) DECLSPEC_HIDDEN;
/* ID3D10VertexShader */ -extern const struct ID3D10VertexShaderVtbl d3d10_vertex_shader_vtbl DECLSPEC_HIDDEN; struct d3d10_vertex_shader { const struct ID3D10VertexShaderVtbl *vtbl; @@ -142,6 +141,9 @@ struct d3d10_vertex_shader struct wined3d_shader_signature output_signature; };
+HRESULT d3d10_vertex_shader_init(struct d3d10_vertex_shader *shader, struct d3d10_device *device, + const void *byte_code, SIZE_T byte_code_length) DECLSPEC_HIDDEN; + /* ID3D10GeometryShader */ extern const struct ID3D10GeometryShaderVtbl d3d10_geometry_shader_vtbl DECLSPEC_HIDDEN; struct d3d10_geometry_shader diff --git a/dlls/d3d10core/device.c b/dlls/d3d10core/device.c index 5027092..4b64a2c 100644 --- a/dlls/d3d10core/device.c +++ b/dlls/d3d10core/device.c @@ -935,7 +935,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateVertexShader(ID3D10Device *i { struct d3d10_device *This = (struct d3d10_device *)iface; struct d3d10_vertex_shader *object; - struct d3d10_shader_info shader_info; HRESULT hr;
TRACE("iface %p, byte_code %p, byte_code_length %lu, shader %p\n", @@ -948,29 +947,15 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateVertexShader(ID3D10Device *i return E_OUTOFMEMORY; }
- object->vtbl = &d3d10_vertex_shader_vtbl; - object->refcount = 1; - - shader_info.output_signature = &object->output_signature; - hr = shader_extract_from_dxbc(byte_code, byte_code_length, &shader_info); + hr = d3d10_vertex_shader_init(object, This, byte_code, byte_code_length); if (FAILED(hr)) { - ERR("Failed to extract shader, hr %#x\n", hr); - HeapFree(GetProcessHeap(), 0, object); - return hr; - } - - hr = IWineD3DDevice_CreateVertexShader(This->wined3d_device, - shader_info.shader_code, &object->output_signature, - &object->wined3d_shader, (IUnknown *)object); - if (FAILED(hr)) - { - ERR("CreateVertexShader failed, hr %#x\n", hr); - shader_free_signature(&object->output_signature); + WARN("Failed to initialize vertex shader, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); return hr; }
+ TRACE("Created vertex shader %p.\n", object); *shader = (ID3D10VertexShader *)object;
return S_OK; diff --git a/dlls/d3d10core/shader.c b/dlls/d3d10core/shader.c index 11e080d..197b40a 100644 --- a/dlls/d3d10core/shader.c +++ b/dlls/d3d10core/shader.c @@ -214,7 +214,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_SetPrivateDataInterface(ID3 return E_NOTIMPL; }
-const struct ID3D10VertexShaderVtbl d3d10_vertex_shader_vtbl = +static const struct ID3D10VertexShaderVtbl d3d10_vertex_shader_vtbl = { /* IUnknown methods */ d3d10_vertex_shader_QueryInterface, @@ -227,6 +227,36 @@ const struct ID3D10VertexShaderVtbl d3d10_vertex_shader_vtbl = d3d10_vertex_shader_SetPrivateDataInterface, };
+HRESULT d3d10_vertex_shader_init(struct d3d10_vertex_shader *shader, struct d3d10_device *device, + const void *byte_code, SIZE_T byte_code_length) +{ + struct d3d10_shader_info shader_info; + HRESULT hr; + + shader->vtbl = &d3d10_vertex_shader_vtbl; + shader->refcount = 1; + + shader_info.output_signature = &shader->output_signature; + hr = shader_extract_from_dxbc(byte_code, byte_code_length, &shader_info); + if (FAILED(hr)) + { + ERR("Failed to extract shader, hr %#x.\n", hr); + return hr; + } + + hr = IWineD3DDevice_CreateVertexShader(device->wined3d_device, + shader_info.shader_code, &shader->output_signature, + &shader->wined3d_shader, (IUnknown *)shader); + if (FAILED(hr)) + { + WARN("Failed to create wined3d vertex shader, hr %#x.\n", hr); + shader_free_signature(&shader->output_signature); + return hr; + } + + return S_OK; +} + /* IUnknown methods */
static HRESULT STDMETHODCALLTYPE d3d10_geometry_shader_QueryInterface(ID3D10GeometryShader *iface,