From 6c3997137452d5316061f723dccdf82ffec0ef37 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 1 Jun 2016 16:39:18 +0200 Subject: [PATCH] Add proper support for immutable samplers. Refs #260 --- renderdoc/api/replay/vk_pipestate.h | 4 +++- renderdoc/core/replay_proxy.cpp | 3 ++- renderdoc/driver/vulkan/vk_initstate.cpp | 4 +++- renderdoc/driver/vulkan/vk_replay.cpp | 5 +++++ .../driver/vulkan/wrappers/vk_descriptor_funcs.cpp | 13 +++++++++++++ renderdocui/Interop/VulkanPipelineState.cs | 1 + .../PipelineState/VulkanPipelineStateViewer.cs | 4 +++- 7 files changed, 30 insertions(+), 4 deletions(-) diff --git a/renderdoc/api/replay/vk_pipestate.h b/renderdoc/api/replay/vk_pipestate.h index 92275ebe2..9ab85a38a 100644 --- a/renderdoc/api/replay/vk_pipestate.h +++ b/renderdoc/api/replay/vk_pipestate.h @@ -46,7 +46,8 @@ struct VulkanPipelineState struct BindingElement { BindingElement() - : customSamplerName(false), + : immutableSampler(false), + customSamplerName(false), baseMip(0), baseLayer(0), offset(0), @@ -64,6 +65,7 @@ struct VulkanPipelineState ResourceId view; // bufferview, imageview, attachmentview ResourceId res; // buffer, image, attachment ResourceId sampler; + bool32 immutableSampler; rdctype::str SamplerName; bool32 customSamplerName; diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 7daa6125f..29755ea8c 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -732,6 +732,7 @@ void Serialiser::Serialise( Serialise("", el.view); Serialise("", el.res); Serialise("", el.sampler); + Serialise("", el.immutableSampler); Serialise("", el.SamplerName); Serialise("", el.customSamplerName); @@ -758,7 +759,7 @@ void Serialiser::Serialise( Serialise("", el.border); Serialise("", el.unnormalized); - SIZE_CHECK(VulkanPipelineState::Pipeline::DescriptorSet::DescriptorBinding::BindingElement, 240); + SIZE_CHECK(VulkanPipelineState::Pipeline::DescriptorSet::DescriptorBinding::BindingElement, 248); }; template <> diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index 300fee302..dba9871e7 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -1443,7 +1443,9 @@ bool WrappedVulkan::Serialise_InitialState(ResourceId resid, WrappedVkRes *) for(uint32_t d = 0; d < writes[i].descriptorCount; d++) { dstImage[d] = src[d].imageInfo; - valid &= (src[d].imageInfo.sampler != VK_NULL_HANDLE); + valid &= (src[d].imageInfo.sampler != VK_NULL_HANDLE) || + (layout.bindings[j].immutableSampler && + layout.bindings[j].immutableSampler[d] != ResourceId()); valid &= (src[d].imageInfo.imageView != VK_NULL_HANDLE); } writes[i].pImageInfo = dstImage; diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 14954f884..9a15f007a 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -3415,10 +3415,15 @@ void VulkanReplay::SavePipelineState() layoutBind.descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) { if(layoutBind.immutableSampler) + { dst.bindings[b].binds[a].sampler = layoutBind.immutableSampler[a]; + dst.bindings[b].binds[a].immutableSampler = true; + } else if(info[a].imageInfo.sampler != VK_NULL_HANDLE) + { dst.bindings[b].binds[a].sampler = rm->GetNonDispWrapper(info[a].imageInfo.sampler)->id; + } if(dst.bindings[b].binds[a].sampler != ResourceId()) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp index c8173846e..e672fb89f 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp @@ -199,6 +199,19 @@ VkResult WrappedVulkan::vkCreateDescriptorSetLayout(VkDevice device, record->descInfo = new DescriptorSetData(); record->descInfo->layout = new DescSetLayout(); record->descInfo->layout->Init(GetResourceManager(), m_CreationInfo, pCreateInfo); + + for(uint32_t i = 0; i < pCreateInfo->bindingCount; i++) + { + bool usesSampler = + pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER || + pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + + if(usesSampler && pCreateInfo->pBindings[i].pImmutableSamplers != NULL) + { + for(uint32_t d = 0; d < pCreateInfo->pBindings[i].descriptorCount; d++) + record->AddParent(GetRecord(pCreateInfo->pBindings[i].pImmutableSamplers[d])); + } + } } else { diff --git a/renderdocui/Interop/VulkanPipelineState.cs b/renderdocui/Interop/VulkanPipelineState.cs index 501d82358..e5357b335 100644 --- a/renderdocui/Interop/VulkanPipelineState.cs +++ b/renderdocui/Interop/VulkanPipelineState.cs @@ -55,6 +55,7 @@ namespace renderdoc public ResourceId view; public ResourceId res; public ResourceId sampler; + public bool immutableSampler; [CustomMarshalAs(CustomUnmanagedType.UTF8TemplatedString)] public string SamplerName; diff --git a/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs b/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs index eec4b418f..8888022cf 100644 --- a/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs @@ -308,7 +308,9 @@ namespace renderdocui.Windows.PipelineState lod += String.Format(" Bias {0}", descriptor.mipBias); return new object[] { - "", bindset, slotname, "Sampler", descriptor.SamplerName, + "", bindset, slotname, + descriptor.immutableSampler ? "Immutable Sampler" : "Sampler", + descriptor.SamplerName, addressing, filter, lod