gallium: Plumb through a way to disable GLSL const lowering
authorConnor Abbott <cwabbott0@gmail.com>
Fri, 30 Aug 2019 15:57:18 +0000 (17:57 +0200)
committerConnor Abbott <cwabbott0@gmail.com>
Thu, 5 Sep 2019 10:38:46 +0000 (12:38 +0200)
For radeonsi, we will prefer the NIR pass as it'll generate better code
(some index calculation and a single load vs. a load, then index
calculation, then another load) and oftentimes NIR optimization can kick
in and make all the access indices constant.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/glsl/linker.cpp
src/gallium/auxiliary/util/u_screen.c
src/gallium/docs/source/screen.rst
src/gallium/include/pipe/p_defines.h
src/mesa/main/context.c
src/mesa/main/mtypes.h
src/mesa/state_tracker/st_extensions.c

index 281d59d12a540d8ce3375add85cb5f109c5afc87..c52c665a4c234c9afb91e07eec74c489b5e03519 100644 (file)
@@ -5211,7 +5211,8 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
       linker_optimisation_loop(ctx, prog->_LinkedShaders[i]->ir, i);
 
       /* Call opts after lowering const arrays to copy propagate things. */
-      if (lower_const_arrays_to_uniforms(prog->_LinkedShaders[i]->ir, i))
+      if (ctx->Const.GLSLLowerConstArrays &&
+          lower_const_arrays_to_uniforms(prog->_LinkedShaders[i]->ir, i))
          linker_optimisation_loop(ctx, prog->_LinkedShaders[i]->ir, i);
 
       propagate_invariance(prog->_LinkedShaders[i]->ir);
index 88f4945e75526318209801251d901016160fa85a..879e49d8d5bce9d6b49464dbf636557ac7743afb 100644 (file)
@@ -296,6 +296,10 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen,
        */
       return 1;
 
+   case PIPE_CAP_PREFER_IMM_ARRAYS_AS_CONSTBUF:
+      /* Don't unset this unless your driver can do better */
+      return 1;
+
    case PIPE_CAP_POST_DEPTH_COVERAGE:
    case PIPE_CAP_BINDLESS_TEXTURE:
    case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
index d149a2f4c9f7184ffad73d55600a60527fc7d112..1df04b6c3bf96480f25bdc4c18d573028dd0ed7d 100644 (file)
@@ -548,6 +548,10 @@ The integer capabilities:
   types with texture functions having interaction with LOD of texture lookup.
 * ``PIPE_CAP_SHADER_SAMPLES_IDENTICAL``: True if the driver supports a shader query to tell whether all samples of a multisampled surface are definitely identical.
 * ``PIPE_CAP_TGSI_ATOMINC_WRAP``: Atomic increment/decrement + wrap around are supported.
+* ``PIPE_CAP_PREFER_IMM_ARRAYS_AS_CONSTBUF``: True if the state tracker should
+  turn arrays whose contents can be deduced at compile time into constant
+  buffer loads, or false if the driver can handle such arrays itself in a more
+  efficient manner.
 
 .. _pipe_capf:
 
index 808c2b8cfaf6b3f6ecf093b11a52621907604cd4..8530994d9ad39382edc6f005a681947ca926f913 100644 (file)
@@ -897,6 +897,7 @@ enum pipe_cap
    PIPE_CAP_TEXTURE_SHADOW_LOD,
    PIPE_CAP_SHADER_SAMPLES_IDENTICAL,
    PIPE_CAP_TGSI_ATOMINC_WRAP,
+   PIPE_CAP_PREFER_IMM_ARRAYS_AS_CONSTBUF,
 };
 
 /**
index c68be8d01e54448a2e16c213842998e5eba49cc2..d77647ccda9aa4cf57877a83eb6e9112662fa3d0 100644 (file)
@@ -633,6 +633,8 @@ _mesa_init_constants(struct gl_constants *consts, gl_api api)
    consts->GLSLVersion = api == API_OPENGL_CORE ? 130 : 120;
    consts->GLSLVersionCompat = consts->GLSLVersion;
 
+   consts->GLSLLowerConstArrays = true;
+
    /* Assume that if GLSL 1.30+ (or GLSL ES 3.00+) is supported that
     * gl_VertexID is implemented using a native hardware register with OpenGL
     * semantics.
index b740671559b464e367c101d3413ccdeae427c97a..f035287ac7e395b6571163836e1559b9485f9c39 100644 (file)
@@ -3928,6 +3928,11 @@ struct gl_constants
     */
    bool GLSLOptimizeConservatively;
 
+   /**
+    * Whether to call lower_const_arrays_to_uniforms() during linking.
+    */
+   bool GLSLLowerConstArrays;
+
    /**
     * True if gl_TessLevelInner/Outer[] in the TES should be inputs
     * (otherwise, they're system values).
index 50471d63f2b928350a378623497f9888b95a97ca..4da6e559ed5d392f0397b5149ba3ba7b82596cf0 100644 (file)
@@ -344,6 +344,8 @@ void st_init_limits(struct pipe_screen *screen,
 
    c->GLSLOptimizeConservatively =
       screen->get_param(screen, PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY);
+   c->GLSLLowerConstArrays =
+      screen->get_param(screen, PIPE_CAP_PREFER_IMM_ARRAYS_AS_CONSTBUF);
    c->GLSLTessLevelsAsInputs =
       screen->get_param(screen, PIPE_CAP_GLSL_TESS_LEVELS_AS_INPUTS);
    c->LowerTessLevel =