-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 08/31/2011 03:30 PM, Bryan Cain wrote: > This is a better, more fine-grained way of lowering if statements. Fixes the > game And Yet It Moves on nv50.
Other than the one comment below, Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> > --- > src/mesa/drivers/dri/i915/i915_context.c | 2 +- > src/mesa/main/mtypes.h | 6 +----- > src/mesa/program/ir_to_mesa.cpp | 8 ++++---- > src/mesa/state_tracker/st_extensions.c | 2 +- > src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 6 +++--- > 5 files changed, 10 insertions(+), 14 deletions(-) > > diff --git a/src/mesa/drivers/dri/i915/i915_context.c > b/src/mesa/drivers/dri/i915/i915_context.c > index 11bee14..7a40ba1 100644 > --- a/src/mesa/drivers/dri/i915/i915_context.c > +++ b/src/mesa/drivers/dri/i915/i915_context.c > @@ -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->MaxIfLevel = 0; > fs_options->EmitNoNoise = GL_TRUE; > fs_options->EmitNoPow = GL_TRUE; > fs_options->EmitNoMainReturn = GL_TRUE; > diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h > index f2eb889..9f95bcd 100644 > --- a/src/mesa/main/mtypes.h > +++ b/src/mesa/main/mtypes.h > @@ -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 MaxIfLevel; /**< Maximum nested IF blocks */ I'd call this MaxIfDepth to match the lower_if_to_cond_assign parameter. > GLuint MaxUnrollIterations; > > struct gl_sl_pragmas DefaultPragmas; /**< Default #pragma settings */ > diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp > index dd154db..7fb286e 100644 > --- a/src/mesa/program/ir_to_mesa.cpp > +++ b/src/mesa/program/ir_to_mesa.cpp > @@ -3119,7 +3119,7 @@ get_mesa_program(struct gl_context *ctx, > > switch (mesa_inst->Opcode) { > case OPCODE_IF: > - if (options->EmitNoIfs) { > + if (options->MaxIfLevel == 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->MaxIfLevel == 0) > progress = lower_discard(ir) || progress; > - progress = lower_if_to_cond_assign(ir) || progress; > - } > + > + progress = lower_if_to_cond_assign(ir, options->MaxIfLevel) || > progress; > > if (options->EmitNoNoise) > progress = lower_noise(ir) || progress; > diff --git a/src/mesa/state_tracker/st_extensions.c > b/src/mesa/state_tracker/st_extensions.c > index 8e90093..9f429d9 100644 > --- a/src/mesa/state_tracker/st_extensions.c > +++ b/src/mesa/state_tracker/st_extensions.c > @@ -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->MaxIfLevel = 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); > diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > index 98bea69..f5232af 100644 > --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > @@ -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->MaxIfLevel == 0) > progress = lower_discard(ir) || progress; > - progress = lower_if_to_cond_assign(ir) || progress; > - } > + > + progress = lower_if_to_cond_assign(ir, options->MaxIfLevel) || > progress; > > if (options->EmitNoNoise) > progress = lower_noise(ir) || progress; -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/ iEYEARECAAYFAk5e2NMACgkQX1gOwKyEAw8RnQCfa0PDGUegB+6fHQMxSpUOvrOs lkwAn249dc0O/kfQNqlIs0EPIvuRspkV =S3v0 -----END PGP SIGNATURE----- _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev