[PATCH 1/6] wined3d: Add a setting to check relative addressing indices when accessing uniforms.

Matteo Bruni mbruni at codeweavers.com
Tue Feb 16 13:48:03 CST 2016


Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
I'm not particularly happy with the setting name but I couldn't come up
with anything better...

 dlls/wined3d/glsl_shader.c     | 20 ++++++++++++++++++--
 dlls/wined3d/wined3d_main.c    |  7 +++++++
 dlls/wined3d/wined3d_private.h |  1 +
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index a2ce187..1e31bde 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -2258,9 +2258,25 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
                 if (reg->idx[0].rel_addr)
                 {
                     if (reg->idx[0].offset)
-                        sprintf(register_name, "%s_c[%s + %u]", prefix, rel_param0.param_str, reg->idx[0].offset);
+                    {
+                        if (wined3d_settings.check_float_constants)
+                            sprintf(register_name, "(%s + %u >= 0 && %s + %u < %u ? %s_c[%s + %u] : vec4(0.0))",
+                                    rel_param0.param_str, reg->idx[0].offset,
+                                    rel_param0.param_str, reg->idx[0].offset, shader->limits->constant_float,
+                                    prefix, rel_param0.param_str, reg->idx[0].offset);
+                        else
+                            sprintf(register_name, "%s_c[%s + %u]", prefix,
+                                    rel_param0.param_str, reg->idx[0].offset);
+                    }
                     else
-                        sprintf(register_name, "%s_c[%s]", prefix, rel_param0.param_str);
+                    {
+                        if (wined3d_settings.check_float_constants)
+                            sprintf(register_name, "(%s >= 0 && %s < %u ? %s_c[%s] : vec4(0.0))",
+                                    rel_param0.param_str, rel_param0.param_str, shader->limits->constant_float,
+                                    prefix, rel_param0.param_str);
+                        else
+                            sprintf(register_name, "%s_c[%s]", prefix, rel_param0.param_str);
+                    }
                 }
                 else
                 {
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 0543d97..45e41ad 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -82,6 +82,7 @@ struct wined3d_settings wined3d_settings =
     TRUE,           /* Multisampling enabled by default. */
     FALSE,          /* No strict draw ordering. */
     TRUE,           /* Don't try to render onscreen by default. */
+    FALSE,          /* Don't range check relative addressing indices in float constants. */
     ~0U,            /* No VS shader model limit by default. */
     ~0U,            /* No GS shader model limit by default. */
     ~0U,            /* No PS shader model limit by default. */
@@ -302,6 +303,12 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
             TRACE("Not always rendering backbuffers offscreen.\n");
             wined3d_settings.always_offscreen = FALSE;
         }
+        if (!get_config_key(hkey, appkey, "CheckFloatConstants", buffer, size)
+                && !strcmp(buffer, "enabled"))
+        {
+            TRACE("Checking relative addressing indices in float constants.\n");
+            wined3d_settings.check_float_constants = TRUE;
+        }
         if (!get_config_key_dword(hkey, appkey, "MaxShaderModelVS", &wined3d_settings.max_sm_vs))
             TRACE("Limiting VS shader model to %u.\n", wined3d_settings.max_sm_vs);
         if (!get_config_key_dword(hkey, appkey, "MaxShaderModelGS", &wined3d_settings.max_sm_gs))
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 91f3fb0..af560a4 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -290,6 +290,7 @@ struct wined3d_settings
     int allow_multisampling;
     BOOL strict_draw_ordering;
     BOOL always_offscreen;
+    BOOL check_float_constants;
     unsigned int max_sm_vs;
     unsigned int max_sm_gs;
     unsigned int max_sm_ps;
-- 
2.4.10




More information about the wine-patches mailing list