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)
This commit is contained in:
Jake Turner
2026-04-23 11:58:16 +01:00
parent 0384c64d81
commit 2287790c41
2 changed files with 154 additions and 71 deletions
+71 -9
View File
@@ -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<VkCommandBuffer> 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, &copyRegion);
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, &copyRegion);
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<VkCommandBuffer> cmds;
cmds.push_back(barrierCmd);
VkSubmitInfo submit = vkh::SubmitInfo(cmds);
std::vector<VkCommandBuffer> 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);
+83 -62
View File
@@ -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: