[Mesa-dev] [PATCH 03/11] tgsi/scan: scan address operands

Nicolai Hähnle nhaehnle at gmail.com
Mon Oct 2 10:51:10 UTC 2017


On 29.09.2017 14:25, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
> 
> ---
>   src/gallium/auxiliary/tgsi/tgsi_scan.c | 45 +++++++++++++++++++++++++++++++++-
>   1 file changed, 44 insertions(+), 1 deletion(-)
> 
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c
> index 212d1bb..77a447c 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c
> @@ -464,20 +464,43 @@ scan_instruction(struct tgsi_shader_info *info,
>          fullinst->Instruction.Opcode == TGSI_OPCODE_D2U64 ||
>          fullinst->Instruction.Opcode == TGSI_OPCODE_D2I64 ||
>          fullinst->Instruction.Opcode == TGSI_OPCODE_U642D ||
>          fullinst->Instruction.Opcode == TGSI_OPCODE_I642D)
>         info->uses_doubles = TRUE;
>   
>      for (i = 0; i < fullinst->Instruction.NumSrcRegs; i++) {
>         scan_src_operand(info, fullinst, &fullinst->Src[i], i,
>                          tgsi_util_get_inst_usage_mask(fullinst, i),
>                          is_interp_instruction, &is_mem_inst);
> +
> +      if (fullinst->Src[i].Register.Indirect) {
> +         struct tgsi_full_src_register src = {{0}};
> +
> +         src.Register.File = fullinst->Src[i].Indirect.File;
> +         src.Register.Index = fullinst->Src[i].Indirect.Index;
> +         src.Register.SwizzleX = fullinst->Src[i].Indirect.Swizzle;
> +
> +         scan_src_operand(info, fullinst, &src, -1, TGSI_WRITEMASK_X,
> +                          false, NULL);

This should probably be in a separate patch, but while looking at this I 
noticed that scan_src_operand doesn't actually use the usage_mask correctly.

This is relevant for scanning system values, fragment color and position 
inputs, and setting input_usage_mask. Looks like it could even lead to 
bugs with aggressive cross-stage optimizations.

Cheers,
Nicolai


> +      }
> +
> +      if (fullinst->Src[i].Register.Dimension &&
> +          fullinst->Src[i].Dimension.Indirect) {
> +         struct tgsi_full_src_register src = {{0}};
> +
> +         src.Register.File = fullinst->Src[i].DimIndirect.File;
> +         src.Register.Index = fullinst->Src[i].DimIndirect.Index;
> +         src.Register.SwizzleX = fullinst->Src[i].DimIndirect.Swizzle;
> +
> +         scan_src_operand(info, fullinst, &src, -1, TGSI_WRITEMASK_X,
> +                          false, NULL);
> +      }
>      }
>   
>      if (fullinst->Instruction.Texture) {
>         for (i = 0; i < fullinst->Texture.NumOffsets; i++) {
>            struct tgsi_full_src_register src = {{0}};
>   
>            src.Register.File = fullinst->TexOffsets[i].File;
>            src.Register.Index = fullinst->TexOffsets[i].Index;
>            src.Register.SwizzleX = fullinst->TexOffsets[i].SwizzleX;
>            src.Register.SwizzleY = fullinst->TexOffsets[i].SwizzleY;
> @@ -485,27 +508,47 @@ scan_instruction(struct tgsi_shader_info *info,
>   
>            /* The usage mask is suboptimal but should be safe. */
>            scan_src_operand(info, fullinst, &src, 0, TGSI_WRITEMASK_XYZ,
>                             false, &is_mem_inst);
>         }
>      }
>   
>      /* check for indirect register writes */
>      for (i = 0; i < fullinst->Instruction.NumDstRegs; i++) {
>         const struct tgsi_full_dst_register *dst = &fullinst->Dst[i];
> +
>         if (dst->Register.Indirect) {
> +         struct tgsi_full_src_register src = {{0}};
> +
> +         src.Register.File = dst->Indirect.File;
> +         src.Register.Index = dst->Indirect.Index;
> +         src.Register.SwizzleX = dst->Indirect.Swizzle;
> +
> +         scan_src_operand(info, fullinst, &src, -1, TGSI_WRITEMASK_X,
> +                          false, NULL);
> +
>            info->indirect_files |= (1 << dst->Register.File);
>            info->indirect_files_written |= (1 << dst->Register.File);
>         }
>   
> -      if (dst->Register.Dimension && dst->Dimension.Indirect)
> +      if (dst->Register.Dimension && dst->Dimension.Indirect) {
> +         struct tgsi_full_src_register src = {{0}};
> +
> +         src.Register.File = dst->DimIndirect.File;
> +         src.Register.Index = dst->DimIndirect.Index;
> +         src.Register.SwizzleX = dst->DimIndirect.Swizzle;
> +
> +         scan_src_operand(info, fullinst, &src, -1, TGSI_WRITEMASK_X,
> +                          false, NULL);
> +
>            info->dim_indirect_files |= 1u << dst->Register.File;
> +      }
>   
>         if (is_memory_file(dst->Register.File)) {
>            assert(fullinst->Instruction.Opcode == TGSI_OPCODE_STORE);
>   
>            is_mem_inst = true;
>            info->writes_memory = TRUE;
>   
>            if (dst->Register.File == TGSI_FILE_IMAGE) {
>               if (dst->Register.Indirect)
>                  info->images_store = info->images_declared;
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list