mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-30 23:00:11 +01:00
tgsi/scan: don't set interp flags for inputs only used by INTERP instructions
radeonsi depends on the interp flags a little bit too much. This fixes 9 randomly failing tests: GL45-CTS.shader_multisample_interpolation.render.interpolate_at_centroid.* Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
parent
15a127bc2c
commit
524fd55d2d
1 changed files with 57 additions and 48 deletions
|
|
@ -102,6 +102,7 @@ scan_instruction(struct tgsi_shader_info *info,
|
|||
{
|
||||
unsigned i;
|
||||
bool is_mem_inst = false;
|
||||
bool is_interp_instruction = false;
|
||||
|
||||
assert(fullinst->Instruction.Opcode < TGSI_OPCODE_LAST);
|
||||
info->opcode_count[fullinst->Instruction.Opcode]++;
|
||||
|
|
@ -127,6 +128,8 @@ scan_instruction(struct tgsi_shader_info *info,
|
|||
const struct tgsi_full_src_register *src0 = &fullinst->Src[0];
|
||||
unsigned input;
|
||||
|
||||
is_interp_instruction = true;
|
||||
|
||||
if (src0->Register.Indirect && src0->Indirect.ArrayID)
|
||||
input = info->input_array_first[src0->Indirect.ArrayID];
|
||||
else
|
||||
|
|
@ -190,12 +193,16 @@ scan_instruction(struct tgsi_shader_info *info,
|
|||
info->input_usage_mask[ind] |= usage_mask;
|
||||
}
|
||||
|
||||
if (info->processor == PIPE_SHADER_FRAGMENT &&
|
||||
!src->Register.Indirect) {
|
||||
unsigned name =
|
||||
info->input_semantic_name[src->Register.Index];
|
||||
unsigned index =
|
||||
info->input_semantic_index[src->Register.Index];
|
||||
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 ||
|
||||
|
|
@ -213,6 +220,50 @@ scan_instruction(struct tgsi_shader_info *info,
|
|||
|
||||
info->colors_read |= mask << (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 || i != 0) &&
|
||||
(name == TGSI_SEMANTIC_GENERIC ||
|
||||
name == TGSI_SEMANTIC_TEXCOORD ||
|
||||
name == TGSI_SEMANTIC_COLOR ||
|
||||
name == TGSI_SEMANTIC_BCOLOR ||
|
||||
name == TGSI_SEMANTIC_FOG ||
|
||||
name == TGSI_SEMANTIC_CLIPDIST)) {
|
||||
switch (info->input_interpolate[index]) {
|
||||
case TGSI_INTERPOLATE_COLOR:
|
||||
case TGSI_INTERPOLATE_PERSPECTIVE:
|
||||
switch (info->input_interpolate_loc[index]) {
|
||||
case TGSI_INTERPOLATE_LOC_CENTER:
|
||||
info->uses_persp_center = TRUE;
|
||||
break;
|
||||
case TGSI_INTERPOLATE_LOC_CENTROID:
|
||||
info->uses_persp_centroid = TRUE;
|
||||
break;
|
||||
case TGSI_INTERPOLATE_LOC_SAMPLE:
|
||||
info->uses_persp_sample = TRUE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case TGSI_INTERPOLATE_LINEAR:
|
||||
switch (info->input_interpolate_loc[index]) {
|
||||
case TGSI_INTERPOLATE_LOC_CENTER:
|
||||
info->uses_linear_center = TRUE;
|
||||
break;
|
||||
case TGSI_INTERPOLATE_LOC_CENTROID:
|
||||
info->uses_linear_centroid = TRUE;
|
||||
break;
|
||||
case TGSI_INTERPOLATE_LOC_SAMPLE:
|
||||
info->uses_linear_sample = TRUE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
/* TGSI_INTERPOLATE_CONSTANT doesn't do any interpolation. */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -357,48 +408,6 @@ scan_declaration(struct tgsi_shader_info *info,
|
|||
assert(reg < info->num_inputs);
|
||||
}
|
||||
|
||||
/* Only interpolated varyings. Don't include POSITION.
|
||||
* Don't include integer varyings, because they are not
|
||||
* interpolated.
|
||||
*/
|
||||
if (semName == TGSI_SEMANTIC_GENERIC ||
|
||||
semName == TGSI_SEMANTIC_TEXCOORD ||
|
||||
semName == TGSI_SEMANTIC_COLOR ||
|
||||
semName == TGSI_SEMANTIC_BCOLOR ||
|
||||
semName == TGSI_SEMANTIC_FOG ||
|
||||
semName == TGSI_SEMANTIC_CLIPDIST) {
|
||||
switch (fulldecl->Interp.Interpolate) {
|
||||
case TGSI_INTERPOLATE_COLOR:
|
||||
case TGSI_INTERPOLATE_PERSPECTIVE:
|
||||
switch (fulldecl->Interp.Location) {
|
||||
case TGSI_INTERPOLATE_LOC_CENTER:
|
||||
info->uses_persp_center = TRUE;
|
||||
break;
|
||||
case TGSI_INTERPOLATE_LOC_CENTROID:
|
||||
info->uses_persp_centroid = TRUE;
|
||||
break;
|
||||
case TGSI_INTERPOLATE_LOC_SAMPLE:
|
||||
info->uses_persp_sample = TRUE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case TGSI_INTERPOLATE_LINEAR:
|
||||
switch (fulldecl->Interp.Location) {
|
||||
case TGSI_INTERPOLATE_LOC_CENTER:
|
||||
info->uses_linear_center = TRUE;
|
||||
break;
|
||||
case TGSI_INTERPOLATE_LOC_CENTROID:
|
||||
info->uses_linear_centroid = TRUE;
|
||||
break;
|
||||
case TGSI_INTERPOLATE_LOC_SAMPLE:
|
||||
info->uses_linear_sample = TRUE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
/* TGSI_INTERPOLATE_CONSTANT doesn't do any interpolation. */
|
||||
}
|
||||
}
|
||||
|
||||
if (semName == TGSI_SEMANTIC_PRIMID)
|
||||
info->uses_primid = TRUE;
|
||||
else if (procType == PIPE_SHADER_FRAGMENT) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue