=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Do not limit temporary register count to 32 in SM4+.

Alexandre Julliard julliard at winehq.org
Tue Jul 5 11:07:51 CDT 2016


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

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Tue Jul  5 11:46:54 2016 +0200

wined3d: Do not limit temporary register count to 32 in SM4+.

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     | 13 +++++++++++--
 dlls/wined3d/shader.c          |  4 ++++
 dlls/wined3d/wined3d_private.h |  4 ++--
 3 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index e06f47b..8b5af9e 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -2168,9 +2168,18 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
         shader_addline(buffer, "vec4 %s_out[%u];\n", prefix, shader->limits->packed_output);
 
     /* Declare temporary variables */
-    for (i = 0, map = reg_maps->temporary; map; map >>= 1, ++i)
+    if (reg_maps->temporary_count)
     {
-        if (map & 1) shader_addline(buffer, "vec4 R%u;\n", i);
+        for (i = 0; i < reg_maps->temporary_count; ++i)
+            shader_addline(buffer, "vec4 R%u;\n", i);
+    }
+    else
+    {
+        for (i = 0, map = reg_maps->temporary; map; map >>= 1, ++i)
+        {
+            if (map & 1)
+                shader_addline(buffer, "vec4 R%u;\n", i);
+        }
     }
 
     /* Declare indexable temporary variables */
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index ce301cc..9bf7164 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -982,6 +982,10 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, const st
             if (ins.flags & WINED3DSI_SAMPLER_COMPARISON_MODE)
                 reg_maps->sampler_comparison_mode |= (1u << ins.declaration.dst.reg.idx[0].offset);
         }
+        else if (ins.handler_idx == WINED3DSIH_DCL_TEMPS)
+        {
+            reg_maps->temporary_count = ins.declaration.count;
+        }
         else if (ins.handler_idx == WINED3DSIH_DCL_VERTICES_OUT)
         {
             if (shader_version.type == WINED3D_SHADER_TYPE_GEOMETRY)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index e8dc3fd..ec52b15 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -530,7 +530,6 @@ enum wined3d_shader_conditional_op
 /* TODO: Make this dynamic, based on shader limits ? */
 #define MAX_ATTRIBS 16
 #define MAX_REG_ADDR 1
-#define MAX_REG_TEMP 32
 #define MAX_REG_TEXCRD 8
 #define MAX_REG_INPUT 32
 #define MAX_REG_OUTPUT 32
@@ -810,7 +809,8 @@ struct wined3d_shader_reg_maps
     BYTE texcoord;                                  /* MAX_REG_TEXCRD, 8 */
     BYTE address;                                   /* MAX_REG_ADDR, 1 */
     WORD labels;                                    /* MAX_LABELS, 16 */
-    DWORD temporary;                                /* MAX_REG_TEMP, 32 */
+    DWORD temporary;                                /* 32 */
+    unsigned int temporary_count;
     DWORD *constf;                                  /* pixel, vertex */
     struct list indexable_temps;
     const struct wined3d_shader_immediate_constant_buffer *icb;




More information about the wine-cvs mailing list