mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 11:30:11 +01:00
glsl: Pass struct shader_compiler_options into do_common_optimization.
do_common_optimization may need to make choices about whether to emit certain kinds of instructions. gl_context::ShaderCompilerOptions contains exactly that information, so it makes sense to pass it in. Rather than passing the whole array, pass the structure for the stage that's currently being worked on. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
6bb9acfb4e
commit
b765740a66
8 changed files with 21 additions and 9 deletions
|
|
@ -1203,11 +1203,13 @@ ast_struct_specifier::ast_struct_specifier(const char *identifier,
|
||||||
* \param max_unroll_iterations Maximum number of loop iterations to be
|
* \param max_unroll_iterations Maximum number of loop iterations to be
|
||||||
* unrolled. Setting to 0 disables loop
|
* unrolled. Setting to 0 disables loop
|
||||||
* unrolling.
|
* unrolling.
|
||||||
|
* \param options The driver's preferred shader options.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
do_common_optimization(exec_list *ir, bool linked,
|
do_common_optimization(exec_list *ir, bool linked,
|
||||||
bool uniform_locations_assigned,
|
bool uniform_locations_assigned,
|
||||||
unsigned max_unroll_iterations)
|
unsigned max_unroll_iterations,
|
||||||
|
const struct gl_shader_compiler_options *options)
|
||||||
{
|
{
|
||||||
GLboolean progress = GL_FALSE;
|
GLboolean progress = GL_FALSE;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,8 @@ enum lower_packing_builtins_op {
|
||||||
|
|
||||||
bool do_common_optimization(exec_list *ir, bool linked,
|
bool do_common_optimization(exec_list *ir, bool linked,
|
||||||
bool uniform_locations_assigned,
|
bool uniform_locations_assigned,
|
||||||
unsigned max_unroll_iterations);
|
unsigned max_unroll_iterations,
|
||||||
|
const struct gl_shader_compiler_options *options);
|
||||||
|
|
||||||
bool do_algebraic(exec_list *instructions);
|
bool do_algebraic(exec_list *instructions);
|
||||||
bool do_constant_folding(exec_list *instructions);
|
bool do_constant_folding(exec_list *instructions);
|
||||||
|
|
|
||||||
|
|
@ -1767,7 +1767,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||||
|
|
||||||
unsigned max_unroll = ctx->ShaderCompilerOptions[i].MaxUnrollIterations;
|
unsigned max_unroll = ctx->ShaderCompilerOptions[i].MaxUnrollIterations;
|
||||||
|
|
||||||
while (do_common_optimization(prog->_LinkedShaders[i]->ir, true, false, max_unroll))
|
while (do_common_optimization(prog->_LinkedShaders[i]->ir, true, false, max_unroll, &ctx->ShaderCompilerOptions[i]))
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -174,9 +174,11 @@ compile_shader(struct gl_context *ctx, struct gl_shader *shader)
|
||||||
|
|
||||||
/* Optimization passes */
|
/* Optimization passes */
|
||||||
if (!state->error && !shader->ir->is_empty()) {
|
if (!state->error && !shader->ir->is_empty()) {
|
||||||
|
const struct gl_shader_compiler_options *opts =
|
||||||
|
&ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(shader->Type)];
|
||||||
bool progress;
|
bool progress;
|
||||||
do {
|
do {
|
||||||
progress = do_common_optimization(shader->ir, false, false, 32);
|
progress = do_common_optimization(shader->ir, false, false, 32, opts);
|
||||||
} while (progress);
|
} while (progress);
|
||||||
|
|
||||||
validate_ir_tree(shader->ir);
|
validate_ir_tree(shader->ir);
|
||||||
|
|
|
||||||
|
|
@ -209,7 +209,8 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
|
||||||
false /* loops */
|
false /* loops */
|
||||||
) || progress;
|
) || progress;
|
||||||
|
|
||||||
progress = do_common_optimization(shader->ir, true, true, 32)
|
progress = do_common_optimization(shader->ir, true, true, 32,
|
||||||
|
&ctx->ShaderCompilerOptions[stage])
|
||||||
|| progress;
|
|| progress;
|
||||||
} while (progress);
|
} while (progress);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1336,7 +1336,10 @@ create_new_program(struct gl_context *ctx, struct state_key *key)
|
||||||
|
|
||||||
validate_ir_tree(p.shader->ir);
|
validate_ir_tree(p.shader->ir);
|
||||||
|
|
||||||
while (do_common_optimization(p.shader->ir, false, false, 32))
|
const struct gl_shader_compiler_options *options =
|
||||||
|
&ctx->ShaderCompilerOptions[MESA_SHADER_FRAGMENT];
|
||||||
|
|
||||||
|
while (do_common_optimization(p.shader->ir, false, false, 32, options))
|
||||||
;
|
;
|
||||||
reparent_ir(p.shader->ir, p.shader->ir);
|
reparent_ir(p.shader->ir, p.shader->ir);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3025,7 +3025,8 @@ _mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||||
progress = do_lower_jumps(ir, true, true, options->EmitNoMainReturn, options->EmitNoCont, options->EmitNoLoops) || progress;
|
progress = do_lower_jumps(ir, true, true, options->EmitNoMainReturn, options->EmitNoCont, options->EmitNoLoops) || progress;
|
||||||
|
|
||||||
progress = do_common_optimization(ir, true, true,
|
progress = do_common_optimization(ir, true, true,
|
||||||
options->MaxUnrollIterations)
|
options->MaxUnrollIterations,
|
||||||
|
options)
|
||||||
|| progress;
|
|| progress;
|
||||||
|
|
||||||
progress = lower_quadop_vector(ir, true) || progress;
|
progress = lower_quadop_vector(ir, true) || progress;
|
||||||
|
|
@ -3131,11 +3132,13 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader)
|
||||||
|
|
||||||
if (!state->error && !shader->ir->is_empty()) {
|
if (!state->error && !shader->ir->is_empty()) {
|
||||||
validate_ir_tree(shader->ir);
|
validate_ir_tree(shader->ir);
|
||||||
|
struct gl_shader_compiler_options *options =
|
||||||
|
&ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(shader->Type)];
|
||||||
|
|
||||||
/* Do some optimization at compile time to reduce shader IR size
|
/* Do some optimization at compile time to reduce shader IR size
|
||||||
* and reduce later work if the same shader is linked multiple times
|
* and reduce later work if the same shader is linked multiple times
|
||||||
*/
|
*/
|
||||||
while (do_common_optimization(shader->ir, false, false, 32))
|
while (do_common_optimization(shader->ir, false, false, 32, options))
|
||||||
;
|
;
|
||||||
|
|
||||||
validate_ir_tree(shader->ir);
|
validate_ir_tree(shader->ir);
|
||||||
|
|
|
||||||
|
|
@ -5255,7 +5255,7 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||||
progress = do_lower_jumps(ir, true, true, options->EmitNoMainReturn, options->EmitNoCont, options->EmitNoLoops) || progress;
|
progress = do_lower_jumps(ir, true, true, options->EmitNoMainReturn, options->EmitNoCont, options->EmitNoLoops) || progress;
|
||||||
|
|
||||||
progress = do_common_optimization(ir, true, true,
|
progress = do_common_optimization(ir, true, true,
|
||||||
options->MaxUnrollIterations)
|
options->MaxUnrollIterations, options)
|
||||||
|| progress;
|
|| progress;
|
||||||
|
|
||||||
progress = lower_if_to_cond_assign(ir, options->MaxIfDepth) || progress;
|
progress = lower_if_to_cond_assign(ir, options->MaxIfDepth) || progress;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue