mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-13 21:40:41 +00:00
Don't track depth and stencil aspects separately, treat them as combined
This commit is contained in:
@@ -1024,7 +1024,7 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res)
|
||||
|
||||
VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
if (IsDepthStencilFormat(layout->format))
|
||||
aspectFlags = IsDepthOnlyFormat(layout->format) ? VK_IMAGE_ASPECT_DEPTH_BIT : (VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT);
|
||||
aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
|
||||
VkImageMemoryBarrier srcimBarrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, NULL,
|
||||
@@ -1540,7 +1540,7 @@ bool WrappedVulkan::Serialise_InitialState(ResourceId resid, WrappedVkRes *)
|
||||
|
||||
VkFormat fmt = m_CreationInfo.m_Image[liveim->id].format;
|
||||
if (IsDepthStencilFormat(fmt))
|
||||
aspectFlags = IsDepthOnlyFormat(fmt) ? VK_IMAGE_ASPECT_DEPTH_BIT : (VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT);
|
||||
aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
|
||||
VkImageMemoryBarrier srcimBarrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, NULL,
|
||||
@@ -1931,7 +1931,7 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager
|
||||
|
||||
VkFormat fmt = m_CreationInfo.m_Image[id].format;
|
||||
if (IsDepthStencilFormat(fmt))
|
||||
aspectFlags = IsDepthOnlyFormat(fmt) ? VK_IMAGE_ASPECT_DEPTH_BIT : (VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT);
|
||||
aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
|
||||
VkImageMemoryBarrier dstimBarrier = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, NULL,
|
||||
|
||||
@@ -66,7 +66,6 @@ void VulkanResourceManager::RecordSingleBarrier(vector< pair<ResourceId, ImageRe
|
||||
if(it->first < id) continue;
|
||||
if(it->first != id) break;
|
||||
|
||||
if(it->second.subresourceRange.aspectMask & t.subresourceRange.aspectMask)
|
||||
{
|
||||
// we've found a range that completely matches our region, doesn't matter if that's
|
||||
// a whole image and the barrier is the whole image, or it's one subresource.
|
||||
@@ -173,10 +172,6 @@ void VulkanResourceManager::RecordSingleBarrier(vector< pair<ResourceId, ImageRe
|
||||
}
|
||||
}
|
||||
|
||||
// if we've gone past where the new subresource range would sit
|
||||
if(it->second.subresourceRange.aspectMask > t.subresourceRange.aspectMask)
|
||||
break;
|
||||
|
||||
// otherwise continue to try and find the subresource range
|
||||
}
|
||||
|
||||
@@ -298,8 +293,8 @@ void VulkanResourceManager::MarkSparseMapReferenced(SparseMapping *sparse)
|
||||
MarkResourceFrameReferenced(GetResID(sparse->opaquemappings[i].memory), eFrameRef_Read);
|
||||
|
||||
for(int a=0; a < NUM_VK_IMAGE_ASPECTS; a++)
|
||||
for(VkDeviceSize i=0; sparse->pages[a] && i < VkDeviceSize(sparse->imgdim.width*sparse->imgdim.height*sparse->imgdim.depth); i++)
|
||||
MarkResourceFrameReferenced(GetResID(sparse->pages[a][i].first), eFrameRef_Read);
|
||||
for(VkDeviceSize i=0; sparse->pages[a] && i < VkDeviceSize(sparse->imgdim.width*sparse->imgdim.height*sparse->imgdim.depth); i++)
|
||||
MarkResourceFrameReferenced(GetResID(sparse->pages[a][i].first), eFrameRef_Read);
|
||||
}
|
||||
|
||||
void VulkanResourceManager::ApplyBarriers(vector< pair<ResourceId, ImageRegionState> > &states, map<ResourceId, ImageLayouts> &layouts)
|
||||
@@ -350,12 +345,13 @@ void VulkanResourceManager::ApplyBarriers(vector< pair<ResourceId, ImageRegionSt
|
||||
it->range.baseArrayLayer, it->range.layerCount,
|
||||
ToStr::Get(it->oldLayout).c_str(), ToStr::Get(it->newLayout).c_str());
|
||||
|
||||
// image barriers are handled by initially inserting one subresource range for each aspect,
|
||||
// and whenever we need more fine-grained detail we split it immediately for one range for
|
||||
// each subresource in that aspect. Thereafter if a barrier comes in that covers multiple
|
||||
// subresources, we update all matching ranges.
|
||||
// image barriers are handled by initially inserting one subresource range for the whole object,
|
||||
// and whenever we need more fine-grained detail we split it immediately.
|
||||
// Thereafter if a barrier comes in that covers multiple subresources, we update all matching ranges.
|
||||
// NOTE: Depth-stencil images must always be trasnsitioned together for both aspects, so we don't
|
||||
// have to worry about different aspects being in different states and can in fact ignore the aspect
|
||||
// for the purpose of this case.
|
||||
|
||||
if(it->subresourceRange.aspectMask & t.subresourceRange.aspectMask)
|
||||
{
|
||||
// we've found a range that completely matches our region, doesn't matter if that's
|
||||
// a whole image and the barrier is the whole image, or it's one subresource.
|
||||
@@ -462,10 +458,6 @@ void VulkanResourceManager::ApplyBarriers(vector< pair<ResourceId, ImageRegionSt
|
||||
}
|
||||
}
|
||||
|
||||
// if we've gone past where the new subresource range would sit
|
||||
if(it->subresourceRange.aspectMask > t.subresourceRange.aspectMask)
|
||||
break;
|
||||
|
||||
// otherwise continue to try and find the subresource range
|
||||
}
|
||||
|
||||
|
||||
@@ -966,7 +966,6 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn
|
||||
VkImage liveIm = m_pDriver->GetResourceManager()->GetCurrentHandle<VkImage>(cfg.texid);
|
||||
|
||||
VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
VkImageAspectFlags aspectFlagsBarrier = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
|
||||
int displayformat = 0;
|
||||
uint32_t descSetBinding = 0;
|
||||
@@ -988,12 +987,11 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn
|
||||
|
||||
if(IsDepthOnlyFormat(layouts.format))
|
||||
{
|
||||
aspectFlagsBarrier = aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
}
|
||||
else if(IsDepthStencilFormat(layouts.format))
|
||||
{
|
||||
aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
aspectFlagsBarrier = VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT; // barriers must cover both aspects
|
||||
if(layouts.format == VK_FORMAT_S8_UINT || (!cfg.Red && cfg.Green))
|
||||
{
|
||||
aspectFlags = VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
@@ -1149,7 +1147,7 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn
|
||||
0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
|
||||
Unwrap(liveIm),
|
||||
{ aspectFlagsBarrier, 0, 1, 0, 1 }
|
||||
{ 0, 0, 1, 0, 1 } // will be overwritten by subresourceRange
|
||||
};
|
||||
|
||||
// ensure all previous writes have completed
|
||||
@@ -3431,13 +3429,8 @@ bool VulkanReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip,
|
||||
VkImage liveIm = m_pDriver->GetResourceManager()->GetCurrentHandle<VkImage>(texid);
|
||||
|
||||
VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
VkImageAspectFlags aspectFlagsBarrier = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
if(IsDepthStencilFormat(layouts.format))
|
||||
{
|
||||
aspectFlagsBarrier = aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
if(!IsDepthOnlyFormat(layouts.format))
|
||||
aspectFlagsBarrier |= VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
}
|
||||
aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
|
||||
CreateTexImageView(aspectFlags, liveIm, iminfo);
|
||||
|
||||
@@ -3531,7 +3524,7 @@ bool VulkanReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip,
|
||||
0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
|
||||
Unwrap(liveIm),
|
||||
{ aspectFlagsBarrier, 0, 1, 0, 1 }
|
||||
{ 0, 0, 1, 0, 1 } // will be overwritten by subresourceRange below
|
||||
};
|
||||
|
||||
// ensure all previous writes have completed
|
||||
@@ -3650,13 +3643,8 @@ bool VulkanReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t m
|
||||
VkImage liveIm = m_pDriver->GetResourceManager()->GetCurrentHandle<VkImage>(texid);
|
||||
|
||||
VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
VkImageAspectFlags aspectFlagsBarrier = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
if(IsDepthStencilFormat(layouts.format))
|
||||
{
|
||||
aspectFlagsBarrier = aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
if(!IsDepthOnlyFormat(layouts.format))
|
||||
aspectFlagsBarrier |= VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
}
|
||||
aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
|
||||
CreateTexImageView(aspectFlags, liveIm, iminfo);
|
||||
|
||||
@@ -3737,7 +3725,7 @@ bool VulkanReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t m
|
||||
0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
|
||||
Unwrap(liveIm),
|
||||
{ aspectFlagsBarrier, 0, 1, 0, 1 }
|
||||
{ 0, 0, 1, 0, 1 } // will be overwritten by subresourceRange below
|
||||
};
|
||||
|
||||
// ensure all previous writes have completed
|
||||
@@ -3930,6 +3918,7 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m
|
||||
};
|
||||
|
||||
bool isDepth = (layouts.subresourceStates[0].subresourceRange.aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != 0;
|
||||
VkImageAspectFlags aspectMask = layouts.subresourceStates[0].subresourceRange.aspectMask;
|
||||
|
||||
VkImage srcImage = Unwrap(GetResourceManager()->GetCurrentHandle<VkImage>(tex));
|
||||
VkImage tmpImage = VK_NULL_HANDLE;
|
||||
@@ -4160,8 +4149,7 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m
|
||||
0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
|
||||
srcImage,
|
||||
{ VkImageAspectFlags(isDepth ? (VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT) : VK_IMAGE_ASPECT_COLOR_BIT),
|
||||
0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS }
|
||||
{ aspectMask, 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS }
|
||||
};
|
||||
|
||||
VkImageMemoryBarrier dstimBarrier = {
|
||||
@@ -4169,8 +4157,7 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m
|
||||
0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
|
||||
tmpImage,
|
||||
{ VkImageAspectFlags(isDepth ? (VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT) : VK_IMAGE_ASPECT_COLOR_BIT),
|
||||
0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS }
|
||||
{ aspectMask, 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS }
|
||||
};
|
||||
|
||||
// ensure all previous writes have completed
|
||||
@@ -4238,8 +4225,7 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m
|
||||
0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
|
||||
srcImage,
|
||||
{ VkImageAspectFlags(isDepth ? (VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT) : VK_IMAGE_ASPECT_COLOR_BIT),
|
||||
0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS }
|
||||
{ aspectMask, 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS }
|
||||
};
|
||||
|
||||
void *barrier = (void *)&srcimBarrier;
|
||||
|
||||
@@ -947,15 +947,13 @@ bool WrappedVulkan::Serialise_vkCreateImage(
|
||||
layouts.extent = info.extent;
|
||||
layouts.format = info.format;
|
||||
|
||||
if(!IsDepthStencilFormat(info.format))
|
||||
{
|
||||
range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; layouts.subresourceStates.push_back(ImageRegionState(range, UNKNOWN_PREV_IMG_LAYOUT, VK_IMAGE_LAYOUT_UNDEFINED));
|
||||
}
|
||||
else
|
||||
{
|
||||
range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; layouts.subresourceStates.push_back(ImageRegionState(range, UNKNOWN_PREV_IMG_LAYOUT, VK_IMAGE_LAYOUT_UNDEFINED));
|
||||
range.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;layouts.subresourceStates.push_back(ImageRegionState(range, UNKNOWN_PREV_IMG_LAYOUT, VK_IMAGE_LAYOUT_UNDEFINED));
|
||||
}
|
||||
range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
if(IsDepthOnlyFormat(info.format))
|
||||
range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
else if(IsDepthStencilFormat(info.format))
|
||||
range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
|
||||
layouts.subresourceStates.push_back(ImageRegionState(range, UNKNOWN_PREV_IMG_LAYOUT, VK_IMAGE_LAYOUT_UNDEFINED));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1069,15 +1067,14 @@ VkResult WrappedVulkan::vkCreateImage(
|
||||
layout->format = pCreateInfo->format;
|
||||
|
||||
layout->subresourceStates.clear();
|
||||
if(!IsDepthStencilFormat(pCreateInfo->format))
|
||||
{
|
||||
range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; layout->subresourceStates.push_back(ImageRegionState(range, UNKNOWN_PREV_IMG_LAYOUT, VK_IMAGE_LAYOUT_UNDEFINED));
|
||||
}
|
||||
else
|
||||
{
|
||||
range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; layout->subresourceStates.push_back(ImageRegionState(range, UNKNOWN_PREV_IMG_LAYOUT, VK_IMAGE_LAYOUT_UNDEFINED));
|
||||
range.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;layout->subresourceStates.push_back(ImageRegionState(range, UNKNOWN_PREV_IMG_LAYOUT, VK_IMAGE_LAYOUT_UNDEFINED));
|
||||
}
|
||||
|
||||
range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
if(IsDepthOnlyFormat(pCreateInfo->format))
|
||||
range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
else if(IsDepthStencilFormat(pCreateInfo->format))
|
||||
range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
|
||||
layout->subresourceStates.push_back(ImageRegionState(range, UNKNOWN_PREV_IMG_LAYOUT, VK_IMAGE_LAYOUT_UNDEFINED));
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user