diff --git a/renderdoc/api/replay/vk_pipestate.h b/renderdoc/api/replay/vk_pipestate.h index 51ca363c4..e17d2a9ee 100644 --- a/renderdoc/api/replay/vk_pipestate.h +++ b/renderdoc/api/replay/vk_pipestate.h @@ -250,6 +250,7 @@ struct VulkanPipelineState struct Attachment { ResourceId view; + ResourceId img; // VKTODOLOW need layout here? }; rdctype::array attachments; diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index 2417bb738..8e6d322e8 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -157,6 +157,11 @@ void VulkanCreationInfo::Framebuffer::Init(const VkFramebufferCreateInfo* pCreat attachments[i].view = VKMGR()->GetNonDispWrapper(pCreateInfo->pAttachments[i].view)->id; } +void VulkanCreationInfo::AttachmentView::Init(const VkAttachmentViewCreateInfo* pCreateInfo) +{ + image = VKMGR()->GetNonDispWrapper(pCreateInfo->image)->id; +} + void VulkanCreationInfo::DescSetLayout::Init(const VkDescriptorSetLayoutCreateInfo* pCreateInfo) { bindings.resize(pCreateInfo->count); diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index cfe6b388e..500cfccfe 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -166,6 +166,14 @@ struct VulkanCreationInfo }; map m_Framebuffer; + struct AttachmentView + { + void Init(const VkAttachmentViewCreateInfo* pCreateInfo); + + ResourceId image; + }; + map m_AttachmentView; + struct DescSetLayout { void Init(const VkDescriptorSetLayoutCreateInfo* pCreateInfo); diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 898d56c41..008c92c1b 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -1205,18 +1205,6 @@ void VulkanReplay::SavePipelineState() { VULKANNOTIMP("SavePipelineState"); - { - create_array_uninit(m_D3D11PipelineState.m_OM.RenderTargets, 1); - - ResourceId id; - VkImage fakeBBIm = VK_NULL_HANDLE; - VkExtent3D fakeBBext; - ResourceFormat fakeBBfmt; - m_pDriver->GetFakeBB(id, fakeBBIm, fakeBBext, fakeBBfmt); - - m_D3D11PipelineState.m_OM.RenderTargets[0].Resource = id; - } - { const WrappedVulkan::PartialReplayData::StateVector &state = m_pDriver->m_PartialReplayData.state; VulkanCreationInfo &c = m_pDriver->m_CreationInfo; @@ -1480,8 +1468,10 @@ void VulkanReplay::SavePipelineState() create_array_uninit(m_VulkanPipelineState.Pass.framebuffer.attachments, c.m_Framebuffer[state.framebuffer].attachments.size()); for(size_t i=0; i < c.m_Framebuffer[state.framebuffer].attachments.size(); i++) { - m_VulkanPipelineState.Pass.framebuffer.attachments[i].view = - c.m_Framebuffer[state.framebuffer].attachments[i].view; + ResourceId viewid = rm->GetOriginalID(c.m_Framebuffer[state.framebuffer].attachments[i].view); + + m_VulkanPipelineState.Pass.framebuffer.attachments[i].view = viewid; + m_VulkanPipelineState.Pass.framebuffer.attachments[i].img = rm->GetOriginalID(c.m_AttachmentView[viewid].image); } m_VulkanPipelineState.Pass.renderArea.x = state.renderArea.offset.x; @@ -1490,6 +1480,21 @@ void VulkanReplay::SavePipelineState() m_VulkanPipelineState.Pass.renderArea.height = state.renderArea.extent.height; } } + + { + create_array_uninit(m_D3D11PipelineState.m_OM.RenderTargets, 1); + + ResourceId id; + VkImage fakeBBIm = VK_NULL_HANDLE; + VkExtent3D fakeBBext; + ResourceFormat fakeBBfmt; + m_pDriver->GetFakeBB(id, fakeBBIm, fakeBBext, fakeBBfmt); + + if(m_VulkanPipelineState.Pass.framebuffer.attachments.count > 0 && m_VulkanPipelineState.Pass.framebuffer.attachments[0].img != ResourceId()) + id = m_VulkanPipelineState.Pass.framebuffer.attachments[0].img; + + m_D3D11PipelineState.m_OM.RenderTargets[0].Resource = id; + } } void VulkanReplay::FillCBufferVariables(ResourceId shader, uint32_t cbufSlot, vector &outvars, const vector &data) diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index 8804750bf..886d385e4 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -807,6 +807,9 @@ bool WrappedVulkan::Serialise_vkCreateAttachmentView( device = GetResourceManager()->GetLiveHandle(devId); VkAttachmentView view = VK_NULL_HANDLE; + // use original ID + m_CreationInfo.m_AttachmentView[id].Init(&info); + VkResult ret = ObjDisp(device)->CreateAttachmentView(Unwrap(device), &info, &view); if(ret != VK_SUCCESS)