From cd8e6b7bde11e6fff09175a408f45759ca2ad7a5 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 26 Jun 2024 11:13:00 +0100 Subject: [PATCH] Fix state handling for new pipeline bind point --- renderdoc/driver/vulkan/vk_core.cpp | 2 + renderdoc/driver/vulkan/vk_state.cpp | 33 +++++++++--- renderdoc/driver/vulkan/vk_state.h | 14 ++++- .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 52 ++++++++----------- 4 files changed, 62 insertions(+), 39 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 6d5f15180..7bde52948 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -4407,6 +4407,8 @@ void WrappedVulkan::ReplayLog(uint32_t startEventID, uint32_t endEventID, Replay if(m_RenderState.compute.pipeline != ResourceId()) m_RenderState.BindPipeline(this, cmd, VulkanRenderState::BindCompute, false); + if(m_RenderState.rt.pipeline != ResourceId()) + m_RenderState.BindPipeline(this, cmd, VulkanRenderState::BindRT, false); if(m_RenderState.graphics.pipeline != ResourceId()) m_RenderState.BindPipeline(this, cmd, VulkanRenderState::BindGraphics, false); } diff --git a/renderdoc/driver/vulkan/vk_state.cpp b/renderdoc/driver/vulkan/vk_state.cpp index aab03e2d8..2a2c841b4 100644 --- a/renderdoc/driver/vulkan/vk_state.cpp +++ b/renderdoc/driver/vulkan/vk_state.cpp @@ -375,6 +375,31 @@ void VulkanRenderState::BindPipeline(WrappedVulkan *vk, VkCommandBuffer cmd, BindDescriptorSetsWithoutPipeline(vk, cmd, compute, VK_PIPELINE_BIND_POINT_COMPUTE); } } + + if(binding == BindRT || binding == BindInitial) + { + if(rt.pipeline != ResourceId()) + { + ObjDisp(cmd)->CmdBindPipeline( + Unwrap(cmd), VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, + Unwrap(vk->GetResourceManager()->GetCurrentHandle(rt.pipeline))); + + ResourceId pipeLayoutId = vk->GetDebugManager()->GetPipelineInfo(rt.pipeline).compLayout; + VkPipelineLayout layout = + vk->GetResourceManager()->GetCurrentHandle(pipeLayoutId); + + const rdcarray &pushRanges = + vk->GetDebugManager()->GetPipelineLayoutInfo(pipeLayoutId).pushRanges; + + // only set push constant ranges that the layout uses + for(size_t i = 0; i < pushRanges.size(); i++) + ObjDisp(cmd)->CmdPushConstants(Unwrap(cmd), Unwrap(layout), pushRanges[i].stageFlags, + pushRanges[i].offset, pushRanges[i].size, + pushconsts + pushRanges[i].offset); + + BindDescriptorSetsForPipeline(vk, cmd, rt, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR); + } + } } void VulkanRenderState::BindShaderObjects(WrappedVulkan *vk, VkCommandBuffer cmd, @@ -1025,12 +1050,8 @@ void VulkanRenderState::BindDescriptorSet(WrappedVulkan *vk, const DescSetLayout VkCommandBuffer cmd, VkPipelineBindPoint bindPoint, uint32_t setIndex, uint32_t *dynamicOffsets) { - ResourceId descSet = (bindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) - ? graphics.descSets[setIndex].descSet - : compute.descSets[setIndex].descSet; - ResourceId pipeLayout = (bindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) - ? graphics.descSets[setIndex].pipeLayout - : compute.descSets[setIndex].pipeLayout; + ResourceId descSet = GetPipeline(bindPoint).descSets[setIndex].descSet; + ResourceId pipeLayout = GetPipeline(bindPoint).descSets[setIndex].pipeLayout; VkPipelineLayout layout = vk->GetResourceManager()->GetCurrentHandle(pipeLayout); if((descLayout.flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR) == 0) diff --git a/renderdoc/driver/vulkan/vk_state.h b/renderdoc/driver/vulkan/vk_state.h index 417099999..b8417b640 100644 --- a/renderdoc/driver/vulkan/vk_state.h +++ b/renderdoc/driver/vulkan/vk_state.h @@ -58,7 +58,8 @@ struct VulkanRenderState BindNone = 0x0, BindGraphics = 0x1, BindCompute = 0x2, - BindInitial = 0x4, + BindRT = 0x4, + BindInitial = 0x8, }; VulkanRenderState(); @@ -163,7 +164,16 @@ struct VulkanRenderState bool ActiveRenderPass() const { return renderPass != ResourceId() || dynamicRendering.active; } VkRect2D renderArea = {}; - VulkanStatePipeline compute, graphics; + VulkanStatePipeline compute, graphics, rt; + + VulkanStatePipeline &GetPipeline(VkPipelineBindPoint pipelineBindPoint) + { + if(pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) + return graphics; + else if(pipelineBindPoint == VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) + return rt; + return compute; + } struct IdxBuffer { diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 4de0bbb25..bfdbf7ffd 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -3103,6 +3103,10 @@ bool WrappedVulkan::Serialise_vkCmdBindPipeline(SerialiserType &ser, VkCommandBu // disturb compute shader bound via vkCmdBindShadersEXT, if any renderstate.shaderObjects[(uint32_t)ShaderStage::Compute] = ResourceId(); } + else if(pipelineBindPoint == VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) + { + renderstate.rt.pipeline = liveid; + } else { renderstate.graphics.pipeline = liveid; @@ -3433,6 +3437,11 @@ bool WrappedVulkan::Serialise_vkCmdBindPipeline(SerialiserType &ser, VkCommandBu m_BakedCmdBufferInfo[m_LastCmdBufferID].state.compute.pipeline = liveid; m_BakedCmdBufferInfo[m_LastCmdBufferID].state.compute.shaderObject = false; } + else if(pipelineBindPoint == VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) + { + m_BakedCmdBufferInfo[m_LastCmdBufferID].state.rt.pipeline = liveid; + m_BakedCmdBufferInfo[m_LastCmdBufferID].state.rt.shaderObject = false; + } else { m_BakedCmdBufferInfo[m_LastCmdBufferID].state.graphics.pipeline = liveid; @@ -3515,18 +3524,14 @@ bool WrappedVulkan::Serialise_vkCmdBindDescriptorSets( { VulkanRenderState &renderstate = GetCmdRenderState(); - rdcarray &descsets = - (pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) ? renderstate.graphics.descSets - : renderstate.compute.descSets; + VulkanStatePipeline &pipeline = renderstate.GetPipeline(pipelineBindPoint); + rdcarray &descsets = pipeline.descSets; // expand as necessary if(descsets.size() < firstSet + setCount) descsets.resize(firstSet + setCount); - if(pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) - renderstate.graphics.lastBoundSet = firstSet; - else - renderstate.compute.lastBoundSet = firstSet; + pipeline.lastBoundSet = firstSet; const rdcarray &descSetLayouts = m_CreationInfo.m_PipelineLayout[GetResID(layout)].descSetLayouts; @@ -3558,9 +3563,7 @@ bool WrappedVulkan::Serialise_vkCmdBindDescriptorSets( { // track while reading, as we need to track resource usage rdcarray &descsets = - (pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) - ? m_BakedCmdBufferInfo[m_LastCmdBufferID].state.graphics.descSets - : m_BakedCmdBufferInfo[m_LastCmdBufferID].state.compute.descSets; + m_BakedCmdBufferInfo[m_LastCmdBufferID].state.GetPipeline(pipelineBindPoint).descSets; // expand as necessary if(descsets.size() < firstSet + setCount) @@ -5477,18 +5480,14 @@ bool WrappedVulkan::Serialise_vkCmdPushDescriptorSetKHR(SerialiserType &ser, { VulkanRenderState &renderstate = GetCmdRenderState(); - rdcarray &descsets = - (pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) ? renderstate.graphics.descSets - : renderstate.compute.descSets; + VulkanStatePipeline &pipeline = renderstate.GetPipeline(pipelineBindPoint); + rdcarray &descsets = pipeline.descSets; // expand as necessary if(descsets.size() < set + 1) descsets.resize(set + 1); - if(pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) - renderstate.graphics.lastBoundSet = set; - else - renderstate.compute.lastBoundSet = set; + pipeline.lastBoundSet = set; descsets[set].pipeLayout = GetResID(layout); descsets[set].descSet = setId; @@ -5505,9 +5504,7 @@ bool WrappedVulkan::Serialise_vkCmdPushDescriptorSetKHR(SerialiserType &ser, { // track while reading, as we need to track resource usage rdcarray &descsets = - (pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) - ? m_BakedCmdBufferInfo[m_LastCmdBufferID].state.graphics.descSets - : m_BakedCmdBufferInfo[m_LastCmdBufferID].state.compute.descSets; + m_BakedCmdBufferInfo[m_LastCmdBufferID].state.GetPipeline(pipelineBindPoint).descSets; // expand as necessary if(descsets.size() < set + 1) @@ -5767,18 +5764,14 @@ bool WrappedVulkan::Serialise_vkCmdPushDescriptorSetWithTemplateKHR( { VulkanRenderState &renderstate = GetCmdRenderState(); - rdcarray &descsets = - (bindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) ? renderstate.graphics.descSets - : renderstate.compute.descSets; + VulkanStatePipeline &pipeline = renderstate.GetPipeline(bindPoint); + rdcarray &descsets = pipeline.descSets; // expand as necessary if(descsets.size() < set + 1) descsets.resize(set + 1); - if(bindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) - renderstate.graphics.lastBoundSet = set; - else - renderstate.compute.lastBoundSet = set; + pipeline.lastBoundSet = set; descsets[set].pipeLayout = GetResID(layout); descsets[set].descSet = setId; @@ -5795,10 +5788,7 @@ bool WrappedVulkan::Serialise_vkCmdPushDescriptorSetWithTemplateKHR( { // track while reading, as we need to track resource usage rdcarray &descsets = - (m_CreationInfo.m_DescUpdateTemplate[GetResID(descriptorUpdateTemplate)].bindPoint == - VK_PIPELINE_BIND_POINT_GRAPHICS) - ? m_BakedCmdBufferInfo[m_LastCmdBufferID].state.graphics.descSets - : m_BakedCmdBufferInfo[m_LastCmdBufferID].state.compute.descSets; + m_BakedCmdBufferInfo[m_LastCmdBufferID].state.GetPipeline(bindPoint).descSets; // expand as necessary if(descsets.size() < set + 1)