st/mesa: do most of GLSL lowering outside of the optimization do-while loop
based on the intel driver Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
7325f1faaa
commit
afd4178fec
|
@ -5155,53 +5155,46 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
|
|||
const struct gl_shader_compiler_options *options =
|
||||
&ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(prog->_LinkedShaders[i]->Type)];
|
||||
|
||||
/* If there are forms of indirect addressing that the driver
|
||||
* cannot handle, perform the lowering pass.
|
||||
*/
|
||||
if (options->EmitNoIndirectInput || options->EmitNoIndirectOutput ||
|
||||
options->EmitNoIndirectTemp || options->EmitNoIndirectUniform) {
|
||||
lower_variable_index_to_cond_assign(ir,
|
||||
options->EmitNoIndirectInput,
|
||||
options->EmitNoIndirectOutput,
|
||||
options->EmitNoIndirectTemp,
|
||||
options->EmitNoIndirectUniform);
|
||||
}
|
||||
|
||||
do_mat_op_to_vec(ir);
|
||||
lower_instructions(ir,
|
||||
MOD_TO_FRACT |
|
||||
DIV_TO_MUL_RCP |
|
||||
EXP_TO_EXP2 |
|
||||
LOG_TO_LOG2 |
|
||||
(options->EmitNoPow ? POW_TO_EXP2 : 0) |
|
||||
(!ctx->Const.NativeIntegers ? INT_DIV_TO_MUL_RCP : 0));
|
||||
|
||||
lower_ubo_reference(prog->_LinkedShaders[i], ir);
|
||||
do_vec_index_to_cond_assign(ir);
|
||||
lower_quadop_vector(ir, false);
|
||||
lower_noise(ir);
|
||||
if (options->MaxIfDepth == 0) {
|
||||
lower_discard(ir);
|
||||
}
|
||||
|
||||
do {
|
||||
unsigned what_to_lower = MOD_TO_FRACT | DIV_TO_MUL_RCP |
|
||||
EXP_TO_EXP2 | LOG_TO_LOG2;
|
||||
if (options->EmitNoPow)
|
||||
what_to_lower |= POW_TO_EXP2;
|
||||
if (!ctx->Const.NativeIntegers)
|
||||
what_to_lower |= INT_DIV_TO_MUL_RCP;
|
||||
|
||||
progress = false;
|
||||
|
||||
/* Lowering */
|
||||
do_mat_op_to_vec(ir);
|
||||
lower_instructions(ir, what_to_lower);
|
||||
|
||||
lower_ubo_reference(prog->_LinkedShaders[i], ir);
|
||||
|
||||
progress = do_lower_jumps(ir, true, true, options->EmitNoMainReturn, options->EmitNoCont, options->EmitNoLoops) || progress;
|
||||
|
||||
progress = do_common_optimization(ir, true, true,
|
||||
options->MaxUnrollIterations)
|
||||
|| progress;
|
||||
|
||||
progress = lower_quadop_vector(ir, false) || progress;
|
||||
|
||||
if (options->MaxIfDepth == 0)
|
||||
progress = lower_discard(ir) || progress;
|
||||
|
||||
progress = lower_if_to_cond_assign(ir, options->MaxIfDepth) || progress;
|
||||
|
||||
if (options->EmitNoNoise)
|
||||
progress = lower_noise(ir) || progress;
|
||||
|
||||
/* If there are forms of indirect addressing that the driver
|
||||
* cannot handle, perform the lowering pass.
|
||||
*/
|
||||
if (options->EmitNoIndirectInput || options->EmitNoIndirectOutput
|
||||
|| options->EmitNoIndirectTemp || options->EmitNoIndirectUniform)
|
||||
progress =
|
||||
lower_variable_index_to_cond_assign(ir,
|
||||
options->EmitNoIndirectInput,
|
||||
options->EmitNoIndirectOutput,
|
||||
options->EmitNoIndirectTemp,
|
||||
options->EmitNoIndirectUniform)
|
||||
|| progress;
|
||||
|
||||
progress = do_vec_index_to_cond_assign(ir) || progress;
|
||||
|
||||
} while (progress);
|
||||
|
||||
validate_ir_tree(ir);
|
||||
|
|
Loading…
Reference in New Issue