mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-05 09:30:44 +00:00
Vulkan: Add image view tracking for command buffer records
Change-Id: I60718d7d7dbadd0e1ed1c8072d87f2de49282f08
This commit is contained in:
committed by
Baldur Karlsson
parent
0f8c1d3f09
commit
666e6730df
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user