[Mesa-dev] [PATCH] ir_to_mesa: Don't optimize clamp into saturate when target is GL_VERTEX_PROGRAM_ARB

Abdiel Janulgue abdiel.janulgue at linux.intel.com
Thu Nov 27 00:45:00 PST 2014


Add the the same restriction as in the previous try_emit_sat when trying
to optimize clamp. Fixes an infinite loop in swrast where the lowering
pass unpacks saturate into clamp but the opt_algebraic pass tries to do
the opposite.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=83463

Tested-by: Vinson Lee <vlee at freedesktop.org>
Signed-off-by: Abdiel Janulgue <abdiel.janulgue at linux.intel.com>
---
 src/glsl/opt_algebraic.cpp      | 3 ++-
 src/mesa/main/mtypes.h          | 1 +
 src/mesa/program/ir_to_mesa.cpp | 3 ++-
 3 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp
index 430f5cb..62b14dd 100644
--- a/src/glsl/opt_algebraic.cpp
+++ b/src/glsl/opt_algebraic.cpp
@@ -679,7 +679,8 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
 
    case ir_binop_min:
    case ir_binop_max:
-      if (ir->type->base_type != GLSL_TYPE_FLOAT)
+      if (ir->type->base_type != GLSL_TYPE_FLOAT ||
+         options->EmitNoSat)
          break;
 
       /* Replace min(max) operations and its commutative combinations with
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 7389baa..199443a 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2990,6 +2990,7 @@ struct gl_shader_compiler_options
    GLboolean EmitNoMainReturn;            /**< Emit CONT/RET opcodes? */
    GLboolean EmitNoNoise;                 /**< Emit NOISE opcodes? */
    GLboolean EmitNoPow;                   /**< Emit POW opcodes? */
+   GLboolean EmitNoSat;
    GLboolean LowerClipDistance; /**< Lower gl_ClipDistance from float[8] to vec4[2]? */
 
    /**
diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
index 5cd9058..44fd315 100644
--- a/src/mesa/program/ir_to_mesa.cpp
+++ b/src/mesa/program/ir_to_mesa.cpp
@@ -2935,7 +2935,7 @@ _mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
 
       bool progress;
       exec_list *ir = prog->_LinkedShaders[i]->ir;
-      const struct gl_shader_compiler_options *options =
+      struct gl_shader_compiler_options *options =
             &ctx->Const.ShaderCompilerOptions[prog->_LinkedShaders[i]->Stage];
 
       do {
@@ -2949,6 +2949,7 @@ _mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
 				 | ((options->EmitNoPow) ? POW_TO_EXP2 : 0)
 				 | ((target == GL_VERTEX_PROGRAM_ARB) ? SAT_TO_CLAMP
                                     : 0)));
+         options->EmitNoSat = (target == GL_VERTEX_PROGRAM_ARB);
 
 	 progress = do_lower_jumps(ir, true, true, options->EmitNoMainReturn, options->EmitNoCont, options->EmitNoLoops) || progress;
 
-- 
1.9.1



More information about the mesa-dev mailing list