mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-07-29 02:41:08 +00:00
When partially replaying a cmd buffer, rebind pipeline state correctly
* Even if we're not in a renderpass we still need to bind the graphics pipeline state
This commit is contained in:
@@ -3099,10 +3099,11 @@ void WrappedVulkan::ReplayLog(uint32_t startEventID, uint32_t endEventID, Replay
|
||||
m_RenderState.BeginRenderPassAndApplyState(
|
||||
cmd, rpUnneeded ? VulkanRenderState::BindNone : VulkanRenderState::BindGraphics);
|
||||
}
|
||||
else if(m_RenderState.compute.pipeline != ResourceId())
|
||||
else
|
||||
{
|
||||
// if we had a compute pipeline, need to bind that
|
||||
// even outside of render passes, we need to restore the state
|
||||
m_RenderState.BindPipeline(cmd, VulkanRenderState::BindCompute, false);
|
||||
m_RenderState.BindPipeline(cmd, VulkanRenderState::BindGraphics, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -112,48 +112,6 @@ void VulkanRenderState::BeginRenderPassAndApplyState(VkCommandBuffer cmd, Pipeli
|
||||
|
||||
BindPipeline(cmd, binding, true);
|
||||
|
||||
if(ibuffer.buf != ResourceId())
|
||||
ObjDisp(cmd)->CmdBindIndexBuffer(
|
||||
Unwrap(cmd), Unwrap(GetResourceManager()->GetCurrentHandle<VkBuffer>(ibuffer.buf)),
|
||||
ibuffer.offs, ibuffer.bytewidth == 4 ? VK_INDEX_TYPE_UINT32 : VK_INDEX_TYPE_UINT16);
|
||||
|
||||
for(size_t i = 0; i < vbuffers.size(); i++)
|
||||
{
|
||||
if(vbuffers[i].buf == ResourceId())
|
||||
continue;
|
||||
|
||||
ObjDisp(cmd)->CmdBindVertexBuffers(
|
||||
Unwrap(cmd), (uint32_t)i, 1,
|
||||
UnwrapPtr(GetResourceManager()->GetCurrentHandle<VkBuffer>(vbuffers[i].buf)),
|
||||
&vbuffers[i].offs);
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < xfbbuffers.size(); i++)
|
||||
{
|
||||
if(xfbbuffers[i].buf == ResourceId())
|
||||
continue;
|
||||
|
||||
ObjDisp(cmd)->CmdBindTransformFeedbackBuffersEXT(
|
||||
Unwrap(cmd), (uint32_t)i, 1,
|
||||
UnwrapPtr(GetResourceManager()->GetCurrentHandle<VkBuffer>(xfbbuffers[i].buf)),
|
||||
&xfbbuffers[i].offs, &xfbbuffers[i].size);
|
||||
}
|
||||
|
||||
if(!xfbcounters.empty())
|
||||
{
|
||||
std::vector<VkBuffer> buffers;
|
||||
std::vector<VkDeviceSize> offsets;
|
||||
|
||||
for(size_t i = 0; i < xfbcounters.size(); i++)
|
||||
{
|
||||
buffers.push_back(Unwrap(GetResourceManager()->GetCurrentHandle<VkBuffer>(xfbcounters[i].buf)));
|
||||
offsets.push_back(xfbcounters[i].offs);
|
||||
}
|
||||
|
||||
ObjDisp(cmd)->CmdBeginTransformFeedbackEXT(
|
||||
Unwrap(cmd), firstxfbcounter, (uint32_t)xfbcounters.size(), buffers.data(), offsets.data());
|
||||
}
|
||||
|
||||
if(IsConditionalRenderingEnabled())
|
||||
{
|
||||
VkConditionalRenderingBeginInfoEXT beginInfo;
|
||||
@@ -353,6 +311,49 @@ void VulkanRenderState::BindPipeline(VkCommandBuffer cmd, PipelineBinding bindin
|
||||
RDCWARN("Descriptor set is not bound but pipeline layout expects one");
|
||||
}
|
||||
}
|
||||
|
||||
if(ibuffer.buf != ResourceId())
|
||||
ObjDisp(cmd)->CmdBindIndexBuffer(
|
||||
Unwrap(cmd), Unwrap(GetResourceManager()->GetCurrentHandle<VkBuffer>(ibuffer.buf)),
|
||||
ibuffer.offs, ibuffer.bytewidth == 4 ? VK_INDEX_TYPE_UINT32 : VK_INDEX_TYPE_UINT16);
|
||||
|
||||
for(size_t i = 0; i < vbuffers.size(); i++)
|
||||
{
|
||||
if(vbuffers[i].buf == ResourceId())
|
||||
continue;
|
||||
|
||||
ObjDisp(cmd)->CmdBindVertexBuffers(
|
||||
Unwrap(cmd), (uint32_t)i, 1,
|
||||
UnwrapPtr(GetResourceManager()->GetCurrentHandle<VkBuffer>(vbuffers[i].buf)),
|
||||
&vbuffers[i].offs);
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < xfbbuffers.size(); i++)
|
||||
{
|
||||
if(xfbbuffers[i].buf == ResourceId())
|
||||
continue;
|
||||
|
||||
ObjDisp(cmd)->CmdBindTransformFeedbackBuffersEXT(
|
||||
Unwrap(cmd), (uint32_t)i, 1,
|
||||
UnwrapPtr(GetResourceManager()->GetCurrentHandle<VkBuffer>(xfbbuffers[i].buf)),
|
||||
&xfbbuffers[i].offs, &xfbbuffers[i].size);
|
||||
}
|
||||
|
||||
if(!xfbcounters.empty())
|
||||
{
|
||||
std::vector<VkBuffer> buffers;
|
||||
std::vector<VkDeviceSize> offsets;
|
||||
|
||||
for(size_t i = 0; i < xfbcounters.size(); i++)
|
||||
{
|
||||
buffers.push_back(
|
||||
Unwrap(GetResourceManager()->GetCurrentHandle<VkBuffer>(xfbcounters[i].buf)));
|
||||
offsets.push_back(xfbcounters[i].offs);
|
||||
}
|
||||
|
||||
ObjDisp(cmd)->CmdBeginTransformFeedbackEXT(
|
||||
Unwrap(cmd), firstxfbcounter, (uint32_t)xfbcounters.size(), buffers.data(), offsets.data());
|
||||
}
|
||||
}
|
||||
|
||||
if(compute.pipeline != ResourceId() && binding == BindCompute)
|
||||
|
||||
Reference in New Issue
Block a user