Skip to content

Bring native rendering closer to WebGL2 parity - #1926

Merged
bkaradzic-microsoft merged 11 commits into
BabylonJS:masterfrom
bkaradzic-microsoft:shotgun-landing
Oct 13, 2026
Merged

bkaradzic-microsoft merged 11 commits into
BabylonJS:masterfrom
bkaradzic-microsoft:shotgun-landing

Conversation

@bkaradzic-microsoft

@bkaradzic-microsoft bkaradzic-microsoft commented Oct 12, 2026 •

Copy link
Copy Markdown
Member

Brings Babylon Native rendering closer to Babylon.js/WebGL2 parity. The guiding rule: anything that works in browser WebGL2 (ANGLE) is fixed in Babylon Native C++, not worked around in Babylon.js. Each commit is self-contained and is meant to be reviewed commit by commit.

Commits

  1. Use SPIRV-Cross with the HLSL varying fixes from BabylonJS/SPIRV-Cross: pins the merged BabylonJS/SPIRV-Cross main (2b078efc), which includes HLSL: add an opt-in FXC nested-loop arithmetic workaround SPIRV-Cross#15, It compiles...with some commented code #16 and Platform issues #17.
  2. Expand line loops and triangle fans into indexed lists: bgfx has neither topology. Expands them with draw ranges, primitive restart and dynamic index updates, and advertises supportsPrimitiveModeExpansion. Babylon.js 9.29 doesn't use it yet, so this changes nothing for current releases.
  3. Keep texture bindings across clears like WebGL: replays bound material textures after FrameBuffer::Clear.
  4. Restore additive rendering commands and integration regressions: keeps protocol 9 and adds CLEAR2, SETSTENCIL2 and a float-preserving readTexture2.
  5. Handle native rendering compatibility without shared shader workarounds: GLSL preprocessing, aliasing of intrinsic and predefined uniforms, integer conversions, ordering of repeated raw uploads, and plain-Array matrices plus default ranges in the native vertex transforms.
  6. Reset the back buffer's depth and stencil each frame: matches WebGL's per-frame drawing-buffer reset. PerFrameValue now shares ownership of the engine's cancellation source, so a reset task scheduled by a disposed engine can't touch a freed source (this crashed on QuickJS).
  7. Render cube faces in GL row order like ANGLE: mirrors rendering into cube-face render targets on top-left-origin backends.
  8. Widen RGB uploads and generate mips for raw texture updates: RGB float, half-float and 16-bit normalized uploads, sub-buffer reads, and generateMipmap for raw textures.
  9. Add internal compute shader support: native-only plumbing with no JavaScript surface. Compute shaders use bgfx shader binary v13, like graphics shaders since Report D3D sampler stages and texture dimensions for bgfx MSAA depth resolve #1930. The OpenGL shader compiler names interface-block instances after their block, so ES 3.00 stages link when instance names differ.
  10. Emulate WebGL2 transform feedback with compute: GPUParticleSystem runs unchanged on the WebGL2 path. Buffers the compute shaders write are filled from the CPU through a staging buffer and a GPU copy, because bgfx doesn't allow CPU updates of them.
  11. Regenerate the UnitTests JavaScript bundle: so CI runs the new JavaScript tests.

The commit messages have the details.

Not included

