mesa: add gl_constants::GLSLOptimizeConservatively
to reduce the amount of GLSL optimizations for drivers that can do better. Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
@@ -1949,12 +1949,20 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
|
||||
|
||||
assign_subroutine_indexes(shader, state);
|
||||
lower_subroutine(shader->ir, state);
|
||||
|
||||
/* Do some optimization at compile time to reduce shader IR size
|
||||
* and reduce later work if the same shader is linked multiple times
|
||||
*/
|
||||
if (ctx->Const.GLSLOptimizeConservatively) {
|
||||
/* Run it just once. */
|
||||
do_common_optimization(shader->ir, false, false, options,
|
||||
ctx->Const.NativeIntegers);
|
||||
} else {
|
||||
/* Repeat it until it stops making changes. */
|
||||
while (do_common_optimization(shader->ir, false, false, options,
|
||||
ctx->Const.NativeIntegers))
|
||||
;
|
||||
}
|
||||
|
||||
validate_ir_tree(shader->ir);
|
||||
|
||||
|
@@ -5048,10 +5048,18 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||
lower_tess_level(prog->_LinkedShaders[i]);
|
||||
}
|
||||
|
||||
if (ctx->Const.GLSLOptimizeConservatively) {
|
||||
/* Run it just once. */
|
||||
do_common_optimization(prog->_LinkedShaders[i]->ir, true, false,
|
||||
&ctx->Const.ShaderCompilerOptions[i],
|
||||
ctx->Const.NativeIntegers);
|
||||
} else {
|
||||
/* Repeat it until it stops making changes. */
|
||||
while (do_common_optimization(prog->_LinkedShaders[i]->ir, true, false,
|
||||
&ctx->Const.ShaderCompilerOptions[i],
|
||||
ctx->Const.NativeIntegers))
|
||||
;
|
||||
}
|
||||
|
||||
lower_const_arrays_to_uniforms(prog->_LinkedShaders[i]->ir, i);
|
||||
propagate_invariance(prog->_LinkedShaders[i]->ir);
|
||||
|
@@ -1254,9 +1254,13 @@ create_new_program(struct gl_context *ctx, struct state_key *key)
|
||||
const struct gl_shader_compiler_options *options =
|
||||
&ctx->Const.ShaderCompilerOptions[MESA_SHADER_FRAGMENT];
|
||||
|
||||
/* Conservative approach: Don't optimize here, the linker does it too. */
|
||||
if (!ctx->Const.GLSLOptimizeConservatively) {
|
||||
while (do_common_optimization(p.shader->ir, false, false, options,
|
||||
ctx->Const.NativeIntegers))
|
||||
;
|
||||
}
|
||||
|
||||
reparent_ir(p.shader->ir, p.shader->ir);
|
||||
|
||||
p.shader->CompileStatus = true;
|
||||
|
@@ -3642,6 +3642,13 @@ struct gl_constants
|
||||
bool GLSLFragCoordIsSysVal;
|
||||
bool GLSLFrontFacingIsSysVal;
|
||||
|
||||
/**
|
||||
* Run the minimum amount of GLSL optimizations to be able to link
|
||||
* shaders optimally (eliminate dead varyings and uniforms) and just do
|
||||
* all the necessary lowering.
|
||||
*/
|
||||
bool GLSLOptimizeConservatively;
|
||||
|
||||
/**
|
||||
* Always use the GetTransformFeedbackVertexCount() driver hook, rather
|
||||
* than passing the transform feedback object to the drawing function.
|
||||
|
Reference in New Issue
Block a user