Repository navigation
Bring native rendering closer to WebGL2 parity - #1926
Merged
bkaradzic-microsoft merged 11 commits intoOct 13, 2026
Merged
Conversation
bkaradzic-microsoft
force-pushed
the
shotgun-landing
branch
from
October 12, 2026 21:08
a7bcf2a to
56758e9
Compare
Contributor
There was a problem hiding this comment.
🟡 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.
bkaradzic-microsoft
force-pushed
the
shotgun-landing
branch
5 times, most recently
from
October 13, 2026 00:41
9ca96e2 to
a131819
Compare
bkaradzic-microsoft
force-pushed
the
shotgun-landing
branch
from
October 13, 2026 14:49
a131819 to
b2c47f5
Compare
bghgary
approved these changes
Oct 13, 2026
bkaradzic-microsoft
force-pushed
the
shotgun-landing
branch
from
October 13, 2026 16:13
b2c47f5 to
f15d0d2
Compare
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
force-pushed
the
shotgun-landing
branch
from
October 13, 2026 16:43
f15d0d2 to
3fc7b06
Compare
bkaradzic-microsoft
enabled auto-merge (squash)
October 13, 2026 16:54
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
force-pushed
the
shotgun-landing
branch
from
October 13, 2026 17:11
3fc7b06 to
e203d73
Compare
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
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.


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
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.supportsPrimitiveModeExpansion. Babylon.js 9.29 doesn't use it yet, so this changes nothing for current releases.FrameBuffer::Clear.CLEAR2,SETSTENCIL2and a float-preservingreadTexture2.PerFrameValuenow 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).generateMipmapfor raw textures.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:updateDynamicTexture; without that,GUI Gradient Linear with transparencyfails.bindFramebuffer(..., forceFullscreenViewport)relies on each framebuffer starting with a full viewport; without that,Depth of fieldfails.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/PrecompiledShaderTestis unchanged. Its particle effect needs transform-feedback support from a Babylon.js release that hasn't shipped yet.readTransformFeedbackBufferreadback 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.shotgun-landing-support(720 tests, using the Babylon.js changes that drop the matching native workarounds): 705 pass.