Everything here passes with the Babylon.js 9.29 npm release that CI uses. Changes that need unreleased Babylon.js are kept on shotgun-landing-support:

  • Canvas gradient interpolation in straight RGBA (Interpolate Canvas gradient stops in straight RGBA #1889). It needs Babylon.js to forward the alpha mode in updateDynamicTexture; without that, GUI Gradient Linear with transparency fails.
  • WebGL's global viewport. Babylon.js 9.29's bindFramebuffer(..., forceFullscreenViewport) relies on each framebuffer starting with a full viewport; without that, Depth of field fails.
  • Tests that need Babylon.js changes not yet released: primitive-mode expansion, Canvas alpha representations, float readTexture2, engine creation options and volume textures.

Multisampled depth resolve for ordinary samplers is no longer part of this branch. bgfx now does it, and master reports the sampler metadata it needs (#1930).

Known limitations

  • Apps/PrecompiledShaderTest is unchanged. Its particle effect needs transform-feedback support from a Babylon.js release that hasn't shipped yet.
  • Builds without a shader compiler don't cache the readTransformFeedbackBuffer readback kernel.

Testing (Windows, D3D11, Release, Babylon.js 9.29)

Rebased onto master 3f82b7e4 (includes #1930).

  • Playground app:///Scripts/validation_native.js: 371 ran, 371 passed.
  • UnitTests: 169 passed, 0 failed.
  • The Compute commit builds and passes unit tests on its own.
  • Full Babylon.js visualization sweep on shotgun-landing-support (720 tests, using the Babylon.js changes that drop the matching native workarounds): 705 pass.

Copilot AI balanced review requested due to automatic review settings October 12, 2026 21:01

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.

🟡 Changes recommended

Transform-feedback bounds, cached texture lifetime, arithmetic overflow, and incremental precompilation issues remain unresolved.

4 open findings
What changed in this PR

Brings native rendering closer to WebGL2 semantics across shaders, textures, canvas, primitive modes, viewport state, and transform feedback.

Changes:

  • Adds compute-backed transform feedback and instance repacking.
  • Expands unsupported primitives and improves texture, canvas, viewport, and shader compatibility.
  • Extends shader tooling, caching, precompilation, and regression coverage.
File Description
Polyfills/​Canvas/​Source/​nanovg/​nanovg_babylon.h Adds pooled sampler flags.
Polyfills/​Canvas/​Source/​nanovg/​nanovg_babylon.cpp Applies border sampling to filters.
Polyfills/​Canvas/​Source/​Gradient.cpp Uses straight-alpha interpolation.
Polyfills/​Canvas/​Source/​Context.cpp Supplies transparent border state.
Polyfills/​Canvas/​Readme.md Documents shader generation.
Polyfills/​Canvas/​CMakeLists.txt Shares shaderc integration.
Plugins/​ShaderTool/​Source/​Main.cpp Adds transform-feedback and instanced compilation.
Plugins/​ShaderTool/​README.md Documents new CLI options.
Plugins/​ShaderCompiler/​Source/​ShaderCompilerVulkan.cpp Adds compute and Vulkan bindings.
Plugins/​ShaderCompiler/​Source/​ShaderCompilerTraversers.h Updates coordinate-transform APIs.
Plugins/​ShaderCompiler/​Source/​ShaderCompilerOpenGL.cpp Adds OpenGL compute compilation.
Plugins/​ShaderCompiler/​Source/​ShaderCompilerMetal.cpp Adds Metal compute compilation.
Plugins/​ShaderCompiler/​Source/​ShaderCompilerDXIL.cpp Adds DXIL compute support.
Plugins/​ShaderCompiler/​Source/​ShaderCompilerDXBC.cpp Adds DXBC compute support.
Plugins/​ShaderCompiler/​Source/​ShaderCompilerCommon.h Defines preprocessing and compute APIs.
Plugins/​ShaderCompiler/​Source/​ShaderCompilerCommon.cpp Generates transform-feedback compute shaders.
Plugins/​ShaderCompiler/​InternalInclude/​Babylon/​Plugins/​ShaderCompiler.h Exposes internal compute compilation.
Plugins/​ShaderCache/​Source/​ShaderCacheImpl.h Adds compute cache storage.
Plugins/​ShaderCache/​Source/​ShaderCacheImpl.cpp Persists compute and variant metadata.
Plugins/​ShaderCache/​Source/​ShaderCache.cpp Exposes expanded cache operations.
Plugins/​ShaderCache/​InternalInclude/​Babylon/​Plugins/​ShaderCacheInternal.h Declares variant cache APIs.
Plugins/​NativeOptimizations/​Source/​NativeOptimizations.cpp Supports array matrices and default ranges.
Plugins/​NativeEngine/​Source/​VertexBuffer.h Adds GPU-storage promotion.
Plugins/​NativeEngine/​Source/​VertexBuffer.cpp Implements compute-readable buffers.
Plugins/​NativeEngine/​Source/​VertexArray.h Adds primitive and feedback metadata.
Plugins/​NativeEngine/​Source/​VertexArray.cpp Implements expanded index binding.
Plugins/​NativeEngine/​Source/​StorageBuffer.h Defines compute storage buffers.
Plugins/​NativeEngine/​Source/​StorageBuffer.cpp Implements storage allocation and binding.
Plugins/​NativeEngine/​Source/​Shaders/​cs_instance_repack.sc Adds instance-repacking compute shader.
Plugins/​NativeEngine/​Source/​ShaderProvider.h Declares compute shader retrieval.
Plugins/​NativeEngine/​Source/​ShaderProvider.cpp Integrates compute shader caching.
Plugins/​NativeEngine/​Source/​Program.h Adds compute program state.
Plugins/​NativeEngine/​Source/​Program.cpp Initializes compute and feedback programs.
Plugins/​NativeEngine/​Source/​PrimitiveModeExpansion.h Defines topology expansion.
Plugins/​NativeEngine/​Source/​PrimitiveModeExpansion.cpp Expands loops and fans.
Plugins/​NativeEngine/​Source/​NativeEngine.h Declares new rendering operations.
Plugins/​NativeEngine/​Source/​NativeEngine.cpp Integrates rendering parity behavior.
Plugins/​NativeEngine/​Source/​InstanceRepacker.h Defines GPU instance repacking.
Plugins/​NativeEngine/​Source/​InstanceRepacker.cpp Dispatches instance repacking.
Plugins/​NativeEngine/​Source/​IndexBuffer.h Adds expansion caching.
Plugins/​NativeEngine/​Source/​IndexBuffer.cpp Maintains expandable index data.
Plugins/​NativeEngine/​CMakeLists.txt Builds new engine components.
Dependencies/​shaderc.cmake Generates compute shader backends.
Core/​Graphics/​Source/​FrameBuffer.cpp Adds compute views and row-order transforms.
Core/​Graphics/​InternalInclude/​Babylon/​Graphics/​FrameBuffer.h Extends framebuffer state API.
Core/​Graphics/​InternalInclude/​Babylon/​Graphics/​BgfxShaderInfo.h Adds compute and transform metadata.
CMakeLists.txt Enables full compute-capable shader tools.
Apps/​UnitTests/​Source/​Tests.ShaderCompilation.cpp Tests shader compatibility changes.
Apps/​UnitTests/​Source/​Tests.ShaderCache.cpp Tests compute cache persistence.
Apps/​UnitTests/​Source/​Tests.NativeOptimizations.cpp Tests matrix and range defaults.
Apps/​UnitTests/​Source/​Tests.NativeEngine.TransformFeedback.cpp Tests transform feedback.
Apps/​UnitTests/​Source/​Tests.NativeEngine.TextureFormats.cpp Tests extended commands.
Apps/​UnitTests/​Source/​Tests.NativeEngine.StorageBuffer.cpp Tests storage validation.
Apps/​UnitTests/​Source/​Tests.NativeEngine.PrimitiveModeExpansion.cpp Tests topology expansion.
Apps/​UnitTests/​Source/​Tests.NativeEngine.InstanceData.cpp Tests GPU instance repacking.
Apps/​UnitTests/​Source/​Tests.Canvas.Readback.cpp Tests gradients and filter borders.
Apps/​UnitTests/​JavaScript/​src/​tests.nativeEngine.triangleStripDepth.ts Tests strip depth behavior.
Apps/​UnitTests/​JavaScript/​src/​tests.nativeEngine.primitiveModes.ts Tests expanded primitive rendering.
Apps/​UnitTests/​JavaScript/​src/​tests.nativeEngine.png.ts Tests float texture readback.
Apps/​UnitTests/​JavaScript/​src/​tests.nativeEngine.iblCdf.ts Tests nearest-sampling boundaries.
Apps/​UnitTests/​JavaScript/​src/​tests.nativeEngine.canvasImage.ts Tests Canvas alpha and mipmaps.
Apps/​UnitTests/​JavaScript/​src/​tests.javaScript.all.ts Registers compatibility regressions.
Apps/​UnitTests/​CMakeLists.txt Includes new native tests.
Apps/​PrecompiledShaderTest/​README.md Documents particle shader precompilation.
Apps/​PrecompiledShaderTest/​JavaScript/​tools/​prepareShaders.ts Captures shader variants and varyings.
Apps/​PrecompiledShaderTest/​JavaScript/​src/​index.ts Exercises precompiled GPU particles.
Apps/​PrecompiledShaderTest/​JavaScript/​src/​effects/​particleEffect.ts Defines deterministic GPU particles.
Apps/​PrecompiledShaderTest/​JavaScript/​src/​effects/​effectList.ts Registers particle effects.
Apps/​PrecompiledShaderTest/​CMakeLists.txt Compiles captured shader variants.

🧠 Review effort: Balanced


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread Plugins/NativeEngine/Source/InstanceRepacker.cpp Outdated
Comment thread Plugins/ShaderCompiler/Source/ShaderCompilerCommon.cpp
Comment thread Plugins/NativeEngine/Source/NativeEngine.cpp Outdated
Comment thread Plugins/NativeEngine/Source/NativeEngine.cpp

@bghgary bghgary 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.

[Reviewed by Copilot on behalf of @bghgary]

Concerns inline.

Comment thread Plugins/NativeEngine/Source/InstanceRepacker.cpp Outdated
Comment thread Plugins/NativeEngine/Source/InstanceRepacker.cpp Outdated
Comment thread Plugins/NativeEngine/Source/NativeEngine.cpp Outdated
Comment thread Plugins/NativeEngine/Source/NativeEngine.cpp
Comment thread Plugins/NativeEngine/Source/VertexBuffer.cpp Outdated
Comment thread CMakeLists.txt Outdated
Comment thread Plugins/NativeEngine/Source/NativeEngine.cpp Outdated
Comment thread Plugins/ShaderCompiler/Source/ShaderCompilerCommon.cpp
Comment thread Plugins/ShaderCompiler/Source/ShaderCompilerMetal.cpp Outdated
bkaradzic-microsoft and others added 9 commits October 13, 2026 09:35
Moves to BabylonJS/SPIRV-Cross main, which now includes BabylonJS#15 (an opt-in FXC
nested-loop arithmetic workaround), BabylonJS#16 (flattening of narrow inter-stage
varying arrays) and BabylonJS#17 (collision-free names for the flattened elements).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
bgfx has no line-loop or triangle-fan topology. Expand both into indexed
line/triangle lists, honoring draw ranges, primitive-restart markers and
dynamic index updates, and advertise supportsPrimitiveModeExpansion so
Babylon.js submits them natively. Add topology and rendering regressions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
WebGL texture bindings are context state, but bgfx drops encoder bindings
when a clear moves to another view. Track the material textures set by
SetTexture and replay them after FrameBuffer::Clear, so a draw issued
after a mid-pass clear still samples its textures.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
Keep protocol 9 and the original CLEAR, SETSTENCIL and RGBA8 readTexture
contracts. Add CLEAR2, SETSTENCIL2 and float-preserving readTexture2 with
shared implementations, preserving input validation and view-boundary checks.

Cover mixed command payloads and both readback contracts. Complete rendering
before runtime teardown in the texture fixture used by the raw-stream test.
Retain the deferred FXC workaround and paired JavaScript, cube-shadow,
volume, filtering and Canvas-alpha integration coverage.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
Preprocess native GLSL and alias intrinsic/predefined uniform collisions
while preserving application names and shader-cache metadata. Enable
integer conversions and select non-mip nearest texels before origin flips.

Order repeated raw uploads through staging textures and view-ordered blits
instead of requiring per-camera JavaScript resources. Accept plain-Array
matrices (useHighPrecisionMatrix) and default offset/length in native
vertex transforms and face flipping.

Cover shader names, cache replay, sampler boundaries, texture upload
ordering, native vertex transforms, and restored CDF sampling with
regressions.
Keep native engine protocol 9.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
A browser presents and resets the drawing buffer at the start of every frame
(preserveDrawingBuffer only keeps color). The first use of the default
framebuffer in each frame now clears its depth to 1 and stencil to 0, ignoring
the scissor, so stale depth from the previous frame cannot reject draws.
Clearing uses the active encoder so the caller's encoder is never swapped.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
On top-left-origin backends (D3D11/D3D12/Metal/Vulkan) cube map uploads keep
WebGL row order while rendered cube faces came out vertically mirrored, so
Babylon.js had to compensate (projection Y scale, reversed culling, negated
HDR filter directions). Instead, mirror rendering into cube-face render
targets the way ANGLE does:

- A per-draw bnRenderTargetTransform uniform scales gl_Position.y, remaps
  gl_FragCoord.y and sets the dFdy sign, replacing bnFragCoordTargetSize and
  the static dFdy inversion traverser.
- FrameBuffer mirrors viewport/scissor for GL-row-order targets, and draws
  toggle BGFX_STATE_FRONT_CCW to keep culling and gl_FrontFacing correct.
- Cube readback no longer flips rows.
- Shader cache version bumped to 10.

OpenGL (origin bottom-left) is unchanged.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
WebGL2 accepts RGB float, half-float and 16-bit normalized sources for formats that
Babylon Native stores as RGBA (as ANGLE does on D3D), reads only the texels it needs
from a larger buffer, and can rebuild a mip chain with generateMipmap. Raw uploads now
do the same in C++ so the B.js adapter does not need to convert data:

- loadRawTexture, loadRawTexture2DArray, loadRawTexture3D and updateTextureData widen
  tightly packed RGB data to RGBA with an opaque alpha, and ignore trailing bytes.
- updateTextureData takes an optional generateMipMaps flag. When it is set on a full
  mip level, the rest of that face's or layer's chain is rebuilt with a linear box
  filter, matching gl.generateMipmap for non-render-target textures.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
Native-only plumbing for running compute shaders inside NativeEngine. There is
no JavaScript surface: NativeEngine does not expose compute programs, storage
buffers or dispatch, and Babylon.js keeps supportComputeShaders false. The
first consumer is the transform feedback emulation in the next commit.

- ShaderCompiler::CompileCompute compiles GLSL ES 3.10 compute shaders to bgfx
  CSH binaries on every backend (DXBC, DXIL, SPIR-V, Metal, GLSL ES 3.10).
  Raw SRV/UAV masks are reflected (D3D) or derived from storage buffer
  bindings so bgfx binds byte-address views. Compute samplers keep their
  explicit bindings so they do not alias storage buffer stages.
- The traversers handle compute-only programs (no vertex/fragment stage) and
  leave storage images alone in the sampler splitter.
- Program::InitializeCompute builds compute programs.
- StorageBuffer wraps a compute-writable dynamic vertex buffer, and
  FrameBuffer::Compute dispatches on its own view so the dispatch is ordered
  after earlier work on that frame buffer.
- BABYLON_NATIVE_DISABLE_WEBMIN defaults ON: WebMin glslang/SPIRV-Cross
  cannot compile compute shaders.

Tests: NativeEngineCompute (raw masks, storage round trip) and
NativeEngineStorageBuffer.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
bkaradzic-microsoft and others added 2 commits October 13, 2026 10:09
bgfx has no transform feedback. NativeEngine emulates WebGL2 transform
feedback (RASTERIZER_DISCARD, POINTS, INTERLEAVED_ATTRIBS into one buffer)
with the internal compute support from the previous commit, so Babylon.js
GPUParticleSystem runs unchanged on the WebGL2 path. Babylon.js uses only
the existing native surfaces:

- the varyings argument of createProgram/createProgramAsync;
- getAttributes, which reports transform feedback inputs at locations
  from TRANSFORM_FEEDBACK_ATTRIBUTE_LOCATION_BASE;
- recordVertexBuffer for those inputs;
- COMMAND_DRAWTRANSFORMFEEDBACK (only when bgfx reports BGFX_CAPS_COMPUTE);
- readTransformFeedbackBuffer.

How it works:
- ShaderCompiler::CompileTransformFeedback rewrites the capturing vertex
  shader into a compute shader: one invocation per vertex decodes the
  vertex inputs (float and normalized 8/16-bit integers) from up to four
  raw buffers and writes the captured varyings, tightly packed, into the
  output storage buffer.
- DrawTransformFeedback moves the input and output vertex buffers to GPU
  storage on first use and dispatches through FrameBuffer::Compute. Later
  dispatches and draws in the frame are ordered after it, so no flush is
  needed.
- Draws whose per-instance data comes from GPU storage repack it into
  bgfx instance data with the cs_instance_repack kernel.
- readTransformFeedbackBuffer copies the storage buffer into an R32F
  texture with a small compute kernel (ShaderProvider::GetCompute) and reads
  that back.
- Texture bindings are replayed after dispatches.
- ShaderCache persists ComputeBytes, stores transform feedback shaders in a
  separately keyed section and keys instanced variants by their routed
  attributes, so they can be precompiled (cache version 9). ShaderTool
  gains -v (transform feedback shader and varyings) and -i (instanced
  attributes for the next pair).
- Canvas's shaderc.cmake moves to Dependencies/ and gains the compute
  profiles, so NativeEngine can generate cs_instance_repack with it.

Tests: NativeEngineTransformFeedback, InstanceData and ShaderCache transform
feedback round trip unit tests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
Rebuild dist/tests.javaScript.all.js from the updated sources so CI runs the
new JavaScript tests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
@bkaradzic-microsoft
bkaradzic-microsoft merged commit 54e9023 into BabylonJS:master Oct 13, 2026
35 checks passed
bkaradzic-microsoft added a commit to bkaradzic-microsoft/BabylonNative that referenced this pull request Oct 13, 2026
After BabylonJS#1926, a sweep of every scene with --include-excluded (Windows,
D3D11, Release, Babylon.js 9.29) found 69 excluded scenes that pass alone,
stably across three runs. 60 of them also pass in a full sequential run and
are enabled here.

