Merge pull request #12457 from iwubcode/asset_memory_limit

VideoCommon: handle asset memory going over reserved limit correctly
This commit is contained in:
Mai 2024-02-16 15:46:52 -05:00 committed by GitHub
commit 21300bb21b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 17 additions and 8 deletions

View File

@ -3,7 +3,6 @@
#include "VideoCommon/Assets/CustomAssetLoader.h" #include "VideoCommon/Assets/CustomAssetLoader.h"
#include "Common/Logging/Log.h"
#include "Common/MemoryUtil.h" #include "Common/MemoryUtil.h"
#include "VideoCommon/Assets/CustomAssetLibrary.h" #include "VideoCommon/Assets/CustomAssetLibrary.h"
@ -48,19 +47,22 @@ void CustomAssetLoader::Init()
m_asset_load_thread.Reset("Custom Asset Loader", [this](std::weak_ptr<CustomAsset> asset) { m_asset_load_thread.Reset("Custom Asset Loader", [this](std::weak_ptr<CustomAsset> asset) {
if (auto ptr = asset.lock()) if (auto ptr = asset.lock())
{ {
if (m_memory_exceeded)
return;
if (ptr->Load()) if (ptr->Load())
{ {
std::lock_guard lk(m_asset_load_lock); std::lock_guard lk(m_asset_load_lock);
const std::size_t asset_memory_size = ptr->GetByteSizeInMemory(); const std::size_t asset_memory_size = ptr->GetByteSizeInMemory();
if (m_max_memory_available >= m_total_bytes_loaded + asset_memory_size) m_total_bytes_loaded += asset_memory_size;
m_assets_to_monitor.try_emplace(ptr->GetAssetId(), ptr);
if (m_total_bytes_loaded > m_max_memory_available)
{ {
m_total_bytes_loaded += asset_memory_size; ERROR_LOG_FMT(VIDEO,
m_assets_to_monitor.try_emplace(ptr->GetAssetId(), ptr); "Asset memory exceeded with asset '{}', future assets won't load until "
} "memory is available.",
else
{
ERROR_LOG_FMT(VIDEO, "Failed to load asset {} because there was not enough memory.",
ptr->GetAssetId()); ptr->GetAssetId());
m_memory_exceeded = true;
} }
} }
} }

View File

@ -10,6 +10,7 @@
#include <thread> #include <thread>
#include "Common/Flag.h" #include "Common/Flag.h"
#include "Common/Logging/Log.h"
#include "Common/WorkQueueThread.h" #include "Common/WorkQueueThread.h"
#include "VideoCommon/Assets/CustomAsset.h" #include "VideoCommon/Assets/CustomAsset.h"
#include "VideoCommon/Assets/MaterialAsset.h" #include "VideoCommon/Assets/MaterialAsset.h"
@ -71,6 +72,11 @@ private:
std::lock_guard lk(m_asset_load_lock); std::lock_guard lk(m_asset_load_lock);
m_total_bytes_loaded -= a->GetByteSizeInMemory(); m_total_bytes_loaded -= a->GetByteSizeInMemory();
m_assets_to_monitor.erase(a->GetAssetId()); m_assets_to_monitor.erase(a->GetAssetId());
if (m_max_memory_available >= m_total_bytes_loaded && m_memory_exceeded)
{
INFO_LOG_FMT(VIDEO, "Asset memory went below limit, new assets can begin loading.");
m_memory_exceeded = false;
}
} }
delete a; delete a;
}); });
@ -90,6 +96,7 @@ private:
std::size_t m_total_bytes_loaded = 0; std::size_t m_total_bytes_loaded = 0;
std::size_t m_max_memory_available = 0; std::size_t m_max_memory_available = 0;
std::atomic_bool m_memory_exceeded = false;
std::map<CustomAssetLibrary::AssetID, std::weak_ptr<CustomAsset>> m_assets_to_monitor; std::map<CustomAssetLibrary::AssetID, std::weak_ptr<CustomAsset>> m_assets_to_monitor;