diff --git a/renderdoc/api/replay/gl_pipestate.h b/renderdoc/api/replay/gl_pipestate.h index 1a7a2e7cd..b71a513ac 100644 --- a/renderdoc/api/replay/gl_pipestate.h +++ b/renderdoc/api/replay/gl_pipestate.h @@ -117,6 +117,7 @@ struct GLPipelineState } ResourceId Resource; uint32_t FirstSlice; + uint32_t HighestMip; ShaderResourceType ResType; TextureSwizzle Swizzle[4]; diff --git a/renderdoc/api/replay/vk_pipestate.h b/renderdoc/api/replay/vk_pipestate.h index 0da573002..6873ce58f 100644 --- a/renderdoc/api/replay/vk_pipestate.h +++ b/renderdoc/api/replay/vk_pipestate.h @@ -50,6 +50,10 @@ struct VulkanPipelineState ResourceId res; // buffer, image, attachment ResourceId sampler; + // image views + uint32_t baseMip; + uint32_t baseLayer; + // buffers uint64_t offset; uint64_t size; @@ -266,6 +270,9 @@ struct VulkanPipelineState { ResourceId view; ResourceId img; + + uint32_t baseMip; + uint32_t baseLayer; }; rdctype::array attachments; diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index c902bf03b..3514a446f 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -1252,12 +1252,16 @@ void GLReplay::SavePipelineState() else { // very bespoke/specific - GLint firstSlice = 0; + GLint firstSlice = 0, firstMip = 0; if(target != eGL_TEXTURE_BUFFER) - gl.glGetTexParameteriv(target, eGL_TEXTURE_VIEW_MIN_LEVEL, &firstSlice); + { + gl.glGetTexParameteriv(target, eGL_TEXTURE_VIEW_MIN_LEVEL, &firstMip); + gl.glGetTexParameteriv(target, eGL_TEXTURE_VIEW_MIN_LAYER, &firstSlice); + } pipe.Textures[unit].Resource = rm->GetOriginalID(rm->GetID(TextureRes(ctx, tex))); + pipe.Textures[unit].HighestMip = (uint32_t)firstMip; pipe.Textures[unit].FirstSlice = (uint32_t)firstSlice; pipe.Textures[unit].ResType = resType; diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index 80a961d98..e05a6df35 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -347,6 +347,7 @@ void VulkanCreationInfo::Sampler::Init(VulkanResourceManager *resourceMan, const void VulkanCreationInfo::ImageView::Init(VulkanResourceManager *resourceMan, const VkImageViewCreateInfo* pCreateInfo) { image = resourceMan->GetNonDispWrapper(pCreateInfo->image)->id; + range = pCreateInfo->subresourceRange; } void VulkanCreationInfo::ShaderModule::Init(VulkanResourceManager *resourceMan, const VkShaderModuleCreateInfo* pCreateInfo) diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index 82012b36e..c85a4e3ff 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -276,6 +276,7 @@ struct VulkanCreationInfo void Init(VulkanResourceManager *resourceMan, const VkImageViewCreateInfo* pCreateInfo); ResourceId image; + VkImageSubresourceRange range; }; map m_ImageView; diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 1ff4b5b04..62088e6b5 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -2803,8 +2803,22 @@ void VulkanReplay::SavePipelineState() { ResourceId viewid = c.m_Framebuffer[state.framebuffer].attachments[i].view; - m_VulkanPipelineState.Pass.framebuffer.attachments[i].view = rm->GetOriginalID(viewid); - m_VulkanPipelineState.Pass.framebuffer.attachments[i].img = rm->GetOriginalID(c.m_ImageView[viewid].image); + if(viewid != ResourceId()) + { + m_VulkanPipelineState.Pass.framebuffer.attachments[i].view = rm->GetOriginalID(viewid); + m_VulkanPipelineState.Pass.framebuffer.attachments[i].img = rm->GetOriginalID(c.m_ImageView[viewid].image); + + m_VulkanPipelineState.Pass.framebuffer.attachments[i].baseMip = c.m_ImageView[viewid].range.baseMipLevel; + m_VulkanPipelineState.Pass.framebuffer.attachments[i].baseLayer = c.m_ImageView[viewid].range.baseArrayLayer; + } + else + { + m_VulkanPipelineState.Pass.framebuffer.attachments[i].view = ResourceId(); + m_VulkanPipelineState.Pass.framebuffer.attachments[i].img = ResourceId(); + + m_VulkanPipelineState.Pass.framebuffer.attachments[i].baseMip = 0; + m_VulkanPipelineState.Pass.framebuffer.attachments[i].baseLayer = 0; + } } m_VulkanPipelineState.Pass.renderArea.x = state.renderArea.offset.x; @@ -2917,6 +2931,8 @@ void VulkanReplay::SavePipelineState() dst.bindings[b].binds[a].view = rm->GetOriginalID(viewid); dst.bindings[b].binds[a].res = rm->GetOriginalID(c.m_ImageView[viewid].image); + dst.bindings[b].binds[a].baseMip = c.m_ImageView[viewid].range.baseMipLevel; + dst.bindings[b].binds[a].baseLayer = c.m_ImageView[viewid].range.baseArrayLayer; } if(layoutBind.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER || layoutBind.descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) diff --git a/renderdocui/Interop/GLPipelineState.cs b/renderdocui/Interop/GLPipelineState.cs index e51b54eb5..5ede12e6a 100644 --- a/renderdocui/Interop/GLPipelineState.cs +++ b/renderdocui/Interop/GLPipelineState.cs @@ -132,6 +132,7 @@ namespace renderdoc { public ResourceId Resource; public UInt32 FirstSlice; + public UInt32 HighestMip; public ShaderResourceType ResType; [CustomMarshalAs(CustomUnmanagedType.FixedArray, FixedLength = 4)] public TextureSwizzle[] Swizzle; diff --git a/renderdocui/Interop/VulkanPipelineState.cs b/renderdocui/Interop/VulkanPipelineState.cs index 897f70aa0..c0a1dcfb3 100644 --- a/renderdocui/Interop/VulkanPipelineState.cs +++ b/renderdocui/Interop/VulkanPipelineState.cs @@ -56,6 +56,9 @@ namespace renderdoc public ResourceId res; public ResourceId sampler; + public UInt32 baseMip; + public UInt32 baseLayer; + public UInt64 offset; public UInt64 size; @@ -348,6 +351,9 @@ namespace renderdoc { public ResourceId view; public ResourceId img; + + public UInt32 baseMip; + public UInt32 baseArray; }; [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] public Attachment[] attachments;