The other 9 stay excluded with updated reasons: they pass alone but fail,
or make another scene fail, when run after earlier scenes in one process
(Draco decoder 202-204/206, GLTF Serializer camera rotation 227-230, and
Node Geometry Building generator 147, which breaks the Draco fallback).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
bkaradzic-microsoft added a commit to bkaradzic-microsoft/BabylonNative that referenced this pull request Oct 13, 2026
Enable the excluded validation scenes that pass in a full sequential run
after BabylonJS#1926. Only Apps/Playground/Scripts/config.json changes.

17 of them fail on Linux OpenGL CI (llvmpipe), so they get
excludedGraphicsApis ["OpenGL"]. Draco and WebAssembly scenes that hang
on JavaScriptCore and JSI stay excluded.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
bkaradzic-microsoft added a commit to bkaradzic-microsoft/BabylonNative that referenced this pull request Oct 13, 2026
Enable the excluded validation scenes that pass in a full sequential run
after BabylonJS#1926. Only Apps/Playground/Scripts/config.json changes.

17 of them fail on Linux OpenGL CI (llvmpipe), so they get
excludedGraphicsApis ["OpenGL"]. Draco and WebAssembly scenes that hang
on JavaScriptCore and JSI stay excluded.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
bkaradzic-microsoft added a commit that referenced this pull request Oct 13, 2026
Enables 56 validation scenes that pass after #1926. Only
`Apps/Playground/Scripts/config.json` changes.

