Merge pull request #12457 from iwubcode/asset_memory_limit
VideoCommon: handle asset memory going over reserved limit correctly
This commit is contained in:
commit
21300bb21b
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue