acdream/src/AcDream.App/Rendering/Packs/RenderPackPreparationScheduler.cs

49 lines
1.4 KiB
C#

namespace AcDream.App.Rendering.Packs;
/// <summary>
/// Schedules one complete, unpublished render-pack candidate preparation.
/// Production uses the worker scheduler so shader I/O/validation and Vulkan
/// resource creation cannot block the render-frame boundary. Tests can inject
/// a deterministic scheduler without adding sleeps or timing races.
/// </summary>
internal interface IRenderPackPreparationScheduler
{
Task Schedule(Action preparation);
}
internal sealed class ThreadPoolRenderPackPreparationScheduler :
IRenderPackPreparationScheduler
{
internal static ThreadPoolRenderPackPreparationScheduler Instance { get; } = new();
private ThreadPoolRenderPackPreparationScheduler()
{
}
public Task Schedule(Action preparation)
{
ArgumentNullException.ThrowIfNull(preparation);
return Task.Run(preparation);
}
}
/// <summary>
/// Synchronous fixture scheduler. Production composition must use
/// <see cref="ThreadPoolRenderPackPreparationScheduler"/>.
/// </summary>
internal sealed class InlineRenderPackPreparationScheduler :
IRenderPackPreparationScheduler
{
internal static InlineRenderPackPreparationScheduler Instance { get; } = new();
private InlineRenderPackPreparationScheduler()
{
}
public Task Schedule(Action preparation)
{
ArgumentNullException.ThrowIfNull(preparation);
preparation();
return Task.CompletedTask;
}
}