## How they were picked

- Ran all 720 scenes one at a time with `--include-excluded` (Windows,
D3D11, Release, Babylon.js 9.29 from npm), then re-ran the excluded
scenes that passed twice more to confirm they pass every time.
- Ran the full sequential suite, as CI does, on Windows D3D11 and on
Linux OpenGL (WSL, clang, JavaScriptCore, xvfb + llvmpipe).

## Scenes enabled everywhere except OpenGL (`excludedGraphicsApis:
["OpenGL"]`)

- Prepass + mirror 291/292 and Prepass SSAO 298, 301, 303, 310: llvmpipe
aborts with `LLVM ERROR: Cannot emit physreg copy instruction`. Prepass
SSAO scenes that are already enabled are OpenGL-excluded for the same
reason.
- SubSurface Scattering 479: bgfx `FrameBufferGL::resolve` asserts in
`glDrawBuffers` (the same bug as Screen Space Reflections 2).
- FrameGraph nrge SSR neon 439 and multiple post processes 446: llvmpipe
rejects the 4x MSAA render target format.
- Pixel diff over tolerance on llvmpipe: LineEdgesRenderer 179, GLTF
Serializer KHR materials clearcoat 218, Instanced Bones 256,
MeshSimplification 264, Baked Vertex Animation 331, show-bounding-box
389, glTF Loader Cameras 420/421.

## Still excluded, with updated reasons

- Draco 202-204, 206 and 207, GLTF Serializer KHR draco 217, GLTF Buggy
with Draco 232, and Node Geometry Building generator 147: `createScene`
never resolves on JavaScriptCore (Linux CI) and JSI (Win32 CI), even
when run alone; they pass on Chakra, V8 and QuickJS. The harness can't
exclude per JS engine, so they stay excluded. 147 and 202-206 also get
the `leak-cleanup` workaround, which fixes their order dependency in a
full run.
- screen-space-curvature 411: Hermes (Win32 CI) fails to import
`dragon.babylon`.
- GLTF Serializer camera rotation 227-230: they pass alone but fail
after `GLTF Serializer Rotation conversion, left-handed` in a full run,
and none of the existing workarounds fix it.

## Testing

- Windows D3D11 full run: 427 ran, 427 passed (was 371).
- Linux OpenGL (WSL, JavaScriptCore) full run: 385 ran, 385 passed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 60c2ec68-6de1-445d-9fc9-b699db737eae
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.

3 participants