From 4597ef6696d75d244e5078a89bac18a1431b936f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Thu, 25 May 2017 10:22:11 +0200 Subject: [PATCH] wined3d: Avoid barrier() in tessellation control shader if possible. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Synchronization is only needed when output variables are read. Signed-off-by: Józef Kucia Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/wined3d/glsl_shader.c | 2 +- dlls/wined3d/shader.c | 4 ++++ dlls/wined3d/wined3d_private.h | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 8a00aa2ff7a..1cfc0e6ff2a 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -7610,7 +7610,7 @@ static GLuint shader_glsl_generate_hull_shader(const struct wined3d_context *con shader_addline(buffer, "void main()\n{\n"); shader_addline(buffer, "hs_control_point_phase();\n"); - if (hs->phases.fork_count || hs->phases.join_count) + if (reg_maps->vocp) shader_addline(buffer, "barrier();\n"); for (i = 0; i < hs->phases.fork_count; ++i) shader_glsl_generate_shader_phase_invocation(buffer, &hs->phases.fork[i], "fork", i); diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index 144dbff0106..8827641e368 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -801,6 +801,10 @@ static BOOL shader_record_register_usage(struct wined3d_shader *shader, struct w reg_maps->rt_mask |= (1u << reg->idx[0].offset); break; + case WINED3DSPR_OUTCONTROLPOINT: + reg_maps->vocp = 1; + break; + default: TRACE("Not recording register of type %#x and [%#x][%#x].\n", reg->type, reg->idx[0].offset, reg->idx[1].offset); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 1da788e0a86..eb5d3160d19 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1012,7 +1012,8 @@ struct wined3d_shader_reg_maps WORD usescall : 1; WORD usespow : 1; WORD point_size : 1; - WORD padding : 2; + WORD vocp : 1; + WORD padding : 1; DWORD rt_mask; /* Used render targets, 32 max. */