Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/wined3d/glsl_shader.c | 52 +++++++++------------------------- dlls/wined3d/shader.c | 37 +++++++++++++++++------- dlls/wined3d/wined3d_private.h | 5 ++-- 3 files changed, 43 insertions(+), 51 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 4de0f82115df..970fa4b2b6d6 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -822,9 +822,9 @@ static BOOL shader_glsl_generate_transform_feedback_varyings(struct wined3d_stri const char **varyings, unsigned int *varying_count, char *strings, unsigned int *strings_length, GLenum buffer_mode, struct wined3d_shader *shader) { - unsigned int i, component_idx, buffer_idx, count, length, highest_output_slot, stride; const struct wined3d_stream_output_desc *so_desc = &shader->u.gs.so_desc; - const struct wined3d_shader_signature_element *output; + unsigned int buffer_idx, count, length, highest_output_slot, stride; + unsigned int i, register_idx, component_idx; BOOL have_varyings_to_record = FALSE;
count = length = 0; @@ -856,17 +856,9 @@ static BOOL shader_glsl_generate_transform_feedback_varyings(struct wined3d_stri continue; }
- if (!(output = shader_find_signature_element(&shader->output_signature, - e->stream_idx, e->semantic_name, e->semantic_idx))) + if (!shader_get_stream_output_register_info(shader, e, ®ister_idx, &component_idx)) continue;
- for (component_idx = 0; component_idx < 4; ++component_idx) - { - if ((1u << component_idx) & output->mask) - break; - } - component_idx += e->component_idx; - if (component_idx || e->component_count != 4) { if (so_desc->rasterizer_stream_idx != WINED3D_NO_RASTERIZER_STREAM) @@ -878,12 +870,12 @@ static BOOL shader_glsl_generate_transform_feedback_varyings(struct wined3d_stri }
string_buffer_sprintf(buffer, "shader_in_out.reg%u_%u_%u", - output->register_idx, component_idx, component_idx + e->component_count - 1); + register_idx, component_idx, component_idx + e->component_count - 1); append_transform_feedback_varying(varyings, &count, &strings, &length, buffer); } else { - string_buffer_sprintf(buffer, "shader_in_out.reg%u", output->register_idx); + string_buffer_sprintf(buffer, "shader_in_out.reg%u", register_idx); append_transform_feedback_varying(varyings, &count, &strings, &length, buffer); }
@@ -7437,8 +7429,7 @@ static void shader_glsl_generate_stream_output_setup(struct wined3d_string_buffe const struct wined3d_shader *shader) { const struct wined3d_stream_output_desc *so_desc = &shader->u.gs.so_desc; - const struct wined3d_shader_signature_element *output; - unsigned int i, component_idx; + unsigned int i, register_idx, component_idx;
shader_addline(buffer, "out shader_in_out\n{\n"); for (i = 0; i < so_desc->element_count; ++i) @@ -7452,17 +7443,9 @@ static void shader_glsl_generate_stream_output_setup(struct wined3d_string_buffe } if (!e->semantic_name) continue; - if (!(output = shader_find_signature_element(&shader->output_signature, - e->stream_idx, e->semantic_name, e->semantic_idx))) + if (!shader_get_stream_output_register_info(shader, e, ®ister_idx, &component_idx)) continue;
- for (component_idx = 0; component_idx < 4; ++component_idx) - { - if ((1u << component_idx) & output->mask) - break; - } - component_idx += e->component_idx; - if (component_idx || e->component_count != 4) { if (e->component_count == 1) @@ -7471,11 +7454,11 @@ static void shader_glsl_generate_stream_output_setup(struct wined3d_string_buffe shader_addline(buffer, "vec%u", e->component_count);
shader_addline(buffer, " reg%u_%u_%u;\n", - output->register_idx, component_idx, component_idx + e->component_count - 1); + register_idx, component_idx, component_idx + e->component_count - 1); } else { - shader_addline(buffer, "vec4 reg%u;\n", output->register_idx); + shader_addline(buffer, "vec4 reg%u;\n", register_idx); } } shader_addline(buffer, "} shader_out;\n"); @@ -7493,17 +7476,9 @@ static void shader_glsl_generate_stream_output_setup(struct wined3d_string_buffe } if (!e->semantic_name) continue; - if (!(output = shader_find_signature_element(&shader->output_signature, - e->stream_idx, e->semantic_name, e->semantic_idx))) + if (!shader_get_stream_output_register_info(shader, e, ®ister_idx, &component_idx)) continue;
- for (component_idx = 0; component_idx < 4; ++component_idx) - { - if ((1u << component_idx) & output->mask) - break; - } - component_idx += e->component_idx; - if (component_idx || e->component_count != 4) { DWORD write_mask; @@ -7512,13 +7487,12 @@ static void shader_glsl_generate_stream_output_setup(struct wined3d_string_buffe write_mask = ((1u << e->component_count) - 1) << component_idx; shader_glsl_write_mask_to_str(write_mask, str_mask); shader_addline(buffer, "shader_out.reg%u_%u_%u = outputs[%u]%s;\n", - output->register_idx, component_idx, component_idx + e->component_count - 1, - output->register_idx, str_mask); + register_idx, component_idx, component_idx + e->component_count - 1, + register_idx, str_mask); } else { - shader_addline(buffer, "shader_out.reg%u = outputs[%u];\n", - output->register_idx, output->register_idx); + shader_addline(buffer, "shader_out.reg%u = outputs[%u];\n", register_idx, register_idx); } } shader_addline(buffer, "}\n"); diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index a7d0e6911901..b75ff6f99ce7 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -3728,7 +3728,7 @@ static HRESULT vertex_shader_init(struct wined3d_shader *shader, struct wined3d_ return WINED3D_OK; }
-struct wined3d_shader_signature_element *shader_find_signature_element(const struct wined3d_shader_signature *s, +static struct wined3d_shader_signature_element *shader_find_signature_element(const struct wined3d_shader_signature *s, unsigned int stream_idx, const char *semantic_name, unsigned int semantic_idx) { struct wined3d_shader_signature_element *e = s->elements; @@ -3745,14 +3745,36 @@ struct wined3d_shader_signature_element *shader_find_signature_element(const str return NULL; }
+BOOL shader_get_stream_output_register_info(const struct wined3d_shader *shader, + const struct wined3d_stream_output_element *so_element, unsigned int *register_idx, unsigned int *component_idx) +{ + const struct wined3d_shader_signature_element *output; + unsigned int idx; + + if (!(output = shader_find_signature_element(&shader->output_signature, + so_element->stream_idx, so_element->semantic_name, so_element->semantic_idx))) + return FALSE; + + for (idx = 0; idx < 4; ++idx) + { + if (output->mask & (1u << idx)) + break; + } + idx += so_element->component_idx; + + *register_idx = output->register_idx; + *component_idx = idx; + return TRUE; +} + static HRESULT geometry_shader_init_stream_output(struct wined3d_shader *shader, const struct wined3d_stream_output_desc *so_desc) { const struct wined3d_shader_frontend *fe = shader->frontend; const struct wined3d_shader_signature_element *output; + unsigned int i, component_idx, register_idx, mask; struct wined3d_stream_output_element *elements; struct wined3d_shader_version shader_version; - unsigned int i, component_idx, mask; const DWORD *ptr; void *fe_data; HRESULT hr; @@ -3805,7 +3827,8 @@ static HRESULT geometry_shader_init_stream_output(struct wined3d_shader *shader, if (!e->semantic_name) continue; if (!(output = shader_find_signature_element(&shader->output_signature, - e->stream_idx, e->semantic_name, e->semantic_idx))) + e->stream_idx, e->semantic_name, e->semantic_idx)) + || !shader_get_stream_output_register_info(shader, e, ®ister_idx, &component_idx)) { WARN("Failed to find output signature element for stream output entry.\n"); return E_INVALIDARG; @@ -3813,17 +3836,11 @@ static HRESULT geometry_shader_init_stream_output(struct wined3d_shader *shader,
e->semantic_name = output->semantic_name;
- for (component_idx = 0; component_idx < 4; ++component_idx) - { - if ((1u << component_idx) & output->mask) - break; - } - component_idx += e->component_idx; mask = ((1u << e->component_count) - 1) << component_idx; if ((output->mask & 0xff & mask) != mask) { WARN("Invalid component range %u-%u (mask %#x), output mask %#x.\n", - e->component_idx, e->component_count, mask, output->mask & 0xff); + component_idx, e->component_count, mask, output->mask & 0xff); return E_INVALIDARG; } } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 187c9e18c523..6aadc316f68e 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1267,8 +1267,9 @@ extern const struct wined3d_shader_frontend sm4_shader_frontend DECLSPEC_HIDDEN;
HRESULT shader_extract_from_dxbc(struct wined3d_shader *shader, unsigned int max_shader_version, enum wined3d_shader_byte_code_format *format) DECLSPEC_HIDDEN; -struct wined3d_shader_signature_element *shader_find_signature_element(const struct wined3d_shader_signature *s, - unsigned int stream_idx, const char *semantic_name, unsigned int semantic_idx) DECLSPEC_HIDDEN; +BOOL shader_get_stream_output_register_info(const struct wined3d_shader *shader, + const struct wined3d_stream_output_element *so_element, unsigned int *register_idx, + unsigned int *component_idx) DECLSPEC_HIDDEN;
typedef void (*SHADER_HANDLER)(const struct wined3d_shader_instruction *);
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=47448
Your paranoid android.
=== debian9 (32 bit report) ===
d3d11: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
=== debian9 (32 bit Chinese:China report) ===
d3d11: d3d11.c:5346: Test failed: Got unexpected hr 0x8876086a for query type 4. d3d11.c:5593: Test failed: Got unexpected hr 0x8876086a.
=== debian9 (32 bit WoW report) ===
d3d11: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).