diff --git a/src/GameKit.RenderOrchestration/DefaultRenderManager.cs b/src/GameKit.RenderOrchestration/DefaultRenderManager.cs index 12241ae..1e1fdc1 100644 --- a/src/GameKit.RenderOrchestration/DefaultRenderManager.cs +++ b/src/GameKit.RenderOrchestration/DefaultRenderManager.cs @@ -1,4 +1,5 @@ using GameKit.App; +using GameKit.DependencyInjection; using GameKit.Gpu; namespace GameKit.RenderOrchestration; @@ -12,16 +13,16 @@ public class DefaultRenderManager : IRenderManager { private readonly GpuMemorySystem _gpuMemorySystem; private readonly IRenderContextProvider _renderContextProvider; - private readonly RenderPhaseRegistry _renderPhaseRegistry; + private readonly ServiceRegistry> _renderPhases; internal DefaultRenderManager( GpuMemorySystem gpuMemorySystem, IRenderContextProvider renderContextProvider, - RenderPhaseRegistry renderPhaseRegistry) + ServiceRegistry> renderPhases) { _gpuMemorySystem = gpuMemorySystem; _renderContextProvider = renderContextProvider; - _renderPhaseRegistry = renderPhaseRegistry; + _renderPhases = renderPhases; } /// @@ -36,7 +37,10 @@ public void Execute() using (renderContext) { - _renderPhaseRegistry.Render(renderContext); + foreach (IRenderPhase renderPhase in _renderPhases) + { + renderPhase.Render(renderContext); + } // submit all pending changes before renderContext is disposed _gpuMemorySystem.Submit(); diff --git a/src/GameKit.RenderOrchestration/GameKitAppBuilderExtensions.cs b/src/GameKit.RenderOrchestration/GameKitAppBuilderExtensions.cs index 005282e..1fb5e93 100644 --- a/src/GameKit.RenderOrchestration/GameKitAppBuilderExtensions.cs +++ b/src/GameKit.RenderOrchestration/GameKitAppBuilderExtensions.cs @@ -8,25 +8,12 @@ public static class GameKitAppBuilderExtensions { public static GameKitAppBuilder UseDefaultRenderManager(this GameKitAppBuilder builder) where TRenderContext: IRenderContext { - RenderPhaseRegistry renderPhaseRegistry = new(); - builder.OnActivated((instance, _) => - { - if (instance is IRenderPhase renderPhase) - { - renderPhaseRegistry.Register(renderPhase); - } - }); - builder.OnDisposing((instance, _) => - { - if (instance is IRenderPhase renderPhase) - { - renderPhaseRegistry.Unregister(renderPhase); - } - }); + builder.AddRegistry>( + static (left, right) => left.Order.CompareTo(right.Order)); builder.AddSingleton(sp => new DefaultRenderManager( sp.GetRequiredService(), sp.GetRequiredService>(), - renderPhaseRegistry)); + sp.GetRequiredService>>())); return builder; } diff --git a/src/GameKit.RenderOrchestration/RenderPhaseRegistry.cs b/src/GameKit.RenderOrchestration/RenderPhaseRegistry.cs deleted file mode 100644 index e982635..0000000 --- a/src/GameKit.RenderOrchestration/RenderPhaseRegistry.cs +++ /dev/null @@ -1,72 +0,0 @@ -namespace GameKit.RenderOrchestration; - -internal sealed class RenderPhaseRegistry - where TRenderContext : IRenderContext -{ - private readonly List?> _renderPhases = new(); - private bool _dirty; - - public void Register(IRenderPhase renderPhase) - { - for (int i = 0; i < _renderPhases.Count; i++) - { - IRenderPhase? existingRenderPhase = _renderPhases[i]; - if (ReferenceEquals(existingRenderPhase, renderPhase)) - { - return; - } - } - - _renderPhases.Add(renderPhase); - _dirty = true; - } - - public void Unregister(IRenderPhase renderPhase) - { - for (int i = 0; i < _renderPhases.Count; i++) - { - if (ReferenceEquals(_renderPhases[i], renderPhase)) - { - _renderPhases[i] = null; - _dirty = true; - return; - } - } - } - - public void Render(TRenderContext renderContext) - { - Normalize(); - - int renderPhaseCount = _renderPhases.Count; - for (int i = 0; i < renderPhaseCount; i++) - { - IRenderPhase? renderPhase = _renderPhases[i]; - if (renderPhase == null) - { - continue; - } - - renderPhase.Render(renderContext); - } - } - - private void Normalize() - { - if (!_dirty) - { - return; - } - - for (int i = _renderPhases.Count - 1; i >= 0; i--) - { - if (_renderPhases[i] == null) - { - _renderPhases.RemoveAt(i); - } - } - - _renderPhases.Sort(static (left, right) => left!.Order.CompareTo(right!.Order)); - _dirty = false; - } -}