diff options
| author | TellowKrinkle <tellowkrinkle@gmail.com> | 2022-06-13 00:56:25 -0500 |
|---|---|---|
| committer | TellowKrinkle <tellowkrinkle@gmail.com> | 2022-07-21 20:44:19 -0500 |
| commit | e32213d031f30e82d2d19ce26ef3a0262c061bd8 (patch) | |
| tree | 6fbea4bc7dd89fc164725c84f290c0eb8162d575 /Source/Core | |
| parent | 61705b05da4b18cca54b54319cd5463e3cf945f5 (diff) | |
VideoBackends:Metal: Create samplers on demand
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/VideoBackends/Metal/MTLObjectCache.h | 8 | ||||
| -rw-r--r-- | 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<MTLDepthStencilState> GetDepthStencil(DepthStencilSelector sel) { return m_dss[sel.value]; } - id<MTLSamplerState> GetSampler(SamplerSelector sel) { return m_samplers[sel.value]; } + id<MTLSamplerState> GetSampler(SamplerSelector sel) + { + if (__builtin_expect(!m_samplers[sel.value], false)) + m_samplers[sel.value] = CreateSampler(sel); + return m_samplers[sel.value]; + } id<MTLSamplerState> GetSampler(SamplerState state) { return GetSampler(SamplerSelector(state)); } void ReloadSamplers(); private: + MRCOwned<id<MTLSamplerState>> CreateSampler(SamplerSelector sel); MRCOwned<id<MTLDepthStencilState>> m_dss[DepthStencilSelector::N_VALUES]; MRCOwned<id<MTLSamplerState>> 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::ObjectCache> Metal::g_object_cache; static void SetupDepthStencil( MRCOwned<id<MTLDepthStencilState>> (&dss)[Metal::DepthStencilSelector::N_VALUES]); -static void SetupSamplers(MRCOwned<id<MTLSamplerState>> (&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<id<MTLSamplerState>> (&samplers)[Metal::SamplerSelector::N_VALUES]) +MRCOwned<id<MTLSamplerState>> 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<id<MTLSamplerState>> (&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; } |
