VK_Resource_Usage improvements

- add secondary commands buffers to Submit() calls so they get put back into the command buffer pool
- fix validation error about renderEndSemaphore
- fix sync validation errors
- add more names to objects
- fix some incorrect names
- move the pipeline bind to after marker "DrawIndirect: Single"
- add marker to start and end of EIDS which should be tracked for resource usage
- add a per frame update descriptorset
- bind compute descriptor sets before binding compute pipelines

- Remove hard coded EIDs from VK_Resource_Usage python
This commit is contained in:
Jake Turner committed 2026-11-03 10:52:15 +00:00
1 parent e55f7a5497
commit bf6fe56c5b
2 files changed
+241 -153

No files matched your search

+59 -23
View File
@@ -542,6 +542,7 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
VkPipelineLayout meshShaderLayout = createPipelineLayout(
vkh::PipelineLayoutCreateInfo({}, {vkh::PushConstantRange(VK_SHADER_STAGE_ALL, 0, 8)}));
setName(meshShaderLayout, "Mesh Shader Pipeline Layout");
VkPipeline meshShaderPipe = VK_NULL_HANDLE;
if(meshShader)
@@ -563,6 +564,7 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
vkMeshShaderPipeCreateInfo->pInputAssemblyState = NULL;
meshShaderPipe = createGraphicsPipeline(vkMeshShaderPipeCreateInfo);
setName(meshShaderPipe, "Mesh Shader Pipeline");
}
VkDescriptorSetLayout compDescSetLayout =
@@ -574,7 +576,7 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
VkPipelineLayout compDescSetPipeLayout =
createPipelineLayout(vkh::PipelineLayoutCreateInfo({compDescSetLayout}));
setName(compDescSetPipeLayout, "Compute Pipeline Layout");
setName(compDescSetPipeLayout, "Compute Descriptor Set Pipeline Layout");
vkh::ComputePipelineCreateInfo compDescSetPipeCreateInfo(
compDescSetPipeLayout,
@@ -607,7 +609,7 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
if(descBuffer)
{
compDescBuffPipeLayout = createPipelineLayout(vkh::PipelineLayoutCreateInfo({descBuffLayout}));
setName(compDescSetPipeLayout, "Compute Descriptor Buffer Pipeline Layout");
setName(compDescBuffPipeLayout, "Compute Descriptor Buffer Pipeline Layout");
vkh::ComputePipelineCreateInfo compDescBuffPipeCreateInfo(
compDescBuffPipeLayout,
@@ -836,6 +838,19 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
{
viewPort = {0.0f, 0.0f, sqSize, sqSize, 0.0f, 1.0f};
setName(mainWindow->GetFB(), "Main Framebuffer");
std::vector<VkCommandBuffer> secondaries;
vkh::updateDescriptorSets(
device,
{
vkh::WriteDescriptorSet(compWriteDataDescSet, 0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
{vkh::DescriptorBufferInfo(indirectData.buffer)}),
vkh::WriteDescriptorSet(compDescSet, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
{vkh::DescriptorBufferInfo(compBufIn.buffer)}),
vkh::WriteDescriptorSet(
descSet, 2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
{vkh::DescriptorImageInfo(offimgRTV, VK_IMAGE_LAYOUT_GENERAL, linearSampler)}),
});
VkCommandBuffer barrierSecCmd = GetCommandBuffer(VK_COMMAND_BUFFER_LEVEL_SECONDARY);
vkBeginCommandBuffer(barrierSecCmd, vkh::CommandBufferBeginInfo(
@@ -846,7 +861,7 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
{vkh::BufferMemoryBarrier(VK_ACCESS_NONE, VK_ACCESS_NONE, barrier2Buffer.buffer)});
vkEndCommandBuffer(barrierSecCmd);
VkCommandBuffer secCmdBuffers[3];
std::vector<VkCommandBuffer> secCmdBuffers;
for(size_t i = 0; i < 2; i++)
{
VkCommandBuffer secCmd = GetCommandBuffer(VK_COMMAND_BUFFER_LEVEL_SECONDARY);
@@ -876,7 +891,7 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
popMarker(secCmd);
vkEndCommandBuffer(secCmd);
secCmdBuffers[i] = secCmd;
secCmdBuffers.push_back(secCmd);
}
{
VkCommandBuffer emptySecCmd = GetCommandBuffer(VK_COMMAND_BUFFER_LEVEL_SECONDARY);
@@ -885,7 +900,7 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
vkh::CommandBufferInheritanceInfo(renderPass, 0)));
vkEndCommandBuffer(emptySecCmd);
secCmdBuffers[2] = emptySecCmd;
secCmdBuffers.push_back(emptySecCmd);
}
VkCommandBuffer nestedCmd = GetCommandBuffer(VK_COMMAND_BUFFER_LEVEL_SECONDARY);
@@ -949,6 +964,7 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
VkCommandBuffer cmd = GetCommandBuffer();
vkBeginCommandBuffer(cmd, vkh::CommandBufferBeginInfo());
setMarker(cmd, "Resource Usage: Start");
VkImage swapimg =
StartUsingBackbuffer(cmd, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
@@ -999,9 +1015,9 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
{vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
indirectData.buffer)});
vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_COMPUTE, compWriteDataPipe);
vkh::cmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_COMPUTE, compWriteDataPipeLayout, 0,
{compWriteDataDescSet}, {});
vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_COMPUTE, compWriteDataPipe);
uint32_t mode = 0;
vkCmdPushConstants(cmd, compWriteDataPipeLayout, VK_SHADER_STAGE_COMPUTE_BIT, 0, 4, &mode);
@@ -1068,7 +1084,8 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
{
vkCmdBeginRenderPass(cmd, mainWindow->beginRP(),
VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
vkCmdExecuteCommands(cmd, 3, secCmdBuffers);
vkCmdExecuteCommands(cmd, (uint32_t)secCmdBuffers.size(), secCmdBuffers.data());
secondaries.insert(secondaries.end(), secCmdBuffers.begin(), secCmdBuffers.end());
vkCmdEndRenderPass(cmd);
}
popMarker(cmd);
@@ -1092,6 +1109,7 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
pushMarker(cmd, "Secondary Command Buffer");
{
vkCmdExecuteCommands(cmd, 1, &compSecCmd);
secondaries.push_back(compSecCmd);
}
popMarker(cmd);
}
@@ -1101,9 +1119,9 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
{
pushMarker(cmd, "Indirect Dispatch Write IndirectDraw Data");
{
vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_COMPUTE, compWriteDataPipe);
vkh::cmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_COMPUTE, compWriteDataPipeLayout,
0, {compWriteDataDescSet}, {});
vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_COMPUTE, compWriteDataPipe);
uint32_t mode = 1;
vkCmdPushConstants(cmd, compWriteDataPipeLayout, VK_SHADER_STAGE_COMPUTE_BIT, 0, 4, &mode);
@@ -1187,9 +1205,9 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
{vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, indirectData.buffer)});
vkCmdBindPipeline(indirectCompSecCmd, VK_PIPELINE_BIND_POINT_COMPUTE, compWriteDataPipe);
vkh::cmdBindDescriptorSets(indirectCompSecCmd, VK_PIPELINE_BIND_POINT_COMPUTE,
compWriteDataPipeLayout, 0, {compWriteDataDescSet}, {});
vkCmdBindPipeline(indirectCompSecCmd, VK_PIPELINE_BIND_POINT_COMPUTE, compWriteDataPipe);
uint32_t mode = 0;
vkCmdPushConstants(indirectCompSecCmd, compWriteDataPipeLayout,
@@ -1201,10 +1219,11 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
vkCmdPushConstants(indirectCompSecCmd, compWriteDataPipeLayout,
VK_SHADER_STAGE_COMPUTE_BIT, 0, 4, &mode);
vkh::cmdPipelineBarrier(
indirectCompSecCmd, {},
{vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, indirectData.buffer)});
vkh::cmdPipelineBarrier(indirectCompSecCmd, {},
{vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT |
VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
indirectData.buffer)});
setMarker(indirectCompSecCmd, "DispatchIndirect");
vkCmdDispatchIndirect(indirectCompSecCmd, indirectData.buffer, 0);
@@ -1212,8 +1231,10 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
vkh::cmdPipelineBarrier(
indirectCompSecCmd, {},
{vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, indirectData.buffer)});
{vkh::BufferMemoryBarrier(
VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
indirectData.buffer)});
vkCmdDispatchIndirect(indirectCompSecCmd, indirectData.buffer, 0);
@@ -1226,6 +1247,7 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
}
vkCmdExecuteCommands(cmd, 1, &indirectCompSecCmd);
secondaries.push_back(indirectCompSecCmd);
vkCmdBeginRenderPass(cmd, mainWindow->beginRP(),
VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
@@ -1246,10 +1268,9 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
descSetPipeLayout, 0, {descSet}, {});
vkh::cmdBindVertexBuffers(indirectDrawSecCmd, 0, {vb.buffer}, {0});
vkCmdBindIndexBuffer(indirectDrawSecCmd, ib.buffer, 0, VK_INDEX_TYPE_UINT32);
vkCmdBindPipeline(indirectDrawSecCmd, VK_PIPELINE_BIND_POINT_GRAPHICS, descSetPipe);
setMarker(indirectDrawSecCmd, "DrawIndirect: Single");
vkCmdBindPipeline(indirectDrawSecCmd, VK_PIPELINE_BIND_POINT_GRAPHICS, descSetPipe);
vkCmdSetViewport(indirectDrawSecCmd, 0, 1, &viewPort);
vkCmdDrawIndirect(indirectDrawSecCmd, indirectData.buffer, offset, 1, strideDraw);
NextTest();
@@ -1272,6 +1293,7 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
vkEndCommandBuffer(indirectDrawSecCmd);
}
vkCmdExecuteCommands(cmd, 1, &indirectDrawSecCmd);
secondaries.push_back(indirectDrawSecCmd);
vkCmdEndRenderPass(cmd);
}
@@ -1292,9 +1314,9 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
{descSet}, {});
vkh::cmdBindVertexBuffers(cmd, 0, {vb.buffer}, {0});
vkCmdBindIndexBuffer(cmd, ib.buffer, 0, VK_INDEX_TYPE_UINT32);
vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, descSetPipe);
setMarker(cmd, "DrawIndirect: Single");
vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, descSetPipe);
vkCmdSetViewport(cmd, 0, 1, &viewPort);
size_t drawIndirectOffset = offset;
vkCmdDrawIndirect(cmd, indirectData.buffer, drawIndirectOffset, 1, strideDraw);
@@ -1379,7 +1401,8 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
vkEndCommandBuffer(cmd);
Submit(0, 3, {cmd});
Submit(0, 2, {cmd}, secondaries);
secondaries.clear();
cmd = GetCommandBuffer();
@@ -1397,10 +1420,12 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
vkCmdBeginRenderPass(cmd, mainWindow->beginRP(),
VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
vkCmdExecuteCommands(cmd, 1, &nestedCmd);
secondaries.push_back(nestedCmd);
vkCmdEndRenderPass(cmd);
setMarker(cmd, "Dispatch");
vkCmdExecuteCommands(cmd, 1, &compNestedSecCmd);
secondaries.push_back(compNestedSecCmd);
popMarker(cmd);
}
@@ -1442,7 +1467,7 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
vkh::cmdPipelineBarrier(
restoreDescBufCmd, {},
{
vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_TRANSFER_READ_BIT,
vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
descBackupBuf.buffer),
vkh::BufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
descBuf.buffer),
@@ -1549,7 +1574,9 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
vkEndCommandBuffer(cmd);
cmds.push_back(cmd);
Submit(1, 3, cmds);
// Final submit related to backbuffer
Submit(1, 2, cmds, secondaries);
secondaries.clear();
std::vector<VkCommandBuffer> cmds2;
cmds2.push_back(barrierCmd);
@@ -1562,7 +1589,9 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
vkWaitForFences(device, 1, &barrierCmdSubmitFence, VK_TRUE, UINT64_MAX);
}
cmd = GetCommandBuffer();
CHECK_VKR(vkAllocateCommandBuffers(device, vkh::CommandBufferAllocateInfo(barrierCmdPool, 1),
&cmd));
setName(cmd, "Multiple Secondary Executes Command Buffer");
vkBeginCommandBuffer(cmd, vkh::CommandBufferBeginInfo());
@@ -1575,9 +1604,16 @@ RD_TEST(VK_Resource_Usage, VulkanGraphicsTest)
popMarker(cmd);
}
setMarker(cmd, "Resource Usage: End");
vkEndCommandBuffer(cmd);
Submit(2, 3, {cmd});
std::vector<VkCommandBuffer> cmds3;
cmds3.push_back(cmd);
submit = vkh::SubmitInfo(cmds3);
vkWaitForFences(device, 1, &barrierCmdSubmitFence, VK_TRUE, UINT64_MAX);
vkResetFences(device, 1, &barrierCmdSubmitFence);
CHECK_VKR(vkQueueSubmit(queue, 1, &submit, barrierCmdSubmitFence));
vkWaitForFences(device, 1, &barrierCmdSubmitFence, VK_TRUE, UINT64_MAX);
Present();
}
+182 -130
View File
@@ -7,6 +7,8 @@ class VK_Resource_Usage(rdtest.TestCase):
demos_test_name = 'VK_Resource_Usage'
resourceUsages: Dict[rd.ResourceId, List[rd.EventUsage]] = {}
eids: List[int] = []
markerStart = 0
markerEnd = 0
def add_action(self, action: rd.ActionDescription):
self.eids.append(action.eventId)
@@ -17,14 +19,21 @@ class VK_Resource_Usage(rdtest.TestCase):
def check_resource_usage(self, res: rd.ResourceDescription, expectedUsages: List[Tuple[int,rd.ResourceUsage]]):
usages = self.resourceUsages[res.resourceId]
if len(usages) != len(expectedUsages):
for u in usages:
rdtest.log.print(f"Resource '{res.name}' {res.resourceId} usage EID:{u.eventId} usage:{u.usage.name}")
if len(usages) == 1 and usages[0].eventId == 0 and usages[0].usage == rd.ResourceUsage.Unused:
resUsages = usages
else:
resUsages = [u for u in usages if u.eventId >= self.markerStart and u.eventId <= self.markerEnd]
rdtest.log.print(f"Resource '{res.name}' type:{res.type.name} {res.resourceId} usages:{len(resUsages)} expectedUsages:{len(expectedUsages)}")
if len(resUsages) != len(expectedUsages):
rdtest.log.print(f"Usages for Resource '{res.name}' {res.resourceId}")
for u in resUsages:
rdtest.log.print(f"EID:{u.eventId} usage:{u.usage.name}")
rdtest.log.print(f"Expected Usages for Resource '{res.name}' {res.resourceId}")
for u in expectedUsages:
eid, usage = u
rdtest.log.print(f"Resource '{res.name}' {res.resourceId} usage EID:{eid} usage:{usage.name}")
raise rdtest.TestFailureException(f"'{res.name}' {res.resourceId} Incorrect resource usages count expected:{len(expectedUsages)} actual:{len(usages)}")
for i, u in enumerate(usages):
rdtest.log.print(f"EID:{eid} usage:{usage.name}")
raise rdtest.TestFailureException(f"'{res.name}' {res.resourceId} Incorrect resource usages count expected:{len(expectedUsages)} actual:{len(resUsages)}")
for i, u in enumerate(resUsages):
eid, usage = expectedUsages[i]
if u.usage != usage:
raise rdtest.TestFailureException(f"'{res.name}' {res.resourceId} EID:{u.eventId} Incorrect resource usage expected:{usage.name} actual:{u.usage.name}")
@@ -50,13 +59,6 @@ class VK_Resource_Usage(rdtest.TestCase):
meshShader = self.find_action("Mesh Shader") is not None
rdtest.log.print(f"Has Mesh Shader: {'Yes' if meshShader else 'No'}")
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
countMeshShader = 33 if meshShader else 0
# Walk the actions finding all the Dispatch, Draw, DrawIndexed, DrawIndirect, DrawIndirectCount
sdfile = self.controller.GetStructuredFile()
actions = self.controller.GetRootActions().copy()
@@ -74,23 +76,53 @@ class VK_Resource_Usage(rdtest.TestCase):
resetFencesEIDs: List[int] = []
descSetDrawEIDs: List[int] = []
descBufferDrawEIDs: List[int] = []
cmdDrawIndirectEIDs: List[int] = []
cmdMeshDispatchIndirectEIDs: List[int] = []
endRenderPassEIDs : List[int] = []
fillBufferEIDs: List[int] = []
copyBufferEIDs: List[int] = []
markerGraphics = 0
markerGraphicsNoDescriptorSet = 0
markerGraphicsDescriptorSet = 0
markerGraphicsSecondaryCommandBuffer = 0
markerIndirect = 0
markerIndirectWriteIndirectDispatchData = 0
markerIndirectDispatchWriteIndirectDrawData = 0
markerIndirectIndirectDraws = 0
markerIndirectSecondaryCommandBuffer = 0
markerIndirectSecondaryCommandBufferDispatchIndirect = 0
markerIndirectEnd = 0
markerNestedSecondaryCommandBuffer = 0
markerNestedSecondaryCommandBufferDispatch = 0
markerDescriptorBuffer = 0
markerBarrierCommandSubmitFence = 0
markerCompute = 0
markerComputeDescriptorSet = 0
markerComputeSecondaryCommandBuffer = 0
markerLooseEventsAfterIndirectDrawsDrawIndirectSingle = 0
markerMultipleCommandBufferSubmits = 0
markerMultipleSecondaryCommandBufferExecutes = 0
self.markerStart = self.find_action("Resource Usage: Start").eventId
self.markerEnd = self.find_action("Resource Usage: End").eventId
markerIndirectWriteIndirectDispatchData = self.find_action("Indirect Write IndirectDispatch Data").eventId
markerGraphics = self.find_action("Graphics").eventId
markerGraphicsNoDescriptorSet = self.find_action("No Descriptor Set", markerGraphics).eventId
markerGraphicsDescriptorSet = self.find_action("Descriptor Set", markerGraphicsNoDescriptorSet+1).eventId
markerGraphicsSecondaryCommandBuffer = self.find_action("Secondary Command Buffer").eventId
if nestedSecondaries:
markerNestedSecondaryCommandBuffer = self.find_action("Nested Secondary Command Buffer").eventId
markerNestedSecondaryCommandBufferDispatch = self.find_action("Dispatch", markerNestedSecondaryCommandBuffer).eventId
if descBuffer:
markerDescriptorBuffer = self.find_action("Descriptor Buffer").eventId
markerBarrierCommandSubmitFence = self.find_action("Barrier Command Submit Fence").eventId
markerCompute = self.find_action("Compute").eventId
markerComputeSecondaryCommandBuffer = self.find_action("Secondary Command Buffer", markerCompute).eventId
markerLooseEventsAfterIndirectDraws = self.find_action("Loose Events After Indirect Draws").eventId
markerLooseEventsAfterIndirectDrawsDrawIndirectSingle = self.find_action("DrawIndirect: Single", markerLooseEventsAfterIndirectDraws).eventId
markerMultipleCommandBufferSubmits = self.find_action("Multiple Command Buffer Submits").eventId
markerMultipleSecondaryCommandBufferExecutes = self.find_action("Multiple Secondary Command Buffer Executes").eventId
while len(actions) > 0:
action = actions.pop(0)
@@ -115,19 +147,23 @@ class VK_Resource_Usage(rdtest.TestCase):
meshDispatchEIDs.append(action.eventId)
if flags & rd.ActionFlags.MultiAction:
multiEIDs.append(action.eventId)
if "Count" in action.customName:
if not action.eventId in indirectCountEIDs:
indirectCountEIDs.append(action.eventId)
if flags & rd.ActionFlags.PushMarker:
parentName = action.parent.customName if action.parent is not None else None
markerPath = parentName + "." + action.customName if parentName is not None else action.customName
if not markerGraphicsDescriptorSet and markerPath == "Graphics.Descriptor Set":
rdtest.log.print(f"{action.parent.customName} {action.parent.eventId} {action.customName} {action.eventId}")
markerGraphicsDescriptorSet = action.eventId
if not markerIndirect and markerPath == "Indirect":
markerIndirect = action.eventId
markerIndirectEnd = action.children[-1].eventId
if not markerCompute and markerPath == "Compute":
markerCompute = action.eventId
if not markerComputeDescriptorSet and markerPath == "Compute.Descriptor Set":
markerComputeDescriptorSet = action.eventId
if "vkCmdDrawIndirect(" in action.customName:
cmdDrawIndirectEIDs.append(action.eventId)
if "vkCmdDrawIndexedIndirect(" in action.customName:
cmdDrawIndirectEIDs.append(action.eventId)
if "vkCmdDrawMeshTasksIndirectEXT(" in action.customName:
cmdMeshDispatchIndirectEIDs.append(action.eventId)
for e in action.events:
eventName = sdfile.chunks[e.chunkIndex].name
if "vkQueueSubmit" in eventName:
@@ -136,28 +172,41 @@ class VK_Resource_Usage(rdtest.TestCase):
waitFencesEIDs.append(e.eventId)
if "vkResetFences" in eventName:
resetFencesEIDs.append(e.eventId)
if "vkCmdCopyBuffer" in eventName:
copyBufferEIDs.append(e.eventId)
if "vkCmdFillBuffer" in eventName:
fillBufferEIDs.append(e.eventId)
if "vkCmdEndRenderPass" in eventName:
endRenderPassEIDs.append(e.eventId)
for eid in drawEIDs:
if eid > markerGraphicsDescriptorSet and eid < markerGraphicsSecondaryCommandBuffer:
descSetDrawEIDs.append(eid)
elif eid > markerIndirect and (not nestedSecondaries or eid < markerNestedSecondaryCommandBuffer):
descSetDrawEIDs.append(eid)
elif descBuffer and eid > markerDescriptorBuffer:
descBufferDrawEIDs.append(eid)
markerIndirectDispatchWriteIndirectDrawData = self.find_action("Indirect Dispatch Write IndirectDraw Data", markerIndirect).eventId
markerIndirectIndirectDraws = self.find_action("Indirect Draws", markerIndirectDispatchWriteIndirectDrawData).eventId
markerIndirectSecondaryCommandBuffer = self.find_action("Secondary Command Buffer", markerIndirect).eventId
markerIndirectSecondaryCommandBufferDispatchIndirect = self.find_action("DispatchIndirect", markerIndirectSecondaryCommandBuffer).eventId
descSetDrawEIDs += [eid for eid in drawEIDs
if (eid > markerGraphicsDescriptorSet and eid < markerGraphicsSecondaryCommandBuffer) or
(eid > markerIndirect and (not nestedSecondaries or eid < markerNestedSecondaryCommandBuffer))]
descBufferDrawEIDs += [eid for eid in drawEIDs if descBuffer and eid > markerDescriptorBuffer]
drawEIDs.sort()
indexedEIDs.sort()
indexedSpecialEIDs.sort()
dispatchEIDs.sort()
multiEIDs.sort()
indirectEIDs.sort()
meshDispatchEIDs.sort()
multiEIDs.sort()
indirectCountEIDs.sort()
submitEIDs.sort()
waitFencesEIDs.sort()
resetFencesEIDs.sort()
descSetDrawEIDs.sort()
descBufferDrawEIDs.sort()
fillBufferEIDs.sort()
copyBufferEIDs.sort()
endRenderPassEIDs.sort()
cmdDrawIndirectEIDs.sort()
cmdMeshDispatchIndirectEIDs.sort()
action = self.find_action("Draw")
self.set_event(action.eventId, False)
@@ -176,16 +225,13 @@ class VK_Resource_Usage(rdtest.TestCase):
# the swap chain image has usage, anything else does not
if res.resourceId == swapImage:
expectedUsage = [
(6,rd.ResourceUsage.Barrier),
(6,rd.ResourceUsage.Discard),
(7,rd.ResourceUsage.Clear),
(8,rd.ResourceUsage.Barrier)]
for eid in drawEIDs:
expectedUsage.append((eid,rd.ResourceUsage.ColorTarget))
for eid in meshDispatchEIDs:
expectedUsage.append((eid,rd.ResourceUsage.ColorTarget))
expectedUsage += [
(235+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier)]
(self.markerStart + 1,rd.ResourceUsage.Barrier),
(self.markerStart + 1,rd.ResourceUsage.Discard),
(self.markerStart + 2,rd.ResourceUsage.Clear),
(self.markerStart + 3,rd.ResourceUsage.Barrier)]
expectedUsage += [(eid,rd.ResourceUsage.ColorTarget) for eid in drawEIDs]
expectedUsage += [(eid,rd.ResourceUsage.ColorTarget) for eid in meshDispatchEIDs]
expectedUsage += [(markerBarrierCommandSubmitFence - 1, rd.ResourceUsage.Barrier)]
else:
expectedUsage = []
elif res.type == rd.ResourceType.RenderPass:
@@ -204,116 +250,123 @@ class VK_Resource_Usage(rdtest.TestCase):
expectedUsage = [(0,rd.ResourceUsage.Unused)]
elif res.type == rd.ResourceType.Buffer:
if res.name == "Vertex Buffer":
for eid in drawEIDs:
expectedUsage.append((eid,rd.ResourceUsage.VertexBuffer))
expectedUsage += [(eid,rd.ResourceUsage.VertexBuffer) for eid in drawEIDs]
if res.name == "Index Buffer":
for eid in indexedEIDs:
expectedUsage.append((eid,rd.ResourceUsage.IndexBuffer))
expectedUsage += [(eid,rd.ResourceUsage.IndexBuffer) for eid in indexedEIDs]
if res.name == "Compute Buffer In":
# All dispatches within "Compute" region
# All dispatches within "Nested Secondary Command Buffer" region
for eid in dispatchEIDs:
if eid > markerComputeDescriptorSet and eid < markerIndirect:
expectedUsage.append((eid,rd.ResourceUsage.CS_Constants))
elif nestedSecondaries and eid > markerNestedSecondaryCommandBuffer:
expectedUsage.append((eid,rd.ResourceUsage.CS_Constants))
expectedUsage += [(eid,rd.ResourceUsage.CS_Constants) for eid in dispatchEIDs
if (eid > markerComputeDescriptorSet and eid < markerIndirect) or
(nestedSecondaries and eid > markerNestedSecondaryCommandBuffer)]
if res.name == "Compute Buffer Out":
# All dispatches within "Compute" region
# All dispatches within "Nested Secondary Command Buffer" region
for eid in dispatchEIDs:
if eid > markerComputeDescriptorSet and eid < markerIndirect:
expectedUsage.append((eid,rd.ResourceUsage.CS_RWResource))
elif nestedSecondaries and eid > markerNestedSecondaryCommandBuffer:
expectedUsage.append((eid,rd.ResourceUsage.CS_RWResource))
expectedUsage += [(eid,rd.ResourceUsage.CS_RWResource) for eid in dispatchEIDs
if (eid > markerComputeDescriptorSet and eid < markerIndirect) or
(nestedSecondaries and eid > markerNestedSecondaryCommandBuffer)]
if res.name == "Indirect Data":
expectedUsage += [(14,rd.ResourceUsage.Barrier),
(15,rd.ResourceUsage.Clear),
(16,rd.ResourceUsage.Barrier),
(20,rd.ResourceUsage.CS_RWResource),
(21,rd.ResourceUsage.Barrier),
(97,rd.ResourceUsage.Barrier),
(109,rd.ResourceUsage.Barrier),
(120,rd.ResourceUsage.Indirect),
(124,rd.ResourceUsage.Indirect),
(142,rd.ResourceUsage.Indirect),
(144,rd.ResourceUsage.Barrier),
(149,rd.ResourceUsage.Barrier),
(150,rd.ResourceUsage.Clear),
(151,rd.ResourceUsage.Barrier),
(155,rd.ResourceUsage.CS_RWResource),
(157,rd.ResourceUsage.Barrier),
(161,rd.ResourceUsage.Barrier),
(163,rd.ResourceUsage.Barrier),
(177,rd.ResourceUsage.Indirect),
(208,rd.ResourceUsage.Indirect)]
if drawIndirectCount:
expectedUsage += [
(247,rd.ResourceUsage.Indirect),
(254,rd.ResourceUsage.Indirect)]
expectedUsage += [(231+countDrawIndirectCount,rd.ResourceUsage.Barrier)]
if nestedSecondaries:
expectedUsage += [
(268+countDrawIndirectCount+countDescBufferCopy,rd.ResourceUsage.Barrier)]
if meshShader:
expectedUsage += [
(249+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Indirect),
(252+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Indirect),
(255+countDrawIndirectCount+countNested+countDescBuffer,rd.ResourceUsage.Indirect)]
for eid in indirectEIDs:
# Dispatch + Indirect
if eid in dispatchEIDs:
expectedUsage += [(markerIndirectWriteIndirectDispatchData + 1,rd.ResourceUsage.Barrier),
(markerIndirectWriteIndirectDispatchData + 2,rd.ResourceUsage.Clear),
(markerIndirectWriteIndirectDispatchData + 3,rd.ResourceUsage.Barrier)]
expectedUsage += [(markerIndirectSecondaryCommandBuffer - 2,rd.ResourceUsage.Barrier),
(markerIndirectSecondaryCommandBuffer + 3,rd.ResourceUsage.Barrier),
(markerIndirectSecondaryCommandBuffer + 5,rd.ResourceUsage.Barrier)]
expectedUsage += [(markerIndirectIndirectDraws - 2,rd.ResourceUsage.Barrier)]
expectedUsage += [(markerIndirectSecondaryCommandBufferDispatchIndirect - 1,rd.ResourceUsage.Barrier),
(markerIndirectSecondaryCommandBufferDispatchIndirect + 3,rd.ResourceUsage.Barrier),
(markerIndirectSecondaryCommandBufferDispatchIndirect + 5,rd.ResourceUsage.Barrier)]
for eid in dispatchEIDs:
if eid in indirectEIDs:
continue
if eid in indirectCountEIDs:
continue
if eid in multiEIDs:
continue
if eid in indexedSpecialEIDs:
continue
if eid > markerIndirectWriteIndirectDispatchData and eid < markerGraphics:
expectedUsage.append((eid,rd.ResourceUsage.CS_RWResource))
expectedUsage.append((eid+1,rd.ResourceUsage.Barrier))
if eid > markerComputeSecondaryCommandBuffer and eid < markerIndirect:
expectedUsage.append((eid+1,rd.ResourceUsage.Barrier))
if eid > markerIndirectSecondaryCommandBuffer and eid < markerIndirectEnd:
expectedUsage.append((eid,rd.ResourceUsage.CS_RWResource))
for eid in cmdDrawIndirectEIDs:
if eid in indirectCountEIDs:
continue
if eid in multiEIDs:
continue
if eid in indexedSpecialEIDs:
continue
if eid > markerIndirectIndirectDraws and eid < markerIndirectEnd:
expectedUsage.append((eid,rd.ResourceUsage.Indirect))
for eid in multiEIDs:
expectedUsage.append((eid,rd.ResourceUsage.Indirect))
for eid in indirectCountEIDs:
expectedUsage.append((eid,rd.ResourceUsage.Indirect))
for eid in indexedSpecialEIDs:
expectedUsage.append((eid,rd.ResourceUsage.IndexBuffer))
expectedUsage.append((eid,rd.ResourceUsage.Indirect))
if eid > markerLooseEventsAfterIndirectDrawsDrawIndirectSingle and eid < markerDescriptorBuffer:
expectedUsage.append((eid,rd.ResourceUsage.Indirect))
expectedUsage += [(eid,rd.ResourceUsage.Clear) for eid in fillBufferEIDs
if eid > markerIndirect and eid < markerIndirectEnd]
expectedUsage += [(eid,rd.ResourceUsage.CS_RWResource) for eid in indirectEIDs if eid in dispatchEIDs]
expectedUsage += [(eid,rd.ResourceUsage.Indirect) for eid in indirectEIDs if eid in dispatchEIDs]
expectedUsage += [(eid,rd.ResourceUsage.Indirect) for eid in multiEIDs if not eid in indirectCountEIDs]
expectedUsage += [(eid,rd.ResourceUsage.Indirect) for eid in indirectCountEIDs]
expectedUsage += [(eid,rd.ResourceUsage.Indirect) for eid in indirectCountEIDs]
expectedUsage += [(eid,rd.ResourceUsage.IndexBuffer) for eid in indexedSpecialEIDs if not eid in indirectCountEIDs]
expectedUsage += [(eid,rd.ResourceUsage.Indirect) for eid in indexedSpecialEIDs if not eid in indirectCountEIDs]
expectedUsage += [(eid,rd.ResourceUsage.Indirect) for eid in cmdMeshDispatchIndirectEIDs if not eid in multiEIDs]
for eid in endRenderPassEIDs:
if eid > markerLooseEventsAfterIndirectDraws:
expectedUsage.append((eid+2,rd.ResourceUsage.Barrier))
break
for eid in dispatchEIDs:
if nestedSecondaries and eid > markerNestedSecondaryCommandBufferDispatch:
expectedUsage.append((eid + 1,rd.ResourceUsage.Barrier))
break
if res.name == "Barrier Buffer":
expectedUsage = [(243+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier),
(251+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier),
(259+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier),
(267+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier),
(275+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier),
(283+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier),
(291+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier),
(299+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier),
(307+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier),
(315+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier)]
expectedUsage += [(eid,rd.ResourceUsage.Barrier)
for eid in range(markerMultipleCommandBufferSubmits + 1, markerMultipleCommandBufferSubmits + 1 + 10*8, 8)]
if res.name == "Barrier2 Buffer":
expectedUsage = [(323+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier),
(328+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier),
(333+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier),
(338+countDrawIndirectCount+countNested+countDescBuffer+countMeshShader,rd.ResourceUsage.Barrier)]
expectedUsage += [(eid,rd.ResourceUsage.Barrier)
for eid in range(markerMultipleSecondaryCommandBufferExecutes + 3, markerMultipleSecondaryCommandBufferExecutes + 3 + 4*5, 5)]
if res.name == "Descriptor Buffer":
if descBuffer:
expectedUsage = [(235+countDrawIndirectCount,rd.ResourceUsage.Barrier),
(236+countDrawIndirectCount,rd.ResourceUsage.CopySrc),
(237+countDrawIndirectCount,rd.ResourceUsage.Barrier),
(238+countDrawIndirectCount,rd.ResourceUsage.Clear),
(241+countDrawIndirectCount,rd.ResourceUsage.Barrier),
(242+countDrawIndirectCount,rd.ResourceUsage.CopyDst)]
first = True
for eid in copyBufferEIDs:
if eid > markerLooseEventsAfterIndirectDraws:
expectedUsage.append((eid-1,rd.ResourceUsage.Barrier))
if first:
expectedUsage.append((eid,rd.ResourceUsage.CopySrc))
first = False
else:
expectedUsage.append((eid,rd.ResourceUsage.CopyDst))
for eid in fillBufferEIDs:
if eid > markerLooseEventsAfterIndirectDraws:
expectedUsage.append((eid-1,rd.ResourceUsage.Barrier))
expectedUsage.append((eid,rd.ResourceUsage.Clear))
break
if res.name == "Descriptor Backup Buffer":
if descBuffer:
expectedUsage = [(235+countDrawIndirectCount,rd.ResourceUsage.Barrier),
(236+countDrawIndirectCount,rd.ResourceUsage.CopyDst),
(241+countDrawIndirectCount,rd.ResourceUsage.Barrier),
(242+countDrawIndirectCount,rd.ResourceUsage.CopySrc)]
first = True
for eid in copyBufferEIDs:
if eid > markerLooseEventsAfterIndirectDraws:
expectedUsage.append((eid-1,rd.ResourceUsage.Barrier))
if first:
expectedUsage.append((eid,rd.ResourceUsage.CopyDst))
first = False
else:
expectedUsage.append((eid,rd.ResourceUsage.CopySrc))
break
elif res.type == rd.ResourceType.Texture:
if res.name == "Offscreen MSAA Image":
expectedUsage = [(11,rd.ResourceUsage.Barrier),
(11,rd.ResourceUsage.Discard),
(12,rd.ResourceUsage.Clear)]
expectedUsage = [(self.markerStart + 6,rd.ResourceUsage.Barrier),
(self.markerStart + 6,rd.ResourceUsage.Discard),
(self.markerStart + 7,rd.ResourceUsage.Clear)]
if res.name == "Offscreen Image":
expectedUsage = [(9,rd.ResourceUsage.Barrier),
(9,rd.ResourceUsage.Discard),
(10,rd.ResourceUsage.Clear)]
for eid in descSetDrawEIDs:
expectedUsage.append((eid,rd.ResourceUsage.PS_Resource))
for eid in descBufferDrawEIDs:
expectedUsage.append((eid,rd.ResourceUsage.PS_Resource))
expectedUsage = [(self.markerStart + 4,rd.ResourceUsage.Barrier),
(self.markerStart + 4,rd.ResourceUsage.Discard),
(self.markerStart + 5,rd.ResourceUsage.Clear)]
expectedUsage += [(eid,rd.ResourceUsage.PS_Resource) for eid in descSetDrawEIDs]
expectedUsage += [(eid,rd.ResourceUsage.PS_Resource) for eid in descBufferDrawEIDs]
elif res.type == rd.ResourceType.CommandBuffer:
expectedUsage = [(0,rd.ResourceUsage.Unused)]
elif res.type == rd.ResourceType.DescriptorStore:
@@ -322,7 +375,6 @@ class VK_Resource_Usage(rdtest.TestCase):
expectedUsage = [(0,rd.ResourceUsage.Unused)]
else:
raise rdtest.TestFailureException(f"'{res.name}' {res.resourceId} Unexpected resource type {res.type.name}")
rdtest.log.print(f"Resource '{res.name}' type:{res.type.name} {res.resourceId} usages:{len(self.resourceUsages[res.resourceId])} expectedUsages:{len(expectedUsage)}")
expectedUsage.sort(key=lambda x: x[0])
self.check_resource_usage(res, expectedUsage)