Vulkan: Add image subresource tracking to VulkanResourceManager

Change-Id: I9e14cb8bbb98142c8b6ff194c0d989e22f040a06
This commit is contained in:
Benson Joeris
2019-05-30 15:10:11 -04:00
committed by Baldur Karlsson
parent 54c5a9c303
commit 16e410d310
2 changed files with 48 additions and 0 deletions
+40
View File
@@ -731,6 +731,20 @@ ResourceId VulkanResourceManager::GetFirstIDForHandle(uint64_t handle)
return ResourceId();
}
void VulkanResourceManager::MarkImageFrameReferenced(const VkResourceRecord *img,
const ImageRange &range, FrameRefType refType)
{
MarkImageFrameReferenced(img->GetResourceID(), img->resInfo->imageInfo, range, refType);
}
void VulkanResourceManager::MarkImageFrameReferenced(ResourceId img, const ImageInfo &imageInfo,
const ImageRange &range, FrameRefType refType)
{
FrameRefType maxRef = MarkImageReferenced(m_ImgFrameRefs, img, imageInfo, range, refType);
MarkResourceFrameReferenced(
img, maxRef, [](FrameRefType x, FrameRefType y) -> FrameRefType { return std::max(x, y); });
}
void VulkanResourceManager::MarkMemoryFrameReferenced(ResourceId mem, VkDeviceSize offset,
VkDeviceSize size, FrameRefType refType)
{
@@ -741,6 +755,18 @@ void VulkanResourceManager::MarkMemoryFrameReferenced(ResourceId mem, VkDeviceSi
mem, maxRef, [](FrameRefType x, FrameRefType y) -> FrameRefType { return std::max(x, y); });
}
void VulkanResourceManager::MergeReferencedImages(std::map<ResourceId, ImgRefs> &imgRefs)
{
for(auto j = imgRefs.begin(); j != imgRefs.end(); j++)
{
auto i = m_ImgFrameRefs.find(j->first);
if(i == m_ImgFrameRefs.end())
m_ImgFrameRefs.insert(*j);
else
i->second.Merge(j->second);
}
}
void VulkanResourceManager::MergeReferencedMemory(std::map<ResourceId, MemRefs> &memRefs)
{
SCOPED_LOCK(m_Lock);
@@ -755,6 +781,11 @@ void VulkanResourceManager::MergeReferencedMemory(std::map<ResourceId, MemRefs>
}
}
void VulkanResourceManager::ClearReferencedImages()
{
m_ImgFrameRefs.clear();
}
void VulkanResourceManager::ClearReferencedMemory()
{
SCOPED_LOCK(m_Lock);
@@ -771,6 +802,15 @@ MemRefs *VulkanResourceManager::FindMemRefs(ResourceId mem)
return NULL;
}
ImgRefs *VulkanResourceManager::FindImgRefs(ResourceId img)
{
auto it = m_ImgFrameRefs.find(img);
if(it != m_ImgFrameRefs.end())
return &it->second;
else
return NULL;
}
bool VulkanResourceManager::Prepare_InitialState(WrappedVkRes *res)
{
return m_Core->Prepare_InitialState(res);
+8
View File
@@ -422,12 +422,19 @@ public:
void SetInternalResource(ResourceId id);
void MarkImageFrameReferenced(const VkResourceRecord *img, const ImageRange &range,
FrameRefType refType);
void MarkImageFrameReferenced(ResourceId img, const ImageInfo &imageInfo, const ImageRange &range,
FrameRefType refType);
void MarkMemoryFrameReferenced(ResourceId mem, VkDeviceSize start, VkDeviceSize end,
FrameRefType refType);
void MergeReferencedMemory(std::map<ResourceId, MemRefs> &memRefs);
void MergeReferencedImages(std::map<ResourceId, ImgRefs> &imgRefs);
void ClearReferencedImages();
void ClearReferencedMemory();
MemRefs *FindMemRefs(ResourceId mem);
ImgRefs *FindImgRefs(ResourceId img);
inline bool OptimizeInitialState() { return m_OptimizeInitialState; }
private:
@@ -444,5 +451,6 @@ private:
CaptureState m_State;
WrappedVulkan *m_Core;
std::map<ResourceId, MemRefs> m_MemFrameRefs;
std::map<ResourceId, ImgRefs> m_ImgFrameRefs;
bool m_OptimizeInitialState = false;
};