Mesa (master): ff_fragment_shader: Don' t generate swizzles for scalar combiner inputs

Ian Romanick idr at kemper.freedesktop.org
Wed Jan 4 03:22:36 UTC 2012


Module: Mesa
Branch: master
Commit: 4535874c1a6da74d9130e494d514284302e4d08e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4535874c1a6da74d9130e494d514284302e4d08e

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Thu Dec 22 17:37:26 2011 -0800

ff_fragment_shader: Don't generate swizzles for scalar combiner inputs

There are a couple scenarios where the source could be zero and the
operand could be either SRC_ALPHA or ONE_MINUS_SRC_ALPHA.  For
example, if the source was ZERO.  This would result in something like
(0).w, and a later call to ir_validate would get angry.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
Reviewed-by: Eric Anholt <eric at anholt.net>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=42517

---

 src/mesa/main/ff_fragment_shader.cpp |   16 ++++++++++------
 1 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/src/mesa/main/ff_fragment_shader.cpp b/src/mesa/main/ff_fragment_shader.cpp
index 008da0d..3e736fa 100644
--- a/src/mesa/main/ff_fragment_shader.cpp
+++ b/src/mesa/main/ff_fragment_shader.cpp
@@ -632,15 +632,19 @@ emit_combine_source(struct texenv_fragment_program *p,
 					   new(p->mem_ctx) ir_constant(1.0f),
 					   src);
 
-   case OPR_SRC_ALPHA: 
-      return new(p->mem_ctx) ir_swizzle(src, 3, 3, 3, 3, 1);
+   case OPR_SRC_ALPHA:
+      return src->type->is_scalar()
+	 ? src : (ir_rvalue *) new(p->mem_ctx) ir_swizzle(src, 3, 3, 3, 3, 1);
+
+   case OPR_ONE_MINUS_SRC_ALPHA: {
+      ir_rvalue *const scalar = (src->type->is_scalar())
+	 ? src : (ir_rvalue *) new(p->mem_ctx) ir_swizzle(src, 3, 3, 3, 3, 1);
 
-   case OPR_ONE_MINUS_SRC_ALPHA: 
       return new(p->mem_ctx) ir_expression(ir_binop_sub,
 					   new(p->mem_ctx) ir_constant(1.0f),
-					   new(p->mem_ctx) ir_swizzle(src,
-								      3, 3,
-								      3, 3, 1));
+					   scalar);
+   }
+
    case OPR_ZERO:
       return new(p->mem_ctx) ir_constant(0.0f);
    case OPR_ONE:




More information about the mesa-commit mailing list