[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