Skip to content

refactor(engine)!: GPU pass fusion — record-then-plan pipeline with fused shader passes - #2221

Open
yuto-trd wants to merge 125 commits into
mainfrom
speckit/004-gpu-pass-fusion-unified
Open

refactor(engine)!: GPU pass fusion — record-then-plan pipeline with fused shader passes#2221
yuto-trd wants to merge 125 commits into
mainfrom
speckit/004-gpu-pass-fusion-unified

Conversation

@yuto-trd

@yuto-trd yuto-trd commented Aug 12, 2026

Copy link
Copy Markdown
Member

Description

Replaces the five-PR stack (#2166#2171) with one branch.

Render nodes record declarative fragments in a single pass; a planner compiles them into a fused
execution plan. Previously each node pulled and rasterized its own children. Adjacent shader stages now
merge into one GPU program.

Authoring Resources bind through typed RenderResourceSlots; structural identity comes from the callback itself.
Effects 20 built-in shader effects are shader definitions, not hand-rolled SKSLShader builders.
Evidence The 61.5 MB paired-baseline tree is replaced by in-repo golden, fusion and failure suites.

Affected areas

  • Beutl.Engine (rendering / scene / track)
  • UI (Beutl.Editor, Beutl.Editor.Components, Beutl.Controls)
  • Beutl.NodeGraph (node editor)
  • Beutl.ProjectSystem (project / document persistence)
  • Build / CI / docs only

Breaking changes

Sixteen commits carry !. Migration recipes → contracts/breaking-changes.md

Kind What
Removed, no shim RenderNodeOperation, OperationWrapperRenderNode, RenderNodeProcessor, render diagnostics, the allocation preflight, the interim lowered brush/paint surfaces
Renamed Rect.TransformToClippedAABBTransformToAABB
RenderScaleContract.MapInputSupply(map)MapInputSupplyPreservingDemand(map)
Behaviour WholeSource coordinates · zero-radius Dilate/Erode · six filters gaining SupportsDirectReplay · pending Skia colour filters · custom-effect device grids · ChromaKey matching

Verification

Backend Result
macOS · Apple M3 / MoltenVK 0 failuresUnitTests 6,953, AgentToolkit 545, HeadlessUITests 271, PublicApiContractTests 128, + 7 smaller suites
Linux x86-64 · Intel UHD 630 (real Vulkan) 0 new failures
Windows x86-64 · AMD Radeon 0 new failures

Every failure on Linux and Windows reproduces at b816714d0 or lives in files this branch does not touch.
dotnet build Beutl.slnx and dotnet format --verify-no-changes are clean.

Output parity — the same-process fusion A/B in GpuPassFusionSameProcessParityHarness, plus an
out-of-tree differential harness (~5,700 scenes, 94,862 shots per side) run against target-main on all
three backends. Remaining differences are intended, precision-level, or cases where target-main is wrong.

Performance — per SC-008, measurable on demand and not asserted as a met acceptance criterion.

Fixed issues / References

Supersedes #2166, #2167, #2168, #2169, #2171.

BREAKING CHANGE: Beutl.Engine replaces the executable render-node pull model with recorded
fragments and planned execution.

  • Removed, no shim: RenderNodeOperation, OperationWrapperRenderNode, RenderNodeProcessor,
    render diagnostics, the allocation preflight, and the interim FilterEffectBrush,
    FilterEffectPen, LoweredBrush, LoweredPen, LoweredPaint, PaintedRenderCanvas and
    PaintedRenderSession. Use Brush.Resource and Pen.Resource.
  • Renamed: Rect.TransformToClippedAABB -> Rect.TransformToAABB;
    RenderScaleContract.MapInputSupply(map) -> MapInputSupplyPreservingDemand(map).
  • Added, rebuild required: OpaqueRenderBoundsContract.Source and RenderNodeContext.PaintedSource
    take an optional Thickness rasterOutset - logical room that widens only the buffer a source draws
    into, never what it publishes. Existing calls compile unchanged; both signatures moved.
  • Graphics backend: ITexture2D gains RequiresSkiaFlushForBackendInterop,
    PrepareForSkiaRendering() and PrepareForSkiaSampling(bool), none with a default implementation;
    IGraphicsContext.CreateRenderPass3D makes depthFormat a required TextureFormat? (null is a
    colour-only pass); CreateFramebuffer3D and IFramebuffer3D.DepthTexture make the depth attachment
    nullable; PipelineOptions gains SpecializationConstants.
  • Recording: RenderNode.Process returns void and publishes transaction-scoped fragment handles;
    callback authoring uses immutable *Definition<TState> objects with .Call(state, bindings);
    RenderNode.HasChanges is the only public content-invalidation signal; ConfigureNode
    consumers hold non-owning input references.
  • Rendering behaviour: ShaderDescription.WholeSource coordinates; zero-radius Dilate/Erode;
    the six built-in Skia filters that gained SupportsDirectReplay; pending Skia colour filters;
    custom-effect device grids; ChromaKey colour matching; a TextRenderNode fragment publishes
    FormattedText.ActualBounds instead of its density-dependent raster bounds, so text stops moving
    between preview scales and export; a particle covers the bounding box of its rotated source instead
    of a square of the source's longer side, and is resampled with Mitchell instead of point-sampled.
  • Affected projects: Beutl.Engine, Beutl.Editor, Beutl.Editor.Components, Beutl.Controls,
    Beutl.NodeGraph, Beutl.ProjectSystem, Beutl.AgentToolkit. In-tree consumers are migrated.
  • Migration: docs/specs/004-gpu-pass-fusion/contracts/breaking-changes.md has a recipe per
    removed surface.

Add the 004 specification, plan, research, data model, task list, and the
public-API, render-request, and breaking-change contracts.

The paired baseline/feature evidence tree the plan originally called for is not
carried in the repository: it was 61.5 MB across 267 files, and its acceptance
role is served by the in-repo golden, fusion, and failure suites that compare
fusion-disabled against fusion-enabled rendering in the same process and device.
…passes

Render nodes now record declarative fragments in one pass and a planner
compiles them into a fused execution plan, instead of each node pulling and
rasterizing its own children. Built-in current-pixel and whole-source shader
effects are authored as shader definitions and calls, so adjacent stages merge
into a single GPU program.

Resource authoring moves to definition/call objects with typed
RenderResourceSlot bindings: structural identity comes from the callback's own
identity, and per-recording values travel through call state. Drawable brushes
are materialized by the executor rather than lowered ahead of execution.

The editor's engine-resource subscription now creates, updates, and disposes
resources on the render dispatcher, and disposing a subscription cancels work
that has not started, so a resource is never created for a subscription that is
already gone. The drawable-brush thumbnail handler gained an explicit lifetime:
it rasterizes at the drawable's own bounds, rejects superseded or rolled-back
publications, and has a single resource owner.

BREAKING CHANGE: Beutl.Engine replaces legacy render descriptions, runtime
identities, manual cache controls, and named resource bindings with
definition/call objects and RenderResourceSlot bindings. RenderNodeOperation,
OperationWrapperRenderNode, and RenderNodeProcessor are removed, along with the
interim FilterEffectBrush, FilterEffectPen, LoweredBrush, LoweredPen,
LoweredPaint, PaintedRenderCanvas, and PaintedRenderSession surfaces; custom
filter effects use Brush.Resource and Pen.Resource values. Render diagnostics
and the allocation preflight are removed. Beutl.NodeGraph ConfigureNode
consumers now hold non-owning input references.
Add golden, fusion, planning, recording, cache, and failure-matrix suites for
the recorded-then-planned pipeline, plus public-API contract tests for the
definition/call surface and benchmarks for complete-request workloads.

Coverage of mechanisms this change removes is dropped with them: runtime and
cache identity, cache-output verification, the deep state-validation machinery,
name-based resource addressing, and lowered brush and paint authoring.
Copilot AI lite review requested due to automatic review settings August 12, 2026 01:57
@greptile-apps

greptile-apps Bot commented Aug 12, 2026

Copy link
Copy Markdown

Too many files changed for review (570 files, 300 file limit).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of files (300). Try reducing the number of changed files and requesting a review from Copilot again.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 570 files, which is 420 over the limit of 150.

To get a review, reduce the PR to 150 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6a8f873f-32ae-4c48-8f1c-ca81b2ea79f6

📥 Commits

Reviewing files that changed from the base of the PR and between db01de7 and f12d459.

📒 Files selected for processing (570)
  • .claude/skills/beutl-agent-source-grounding/SKILL.md
  • .claude/skills/beutl-filter-effect/SKILL.md
  • .github/workflows/dotnet.yml
  • .specify/memory/constitution.md
  • .specify/scripts/bash/common.sh
  • AGENTS.md
  • Beutl.slnx
  • docs/ai-workflow/resolution-independent-rendering.md
  • docs/specs/003-resolution-independent-pipeline/checklists/requirements.md
  • docs/specs/003-resolution-independent-pipeline/contracts/effect-scale-contract.md
  • docs/specs/003-resolution-independent-pipeline/contracts/public-api.md
  • docs/specs/003-resolution-independent-pipeline/contracts/shader-uniforms.md
  • docs/specs/003-resolution-independent-pipeline/data-model.md
  • docs/specs/003-resolution-independent-pipeline/plan.md
  • docs/specs/003-resolution-independent-pipeline/quickstart.md
  • docs/specs/003-resolution-independent-pipeline/research.md
  • docs/specs/003-resolution-independent-pipeline/spec.md
  • docs/specs/004-gpu-pass-fusion/checklists/requirements.md
  • docs/specs/004-gpu-pass-fusion/contracts/breaking-changes.md
  • docs/specs/004-gpu-pass-fusion/contracts/public-api.md
  • docs/specs/004-gpu-pass-fusion/contracts/render-request.md
  • docs/specs/004-gpu-pass-fusion/data-model.md
  • docs/specs/004-gpu-pass-fusion/plan.md
  • docs/specs/004-gpu-pass-fusion/quickstart.md
  • docs/specs/004-gpu-pass-fusion/research.md
  • docs/specs/004-gpu-pass-fusion/spec.md
  • docs/specs/004-gpu-pass-fusion/tasks.md
  • src/Beutl.AgentToolkit/Rendering/StillRenderer.cs
  • src/Beutl.AgentToolkit/Rendering/VideoExporter.cs
  • src/Beutl.AgentToolkit/Tools/QueryTools.cs
  • src/Beutl.AgentToolkit/Tools/RenderTools.cs
  • src/Beutl.Editor.Components/Helpers/EngineObjectHelper.cs
  • src/Beutl.Editor.Components/PathEditorTab/ViewModels/PathEditorViewModel.cs
  • src/Beutl.Editor.Components/PathEditorTab/Views/PathEditorTabView.axaml.cs
  • src/Beutl.Editor/Models/ExportRendererFactory.cs
  • src/Beutl.Editor/Models/FrameProviderImpl.cs
  • src/Beutl.Editor/Models/SaveFrameScale.cs
  • src/Beutl.Editor/Services/ObjectTemplatePreviewRenderer.cs
  • src/Beutl.Engine.SourceGenerators/Emit/ResourceClassEmitter.cs
  • src/Beutl.Engine/Audio/Composing/Composer.cs
  • src/Beutl.Engine/Audio/SoundGroup.cs
  • src/Beutl.Engine/Audio/SourceSound.Thumbnails.cs
  • src/Beutl.Engine/Composition/CompositionContext.cs
  • src/Beutl.Engine/Engine/EngineObject.cs
  • src/Beutl.Engine/Graphics/AudioVisualizers/AudioSpectrogramDrawable.cs
  • src/Beutl.Engine/Graphics/AudioVisualizers/AudioVisualizerDrawable.cs
  • src/Beutl.Engine/Graphics/AudioVisualizers/AudioVisualizerRenderNode.cs
  • src/Beutl.Engine/Graphics/AudioVisualizers/BarSpectrumShape.cs
  • src/Beutl.Engine/Graphics/AudioVisualizers/DotsWaveformShape.cs
  • src/Beutl.Engine/Graphics/AudioVisualizers/FilledAreaSpectrumShape.cs
  • src/Beutl.Engine/Graphics/AudioVisualizers/FilledEnvelopeWaveformShape.cs
  • src/Beutl.Engine/Graphics/AudioVisualizers/FilledMirrorWaveformShape.cs
  • src/Beutl.Engine/Graphics/AudioVisualizers/LineSpectrumShape.cs
  • src/Beutl.Engine/Graphics/AudioVisualizers/LineWaveformShape.cs
  • src/Beutl.Engine/Graphics/AudioVisualizers/MinMaxBarWaveformShape.cs
  • src/Beutl.Engine/Graphics/Backend/Composite/CompositeContext.cs
  • src/Beutl.Engine/Graphics/Backend/GraphicsContextFactory.cs
  • src/Beutl.Engine/Graphics/Backend/IFramebuffer3D.cs
  • src/Beutl.Engine/Graphics/Backend/IGraphicsContext.cs
  • src/Beutl.Engine/Graphics/Backend/IRenderPass3D.cs
  • src/Beutl.Engine/Graphics/Backend/ITexture2D.cs
  • src/Beutl.Engine/Graphics/Backend/Metal/MetalVulkanTexture2D.cs
  • src/Beutl.Engine/Graphics/Backend/PipelineOptions.cs
  • src/Beutl.Engine/Graphics/Backend/SpecializationConstant.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/IVulkanContextResource.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanBuffer.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanCommandPool.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanContext.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanDescriptorSet.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanDevice.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanFramebuffer3D.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanInstance.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanPipeline3D.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanRenderPass3D.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanSampler.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanSwapchainRenderer.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanTexture2D.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanTextureArray.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanTextureCube.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanTextureCubeArray.cs
  • src/Beutl.Engine/Graphics/Backend/Vulkan/VulkanValidationErrorLog.cs
  • src/Beutl.Engine/Graphics/BrushConstructor.cs
  • src/Beutl.Engine/Graphics/CanvasPushedState.cs
  • src/Beutl.Engine/Graphics/DrawableBrushMaterializer.cs
  • src/Beutl.Engine/Graphics/DrawableDecorator.cs
  • src/Beutl.Engine/Graphics/DrawableGroup.cs
  • src/Beutl.Engine/Graphics/DrawablePresenter.cs
  • src/Beutl.Engine/Graphics/DrawableTimeController.cs
  • src/Beutl.Engine/Graphics/FilterEffects/BuiltInColorFilterShader.cs
  • src/Beutl.Engine/Graphics/FilterEffects/ChromaKey.cs
  • src/Beutl.Engine/Graphics/FilterEffects/Clipping.cs
  • src/Beutl.Engine/Graphics/FilterEffects/ColorGrading.cs
  • src/Beutl.Engine/Graphics/FilterEffects/ColorKey.cs
  • src/Beutl.Engine/Graphics/FilterEffects/ColorMatrixShader.cs
  • src/Beutl.Engine/Graphics/FilterEffects/ColorShift.cs
  • src/Beutl.Engine/Graphics/FilterEffects/ContourTracer.cs
  • src/Beutl.Engine/Graphics/FilterEffects/Curves.cs
  • src/Beutl.Engine/Graphics/FilterEffects/CustomFilterEffectContext.cs
  • src/Beutl.Engine/Graphics/FilterEffects/DelayAnimationEffect.cs
  • src/Beutl.Engine/Graphics/FilterEffects/DisplacementMapEffect.cs
  • src/Beutl.Engine/Graphics/FilterEffects/DisplacementMapShaderFactory.cs
  • src/Beutl.Engine/Graphics/FilterEffects/DisplacementMapTransform.cs
  • src/Beutl.Engine/Graphics/FilterEffects/EffectTarget.cs
  • src/Beutl.Engine/Graphics/FilterEffects/FEImpl.cs
  • src/Beutl.Engine/Graphics/FilterEffects/FilterEffectActivator.cs
  • src/Beutl.Engine/Graphics/FilterEffects/FilterEffectContext.cs
  • src/Beutl.Engine/Graphics/FilterEffects/FilterEffectGroup.cs
  • src/Beutl.Engine/Graphics/FilterEffects/FilterEffectPresenter.cs
  • src/Beutl.Engine/Graphics/FilterEffects/FilterEffectStageFallbackExecutor.cs
  • src/Beutl.Engine/Graphics/FilterEffects/FlatShadow.cs
  • src/Beutl.Engine/Graphics/FilterEffects/GLSLFilterPipeline.cs
  • src/Beutl.Engine/Graphics/FilterEffects/GLSLScriptEffect.cs
  • src/Beutl.Engine/Graphics/FilterEffects/GLSLShader.cs
  • src/Beutl.Engine/Graphics/FilterEffects/Gamma.cs
  • src/Beutl.Engine/Graphics/FilterEffects/GeometryDefinitionCalls.cs
  • src/Beutl.Engine/Graphics/FilterEffects/GeometryDescription.cs
  • src/Beutl.Engine/Graphics/FilterEffects/GeometrySession.cs
  • src/Beutl.Engine/Graphics/FilterEffects/Invert.cs
  • src/Beutl.Engine/Graphics/FilterEffects/LayerEffect.cs
  • src/Beutl.Engine/Graphics/FilterEffects/LutEffect.cs
  • src/Beutl.Engine/Graphics/FilterEffects/MosaicEffect.cs
  • src/Beutl.Engine/Graphics/FilterEffects/Negaposi.cs
  • src/Beutl.Engine/Graphics/FilterEffects/PartsSplitEffect.cs
  • src/Beutl.Engine/Graphics/FilterEffects/PathFollowEffect.cs
  • src/Beutl.Engine/Graphics/FilterEffects/PixelSortEffect.cs
  • src/Beutl.Engine/Graphics/FilterEffects/SKImageFilterBuilder.cs
  • src/Beutl.Engine/Graphics/FilterEffects/SKSLScriptEffect.cs
  • src/Beutl.Engine/Graphics/FilterEffects/SKSLShader.cs
  • src/Beutl.Engine/Graphics/FilterEffects/ShaderBindings.cs
  • src/Beutl.Engine/Graphics/FilterEffects/ShaderDefinitionCalls.cs
  • src/Beutl.Engine/Graphics/FilterEffects/ShaderDescription.cs
  • src/Beutl.Engine/Graphics/FilterEffects/ShaderLowering.cs
  • src/Beutl.Engine/Graphics/FilterEffects/SkslLexer.cs
  • src/Beutl.Engine/Graphics/FilterEffects/SkslSnippetMerger.cs
  • src/Beutl.Engine/Graphics/FilterEffects/SkslSource.cs
  • src/Beutl.Engine/Graphics/FilterEffects/SplitEffect.cs
  • src/Beutl.Engine/Graphics/FilterEffects/StrokeEffect.cs
  • src/Beutl.Engine/Graphics/FilterEffects/Threshold.cs
  • src/Beutl.Engine/Graphics/FilterEffects/TransformEffect.cs
  • src/Beutl.Engine/Graphics/ImmediateCanvas.cs
  • src/Beutl.Engine/Graphics/Matrix.cs
  • src/Beutl.Engine/Graphics/Particles/ParticleRenderNode.cs
  • src/Beutl.Engine/Graphics/Rect.cs
  • src/Beutl.Engine/Graphics/Rendering/BlendModeRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/Cache/RenderNodeCache.cs
  • src/Beutl.Engine/Graphics/Rendering/Cache/RenderNodeCacheHelper.cs
  • src/Beutl.Engine/Graphics/Rendering/ClearRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/ContainerRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/DeviceGridAlignment.cs
  • src/Beutl.Engine/Graphics/Rendering/DrawBackdropRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/EffectiveScale.cs
  • src/Beutl.Engine/Graphics/Rendering/EllipseRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/EngineResourceIdentity.cs
  • src/Beutl.Engine/Graphics/Rendering/FilterEffectRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/FilterEffectWorkingScalePolicy.cs
  • src/Beutl.Engine/Graphics/Rendering/GeometryClipRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/GeometryRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/GpuResourceReclaimQueue.cs
  • src/Beutl.Engine/Graphics/Rendering/GpuResourceRelease.cs
  • src/Beutl.Engine/Graphics/Rendering/GraphicsContext2D.cs
  • src/Beutl.Engine/Graphics/Rendering/IRenderer.cs
  • src/Beutl.Engine/Graphics/Rendering/ImageSourceRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/LayerRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/MemoryNode.cs
  • src/Beutl.Engine/Graphics/Rendering/OpacityMaskRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/OpacityRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/OperationWrapperRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/Operations/MaterializedInputDescription.cs
  • src/Beutl.Engine/Graphics/Rendering/Operations/OpaqueRenderDescription.cs
  • src/Beutl.Engine/Graphics/Rendering/Operations/RenderCallbackCanvas.cs
  • src/Beutl.Engine/Graphics/Rendering/Operations/RenderDefinitionCalls.cs
  • src/Beutl.Engine/Graphics/Rendering/Operations/RenderExecutionBinding.cs
  • src/Beutl.Engine/Graphics/Rendering/Operations/RenderInputReadback.cs
  • src/Beutl.Engine/Graphics/Rendering/Operations/RenderResource.cs
  • src/Beutl.Engine/Graphics/Rendering/Operations/TargetCaptureDescription.cs
  • src/Beutl.Engine/Graphics/Rendering/Operations/TargetCaptureScaleContract.cs
  • src/Beutl.Engine/Graphics/Rendering/Operations/TargetCommandDescription.cs
  • src/Beutl.Engine/Graphics/Rendering/Operations/TargetRegion.cs
  • src/Beutl.Engine/Graphics/Rendering/Operations/TargetScopeDescription.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/CompiledRenderRequest.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/ExecutionIslandPlanner.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/LegacyFilterSamplingSupport.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/NestedRenderTargetBinding.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/NodeRecordingTransaction.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/ProgramCache.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RecordedRenderGraph.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RegionAnalyzer.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderCacheResolver.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderExecutionCallbackGuard.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderIdentityKeyValidator.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequest.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestCompiler.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestExecutor.Diagnostics.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestExecutor.DrawableBrush.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestExecutor.Effects.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestExecutor.Family.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestExecutor.Geometry.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestExecutor.Materialize.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestExecutor.Publish.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestExecutor.Replay.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestExecutor.Shader.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestExecutor.Target.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestExecutor.Values.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestExecutor.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestOptions.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestOwner.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderRequestRecorder.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderTargetLeaseRegistry.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/RenderTargetPool.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/ResourcePlanUseSchedule.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/SkslBackendBudgetResolver.cs
  • src/Beutl.Engine/Graphics/Rendering/Planning/StructuralPlanCache.cs
  • src/Beutl.Engine/Graphics/Rendering/PushRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/RasterShaderMapping.cs
  • src/Beutl.Engine/Graphics/Rendering/RectClipRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/RectangleRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/ReferencesChildRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderBoundsContract.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderExecutionInput.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderFragmentHandle.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderInputDemandContract.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderNodeContext.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderNodeOperation.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderNodeProcessor.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderNodeRasterization.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderNodeRenderer.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderRequestClassification.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderScaleUtilities.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderTarget.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderTargetDomainRequiredException.cs
  • src/Beutl.Engine/Graphics/Rendering/RenderValueCardinality.cs
  • src/Beutl.Engine/Graphics/Rendering/Renderer.cs
  • src/Beutl.Engine/Graphics/Rendering/SnapshotBackdropRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/TextRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/TransformRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/VideoSourceRenderNode.cs
  • src/Beutl.Engine/Graphics/SourceVideo.Thumbnails.cs
  • src/Beutl.Engine/Graphics/Transformation/TransformHandleMath.cs
  • src/Beutl.Engine/Graphics3D/Materials/BasicMaterial.cs
  • src/Beutl.Engine/Graphics3D/Materials/Material3D.cs
  • src/Beutl.Engine/Graphics3D/Materials/PBRMaterial.cs
  • src/Beutl.Engine/Graphics3D/Materials/TransparentMaterial.cs
  • src/Beutl.Engine/Graphics3D/Meshes/CubeMesh.cs
  • src/Beutl.Engine/Graphics3D/Meshes/Mesh.cs
  • src/Beutl.Engine/Graphics3D/Meshes/PlaneMesh.cs
  • src/Beutl.Engine/Graphics3D/Meshes/SphereMesh.cs
  • src/Beutl.Engine/Graphics3D/Models/ModelMesh.cs
  • src/Beutl.Engine/Graphics3D/Nodes/FlipPass.cs
  • src/Beutl.Engine/Graphics3D/Nodes/GeometryPass.cs
  • src/Beutl.Engine/Graphics3D/Nodes/GizmoPass.cs
  • src/Beutl.Engine/Graphics3D/Nodes/GraphicsNode3D.cs
  • src/Beutl.Engine/Graphics3D/Nodes/LightingPass.cs
  • src/Beutl.Engine/Graphics3D/Nodes/MeshBufferUploadHelper.cs
  • src/Beutl.Engine/Graphics3D/Nodes/PointShadowPass.cs
  • src/Beutl.Engine/Graphics3D/Nodes/ShadowPass.cs
  • src/Beutl.Engine/Graphics3D/Nodes/TransparentPass.cs
  • src/Beutl.Engine/Graphics3D/Renderer3D.cs
  • src/Beutl.Engine/Graphics3D/Scene3DRenderNode.cs
  • src/Beutl.Engine/Graphics3D/ShadowManager.cs
  • src/Beutl.Engine/Graphics3D/Textures/DrawableTextureSource.cs
  • src/Beutl.Engine/Media/Geometry/EllipseGeometry.cs
  • src/Beutl.Engine/Media/Geometry/Geometry.cs
  • src/Beutl.Engine/Media/Geometry/Operations/ArcSegment.cs
  • src/Beutl.Engine/Media/Geometry/Operations/ConicSegment.cs
  • src/Beutl.Engine/Media/Geometry/Operations/CubicBezierSegment.cs
  • src/Beutl.Engine/Media/Geometry/Operations/LineSegment.cs
  • src/Beutl.Engine/Media/Geometry/Operations/PathSegment.cs
  • src/Beutl.Engine/Media/Geometry/Operations/QuadraticBezierSegment.cs
  • src/Beutl.Engine/Media/Geometry/PathFigure.cs
  • src/Beutl.Engine/Media/Geometry/PathGeometry.cs
  • src/Beutl.Engine/Media/Geometry/RectGeometry.cs
  • src/Beutl.Engine/Media/Geometry/RoundedRectGeometry.cs
  • src/Beutl.Engine/Media/Geometry/SKPathGeometry.cs
  • src/Beutl.Engine/Media/PixelPoint.cs
  • src/Beutl.Engine/Media/PixelRect.cs
  • src/Beutl.Engine/Media/TextFormatting/FormattedText.cs
  • src/Beutl.Engine/Media/TextFormatting/ScaledTextCache.cs
  • src/Beutl.NodeGraph/Composition/GraphSnapshot.cs
  • src/Beutl.NodeGraph/NodeGraphFilterEffectRenderNode.cs
  • src/Beutl.NodeGraph/Nodes/ConfigureNode.cs
  • src/Beutl.NodeGraph/Nodes/FactoryNode.cs
  • src/Beutl.NodeGraph/Nodes/FilterEffectInputNode.cs
  • src/Beutl.NodeGraph/Nodes/FilterEffectNode.cs
  • src/Beutl.NodeGraph/Nodes/GeometryNode.cs
  • src/Beutl.NodeGraph/Nodes/Group/GroupInput.cs
  • src/Beutl.NodeGraph/Nodes/Group/GroupNode.cs
  • src/Beutl.NodeGraph/Nodes/LayerInputNode.cs
  • src/Beutl.NodeGraph/Nodes/TextNode.cs
  • src/Beutl.NodeGraph/Nodes/TransformNode.cs
  • src/Beutl.NodeGraph/Nodes/Utilities/ExpressionNode.cs
  • src/Beutl.NodeGraph/Nodes/Utilities/MatrixNode.cs
  • src/Beutl.NodeGraph/Nodes/Utilities/MeasureNode.cs
  • src/Beutl.NodeGraph/Nodes/Utilities/PreviewNode.cs
  • src/Beutl.NodeGraph/Nodes/Utilities/TimeNode.cs
  • src/Beutl.ProjectSystem/ProjectSystem/SceneDrawable.cs
  • src/Beutl.ProjectSystem/SceneCompositor.cs
  • src/Beutl.ProjectSystem/SceneRenderer.cs
  • src/Beutl/Helpers/AvaloniaTypeConverter.cs
  • src/Beutl/Helpers/ExportSupersampling.cs
  • src/Beutl/ViewModels/Dialogs/SaveFrameDialogViewModel.cs
  • src/Beutl/ViewModels/EditViewModel.cs
  • src/Beutl/ViewModels/PlayerViewModel.cs
  • src/Beutl/ViewModels/Tools/OutputViewModel.cs
  • tests/Beutl.AgentToolkit.Tests/Schema/SchemaGenerationTests.cs
  • tests/Beutl.AgentToolkit.Tests/Tools/ReadDocumentTests.cs
  • tests/Beutl.Benchmarks/Program.cs
  • tests/Beutl.Benchmarks/Properties/AssemblyInfo.cs
  • tests/Beutl.Benchmarks/Rendering/RenderPipelineBenchmarkConfig.cs
  • tests/Beutl.Benchmarks/Rendering/RenderPipelineBenchmarkScenes.cs
  • tests/Beutl.Benchmarks/Rendering/RenderPipelineBenchmarks.cs
  • tests/Beutl.Graphics3DTests/GpuPassFusion3DBoundaryTests.cs
  • tests/Beutl.Graphics3DTests/GpuTestEnvironment.cs
  • tests/Beutl.Graphics3DTests/RenderPassTransferScopeTests.cs
  • tests/Beutl.Graphics3DTests/RenderTargetPoolRetainedContextTests.cs
  • tests/Beutl.Graphics3DTests/ShaderDescriptionSpirvEquivalenceTests.cs
  • tests/Beutl.Graphics3DTests/TestCategories.cs
  • tests/Beutl.Graphics3DTests/VulkanContextIsolationTests.cs
  • tests/Beutl.HeadlessUITests/DrawableBrushThumbnailTests.cs
  • tests/Beutl.HeadlessUITests/PreviewRenderTests.cs
  • tests/Beutl.HeadlessUITests/SelectedDrawableRenderTests.cs
  • tests/Beutl.PublicApiContractTests/Beutl.PublicApiContractTests.csproj
  • tests/Beutl.PublicApiContractTests/BrushMaterializationSmokeTests.cs
  • tests/Beutl.PublicApiContractTests/CapturedResourceBorrowContractTests.cs
  • tests/Beutl.PublicApiContractTests/DeclaredPlannerTraitContractTests.cs
  • tests/Beutl.PublicApiContractTests/DeclaredResourceAddressingContractTests.cs
  • tests/Beutl.PublicApiContractTests/DeliveryIntentDeclarationContractTests.cs
  • tests/Beutl.PublicApiContractTests/DetachedResourceAuthoringContractTests.cs
  • tests/Beutl.PublicApiContractTests/EngineResourceIdentityContractTests.cs
  • tests/Beutl.PublicApiContractTests/FilterEffectCompatibilityContractTests.cs
  • tests/Beutl.PublicApiContractTests/GeometryAuthoringContractTests.cs
  • tests/Beutl.PublicApiContractTests/MaterialTextureAuthoringContractTests.cs
  • tests/Beutl.PublicApiContractTests/OrphanedTargetEffectContractTests.cs
  • tests/Beutl.PublicApiContractTests/PerspectiveBoundsContractTests.cs
  • tests/Beutl.PublicApiContractTests/PipelineSpecializationContractTests.cs
  • tests/Beutl.PublicApiContractTests/PublicApiContractTestBase.cs
  • tests/Beutl.PublicApiContractTests/RasterFootprintContractTests.cs
  • tests/Beutl.PublicApiContractTests/RenderDefinitionCallFactory.cs
  • tests/Beutl.PublicApiContractTests/RenderDefinitionPublicSurfaceContractTests.cs
  • tests/Beutl.PublicApiContractTests/RenderNodeAuthoringContractTests.cs
  • tests/Beutl.PublicApiContractTests/RenderNodeRendererContractTests.cs
  • tests/Beutl.PublicApiContractTests/RenderScaleMappingContractTests.cs
  • tests/Beutl.PublicApiContractTests/ShaderAuthoringContractTests.cs
  • tests/Beutl.PublicApiContractTests/TargetAuthoringContractTests.cs
  • tests/Beutl.UnitTests/Benchmarks/Rendering/RenderPipelineBenchmarkNodeTests.cs
  • tests/Beutl.UnitTests/Beutl.UnitTests.csproj
  • tests/Beutl.UnitTests/Editor/ExportRendererFactoryTests.cs
  • tests/Beutl.UnitTests/Editor/ExportSupersamplingTests.cs
  • tests/Beutl.UnitTests/Editor/FrameProviderRenderTargetRetentionTests.cs
  • tests/Beutl.UnitTests/Editor/ObjectTemplatePreviewRendererTests.cs
  • tests/Beutl.UnitTests/Editor/SaveFrameScaleTests.cs
  • tests/Beutl.UnitTests/Engine/FormattedTextDisposalTests.cs
  • tests/Beutl.UnitTests/Engine/FormattedTextGeometryCacheTests.cs
  • tests/Beutl.UnitTests/Engine/FormattedTextRasterBoundsTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/AudioVisualizerDrawableTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Backend/BackdropScaleTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Backend/GLSLShaderTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Backend/GraphicsContextFactoryTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Backend/GraphicsContextResourceTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Backend/ImmediateCanvasDensityTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Backend/PixelSortEffectTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Backend/RenderTargetVulkanTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Backend/SkiaVulkanImageInitializationTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Backend/SpecializationConstantTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Backend/VulkanTestEnvironment.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Backend/VulkanValidationGateTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/DrawableResourceRenderTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/FilterEffects/CurrentPixelFilterEffectTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/FilterEffects/FilterEffectActivatorReentrancyTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/FilterEffects/FiniteCurrentPixelEffectTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/FilterEffects/NativeFilterScratchTextureTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/FilterEffects/PixelSortEffectSynchronizationTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/FilterEffects/PixelSortPipelineCacheTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/FilterEffects/PixelSortSpecializationTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/FilterEffects/ScriptCompilableEffectTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/FilterEffects/WholeSourceFilterEffectTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Particles/ParticleRenderNodeAllocationTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/PerspectiveBoundsTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/PerspectiveNearPlaneResidualTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/BrushIntermediateAllocationIntentTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/BrushSourceBoundsIdentityTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Cache/ComposedSceneRenderCacheTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Cache/ContainerTopologyCacheInvalidationTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Cache/ContributeValuesCacheHitExecutionTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Cache/DegradedPreviewCachePurityTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Cache/OutputIdentityFanOutCostTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Cache/ProgramCacheTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Cache/RenderCacheCandidateTopologyTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Cache/RenderCacheIdentityChannelTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Cache/RenderCacheResolutionTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Cache/RenderNodeCacheHelperTest.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Cache/RenderNodeCacheTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Cache/StructuralAndProgramCacheTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/ClearRenderNodeTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/ContainerRenderNodeTest.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/CustomEffectSynchronizationTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/CustomTargetClampConsistencyTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/DirectSkiaFilterReplayTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/DrawBackdropRenderNodeTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/EllipseRenderNodeTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/EngineResourceIdentityRoutingTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/EngineResourceIdentityTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/ExecutionProbe.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Failure/DeferredCallbackFailureTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Failure/GeometrySessionTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Failure/NestedTargetAndCleanupFailureTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Failure/RecordingAndPlanningFailureTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Failure/RenderNodeRendererLifetimeTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Failure/RenderRequestOwnerTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Failure/RenderResourceOwnershipTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Failure/ShaderAndAllocationFailureTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/FilterEffectCrashSafetyTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/FilterEffectRenderNodeTest.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/FilterEffects/FilterEffectAlphaReadbackTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Fusion/ColorFilterIslandSplitTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Fusion/CrossNodeShaderFusionTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Fusion/CurvesAndLutEffectShaderTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Fusion/ExecutionIslandAuthorityTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Fusion/FilterEffectSegmentBoundaryReasonTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Fusion/FusionBoundaryExecutionTestSupport.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Fusion/FusionBoundaryTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Fusion/SKSLScriptEffectShaderTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Fusion/ShaderDescriptionTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Fusion/ShaderFallbackTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Fusion/SkslBackendBudgetResolverTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Fusion/SkslSnippetMergerTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/GeometryClipRenderNodeTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/GeometryRenderNodeTest.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/AnisotropicHairlineCoverageTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/BackdropDecoratorTransformTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/BitmapSamplingQualityTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/BlurFilterLayerBoundsTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/ColorFilterShaderParityTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/CurrentPixelQuantizationTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/CurvesFiniteOutputTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/CustomEffectDeviceGridPhaseTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/CustomEffectSupersampleTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/DelayAnimationNestedBrushTimeTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/DirectBlurFiniteOutputTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/DrawableBrushFractionalContentExtentTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/DrawableGroupIsolationTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/DrawableGroupPublishedBoundsTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/EffectDrawableBrushLoweringTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/EffectScaleParityTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/FrameClearCoverageTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/GoldenImageHarness.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/GpuPassFusionFeature003RegressionTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/GpuPassFusionSameProcessParityHarness.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/GpuPassFusionScaleRegionTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/ImageMetrics.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/ImageMetricsTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/KeyingDegenerateBoundaryTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/LosslessCompositeCoverageTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/NativeBackendWriteSurvivesTargetClearTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/NoTargetTransformOffsetInputTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/OpaqueSourceCoverageTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/PerspectiveNearPlaneCrossingTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/RenderScaleBenchmarkTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/Rgba16fGoldenStore.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/Rgba16fGoldenStoreTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/ShaderMatrixUniformTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/ShearedFilterLayerApronTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/ShrinkingTransformKeepsItsFootprintTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/SkiaColorFilterChainTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/SplitTransformEffectCombinationTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/SubPixelParticlesStayVisibleTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/TargetCaptureValueWrapperTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/TileBrushFillDensityTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/TransformEffectEquivalenceTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/TransformEffectFrameAnchorTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/WholeSourceFractionalScaleTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/WholeSourceFragmentOriginTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/WholeSourceHeadFusionParityTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/GpuResourceReclaimQueueTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/GraphicsContext2DTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/HitTestDomainAgreementTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/HitTestParityTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/ImageSourceRenderNodeTest.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/LegacyFilterRequiredRegionTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/LegacyFilterTypedSuffixExecutionTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/MappedInputReadbackIntentTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/MaxWorkingScaleSanitizationTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/NodeCacheScaleTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/OffFrameFilterEffectExecutionTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/ParticleRenderNodeScaleTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Planning/BackdropOrderingTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Planning/ExecutionIslandPlannerCacheBoundaryTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Planning/InTreeDeclaredTraitTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Planning/MaterializedInputCompositeTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Planning/ProductionResourceLifetimeTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Planning/RawScopeNestingAndCaptureOffsetTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Planning/RegionAnalyzerTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Planning/RenderRequestModelTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Planning/RenderTargetPoolTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Planning/RendererWideRecordingTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Planning/ResourcePlanUseScheduleTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Planning/SymbolicOwningDomainTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Planning/SymbolicSupplyMappingTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Planning/TargetScopeLoweringTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RasterFootprintMetadataTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Recording/AbandonedRecordedSubtreeTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Recording/BrushSourceRecordingTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Recording/DeclaredResourceOrderTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Recording/FilterEffectRecordingTransactionTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Recording/NestedEffectBrushLoweringTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Recording/NodeRecordingTransactionTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Recording/OpaqueRenderDescriptionDirectReplayTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Recording/RecordingSideEffectTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Recording/RenderContractPrimitiveTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Recording/RenderDescriptionAndExecutionContractTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Recording/RenderPipelineMigrationCensusTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Recording/RenderScaleContractTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Recording/ValueReplaySafetyTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RectClipRenderNodeTest.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RectangleRenderNodeTest.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/ReferencedChildRevalidationTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderCacheTestSupport.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderDescriptionAllocationTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderNodeHasChangesTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderNodeProcessorExceptionSafetyTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderNodeRendererAllocationFailureTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderNodeRendererDeviceBoundsTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderNodeRendererExceptionSafetyTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderNodeRendererSnapshotFastPathTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderResourceSlotTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderScaleFootprintBudgetTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderTargetFactoryReachTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderTargetPoolRejectionTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderTargetSharedSurfaceTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderTargetSnapshotTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RenderTargetThreadAffinityTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RendererExceptionSafetyTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/RendererIntentTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/ResolutionScaleTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/ShaderMigrationPhysicalFootprintTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/SlotBackedHitTestTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/SourceEffectiveScaleFlowTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/StrokeEffectOffsetBoundsTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/TextRenderNodeTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/VideoSourceRenderNodeTest.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/WorkingScaleClampConsistencyTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/SourceVideoThumbnailTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Transformation/TransformHandleMathTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics3D/DetachedMeshResourceTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics3D/DrawableTextureSourceDensityTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics3D/Scene3DRenderNodeScaleTests.cs
  • tests/Beutl.UnitTests/Engine/Media/Geometry/DetachedGeometryResourceTests.cs
  • tests/Beutl.UnitTests/Engine/Media/Geometry/GeometryPathAllocationTests.cs
  • tests/Beutl.UnitTests/Engine/Media/Geometry/GeometryPathCacheFailureTests.cs
  • tests/Beutl.UnitTests/Engine/Media/Geometry/GeometryPathParityTests.cs
  • tests/Beutl.UnitTests/Engine/Media/Geometry/GeometryStrokePathCacheTests.cs
  • tests/Beutl.UnitTests/Engine/Media/Geometry/PreChangeGeometryPath.cs
  • tests/Beutl.UnitTests/Engine/PixelRectTests.cs
  • tests/Beutl.UnitTests/Engine/PixelTypesTests.cs
  • tests/Beutl.UnitTests/Engine/ScaledTextCacheTests.cs
  • tests/Beutl.UnitTests/Engine/TextBlockSubpixelPlacementTests.cs
  • tests/Beutl.UnitTests/Engine/TextBlockTests.cs
  • tests/Beutl.UnitTests/Graphics/PreviewFrameOrderIndependenceTests.cs
  • tests/Beutl.UnitTests/Graphics/ProxyVideoLogicalSizeTests.cs
  • tests/Beutl.UnitTests/Helpers/EngineObjectHelperTests.cs
  • tests/Beutl.UnitTests/NodeGraph/ConfigureNodeOwnershipTests.cs
  • tests/Beutl.UnitTests/NodeGraph/GraphSnapshotTests.cs
  • tests/Beutl.UnitTests/NodeGraph/NodeGraphFilterEffectRenderNodeTests.cs
  • tests/Beutl.UnitTests/ProjectSystem/SceneDrawableBoundsTests.cs
  • tests/Beutl.UnitTests/ProjectSystem/SceneDrawableScaleTests.cs
  • tests/Beutl.UnitTests/TestCategories.cs
  • tests/CLAUDE.md
  • tests/SourceGeneratorTest/Class1.cs
  • tests/SourceGeneratorTest/EngineObject.cs
  • tests/SourceGeneratorTest/EngineObjectResourceGeneratorTests.cs

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

A grouped drawable records a full-target layer scope, which the fragment
handle cannot resolve without a domain, so the thumbnail render threw
RenderTargetDomainRequiredException and no bitmap was ever published.
chatgpt-codex-connector[bot]

This comment was marked as resolved.

The materializer reported the brush's destination box as the source size, so
TileBrushCalculator computed a stretch of 1 for any drawable whose intrinsic
bounds differed from the destination: a 40px drawable filling a 160px shape
covered 42px instead of 160px. The materializer now crops its snapshot to the
compiled output bounds and reports them, matching the pre-fusion behaviour.

Also restores the volatile _disposed flags and the cross-thread disposal tests
in the IPC providers, which the branch had reverted against main.
chatgpt-codex-connector[bot]

This comment was marked as resolved.

Cropping through a subset surface snapshot allocated a backend image on every
drawable-brush fill. Taking the whole snapshot and cropping the raster copy
keeps the device interaction the same as before the content-bounds fix.
chatgpt-codex-connector[bot]

This comment was marked as resolved.

Once bounds turn symbolic, AddItem and AppendDescription route operations to
_renderTimeItems, which the public CountItems ignored. An out-of-tree effect
that branched on the count saw an undercount for work that still executes.
chatgpt-codex-connector[bot]

This comment was marked as resolved.

…ender thread

Resource creation and update run in a posted render-thread callback, and the
render thread installs no unhandled-exception handler, so a throwing factory
unwound its loop and stopped every later render. Failures now release any
partially created resource and reach the subscriber through OnError.
chatgpt-codex-connector[bot]

This comment was marked as resolved.

…t-out

BrushConstructor's public constructor could not supply a materializer, so a
DrawableBrush painted through the public path degraded to transparent where it
used to rasterize itself. The materializer delegate and its result are public
now, and the internal constructor overload folds into the primary one.

RenderNodeContext.DisableRenderCache becomes public: a node that records a
child it does not list in ChildNodes has to keep itself out of the cache, and
the cache cannot see a change reported only by that unlisted child.

IRenderTargetFactory.GetMaximumDimension is removed. Nothing queried it, so a
factory advertising a smaller limit was ignored either way; the buffer bound
stays RenderScaleUtilities.MaxBufferDimension until a consumer exists.

BREAKING CHANGE: Beutl.Engine — IRenderTargetFactory.GetMaximumDimension is
removed; drop the implementation from custom factories. BrushConstructor gains
a trailing optional DrawableBrushMaterializer parameter, so positional callers
after `intent` must be updated.
chatgpt-codex-connector[bot]

This comment was marked as resolved.

The Legacy/Compatibility vocabulary read as "deprecated authoring API", which
it never described. FilterEffect.ApplyTo is the sole abstract effect entry
point and the spec keeps it (research.md R10, spec.md FR-018); what these
types actually distinguish is the imperative fallback that a segment falls
into once an unknown custom operation makes bounds symbolic, versus the
recorded path that ordinary Shader/Geometry items still take.

  LegacyFilterEffectCompatibilityExecutor -> FilterEffectStageFallbackExecutor
  LegacyFilterEffectRenderFragmentPayload -> FilterEffectSegmentRenderFragmentPayload
  RenderFragmentKind.LegacyFilterEffect   -> FilterEffectSegment
  CompatibilityRenderValue                -> MaterializedRenderValue
  CompatibilityExecutionState             -> RenderRequestExecutionState
  CompatibilityClassification             -> ExecutionIslandClassification

The two broad ones were the worst fit: RenderRequestExecutionState is built
for every planned request and MaterializedRenderValue carries fused shader
runs. LegacyCustomEffect, LegacyRawCanvas and LegacyFilterSamplingSupport keep
their names — they do describe retained imperative boundaries.

A segment also collects Skia items and typed suffixes, so the planner no
longer reports LegacyCustomEffect as the boundary reason for segments that
hold no custom item; those get the new FilterEffectSegment reason.
chatgpt-codex-connector[bot]

This comment was marked as resolved.

Four defects introduced by this PR's own review round:

Teardown released the resource from a posted render-thread callback without
catching, so a throwing Dispose unwound the loop the earlier fix had just
protected. The release now logs and swallows.

The trigger subscription installed only an onNext handler, so a faulting time
stream hit Rx's rethrowing default handler while this subscription stayed
uninformed and kept its resource. It now cancels, releases, and reports
through OnError.

Thumbnail shutdown counted queued and running updates together, so a shutdown
disposed the resource under an update that was still recording from it. The
two are counted separately now: shutdown writes off work that never starts and
waits for work already in flight.

A Stretch listener that disposed the handler left rollback restoring the
previous thumbnail that Dispose had just cleared, leaking it with no owner.
Rollback now keeps the source cleared and releases the previous bitmap when
disposal won.
chatgpt-codex-connector[bot]

This comment was marked as low quality.

The scale table still named RenderNodeOperation.EffectiveScale, which this
feature removed; effective scale now lives on the recorded fragment. The
filter-effect skill taught CustomEffect for per-pixel SKSL without saying that
the form is opaque to the planner, so authors following it lost fusion without
knowing. Both now name the current surface.
chatgpt-codex-connector[bot]

This comment was marked as resolved.

…d on

The logical device never asked for imageCubeArray, while the shadow path creates
VK_IMAGE_VIEW_TYPE_CUBE_ARRAY views and its lighting shader declares the SampledCubeArray capability.
Using a feature without requesting it is undefined behaviour the driver need not report, which is why it
went unnoticed until the Vulkan validation gate reported 26 VUID-VkImageViewCreateInfo-viewType-01004 and
13 VUID-VkShaderModuleCreateInfo-pCode-08740 errors across 13 of the Graphics3D tests.

The device now enables it where the hardware advertises it, alongside the two 64-bit shader features, and
a cube texture array on a device without it is rejected by name instead of failing inside
vkCreateImageView, whose message mentions neither the texture nor the missing feature.
…g fills it

The lighting pass binds a shadow atlas whole, but only the slots the lights present actually rendered into
were transitioned; the rest sat in VK_IMAGE_LAYOUT_UNDEFINED and were handed to the sampler anyway. Reading
an image in a layout that does not permit it is undefined behaviour the driver need not report, which is
why it went unnoticed until the Vulkan validation gate reported 375 InvalidImageLayout errors across the
Graphics3D suite - every one of them an unfilled slot.

An array, cube-array or cube texture now leaves its constructor with every slot in
ShaderReadOnlyOptimal, so an allocated slot is readable from the moment it exists whether or not anything
ever writes to it. Rendering into one still transitions it and back.

ShadowManager carried a note saying a sweep over the whole array would be harmful because it would
transition from Undefined and discard data. It would not: each transition reads the slot's tracked layout
and skips a slot already in the target. The note now says what is actually true, which is that the sweep is
unnecessary rather than dangerous.
chatgpt-codex-connector[bot]

This comment was marked as resolved.

The array, cube-array and cube texture constructors defaulted usage to a depth attachment, so building one
directly with a colour format produced an image whose view the format cannot back. Nothing in production
hit it - the context factories pick usage from the format - but the validation gate caught a test of mine
that constructed a texture directly and asked for a depth attachment over RGBA8, reported as
VUID-VkImageViewCreateInfo-usage-02277 and VUID-VkImageCreateInfo-imageCreateMaxMipLevels-02251.

usage is now required, which is the same treatment the render hosts got: a default that is silently wrong
for a whole class of inputs is worse than no default. The three factories are the only callers.

The tests now allocate through the context, which is the supported path.

Also holds Scene3D_ReusesItsRendererAcrossRequests out of the validation job under the existing
KnownVulkanSkiaLayoutInterop category - it is the same Skia/backend layout divergence, reaching the 3D
suite through Renderer3D's Skia surface.
chatgpt-codex-connector[bot]

This comment was marked as resolved.

…fails

The initial layout transition added to the array, cube and cube-array constructors sits after every native
handle has been created, and recording it can fail - allocating or beginning a command buffer. The
constructors clean up after a failed image view but not after this, and none of these types has a
finalizer, so a caller that retries after a recoverable recording failure leaked the image, its memory,
the aggregate view and every per-layer view each time.

The transition now releases the same handles the view-creation failure path does before rethrowing.

No test: the failure needs a command-buffer allocation to fail inside the constructor, which the suite has
no way to induce. The cleanup mirrors, line for line, the path a few lines above it that the same
constructor already runs for a failed image view.
RenderTarget.ClearToTransparent hands the clear to Skia and records it on the wrapper, but
HasTransparentContents prefers the backend's record when the texture keeps one - and BeginDraw had just
set that to false, because Skia was about to draw. A pooled target the pool had already cleared therefore
reported unknown contents, and the next caller that wanted a blank one cleared and flushed the same image
again. Every reused intermediate on a materialization-heavy frame paid for that.

The clear now tells the backend what it did, so the two records agree.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 45244fe199

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/Beutl.Engine/Graphics/Rendering/RenderTarget.cs Outdated
or TargetCommandSession
or RawTargetScopeSession
or RawTargetCommandSession;
bool mutablePayload = key is Array || IsKnownMutableCollection(key.GetType());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reject mutable custom metadata captures

When an external author captures a custom mutable reference such as a BoundsBox in a bounds, scale, or hit-test callback, ValidatePureMetadataCallback reaches this check but accepts it because only arrays and a fixed list of collection types count as mutable. The callback can then change between the repeated metadata evaluations documented by these contracts while its structural identity remains the same MethodInfo, producing inconsistent ROI, bounds, or target-allocation decisions instead of the promised synchronous rejection; reject unknown reference captures or recursively validate their instance fields.

AGENTS.md reference: AGENTS.md:L60-L60

Useful? React with 👍 / 👎.

"Save selected element as image" rendered against the scene frame as the request's target domain, and a
target domain is a hard output clip: an element hanging over the edge exported cropped, and one entirely
outside the frame measured empty and threw "the selected drawable produced no raster output". The pull
model this replaced measured the drawable's own bounds.

The export now measures without a domain first and takes the union of the frame and what the drawable
actually occupies, so the frame still owns a fragment that resolves its region from the target while
nothing is clipped away. A subtree that genuinely needs an owning domain to measure at all says so by
throwing, and keeps the frame it had.
Demand planning consulted a target scope's scale contract only when the scope was the engine's internal
value-replay map. A public TargetScopeDefinition that enlarges its input while replaying it therefore
declared the higher input density its contract promises and was handed the unchanged output demand
anyway, so an unbounded source materialized at 1x and was then stretched.

Both demand paths now ask the contract. A contract that declares no backward map maps demand to itself,
so this changes nothing for the scopes that were already right.
Geometry is a materialization boundary, so an operation that draws its input through an enlarging
transform needs that input denser than its own consumer asked for. There was no way to say so: demand
planning had no case for geometry fragments, so they fell through forwarding the output demand unchanged,
and an unbounded source was rasterized at 1x and then stretched. Whole-source shaders and opaque combines
already had the remedy; geometry did not.

GeometryDefinition<TState>.Create accepts a RenderInputDemandContract, and planning applies it. The
default leaves demand unchanged, so an operation that draws its input at its own density is unaffected.
…s needs

A target command draws its inputs onto the target, and one that resamples an input while drawing it - a
transform pushed before Inputs[i].Draw - needs that input at a different density from the target it draws
onto. Replay-demand planning materialized every input at the unchanged target density, so an unbounded or
vector source drawn for a 1x target was rasterized at 1x and then enlarged, with no way to say otherwise.

TargetCommandDefinition<TState>.Create accepts a RenderInputDemandContract, resolved per input index, and
planning applies it. The default leaves demand unchanged.
…ion plans

Applying a target scope's backward demand map to every scope, not only the engine's value-replay map, was
wrong. An ordinary scope replays its input onto the target, and one whose transform is appended to the
destination matrix - TransformOperator.Append - has that scale carried by the destination already, so
pre-scaling the input rasterizes it four times too large and then draws it scaled again.
AppendTransform_LayerMaterializesAtPlannedDestinationDensity says exactly that, and it is right.

The gate is restored, and its reason is written down where the next reader will meet it. The gap the
review named - a public target scope has no way to declare an enlarging replay, because
TargetScopeDefinition always records isValueReplayMap: false - is real, but closing it means exposing that
distinction, not removing it.

Also stops the target-command demand lookup assuming a payload: the demand resolver is exercised with
synthetic payload-less fragments, and a command without one simply declares no mapping.
…s on

Reclaiming deferred targets flushes the shared context and reported that as "a context-wide flush
happened", which PrepareForSampling takes as permission to skip its own surface flush. A target from a
caller-supplied IRenderTargetFactory can live on another context, and its work was then never submitted
before the snapshot, readback or backend sample that follows - stale pixels, from a queue drain that had
nothing to do with it.

FlushAndDrain now takes the context the caller is about to sample and says true only when the flush
covered that one. The queue is drained either way; a caller told false submits its own surface as before.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 749c944225

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

case RenderFragmentKind.Opacity:
case RenderFragmentKind.Blend:
case RenderFragmentKind.TargetLayerScope:
case RenderFragmentKind.RawTargetScope:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Apply backward demand mapping to raw target scopes

When an out-of-tree RawTargetScopeDefinition pushes an enlarging canvas transform before ReplayInput() and supplies a bidirectional RenderScaleContract, this branch forwards the target demand unchanged instead of consulting RawTargetScopeDescription.Scale. An unbounded/vector child behind a materialization boundary is therefore rasterized at the target density and then enlarged, producing blurred output despite the public contract declaring the higher input demand; resolve the raw scope's backward scale mapping here rather than grouping it with identity-demand scopes.

AGENTS.md reference: AGENTS.md:L59-L60

Useful? React with 👍 / 👎.

@github-actions

Copy link
Copy Markdown
Contributor

Code Coverage

Package Line Rate Branch Rate Complexity Health
Beutl 29% 17% 11286
Beutl.AgentToolkit 90% 74% 7517
Beutl.Api 48% 30% 1590
Beutl.Benchmarks 56% 38% 509
Beutl.Configuration 63% 40% 427
Beutl.Controls 36% 15% 5555
Beutl.Core 70% 60% 3115
Beutl.Editor 85% 81% 2983
Beutl.Editor.Components 25% 17% 9872
Beutl.Embedding.MediaFoundation 6% 10% 1444
Beutl.Engine 79% 69% 31889
Beutl.Engine.SourceGenerators 60% 45% 544
Beutl.ExceptionHandler 0% 0% 117
Beutl.Extensibility 73% 77% 167
Beutl.Extensions.AVFoundation 5% 2% 202
Beutl.Extensions.FFmpeg 28% 25% 812
Beutl.Extensions.FFmpeg.Core 58% 38% 388
Beutl.FFmpegIpc 27% 35% 858
Beutl.FFmpegWorker 5% 4% 906
Beutl.Language 55% 28% 1615
Beutl.NodeGraph 34% 23% 2602
Beutl.PackageTools.UI 10% 8% 804
Beutl.ProjectSystem 81% 67% 1328
Beutl.Testing.Headless 88% 92% 15
Beutl.Threading 100% 90% 137
Beutl.Utilities 94% 87% 358
Beutl.WaitingDialog 0% 0% 36
Iciclecreek.Avalonia.Terminal 35% 22% 1164
XTerm.NET 20% 12% 2009
Summary 55% (128745 / 233637) 46% (32432 / 71085) 90249

Minimum allowed line rate is 0%

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bd69026a9d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +167 to +168
Rect bounds = context.CalculateRecordedInputBoundsHint();
context.Publish(context.TargetLayerScope(context.Inputs, TargetRegion.Region(bounds)));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve full-target work when isolating groups

When an out-of-tree drawable records only GraphicsContext2D.Clear(Color) inside a DrawableGroup whose opacity is below 100% (or whose children require blend isolation), the clear fragment has an empty recorded bounds hint even though it writes the full target. This constructs an empty TargetLayerScope, which ReplayTargetLayerScope skips entirely, so the group no longer produces the full-frame color that the previous save-layer path composited. Use a full/owning target layer when target-write metadata is symbolic rather than deriving the isolation region solely from recorded value bounds.

AGENTS.md reference: AGENTS.md:L60-L60

Useful? React with 👍 / 👎.

@b-editor b-editor deleted a comment from chatgpt-codex-connector Bot Aug 23, 2026
@b-editor b-editor deleted a comment from chatgpt-codex-connector Bot Aug 23, 2026
@b-editor b-editor deleted a comment from chatgpt-codex-connector Bot Aug 23, 2026
@b-editor b-editor deleted a comment from chatgpt-codex-connector Bot Aug 23, 2026
A metadata callback is evaluated repeatedly and its structural identity is only its MethodInfo, so a
capture that changes between evaluations makes one identity stand for different bounds, scales or hit
tests. Only arrays and a fixed list of collection types counted as mutable, so an ordinary class with a
settable field - the shape anyone reaches for when they want to hand a callback a value - passed.

The test is structural rather than another list: a captured reference type is accepted only when every
instance field is readonly and holds something that passes in turn, so an unfamiliar shell whose fields
cannot be reassigned is still accepted. A struct is not asked to be readonly, since the callback reads
whatever the display class holds either way, but what it points at is followed. Types whose contents
cannot change - string, Guid, the immutable collections - are leaves, because following an
ImmutableArray's backing array would read as a mutable array from the outside.
When a lambda is written inside another lambda over the same locals, Roslyn caches the inner
delegate in the closure the two share. Capture validation read that field as a delegate the
author had captured and refused the contract, so recording one from inside any other lambda -
including from a test's own assertion lambda - failed for a field nobody wrote.

The cache is recognised by pointing back at the closure being validated: whatever it reads is
one of that closure's other fields, which validation checks in its own right. A delegate built
elsewhere, over state this closure cannot show, still has a different target and is still
refused.
@github-actions

Copy link
Copy Markdown
Contributor

No TODO comments were found.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f12d4590f1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

/// The only addressing mode here. An unguarded external callback is never reusable, so it is recorded
/// through <c>CreateRequestLocal</c> only and may always capture the tokens it needs.
/// </remarks>
public void UseResource<T>(RenderResource<T> resource, Action<T> use)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Resolve raw resources through their declared slots

When an out-of-tree raw scope or command declares reusable resource slots and binds a different token on each call, these sessions cannot address that binding by slot; the callback must also carry the exact RenderResource<T> in TState, as DrawBackdropRenderNode now does. This makes the binding schema validation-only and creates two sources of truth that can drift into an execution-time undeclared-resource failure, unlike guarded sessions. Store the bindings and expose slot-backed UseResource on both raw sessions so definitions remain reusable without duplicating tokens in state.

AGENTS.md reference: AGENTS.md:L59-L60

Useful? React with 👍 / 👎.

@@ -34,12 +35,15 @@ protected override Size MeasureCore(Size availableSize, Drawable.Resource resour
protected override void OnDraw(GraphicsContext2D context, Drawable.Resource resource)
{
var r = (Resource)resource;
var parameters = new SceneBitmapParameters(r, context.OutputScale);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Rebuild nested scenes for each request scale

When a SceneDrawable graph is recorded once and the same RenderNodeRenderer is later rasterized with a different per-call OutputScale, this captures only the original GraphicsContext2D scale. SceneBitmapRenderNode.Update is not called by subsequent renderer requests, so nested drawables whose Render method records scale-dependent nodes remain frozen at the first scale even though the executor rasterizes at the new one; the replaced implementation instead recreated its nested renderer from RenderNodeContext.OutputScale during each request. Make the nested graph scale-neutral or rebuild its scale-dependent children from the active request scale.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants