mesa: Replace the EmitNoIfs compiler flag with a MaxIfDepth flag.
This is a better, more fine-grained way of lowering if statements. Fixes the game And Yet It Moves on nv50. Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
@@ -189,7 +189,7 @@ i915CreateContext(int api,
|
||||
|
||||
struct gl_shader_compiler_options *const fs_options =
|
||||
& ctx->ShaderCompilerOptions[MESA_SHADER_FRAGMENT];
|
||||
fs_options->EmitNoIfs = GL_TRUE;
|
||||
fs_options->MaxIfDepth = 0;
|
||||
fs_options->EmitNoNoise = GL_TRUE;
|
||||
fs_options->EmitNoPow = GL_TRUE;
|
||||
fs_options->EmitNoMainReturn = GL_TRUE;
|
||||
|
||||
@@ -2266,11 +2266,6 @@ struct gl_shader_compiler_options
|
||||
/** Driver-selectable options: */
|
||||
GLboolean EmitCondCodes; /**< Use condition codes? */
|
||||
GLboolean EmitNVTempInitialization; /**< 0-fill NV temp registers */
|
||||
/**
|
||||
* Attempts to flatten all ir_if (OPCODE_IF) for GPUs that can't
|
||||
* support control flow.
|
||||
*/
|
||||
GLboolean EmitNoIfs;
|
||||
GLboolean EmitNoLoops;
|
||||
GLboolean EmitNoFunctions;
|
||||
GLboolean EmitNoCont; /**< Emit CONT opcode? */
|
||||
@@ -2288,6 +2283,7 @@ struct gl_shader_compiler_options
|
||||
GLboolean EmitNoIndirectUniform; /**< No indirect addressing of constants */
|
||||
/*@}*/
|
||||
|
||||
GLuint MaxIfDepth; /**< Maximum nested IF blocks */
|
||||
GLuint MaxUnrollIterations;
|
||||
|
||||
struct gl_sl_pragmas DefaultPragmas; /**< Default #pragma settings */
|
||||
|
||||
@@ -3119,7 +3119,7 @@ get_mesa_program(struct gl_context *ctx,
|
||||
|
||||
switch (mesa_inst->Opcode) {
|
||||
case OPCODE_IF:
|
||||
if (options->EmitNoIfs) {
|
||||
if (options->MaxIfDepth == 0) {
|
||||
linker_warning(shader_program,
|
||||
"Couldn't flatten if-statement. "
|
||||
"This will likely result in software "
|
||||
@@ -3241,10 +3241,10 @@ _mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||
|
||||
progress = lower_quadop_vector(ir, true) || progress;
|
||||
|
||||
if (options->EmitNoIfs) {
|
||||
if (options->MaxIfDepth == 0)
|
||||
progress = lower_discard(ir) || progress;
|
||||
progress = lower_if_to_cond_assign(ir) || progress;
|
||||
}
|
||||
|
||||
progress = lower_if_to_cond_assign(ir, options->MaxIfDepth) || progress;
|
||||
|
||||
if (options->EmitNoNoise)
|
||||
progress = lower_noise(ir) || progress;
|
||||
|
||||
@@ -173,7 +173,7 @@ void st_init_limits(struct st_context *st)
|
||||
options->EmitNoNoise = TRUE;
|
||||
|
||||
/* TODO: make these more fine-grained if anyone needs it */
|
||||
options->EmitNoIfs = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
|
||||
options->MaxIfDepth = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
|
||||
options->EmitNoLoops = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
|
||||
options->EmitNoFunctions = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUBROUTINES);
|
||||
options->EmitNoMainReturn = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUBROUTINES);
|
||||
|
||||
@@ -4991,10 +4991,10 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||
|
||||
progress = lower_quadop_vector(ir, false) || progress;
|
||||
|
||||
if (options->EmitNoIfs) {
|
||||
if (options->MaxIfDepth == 0)
|
||||
progress = lower_discard(ir) || progress;
|
||||
progress = lower_if_to_cond_assign(ir) || progress;
|
||||
}
|
||||
|
||||
progress = lower_if_to_cond_assign(ir, options->MaxIfDepth) || progress;
|
||||
|
||||
if (options->EmitNoNoise)
|
||||
progress = lower_noise(ir) || progress;
|
||||
|
||||
Reference in New Issue
Block a user