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