Fix state handling for new pipeline bind point

This commit is contained in:
baldurk
2024-06-26 17:07:09 +01:00
parent 1b6e09430e
commit cd8e6b7bde
4 changed files with 62 additions and 39 deletions
+2
View File
@@ -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);
}
+27 -6
View File
@@ -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)
+12 -2
View File
@@ -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)