49 lines
1.4 KiB
C#
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;
|
|
}
|
|
}
|