summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/tgsi/tgsi_ureg.h
diff options
context:
space:
mode:
authorJosé Fonseca <[email protected]>2013-11-21 13:11:30 +0000
committerJosé Fonseca <[email protected]>2013-11-22 15:03:36 +0000
commit69049555af0b0a8fe6005cfa5766f15fc91403a0 (patch)
treea1ad4d21be00a94f7a69dc1c9c0e4e34d88d022d /src/gallium/auxiliary/tgsi/tgsi_ureg.h
parent4ade77f625cf3b29dabb6d7c151b7ab649def0d5 (diff)
tgsi: Prevent emission of instructions with empty writemask.
These degenerate instructions can often be emitted by state trackers when the semantics of instructions don't match precisely. Reviewed-by: Brian Paul <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary/tgsi/tgsi_ureg.h')
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_ureg.h34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
index cf0c75ef476..e22598413ae 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,8 @@ 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 +685,8 @@ 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 +711,8 @@ 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 +739,8 @@ 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 +768,8 @@ 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 +797,8 @@ 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 +827,8 @@ 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 +859,8 @@ 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 +892,8 @@ 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 +925,8 @@ 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 +958,8 @@ 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 +992,8 @@ 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, \