Skip to content

Commit 2287790

Browse files
committed
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)
1 parent 0384c64 commit 2287790

2 files changed

Lines changed: 154 additions & 71 deletions

File tree

util/test/demos/vk/vk_resource_usage.cpp

Lines changed: 71 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -292,13 +292,13 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
292292
vkGetDescriptorEXT(device, &get, DescSize(type), dst);
293293
}
294294

295-
void BufferUpload(AllocatedBuffer & buffer, void *data, size_t countBytes)
295+
void BufferUpload(AllocatedBuffer & buffer, void *data, size_t countBytes, size_t offset = 0)
296296
{
297297
VmaAllocationInfo alloc_info;
298298
vmaGetAllocationInfo(buffer.allocator, buffer.alloc, &alloc_info);
299299
uint16_t *dst = NULL;
300300
vkMapMemory(device, alloc_info.deviceMemory, alloc_info.offset, VK_WHOLE_SIZE, 0, (void **)&dst);
301-
memcpy(dst, data, countBytes);
301+
memcpy(dst + offset, data, countBytes);
302302
vkUnmapMemory(device, alloc_info.deviceMemory);
303303
}
304304

@@ -584,9 +584,11 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
584584
this,
585585
vkh::BufferCreateInfo(indirectDataSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
586586
VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
587+
VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
587588
VK_BUFFER_USAGE_TRANSFER_DST_BIT),
588-
VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_GPU_ONLY}));
589+
VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_CPU_TO_GPU}));
589590
setName(indirectData.buffer, "Indirect Data");
591+
BufferUpload(indirectData, (void *)indices, sizeof(indices), 1024);
590592

591593
AllocatedBuffer barrierBuffer(this,
592594
vkh::BufferCreateInfo(1024, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT),
@@ -611,16 +613,25 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
611613

612614
VkDescriptorBufferBindingInfoEXT descBuffBind = {};
613615
AllocatedBuffer descBuf;
616+
AllocatedBuffer descBackupBuf;
614617
if(descBuffer)
615618
{
616619
descBuf = AllocatedBuffer(
617620
this,
618621
vkh::BufferCreateInfo(0x1000, VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR |
619622
VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT |
620-
VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT),
623+
VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT |
624+
VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
625+
VK_BUFFER_USAGE_TRANSFER_DST_BIT),
621626
VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_CPU_TO_GPU}));
622-
623627
setName(descBuf.buffer, "Descriptor Buffer");
628+
descBackupBuf =
629+
AllocatedBuffer(this,
630+
vkh::BufferCreateInfo(0x1000, VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
631+
VK_BUFFER_USAGE_TRANSFER_DST_BIT),
632+
VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_GPU_ONLY}));
633+
634+
setName(descBackupBuf.buffer, "Descriptor Backup Buffer");
624635
VmaAllocationInfo alloc_info;
625636
vmaGetAllocationInfo(descBuf.allocator, descBuf.alloc, &alloc_info);
626637
byte *descBufMem = NULL;
@@ -1150,6 +1161,12 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
11501161
vkCmdDrawIndexedIndirect(cmd, indirectData.buffer, offset, countDrawIndexed,
11511162
strideDrawIndexed);
11521163
NextTest();
1164+
1165+
vkCmdSetViewport(cmd, 0, 1, &viewPort);
1166+
vkCmdBindIndexBuffer(cmd, indirectData.buffer, 1024, VK_INDEX_TYPE_UINT32);
1167+
vkCmdDrawIndexedIndirect(cmd, indirectData.buffer, offset, 1, strideDrawIndexed);
1168+
vkCmdBindIndexBuffer(cmd, ib.buffer, 0, VK_INDEX_TYPE_UINT32);
1169+
NextTest();
11531170
offset += countDrawIndexed * strideDrawIndexed;
11541171

11551172
if(draw_indirect_count)
@@ -1236,9 +1253,51 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
12361253
popMarker(cmd);
12371254
}
12381255

1256+
VkCommandBuffer backupDescBufCmd = VK_NULL_HANDLE;
1257+
VkCommandBuffer restoreDescBufCmd = VK_NULL_HANDLE;
1258+
std::vector<VkCommandBuffer> cmds;
1259+
12391260
// Descriptor Buffer
12401261
if(descBuffer)
12411262
{
1263+
VkBufferCopy copyRegion;
1264+
copyRegion.srcOffset = 0;
1265+
copyRegion.dstOffset = 0;
1266+
copyRegion.size = 0x1000;
1267+
1268+
backupDescBufCmd = GetCommandBuffer();
1269+
vkBeginCommandBuffer(backupDescBufCmd, vkh::CommandBufferBeginInfo());
1270+
vkh::cmdPipelineBarrier(
1271+
backupDescBufCmd, {},
1272+
{
1273+
vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_TRANSFER_READ_BIT,
1274+
descBuf.buffer),
1275+
vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
1276+
descBackupBuf.buffer),
1277+
});
1278+
vkCmdCopyBuffer(backupDescBufCmd, descBuf.buffer, descBackupBuf.buffer, 1, &copyRegion);
1279+
vkh::cmdPipelineBarrier(
1280+
backupDescBufCmd, {},
1281+
{
1282+
vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
1283+
descBuf.buffer),
1284+
});
1285+
vkCmdFillBuffer(backupDescBufCmd, descBuf.buffer, 0, 0x1000, 0);
1286+
vkEndCommandBuffer(backupDescBufCmd);
1287+
1288+
restoreDescBufCmd = GetCommandBuffer();
1289+
vkBeginCommandBuffer(restoreDescBufCmd, vkh::CommandBufferBeginInfo());
1290+
vkh::cmdPipelineBarrier(
1291+
restoreDescBufCmd, {},
1292+
{
1293+
vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_TRANSFER_READ_BIT,
1294+
descBackupBuf.buffer),
1295+
vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
1296+
descBuf.buffer),
1297+
});
1298+
vkCmdCopyBuffer(restoreDescBufCmd, descBackupBuf.buffer, descBuf.buffer, 1, &copyRegion);
1299+
vkEndCommandBuffer(restoreDescBufCmd);
1300+
12421301
pushMarker(cmd, "Descriptor Buffer");
12431302
vkCmdSetScissor(cmd, 0, 1, &mainWindow->scissor);
12441303
vkh::cmdBindVertexBuffers(cmd, 0, {vb.buffer}, {0});
@@ -1275,17 +1334,20 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
12751334
vkCmdDispatch(cmd, 1, 1, 1);
12761335

12771336
popMarker(cmd);
1337+
cmds.push_back(backupDescBufCmd);
1338+
cmds.push_back(restoreDescBufCmd);
12781339
}
12791340

12801341
FinishUsingBackbuffer(cmd, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
12811342

12821343
vkEndCommandBuffer(cmd);
1344+
cmds.push_back(cmd);
12831345

1284-
Submit(1, 3, {cmd});
1346+
Submit(1, 3, cmds);
12851347

1286-
std::vector<VkCommandBuffer> cmds;
1287-
cmds.push_back(barrierCmd);
1288-
VkSubmitInfo submit = vkh::SubmitInfo(cmds);
1348+
std::vector<VkCommandBuffer> cmds2;
1349+
cmds2.push_back(barrierCmd);
1350+
VkSubmitInfo submit = vkh::SubmitInfo(cmds2);
12891351
for(uint32_t i = 0; i < 10; ++i)
12901352
{
12911353
vkWaitForFences(device, 1, &barrerCmdSubmitFence, VK_TRUE, UINT64_MAX);

0 commit comments

Comments
 (0)