@@ -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 , ©Region);
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 , ©Region);
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