From e32213d031f30e82d2d19ce26ef3a0262c061bd8 Mon Sep 17 00:00:00 2001 From: TellowKrinkle Date: Mon, 13 Jun 2022 00:56:25 -0500 Subject: [PATCH] VideoBackends:Metal: Create samplers on demand --- Source/Core/VideoBackends/Metal/MTLObjectCache.h | 8 +++++++- Source/Core/VideoBackends/Metal/MTLObjectCache.mm | 15 ++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Source/Core/VideoBackends/Metal/MTLObjectCache.h b/Source/Core/VideoBackends/Metal/MTLObjectCache.h index d8a10d2d51..2f2bcd48dc 100644 --- a/Source/Core/VideoBackends/Metal/MTLObjectCache.h +++ b/Source/Core/VideoBackends/Metal/MTLObjectCache.h @@ -76,13 +76,19 @@ public: id GetDepthStencil(DepthStencilSelector sel) { return m_dss[sel.value]; } - id GetSampler(SamplerSelector sel) { return m_samplers[sel.value]; } + id GetSampler(SamplerSelector sel) + { + if (__builtin_expect(!m_samplers[sel.value], false)) + m_samplers[sel.value] = CreateSampler(sel); + return m_samplers[sel.value]; + } id GetSampler(SamplerState state) { return GetSampler(SamplerSelector(state)); } void ReloadSamplers(); private: + MRCOwned> CreateSampler(SamplerSelector sel); MRCOwned> m_dss[DepthStencilSelector::N_VALUES]; MRCOwned> m_samplers[SamplerSelector::N_VALUES]; }; diff --git a/Source/Core/VideoBackends/Metal/MTLObjectCache.mm b/Source/Core/VideoBackends/Metal/MTLObjectCache.mm index 22809f5937..afee912016 100644 --- a/Source/Core/VideoBackends/Metal/MTLObjectCache.mm +++ b/Source/Core/VideoBackends/Metal/MTLObjectCache.mm @@ -11,12 +11,10 @@ std::unique_ptr Metal::g_object_cache; static void SetupDepthStencil( MRCOwned> (&dss)[Metal::DepthStencilSelector::N_VALUES]); -static void SetupSamplers(MRCOwned> (&samplers)[Metal::SamplerSelector::N_VALUES]); Metal::ObjectCache::ObjectCache() { SetupDepthStencil(m_dss); - SetupSamplers(m_samplers); } Metal::ObjectCache::~ObjectCache() @@ -147,13 +145,11 @@ static const char* to_string(WrapMode wrap) // clang-format on -static void SetupSamplers(MRCOwned> (&samplers)[Metal::SamplerSelector::N_VALUES]) +MRCOwned> Metal::ObjectCache::CreateSampler(SamplerSelector sel) { - auto desc = MRCTransfer([MTLSamplerDescriptor new]); - Metal::SamplerSelector sel; - for (size_t i = 0; i < std::size(samplers); i++) + @autoreleasepool { - sel.value = i; + auto desc = MRCTransfer([MTLSamplerDescriptor new]); [desc setMinFilter:ConvertMinMag(sel.MinFilter())]; [desc setMagFilter:ConvertMinMag(sel.MagFilter())]; [desc setMipFilter:ConvertMip(sel.MipFilter())]; @@ -165,11 +161,12 @@ static void SetupSamplers(MRCOwned> (&samplers)[Metal::Sampl to_string(sel.MagFilter()), to_string(sel.MipFilter()), to_string(sel.WrapU()), to_string(sel.WrapV()), sel.AnisotropicFiltering() ? "(AF)" : ""])]; - samplers[i] = MRCTransfer([Metal::g_device newSamplerStateWithDescriptor:desc]); + return MRCTransfer([Metal::g_device newSamplerStateWithDescriptor:desc]); } } void Metal::ObjectCache::ReloadSamplers() { - SetupSamplers(m_samplers); + for (auto& sampler : m_samplers) + sampler = nullptr; }