[PATCH 4/8] wined3d: Call shader_set_function() separately from shader_init().
Józef Kucia
jkucia at codeweavers.com
Wed Oct 3 05:32:18 CDT 2018
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/wined3d/shader.c | 96 ++++++++++++++++++++++++++++++++++-----------------
1 file changed, 65 insertions(+), 31 deletions(-)
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 38377c0b9857..edaa35ea65cb 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -3700,8 +3700,7 @@ static HRESULT shader_copy_signatures_from_shader_desc(struct wined3d_shader *sh
}
static HRESULT shader_init(struct wined3d_shader *shader, struct wined3d_device *device,
- const struct wined3d_shader_desc *desc, DWORD float_const_count, enum wined3d_shader_type type,
- void *parent, const struct wined3d_parent_ops *parent_ops)
+ const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
{
size_t byte_code_size;
HRESULT hr;
@@ -3765,26 +3764,6 @@ static HRESULT shader_init(struct wined3d_shader *shader, struct wined3d_device
}
memcpy(shader->function, desc->byte_code, byte_code_size);
shader->functionLength = byte_code_size;
-
- if (FAILED(hr = shader_set_function(shader, device, type, float_const_count)))
- {
- WARN("Failed to set function, hr %#x.\n", hr);
- shader_cleanup(shader);
- return hr;
- }
- }
- else
- {
- shader->reg_maps.shader_version.type = type;
- shader->reg_maps.shader_version.major = 4;
- shader->reg_maps.shader_version.minor = 0;
- shader_set_limits(shader);
-
- if (FAILED(hr = shader_scan_output_signature(shader)))
- {
- shader_cleanup(shader);
- return hr;
- }
}
return hr;
@@ -3797,10 +3776,16 @@ static HRESULT vertex_shader_init(struct wined3d_shader *shader, struct wined3d_
unsigned int i;
HRESULT hr;
- if (FAILED(hr = shader_init(shader, device, desc, device->adapter->d3d_info.limits.vs_uniform_count,
- WINED3D_SHADER_TYPE_VERTEX, parent, parent_ops)))
+ if (FAILED(hr = shader_init(shader, device, desc, parent, parent_ops)))
return hr;
+ if (FAILED(hr = shader_set_function(shader, device,
+ WINED3D_SHADER_TYPE_VERTEX, device->adapter->d3d_info.limits.vs_uniform_count)))
+ {
+ shader_cleanup(shader);
+ return hr;
+ }
+
for (i = 0; i < shader->input_signature.element_count; ++i)
{
const struct wined3d_shader_signature_element *input = &shader->input_signature.elements[i];
@@ -3845,10 +3830,32 @@ static HRESULT geometry_shader_init(struct wined3d_shader *shader, struct wined3
}
}
- if (FAILED(hr = shader_init(shader, device, &shader_desc, 0,
- WINED3D_SHADER_TYPE_GEOMETRY, parent, parent_ops)))
+ if (FAILED(hr = shader_init(shader, device, &shader_desc, parent, parent_ops)))
return hr;
+ if (shader_desc.byte_code)
+ {
+ if (FAILED(hr = shader_set_function(shader, device, WINED3D_SHADER_TYPE_GEOMETRY, 0)))
+ {
+ WARN("Failed to set function, hr %#x.\n", hr);
+ shader_cleanup(shader);
+ return hr;
+ }
+ }
+ else
+ {
+ shader->reg_maps.shader_version.type = WINED3D_SHADER_TYPE_GEOMETRY;
+ shader->reg_maps.shader_version.major = 4;
+ shader->reg_maps.shader_version.minor = 0;
+ shader_set_limits(shader);
+
+ if (FAILED(hr = shader_scan_output_signature(shader)))
+ {
+ shader_cleanup(shader);
+ return hr;
+ }
+ }
+
if (so_desc)
{
if (!(elements = heap_calloc(so_desc->element_count, sizeof(*elements))))
@@ -4152,10 +4159,16 @@ static HRESULT pixel_shader_init(struct wined3d_shader *shader, struct wined3d_d
unsigned int i, highest_reg_used = 0, num_regs_used = 0;
HRESULT hr;
- if (FAILED(hr = shader_init(shader, device, desc, device->adapter->d3d_info.limits.ps_uniform_count,
- WINED3D_SHADER_TYPE_PIXEL, parent, parent_ops)))
+ if (FAILED(hr = shader_init(shader, device, desc, parent, parent_ops)))
return hr;
+ if (FAILED(hr = shader_set_function(shader, device,
+ WINED3D_SHADER_TYPE_PIXEL, device->adapter->d3d_info.limits.ps_uniform_count)))
+ {
+ shader_cleanup(shader);
+ return hr;
+ }
+
for (i = 0; i < MAX_REG_INPUT; ++i)
{
if (shader->u.ps.input_reg_used & (1u << i))
@@ -4246,13 +4259,20 @@ HRESULT CDECL wined3d_shader_create_cs(struct wined3d_device *device, const stru
if (!(object = heap_alloc_zero(sizeof(*object))))
return E_OUTOFMEMORY;
- if (FAILED(hr = shader_init(object, device, desc, 0, WINED3D_SHADER_TYPE_COMPUTE, parent, parent_ops)))
+ if (FAILED(hr = shader_init(object, device, desc, parent, parent_ops)))
{
WARN("Failed to initialize compute shader, hr %#x.\n", hr);
heap_free(object);
return hr;
}
+ if (FAILED(hr = shader_set_function(object, device, WINED3D_SHADER_TYPE_COMPUTE, 0)))
+ {
+ shader_cleanup(object);
+ heap_free(object);
+ return hr;
+ }
+
wined3d_cs_init_object(device->cs, wined3d_shader_init_object, object);
TRACE("Created compute shader %p.\n", object);
@@ -4276,13 +4296,20 @@ HRESULT CDECL wined3d_shader_create_ds(struct wined3d_device *device, const stru
if (!(object = heap_alloc_zero(sizeof(*object))))
return E_OUTOFMEMORY;
- if (FAILED(hr = shader_init(object, device, desc, 0, WINED3D_SHADER_TYPE_DOMAIN, parent, parent_ops)))
+ if (FAILED(hr = shader_init(object, device, desc, parent, parent_ops)))
{
WARN("Failed to initialize domain shader, hr %#x.\n", hr);
heap_free(object);
return hr;
}
+ if (FAILED(hr = shader_set_function(object, device, WINED3D_SHADER_TYPE_DOMAIN, 0)))
+ {
+ shader_cleanup(object);
+ heap_free(object);
+ return hr;
+ }
+
wined3d_cs_init_object(device->cs, wined3d_shader_init_object, object);
TRACE("Created domain shader %p.\n", object);
@@ -4337,13 +4364,20 @@ HRESULT CDECL wined3d_shader_create_hs(struct wined3d_device *device, const stru
if (!(object = heap_alloc_zero(sizeof(*object))))
return E_OUTOFMEMORY;
- if (FAILED(hr = shader_init(object, device, desc, 0, WINED3D_SHADER_TYPE_HULL, parent, parent_ops)))
+ if (FAILED(hr = shader_init(object, device, desc, parent, parent_ops)))
{
WARN("Failed to initialize hull shader, hr %#x.\n", hr);
heap_free(object);
return hr;
}
+ if (FAILED(hr = shader_set_function(object, device, WINED3D_SHADER_TYPE_HULL, 0)))
+ {
+ shader_cleanup(object);
+ heap_free(object);
+ return hr;
+ }
+
wined3d_cs_init_object(device->cs, wined3d_shader_init_object, object);
TRACE("Created hull shader %p.\n", object);
--
2.16.4
More information about the wine-devel
mailing list