From bf6fe56c5b9fd28f6d864c490320e8166b7b0372 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Tue, 3 Nov 2026 08:08:09 +0000 Subject: [PATCH] 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 --- util/test/demos/vk/vk_resource_usage.cpp | 82 +++-- util/test/tests/Vulkan/VK_Resource_Usage.py | 312 ++++++++++++-------- 2 files changed, 241 insertions(+), 153 deletions(-) diff --git a/util/test/demos/vk/vk_resource_usage.cpp b/util/test/demos/vk/vk_resource_usage.cpp index 524fc25d1..b9b492ad4 100644 --- a/util/test/demos/vk/vk_resource_usage.cpp +++ b/util/test/demos/vk/vk_resource_usage.cpp @@ -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 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 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 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 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(); } diff --git a/util/test/tests/Vulkan/VK_Resource_Usage.py b/util/test/tests/Vulkan/VK_Resource_Usage.py index 9f4144c1b..f1ca704d5 100644 --- a/util/test/tests/Vulkan/VK_Resource_Usage.py +++ b/util/test/tests/Vulkan/VK_Resource_Usage.py @@ -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)