mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-24 15:36:33 +00:00
Fix state handling for new pipeline bind point
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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<VkPipeline>(rt.pipeline)));
|
||||
|
||||
ResourceId pipeLayoutId = vk->GetDebugManager()->GetPipelineInfo(rt.pipeline).compLayout;
|
||||
VkPipelineLayout layout =
|
||||
vk->GetResourceManager()->GetCurrentHandle<VkPipelineLayout>(pipeLayoutId);
|
||||
|
||||
const rdcarray<VkPushConstantRange> &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<VkPipelineLayout>(pipeLayout);
|
||||
|
||||
if((descLayout.flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR) == 0)
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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<VulkanStatePipeline::DescriptorAndOffsets> &descsets =
|
||||
(pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) ? renderstate.graphics.descSets
|
||||
: renderstate.compute.descSets;
|
||||
VulkanStatePipeline &pipeline = renderstate.GetPipeline(pipelineBindPoint);
|
||||
rdcarray<VulkanStatePipeline::DescriptorAndOffsets> &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<ResourceId> &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<VulkanStatePipeline::DescriptorAndOffsets> &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<VulkanStatePipeline::DescriptorAndOffsets> &descsets =
|
||||
(pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) ? renderstate.graphics.descSets
|
||||
: renderstate.compute.descSets;
|
||||
VulkanStatePipeline &pipeline = renderstate.GetPipeline(pipelineBindPoint);
|
||||
rdcarray<VulkanStatePipeline::DescriptorAndOffsets> &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<VulkanStatePipeline::DescriptorAndOffsets> &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<VulkanStatePipeline::DescriptorAndOffsets> &descsets =
|
||||
(bindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) ? renderstate.graphics.descSets
|
||||
: renderstate.compute.descSets;
|
||||
VulkanStatePipeline &pipeline = renderstate.GetPipeline(bindPoint);
|
||||
rdcarray<VulkanStatePipeline::DescriptorAndOffsets> &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<VulkanStatePipeline::DescriptorAndOffsets> &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)
|
||||
|
||||
Reference in New Issue
Block a user