radeonsi: Use param export count from si_llvm_export_vs in si_shader_vs
This eliminates the error prone logic in si_shader_vs recalculating this value. It also fixes TGSI_SEMANTIC_CLIPDIST outputs incorrectly not being counted for VS exports. They need to be counted because they are passed to the pixel shader as parameters as well. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91193 Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
b0334a9aeb
commit
248b26429f
|
@ -1218,6 +1218,8 @@ handle_semantic:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shader->nr_param_exports = param_count;
|
||||||
|
|
||||||
/* We need to add the position output manually if it's missing. */
|
/* We need to add the position output manually if it's missing. */
|
||||||
if (!pos_args[0][0]) {
|
if (!pos_args[0][0]) {
|
||||||
pos_args[0][0] = lp_build_const_int32(base->gallivm, 0xf); /* writemask */
|
pos_args[0][0] = lp_build_const_int32(base->gallivm, 0xf); /* writemask */
|
||||||
|
|
|
@ -165,6 +165,7 @@ struct si_shader {
|
||||||
|
|
||||||
bool uses_instanceid;
|
bool uses_instanceid;
|
||||||
unsigned nr_pos_exports;
|
unsigned nr_pos_exports;
|
||||||
|
unsigned nr_param_exports;
|
||||||
bool is_gs_copy_shader;
|
bool is_gs_copy_shader;
|
||||||
bool dx10_clamp_mode; /* convert NaNs to 0 */
|
bool dx10_clamp_mode; /* convert NaNs to 0 */
|
||||||
};
|
};
|
||||||
|
|
|
@ -148,10 +148,9 @@ static void si_shader_gs(struct si_shader *shader)
|
||||||
|
|
||||||
static void si_shader_vs(struct si_shader *shader)
|
static void si_shader_vs(struct si_shader *shader)
|
||||||
{
|
{
|
||||||
struct tgsi_shader_info *info = &shader->selector->info;
|
|
||||||
struct si_pm4_state *pm4;
|
struct si_pm4_state *pm4;
|
||||||
unsigned num_sgprs, num_user_sgprs;
|
unsigned num_sgprs, num_user_sgprs;
|
||||||
unsigned nparams, i, vgpr_comp_cnt;
|
unsigned nparams, vgpr_comp_cnt;
|
||||||
uint64_t va;
|
uint64_t va;
|
||||||
unsigned window_space =
|
unsigned window_space =
|
||||||
shader->selector->info.properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION];
|
shader->selector->info.properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION];
|
||||||
|
@ -180,26 +179,8 @@ static void si_shader_vs(struct si_shader *shader)
|
||||||
}
|
}
|
||||||
assert(num_sgprs <= 104);
|
assert(num_sgprs <= 104);
|
||||||
|
|
||||||
/* Certain attributes (position, psize, etc.) don't count as params.
|
/* VS is required to export at least one param. */
|
||||||
* VS is required to export at least one param and r600_shader_from_tgsi()
|
nparams = MAX2(shader->nr_param_exports, 1);
|
||||||
* takes care of adding a dummy export.
|
|
||||||
*/
|
|
||||||
for (nparams = 0, i = 0 ; i < info->num_outputs; i++) {
|
|
||||||
switch (info->output_semantic_name[i]) {
|
|
||||||
case TGSI_SEMANTIC_CLIPVERTEX:
|
|
||||||
case TGSI_SEMANTIC_CLIPDIST:
|
|
||||||
case TGSI_SEMANTIC_CULLDIST:
|
|
||||||
case TGSI_SEMANTIC_POSITION:
|
|
||||||
case TGSI_SEMANTIC_PSIZE:
|
|
||||||
case TGSI_SEMANTIC_EDGEFLAG:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
nparams++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (nparams < 1)
|
|
||||||
nparams = 1;
|
|
||||||
|
|
||||||
si_pm4_set_reg(pm4, R_0286C4_SPI_VS_OUT_CONFIG,
|
si_pm4_set_reg(pm4, R_0286C4_SPI_VS_OUT_CONFIG,
|
||||||
S_0286C4_VS_EXPORT_COUNT(nparams - 1));
|
S_0286C4_VS_EXPORT_COUNT(nparams - 1));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue