From 24a1d54502ff9f30ce2198370f9a48c3c7bf59af Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Wed, 27 Mar 2024 15:25:14 -0400 Subject: [PATCH] tu: Implement buffer_write_cp Part-of: --- src/freedreno/vulkan/tu_cmd_buffer.cc | 26 ++++++++++++++++++++++++++ src/freedreno/vulkan/tu_cmd_buffer.h | 6 ++++++ src/freedreno/vulkan/tu_device.cc | 2 ++ 3 files changed, 34 insertions(+) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index 3fa7431c62f..460f46df7c1 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -7260,3 +7260,29 @@ tu_CmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, tu_flush_for_access(cache, TU_ACCESS_CP_WRITE, TU_ACCESS_NONE); } TU_GENX(tu_CmdWriteBufferMarker2AMD); + +void +tu_write_buffer_cp(VkCommandBuffer commandBuffer, + VkDeviceAddress addr, + void *data, uint32_t size) +{ + VK_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); + + TU_CALLX(cmd->device, tu_emit_cache_flush)(cmd); + + struct tu_cs *cs = &cmd->cs; + + tu_cs_emit_pkt7(cs, CP_MEM_WRITE, 2 + size / 4); + tu_cs_emit_qw(cs, addr); + tu_cs_emit_array(cs, (uint32_t *)data, size / 4); +} + +void +tu_flush_buffer_write_cp(VkCommandBuffer commandBuffer) +{ + VK_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); + + struct tu_cache_state *cache = &cmd->state.cache; + tu_flush_for_access(cache, TU_ACCESS_CP_WRITE, (enum tu_cmd_access_mask)0); +} + diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h index 0a771de204b..47455f12d89 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h @@ -683,6 +683,12 @@ tu_restore_suspended_pass(struct tu_cmd_buffer *cmd, template void tu_cmd_render(struct tu_cmd_buffer *cmd); +void tu_write_buffer_cp(VkCommandBuffer commandBuffer, + VkDeviceAddress addr, + void *data, uint32_t size); + +void tu_flush_buffer_write_cp(VkCommandBuffer commandBuffer); + enum fd_gpu_event : uint32_t; template diff --git a/src/freedreno/vulkan/tu_device.cc b/src/freedreno/vulkan/tu_device.cc index 6a69fed4907..f4067d8cfc6 100644 --- a/src/freedreno/vulkan/tu_device.cc +++ b/src/freedreno/vulkan/tu_device.cc @@ -2707,6 +2707,8 @@ tu_CreateDevice(VkPhysicalDevice physicalDevice, fd_rd_output_init(&device->rd_output, output_name); } + device->vk.write_buffer_cp = tu_write_buffer_cp; + device->vk.flush_buffer_write_cp = tu_flush_buffer_write_cp; device->vk.cmd_fill_buffer_addr = tu_cmd_fill_buffer_addr; *pDevice = tu_device_to_handle(device);