radv: Fix float16 interpolation set up.
float16 types can have non-flat interpolation so set up the HW
correctly for that.
Fixes: 62024fa775
"radv: enable VK_KHR_16bit_storage extension / 16bit storage features"
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
This commit is contained in:
@@ -3101,13 +3101,17 @@ radv_pipeline_generate_geometry_shader(struct radeon_cmdbuf *ctx_cs,
|
||||
radv_pipeline_generate_hw_vs(ctx_cs, cs, pipeline, pipeline->gs_copy_shader);
|
||||
}
|
||||
|
||||
static uint32_t offset_to_ps_input(uint32_t offset, bool flat_shade)
|
||||
static uint32_t offset_to_ps_input(uint32_t offset, bool flat_shade, bool float16)
|
||||
{
|
||||
uint32_t ps_input_cntl;
|
||||
if (offset <= AC_EXP_PARAM_OFFSET_31) {
|
||||
ps_input_cntl = S_028644_OFFSET(offset);
|
||||
if (flat_shade)
|
||||
ps_input_cntl |= S_028644_FLAT_SHADE(1);
|
||||
if (float16) {
|
||||
ps_input_cntl |= S_028644_FP16_INTERP_MODE(1) |
|
||||
S_028644_ATTR0_VALID(1);
|
||||
}
|
||||
} else {
|
||||
/* The input is a DEFAULT_VAL constant. */
|
||||
assert(offset >= AC_EXP_PARAM_DEFAULT_VAL_0000 &&
|
||||
@@ -3132,7 +3136,7 @@ radv_pipeline_generate_ps_inputs(struct radeon_cmdbuf *ctx_cs,
|
||||
if (ps->info.info.ps.prim_id_input) {
|
||||
unsigned vs_offset = outinfo->vs_output_param_offset[VARYING_SLOT_PRIMITIVE_ID];
|
||||
if (vs_offset != AC_EXP_PARAM_UNDEFINED) {
|
||||
ps_input_cntl[ps_offset] = offset_to_ps_input(vs_offset, true);
|
||||
ps_input_cntl[ps_offset] = offset_to_ps_input(vs_offset, true, false);
|
||||
++ps_offset;
|
||||
}
|
||||
}
|
||||
@@ -3142,9 +3146,9 @@ radv_pipeline_generate_ps_inputs(struct radeon_cmdbuf *ctx_cs,
|
||||
ps->info.info.needs_multiview_view_index) {
|
||||
unsigned vs_offset = outinfo->vs_output_param_offset[VARYING_SLOT_LAYER];
|
||||
if (vs_offset != AC_EXP_PARAM_UNDEFINED)
|
||||
ps_input_cntl[ps_offset] = offset_to_ps_input(vs_offset, true);
|
||||
ps_input_cntl[ps_offset] = offset_to_ps_input(vs_offset, true, false);
|
||||
else
|
||||
ps_input_cntl[ps_offset] = offset_to_ps_input(AC_EXP_PARAM_DEFAULT_VAL_0000, true);
|
||||
ps_input_cntl[ps_offset] = offset_to_ps_input(AC_EXP_PARAM_DEFAULT_VAL_0000, true, false);
|
||||
++ps_offset;
|
||||
}
|
||||
|
||||
@@ -3160,14 +3164,14 @@ radv_pipeline_generate_ps_inputs(struct radeon_cmdbuf *ctx_cs,
|
||||
|
||||
vs_offset = outinfo->vs_output_param_offset[VARYING_SLOT_CLIP_DIST0];
|
||||
if (vs_offset != AC_EXP_PARAM_UNDEFINED) {
|
||||
ps_input_cntl[ps_offset] = offset_to_ps_input(vs_offset, false);
|
||||
ps_input_cntl[ps_offset] = offset_to_ps_input(vs_offset, false, false);
|
||||
++ps_offset;
|
||||
}
|
||||
|
||||
vs_offset = outinfo->vs_output_param_offset[VARYING_SLOT_CLIP_DIST1];
|
||||
if (vs_offset != AC_EXP_PARAM_UNDEFINED &&
|
||||
ps->info.info.ps.num_input_clips_culls > 4) {
|
||||
ps_input_cntl[ps_offset] = offset_to_ps_input(vs_offset, false);
|
||||
ps_input_cntl[ps_offset] = offset_to_ps_input(vs_offset, false, false);
|
||||
++ps_offset;
|
||||
}
|
||||
}
|
||||
@@ -3175,6 +3179,7 @@ radv_pipeline_generate_ps_inputs(struct radeon_cmdbuf *ctx_cs,
|
||||
for (unsigned i = 0; i < 32 && (1u << i) <= ps->info.fs.input_mask; ++i) {
|
||||
unsigned vs_offset;
|
||||
bool flat_shade;
|
||||
bool float16;
|
||||
if (!(ps->info.fs.input_mask & (1u << i)))
|
||||
continue;
|
||||
|
||||
@@ -3186,8 +3191,9 @@ radv_pipeline_generate_ps_inputs(struct radeon_cmdbuf *ctx_cs,
|
||||
}
|
||||
|
||||
flat_shade = !!(ps->info.fs.flat_shaded_mask & (1u << ps_offset));
|
||||
float16 = !!(ps->info.fs.float16_shaded_mask & (1u << ps_offset));
|
||||
|
||||
ps_input_cntl[ps_offset] = offset_to_ps_input(vs_offset, flat_shade);
|
||||
ps_input_cntl[ps_offset] = offset_to_ps_input(vs_offset, flat_shade, float16);
|
||||
++ps_offset;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user