Cache image views created for displaying images

This commit is contained in:
baldurk
2016-02-07 18:43:52 +01:00
parent 2770e424ca
commit b12ef92da7
4 changed files with 29 additions and 31 deletions
+10 -13
View File
@@ -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)
+2 -2
View File
@@ -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;