From 989ecca23539cc6714daad3625445e30cd3b153a Mon Sep 17 00:00:00 2001 From: iwubcode Date: Sun, 2 Nov 2025 14:39:33 -0600 Subject: [PATCH] VideoCommon: add a texture pool for resource management --- Source/Core/DolphinLib.props | 2 + Source/Core/VideoCommon/CMakeLists.txt | 2 + .../VideoCommon/Resources/TexturePool.cpp | 43 +++++++++++++++++++ .../Core/VideoCommon/Resources/TexturePool.h | 25 +++++++++++ 4 files changed, 72 insertions(+) create mode 100644 Source/Core/VideoCommon/Resources/TexturePool.cpp create mode 100644 Source/Core/VideoCommon/Resources/TexturePool.h diff --git a/Source/Core/DolphinLib.props b/Source/Core/DolphinLib.props index e8ca03d4bdf..0ce79918aa5 100644 --- a/Source/Core/DolphinLib.props +++ b/Source/Core/DolphinLib.props @@ -756,6 +756,7 @@ + @@ -1409,6 +1410,7 @@ + diff --git a/Source/Core/VideoCommon/CMakeLists.txt b/Source/Core/VideoCommon/CMakeLists.txt index 4830c671131..1b0906ca198 100644 --- a/Source/Core/VideoCommon/CMakeLists.txt +++ b/Source/Core/VideoCommon/CMakeLists.txt @@ -152,6 +152,8 @@ add_library(videocommon Resources/Resource.h Resources/TextureDataResource.cpp Resources/TextureDataResource.h + Resources/TexturePool.cpp + Resources/TexturePool.h ShaderCache.cpp ShaderCache.h ShaderCompileUtils.cpp diff --git a/Source/Core/VideoCommon/Resources/TexturePool.cpp b/Source/Core/VideoCommon/Resources/TexturePool.cpp new file mode 100644 index 00000000000..ce76dc5b24b --- /dev/null +++ b/Source/Core/VideoCommon/Resources/TexturePool.cpp @@ -0,0 +1,43 @@ +// Copyright 2025 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "VideoCommon/Resources/TexturePool.h" + +#include "Common/Logging/Log.h" + +#include "VideoCommon/AbstractGfx.h" +#include "VideoCommon/AbstractTexture.h" + +namespace VideoCommon +{ +void TexturePool::Reset() +{ + m_cache.clear(); +} + +std::unique_ptr TexturePool::AllocateTexture(const TextureConfig& config) +{ + const auto iter = m_cache.find(config); + if (iter != m_cache.end()) + { + auto entry = std::move(iter->second); + m_cache.erase(iter); + return entry; + } + + std::unique_ptr texture = g_gfx->CreateTexture(config); + if (!texture) + { + ERROR_LOG_FMT(VIDEO, "Failed to allocate a {}x{}x{} texture", config.width, config.height, + config.layers); + return {}; + } + return texture; +} + +void TexturePool::ReleaseTexture(std::unique_ptr texture) +{ + auto config = texture->GetConfig(); + (void)m_cache.emplace(config, std::move(texture)); +} +} // namespace VideoCommon diff --git a/Source/Core/VideoCommon/Resources/TexturePool.h b/Source/Core/VideoCommon/Resources/TexturePool.h new file mode 100644 index 00000000000..6040a3ae760 --- /dev/null +++ b/Source/Core/VideoCommon/Resources/TexturePool.h @@ -0,0 +1,25 @@ +// Copyright 2025 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +#include "VideoCommon/AbstractTexture.h" +#include "VideoCommon/TextureConfig.h" + +namespace VideoCommon +{ +class TexturePool +{ +public: + void Reset(); + + std::unique_ptr AllocateTexture(const TextureConfig& config); + void ReleaseTexture(std::unique_ptr texture); + +private: + std::unordered_multimap> m_cache; +}; +} // namespace VideoCommon