Delete expired `weak_ptr`s for Texture/Buffer views

A large amount of Texture/Buffer views would expire before reuse could occur in `Texture::GetView`/`Buffer::GetView`. These can lead to a substantial memory allocation given enough time and they are now deleted during the lookup while iterating on all entries.

It should be noted that there are a lot of duplicate views that don't live long enough to be reused and the ultimate solution here is to make those views live long enough to be reused.
This commit is contained in:
PixelyIon 2022-03-06 21:18:54 +05:30
parent 881bb969c4
commit 77e2797219
2 changed files with 12 additions and 4 deletions

View File

@ -172,10 +172,14 @@ namespace skyline::gpu {
}
std::shared_ptr<BufferView> Buffer::GetView(vk::DeviceSize offset, vk::DeviceSize range, vk::Format format) {
for (const auto &viewWeak : views) {
auto view{viewWeak.lock()};
for (auto viewIt{views.begin()}; viewIt != views.end();) {
auto view{viewIt->lock()};
if (view && view->offset == offset && view->range == range && view->format == format)
return view;
else if (!view)
viewIt = views.erase(viewIt);
else
++viewIt;
}
auto view{std::make_shared<BufferView>(shared_from_this(), offset, range, format)};

View File

@ -515,10 +515,14 @@ namespace skyline::gpu {
}
std::shared_ptr<TextureView> Texture::GetView(vk::ImageViewType type, vk::ImageSubresourceRange range, texture::Format pFormat, vk::ComponentMapping mapping) {
for (const auto &viewWeak : views) {
auto view{viewWeak.lock()};
for (auto viewIt{views.begin()}; viewIt != views.end();) {
auto view{viewIt->lock()};
if (view && type == view->type && pFormat == view->format && range == view->range && mapping == view->mapping)
return view;
else if (!view)
viewIt = views.erase(viewIt);
else
++viewIt;
}
auto view{std::make_shared<TextureView>(shared_from_this(), type, range, pFormat, mapping)};