radv: add more helpers to emit viewports

Viewports are emitted differently on GFX12 and adding helpers would
help.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29215>
This commit is contained in:
Samuel Pitoiset
2024-05-15 11:18:38 +02:00
committed by Marge Bot
parent 73e1ff6b54
commit caca5e0de6
+36 -19
View File
@@ -2858,44 +2858,61 @@ radv_get_depth_clamp_mode(struct radv_cmd_buffer *cmd_buffer)
return mode;
}
static void
radv_get_viewport_zscale_ztranslate(struct radv_cmd_buffer *cmd_buffer, uint32_t vp_idx, float *zscale,
float *ztranslate)
{
const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic;
if (d->vk.vp.depth_clip_negative_one_to_one) {
*zscale = d->hw_vp.xform[vp_idx].scale[2] * 0.5f;
*ztranslate = (d->hw_vp.xform[vp_idx].translate[2] + d->vk.vp.viewports[vp_idx].maxDepth) * 0.5f;
} else {
*zscale = d->hw_vp.xform[vp_idx].scale[2];
*ztranslate = d->hw_vp.xform[vp_idx].translate[2];
}
}
static void
radv_get_viewport_zmin_zmax(struct radv_cmd_buffer *cmd_buffer, const VkViewport *viewport, float *zmin, float *zmax)
{
const enum radv_depth_clamp_mode depth_clamp_mode = radv_get_depth_clamp_mode(cmd_buffer);
if (depth_clamp_mode == RADV_DEPTH_CLAMP_MODE_ZERO_TO_ONE) {
*zmin = 0.0f;
*zmax = 1.0f;
} else {
*zmin = MIN2(viewport->minDepth, viewport->maxDepth);
*zmax = MAX2(viewport->minDepth, viewport->maxDepth);
}
}
static void
radv_emit_viewport(struct radv_cmd_buffer *cmd_buffer)
{
const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic;
enum radv_depth_clamp_mode depth_clamp_mode = radv_get_depth_clamp_mode(cmd_buffer);
assert(d->vk.vp.viewport_count);
radeon_set_context_reg_seq(cmd_buffer->cs, R_02843C_PA_CL_VPORT_XSCALE, d->vk.vp.viewport_count * 6);
for (unsigned i = 0; i < d->vk.vp.viewport_count; i++) {
float zscale, ztranslate;
radv_get_viewport_zscale_ztranslate(cmd_buffer, i, &zscale, &ztranslate);
radeon_emit(cmd_buffer->cs, fui(d->hw_vp.xform[i].scale[0]));
radeon_emit(cmd_buffer->cs, fui(d->hw_vp.xform[i].translate[0]));
radeon_emit(cmd_buffer->cs, fui(d->hw_vp.xform[i].scale[1]));
radeon_emit(cmd_buffer->cs, fui(d->hw_vp.xform[i].translate[1]));
float scale_z, translate_z;
if (d->vk.vp.depth_clip_negative_one_to_one) {
scale_z = d->hw_vp.xform[i].scale[2] * 0.5f;
translate_z = (d->hw_vp.xform[i].translate[2] + d->vk.vp.viewports[i].maxDepth) * 0.5f;
} else {
scale_z = d->hw_vp.xform[i].scale[2];
translate_z = d->hw_vp.xform[i].translate[2];
}
radeon_emit(cmd_buffer->cs, fui(scale_z));
radeon_emit(cmd_buffer->cs, fui(translate_z));
radeon_emit(cmd_buffer->cs, fui(zscale));
radeon_emit(cmd_buffer->cs, fui(ztranslate));
}
radeon_set_context_reg_seq(cmd_buffer->cs, R_0282D0_PA_SC_VPORT_ZMIN_0, d->vk.vp.viewport_count * 2);
for (unsigned i = 0; i < d->vk.vp.viewport_count; i++) {
float zmin, zmax;
if (depth_clamp_mode == RADV_DEPTH_CLAMP_MODE_ZERO_TO_ONE) {
zmin = 0.0f;
zmax = 1.0f;
} else {
zmin = MIN2(d->vk.vp.viewports[i].minDepth, d->vk.vp.viewports[i].maxDepth);
zmax = MAX2(d->vk.vp.viewports[i].minDepth, d->vk.vp.viewports[i].maxDepth);
}
radv_get_viewport_zmin_zmax(cmd_buffer, &d->vk.vp.viewports[i], &zmin, &zmax);
radeon_emit(cmd_buffer->cs, fui(zmin));
radeon_emit(cmd_buffer->cs, fui(zmax));