Attempt to reduce linking overhead (Scala Native) and improve pipeline performance#69
Merged
davesmith00000 merged 25 commits intomainfrom Mar 17, 2026
Merged
Attempt to reduce linking overhead (Scala Native) and improve pipeline performance#69davesmith00000 merged 25 commits intomainfrom
davesmith00000 merged 25 commits intomainfrom
Conversation
d4fb36d to
4c45626
Compare
There was a problem hiding this comment.
Pull request overview
Refactors the Indigo render pipeline to be more procedural and allocation-conscious (motivated by Scala Native’s AOT linking costs), while reorganizing pipeline types/utilities into clearer subpackages and introducing a visitor-based traversal for SceneNodes.
Changes:
- Adds
SceneNodeVisitor+SceneNode.acceptand implementsacceptacross core scenegraph node types. - Reorganizes render-pipeline packages (
assets/,datatypes/,sceneprocessing/,displayprocessing/) and updates imports across renderer/platform code. - Introduces new procedural utilities/builders (e.g., light UBO builder, UBO packing, layer compaction) and adds targeted MUnit test coverage.
Reviewed changes
Copilot reviewed 65 out of 65 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| indigo-scenegraph/src/indigo/scenegraph/Text.scala | Adds accept implementation for visitor traversal. |
| indigo-scenegraph/src/indigo/scenegraph/Sprite.scala | Adds accept implementation for visitor traversal. |
| indigo-scenegraph/src/indigo/scenegraph/Shape.scala | Adds accept implementations for concrete shape variants. |
| indigo-scenegraph/src/indigo/scenegraph/SceneNodeVisitor.scala | Introduces visitor interface for scenegraph node processing. |
| indigo-scenegraph/src/indigo/scenegraph/SceneNode.scala | Adds accept to SceneNode and default visitor hook for EntityNode. |
| indigo-scenegraph/src/indigo/scenegraph/Mutants.scala | Adds accept implementation for visitor traversal. |
| indigo-scenegraph/src/indigo/scenegraph/Group.scala | Adds accept implementation for visitor traversal. |
| indigo-scenegraph/src/indigo/scenegraph/Graphic.scala | Adds accept implementation for visitor traversal. |
| indigo-scenegraph/src/indigo/scenegraph/CloneTiles.scala | Adds accept implementation for visitor traversal. |
| indigo-scenegraph/src/indigo/scenegraph/CloneBatch.scala | Adds accept implementation for visitor traversal. |
| indigo-scenegraph/src/indigo/scenegraph/Clip.scala | Adds accept implementation for visitor traversal. |
| indigo-scenegraph/src/indigo/scenegraph/BlankEntity.scala | Adds accept implementation for visitor traversal. |
| indigo-render/src/indigo/render/Renderer.scala | Updates imports to new render-pipeline datatypes package. |
| indigo-render/src-js/indigo/render/webgl2/TextureLookupResult.scala | Updates AtlasId import to new assets package. |
| indigo-render/src-js/indigo/render/webgl2/RendererWebGL2.scala | Updates imports to new render-pipeline datatypes package. |
| indigo-render/src-js/indigo/render/webgl2/LoadedTextureAsset.scala | Updates AtlasId import to new assets package. |
| indigo-render/src-js/indigo/render/webgl2/LayerRenderer.scala | Updates display type imports to new datatypes/assets packages. |
| indigo-render/src-js/indigo/render/webgl2/LayerMergeRenderer.scala | Updates uniform-data type import to new datatypes package. |
| indigo-render-pipeline/test/src/indigo/render/pipeline/sceneprocessing/utils/CompactLayersTests.scala | Adds tests for new layer-compaction utility. |
| indigo-render-pipeline/test/src/indigo/render/pipeline/sceneprocessing/utils/BuildLightingDataTests.scala | Adds tests for new light-UBO builder logic and edge cases. |
| indigo-render-pipeline/test/src/indigo/render/pipeline/sceneprocessing/SceneProcessorTests.scala | Adds tests for new procedural SceneProcessor.makeDisplayLayers. |
| indigo-render-pipeline/test/src/indigo/render/pipeline/displayprocessing/utils/TextConversionTests.scala | Adds tests for text character layout logic. |
| indigo-render-pipeline/test/src/indigo/render/pipeline/displayprocessing/PackUBOsTests.scala | Adds detailed std140 UBO packing tests. |
| indigo-render-pipeline/test/src/indigo/render/pipeline/displayprocessing/DisplayObjectConversionsTests.scala | Adds tests for new DisplayObjectConversions behavior. |
| indigo-render-pipeline/test/src/indigo/render/pipeline/datatypes/SpriteSheetFrameTests.scala | Moves + expands SpriteSheetFrame tests for new datatypes location. |
| indigo-render-pipeline/test/src/indigo/render/pipeline/SceneProcessorTests.scala | Removes legacy scene processor tests (split into new focused suites). |
| indigo-render-pipeline/test/src/indigo/render/pipeline/DisplayObjectConversionsTests.scala | Removes legacy conversions tests (split into new focused suites). |
| indigo-render-pipeline/test/src-jvm/indigo/render/pipeline/displayprocessing/utils/ToCacheKeySyntaxTests.scala | Adds JVM test for shader cache-key generation. |
| indigo-render-pipeline/test/src-js/indigo/render/pipeline/displayprocessing/utils/ToCacheKeySyntaxTests.scala | Adds JS test for shader cache-key generation. |
| indigo-render-pipeline/src/indigo/render/pipeline/sceneprocessing/utils/MergeUniformData.scala | Extracts shader→uniform-data merge into utility. |
| indigo-render-pipeline/src/indigo/render/pipeline/sceneprocessing/utils/CompactLayers.scala | Extracts layer compaction into utility. |
| indigo-render-pipeline/src/indigo/render/pipeline/sceneprocessing/utils/BuildLightingData.scala | Adds procedural light packing into std140-friendly float array. |
| indigo-render-pipeline/src/indigo/render/pipeline/sceneprocessing/SceneProcessor.scala | Introduces new procedural scene processing pipeline entrypoint. |
| indigo-render-pipeline/src/indigo/render/pipeline/sceneprocessing/LightDataBuilder.scala | Adds mutable-array builder for lighting UBO data. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/utils/ToCacheKeySyntax.scala | Introduces shader-data cache-key builder. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/utils/TextureLookups.scala | Extracts cached texture lookup/offset helpers. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/utils/TextConversion.scala | Adds procedural text→display conversion + caching. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/utils/SpriteConversion.scala | Adds procedural sprite→display conversion + caching. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/utils/ShapeConversion.scala | Adds procedural shape→display conversion. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/utils/PackUBOs.scala | Adds procedural std140 UBO packing implementation. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/utils/MutantConversion.scala | Adds procedural mutants→display conversion. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/utils/GroupConversion.scala | Adds procedural group→matrix conversion. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/utils/GraphicConversion.scala | Adds procedural graphic→display conversion + caching. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/utils/EntityNodeConversion.scala | Adds procedural entity-node→display conversion + caching. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/utils/ConversionHelpers.scala | Centralizes shader uniform-block conversion to display uniform data. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/utils/CloneTilesConversion.scala | Adds cached conversion for clone-tiles display entities. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/utils/CloneBatchConversion.scala | Adds cached conversion for clone-batch display entities. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/DisplayObjectConversions.scala | Introduces frame/asset scoped caches + visitor-based conversion pipeline. |
| indigo-render-pipeline/src/indigo/render/pipeline/displayprocessing/DisplayObjectConversionVisitor.scala | Implements SceneNodeVisitor for display conversion. |
| indigo-render-pipeline/src/indigo/render/pipeline/display/SpriteSheetFrame.scala | Removes legacy SpriteSheetFrame location. |
| indigo-render-pipeline/src/indigo/render/pipeline/datatypes/SpriteSheetFrame.scala | Adds new datatypes SpriteSheetFrame implementation. |
| indigo-render-pipeline/src/indigo/render/pipeline/datatypes/ProcessedSceneData.scala | Moves ProcessedSceneData to datatypes package. |
| indigo-render-pipeline/src/indigo/render/pipeline/datatypes/DisplayLayer.scala | Moves DisplayLayer to datatypes package. |
| indigo-render-pipeline/src/indigo/render/pipeline/datatypes/DisplayEntity.scala | Refactors display entity structures and constructors. |
| indigo-render-pipeline/src/indigo/render/pipeline/assets/TextureRefAndOffset.scala | Moves TextureRefAndOffset to assets package. |
| indigo-render-pipeline/src/indigo/render/pipeline/assets/AtlasId.scala | Moves AtlasId to assets package. |
| indigo-render-pipeline/src/indigo/render/pipeline/assets/AssetMapping.scala | Moves AssetMapping to assets package. |
| indigo-render-pipeline/src/indigo/render/pipeline/SceneProcessor.scala | Removes legacy SceneProcessor implementation. |
| indigo-render-pipeline/src/indigo/render/pipeline/DisplayObjectConversions.scala | Removes legacy DisplayObjectConversions implementation. |
| indigo-platform/test/src-js/indigo/platform/assets/TextureAtlasTests.scala | Updates AtlasId import to new assets package. |
| indigo-platform/src-js/indigo/platform/gameengine/GameLoop.scala | Updates SceneProcessor import to new sceneprocessing package. |
| indigo-platform/src-js/indigo/platform/gameengine/GameEngine.scala | Updates AssetMapping/SceneProcessor imports to new packages. |
| indigo-platform/src-js/indigo/platform/assets/TextureAtlas.scala | Updates AtlasId import to new assets package. |
| indigo-platform/src-js/indigo/platform/JsPlatform.scala | Updates pipeline asset type imports to new assets package. |
| indigo-core/src/indigo/core/utils/QuickCache.scala | Updates Scala 3 using/given syntax for cache APIs. |
Comments suppressed due to low confidence (2)
indigo-render-pipeline/src/indigo/render/pipeline/datatypes/DisplayEntity.scala:28
DisplayGroupandDisplayTextLetterswere changed from case classes to plain classes, but the code still callsDisplayGroup(...)/DisplayTextLetters(...)(e.g. in theemptyvalues and elsewhere). Plain classes don’t get an auto-generatedapply, so this won’t compile. Either switch these back tofinal case class, or add companionapplymethods (or update all call sites to usenew ...).
indigo-render-pipeline/src/indigo/render/pipeline/datatypes/DisplayEntity.scala:141DisplayObjectUniformDatais now a plain class, but the rest of the PR constructs it asDisplayObjectUniformData(...)(e.g. inConversionHelpers,MergeUniformData, etc.). This won’t compile unless you either make it acase class, add a companionobject DisplayObjectUniformDatawith anapply, or update call sites to usenew DisplayObjectUniformData(...).
indigo-render-pipeline/src/indigo/render/pipeline/datatypes/SpriteSheetFrame.scala
Show resolved
Hide resolved
...-render-pipeline/src/indigo/render/pipeline/displayprocessing/DisplayObjectConversions.scala
Show resolved
Hide resolved
...-render-pipeline/src/indigo/render/pipeline/displayprocessing/DisplayObjectConversions.scala
Show resolved
Hide resolved
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This is going to be another stage in the work to make Scala Native viable. Currently the JVM and JS compilation of the pipeline works just fine, since the don't do full ahead-of-time linking. Unfortunately Scala Native does do that, and blows up.
The general plan here is quite simple: