gallium: Plumb through a way to disable GLSL const lowering

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>
This commit is contained in:
Connor Abbott 2019-08-30 17:57:18 +02:00
parent 49503ae74e
commit 2af431cf7f
7 changed files with 20 additions and 1 deletions

View 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);

View 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:

View 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:

View 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,
};
/**

View 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.

View 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).

View 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 =