[PATCH 7/8] wined3d: Handle hull shader control point outputs.
Józef Kucia
jkucia at codeweavers.com
Thu May 18 08:20:00 CDT 2017
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/wined3d/glsl_shader.c | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 2c5fa5b..708bfee 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -6633,7 +6633,7 @@ static void shader_glsl_setup_vs3_output(struct shader_glsl_priv *priv,
static void shader_glsl_setup_sm4_shader_output(struct shader_glsl_priv *priv,
unsigned int input_count, const struct wined3d_shader_signature *output_signature,
- const struct wined3d_shader_reg_maps *reg_maps_out)
+ const struct wined3d_shader_reg_maps *reg_maps_out, const char *output_variable_name)
{
struct wined3d_string_buffer *buffer = &priv->shader_buffer;
char reg_mask[6];
@@ -6654,8 +6654,8 @@ static void shader_glsl_setup_sm4_shader_output(struct shader_glsl_priv *priv,
shader_glsl_write_mask_to_str(output->mask, reg_mask);
- shader_addline(buffer, "shader_out.reg[%u]%s = outputs[%u]%s;\n",
- output->register_idx, reg_mask, output->register_idx, reg_mask);
+ shader_addline(buffer, "%s.reg[%u]%s = outputs[%u]%s;\n",
+ output_variable_name, output->register_idx, reg_mask, output->register_idx, reg_mask);
}
}
@@ -6713,7 +6713,7 @@ static void shader_glsl_setup_sm3_rasterizer_input(struct shader_glsl_priv *priv
shader_glsl_setup_vs3_output(priv, gl_info, map, input_signature, reg_maps_in,
output_signature, reg_maps_out);
else
- shader_glsl_setup_sm4_shader_output(priv, input_count, output_signature, reg_maps_out);
+ shader_glsl_setup_sm4_shader_output(priv, input_count, output_signature, reg_maps_out, "shader_out");
}
/* Context activation is done by the caller. */
@@ -6880,7 +6880,8 @@ static void shader_glsl_generate_sm4_output_setup(struct shader_glsl_priv *priv,
shader_glsl_setup_sm3_rasterizer_input(priv, gl_info, NULL, NULL,
NULL, input_count, &shader->output_signature, &shader->reg_maps, FALSE);
else
- shader_glsl_setup_sm4_shader_output(priv, input_count, &shader->output_signature, &shader->reg_maps);
+ shader_glsl_setup_sm4_shader_output(priv, input_count, &shader->output_signature,
+ &shader->reg_maps, "shader_out");
shader_addline(buffer, "}\n");
}
@@ -7438,11 +7439,21 @@ static GLuint shader_glsl_generate_hull_shader(const struct wined3d_context *con
shader_addline(buffer, "in shader_in_out { vec4 reg[%u]; } shader_in[];\n", shader->limits->packed_input);
shader_addline(buffer, "out shader_in_out { vec4 reg[%u]; } shader_out[];\n", shader->limits->packed_output);
+ if (hs->phases.control_point)
+ {
+ shader_addline(buffer, "void setup_hs_output(in vec4 outputs[%u])\n{\n",
+ shader->limits->packed_output);
+ shader_glsl_setup_sm4_shader_output(priv, shader->limits->packed_output, &shader->output_signature,
+ &shader->reg_maps, "shader_out[gl_InvocationID]");
+ shader_addline(buffer, "}\n");
+ }
+
shader_addline(buffer, "void hs_control_point_phase()\n{\n");
if ((phase = hs->phases.control_point))
{
if (FAILED(shader_generate_code(shader, buffer, reg_maps, &priv_ctx, phase->start, phase->end)))
return 0;
+ shader_addline(buffer, "setup_hs_output(hs_out);\n");
}
else
{
--
2.10.2
More information about the wine-patches
mailing list