=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Avoid barrier() in tessellation control shader if possible.

Alexandre Julliard julliard at winehq.org
Thu May 25 14:42:16 CDT 2017


Module: wine
Branch: master
Commit: 4597ef6696d75d244e5078a89bac18a1431b936f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4597ef6696d75d244e5078a89bac18a1431b936f

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Thu May 25 10:22:11 2017 +0200

wined3d: Avoid barrier() in tessellation control shader if possible.

Synchronization is only needed when output variables are read.

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     | 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 8a00aa2..1cfc0e6 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 144dbff..8827641 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 1da788e..eb5d316 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. */
 




More information about the wine-cvs mailing list