=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Implement patch constant registers.
Alexandre Julliard
julliard at winehq.org
Mon May 22 15:54:03 CDT 2017
Module: wine
Branch: master
Commit: bf27e30aef1bc282d21dcfd7ebc2fccf1bead8f6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bf27e30aef1bc282d21dcfd7ebc2fccf1bead8f6
Author: Józef Kucia <jkucia at codeweavers.com>
Date: Sat May 20 13:46:02 2017 +0200
wined3d: Implement patch constant registers.
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wined3d/glsl_shader.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 86 insertions(+)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 06b843e..dd96703 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -3064,6 +3064,13 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
sprintf(register_name, "gl_TessCoord");
break;
+ case WINED3DSPR_PATCHCONST:
+ if (version->type == WINED3D_SHADER_TYPE_HULL)
+ sprintf(register_name, "hs_out[%u]", reg->idx[0].offset);
+ else
+ sprintf(register_name, "vpc[%u]", reg->idx[0].offset);
+ break;
+
default:
FIXME("Unhandled register type %#x.\n", reg->type);
sprintf(register_name, "unrecognized_register");
@@ -6899,6 +6906,79 @@ static void shader_glsl_generate_sm4_output_setup(struct shader_glsl_priv *priv,
shader_addline(buffer, "}\n");
}
+static void shader_glsl_generate_patch_constant_name(struct wined3d_string_buffer *buffer,
+ const struct wined3d_shader_signature_element *constant, unsigned int *user_constant_idx,
+ const char *reg_mask)
+{
+ if (!constant->sysval_semantic)
+ {
+ shader_addline(buffer, "user_patch_constant[%u]%s", (*user_constant_idx)++, reg_mask);
+ return;
+ }
+
+ switch (constant->sysval_semantic)
+ {
+ case WINED3D_SV_TESS_FACTOR_QUADEDGE:
+ case WINED3D_SV_TESS_FACTOR_TRIEDGE:
+ case WINED3D_SV_TESS_FACTOR_LINEDET:
+ case WINED3D_SV_TESS_FACTOR_LINEDEN:
+ shader_addline(buffer, "gl_TessLevelOuter[%u]", constant->semantic_idx);
+ break;
+ case WINED3D_SV_TESS_FACTOR_QUADINT:
+ case WINED3D_SV_TESS_FACTOR_TRIINT:
+ shader_addline(buffer, "gl_TessLevelInner[%u]", constant->semantic_idx);
+ break;
+ default:
+ FIXME("Unhandled sysval semantic %#x.\n", constant->sysval_semantic);
+ shader_addline(buffer, "vec4(0.0)%s", reg_mask);
+ }
+}
+
+static void shader_glsl_generate_patch_constant_setup(struct wined3d_string_buffer *buffer,
+ const struct wined3d_shader_signature *signature, BOOL input_setup)
+{
+ unsigned int i, register_count, user_constant_index, user_constant_count;
+
+ register_count = user_constant_count = 0;
+ for (i = 0; i < signature->element_count; ++i)
+ {
+ const struct wined3d_shader_signature_element *constant = &signature->elements[i];
+ register_count = max(constant->register_idx + 1, register_count);
+ if (!constant->sysval_semantic)
+ ++user_constant_count;
+ }
+
+ if (user_constant_count)
+ shader_addline(buffer, "patch %s vec4 user_patch_constant[%u];\n",
+ input_setup ? "in" : "out", user_constant_count);
+ if (input_setup)
+ shader_addline(buffer, "vec4 vpc[%u];\n", register_count);
+
+ shader_addline(buffer, "void setup_patch_constant_%s()\n{\n", input_setup ? "input" : "output");
+ for (i = 0, user_constant_index = 0; i < signature->element_count; ++i)
+ {
+ const struct wined3d_shader_signature_element *constant = &signature->elements[i];
+ char reg_mask[6];
+
+ shader_glsl_write_mask_to_str(constant->mask, reg_mask);
+
+ if (input_setup)
+ shader_addline(buffer, "vpc[%u]%s", constant->register_idx, reg_mask);
+ else
+ shader_glsl_generate_patch_constant_name(buffer, constant, &user_constant_index, reg_mask);
+
+ shader_addline(buffer, " = ");
+
+ if (input_setup)
+ shader_glsl_generate_patch_constant_name(buffer, constant, &user_constant_index, reg_mask);
+ else
+ shader_addline(buffer, "hs_out[%u]%s", constant->register_idx, reg_mask);
+
+ shader_addline(buffer, ";\n");
+ }
+ shader_addline(buffer, "}\n");
+}
+
static void shader_glsl_generate_srgb_write_correction(struct wined3d_string_buffer *buffer,
const struct wined3d_gl_info *gl_info)
{
@@ -7481,6 +7561,8 @@ 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);
+ shader_glsl_generate_patch_constant_setup(buffer, &shader->patch_constant_signature, FALSE);
+
if (hs->phases.control_point)
{
shader_addline(buffer, "void setup_hs_output(in vec4 outputs[%u])\n{\n",
@@ -7525,6 +7607,7 @@ static GLuint shader_glsl_generate_hull_shader(const struct wined3d_context *con
shader_glsl_generate_shader_phase_invocation(buffer, &hs->phases.fork[i], "fork", i);
for (i = 0; i < hs->phases.join_count; ++i)
shader_glsl_generate_shader_phase_invocation(buffer, &hs->phases.join[i], "join", i);
+ shader_addline(buffer, "setup_patch_constant_output();\n");
shader_addline(buffer, "}\n");
shader_id = GL_EXTCALL(glCreateShader(GL_TESS_CONTROL_SHADER));
@@ -7620,7 +7703,10 @@ static GLuint shader_glsl_generate_domain_shader(const struct wined3d_context *c
shader_glsl_generate_sm4_output_setup(priv, shader, args->output_count, gl_info,
args->next_shader_type == WINED3D_SHADER_TYPE_PIXEL);
+ shader_glsl_generate_patch_constant_setup(buffer, &shader->patch_constant_signature, TRUE);
+
shader_addline(buffer, "void main()\n{\n");
+ shader_addline(buffer, "setup_patch_constant_input();\n");
if (FAILED(shader_generate_code(shader, buffer, reg_maps, &priv_ctx, NULL, NULL)))
return 0;
More information about the wine-cvs
mailing list