diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 9237ceac9..44b4d9065 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -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); } } diff --git a/renderdoc/driver/vulkan/vk_state.cpp b/renderdoc/driver/vulkan/vk_state.cpp index c5f01efdd..651e04f20 100644 --- a/renderdoc/driver/vulkan/vk_state.cpp +++ b/renderdoc/driver/vulkan/vk_state.cpp @@ -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(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(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(xfbbuffers[i].buf)), - &xfbbuffers[i].offs, &xfbbuffers[i].size); - } - - if(!xfbcounters.empty()) - { - std::vector buffers; - std::vector offsets; - - for(size_t i = 0; i < xfbcounters.size(); i++) - { - buffers.push_back(Unwrap(GetResourceManager()->GetCurrentHandle(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(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(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(xfbbuffers[i].buf)), + &xfbbuffers[i].offs, &xfbbuffers[i].size); + } + + if(!xfbcounters.empty()) + { + std::vector buffers; + std::vector offsets; + + for(size_t i = 0; i < xfbcounters.size(); i++) + { + buffers.push_back( + Unwrap(GetResourceManager()->GetCurrentHandle(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)