diff options
author | Rob Clark <robclark@freedesktop.org> | 2016-06-24 14:28:51 -0400 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2016-07-02 09:00:19 -0400 |
commit | f78a6b1ce398a537d77c25b1a93f156109086975 (patch) | |
tree | 0d891e0156328ae8462f1e7cad56b373e7ab8607 | |
parent | 202710d11057dfe4416770752cf5fd5b3f766999 (diff) |
glsl: add driconf to zero-init unintialized vars
Some games are sloppy.. perhaps because it is defined behavior for DX or
perhaps because nv blob driver defaults things to zero.
So add driconf param to force uninitialized variables to default to zero.
This issue was observed with rust, from steam store. But has surfaced
elsewhere in the past.
Signed-off-by: Rob Clark <robclark@freedesktop.org>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
-rw-r--r-- | src/compiler/glsl/ast_to_hir.cpp | 8 | ||||
-rw-r--r-- | src/compiler/glsl/glsl_parser_extras.cpp | 1 | ||||
-rw-r--r-- | src/compiler/glsl/glsl_parser_extras.h | 1 | ||||
-rw-r--r-- | src/gallium/include/state_tracker/st_api.h | 1 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri_screen.c | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/common/drirc | 4 | ||||
-rw-r--r-- | src/mesa/drivers/dri/common/xmlpool/t_options.h | 5 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.c | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_screen.c | 4 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 5 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_extensions.c | 2 |
11 files changed, 34 insertions, 1 deletions
diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index 0cfce6893ee7..8ddc084cab7f 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -4697,6 +4697,14 @@ ast_declarator_list::hir(exec_list *instructions, apply_layout_qualifier_to_variable(&this->type->qualifier, var, state, &loc); + if ((var->data.mode == ir_var_auto || var->data.mode == ir_var_temporary) + && (var->type->is_numeric() || var->type->is_boolean()) + && state->zero_init) { + const ir_constant_data data = {0}; + var->data.has_initializer = true; + var->constant_initializer = new(var) ir_constant(var->type, &data); + } + if (this->type->qualifier.flags.q.invariant) { if (!is_varying_var(var, state->stage)) { _mesa_glsl_error(&loc, state, diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index fab64bbb87bc..96014247e5d8 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -74,6 +74,7 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx, /* Set default language version and extensions */ this->language_version = 110; this->forced_language_version = ctx->Const.ForceGLSLVersion; + this->zero_init = ctx->Const.GLSLZeroInit; this->es_shader = false; this->ARB_texture_rectangle_enable = true; diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h index 8c43292d8aa3..669b3d1b201e 100644 --- a/src/compiler/glsl/glsl_parser_extras.h +++ b/src/compiler/glsl/glsl_parser_extras.h @@ -306,6 +306,7 @@ struct _mesa_glsl_parse_state { bool es_shader; unsigned language_version; unsigned forced_language_version; + bool zero_init; gl_shader_stage stage; /** diff --git a/src/gallium/include/state_tracker/st_api.h b/src/gallium/include/state_tracker/st_api.h index 41daa47986cc..21d5177aa2fb 100644 --- a/src/gallium/include/state_tracker/st_api.h +++ b/src/gallium/include/state_tracker/st_api.h @@ -242,6 +242,7 @@ struct st_config_options unsigned force_glsl_version; boolean force_s3tc_enable; boolean allow_glsl_extension_directive_midshader; + boolean glsl_zero_init; }; /** diff --git a/src/gallium/state_trackers/dri/dri_screen.c b/src/gallium/state_trackers/dri/dri_screen.c index 2ac55c88926c..b16585a38cc2 100644 --- a/src/gallium/state_trackers/dri/dri_screen.c +++ b/src/gallium/state_trackers/dri/dri_screen.c @@ -74,6 +74,7 @@ const __DRIconfigOptionsExtension gallium_config_options = { DRI_CONF_SECTION_MISCELLANEOUS DRI_CONF_ALWAYS_HAVE_DEPTH_BUFFER("false") + DRI_CONF_GLSL_ZERO_INIT("false") DRI_CONF_SECTION_END DRI_CONF_END }; @@ -98,6 +99,7 @@ dri_fill_st_options(struct st_config_options *options, driQueryOptionb(optionCache, "force_s3tc_enable"); options->allow_glsl_extension_directive_midshader = driQueryOptionb(optionCache, "allow_glsl_extension_directive_midshader"); + options->glsl_zero_init = driQueryOptionb(optionCache, "glsl_zero_init"); } static const __DRIconfig ** diff --git a/src/mesa/drivers/dri/common/drirc b/src/mesa/drivers/dri/common/drirc index 3912d8b8c7e6..af84ee82e8a6 100644 --- a/src/mesa/drivers/dri/common/drirc +++ b/src/mesa/drivers/dri/common/drirc @@ -96,5 +96,9 @@ TODO: document the other workarounds. <application name="Warsow (64-bit)" executable="warsow.x86_64"> <option name="allow_glsl_extension_directive_midshader" value="true" /> </application> + + <application name="Rust" executable="rust"> + <option name="glsl_zero_init" value="true"/> + </application> </device> </driconf> diff --git a/src/mesa/drivers/dri/common/xmlpool/t_options.h b/src/mesa/drivers/dri/common/xmlpool/t_options.h index 4b298a46112d..341c3763deed 100644 --- a/src/mesa/drivers/dri/common/xmlpool/t_options.h +++ b/src/mesa/drivers/dri/common/xmlpool/t_options.h @@ -337,7 +337,10 @@ DRI_CONF_OPT_BEGIN_B(always_have_depth_buffer, def) \ DRI_CONF_DESC(en,gettext("Create all visuals with a depth buffer")) \ DRI_CONF_OPT_END - +#define DRI_CONF_GLSL_ZERO_INIT(def) \ +DRI_CONF_OPT_BEGIN_B(glsl_zero_init, def) \ + DRI_CONF_DESC(en,gettext("Force uninitialized variables to default to zero")) \ +DRI_CONF_OPT_END /** * \brief Initialization configuration options diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 5e3c9d169b35..3f0c2e3b4832 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -827,6 +827,8 @@ brw_process_driconf_options(struct brw_context *brw) ctx->Const.AllowGLSLExtensionDirectiveMidShader = driQueryOptionb(options, "allow_glsl_extension_directive_midshader"); + ctx->Const.GLSLZeroInit = driQueryOptionb(options, "glsl_zero_init"); + brw->dual_color_blend_by_location = driQueryOptionb(options, "dual_color_blend_by_location"); } diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c index 1c71e09e7ad1..432ab7bdb636 100644 --- a/src/mesa/drivers/dri/i965/intel_screen.c +++ b/src/mesa/drivers/dri/i965/intel_screen.c @@ -88,6 +88,10 @@ DRI_CONF_BEGIN DRI_CONF_DESC(en, "Perform code generation at shader link time.") DRI_CONF_OPT_END DRI_CONF_SECTION_END + + DRI_CONF_SECTION_MISCELLANEOUS + DRI_CONF_GLSL_ZERO_INIT("false") + DRI_CONF_SECTION_END DRI_CONF_END }; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index cab315df23d5..29e47debfc25 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -3536,6 +3536,11 @@ struct gl_constants GLboolean AllowGLSLExtensionDirectiveMidShader; /** + * Force uninitialized variables to default to zero. + */ + GLboolean GLSLZeroInit; + + /** * Does the driver support real 32-bit integers? (Otherwise, integers are * simulated via floats.) */ diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index c5ecd5a2dd7f..3d27ca3a905e 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -925,6 +925,8 @@ void st_init_extensions(struct pipe_screen *screen, extensions->EXT_texture_integer = GL_FALSE; } + consts->GLSLZeroInit = options->glsl_zero_init; + consts->UniformBooleanTrue = consts->NativeIntegers ? ~0U : fui(1.0f); /* Below are the cases which cannot be moved into tables easily. */ |