Module: wine Branch: master Commit: cc68900d86608fd503c6000a537f19bd0fcc9ca1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cc68900d86608fd503c6000a53...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Wed Sep 23 10:05:48 2009 +0200
d3d10core: Add a separate function for d3d10_input_layout initialization.
---
dlls/d3d10core/d3d10core_private.h | 7 +++---- dlls/d3d10core/device.c | 16 ++++------------ dlls/d3d10core/inputlayout.c | 35 +++++++++++++++++++++++++++++++++-- 3 files changed, 40 insertions(+), 18 deletions(-)
diff --git a/dlls/d3d10core/d3d10core_private.h b/dlls/d3d10core/d3d10core_private.h index 42fe735..5d1e6ee 100644 --- a/dlls/d3d10core/d3d10core_private.h +++ b/dlls/d3d10core/d3d10core_private.h @@ -119,7 +119,6 @@ struct d3d10_rendertarget_view };
/* ID3D10InputLayout */ -extern const struct ID3D10InputLayoutVtbl d3d10_input_layout_vtbl DECLSPEC_HIDDEN; struct d3d10_input_layout { const struct ID3D10InputLayoutVtbl *vtbl; @@ -128,9 +127,9 @@ struct d3d10_input_layout IWineD3DVertexDeclaration *wined3d_decl; };
-HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEMENT_DESC *element_descs, - UINT element_count, const void *shader_byte_code, SIZE_T shader_byte_code_length, - WINED3DVERTEXELEMENT **wined3d_elements, UINT *wined3d_element_count) DECLSPEC_HIDDEN; +HRESULT d3d10_input_layout_init(struct d3d10_input_layout *layout, struct d3d10_device *device, + const D3D10_INPUT_ELEMENT_DESC *element_descs, UINT element_count, + const void *shader_byte_code, SIZE_T shader_byte_code_length) DECLSPEC_HIDDEN;
/* ID3D10VertexShader */ extern const struct ID3D10VertexShaderVtbl d3d10_vertex_shader_vtbl DECLSPEC_HIDDEN; diff --git a/dlls/d3d10core/device.c b/dlls/d3d10core/device.c index 80cbc61..5027092 100644 --- a/dlls/d3d10core/device.c +++ b/dlls/d3d10core/device.c @@ -901,8 +901,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateInputLayout(ID3D10Device *if { struct d3d10_device *This = (struct d3d10_device *)iface; struct d3d10_input_layout *object; - WINED3DVERTEXELEMENT *wined3d_elements; - UINT wined3d_element_count; HRESULT hr;
TRACE("iface %p, element_descs %p, element_count %u, shader_byte_code %p," @@ -917,22 +915,16 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateInputLayout(ID3D10Device *if return E_OUTOFMEMORY; }
- object->vtbl = &d3d10_input_layout_vtbl; - object->refcount = 1; - - hr = d3d10_input_layout_to_wined3d_declaration(element_descs, element_count, - shader_byte_code, shader_byte_code_length, &wined3d_elements, &wined3d_element_count); + hr = d3d10_input_layout_init(object, This, element_descs, element_count, + shader_byte_code, shader_byte_code_length); if (FAILED(hr)) { + WARN("Failed to initialize input layout, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); return hr; }
- IWineD3DDevice_CreateVertexDeclaration(This->wined3d_device, &object->wined3d_decl, - (IUnknown *)object, wined3d_elements, wined3d_element_count); - - HeapFree(GetProcessHeap(), 0, wined3d_elements); - + TRACE("Created input layout %p.\n", object); *input_layout = (ID3D10InputLayout *)object;
return S_OK; diff --git a/dlls/d3d10core/inputlayout.c b/dlls/d3d10core/inputlayout.c index 69d2173..6300a9d 100644 --- a/dlls/d3d10core/inputlayout.c +++ b/dlls/d3d10core/inputlayout.c @@ -39,7 +39,7 @@ static HRESULT isgn_handler(const char *data, DWORD data_size, DWORD tag, void * } }
-HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEMENT_DESC *element_descs, +static HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEMENT_DESC *element_descs, UINT element_count, const void *shader_byte_code, SIZE_T shader_byte_code_length, WINED3DVERTEXELEMENT **wined3d_elements, UINT *wined3d_element_count) { @@ -181,7 +181,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_input_layout_SetPrivateDataInterface(ID3D return E_NOTIMPL; }
-const struct ID3D10InputLayoutVtbl d3d10_input_layout_vtbl = +static const struct ID3D10InputLayoutVtbl d3d10_input_layout_vtbl = { /* IUnknown methods */ d3d10_input_layout_QueryInterface, @@ -193,3 +193,34 @@ const struct ID3D10InputLayoutVtbl d3d10_input_layout_vtbl = d3d10_input_layout_SetPrivateData, d3d10_input_layout_SetPrivateDataInterface, }; + +HRESULT d3d10_input_layout_init(struct d3d10_input_layout *layout, struct d3d10_device *device, + const D3D10_INPUT_ELEMENT_DESC *element_descs, UINT element_count, + const void *shader_byte_code, SIZE_T shader_byte_code_length) +{ + WINED3DVERTEXELEMENT *wined3d_elements; + UINT wined3d_element_count; + HRESULT hr; + + layout->vtbl = &d3d10_input_layout_vtbl; + layout->refcount = 1; + + hr = d3d10_input_layout_to_wined3d_declaration(element_descs, element_count, + shader_byte_code, shader_byte_code_length, &wined3d_elements, &wined3d_element_count); + if (FAILED(hr)) + { + WARN("Failed to create wined3d vertex declaration elements, hr %#x.\n", hr); + return hr; + } + + hr = IWineD3DDevice_CreateVertexDeclaration(device->wined3d_device, &layout->wined3d_decl, + (IUnknown *)layout, wined3d_elements, wined3d_element_count); + HeapFree(GetProcessHeap(), 0, wined3d_elements); + if (FAILED(hr)) + { + WARN("Failed to create wined3d vertex declaration, hr %#x.\n", hr); + return hr; + } + + return S_OK; +}