refactor(app): compose world rendering startup
Move Region/environment, mandatory modern rendering, terrain, WB, texture, and sampler construction behind the typed Phase-4 composition boundary. Give every fallible GL constructor prefix retryable ownership so partial startup failure cannot leak or replay resource deletion while preserving the accepted render path and DAT inputs. Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
parent
cd7b519f78
commit
6a2fe98cc4
22 changed files with 1983 additions and 634 deletions
|
|
@ -31,6 +31,7 @@ namespace AcDream.App.Rendering;
|
|||
public sealed class SamplerCache : IDisposable
|
||||
{
|
||||
private readonly GL _gl;
|
||||
private readonly ResourceCleanupGroup _resources;
|
||||
|
||||
/// <summary>Sampler with WrapS = WrapT = Repeat. The default for textures uploaded by <see cref="TextureCache"/>.</summary>
|
||||
public uint Wrap { get; }
|
||||
|
|
@ -41,23 +42,62 @@ public sealed class SamplerCache : IDisposable
|
|||
public SamplerCache(GL gl)
|
||||
{
|
||||
_gl = gl ?? throw new ArgumentNullException(nameof(gl));
|
||||
var resources = new ResourceCleanupGroup();
|
||||
uint wrap = 0;
|
||||
uint clamp = 0;
|
||||
try
|
||||
{
|
||||
wrap = GlResourceCommand.CreateName(
|
||||
_gl,
|
||||
"repeat sampler",
|
||||
_gl.GenSampler,
|
||||
_gl.DeleteSampler);
|
||||
uint ownedWrap = wrap;
|
||||
resources.Add(
|
||||
"repeat sampler",
|
||||
() => GlResourceCommand.Execute(
|
||||
_gl,
|
||||
$"delete repeat sampler {ownedWrap}",
|
||||
() => _gl.DeleteSampler(ownedWrap)));
|
||||
Configure(wrap, TextureWrapMode.Repeat, "repeat sampler");
|
||||
|
||||
Wrap = _gl.GenSampler();
|
||||
_gl.SamplerParameter(Wrap, SamplerParameterI.WrapS, (int)TextureWrapMode.Repeat);
|
||||
_gl.SamplerParameter(Wrap, SamplerParameterI.WrapT, (int)TextureWrapMode.Repeat);
|
||||
_gl.SamplerParameter(Wrap, SamplerParameterI.MinFilter, (int)TextureMinFilter.Linear);
|
||||
_gl.SamplerParameter(Wrap, SamplerParameterI.MagFilter, (int)TextureMagFilter.Linear);
|
||||
clamp = GlResourceCommand.CreateName(
|
||||
_gl,
|
||||
"clamp sampler",
|
||||
_gl.GenSampler,
|
||||
_gl.DeleteSampler);
|
||||
uint ownedClamp = clamp;
|
||||
resources.Add(
|
||||
"clamp sampler",
|
||||
() => GlResourceCommand.Execute(
|
||||
_gl,
|
||||
$"delete clamp sampler {ownedClamp}",
|
||||
() => _gl.DeleteSampler(ownedClamp)));
|
||||
Configure(clamp, TextureWrapMode.ClampToEdge, "clamp sampler");
|
||||
}
|
||||
catch (Exception constructionFailure)
|
||||
{
|
||||
resources.RollbackConstructionAndThrow(
|
||||
"SamplerCache construction failed and its sampler prefix did not cleanly roll back.",
|
||||
constructionFailure);
|
||||
}
|
||||
|
||||
Clamp = _gl.GenSampler();
|
||||
_gl.SamplerParameter(Clamp, SamplerParameterI.WrapS, (int)TextureWrapMode.ClampToEdge);
|
||||
_gl.SamplerParameter(Clamp, SamplerParameterI.WrapT, (int)TextureWrapMode.ClampToEdge);
|
||||
_gl.SamplerParameter(Clamp, SamplerParameterI.MinFilter, (int)TextureMinFilter.Linear);
|
||||
_gl.SamplerParameter(Clamp, SamplerParameterI.MagFilter, (int)TextureMagFilter.Linear);
|
||||
Wrap = wrap;
|
||||
Clamp = clamp;
|
||||
_resources = resources;
|
||||
}
|
||||
|
||||
private void Configure(uint sampler, TextureWrapMode wrap, string name) =>
|
||||
GlResourceCommand.Execute(_gl, $"configure {name}", () =>
|
||||
{
|
||||
_gl.SamplerParameter(sampler, SamplerParameterI.WrapS, (int)wrap);
|
||||
_gl.SamplerParameter(sampler, SamplerParameterI.WrapT, (int)wrap);
|
||||
_gl.SamplerParameter(sampler, SamplerParameterI.MinFilter, (int)TextureMinFilter.Linear);
|
||||
_gl.SamplerParameter(sampler, SamplerParameterI.MagFilter, (int)TextureMagFilter.Linear);
|
||||
});
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (Wrap != 0) _gl.DeleteSampler(Wrap);
|
||||
if (Clamp != 0) _gl.DeleteSampler(Clamp);
|
||||
_resources.RetryCleanup();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue