diff --git a/renderdoc/api/replay/vk_pipestate.h b/renderdoc/api/replay/vk_pipestate.h index 2b76b8031..2612d5916 100644 --- a/renderdoc/api/replay/vk_pipestate.h +++ b/renderdoc/api/replay/vk_pipestate.h @@ -79,6 +79,8 @@ struct VulkanPipelineState TextureSwizzle swizzle[4]; uint32_t baseMip; uint32_t baseLayer; + uint32_t numMip; + uint32_t numLayer; // buffers uint64_t offset; @@ -318,7 +320,7 @@ struct VulkanPipelineState struct Attachment { - Attachment() : baseMip(0), baseLayer(0) + Attachment() : baseMip(0), baseLayer(0), numMip(1), numLayer(1) { swizzle[0] = eSwizzle_Red; swizzle[1] = eSwizzle_Green; @@ -332,6 +334,8 @@ struct VulkanPipelineState TextureSwizzle swizzle[4]; uint32_t baseMip; uint32_t baseLayer; + uint32_t numMip; + uint32_t numLayer; }; rdctype::array attachments; diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 2058182db..e04bf5b79 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -743,6 +743,8 @@ void Serialiser::Serialise( SerialisePODArray<4>("", el.swizzle); Serialise("", el.baseMip); Serialise("", el.baseLayer); + Serialise("", el.numMip); + Serialise("", el.numLayer); Serialise("", el.offset); Serialise("", el.size); @@ -763,7 +765,7 @@ void Serialiser::Serialise( Serialise("", el.border); Serialise("", el.unnormalized); - SIZE_CHECK(VulkanPipelineState::Pipeline::DescriptorSet::DescriptorBinding::BindingElement, 320); + SIZE_CHECK(VulkanPipelineState::Pipeline::DescriptorSet::DescriptorBinding::BindingElement, 328); }; template <> @@ -891,6 +893,24 @@ void Serialiser::Serialise(const char *name, VulkanPipelineState::ColorBlend &el SIZE_CHECK(VulkanPipelineState::ColorBlend, 64); } +template <> +void Serialiser::Serialise(const char *name, + VulkanPipelineState::CurrentPass::Framebuffer::Attachment &el) +{ + Serialise("", el.view); + Serialise("", el.img); + + Serialise("", el.viewfmt); + SerialisePODArray<4>("", el.swizzle); + + Serialise("", el.baseMip); + Serialise("", el.baseLayer); + Serialise("", el.numMip); + Serialise("", el.numLayer); + + SIZE_CHECK(VulkanPipelineState::CurrentPass::Framebuffer::Attachment, 104); +} + template <> void Serialiser::Serialise(const char *name, VulkanPipelineState::DepthStencil &el) { @@ -1599,12 +1619,6 @@ string ToStrHelper::Get( return "<...>"; } template <> -string ToStrHelper::Get( - const VulkanPipelineState::CurrentPass::Framebuffer::Attachment &el) -{ - return "<...>"; -} -template <> string ToStrHelper::Get(const EventUsage &el) { return "<...>"; diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index 6431bd16a..44ffca5b2 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -543,6 +543,12 @@ void VulkanCreationInfo::ImageView::Init(VulkanResourceManager *resourceMan, Vul format = pCreateInfo->format; range = pCreateInfo->subresourceRange; + if(range.levelCount == VK_REMAINING_MIP_LEVELS) + range.levelCount = info.m_Image[image].mipLevels - range.baseMipLevel; + + if(range.layerCount == VK_REMAINING_ARRAY_LAYERS) + range.layerCount = info.m_Image[image].arrayLayers - range.baseArrayLayer; + swizzle[0] = Convert(pCreateInfo->components.r, 0); swizzle[1] = Convert(pCreateInfo->components.g, 1); swizzle[2] = Convert(pCreateInfo->components.b, 2); diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 1c7d1b7ab..eba4a5a6a 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -3396,6 +3396,10 @@ void VulkanReplay::SavePipelineState() c.m_ImageView[viewid].range.baseMipLevel; m_VulkanPipelineState.Pass.framebuffer.attachments[i].baseLayer = c.m_ImageView[viewid].range.baseArrayLayer; + m_VulkanPipelineState.Pass.framebuffer.attachments[i].numMip = + c.m_ImageView[viewid].range.levelCount; + m_VulkanPipelineState.Pass.framebuffer.attachments[i].numLayer = + c.m_ImageView[viewid].range.layerCount; memcpy(m_VulkanPipelineState.Pass.framebuffer.attachments[i].swizzle, c.m_ImageView[viewid].swizzle, sizeof(TextureSwizzle) * 4); @@ -3407,6 +3411,8 @@ void VulkanReplay::SavePipelineState() m_VulkanPipelineState.Pass.framebuffer.attachments[i].baseMip = 0; m_VulkanPipelineState.Pass.framebuffer.attachments[i].baseLayer = 0; + m_VulkanPipelineState.Pass.framebuffer.attachments[i].numMip = 1; + m_VulkanPipelineState.Pass.framebuffer.attachments[i].numLayer = 1; } } } @@ -3575,6 +3581,8 @@ void VulkanReplay::SavePipelineState() sizeof(TextureSwizzle) * 4); dst.bindings[b].binds[a].baseMip = c.m_ImageView[viewid].range.baseMipLevel; dst.bindings[b].binds[a].baseLayer = c.m_ImageView[viewid].range.baseArrayLayer; + dst.bindings[b].binds[a].numMip = c.m_ImageView[viewid].range.levelCount; + dst.bindings[b].binds[a].numLayer = c.m_ImageView[viewid].range.layerCount; } else { @@ -3582,6 +3590,8 @@ void VulkanReplay::SavePipelineState() dst.bindings[b].binds[a].res = ResourceId(); dst.bindings[b].binds[a].baseMip = 0; dst.bindings[b].binds[a].baseLayer = 0; + dst.bindings[b].binds[a].numMip = 1; + dst.bindings[b].binds[a].numLayer = 1; } } if(layoutBind.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER || diff --git a/renderdocui/Code/CommonPipelineState.cs b/renderdocui/Code/CommonPipelineState.cs index 4169c74b7..c0ebdb83f 100644 --- a/renderdocui/Code/CommonPipelineState.cs +++ b/renderdocui/Code/CommonPipelineState.cs @@ -1090,7 +1090,7 @@ namespace renderdocui.Code var ret = new BoundResource(); ret.Id = fb.attachments[rp.depthstencilAttachment].img; ret.HighestMip = (int)fb.attachments[rp.depthstencilAttachment].baseMip; - ret.FirstSlice = (int)fb.attachments[rp.depthstencilAttachment].baseArray; + ret.FirstSlice = (int)fb.attachments[rp.depthstencilAttachment].baseLayer; return ret; } @@ -1151,7 +1151,7 @@ namespace renderdocui.Code { ret[i].Id = fb.attachments[rp.colorAttachments[i]].img; ret[i].HighestMip = (int)fb.attachments[rp.colorAttachments[i]].baseMip; - ret[i].FirstSlice = (int)fb.attachments[rp.colorAttachments[i]].baseArray; + ret[i].FirstSlice = (int)fb.attachments[rp.colorAttachments[i]].baseLayer; } } diff --git a/renderdocui/Interop/VulkanPipelineState.cs b/renderdocui/Interop/VulkanPipelineState.cs index cab041f8b..c44953643 100644 --- a/renderdocui/Interop/VulkanPipelineState.cs +++ b/renderdocui/Interop/VulkanPipelineState.cs @@ -69,6 +69,8 @@ namespace renderdoc public UInt32 baseMip; public UInt32 baseLayer; + public UInt32 numMip; + public UInt32 numLayer; public UInt64 offset; public UInt64 size; @@ -383,7 +385,9 @@ namespace renderdoc public TextureSwizzle[] swizzle; public UInt32 baseMip; - public UInt32 baseArray; + public UInt32 baseLayer; + public UInt32 numMip; + public UInt32 numLayer; }; [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] public Attachment[] attachments;