mesa: extend GLSLZeroInit semantics
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Fri, 24 Apr 2020 16:32:02 +0000 (18:32 +0200)
committerPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Tue, 5 May 2020 10:26:02 +0000 (12:26 +0200)
This commit introduces a new way to zero-init variables but keep the
old one to not break any existing behavior.

With this change GLSLZeroInit becomes an integer, with the following
possible values:
 - 0: no 0 init
 - 1: current behavior
 - 2: new behavior. Similar to 1, except ir_var_function_out type are
      0 initialized but ir_var_shader_out.

The rationale behind 2 is: zero initializing ir_var_shader_out can
prevent some optimization where out variables are completely eliminated
when not written to.

On the other hand, zero initializing "ir_var_function_out" has no
effect on correct shaders but typically helps shadertoy since the main
function is:

   void mainImage(out vec4 fragColor) { ... }

So with this change we're sure that fragColor will always get a value.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4607>

src/compiler/glsl/glsl_parser_extras.cpp
src/mesa/drivers/dri/i965/brw_context.c
src/mesa/main/mtypes.h
src/mesa/state_tracker/st_extensions.c

index 5b8e5b4c48fa0aa6de2fa2fba4832507c5758502..e610fda002c979b1a77354b2c4c3ff557b4880e3 100644 (file)
@@ -84,6 +84,8 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
    this->forced_language_version = ctx->Const.ForceGLSLVersion;
    if (ctx->Const.GLSLZeroInit == 1) {
       this->zero_init = (1u << ir_var_auto) | (1u << ir_var_temporary) | (1u << ir_var_shader_out);
+   } else if (ctx->Const.GLSLZeroInit == 2) {
+      this->zero_init = (1u << ir_var_auto) | (1u << ir_var_temporary) | (1u << ir_var_function_out);
    } else {
       this->zero_init = 0;
    }
index c9fd56c547e404cb1ff9b482638dab548e52e1a1..42a0c663b6e5905f448f3041d1c50f013bd58e24 100644 (file)
@@ -924,7 +924,7 @@ brw_process_driconf_options(struct brw_context *brw)
    ctx->Const.ForceGLSLAbsSqrt =
       driQueryOptionb(options, "force_glsl_abs_sqrt");
 
-   ctx->Const.GLSLZeroInit = driQueryOptionb(options, "glsl_zero_init");
+   ctx->Const.GLSLZeroInit = driQueryOptionb(options, "glsl_zero_init") ? 1 : 0;
 
    brw->dual_color_blend_by_location =
       driQueryOptionb(options, "dual_color_blend_by_location");
index a46eb72da9ae7be2b1baa3b90851dcf78d058e66..7046e8adfa3a52e05d45e8c0ec64b46ac9347ebb 100644 (file)
@@ -3868,9 +3868,9 @@ struct gl_constants
    GLboolean ForceGLSLAbsSqrt;
 
    /**
-    * Force uninitialized variables to default to zero.
+    * Types of variable to default initialized to zero.
     */
-   GLboolean GLSLZeroInit;
+   GLuint GLSLZeroInit;
 
    /**
     * Treat integer textures using GL_LINEAR filters as GL_NEAREST.
index 6b102074bfbd9c477394e111f08417ddd41503fb..2403bd60a8c0cbf24b722c6ecbae674257d89a4b 100644 (file)
@@ -1203,7 +1203,9 @@ void st_init_extensions(struct pipe_screen *screen,
       extensions->EXT_texture_integer = GL_FALSE;
    }
 
-   consts->GLSLZeroInit = options->glsl_zero_init;
+   if (options->glsl_zero_init) {
+      consts->GLSLZeroInit = 1;
+   }
 
    consts->ForceIntegerTexNearest = options->force_integer_tex_nearest;