Commit 45deb5aa authored by Józef Kucia's avatar Józef Kucia Committed by Alexandre Julliard

wined3d: Factor out shader_get_stream_output_register_info().

parent a2ea5a98
......@@ -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, &register_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, &register_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, &register_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");
......
......@@ -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, &register_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;
}
}
......
......@@ -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 *);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment