Vulkan: Add image view tracking for command buffer records

Change-Id: I60718d7d7dbadd0e1ed1c8072d87f2de49282f08
This commit is contained in:
Benson Joeris
2019-05-30 15:10:24 -04:00
committed by Baldur Karlsson
parent 0f8c1d3f09
commit 666e6730df
3 changed files with 59 additions and 0 deletions
+34
View File
@@ -3070,6 +3070,40 @@ void VkResourceRecord::MarkImageFrameReferenced(VkResourceRecord *img, const Ima
id, maxRef, [](FrameRefType x, FrameRefType y) -> FrameRefType { return std::max(x, y); });
}
void VkResourceRecord::MarkImageViewFrameReferenced(VkResourceRecord *view, const ImageRange &range,
FrameRefType refType)
{
ResourceId img = view->baseResource;
ResourceId mem = view->baseResourceMem;
// mark image view as read
MarkResourceFrameReferenced(view->GetResourceID(), eFrameRef_Read);
// mark memory backing image as read
MarkResourceFrameReferenced(mem, eFrameRef_Read);
if(refType != eFrameRef_Read && refType != eFrameRef_None)
cmdInfo->dirtied.insert(img);
ImageRange imgRange;
imgRange.aspectMask = view->viewRange.aspectMask;
imgRange.baseMipLevel = view->viewRange.baseMipLevel + range.baseMipLevel;
imgRange.levelCount = range.levelCount;
imgRange.baseArrayLayer = view->viewRange.baseArrayLayer + range.baseArrayLayer;
imgRange.layerCount = range.layerCount;
imgRange.offset = range.offset;
imgRange.extent = range.extent;
imgRange.viewType = view->viewRange.viewType();
FrameRefType maxRef =
MarkImageReferenced(cmdInfo->imgFrameRefs, img, view->resInfo->imageInfo, imgRange, refType);
// maintain the reference type of the image itself as the maximum reference type of any
// subresource
MarkResourceFrameReferenced(
img, maxRef, [](FrameRefType x, FrameRefType y) -> FrameRefType { return std::max(x, y); });
}
void VkResourceRecord::MarkMemoryFrameReferenced(ResourceId mem, VkDeviceSize offset,
VkDeviceSize size, FrameRefType refType)
{
+24
View File
@@ -1483,6 +1483,8 @@ public:
void MarkMemoryFrameReferenced(ResourceId mem, VkDeviceSize offset, VkDeviceSize size,
FrameRefType refType);
void MarkImageFrameReferenced(VkResourceRecord *img, const ImageRange &range, FrameRefType refType);
void MarkImageViewFrameReferenced(VkResourceRecord *view, const ImageRange &range,
FrameRefType refType);
void MarkBufferFrameReferenced(VkResourceRecord *buf, VkDeviceSize offset, VkDeviceSize size,
FrameRefType refType);
void MarkBufferImageCopyFrameReferenced(VkResourceRecord *buf, VkResourceRecord *img,
@@ -1526,6 +1528,7 @@ public:
levelCount = 1;
baseArrayLayer = 0;
layerCount = 1;
packedViewType = 7;
}
ViewRange &operator=(const VkImageSubresourceRange &range)
@@ -1568,6 +1571,27 @@ public:
return ret;
}
inline VkImageViewType viewType() const
{
if(packedViewType <= VK_IMAGE_VIEW_TYPE_END_RANGE)
return (VkImageViewType)packedViewType;
else
return VK_IMAGE_VIEW_TYPE_MAX_ENUM;
}
inline void setViewType(VkImageViewType t)
{
if(t <= VK_IMAGE_VIEW_TYPE_END_RANGE)
packedViewType = t;
else
packedViewType = 7;
}
// View type (VkImageViewType).
// Values <= 6, fits in 3 bits; 7 encodes an unknown/uninitialized view type.
// Stored as uint32_t instead of VkImageViewType to prevent signed extension.
uint32_t packedViewType : 3;
// only need 4 bits for the aspects
uint32_t aspectMask : 4;
@@ -1879,6 +1879,7 @@ VkResult WrappedVulkan::vkCreateImageView(VkDevice device, const VkImageViewCrea
record->baseResourceMem = imageRecord->baseResource;
record->resInfo = imageRecord->resInfo;
record->viewRange = pCreateInfo->subresourceRange;
record->viewRange.setViewType(pCreateInfo->viewType);
}
else
{