feat(rendering): compare the incremental shadow scene
Construct Slice F's non-drawing scene only for lifecycle automation, drain accepted static and live deltas at the final update boundary, and compare exact current-path fingerprints at cadence and checkpoints. Publish bounded mismatch, journal, index, digest, and memory evidence without changing normal launches or draw submission. Release: 8,211 passed, 5 skipped.
This commit is contained in:
parent
ff5d86175f
commit
0eb6648589
21 changed files with 937 additions and 20 deletions
|
|
@ -91,6 +91,36 @@ internal sealed class NullRenderFramePostDiagnosticsPhase :
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fixed-order post-diagnostic fan-out. The shadow referee must run before
|
||||
/// lifecycle checkpoint publication so each artifact observes the comparison
|
||||
/// made against that exact completed render frame.
|
||||
/// </summary>
|
||||
internal sealed class SerialRenderFramePostDiagnosticsPhase :
|
||||
IRenderFramePostDiagnosticsPhase
|
||||
{
|
||||
private readonly IRenderFramePostDiagnosticsPhase[] _phases;
|
||||
|
||||
public SerialRenderFramePostDiagnosticsPhase(
|
||||
params IRenderFramePostDiagnosticsPhase[] phases)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(phases);
|
||||
if (phases.Length == 0 || phases.Any(static phase => phase is null))
|
||||
{
|
||||
throw new ArgumentException(
|
||||
"At least one non-null post-diagnostic phase is required.",
|
||||
nameof(phases));
|
||||
}
|
||||
_phases = [.. phases];
|
||||
}
|
||||
|
||||
public void Process(RenderFrameInput input, RenderFrameOutcome outcome)
|
||||
{
|
||||
for (int i = 0; i < _phases.Length; i++)
|
||||
_phases[i].Process(input, outcome);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes presentation transactions which may have opened before a later
|
||||
/// render phase failed. Recovery is idempotent so failures before the
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue