From 0241094eb466cae8180900be23bb19a624c9c358 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Wed, 14 Dec 2022 09:09:04 +0100 Subject: [PATCH] radv: move viewport pre-computed xform outside of radv_viewport_state I think we should distinguish between dynamic states (applications) and hardware states, and this will allow us to use vk_viewport_state instead of our own structs. Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_cmd_buffer.c | 26 +++++++++++++------------- src/amd/vulkan/radv_pipeline.c | 2 +- src/amd/vulkan/radv_private.h | 11 +++++++---- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 543e8841912..682d675ca28 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -158,7 +158,7 @@ radv_bind_dynamic_state(struct radv_cmd_buffer *cmd_buffer, const struct radv_dy if (memcmp(&dest->viewport.viewports, &src->viewport.viewports, src->viewport.count * sizeof(VkViewport))) { typed_memcpy(dest->viewport.viewports, src->viewport.viewports, src->viewport.count); - typed_memcpy(dest->viewport.xform, src->viewport.xform, src->viewport.count); + typed_memcpy(dest->hw_vp.xform, src->hw_vp.xform, src->viewport.count); dest_mask |= RADV_DYNAMIC_VIEWPORT; } } @@ -2016,18 +2016,18 @@ radv_emit_viewport(struct radv_cmd_buffer *cmd_buffer) radeon_set_context_reg_seq(cmd_buffer->cs, R_02843C_PA_CL_VPORT_XSCALE, d->viewport.count * 6); for (unsigned i = 0; i < d->viewport.count; i++) { - radeon_emit(cmd_buffer->cs, fui(d->viewport.xform[i].scale[0])); - radeon_emit(cmd_buffer->cs, fui(d->viewport.xform[i].translate[0])); - radeon_emit(cmd_buffer->cs, fui(d->viewport.xform[i].scale[1])); - radeon_emit(cmd_buffer->cs, fui(d->viewport.xform[i].translate[1])); + 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])); double scale_z, translate_z; if (d->depth_clip_negative_one_to_one) { - scale_z = d->viewport.xform[i].scale[2] * 0.5f; - translate_z = (d->viewport.xform[i].translate[2] + d->viewport.viewports[i].maxDepth) * 0.5f; + scale_z = d->hw_vp.xform[i].scale[2] * 0.5f; + translate_z = (d->hw_vp.xform[i].translate[2] + d->viewport.viewports[i].maxDepth) * 0.5f; } else { - scale_z = d->viewport.xform[i].scale[2]; - translate_z = d->viewport.xform[i].translate[2]; + 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)); @@ -6169,8 +6169,8 @@ radv_CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint3 viewportCount * sizeof(*pViewports)); for (unsigned i = 0; i < viewportCount; i++) { radv_get_viewport_xform(&pViewports[i], - state->dynamic.viewport.xform[i + firstViewport].scale, - state->dynamic.viewport.xform[i + firstViewport].translate); + state->dynamic.hw_vp.xform[i + firstViewport].scale, + state->dynamic.hw_vp.xform[i + firstViewport].translate); } state->dirty |= RADV_CMD_DIRTY_DYNAMIC_VIEWPORT | RADV_CMD_DIRTY_GUARDBAND; @@ -8301,8 +8301,8 @@ radv_emit_ngg_culling_state(struct radv_cmd_buffer *cmd_buffer, const struct rad /* Get viewport transform. */ float vp_scale[2], vp_translate[2]; - memcpy(vp_scale, cmd_buffer->state.dynamic.viewport.xform[0].scale, 2 * sizeof(float)); - memcpy(vp_translate, cmd_buffer->state.dynamic.viewport.xform[0].translate, 2 * sizeof(float)); + memcpy(vp_scale, cmd_buffer->state.dynamic.hw_vp.xform[0].scale, 2 * sizeof(float)); + memcpy(vp_translate, cmd_buffer->state.dynamic.hw_vp.xform[0].translate, 2 * sizeof(float)); bool vp_y_inverted = (-vp_scale[1] + vp_translate[1]) > (vp_scale[1] + vp_translate[1]); /* Get current culling settings. */ diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 7da06df7b22..b5cc6c87076 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -1527,7 +1527,7 @@ radv_pipeline_init_dynamic_state(struct radv_graphics_pipeline *pipeline, typed_memcpy(dynamic->viewport.viewports, state->vp->viewports, state->vp->viewport_count); for (unsigned i = 0; i < dynamic->viewport.count; i++) radv_get_viewport_xform(&dynamic->viewport.viewports[i], - dynamic->viewport.xform[i].scale, dynamic->viewport.xform[i].translate); + dynamic->hw_vp.xform[i].scale, dynamic->hw_vp.xform[i].translate); } } diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 97627a2be90..66fa0c394cd 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -1301,10 +1301,6 @@ struct radv_streamout_state { struct radv_viewport_state { uint32_t count; VkViewport viewports[MAX_VIEWPORTS]; - struct { - float scale[3]; - float translate[3]; - } xform[MAX_VIEWPORTS]; }; struct radv_scissor_state { @@ -1331,6 +1327,13 @@ struct radv_dynamic_state { */ uint64_t mask; + struct { + struct { + float scale[3]; + float translate[3]; + } xform[MAX_VIEWPORTS]; + } hw_vp; + struct radv_viewport_state viewport; struct radv_scissor_state scissor;