mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-06 23:00:59 +00:00
Cache image views created for displaying images
This commit is contained in:
@@ -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<VkImage>(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)
|
||||
|
||||
@@ -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<ImageRegionState> subresourceStates;
|
||||
|
||||
VkImageType type;
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user