[PATCH 5/5] wined3d: Set more accurate limits for SM4 shaders.

Henri Verbeet hverbeet at codeweavers.com
Thu Sep 27 18:06:56 CDT 2012


---
 dlls/wined3d/glsl_shader.c     |    6 ++--
 dlls/wined3d/shader.c          |   64 +++++++++++++++++++++++++++++++++++-----
 dlls/wined3d/wined3d_private.h |    8 ++--
 3 files changed, 63 insertions(+), 15 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 6efa7fc..db04c6a 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -997,7 +997,7 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
     if (!pshader)
     {
         shader_addline(buffer, "uniform vec4 posFixup;\n");
-        shader_addline(buffer, "void order_ps_input(in vec4[%u]);\n", MAX_REG_OUTPUT);
+        shader_addline(buffer, "void order_ps_input(in vec4[%u]);\n", shader->limits.packed_output);
     }
     else
     {
@@ -3997,7 +3997,7 @@ static GLhandleARB generate_param_reorder_function(struct wined3d_shader_buffer
 
     if (ps_major < 3)
     {
-        shader_addline(buffer, "void order_ps_input(in vec4 vs_out[%u])\n{\n", MAX_REG_OUTPUT);
+        shader_addline(buffer, "void order_ps_input(in vec4 vs_out[%u])\n{\n", vs->limits.packed_output);
 
         for (i = 0; map; map >>= 1, ++i)
         {
@@ -4053,7 +4053,7 @@ static GLhandleARB generate_param_reorder_function(struct wined3d_shader_buffer
         UINT in_count = min(vec4_varyings(ps_major, gl_info), ps->limits.packed_input);
         /* This one is tricky: a 3.0 pixel shader reads from a 3.0 vertex shader */
         shader_addline(buffer, "varying vec4 ps_in[%u];\n", in_count);
-        shader_addline(buffer, "void order_ps_input(in vec4 vs_out[%u])\n{\n", MAX_REG_OUTPUT);
+        shader_addline(buffer, "void order_ps_input(in vec4 vs_out[%u])\n{\n", vs->limits.packed_output);
 
         /* First, sort out position and point size. Those are not passed to the pixel shader */
         for (i = 0; map; map >>= 1, ++i)
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index bcff6b1..72f2fa6 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -1779,10 +1779,6 @@ static void vertexshader_set_limits(struct wined3d_shader *shader)
             shader->limits.constant_float = min(256, device->d3d_vshader_constantF);
             break;
 
-        case WINED3D_SHADER_VERSION(4, 0):
-            FIXME("Using 3.0 limits for 4.0 shader.\n");
-            /* Fall through. */
-
         case WINED3D_SHADER_VERSION(3, 0):
             shader->limits.temporary = 32;
             shader->limits.constant_bool = 32;
@@ -1799,6 +1795,19 @@ static void vertexshader_set_limits(struct wined3d_shader *shader)
             shader->limits.constant_float = min(256, device->d3d_vshader_constantF);
             break;
 
+        case WINED3D_SHADER_VERSION(4, 0):
+            shader->limits.temporary = 32; /* FIXME: 4096 */
+            shader->limits.sampler = 16; /* FIXME: 128 resources, 16 sampler states */
+            shader->limits.constant_int = 0;
+            shader->limits.constant_float = 0;
+            shader->limits.constant_bool = 0;
+            shader->limits.address = 1;
+            shader->limits.packed_output = 16;
+            shader->limits.packed_input = 0;
+            shader->limits.attributes = 16;
+            shader->limits.label = 16;
+            break;
+
         default:
             shader->limits.temporary = 12;
             shader->limits.constant_bool = 16;
@@ -1864,6 +1873,35 @@ static HRESULT vertexshader_init(struct wined3d_shader *shader, struct wined3d_d
     return WINED3D_OK;
 }
 
+static void geometryshader_set_limits(struct wined3d_shader *shader)
+{
+    DWORD shader_version = WINED3D_SHADER_VERSION(shader->reg_maps.shader_version.major,
+            shader->reg_maps.shader_version.minor);
+
+    switch (shader_version)
+    {
+        case WINED3D_SHADER_VERSION(4, 0):
+            shader->limits.temporary = 32; /* FIXME: 4096 */
+            shader->limits.texcoord = 0;
+            shader->limits.sampler = 16; /* FIXME: 128 resources, 16 sampler states */
+            shader->limits.constant_int = 0;
+            shader->limits.constant_float = 0;
+            shader->limits.constant_bool = 0;
+            shader->limits.address = 1;
+            shader->limits.packed_output = 32;
+            shader->limits.packed_input = 16;
+            shader->limits.attributes = 0;
+            shader->limits.label = 16;
+            break;
+
+        default:
+            memset(&shader->limits, 0, sizeof(shader->limits));
+            FIXME("Unhandled geometry shader version \"%u.%u\".\n",
+                    shader->reg_maps.shader_version.major,
+                    shader->reg_maps.shader_version.minor);
+    }
+}
+
 static HRESULT geometryshader_init(struct wined3d_shader *shader, struct wined3d_device *device,
         const DWORD *byte_code, const struct wined3d_shader_signature *output_signature,
         void *parent, const struct wined3d_parent_ops *parent_ops, unsigned int max_version)
@@ -1880,6 +1918,8 @@ static HRESULT geometryshader_init(struct wined3d_shader *shader, struct wined3d
         return hr;
     }
 
+    geometryshader_set_limits(shader);
+
     shader->load_local_constsF = FALSE;
 
     return WINED3D_OK;
@@ -2092,10 +2132,6 @@ static void pixelshader_set_limits(struct wined3d_shader *shader)
             shader->limits.label = 16;
             break;
 
-        case WINED3D_SHADER_VERSION(4, 0):
-            FIXME("Using 3.0 limits for 4.0 shader.\n");
-            /* Fall through. */
-
         case WINED3D_SHADER_VERSION(3, 0):
             shader->limits.temporary = 32;
             shader->limits.constant_float = 224;
@@ -2107,6 +2143,18 @@ static void pixelshader_set_limits(struct wined3d_shader *shader)
             shader->limits.label = 16; /* FIXME: 2048 */
             break;
 
+        case WINED3D_SHADER_VERSION(4, 0):
+            shader->limits.temporary = 32; /* FIXME: 4096 */
+            shader->limits.texcoord = 0;
+            shader->limits.sampler = 16; /* FIXME: 128 resources, 16 sampler states */
+            shader->limits.constant_int = 0;
+            shader->limits.constant_float = 0;
+            shader->limits.constant_bool = 0;
+            shader->limits.address = 1;
+            shader->limits.packed_input = 32;
+            shader->limits.label = 16;
+            break;
+
         default:
             shader->limits.temporary = 32;
             shader->limits.constant_float = 32;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 258ac2d..b5fd4f0 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -404,8 +404,8 @@ enum wined3d_shader_rel_op
 #define MAX_REG_ADDR 1
 #define MAX_REG_TEMP 32
 #define MAX_REG_TEXCRD 8
-#define MAX_REG_INPUT 12
-#define MAX_REG_OUTPUT 12
+#define MAX_REG_INPUT 32
+#define MAX_REG_OUTPUT 32
 #define MAX_CONST_I 16
 #define MAX_CONST_B 16
 
@@ -563,8 +563,8 @@ struct wined3d_shader_reg_maps
     DWORD temporary;                        /* MAX_REG_TEMP, 32 */
     DWORD *constf;                          /* pixel, vertex */
     DWORD texcoord_mask[MAX_REG_TEXCRD];    /* vertex < 3.0 */
-    WORD input_registers;                   /* max(MAX_REG_INPUT, MAX_ATTRIBS), 16 */
-    WORD output_registers;                  /* MAX_REG_OUTPUT, 12 */
+    DWORD input_registers;                  /* max(MAX_REG_INPUT, MAX_ATTRIBS), 32 */
+    DWORD output_registers;                 /* MAX_REG_OUTPUT, 32 */
     WORD integer_constants;                 /* MAX_CONST_I, 16 */
     WORD boolean_constants;                 /* MAX_CONST_B, 16 */
     WORD local_int_consts;                  /* MAX_CONST_I, 16 */
-- 
1.7.8.6




More information about the wine-patches mailing list