Module: wine Branch: stable Commit: 3ca87c937e0cfc5f19ee0cd8aafcba2ad140d33e URL: http://source.winehq.org/git/wine.git/?a=commit;h=3ca87c937e0cfc5f19ee0cd8aa...
Author: Matteo Bruni mbruni@codeweavers.com Date: Wed Mar 2 00:50:00 2016 +0100
wined3d: Add a setting to check relative addressing indices when accessing uniforms.
Signed-off-by: Matteo Bruni mbruni@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 8e696dee5ff05377c8ccc59b4d204eb42d4cdeca) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
dlls/wined3d/glsl_shader.c | 7 ++++++- dlls/wined3d/wined3d_main.c | 7 +++++++ dlls/wined3d/wined3d_private.h | 1 + 3 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 973b4a0..a980c5b 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -2233,7 +2233,12 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register * /* Relative addressing */ if (reg->idx[0].rel_addr) { - if (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 if (reg->idx[0].offset) 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); 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 7183195..76a0559 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -278,6 +278,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;