[Mesa-dev] [PATCH 2/2] tgsi: Prevent emission of instructions with empty writemask.
jfonseca at vmware.com
jfonseca at vmware.com
Thu Nov 21 06:01:01 PST 2013
From: José Fonseca <jfonseca at 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; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
@@ -673,6 +684,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; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
@@ -697,6 +709,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; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
@@ -723,6 +736,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; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
@@ -750,6 +764,7 @@ static INLINE void ureg_##op( struct ureg_program *ureg, \
unsigned opcode = TGSI_OPCODE_##op; \
unsigned target = TGSI_TEXTURE_UNKNOWN; \
struct ureg_emit_insn_result insn; \
+ if (ureg_dst_is_empty(dst)) return; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
@@ -777,6 +792,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; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
@@ -805,6 +821,7 @@ static INLINE void ureg_##op( struct ureg_program *ureg, \
unsigned opcode = TGSI_OPCODE_##op; \
unsigned target = TGSI_TEXTURE_UNKNOWN; \
struct ureg_emit_insn_result insn; \
+ if (ureg_dst_is_empty(dst)) return; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
@@ -835,6 +852,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; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
@@ -866,6 +884,7 @@ static INLINE void ureg_##op( struct ureg_program *ureg, \
unsigned opcode = TGSI_OPCODE_##op; \
unsigned target = TGSI_TEXTURE_UNKNOWN; \
struct ureg_emit_insn_result insn; \
+ if (ureg_dst_is_empty(dst)) return; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
@@ -897,6 +916,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; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
@@ -928,6 +948,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; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
@@ -960,6 +981,7 @@ static INLINE void ureg_##op( struct ureg_program *ureg, \
unsigned opcode = TGSI_OPCODE_##op; \
unsigned target = TGSI_TEXTURE_UNKNOWN; \
struct ureg_emit_insn_result insn; \
+ if (ureg_dst_is_empty(dst)) return; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
--
1.8.3.2
More information about the mesa-dev
mailing list