From: Marek Olšák <marek.ol...@amd.com> It has always been a usage mask *after* swizzling. --- src/gallium/auxiliary/tgsi/tgsi_scan.c | 47 ++++++++++++---------------------- 1 file changed, 17 insertions(+), 30 deletions(-)
diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c index 6f87f8d..ee9a261 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c @@ -100,98 +100,85 @@ computes_derivative(unsigned opcode) opcode == TGSI_OPCODE_SAMPLE_B || opcode == TGSI_OPCODE_SAMPLE_C; } static void scan_src_operand(struct tgsi_shader_info *info, const struct tgsi_full_instruction *fullinst, const struct tgsi_full_src_register *src, unsigned src_index, - unsigned usage_mask, + unsigned usage_mask_after_swizzle, bool is_interp_instruction, bool *is_mem_inst) { int ind = src->Register.Index; if (info->processor == PIPE_SHADER_COMPUTE && src->Register.File == TGSI_FILE_SYSTEM_VALUE) { - unsigned swizzle[4], i, name; + unsigned name, mask; name = info->system_value_semantic_name[src->Register.Index]; - swizzle[0] = src->Register.SwizzleX; - swizzle[1] = src->Register.SwizzleY; - swizzle[2] = src->Register.SwizzleZ; - swizzle[3] = src->Register.SwizzleW; switch (name) { case TGSI_SEMANTIC_THREAD_ID: case TGSI_SEMANTIC_BLOCK_ID: - for (i = 0; i < 4; i++) { - if (swizzle[i] <= TGSI_SWIZZLE_Z) { - if (name == TGSI_SEMANTIC_THREAD_ID) - info->uses_thread_id[swizzle[i]] = true; - else - info->uses_block_id[swizzle[i]] = true; - } + mask = usage_mask_after_swizzle & TGSI_WRITEMASK_XYZ; + while (mask) { + unsigned i = u_bit_scan(&mask); + + if (name == TGSI_SEMANTIC_THREAD_ID) + info->uses_thread_id[i] = true; + else + info->uses_block_id[i] = true; } break; case TGSI_SEMANTIC_BLOCK_SIZE: /* The block size is translated to IMM with a fixed block size. */ if (info->properties[TGSI_PROPERTY_CS_FIXED_BLOCK_WIDTH] == 0) info->uses_block_size = true; break; case TGSI_SEMANTIC_GRID_SIZE: info->uses_grid_size = true; break; } } /* Mark which inputs are effectively used */ if (src->Register.File == TGSI_FILE_INPUT) { if (src->Register.Indirect) { for (ind = 0; ind < info->num_inputs; ++ind) { - info->input_usage_mask[ind] |= usage_mask; + info->input_usage_mask[ind] |= usage_mask_after_swizzle; } } else { assert(ind >= 0); assert(ind < PIPE_MAX_SHADER_INPUTS); - info->input_usage_mask[ind] |= usage_mask; + info->input_usage_mask[ind] |= usage_mask_after_swizzle; } if (info->processor == PIPE_SHADER_FRAGMENT) { unsigned name, index, input; if (src->Register.Indirect && src->Indirect.ArrayID) input = info->input_array_first[src->Indirect.ArrayID]; else input = src->Register.Index; name = info->input_semantic_name[input]; index = info->input_semantic_index[input]; if (name == TGSI_SEMANTIC_POSITION && - (src->Register.SwizzleX == TGSI_SWIZZLE_Z || - src->Register.SwizzleY == TGSI_SWIZZLE_Z || - src->Register.SwizzleZ == TGSI_SWIZZLE_Z || - src->Register.SwizzleW == TGSI_SWIZZLE_Z)) - info->reads_z = TRUE; - - if (name == TGSI_SEMANTIC_COLOR) { - unsigned mask = - (1 << src->Register.SwizzleX) | - (1 << src->Register.SwizzleY) | - (1 << src->Register.SwizzleZ) | - (1 << src->Register.SwizzleW); - - info->colors_read |= mask << (index * 4); - } + usage_mask_after_swizzle & TGSI_WRITEMASK_Z) + info->reads_z = true; + + if (name == TGSI_SEMANTIC_COLOR) + info->colors_read |= usage_mask_after_swizzle << (index * 4); /* Process only interpolated varyings. Don't include POSITION. * Don't include integer varyings, because they are not * interpolated. Don't process inputs interpolated by INTERP * opcodes. Those are tracked separately. */ if ((!is_interp_instruction || src_index != 0) && (name == TGSI_SEMANTIC_GENERIC || name == TGSI_SEMANTIC_TEXCOORD || name == TGSI_SEMANTIC_COLOR || -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev