radv: add barycentric_at_sample lowering when the number of samples is dynamic
Use two different paths (static vs dynamic) to avoid running more NIR pass to remove dead CF code when static is used. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Rhys Perry <pendingchaos02@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18677>
This commit is contained in:
parent
68bb58a46e
commit
deb2dccc75
2 changed files with 41 additions and 14 deletions
|
|
@ -263,8 +263,11 @@ lower_abi_instr(nir_builder *b, nir_instr *instr, void *state)
|
|||
nir_ssa_def *offset = nir_ishl_imm(b, sample_id, 3); /* 2 floats containing samplepos.xy */
|
||||
|
||||
nir_const_value *const_num_samples = nir_src_as_const_value(intrin->src[1]);
|
||||
assert(const_num_samples);
|
||||
sample_pos_offset += (const_num_samples->u32 << 3);
|
||||
if (const_num_samples) {
|
||||
sample_pos_offset += (const_num_samples->u32 << 3);
|
||||
} else {
|
||||
offset = nir_iadd(b, offset, nir_ishl_imm(b, intrin->src[1].ssa, 3));
|
||||
}
|
||||
|
||||
replacement = nir_load_global_amd(b, 2, 32, addr, offset,
|
||||
.base = sample_pos_offset, .access = ACCESS_NON_WRITEABLE);
|
||||
|
|
|
|||
|
|
@ -599,20 +599,44 @@ radv_lower_fs_intrinsics(nir_shader *nir, const struct radv_pipeline_stage *fs_s
|
|||
nir_ssa_def *num_samples = nir_load_rasterization_samples_amd(&b);
|
||||
nir_ssa_def *new_dest;
|
||||
|
||||
if (!key->ps.num_samples) {
|
||||
new_dest =
|
||||
nir_load_barycentric_pixel(&b, 32,
|
||||
.interp_mode = nir_intrinsic_interp_mode(intrin));
|
||||
if (key->dynamic_rasterization_samples) {
|
||||
nir_ssa_def *res1, *res2;
|
||||
|
||||
nir_push_if(&b, nir_ieq_imm(&b, num_samples, 1));
|
||||
{
|
||||
res1 = nir_load_barycentric_pixel(&b, 32,
|
||||
.interp_mode = nir_intrinsic_interp_mode(intrin));
|
||||
}
|
||||
nir_push_else(&b, NULL);
|
||||
{
|
||||
nir_ssa_def *sample_pos =
|
||||
nir_load_sample_positions_amd(&b, 32, intrin->src[0].ssa, num_samples);
|
||||
|
||||
/* sample_pos -= 0.5 */
|
||||
sample_pos = nir_fsub(&b, sample_pos, nir_imm_float(&b, 0.5f));
|
||||
|
||||
res2 = nir_load_barycentric_at_offset(&b, 32, sample_pos,
|
||||
.interp_mode = nir_intrinsic_interp_mode(intrin));
|
||||
}
|
||||
nir_pop_if(&b, NULL);
|
||||
|
||||
new_dest = nir_if_phi(&b, res1, res2);
|
||||
} else {
|
||||
nir_ssa_def *sample_pos =
|
||||
nir_load_sample_positions_amd(&b, 32, intrin->src[0].ssa, num_samples);
|
||||
if (!key->ps.num_samples) {
|
||||
new_dest =
|
||||
nir_load_barycentric_pixel(&b, 32,
|
||||
.interp_mode = nir_intrinsic_interp_mode(intrin));
|
||||
} else {
|
||||
nir_ssa_def *sample_pos =
|
||||
nir_load_sample_positions_amd(&b, 32, intrin->src[0].ssa, num_samples);
|
||||
|
||||
/* sample_pos -= 0.5 */
|
||||
sample_pos = nir_fsub(&b, sample_pos, nir_imm_float(&b, 0.5f));
|
||||
/* sample_pos -= 0.5 */
|
||||
sample_pos = nir_fsub(&b, sample_pos, nir_imm_float(&b, 0.5f));
|
||||
|
||||
new_dest =
|
||||
nir_load_barycentric_at_offset(&b, 32, sample_pos,
|
||||
.interp_mode = nir_intrinsic_interp_mode(intrin));
|
||||
new_dest =
|
||||
nir_load_barycentric_at_offset(&b, 32, sample_pos,
|
||||
.interp_mode = nir_intrinsic_interp_mode(intrin));
|
||||
}
|
||||
}
|
||||
|
||||
nir_ssa_def_rewrite_uses(&intrin->dest.ssa, new_dest);
|
||||
|
|
@ -628,7 +652,7 @@ radv_lower_fs_intrinsics(nir_shader *nir, const struct radv_pipeline_stage *fs_s
|
|||
}
|
||||
|
||||
if (progress)
|
||||
nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance);
|
||||
nir_metadata_preserve(impl, 0);
|
||||
else
|
||||
nir_metadata_preserve(impl, nir_metadata_all);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue