From 49a9c33bd75df2b8cebd58eab10f140c79a8f65c Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 30 Sep 2017 16:25:36 +1000 Subject: [PATCH] VideoCommon: Move abstract texture creation function to Renderer --- Source/Core/VideoBackends/D3D/Render.cpp | 5 +++++ Source/Core/VideoBackends/D3D/Render.h | 2 ++ Source/Core/VideoBackends/D3D/TextureCache.cpp | 5 ----- Source/Core/VideoBackends/D3D/TextureCache.h | 2 -- Source/Core/VideoBackends/Null/Render.cpp | 6 ++++++ Source/Core/VideoBackends/Null/Render.h | 2 ++ Source/Core/VideoBackends/Null/TextureCache.h | 6 ------ Source/Core/VideoBackends/OGL/OGLTexture.cpp | 1 - Source/Core/VideoBackends/OGL/Render.cpp | 5 +++++ Source/Core/VideoBackends/OGL/Render.h | 2 ++ Source/Core/VideoBackends/OGL/TextureCache.cpp | 5 ----- Source/Core/VideoBackends/OGL/TextureCache.h | 1 - Source/Core/VideoBackends/Software/SWRenderer.cpp | 6 ++++++ Source/Core/VideoBackends/Software/SWRenderer.h | 2 ++ Source/Core/VideoBackends/Software/TextureCache.h | 5 ----- Source/Core/VideoBackends/Vulkan/Renderer.cpp | 5 +++++ Source/Core/VideoBackends/Vulkan/Renderer.h | 2 ++ Source/Core/VideoBackends/Vulkan/TextureCache.cpp | 5 ----- Source/Core/VideoBackends/Vulkan/TextureCache.h | 2 -- Source/Core/VideoCommon/RenderBase.cpp | 2 +- Source/Core/VideoCommon/RenderBase.h | 3 +++ Source/Core/VideoCommon/TextureCacheBase.cpp | 2 +- Source/Core/VideoCommon/TextureCacheBase.h | 2 -- Source/Core/VideoCommon/TextureConfig.h | 7 +++++++ 24 files changed, 49 insertions(+), 36 deletions(-) diff --git a/Source/Core/VideoBackends/D3D/Render.cpp b/Source/Core/VideoBackends/D3D/Render.cpp index 3c27a41d85..0bddc4cd40 100644 --- a/Source/Core/VideoBackends/D3D/Render.cpp +++ b/Source/Core/VideoBackends/D3D/Render.cpp @@ -211,6 +211,11 @@ void Renderer::Create3DVisionTexture(int width, int height) DXGI_FORMAT_R8G8B8A8_UNORM, 1, 1, &sys_data); } +std::unique_ptr Renderer::CreateTexture(const TextureConfig& config) +{ + return std::make_unique(config); +} + void Renderer::RenderText(const std::string& text, int left, int top, u32 color) { D3D::DrawTextScaled(static_cast(left + 1), static_cast(top + 1), 20.f, 0.0f, diff --git a/Source/Core/VideoBackends/D3D/Render.h b/Source/Core/VideoBackends/D3D/Render.h index 333ff9a80c..527fd1f4fc 100644 --- a/Source/Core/VideoBackends/D3D/Render.h +++ b/Source/Core/VideoBackends/D3D/Render.h @@ -22,6 +22,8 @@ public: ~Renderer() override; StateCache& GetStateCache() { return m_state_cache; } + std::unique_ptr CreateTexture(const TextureConfig& config) override; + void SetBlendingState(const BlendingState& state) override; void SetScissorRect(const EFBRectangle& rc) override; void SetRasterizationState(const RasterizationState& state) override; diff --git a/Source/Core/VideoBackends/D3D/TextureCache.cpp b/Source/Core/VideoBackends/D3D/TextureCache.cpp index 578a488bde..7d9d62cf54 100644 --- a/Source/Core/VideoBackends/D3D/TextureCache.cpp +++ b/Source/Core/VideoBackends/D3D/TextureCache.cpp @@ -33,11 +33,6 @@ static const size_t MAX_COPY_BUFFERS = 32; static ID3D11Buffer* s_efbcopycbuf[MAX_COPY_BUFFERS] = {0}; static std::unique_ptr g_encoder; -std::unique_ptr TextureCache::CreateTexture(const TextureConfig& config) -{ - return std::make_unique(config); -} - void TextureCache::CopyEFB(u8* dst, const EFBCopyParams& params, u32 native_width, u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride, const EFBRectangle& src_rect, bool scale_by_half) diff --git a/Source/Core/VideoBackends/D3D/TextureCache.h b/Source/Core/VideoBackends/D3D/TextureCache.h index afb3a1421d..cfe2efdf65 100644 --- a/Source/Core/VideoBackends/D3D/TextureCache.h +++ b/Source/Core/VideoBackends/D3D/TextureCache.h @@ -19,8 +19,6 @@ public: ~TextureCache(); private: - std::unique_ptr CreateTexture(const TextureConfig& config) override; - u64 EncodeToRamFromTexture(u32 address, void* source_texture, u32 SourceW, u32 SourceH, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle& source) diff --git a/Source/Core/VideoBackends/Null/Render.cpp b/Source/Core/VideoBackends/Null/Render.cpp index b1a88f7a80..6b045a0c6a 100644 --- a/Source/Core/VideoBackends/Null/Render.cpp +++ b/Source/Core/VideoBackends/Null/Render.cpp @@ -4,6 +4,7 @@ #include "Common/Logging/Log.h" +#include "VideoBackends/Null/NullTexture.h" #include "VideoBackends/Null/Render.h" #include "VideoCommon/VideoConfig.h" @@ -21,6 +22,11 @@ Renderer::~Renderer() UpdateActiveConfig(); } +std::unique_ptr Renderer::CreateTexture(const TextureConfig& config) +{ + return std::make_unique(config); +} + void Renderer::RenderText(const std::string& text, int left, int top, u32 color) { NOTICE_LOG(VIDEO, "RenderText: %s", text.c_str()); diff --git a/Source/Core/VideoBackends/Null/Render.h b/Source/Core/VideoBackends/Null/Render.h index 2a21918f81..9ba2ef575b 100644 --- a/Source/Core/VideoBackends/Null/Render.h +++ b/Source/Core/VideoBackends/Null/Render.h @@ -14,6 +14,8 @@ public: Renderer(); ~Renderer() override; + std::unique_ptr CreateTexture(const TextureConfig& config) override; + void RenderText(const std::string& pstr, int left, int top, u32 color) override; u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) override { return 0; } void PokeEFB(EFBAccessType type, const EfbPokeData* points, size_t num_points) override {} diff --git a/Source/Core/VideoBackends/Null/TextureCache.h b/Source/Core/VideoBackends/Null/TextureCache.h index 2b3283c056..6f09108392 100644 --- a/Source/Core/VideoBackends/Null/TextureCache.h +++ b/Source/Core/VideoBackends/Null/TextureCache.h @@ -35,12 +35,6 @@ public: bool scale_by_half, unsigned int cbuf_id, const float* colmat) override { } - -private: - std::unique_ptr CreateTexture(const TextureConfig& config) override - { - return std::make_unique(config); - } }; } // Null name space diff --git a/Source/Core/VideoBackends/OGL/OGLTexture.cpp b/Source/Core/VideoBackends/OGL/OGLTexture.cpp index 659cc9764b..40295f6f28 100644 --- a/Source/Core/VideoBackends/OGL/OGLTexture.cpp +++ b/Source/Core/VideoBackends/OGL/OGLTexture.cpp @@ -9,7 +9,6 @@ #include "VideoBackends/OGL/FramebufferManager.h" #include "VideoBackends/OGL/OGLTexture.h" -#include "VideoBackends/OGL/Render.h" #include "VideoBackends/OGL/SamplerCache.h" #include "VideoBackends/OGL/TextureCache.h" diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index ac662e456b..fff40f7abf 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -814,6 +814,11 @@ void Renderer::Init() OpenGL_CreateAttributelessVAO(); } +std::unique_ptr Renderer::CreateTexture(const TextureConfig& config) +{ + return std::make_unique(config); +} + void Renderer::RenderText(const std::string& text, int left, int top, u32 color) { u32 backbuffer_width = std::max(GLInterface->GetBackBufferWidth(), 1u); diff --git a/Source/Core/VideoBackends/OGL/Render.h b/Source/Core/VideoBackends/OGL/Render.h index 725cc7a639..2e60df3f6d 100644 --- a/Source/Core/VideoBackends/OGL/Render.h +++ b/Source/Core/VideoBackends/OGL/Render.h @@ -77,6 +77,8 @@ public: void Init(); void Shutdown(); + std::unique_ptr CreateTexture(const TextureConfig& config) override; + void SetBlendingState(const BlendingState& state) override; void SetScissorRect(const EFBRectangle& rc) override; void SetRasterizationState(const RasterizationState& state) override; diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp index 8e4811bbc1..ba945f8043 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.cpp +++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp @@ -33,11 +33,6 @@ namespace OGL { //#define TIME_TEXTURE_DECODING 1 -std::unique_ptr TextureCache::CreateTexture(const TextureConfig& config) -{ - return std::make_unique(config); -} - void TextureCache::CopyEFB(u8* dst, const EFBCopyParams& params, u32 native_width, u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride, const EFBRectangle& src_rect, bool scale_by_half) diff --git a/Source/Core/VideoBackends/OGL/TextureCache.h b/Source/Core/VideoBackends/OGL/TextureCache.h index ca9038f296..ae848c8c9c 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.h +++ b/Source/Core/VideoBackends/OGL/TextureCache.h @@ -59,7 +59,6 @@ private: bool valid = false; }; - std::unique_ptr CreateTexture(const TextureConfig& config) override; void ConvertTexture(TCacheEntry* destination, TCacheEntry* source, const void* palette, TLUTFormat format) override; diff --git a/Source/Core/VideoBackends/Software/SWRenderer.cpp b/Source/Core/VideoBackends/Software/SWRenderer.cpp index 69523efe78..ea7ccaba7c 100644 --- a/Source/Core/VideoBackends/Software/SWRenderer.cpp +++ b/Source/Core/VideoBackends/Software/SWRenderer.cpp @@ -14,6 +14,7 @@ #include "VideoBackends/Software/EfbCopy.h" #include "VideoBackends/Software/EfbInterface.h" #include "VideoBackends/Software/SWOGLWindow.h" +#include "VideoBackends/Software/SWTexture.h" #include "VideoCommon/BoundingBox.h" #include "VideoCommon/OnScreenDisplay.h" @@ -34,6 +35,11 @@ void SWRenderer::Shutdown() UpdateActiveConfig(); } +std::unique_ptr SWRenderer::CreateTexture(const TextureConfig& config) +{ + return std::make_unique(config); +} + void SWRenderer::RenderText(const std::string& pstr, int left, int top, u32 color) { SWOGLWindow::s_instance->PrintText(pstr, left, top, color); diff --git a/Source/Core/VideoBackends/Software/SWRenderer.h b/Source/Core/VideoBackends/Software/SWRenderer.h index a87531fcab..ac8764e0c7 100644 --- a/Source/Core/VideoBackends/Software/SWRenderer.h +++ b/Source/Core/VideoBackends/Software/SWRenderer.h @@ -16,6 +16,8 @@ public: static void Init(); static void Shutdown(); + std::unique_ptr CreateTexture(const TextureConfig& config) override; + void RenderText(const std::string& pstr, int left, int top, u32 color) override; u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) override; void PokeEFB(EFBAccessType type, const EfbPokeData* points, size_t num_points) override {} diff --git a/Source/Core/VideoBackends/Software/TextureCache.h b/Source/Core/VideoBackends/Software/TextureCache.h index 3573d36ebb..49612394c2 100644 --- a/Source/Core/VideoBackends/Software/TextureCache.h +++ b/Source/Core/VideoBackends/Software/TextureCache.h @@ -25,11 +25,6 @@ public: } private: - std::unique_ptr CreateTexture(const TextureConfig& config) override - { - return std::make_unique(config); - } - void CopyEFBToCacheEntry(TCacheEntry* entry, bool is_depth_copy, const EFBRectangle& src_rect, bool scale_by_half, unsigned int cbuf_id, const float* colmat) override { diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index 8f83e2b202..0bb1640f47 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -159,6 +159,11 @@ void Renderer::DestroySemaphores() } } +std::unique_ptr Renderer::CreateTexture(const TextureConfig& config) +{ + return VKTexture::Create(config); +} + void Renderer::RenderText(const std::string& text, int left, int top, u32 color) { u32 backbuffer_width = m_swap_chain->GetWidth(); diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.h b/Source/Core/VideoBackends/Vulkan/Renderer.h index e8b7952e7d..250e76634d 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.h +++ b/Source/Core/VideoBackends/Vulkan/Renderer.h @@ -32,6 +32,8 @@ public: static Renderer* GetInstance(); + std::unique_ptr CreateTexture(const TextureConfig& config) override; + SwapChain* GetSwapChain() const { return m_swap_chain.get(); } BoundingBox* GetBoundingBox() const { return m_bounding_box.get(); } bool Initialize(); diff --git a/Source/Core/VideoBackends/Vulkan/TextureCache.cpp b/Source/Core/VideoBackends/Vulkan/TextureCache.cpp index 1d8221f646..5a396ee4b2 100644 --- a/Source/Core/VideoBackends/Vulkan/TextureCache.cpp +++ b/Source/Core/VideoBackends/Vulkan/TextureCache.cpp @@ -178,11 +178,6 @@ void TextureCache::DecodeTextureOnGPU(TCacheEntry* entry, u32 dst_level, const u } } -std::unique_ptr TextureCache::CreateTexture(const TextureConfig& config) -{ - return VKTexture::Create(config); -} - bool TextureCache::CreateRenderPasses() { static constexpr VkAttachmentDescription update_attachment = { diff --git a/Source/Core/VideoBackends/Vulkan/TextureCache.h b/Source/Core/VideoBackends/Vulkan/TextureCache.h index 9bfa2da04e..12bf088ad1 100644 --- a/Source/Core/VideoBackends/Vulkan/TextureCache.h +++ b/Source/Core/VideoBackends/Vulkan/TextureCache.h @@ -31,8 +31,6 @@ public: bool CompileShaders() override; void DeleteShaders() override; - std::unique_ptr CreateTexture(const TextureConfig& config) override; - void ConvertTexture(TCacheEntry* destination, TCacheEntry* source, const void* palette, TLUTFormat format) override; diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp index 4a46475344..6f3e23923c 100644 --- a/Source/Core/VideoCommon/RenderBase.cpp +++ b/Source/Core/VideoCommon/RenderBase.cpp @@ -731,7 +731,7 @@ void Renderer::UpdateFrameDumpTexture() config.width = target_width; config.height = target_height; config.rendertarget = true; - m_dump_texture = g_texture_cache->CreateTexture(config); + m_dump_texture = CreateTexture(config); } m_dump_texture->CopyRectangleFromTexture(m_last_xfb_texture, m_last_xfb_region, EFBRectangle{0, 0, target_width, target_height}); diff --git a/Source/Core/VideoCommon/RenderBase.h b/Source/Core/VideoCommon/RenderBase.h index b622372b90..7158f3f18e 100644 --- a/Source/Core/VideoCommon/RenderBase.h +++ b/Source/Core/VideoCommon/RenderBase.h @@ -35,6 +35,7 @@ class AbstractRawTexture; class AbstractTexture; class PostProcessingShaderImplementation; +struct TextureConfig; enum class EFBAccessType; struct EfbPokeData @@ -79,6 +80,8 @@ public: virtual void RestoreState() {} virtual void ResetAPIState() {} virtual void RestoreAPIState() {} + virtual std::unique_ptr CreateTexture(const TextureConfig& config) = 0; + // Ideal internal resolution - multiple of the native EFB resolution int GetTargetWidth() const { return m_target_width; } int GetTargetHeight() const { return m_target_height; } diff --git a/Source/Core/VideoCommon/TextureCacheBase.cpp b/Source/Core/VideoCommon/TextureCacheBase.cpp index 7e3f7b25c0..521f5816f1 100644 --- a/Source/Core/VideoCommon/TextureCacheBase.cpp +++ b/Source/Core/VideoCommon/TextureCacheBase.cpp @@ -2090,7 +2090,7 @@ std::unique_ptr TextureCacheBase::AllocateTexture(const Texture } else { - entry = CreateTexture(config); + entry = g_renderer->CreateTexture(config); if (!entry) return nullptr; diff --git a/Source/Core/VideoCommon/TextureCacheBase.h b/Source/Core/VideoCommon/TextureCacheBase.h index a9700ad68c..38666faf77 100644 --- a/Source/Core/VideoCommon/TextureCacheBase.h +++ b/Source/Core/VideoCommon/TextureCacheBase.h @@ -273,8 +273,6 @@ public: void ScaleTextureCacheEntryTo(TCacheEntry* entry, u32 new_width, u32 new_height); - virtual std::unique_ptr CreateTexture(const TextureConfig& config) = 0; - protected: TextureCacheBase(); diff --git a/Source/Core/VideoCommon/TextureConfig.h b/Source/Core/VideoCommon/TextureConfig.h index 86ea88f651..fa2d60c494 100644 --- a/Source/Core/VideoCommon/TextureConfig.h +++ b/Source/Core/VideoCommon/TextureConfig.h @@ -22,6 +22,13 @@ enum class AbstractTextureFormat : u32 struct TextureConfig { constexpr TextureConfig() = default; + constexpr TextureConfig(u32 width_, u32 height_, u32 levels_, u32 layers_, + AbstractTextureFormat format_, bool rendertarget_) + : width(width_), height(height_), levels(levels_), layers(layers_), format(format_), + rendertarget(rendertarget_) + { + } + bool operator==(const TextureConfig& o) const; MathUtil::Rectangle GetRect() const;