diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index dabd72aa1..2be9cf38b 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -211,6 +211,7 @@ VulkanDebugManager::VulkanDebugManager(WrappedVulkan *driver, VkDevice dev) m_TexDisplayNextSet = 0; m_TexDisplayPipeline = VK_NULL_HANDLE; m_TexDisplayBlendPipeline = VK_NULL_HANDLE; + m_TexDisplayF32Pipeline = VK_NULL_HANDLE; RDCEraseEl(m_TexDisplayUBO); m_TextDescSetLayout = VK_NULL_HANDLE; @@ -502,6 +503,43 @@ VulkanDebugManager::VulkanDebugManager(WrappedVulkan *driver, VkDevice dev) VKMGR()->WrapResource(Unwrap(dev), shader[i]); } + VkRenderPass RGBA32RP, RGBA8RP; // compatible render passes for creating pipelines, either RGBA F32 or RGBA8 + + { + VkAttachmentDescription attDesc = { + VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION, NULL, + VK_FORMAT_R8G8B8A8_UNORM, 1, + VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, + VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL + }; + + VkAttachmentReference attRef = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL }; + + VkSubpassDescription sub = { + VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION, NULL, + VK_PIPELINE_BIND_POINT_GRAPHICS, 0, + 0, NULL, // inputs + 1, &attRef, // color + NULL, // resolve + { VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_UNDEFINED }, // depth-stencil + 0, NULL, // preserve + }; + + VkRenderPassCreateInfo rpinfo = { + VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, NULL, + 1, &attDesc, + 1, &sub, + 0, NULL, // dependencies + }; + + vt->CreateRenderPass(Unwrap(dev), &rpinfo, &RGBA8RP); + + attDesc.format = VK_FORMAT_R32G32B32A32_SFLOAT; + + vt->CreateRenderPass(Unwrap(dev), &rpinfo, &RGBA32RP); + } + VkPipelineShaderStageCreateInfo stages[2] = { { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, NULL, VK_SHADER_STAGE_VERTEX, VK_NULL_HANDLE, NULL }, { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, NULL, VK_SHADER_STAGE_FRAGMENT, VK_NULL_HANDLE, NULL }, @@ -574,7 +612,7 @@ VulkanDebugManager::VulkanDebugManager(WrappedVulkan *driver, VkDevice dev) &dyn, 0, // flags Unwrap(m_CheckerboardPipeLayout), - VK_NULL_HANDLE, // render pass + RGBA8RP, 0, // sub pass VK_NULL_HANDLE, // base pipeline handle 0, // base pipeline index @@ -598,6 +636,15 @@ VulkanDebugManager::VulkanDebugManager(WrappedVulkan *driver, VkDevice dev) VKMGR()->WrapResource(Unwrap(dev), m_TexDisplayPipeline); + pipeInfo.renderPass = RGBA32RP; + + vkr = vt->CreateGraphicsPipelines(Unwrap(dev), VK_NULL_HANDLE, 1, &pipeInfo, &m_TexDisplayF32Pipeline); + RDCASSERT(vkr == VK_SUCCESS); + + VKMGR()->WrapResource(Unwrap(dev), m_TexDisplayF32Pipeline); + + pipeInfo.renderPass = RGBA8RP; + attState.blendEnable = true; attState.srcBlendColor = VK_BLEND_SRC_ALPHA; attState.destBlendColor = VK_BLEND_ONE_MINUS_SRC_ALPHA; @@ -648,6 +695,9 @@ VulkanDebugManager::VulkanDebugManager(WrappedVulkan *driver, VkDevice dev) VKMGR()->WrapResource(Unwrap(dev), m_GenericPipeline); + vt->DestroyRenderPass(Unwrap(dev), RGBA32RP); + vt->DestroyRenderPass(Unwrap(dev), RGBA8RP); + for(size_t i=0; i < ARRAY_COUNT(module); i++) { vt->DestroyShader(Unwrap(dev), Unwrap(shader[i])); @@ -1039,6 +1089,12 @@ VulkanDebugManager::~VulkanDebugManager() VKMGR()->ReleaseWrappedResource(m_TexDisplayBlendPipeline); } + if(m_TexDisplayF32Pipeline != VK_NULL_HANDLE) + { + vt->DestroyPipeline(Unwrap(dev), Unwrap(m_TexDisplayF32Pipeline)); + VKMGR()->ReleaseWrappedResource(m_TexDisplayF32Pipeline); + } + m_CheckerboardUBO.Destroy(vt, dev); m_TexDisplayUBO.Destroy(vt, dev); diff --git a/renderdoc/driver/vulkan/vk_debug.h b/renderdoc/driver/vulkan/vk_debug.h index 5acd26044..bf8316f1b 100644 --- a/renderdoc/driver/vulkan/vk_debug.h +++ b/renderdoc/driver/vulkan/vk_debug.h @@ -95,7 +95,7 @@ class VulkanDebugManager VkPipelineLayout m_TexDisplayPipeLayout; VkDescriptorSet m_TexDisplayDescSet[16]; // ring buffered to allow multiple texture renders between flushes uint32_t m_TexDisplayNextSet; - VkPipeline m_TexDisplayPipeline, m_TexDisplayBlendPipeline; + VkPipeline m_TexDisplayPipeline, m_TexDisplayBlendPipeline, m_TexDisplayF32Pipeline; GPUBuffer m_TexDisplayUBO; VkDescriptorSet GetTexDisplayDescSet() diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 8bd96e18d..0cb0c1a5e 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -562,7 +562,7 @@ void VulkanReplay::PickPixel(ResourceId texture, uint32_t x, uint32_t y, uint32_ 1, &clearval, }; - RenderTextureInternal(texDisplay, rpbegin, false); + RenderTextureInternal(texDisplay, rpbegin, true); } VkDevice dev = m_pDriver->GetDev(); @@ -660,10 +660,10 @@ bool VulkanReplay::RenderTexture(TextureDisplay cfg) 1, &clearval, }; - return RenderTextureInternal(cfg, rpbegin, true); + return RenderTextureInternal(cfg, rpbegin, false); } -bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginInfo rpbegin, bool blendAlpha) +bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginInfo rpbegin, bool f32render) { VkDevice dev = m_pDriver->GetDev(); VkCmdBuffer cmd = m_pDriver->GetNextCmd(); @@ -823,9 +823,13 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn { vt->CmdBeginRenderPass(Unwrap(cmd), &rpbegin, VK_RENDER_PASS_CONTENTS_INLINE); - bool doblend = !cfg.rawoutput && blendAlpha && cfg.CustomShader == ResourceId(); + VkPipeline pipe = GetDebugManager()->m_TexDisplayPipeline; + if(f32render) + pipe = GetDebugManager()->m_TexDisplayF32Pipeline; + else if(!cfg.rawoutput && cfg.CustomShader == ResourceId()) + pipe = GetDebugManager()->m_TexDisplayBlendPipeline; - vt->CmdBindPipeline(Unwrap(cmd), VK_PIPELINE_BIND_POINT_GRAPHICS, doblend ? Unwrap(GetDebugManager()->m_TexDisplayBlendPipeline) : Unwrap(GetDebugManager()->m_TexDisplayPipeline)); + vt->CmdBindPipeline(Unwrap(cmd), VK_PIPELINE_BIND_POINT_GRAPHICS, Unwrap(pipe)); vt->CmdBindDescriptorSets(Unwrap(cmd), VK_PIPELINE_BIND_POINT_GRAPHICS, Unwrap(GetDebugManager()->m_TexDisplayPipeLayout), 0, 1, UnwrapPtr(descset), 1, &uboOffs); VkViewport viewport = { 0.0f, 0.0f, (float)m_DebugWidth, (float)m_DebugHeight, 0.0f, 1.0f }; diff --git a/renderdoc/driver/vulkan/vk_replay.h b/renderdoc/driver/vulkan/vk_replay.h index 8242e6d62..84326f9cc 100644 --- a/renderdoc/driver/vulkan/vk_replay.h +++ b/renderdoc/driver/vulkan/vk_replay.h @@ -215,7 +215,7 @@ class VulkanReplay : public IReplayDriver WrappedVulkan *m_pDriver; - bool RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginInfo rpbegin, bool blendAlpha); + bool RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginInfo rpbegin, bool f32render); void FillCBufferVariables(rdctype::array, vector &outvars, const vector &data, size_t &offset);