From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/shader.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-)
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index 671aaa929cc..1b133cb3a60 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -2269,7 +2269,7 @@ static HRESULT geometry_shader_init_stream_output(struct wined3d_shader *shader, }
static HRESULT shader_set_function(struct wined3d_shader *shader, struct wined3d_device *device, - enum wined3d_shader_type type, unsigned int float_const_count) + enum wined3d_shader_type type, const struct wined3d_stream_output_desc *so_desc, unsigned int float_const_count) { const struct wined3d_d3d_info *d3d_info = &shader->device->adapter->d3d_info; struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps; @@ -2281,6 +2281,14 @@ static HRESULT shader_set_function(struct wined3d_shader *shader, struct wined3d TRACE("shader %p, device %p, type %s, float_const_count %u.\n", shader, device, debug_shader_type(type), float_const_count);
+ if (type == WINED3D_SHADER_TYPE_GEOMETRY) + { + if (FAILED(hr = geometry_shader_init_stream_output(shader, so_desc))) + return hr; + if (!shader->function) + return S_OK; + } + fe = shader->frontend; if (!(shader->frontend_data = fe->shader_init(shader->function, shader->functionLength, &shader->output_signature))) @@ -2719,7 +2727,7 @@ static HRESULT vertex_shader_init(struct wined3d_shader *shader, struct wined3d_ return hr;
if (FAILED(hr = shader_set_function(shader, device, - WINED3D_SHADER_TYPE_VERTEX, device->adapter->d3d_info.limits.vs_uniform_count))) + WINED3D_SHADER_TYPE_VERTEX, NULL, device->adapter->d3d_info.limits.vs_uniform_count))) { shader_cleanup(shader); return hr; @@ -2752,11 +2760,7 @@ static HRESULT geometry_shader_init(struct wined3d_shader *shader, struct wined3 if (FAILED(hr = shader_init(shader, device, desc, parent, parent_ops))) return hr;
- if (FAILED(hr = geometry_shader_init_stream_output(shader, so_desc))) - goto fail; - - if (shader->function - && FAILED(hr = shader_set_function(shader, device, WINED3D_SHADER_TYPE_GEOMETRY, 0))) + if (FAILED(hr = shader_set_function(shader, device, WINED3D_SHADER_TYPE_GEOMETRY, so_desc, 0))) goto fail;
return WINED3D_OK; @@ -3088,7 +3092,7 @@ static HRESULT pixel_shader_init(struct wined3d_shader *shader, struct wined3d_d return hr;
if (FAILED(hr = shader_set_function(shader, device, - WINED3D_SHADER_TYPE_PIXEL, d3d_info->limits.ps_uniform_count))) + WINED3D_SHADER_TYPE_PIXEL, NULL, d3d_info->limits.ps_uniform_count))) { shader_cleanup(shader); return hr; @@ -3180,7 +3184,7 @@ HRESULT CDECL wined3d_shader_create_cs(struct wined3d_device *device, const stru return hr; }
- if (FAILED(hr = shader_set_function(object, device, WINED3D_SHADER_TYPE_COMPUTE, 0))) + if (FAILED(hr = shader_set_function(object, device, WINED3D_SHADER_TYPE_COMPUTE, NULL, 0))) { shader_cleanup(object); free(object); @@ -3214,7 +3218,7 @@ HRESULT CDECL wined3d_shader_create_ds(struct wined3d_device *device, const stru return hr; }
- if (FAILED(hr = shader_set_function(object, device, WINED3D_SHADER_TYPE_DOMAIN, 0))) + if (FAILED(hr = shader_set_function(object, device, WINED3D_SHADER_TYPE_DOMAIN, NULL, 0))) { shader_cleanup(object); free(object); @@ -3276,7 +3280,7 @@ HRESULT CDECL wined3d_shader_create_hs(struct wined3d_device *device, const stru return hr; }
- if (FAILED(hr = shader_set_function(object, device, WINED3D_SHADER_TYPE_HULL, 0))) + if (FAILED(hr = shader_set_function(object, device, WINED3D_SHADER_TYPE_HULL, NULL, 0))) { shader_cleanup(object); free(object);