From b12ef92da7d640b9e13a38d1659bf9be1c6e8c9f Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 17 Oct 2015 13:26:03 +0200 Subject: [PATCH] Cache image views created for displaying images --- renderdoc/driver/vulkan/vk_replay.cpp | 23 ++++++------- renderdoc/driver/vulkan/vk_resources.h | 4 +-- .../vulkan/wrappers/vk_resource_funcs.cpp | 32 ++++++++++--------- .../driver/vulkan/wrappers/vk_wsi_funcs.cpp | 1 - 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 5ddf46cd2..1116e2c8f 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -673,32 +673,32 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn VkQueue q = m_pDriver->GetQ(); const VkLayerDispatchTable *vt = ObjDisp(dev); - const ImgState &iminfo = m_pDriver->m_ImageInfo[cfg.texid]; + ImgState &iminfo = m_pDriver->m_ImageInfo[cfg.texid]; VkImage liveIm = m_pDriver->GetResourceManager()->GetCurrentHandle(cfg.texid); // VKTODOMED handle multiple subresources with different layouts etc VkImageLayout origLayout = iminfo.subresourceStates[0].state; - VkImageView liveImView = VK_NULL_HANDLE; + VkImageView liveImView = iminfo.view; - // VKTODOLOW this view should be cached + if(liveImView == VK_NULL_HANDLE) { VkImageViewCreateInfo viewInfo = { VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, NULL, Unwrap(liveIm), VK_IMAGE_VIEW_TYPE_2D, iminfo.format, { VK_CHANNEL_SWIZZLE_R, VK_CHANNEL_SWIZZLE_G, VK_CHANNEL_SWIZZLE_B, VK_CHANNEL_SWIZZLE_A }, - { VK_IMAGE_ASPECT_COLOR, 0, RDCMAX(1, iminfo.mipLevels), 0, 1, }, + { VK_IMAGE_ASPECT_COLOR_BIT, 0, RDCMAX(1, iminfo.mipLevels), 0, 1, }, 0 }; - // VKTODOMED used for texture display, but eventually will have to be created on the fly - // for whichever image we're viewing (and cached), not specifically created here. - VkResult vkr = vt->CreateImageView(Unwrap(dev), &viewInfo, &liveImView); + VkResult vkr = ObjDisp(dev)->CreateImageView(Unwrap(dev), &viewInfo, &iminfo.view); RDCASSERT(vkr == VK_SUCCESS); - m_pDriver->GetResourceManager()->WrapResource(Unwrap(dev), liveImView); + m_pDriver->GetResourceManager()->WrapResource(Unwrap(dev), iminfo.view); + + liveImView = iminfo.view; } - + // VKTODOHIGH once we stop doing DeviceWaitIdle/QueueWaitIdle all over, this // needs to be ring-buffered displayuniforms *data = (displayuniforms *)GetDebugManager()->m_TexDisplayUBO.Map(vt, dev); @@ -845,10 +845,7 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn // ring-buffer style vt->QueueWaitIdle(Unwrap(q)); - vt->DestroyImageView(Unwrap(dev), Unwrap(liveImView)); - VKMGR()->ReleaseWrappedResource(liveImView); - - return false; + return true; } void VulkanReplay::RenderCheckerboard(Vec3f light, Vec3f dark) diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index c2b3cc288..ffe37c034 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -680,14 +680,14 @@ struct MemState struct ImgState { ImgState() - : mem(VK_NULL_HANDLE), arraySize(0), mipLevels(0), samples(0), cube(false), creationFlags(0) + : view(VK_NULL_HANDLE), arraySize(0), mipLevels(0), samples(0), cube(false), creationFlags(0) { type = VK_IMAGE_TYPE_MAX_ENUM; format = VK_FORMAT_UNDEFINED; extent.width = extent.height = extent.depth = 0; } - VkDeviceMemory mem; + VkImageView view; vector subresourceStates; VkImageType type; diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index 77f4d8ad0..48f2205bb 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -756,25 +756,27 @@ bool WrappedVulkan::Serialise_vkCreateImage( { ResourceId live = GetResourceManager()->WrapResource(Unwrap(device), img); GetResourceManager()->AddLiveResource(id, img); + + ImgState &iminfo = m_ImageInfo[live]; - m_ImageInfo[live].type = info.imageType; - m_ImageInfo[live].format = info.format; - m_ImageInfo[live].extent = info.extent; - m_ImageInfo[live].mipLevels = info.mipLevels; - m_ImageInfo[live].arraySize = info.arraySize; - m_ImageInfo[live].samples = info.samples; + iminfo.type = info.imageType; + iminfo.format = info.format; + iminfo.extent = info.extent; + iminfo.mipLevels = info.mipLevels; + iminfo.arraySize = info.arraySize; + iminfo.samples = info.samples; if(origFlags & VK_IMAGE_USAGE_SAMPLED_BIT) - m_ImageInfo[live].creationFlags |= eTextureCreate_SRV; + iminfo.creationFlags |= eTextureCreate_SRV; if(origFlags & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT)) - m_ImageInfo[live].creationFlags |= eTextureCreate_RTV; + iminfo.creationFlags |= eTextureCreate_RTV; if(origFlags & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) - m_ImageInfo[live].creationFlags |= eTextureCreate_DSV; + iminfo.creationFlags |= eTextureCreate_DSV; if(origFlags & VK_IMAGE_USAGE_STORAGE_BIT) - m_ImageInfo[live].creationFlags |= eTextureCreate_UAV; + iminfo.creationFlags |= eTextureCreate_UAV; if(info.flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) - m_ImageInfo[live].cube = true; + iminfo.cube = true; VkImageSubresourceRange range; range.baseMipLevel = range.baseArrayLayer = 0; @@ -783,16 +785,16 @@ bool WrappedVulkan::Serialise_vkCreateImage( if(info.imageType == VK_IMAGE_TYPE_3D) range.arraySize = info.extent.depth; - m_ImageInfo[live].subresourceStates.clear(); + iminfo.subresourceStates.clear(); if(!IsDepthStencilFormat(info.format)) { - range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; m_ImageInfo[live].subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); + range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; iminfo.subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); } else { - range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; m_ImageInfo[live].subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); - range.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;m_ImageInfo[live].subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); + range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; iminfo.subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); + range.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;iminfo.subresourceStates.push_back(ImageRegionState(range, UNTRANSITIONED_IMG_STATE, VK_IMAGE_LAYOUT_UNDEFINED)); } } } diff --git a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp index 1dfe8c641..4ac4f2b48 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp @@ -276,7 +276,6 @@ bool WrappedVulkan::Serialise_vkCreateSwapchainKHR( m_SwapChainInfo[id].images[i].im = im; // fill out image info so we track resource state transitions - m_ImageInfo[liveId].mem = mem; m_ImageInfo[liveId].type = VK_IMAGE_TYPE_2D; m_ImageInfo[liveId].format = info.imageFormat; m_ImageInfo[liveId].extent.width = info.imageExtent.width;