[Mesa-dev] [PATCH 2/2] tgsi: Prevent emission of instructions with empty writemask.
Brian Paul
brianp at vmware.com
Thu Nov 21 07:48:51 PST 2013
On 11/21/2013 07:01 AM, jfonseca at vmware.com wrote:
> 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; \
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 <brianp at vmware.com>
More information about the mesa-dev
mailing list