nvk: impl nvk_CmdCopyBuffer

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
This commit is contained in:
Karol Herbst
2022-06-01 13:12:29 +02:00
committed by Marge Bot
parent bc4f7b4bf1
commit 927de5918f
2 changed files with 54 additions and 0 deletions
+1
View File
@@ -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,
+53
View File
@@ -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)
{
@@ -210,6 +216,53 @@ nvk_EndCommandBuffer(VkCommandBuffer commandBuffer)
return VK_SUCCESS;
}
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) {
}