From 927de5918f3163b9c00853ff5b7c73edee6cc96e Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Wed, 1 Jun 2022 13:12:29 +0200 Subject: [PATCH] nvk: impl nvk_CmdCopyBuffer Part-of: --- src/nouveau/vulkan/meson.build | 1 + src/nouveau/vulkan/nvk_cmd_buffer.c | 53 +++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/nouveau/vulkan/meson.build b/src/nouveau/vulkan/meson.build index 4d9ed19..f105779 100644 --- a/src/nouveau/vulkan/meson.build +++ b/src/nouveau/vulkan/meson.build @@ -55,6 +55,7 @@ nvk_entrypoints = custom_target( nvk_deps = [ dep_libdrm, idep_nouveau_ws, + idep_nvidia_headers, idep_vulkan_runtime, idep_vulkan_util, idep_vulkan_wsi, diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.c b/src/nouveau/vulkan/nvk_cmd_buffer.c index 9ea8195..ebf8f20 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.c +++ b/src/nouveau/vulkan/nvk_cmd_buffer.c @@ -1,10 +1,16 @@ #include "nvk_cmd_buffer.h" +#include "nvk_buffer.h" #include "nvk_device.h" +#include "nvk_device_memory.h" #include "nvk_physical_device.h" +#include "nouveau_bo.h" #include "nouveau_push.h" +#include "classes/cla0b5.h" +#include "push906f.h" + static void nvk_destroy_cmd_buffer(struct nvk_cmd_buffer *cmd_buffer) { @@ -211,5 +217,52 @@ nvk_EndCommandBuffer(VkCommandBuffer commandBuffer) } VKAPI_ATTR void VKAPI_CALL +nvk_CmdCopyBuffer(VkCommandBuffer commandBuffer, + VkBuffer srcBuffer, VkBuffer dstBuffer, + uint32_t regionCount, const VkBufferCopy* pRegions) +{ + VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); + VK_FROM_HANDLE(nvk_buffer, src, srcBuffer); + VK_FROM_HANDLE(nvk_buffer, dst, dstBuffer); + struct nouveau_ws_push *push = cmd->push; + + nouveau_ws_push_ref(push, src->mem->bo, NOUVEAU_WS_BO_RD); + nouveau_ws_push_ref(push, dst->mem->bo, NOUVEAU_WS_BO_WR); + + for (unsigned r = 0; r < regionCount; r++) { + const VkBufferCopy *region = &pRegions[r]; + VkDeviceSize dstoff = dst->mem->bo->offset + dst->offset + region->dstOffset; + VkDeviceSize srcoff = src->mem->bo->offset + src->offset + region->srcOffset; + VkDeviceSize size = region->size; + + while (size) { + unsigned bytes = MIN2(size, 1 << 17); + + PUSH_MTHD(push, NVA0B5, OFFSET_IN_UPPER, + NVVAL(NVA0B5, OFFSET_IN_UPPER, UPPER, srcoff >> 32), + OFFSET_IN_LOWER, srcoff & 0xffffffff, + + OFFSET_OUT_UPPER, + NVVAL(NVA0B5, OFFSET_OUT_UPPER, UPPER, dstoff >> 32), + OFFSET_OUT_LOWER, dstoff & 0xffffffff); + + PUSH_MTHD(push, NVA0B5, LINE_LENGTH_IN, bytes, + LINE_COUNT, 1); + + PUSH_IMMD(push, NVA0B5, LAUNCH_DMA, + NVDEF(NVA0B5, LAUNCH_DMA, DATA_TRANSFER_TYPE, NON_PIPELINED) | + NVDEF(NVA0B5, LAUNCH_DMA, FLUSH_ENABLE, TRUE) | + NVDEF(NVA0B5, LAUNCH_DMA, SRC_MEMORY_LAYOUT, PITCH) | + NVDEF(NVA0B5, LAUNCH_DMA, DST_MEMORY_LAYOUT, PITCH)); + + srcoff += bytes; + dstoff += bytes; + size -= bytes; + } + } +} + + +VKAPI_ATTR void VKAPI_CALL nvk_CmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) { } -- 2.7.4