Pass through number of mips/layers in Vulkan image views

This commit is contained in:
baldurk
2016-06-24 16:31:04 +02:00
parent bf03ef4a8f
commit 27bbbc39a4
6 changed files with 49 additions and 11 deletions
+5 -1
View File
@@ -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<Attachment> attachments;
+21 -7
View File
@@ -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<false, VulkanPipelineState::ViewState::ViewportScissor>::Get(
return "<...>";
}
template <>
string ToStrHelper<false, VulkanPipelineState::CurrentPass::Framebuffer::Attachment>::Get(
const VulkanPipelineState::CurrentPass::Framebuffer::Attachment &el)
{
return "<...>";
}
template <>
string ToStrHelper<false, EventUsage>::Get(const EventUsage &el)
{
return "<...>";
+6
View File
@@ -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);
+10
View File
@@ -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 ||
+2 -2
View File
@@ -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;
}
}
+5 -1
View File
@@ -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;