diff --git a/dlls/d3d10core/d3d10core_private.h b/dlls/d3d10core/d3d10core_private.h index 5d1e6ee7fa2..320ca695d7b 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 50270924442..4b64a2ce334 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 11e080df833..197b40a638f 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,