From 2287790c41b507cd6eda43cc78ed64162fdff3fa Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Thu, 23 Apr 2026 11:58:16 +0100 Subject: [PATCH] Extend VK_Resource_Usage test: multiple usages, desc buffer copying - Bind the same resource as the Indirect Buffer and the Index Buffer - Defines the resource usage when an indirect command binds the same resource for multiple usags i.e. Indirect + Index Buffer - Descriptor buffer contents set by earlier command buffer than usage in a single submit - Verifies the resource usage submit replay is correct (one command buffer at a time) --- util/test/demos/vk/vk_resource_usage.cpp | 80 +++++++++-- util/test/tests/Vulkan/VK_Resource_Usage.py | 145 +++++++++++--------- 2 files changed, 154 insertions(+), 71 deletions(-) diff --git a/util/test/demos/vk/vk_resource_usage.cpp b/util/test/demos/vk/vk_resource_usage.cpp index 7c43982bf..42539e94a 100644 --- a/util/test/demos/vk/vk_resource_usage.cpp +++ b/util/test/demos/vk/vk_resource_usage.cpp @@ -292,13 +292,13 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest) vkGetDescriptorEXT(device, &get, DescSize(type), dst); } - void BufferUpload(AllocatedBuffer & buffer, void *data, size_t countBytes) + void BufferUpload(AllocatedBuffer & buffer, void *data, size_t countBytes, size_t offset = 0) { VmaAllocationInfo alloc_info; vmaGetAllocationInfo(buffer.allocator, buffer.alloc, &alloc_info); uint16_t *dst = NULL; vkMapMemory(device, alloc_info.deviceMemory, alloc_info.offset, VK_WHOLE_SIZE, 0, (void **)&dst); - memcpy(dst, data, countBytes); + memcpy(dst + offset, data, countBytes); vkUnmapMemory(device, alloc_info.deviceMemory); } @@ -584,9 +584,11 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest) this, vkh::BufferCreateInfo(indirectDataSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | + VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT), - VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_GPU_ONLY})); + VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_CPU_TO_GPU})); setName(indirectData.buffer, "Indirect Data"); + BufferUpload(indirectData, (void *)indices, sizeof(indices), 1024); AllocatedBuffer barrierBuffer(this, vkh::BufferCreateInfo(1024, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT), @@ -611,16 +613,25 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest) VkDescriptorBufferBindingInfoEXT descBuffBind = {}; AllocatedBuffer descBuf; + AllocatedBuffer descBackupBuf; if(descBuffer) { descBuf = AllocatedBuffer( this, vkh::BufferCreateInfo(0x1000, VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR | VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT | - VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT), + VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT | + VK_BUFFER_USAGE_TRANSFER_SRC_BIT | + VK_BUFFER_USAGE_TRANSFER_DST_BIT), VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_CPU_TO_GPU})); - setName(descBuf.buffer, "Descriptor Buffer"); + descBackupBuf = + AllocatedBuffer(this, + vkh::BufferCreateInfo(0x1000, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | + VK_BUFFER_USAGE_TRANSFER_DST_BIT), + VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_GPU_ONLY})); + + setName(descBackupBuf.buffer, "Descriptor Backup Buffer"); VmaAllocationInfo alloc_info; vmaGetAllocationInfo(descBuf.allocator, descBuf.alloc, &alloc_info); byte *descBufMem = NULL; @@ -1150,6 +1161,12 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest) vkCmdDrawIndexedIndirect(cmd, indirectData.buffer, offset, countDrawIndexed, strideDrawIndexed); NextTest(); + + vkCmdSetViewport(cmd, 0, 1, &viewPort); + vkCmdBindIndexBuffer(cmd, indirectData.buffer, 1024, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexedIndirect(cmd, indirectData.buffer, offset, 1, strideDrawIndexed); + vkCmdBindIndexBuffer(cmd, ib.buffer, 0, VK_INDEX_TYPE_UINT32); + NextTest(); offset += countDrawIndexed * strideDrawIndexed; if(draw_indirect_count) @@ -1236,9 +1253,51 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest) popMarker(cmd); } + VkCommandBuffer backupDescBufCmd = VK_NULL_HANDLE; + VkCommandBuffer restoreDescBufCmd = VK_NULL_HANDLE; + std::vector cmds; + // Descriptor Buffer if(descBuffer) { + VkBufferCopy copyRegion; + copyRegion.srcOffset = 0; + copyRegion.dstOffset = 0; + copyRegion.size = 0x1000; + + backupDescBufCmd = GetCommandBuffer(); + vkBeginCommandBuffer(backupDescBufCmd, vkh::CommandBufferBeginInfo()); + vkh::cmdPipelineBarrier( + backupDescBufCmd, {}, + { + vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_TRANSFER_READ_BIT, + descBuf.buffer), + vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, + descBackupBuf.buffer), + }); + vkCmdCopyBuffer(backupDescBufCmd, descBuf.buffer, descBackupBuf.buffer, 1, ©Region); + vkh::cmdPipelineBarrier( + backupDescBufCmd, {}, + { + vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, + descBuf.buffer), + }); + vkCmdFillBuffer(backupDescBufCmd, descBuf.buffer, 0, 0x1000, 0); + vkEndCommandBuffer(backupDescBufCmd); + + restoreDescBufCmd = GetCommandBuffer(); + vkBeginCommandBuffer(restoreDescBufCmd, vkh::CommandBufferBeginInfo()); + vkh::cmdPipelineBarrier( + restoreDescBufCmd, {}, + { + vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_TRANSFER_READ_BIT, + descBackupBuf.buffer), + vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, + descBuf.buffer), + }); + vkCmdCopyBuffer(restoreDescBufCmd, descBackupBuf.buffer, descBuf.buffer, 1, ©Region); + vkEndCommandBuffer(restoreDescBufCmd); + pushMarker(cmd, "Descriptor Buffer"); vkCmdSetScissor(cmd, 0, 1, &mainWindow->scissor); vkh::cmdBindVertexBuffers(cmd, 0, {vb.buffer}, {0}); @@ -1275,17 +1334,20 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest) vkCmdDispatch(cmd, 1, 1, 1); popMarker(cmd); + cmds.push_back(backupDescBufCmd); + cmds.push_back(restoreDescBufCmd); } FinishUsingBackbuffer(cmd, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL); vkEndCommandBuffer(cmd); + cmds.push_back(cmd); - Submit(1, 3, {cmd}); + Submit(1, 3, cmds); - std::vector cmds; - cmds.push_back(barrierCmd); - VkSubmitInfo submit = vkh::SubmitInfo(cmds); + std::vector cmds2; + cmds2.push_back(barrierCmd); + VkSubmitInfo submit = vkh::SubmitInfo(cmds2); for(uint32_t i = 0; i < 10; ++i) { vkWaitForFences(device, 1, &barrerCmdSubmitFence, VK_TRUE, UINT64_MAX); diff --git a/util/test/tests/Vulkan/VK_Resource_Usage.py b/util/test/tests/Vulkan/VK_Resource_Usage.py index b0c318a58..98d01931b 100644 --- a/util/test/tests/Vulkan/VK_Resource_Usage.py +++ b/util/test/tests/Vulkan/VK_Resource_Usage.py @@ -43,7 +43,9 @@ class VK_Resource_Usage(rdtest.TestCase): countDrawIndirectCount = 30 if drawIndirectCount else 0 countNested = 39 if nestedSecondaries else 0 + countDescBufferCopy = 10 if descBuffer else 0 countDescBuffer = 21 if descBuffer else 0 + countDescBuffer += countDescBufferCopy action = self.find_action("Draw") self.controller.SetFrameEvent(action.eventId, False) @@ -96,24 +98,25 @@ class VK_Resource_Usage(rdtest.TestCase): (207,rd.ResourceUsage.ColorTarget), (212,rd.ResourceUsage.ColorTarget), (213,rd.ResourceUsage.ColorTarget), - (214,rd.ResourceUsage.ColorTarget)] + (214,rd.ResourceUsage.ColorTarget), + (219,rd.ResourceUsage.ColorTarget)] if drawIndirectCount: expectedUsage += [ - (235,rd.ResourceUsage.ColorTarget), - (236,rd.ResourceUsage.ColorTarget), - (237,rd.ResourceUsage.ColorTarget), + (240,rd.ResourceUsage.ColorTarget), + (241,rd.ResourceUsage.ColorTarget), (242,rd.ResourceUsage.ColorTarget), - (243,rd.ResourceUsage.ColorTarget)] + (247,rd.ResourceUsage.ColorTarget), + (248,rd.ResourceUsage.ColorTarget)] if nestedSecondaries: expectedUsage += [ - (238+countDrawIndirectCount,rd.ResourceUsage.ColorTarget), - (241+countDrawIndirectCount,rd.ResourceUsage.ColorTarget)] + (243+countDrawIndirectCount+countDescBufferCopy,rd.ResourceUsage.ColorTarget), + (246+countDrawIndirectCount+countDescBufferCopy,rd.ResourceUsage.ColorTarget)] if descBuffer: expectedUsage += [ - (233+countDrawIndirectCount+countNested,rd.ResourceUsage.ColorTarget), - (236+countDrawIndirectCount+countNested,rd.ResourceUsage.ColorTarget)] + (248+countDrawIndirectCount+countNested,rd.ResourceUsage.ColorTarget), + (251+countDrawIndirectCount+countNested,rd.ResourceUsage.ColorTarget)] - expectedUsage += [(222+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier)] + expectedUsage += [(227+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier)] else: expectedUsage = [] elif res.type == rd.ResourceType.RenderPass: @@ -163,22 +166,23 @@ class VK_Resource_Usage(rdtest.TestCase): (207,rd.ResourceUsage.VertexBuffer), (212,rd.ResourceUsage.VertexBuffer), (213,rd.ResourceUsage.VertexBuffer), - (214,rd.ResourceUsage.VertexBuffer)] + (214,rd.ResourceUsage.VertexBuffer), + (219,rd.ResourceUsage.VertexBuffer)] if drawIndirectCount: expectedUsage += [ - (235,rd.ResourceUsage.VertexBuffer), - (236,rd.ResourceUsage.VertexBuffer), - (237,rd.ResourceUsage.VertexBuffer), + (240,rd.ResourceUsage.VertexBuffer), + (241,rd.ResourceUsage.VertexBuffer), (242,rd.ResourceUsage.VertexBuffer), - (243,rd.ResourceUsage.VertexBuffer)] + (247,rd.ResourceUsage.VertexBuffer), + (248,rd.ResourceUsage.VertexBuffer)] if nestedSecondaries: expectedUsage += [ - (238+countDrawIndirectCount,rd.ResourceUsage.VertexBuffer), - (241+countDrawIndirectCount,rd.ResourceUsage.VertexBuffer)] + (243+countDrawIndirectCount+countDescBufferCopy,rd.ResourceUsage.VertexBuffer), + (246+countDrawIndirectCount+countDescBufferCopy,rd.ResourceUsage.VertexBuffer)] if descBuffer: expectedUsage += [ - (233+countDrawIndirectCount+countNested,rd.ResourceUsage.VertexBuffer), - (236+countDrawIndirectCount+countNested,rd.ResourceUsage.VertexBuffer)] + (248+countDrawIndirectCount+countNested,rd.ResourceUsage.VertexBuffer), + (251+countDrawIndirectCount+countNested,rd.ResourceUsage.VertexBuffer)] if (res.name == "Index Buffer"): expectedUsage = [(35,rd.ResourceUsage.IndexBuffer), (45,rd.ResourceUsage.IndexBuffer), @@ -195,28 +199,28 @@ class VK_Resource_Usage(rdtest.TestCase): (214,rd.ResourceUsage.IndexBuffer)] if drawIndirectCount: expectedUsage += [ - (242,rd.ResourceUsage.IndexBuffer), - (243,rd.ResourceUsage.IndexBuffer)] + (247,rd.ResourceUsage.IndexBuffer), + (248,rd.ResourceUsage.IndexBuffer)] if nestedSecondaries: expectedUsage += [ - (241+countDrawIndirectCount,rd.ResourceUsage.IndexBuffer)] + (246+countDrawIndirectCount+countDescBufferCopy,rd.ResourceUsage.IndexBuffer)] if descBuffer: expectedUsage += [ - (236+countDrawIndirectCount+countNested,rd.ResourceUsage.IndexBuffer)] + (251+countDrawIndirectCount+countNested,rd.ResourceUsage.IndexBuffer)] if (res.name == "Compute Buffer In"): expectedUsage += [(87,rd.ResourceUsage.CS_Constants), (94,rd.ResourceUsage.CS_Constants)] if nestedSecondaries: - expectedUsage += [(254+countDrawIndirectCount,rd.ResourceUsage.CS_Constants)] + expectedUsage += [(259+countDrawIndirectCount+countDescBufferCopy,rd.ResourceUsage.CS_Constants)] if descBuffer: - expectedUsage += [(241+countDrawIndirectCount+countNested,rd.ResourceUsage.CS_Constants)] + expectedUsage += [(256+countDrawIndirectCount+countNested,rd.ResourceUsage.CS_Constants)] if (res.name == "Compute Buffer Out"): expectedUsage += [(87,rd.ResourceUsage.CS_RWResource), (94,rd.ResourceUsage.CS_RWResource)] if nestedSecondaries: - expectedUsage += [(254+countDrawIndirectCount,rd.ResourceUsage.CS_RWResource)] + expectedUsage += [(259+countDrawIndirectCount+countDescBufferCopy,rd.ResourceUsage.CS_RWResource)] if descBuffer: - expectedUsage += [(241+countDrawIndirectCount+countNested,rd.ResourceUsage.CS_RWResource)] + expectedUsage += [(256+countDrawIndirectCount+countNested,rd.ResourceUsage.CS_RWResource)] if (res.name == "Indirect Data"): expectedUsage += [(14,rd.ResourceUsage.Barrier), (15,rd.ResourceUsage.Clear), @@ -249,41 +253,57 @@ class VK_Resource_Usage(rdtest.TestCase): (180,rd.ResourceUsage.Indirect), (200,rd.ResourceUsage.Indirect), (203,rd.ResourceUsage.Indirect), - (211,rd.ResourceUsage.Indirect)] + (211,rd.ResourceUsage.Indirect), + (219,rd.ResourceUsage.IndexBuffer), + (219,rd.ResourceUsage.Indirect)] if drawIndirectCount: expectedUsage += [ - (219,rd.ResourceUsage.Indirect), - (219,rd.ResourceUsage.Indirect), - (222,rd.ResourceUsage.Indirect), - (222,rd.ResourceUsage.Indirect), - (226,rd.ResourceUsage.Indirect), - (226,rd.ResourceUsage.Indirect), - (230,rd.ResourceUsage.Indirect), - (230,rd.ResourceUsage.Indirect), - (234,rd.ResourceUsage.Indirect), - (234,rd.ResourceUsage.Indirect), - (241,rd.ResourceUsage.Indirect), - (241,rd.ResourceUsage.Indirect)] - expectedUsage += [(218+countDrawIndirectCount,rd.ResourceUsage.Barrier)] + (224,rd.ResourceUsage.Indirect), + (224,rd.ResourceUsage.Indirect), + (227,rd.ResourceUsage.Indirect), + (227,rd.ResourceUsage.Indirect), + (231,rd.ResourceUsage.Indirect), + (231,rd.ResourceUsage.Indirect), + (235,rd.ResourceUsage.Indirect), + (235,rd.ResourceUsage.Indirect), + (239,rd.ResourceUsage.Indirect), + (239,rd.ResourceUsage.Indirect), + (246,rd.ResourceUsage.Indirect), + (246,rd.ResourceUsage.Indirect)] + expectedUsage += [(223+countDrawIndirectCount,rd.ResourceUsage.Barrier)] if nestedSecondaries: expectedUsage += [ - (255+countDrawIndirectCount,rd.ResourceUsage.Barrier)] + (260+countDrawIndirectCount+countDescBufferCopy,rd.ResourceUsage.Barrier)] if (res.name == "Barrier Buffer"): - expectedUsage = [(229+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), - (237+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), - (245+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), - (253+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), - (261+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), - (269+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), - (277+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), - (285+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), - (293+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), - (301+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier)] + expectedUsage = [(234+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), + (242+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), + (250+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), + (258+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), + (266+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), + (274+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), + (282+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), + (290+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), + (298+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), + (306+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier)] if (res.name == "Barrier2 Buffer"): - expectedUsage = [(309+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), - (314+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), + expectedUsage = [(314+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), (319+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), - (324+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier)] + (324+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier), + (329+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Barrier)] + if (res.name == "Descriptor Buffer"): + if descBuffer: + expectedUsage = [(227+countDrawIndirectCount,rd.ResourceUsage.Barrier), + (228+countDrawIndirectCount,rd.ResourceUsage.CopySrc), + (229+countDrawIndirectCount,rd.ResourceUsage.Barrier), + (230+countDrawIndirectCount,rd.ResourceUsage.Clear), + (233+countDrawIndirectCount,rd.ResourceUsage.Barrier), + (234+countDrawIndirectCount,rd.ResourceUsage.CopyDst)] + if (res.name == "Descriptor Backup Buffer"): + if descBuffer: + expectedUsage = [(227+countDrawIndirectCount,rd.ResourceUsage.Barrier), + (228+countDrawIndirectCount,rd.ResourceUsage.CopyDst), + (233+countDrawIndirectCount,rd.ResourceUsage.Barrier), + (234+countDrawIndirectCount,rd.ResourceUsage.CopySrc)] elif res.type == rd.ResourceType.Texture: if (res.name == "Offscreen MSAA Image"): expectedUsage = [(11,rd.ResourceUsage.Barrier), @@ -318,18 +338,19 @@ class VK_Resource_Usage(rdtest.TestCase): (207,rd.ResourceUsage.PS_Resource), (212,rd.ResourceUsage.PS_Resource), (213,rd.ResourceUsage.PS_Resource), - (214,rd.ResourceUsage.PS_Resource)] + (214,rd.ResourceUsage.PS_Resource), + (219,rd.ResourceUsage.PS_Resource)] if drawIndirectCount: expectedUsage += [ - (235,rd.ResourceUsage.PS_Resource), - (236,rd.ResourceUsage.PS_Resource), - (237,rd.ResourceUsage.PS_Resource), + (240,rd.ResourceUsage.PS_Resource), + (241,rd.ResourceUsage.PS_Resource), (242,rd.ResourceUsage.PS_Resource), - (243,rd.ResourceUsage.PS_Resource)] + (247,rd.ResourceUsage.PS_Resource), + (248,rd.ResourceUsage.PS_Resource)] if descBuffer: expectedUsage += [ - (233+countDrawIndirectCount+countNested,rd.ResourceUsage.PS_Resource), - (236+countDrawIndirectCount+countNested,rd.ResourceUsage.PS_Resource)] + (248+countDrawIndirectCount+countNested,rd.ResourceUsage.PS_Resource), + (251+countDrawIndirectCount+countNested,rd.ResourceUsage.PS_Resource)] elif res.type == rd.ResourceType.CommandBuffer: expectedUsage = [(0,rd.ResourceUsage.Unused)] elif res.type == rd.ResourceType.DescriptorStore: