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:
Marek Olšák 2013-01-31 19:44:57 +01:00
parent 7325f1faaa
commit afd4178fec
1 changed files with 29 additions and 36 deletions

View File

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