Mesa (main): radv: pre-calculate viewport transforms

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jul 16 15:39:44 UTC 2021


Module: Mesa
Branch: main
Commit: a2ef92d7a58ee07d6b44131712b6b85700503e38
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a2ef92d7a58ee07d6b44131712b6b85700503e38

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri Jul  9 14:30:43 2021 -0400

radv: pre-calculate viewport transforms

this requires more storage in the viewport struct, but it avoids
the need to repeatedly calculate the same transform if e.g., a meta
operation occurs, which can save about 5% cpu in some cases

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11839>

---

 src/amd/vulkan/radv_cmd_buffer.c | 25 ++++++++++++-------------
 src/amd/vulkan/radv_meta.c       |  4 ++++
 src/amd/vulkan/radv_pipeline.c   |  3 +++
 src/amd/vulkan/radv_private.h    |  4 ++++
 4 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 63c78d9ff43..ae8a539672d 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -138,6 +138,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);
          dest_mask |= RADV_DYNAMIC_VIEWPORT;
       }
    }
@@ -1376,27 +1377,23 @@ radv_emit_viewport(struct radv_cmd_buffer *cmd_buffer)
    int i;
    const unsigned count = viewport->count;
    const unsigned first_vp = 0;
-   const VkViewport *viewports = viewport->viewports;
 
    assert(count);
    radeon_set_context_reg_seq(cmd_buffer->cs, R_02843C_PA_CL_VPORT_XSCALE + first_vp * 4 * 6, count * 6);
 
    for (i = 0; i < count; i++) {
-      float scale[3], translate[3];
-
-      radv_get_viewport_xform(&viewports[i], scale, translate);
-      radeon_emit(cmd_buffer->cs, fui(scale[0]));
-      radeon_emit(cmd_buffer->cs, fui(translate[0]));
-      radeon_emit(cmd_buffer->cs, fui(scale[1]));
-      radeon_emit(cmd_buffer->cs, fui(translate[1]));
-      radeon_emit(cmd_buffer->cs, fui(scale[2]));
-      radeon_emit(cmd_buffer->cs, fui(translate[2]));
+      radeon_emit(cmd_buffer->cs, fui(viewport->xform[i].scale[0]));
+      radeon_emit(cmd_buffer->cs, fui(viewport->xform[i].translate[0]));
+      radeon_emit(cmd_buffer->cs, fui(viewport->xform[i].scale[1]));
+      radeon_emit(cmd_buffer->cs, fui(viewport->xform[i].translate[1]));
+      radeon_emit(cmd_buffer->cs, fui(viewport->xform[i].scale[2]));
+      radeon_emit(cmd_buffer->cs, fui(viewport->xform[i].translate[2]));
    }
 
-   radeon_set_context_reg_seq(cmd_buffer->cs, R_0282D0_PA_SC_VPORT_ZMIN_0 + first_vp * 4 * 2, count * 2);
+   radeon_set_context_reg_seq(cmd_buffer->cmd_buffer->cs, R_0282D0_PA_SC_VPORT_ZMIN_0 + first_vp * 4 * 2, count * 2);
    for (i = 0; i < count; i++) {
-      float zmin = MIN2(viewports[i].minDepth, viewports[i].maxDepth);
-      float zmax = MAX2(viewports[i].minDepth, viewports[i].maxDepth);
+      float zmin = MIN2(viewport->viewports[i].minDepth, viewport->viewports[i].maxDepth);
+      float zmax = MAX2(viewport->viewports[i].minDepth, viewport->viewports[i].maxDepth);
       radeon_emit(cmd_buffer->cs, fui(zmin));
       radeon_emit(cmd_buffer->cs, fui(zmax));
    }
@@ -4416,6 +4413,8 @@ radv_CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint3
 
    memcpy(state->dynamic.viewport.viewports + firstViewport, pViewports,
           viewportCount * sizeof(*pViewports));
+   for (unsigned i = firstViewport; i < firstViewport + viewportCount; i++)
+      radv_get_viewport_xform(&pViewports[i], state->dynamic.viewport.xform[i].scale, state->dynamic.viewport.xform[i].translate);
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_VIEWPORT;
 }
diff --git a/src/amd/vulkan/radv_meta.c b/src/amd/vulkan/radv_meta.c
index fe676d46614..5475e373417 100644
--- a/src/amd/vulkan/radv_meta.c
+++ b/src/amd/vulkan/radv_meta.c
@@ -57,6 +57,8 @@ radv_meta_save(struct radv_meta_saved_state *state, struct radv_cmd_buffer *cmd_
       state->viewport.count = cmd_buffer->state.dynamic.viewport.count;
       typed_memcpy(state->viewport.viewports, cmd_buffer->state.dynamic.viewport.viewports,
                    MAX_VIEWPORTS);
+      typed_memcpy(state->viewport.xform, cmd_buffer->state.dynamic.viewport.xform,
+                   MAX_VIEWPORTS);
 
       /* Save all scissors. */
       state->scissor.count = cmd_buffer->state.dynamic.scissor.count;
@@ -149,6 +151,8 @@ radv_meta_restore(const struct radv_meta_saved_state *state, struct radv_cmd_buf
       cmd_buffer->state.dynamic.viewport.count = state->viewport.count;
       typed_memcpy(cmd_buffer->state.dynamic.viewport.viewports, state->viewport.viewports,
                    MAX_VIEWPORTS);
+      typed_memcpy(cmd_buffer->state.dynamic.viewport.xform, state->viewport.xform,
+                   MAX_VIEWPORTS);
 
       /* Restore all scissors. */
       cmd_buffer->state.dynamic.scissor.count = state->scissor.count;
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index fa4ad305599..a756d894bc1 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -1540,6 +1540,9 @@ radv_pipeline_init_dynamic_state(struct radv_pipeline *pipeline,
       if (states & RADV_DYNAMIC_VIEWPORT) {
          typed_memcpy(dynamic->viewport.viewports, pCreateInfo->pViewportState->pViewports,
                       pCreateInfo->pViewportState->viewportCount);
+         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);
       }
    }
 
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index d15f7baee58..f9a15391f2c 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1129,6 +1129,10 @@ 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 {



More information about the mesa-commit mailing list