From 295a6ed9fd07f3791c2a71db5ae1776775a4a5bf Mon Sep 17 00:00:00 2001 From: Samuliak Date: Sat, 19 Oct 2024 09:39:55 +0200 Subject: [PATCH] only add pipeline to cache if compilation was attempted --- .../HW/Latte/Renderer/Metal/MetalPipelineCache.cpp | 11 ++++++++--- .../HW/Latte/Renderer/Metal/MetalPipelineCompiler.cpp | 5 ++++- .../HW/Latte/Renderer/Metal/MetalPipelineCompiler.h | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCache.cpp b/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCache.cpp index 214c822f..07277e68 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCache.cpp +++ b/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCache.cpp @@ -50,13 +50,16 @@ MTL::RenderPipelineState* MetalPipelineCache::GetRenderPipelineState(const Latte MetalPipelineCompiler compiler(m_mtlr); bool fbosMatch; compiler.InitFromState(fetchShader, vertexShader, geometryShader, pixelShader, lastUsedAttachmentsInfo, activeAttachmentsInfo, lcr, fbosMatch); - MTL::RenderPipelineState* pipeline = compiler.Compile(false, true, true); + bool attemptedCompilation = false; + MTL::RenderPipelineState* pipeline = compiler.Compile(false, true, true, attemptedCompilation); // If FBOs don't match, it wouldn't be possible to reconstruct the pipeline from the cache if (fbosMatch) AddCurrentStateToCache(hash); - m_pipelineCache.insert({hash, pipeline}); + // Place the pipeline to the cache if the compilation was at least attempted + if (attemptedCompilation) + m_pipelineCache.insert({hash, pipeline}); return pipeline; } @@ -374,7 +377,9 @@ void MetalPipelineCache::LoadPipelineFromCache(std::span fileData) // s_spinlockSharedInternal.unlock(); // return; //} - pipeline = pp.Compile(true, true, false); + bool attemptedCompilation = false; + pipeline = pp.Compile(true, true, false, attemptedCompilation); + cemu_assert_debug(attemptedCompilation); // destroy pp early } diff --git a/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCompiler.cpp b/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCompiler.cpp index d4635885..73b86fe9 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCompiler.cpp +++ b/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCompiler.cpp @@ -332,7 +332,7 @@ void MetalPipelineCompiler::InitFromState(const LatteFetchShader* fetchShader, c InitFromStateRender(fetchShader, vertexShader, lastUsedAttachmentsInfo, activeAttachmentsInfo, lcr, fbosMatch); } -MTL::RenderPipelineState* MetalPipelineCompiler::Compile(bool forceCompile, bool isRenderThread, bool showInOverlay) +MTL::RenderPipelineState* MetalPipelineCompiler::Compile(bool forceCompile, bool isRenderThread, bool showInOverlay, bool& attemptedCompilation) { if (forceCompile) { @@ -408,6 +408,9 @@ MTL::RenderPipelineState* MetalPipelineCompiler::Compile(bool forceCompile, bool g_compiling_pipelines++; } + // Inform the pipeline cache that compilation was at least attempted + attemptedCompilation = true; + return pipeline; } diff --git a/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCompiler.h b/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCompiler.h index 5965c764..e4067555 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCompiler.h +++ b/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCompiler.h @@ -13,7 +13,7 @@ public: void InitFromState(const LatteFetchShader* fetchShader, const LatteDecompilerShader* vertexShader, const LatteDecompilerShader* geometryShader, const LatteDecompilerShader* pixelShader, const class MetalAttachmentsInfo& lastUsedAttachmentsInfo, const class MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr, bool& fbosMatch); - MTL::RenderPipelineState* Compile(bool forceCompile, bool isRenderThread, bool showInOverlay); + MTL::RenderPipelineState* Compile(bool forceCompile, bool isRenderThread, bool showInOverlay, bool& attemptedCompilation); private: class MetalRenderer* m_mtlr;