From 29761041d788198e2e536651e3ec08b8328c78b7 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 14 Jan 2016 18:16:17 +0100 Subject: [PATCH] Don't track depth and stencil aspects separately, treat them as combined --- renderdoc/driver/vulkan/vk_initstate.cpp | 6 ++-- renderdoc/driver/vulkan/vk_manager.cpp | 24 +++++-------- renderdoc/driver/vulkan/vk_replay.cpp | 34 ++++++------------- .../vulkan/wrappers/vk_resource_funcs.cpp | 33 ++++++++---------- 4 files changed, 36 insertions(+), 61 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index 31f5ae473..eba88f8ab 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -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, diff --git a/renderdoc/driver/vulkan/vk_manager.cpp b/renderdoc/driver/vulkan/vk_manager.cpp index 080e7cd3d..b5a314d3b 100644 --- a/renderdoc/driver/vulkan/vk_manager.cpp +++ b/renderdoc/driver/vulkan/vk_manager.cpp @@ -66,7 +66,6 @@ void VulkanResourceManager::RecordSingleBarrier(vector< pairfirst < 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< pairsecond.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 > &states, map &layouts) @@ -350,12 +345,13 @@ void VulkanResourceManager::ApplyBarriers(vector< pairrange.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< pairsubresourceRange.aspectMask > t.subresourceRange.aspectMask) - break; - // otherwise continue to try and find the subresource range } diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 2cff42fa3..6258de7cb 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -966,7 +966,6 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn VkImage liveIm = m_pDriver->GetResourceManager()->GetCurrentHandle(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(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(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(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; diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index 1a9c7aaa1..2a8a82864 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -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;