On 11/21/2013 07:01 AM, jfons...@vmware.com wrote:
From: José Fonseca <jfons...@vmware.com>

These degenerate instructions can often be emitted by state trackers
when the semantics of instructions don't match precisely.
---
  src/gallium/auxiliary/tgsi/tgsi_ureg.c |  8 ++++++++
  src/gallium/auxiliary/tgsi/tgsi_ureg.h | 22 ++++++++++++++++++++++
  2 files changed, 30 insertions(+)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c 
b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
index 432ed00..f06858e 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
@@ -1113,6 +1113,10 @@ ureg_insn(struct ureg_program *ureg,
     boolean negate = FALSE;
     unsigned swizzle[4] = { 0 };

+   if (nr_dst && ureg_dst_is_empty(dst[0])) {
+      return;
+   }
+
     saturate = nr_dst ? dst[0].Saturate : FALSE;
     predicate = nr_dst ? dst[0].Predicate : FALSE;
     if (predicate) {
@@ -1162,6 +1166,10 @@ ureg_tex_insn(struct ureg_program *ureg,
     boolean negate = FALSE;
     unsigned swizzle[4] = { 0 };

+   if (nr_dst && ureg_dst_is_empty(dst[0])) {
+      return;
+   }
+
     saturate = nr_dst ? dst[0].Saturate : FALSE;
     predicate = nr_dst ? dst[0].Predicate : FALSE;
     if (predicate) {
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h 
b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
index cf0c75e..d973edb 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
@@ -454,6 +454,16 @@ ureg_imm1i( struct ureg_program *ureg,
     return ureg_DECL_immediate_int( ureg, &a, 1 );
  }

+/* Where the destination register has a valid file, but an empty
+ * writemask.
+ */
+static INLINE boolean
+ureg_dst_is_empty( struct ureg_dst dst )
+{
+   return dst.File != TGSI_FILE_NULL &&
+          dst.WriteMask == 0;
+}
+
  /***********************************************************************
   * Functions for patching up labels
   */
@@ -650,6 +660,7 @@ static INLINE void ureg_##op( struct ureg_program *ureg,    
            \
  {                                                                       \
     unsigned opcode = TGSI_OPCODE_##op;                                  \
     struct ureg_emit_insn_result insn;                                   \
+   if (ureg_dst_is_empty(dst)) return;                                  \

If it were me, I'd put the return stmt on the next line in case someone wanted to put a breakpoint on that event.

Reviewed-by: Brian Paul <bri...@vmware.com>

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to