From 64aa2990904faba042dae3a2e615b4c767b6a144 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 6 Nov 2015 20:18:15 +0100 Subject: [PATCH] Store subpasses in creation info, use to fetch active attachments --- renderdoc/driver/vulkan/vk_debug.cpp | 1 + renderdoc/driver/vulkan/vk_info.cpp | 27 +++++----- renderdoc/driver/vulkan/vk_info.h | 10 ++-- renderdoc/driver/vulkan/vk_replay.cpp | 6 +-- .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 52 +++++++++++++------ 5 files changed, 63 insertions(+), 33 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index ed53e4894..cc3ca4a70 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -1798,6 +1798,7 @@ ResourceId VulkanDebugManager::RenderOverlay(ResourceId texid, TextureDisplayOve // modify state m_pDriver->m_PartialReplayData.state.renderPass = GetResID(m_OverlayNoDepthRP); + m_pDriver->m_PartialReplayData.state.subpass = 0; m_pDriver->m_PartialReplayData.state.framebuffer = GetResID(m_OverlayNoDepthFB); m_pDriver->m_PartialReplayData.state.graphics.pipeline = GetResID(pipe); diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index 85624ddc7..9231e1dee 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -253,20 +253,23 @@ void VulkanCreationInfo::RenderPass::Init(VulkanResourceManager *resourceMan, co attachments.push_back(a); } - // VKTODOMED figure out how subpasses work - RDCASSERT(pCreateInfo->subpassCount > 0); - const VkSubpassDescription &subp = pCreateInfo->pSubpasses[0]; + subpasses.resize(pCreateInfo->subpassCount); + for(uint32_t i=0; i < pCreateInfo->subpassCount; i++) + { + const VkSubpassDescription &subp = pCreateInfo->pSubpasses[i]; + Subpass &s = subpasses[i]; - inputAttachments.resize(subp.inputCount); - for(uint32_t i=0; i < subp.inputCount; i++) - inputAttachments[i] = subp.pInputAttachments[i].attachment; + s.inputAttachments.resize(subp.inputCount); + for(uint32_t i=0; i < subp.inputCount; i++) + s.inputAttachments[i] = subp.pInputAttachments[i].attachment; - colorAttachments.resize(subp.colorCount); - for(uint32_t i=0; i < subp.colorCount; i++) - colorAttachments[i] = subp.pColorAttachments[i].attachment; - - depthstencilAttachment = (subp.depthStencilAttachment.attachment != VK_ATTACHMENT_UNUSED - ? (int32_t)subp.depthStencilAttachment.attachment : -1); + s.colorAttachments.resize(subp.colorCount); + for(uint32_t i=0; i < subp.colorCount; i++) + s.colorAttachments[i] = subp.pColorAttachments[i].attachment; + + s.depthstencilAttachment = (subp.depthStencilAttachment.attachment != VK_ATTACHMENT_UNUSED + ? (int32_t)subp.depthStencilAttachment.attachment : -1); + } } void VulkanCreationInfo::Framebuffer::Init(VulkanResourceManager *resourceMan, const VkFramebufferCreateInfo* pCreateInfo) diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index 69420c3b6..d86926041 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -181,9 +181,13 @@ struct VulkanCreationInfo }; vector attachments; - vector inputAttachments; - vector colorAttachments; - int32_t depthstencilAttachment; + struct Subpass + { + vector inputAttachments; + vector colorAttachments; + int32_t depthstencilAttachment; + }; + vector subpasses; VkRenderPass loadRP; }; diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 738d5ac6e..9ba9494a3 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -1660,9 +1660,9 @@ void VulkanReplay::SavePipelineState() // Renderpass m_VulkanPipelineState.Pass.renderpass.obj = rm->GetOriginalID(state.renderPass); - m_VulkanPipelineState.Pass.renderpass.inputAttachments = c.m_RenderPass[state.renderPass].inputAttachments; - m_VulkanPipelineState.Pass.renderpass.colorAttachments = c.m_RenderPass[state.renderPass].colorAttachments; - m_VulkanPipelineState.Pass.renderpass.depthstencilAttachment = c.m_RenderPass[state.renderPass].depthstencilAttachment; + m_VulkanPipelineState.Pass.renderpass.inputAttachments = c.m_RenderPass[state.renderPass].subpasses[state.subpass].inputAttachments; + m_VulkanPipelineState.Pass.renderpass.colorAttachments = c.m_RenderPass[state.renderPass].subpasses[state.subpass].colorAttachments; + m_VulkanPipelineState.Pass.renderpass.depthstencilAttachment = c.m_RenderPass[state.renderPass].subpasses[state.subpass].depthstencilAttachment; m_VulkanPipelineState.Pass.framebuffer.obj = rm->GetOriginalID(state.framebuffer); diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index d566d8879..38a9362d6 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -584,11 +584,22 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass( if(atts[i].loadOp != atts[0].loadOp) allsame = allsameexceptstencil = false; - if(info.depthstencilAttachment != -1 && allsame && atts.size() > 1) - { - size_t o = (info.depthstencilAttachment == 0) ? 1 : 0; + int32_t dsAttach = -1; - if(atts[info.depthstencilAttachment].stencilLoadOp != atts[o].loadOp) + for(size_t i=0; i < info.subpasses.size(); i++) + { + if(info.subpasses[i].depthstencilAttachment != -1) + { + dsAttach = info.subpasses[i].depthstencilAttachment; + break; + } + } + + if(dsAttach != -1 && allsame && atts.size() > 1) + { + size_t o = (dsAttach == 0) ? 1 : 0; + + if(atts[dsAttach].stencilLoadOp != atts[o].loadOp) allsame = false; } @@ -610,13 +621,13 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass( if(atts[0].loadOp == VK_ATTACHMENT_LOAD_OP_DONT_CARE) loadDesc = "Don't Care"; - if(info.depthstencilAttachment >= 0 && info.depthstencilAttachment < atts.size()) + if(dsAttach >= 0 && dsAttach < atts.size()) { - if(atts[info.depthstencilAttachment].stencilLoadOp == VK_ATTACHMENT_LOAD_OP_CLEAR) + if(atts[dsAttach].stencilLoadOp == VK_ATTACHMENT_LOAD_OP_CLEAR) loadDesc += ", Stencil=Clear"; - if(atts[info.depthstencilAttachment].stencilLoadOp == VK_ATTACHMENT_LOAD_OP_LOAD) + if(atts[dsAttach].stencilLoadOp == VK_ATTACHMENT_LOAD_OP_LOAD) loadDesc += ", Stencil=Load"; - if(atts[info.depthstencilAttachment].stencilLoadOp == VK_ATTACHMENT_LOAD_OP_DONT_CARE) + if(atts[dsAttach].stencilLoadOp == VK_ATTACHMENT_LOAD_OP_DONT_CARE) loadDesc += ", Stencil=Don't Care"; } } @@ -844,11 +855,22 @@ bool WrappedVulkan::Serialise_vkCmdEndRenderPass( if(atts[i].storeOp != atts[0].storeOp) allsame = allsameexceptstencil = false; - if(info.depthstencilAttachment != -1 && allsame && atts.size() > 1) - { - size_t o = (info.depthstencilAttachment == 0) ? 1 : 0; + int32_t dsAttach = -1; - if(atts[info.depthstencilAttachment].stencilStoreOp != atts[o].storeOp) + for(size_t i=0; i < info.subpasses.size(); i++) + { + if(info.subpasses[i].depthstencilAttachment != -1) + { + dsAttach = info.subpasses[i].depthstencilAttachment; + break; + } + } + + if(dsAttach != -1 && allsame && atts.size() > 1) + { + size_t o = (dsAttach == 0) ? 1 : 0; + + if(atts[dsAttach].stencilStoreOp != atts[o].storeOp) allsameexceptstencil = false; } @@ -866,11 +888,11 @@ bool WrappedVulkan::Serialise_vkCmdEndRenderPass( if(atts[0].storeOp == VK_ATTACHMENT_STORE_OP_DONT_CARE) storeDesc = "Don't Care"; - if(info.depthstencilAttachment >= 0 && info.depthstencilAttachment < atts.size()) + if(dsAttach >= 0 && dsAttach < atts.size()) { - if(atts[info.depthstencilAttachment].stencilStoreOp == VK_ATTACHMENT_STORE_OP_STORE) + if(atts[dsAttach].stencilStoreOp == VK_ATTACHMENT_STORE_OP_STORE) storeDesc += ", Stencil=Store"; - if(atts[info.depthstencilAttachment].stencilStoreOp == VK_ATTACHMENT_STORE_OP_DONT_CARE) + if(atts[dsAttach].stencilStoreOp == VK_ATTACHMENT_STORE_OP_DONT_CARE) storeDesc += ", Stencil=Don't Care"; } }