diff --git a/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs b/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs
index e66a8c016c..b910f708a2 100644
--- a/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs
+++ b/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs
@@ -10,6 +10,7 @@ using osu.Framework.Audio;
using osu.Framework.Audio.Sample;
using osu.Framework.Bindables;
using osu.Framework.Graphics.OpenGL.Textures;
+using osu.Framework.Graphics.Shaders;
using osu.Framework.Graphics.Textures;
using osu.Framework.IO.Stores;
using osu.Framework.Platform;
@@ -34,6 +35,11 @@ namespace osu.Game.Rulesets.UI
///
public ISampleStore SampleStore { get; }
+ ///
+ /// The shader manager to be used for the ruleset.
+ ///
+ public ShaderManager ShaderManager { get; }
+
///
/// The ruleset config manager.
///
@@ -52,6 +58,9 @@ namespace osu.Game.Rulesets.UI
SampleStore = parent.Get().GetSampleStore(new NamespacedResourceStore(resources, @"Samples"));
SampleStore.PlaybackConcurrency = OsuGameBase.SAMPLE_CONCURRENCY;
CacheAs(SampleStore = new FallbackSampleStore(SampleStore, parent.Get()));
+
+ ShaderManager = new ShaderManager(new NamespacedResourceStore(resources, @"Shaders"));
+ CacheAs(ShaderManager = new FallbackShaderManager(ShaderManager, parent.Get()));
}
RulesetConfigManager = parent.Get().GetConfigFor(ruleset);
@@ -84,6 +93,7 @@ namespace osu.Game.Rulesets.UI
SampleStore?.Dispose();
TextureStore?.Dispose();
+ ShaderManager?.Dispose();
RulesetConfigManager = null;
}
@@ -172,5 +182,25 @@ namespace osu.Game.Rulesets.UI
primary?.Dispose();
}
}
+
+ private class FallbackShaderManager : ShaderManager
+ {
+ private readonly ShaderManager primary;
+ private readonly ShaderManager fallback;
+
+ public FallbackShaderManager(ShaderManager primary, ShaderManager fallback)
+ {
+ this.primary = primary;
+ this.fallback = fallback;
+ }
+
+ public override byte[] LoadRaw(string name) => primary.LoadRaw(name) ?? fallback.LoadRaw(name);
+
+ protected override void Dispose(bool disposing)
+ {
+ base.Dispose(disposing);
+ primary?.Dispose();
+ }
+ }
}
}