Mesa (main): radv: Add DMA buffer update function for internal use.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Oct 1 14:13:37 UTC 2021


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

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Fri Sep 24 02:30:38 2021 +0200

radv: Add DMA buffer update function for internal use.

Only split out the DMA part because that doesn't need the BO.

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

---

 src/amd/vulkan/radv_meta.h        |  3 +++
 src/amd/vulkan/radv_meta_buffer.c | 40 +++++++++++++++++++++++----------------
 2 files changed, 27 insertions(+), 16 deletions(-)

diff --git a/src/amd/vulkan/radv_meta.h b/src/amd/vulkan/radv_meta.h
index 81ed74769c6..00d3311f9d0 100644
--- a/src/amd/vulkan/radv_meta.h
+++ b/src/amd/vulkan/radv_meta.h
@@ -249,6 +249,9 @@ uint32_t radv_clear_dcc(struct radv_cmd_buffer *cmd_buffer, struct radv_image *i
 uint32_t radv_clear_htile(struct radv_cmd_buffer *cmd_buffer, const struct radv_image *image,
                           const VkImageSubresourceRange *range, uint32_t value);
 
+void radv_update_buffer_cp(struct radv_cmd_buffer *cmd_buffer, uint64_t va, const void *data,
+                           uint64_t size);
+
 /**
  * Return whether the bound pipeline is the FMASK decompress pass.
  */
diff --git a/src/amd/vulkan/radv_meta_buffer.c b/src/amd/vulkan/radv_meta_buffer.c
index 39e805f932b..644558c50dc 100644
--- a/src/amd/vulkan/radv_meta_buffer.c
+++ b/src/amd/vulkan/radv_meta_buffer.c
@@ -414,14 +414,35 @@ radv_CmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR
    }
 }
 
+void
+radv_update_buffer_cp(struct radv_cmd_buffer *cmd_buffer, uint64_t va, const void *data,
+                      uint64_t size)
+{
+   uint64_t words = size / 4;
+   bool mec = radv_cmd_buffer_uses_mec(cmd_buffer);
+
+   assert(size < RADV_BUFFER_UPDATE_THRESHOLD);
+
+   si_emit_cache_flush(cmd_buffer);
+   radeon_check_space(cmd_buffer->device->ws, cmd_buffer->cs, words + 4);
+
+   radeon_emit(cmd_buffer->cs, PKT3(PKT3_WRITE_DATA, 2 + words, 0));
+   radeon_emit(cmd_buffer->cs, S_370_DST_SEL(mec ? V_370_MEM : V_370_MEM_GRBM) |
+                                  S_370_WR_CONFIRM(1) | S_370_ENGINE_SEL(V_370_ME));
+   radeon_emit(cmd_buffer->cs, va);
+   radeon_emit(cmd_buffer->cs, va >> 32);
+   radeon_emit_array(cmd_buffer->cs, data, words);
+
+   if (unlikely(cmd_buffer->device->trace_bo))
+      radv_cmd_buffer_trace_emit(cmd_buffer);
+}
+
 void
 radv_CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
                      VkDeviceSize dataSize, const void *pData)
 {
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    RADV_FROM_HANDLE(radv_buffer, dst_buffer, dstBuffer);
-   bool mec = radv_cmd_buffer_uses_mec(cmd_buffer);
-   uint64_t words = dataSize / 4;
    uint64_t va = radv_buffer_get_va(dst_buffer->bo);
    va += dstOffset + dst_buffer->offset;
 
@@ -432,21 +453,8 @@ radv_CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDevice
       return;
 
    if (dataSize < RADV_BUFFER_UPDATE_THRESHOLD) {
-      si_emit_cache_flush(cmd_buffer);
-
       radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs, dst_buffer->bo);
-
-      radeon_check_space(cmd_buffer->device->ws, cmd_buffer->cs, words + 4);
-
-      radeon_emit(cmd_buffer->cs, PKT3(PKT3_WRITE_DATA, 2 + words, 0));
-      radeon_emit(cmd_buffer->cs, S_370_DST_SEL(mec ? V_370_MEM : V_370_MEM_GRBM) |
-                                     S_370_WR_CONFIRM(1) | S_370_ENGINE_SEL(V_370_ME));
-      radeon_emit(cmd_buffer->cs, va);
-      radeon_emit(cmd_buffer->cs, va >> 32);
-      radeon_emit_array(cmd_buffer->cs, pData, words);
-
-      if (unlikely(cmd_buffer->device->trace_bo))
-         radv_cmd_buffer_trace_emit(cmd_buffer);
+      radv_update_buffer_cp(cmd_buffer, va, pData, dataSize);
    } else {
       uint32_t buf_offset;
       radv_cmd_buffer_upload_data(cmd_buffer, dataSize, pData, &buf_offset);



More information about the mesa-commit mailing list