summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorTellowKrinkle <tellowkrinkle@gmail.com>2022-06-13 00:56:25 -0500
committerTellowKrinkle <tellowkrinkle@gmail.com>2022-07-21 20:44:19 -0500
commite32213d031f30e82d2d19ce26ef3a0262c061bd8 (patch)
tree6fbea4bc7dd89fc164725c84f290c0eb8162d575 /Source/Core
parent61705b05da4b18cca54b54319cd5463e3cf945f5 (diff)
VideoBackends:Metal: Create samplers on demand
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/VideoBackends/Metal/MTLObjectCache.h8
-rw-r--r--Source/Core/VideoBackends/Metal/MTLObjectCache.mm15
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;
}