Don't track depth and stencil aspects separately, treat them as combined

This commit is contained in:
baldurk
2016-01-14 18:16:17 +01:00
parent 378d3e9a47
commit 29761041d7
4 changed files with 36 additions and 61 deletions
+3 -3
View File
@@ -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,
+8 -16
View File
@@ -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
}
+10 -24
View File
@@ -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;