On 29.09.2017 14:25, Marek Olšák wrote:
From: Marek Olšák <[email protected]>--- 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. _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
