From 38aa2482017033f7bc500f67067e481a32c3870e Mon Sep 17 00:00:00 2001 From: Ryan Tremblay Date: Fri, 27 Feb 2026 08:57:56 -0800 Subject: [PATCH 1/6] Uncomment test for ibl shadows --- packages/tools/viewer/test/viewer.test.ts | 37 +++++++++++------------ 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/packages/tools/viewer/test/viewer.test.ts b/packages/tools/viewer/test/viewer.test.ts index bfa46b6bfe6..6033c185451 100644 --- a/packages/tools/viewer/test/viewer.test.ts +++ b/packages/tools/viewer/test/viewer.test.ts @@ -242,22 +242,21 @@ test('environment="auto"', async ({ page }) => { expect(isEnvironmentLoaded).toBeTruthy(); }); -// TODO: Uncomment when IBL shadow bugs with WebGPU are resolved. -// test('shadow-quality="high"', async ({ page }) => { -// const viewerElementHandle = await attachViewerElement( -// page, -// ` -// -// -// ` -// ); - -// // Wait for the viewerDetails property to become defined -// await page.waitForFunction((viewerElement) => { -// // For now, we'll just rely on the common per-test validation that there are now unhandled page errors or console errors. -// return (viewerElement as ViewerElement).viewerDetails; -// }, viewerElementHandle); -// }); +test('shadow-quality="high"', async ({ page }) => { + const viewerElementHandle = await attachViewerElement( + page, + ` + + + ` + ); + + // Wait for the viewerDetails property to become defined + await page.waitForFunction((viewerElement) => { + // For now, we'll just rely on the common per-test validation that there are now unhandled page errors or console errors. + return (viewerElement as ViewerElement).viewerDetails; + }, viewerElementHandle); +}); From b72d9bf377c6826f5aae0e6c6a16ab1010c5781e Mon Sep 17 00:00:00 2001 From: Ryan Tremblay Date: Fri, 27 Feb 2026 10:13:45 -0800 Subject: [PATCH 2/6] Check for MAX_DRAW_BUFFERS 6 before assuming 8 --- packages/dev/core/src/Shaders/iblVoxelGrid.fragment.fx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/dev/core/src/Shaders/iblVoxelGrid.fragment.fx b/packages/dev/core/src/Shaders/iblVoxelGrid.fragment.fx index a58ae28bf77..1be029563f7 100644 --- a/packages/dev/core/src/Shaders/iblVoxelGrid.fragment.fx +++ b/packages/dev/core/src/Shaders/iblVoxelGrid.fragment.fx @@ -21,7 +21,9 @@ void main(void) { #if MAX_DRAW_BUFFERS > 4 glFragData[4] = normPos.z >= nearPlane + 4.0 * stepSize && normPos.z < nearPlane + 5.0 * stepSize ? 1.0 : 0.0; glFragData[5] = normPos.z >= nearPlane + 5.0 * stepSize && normPos.z < nearPlane + 6.0 * stepSize ? 1.0 : 0.0; +#if MAX_DRAW_BUFFERS > 6 glFragData[6] = normPos.z >= nearPlane + 6.0 * stepSize && normPos.z < nearPlane + 7.0 * stepSize ? 1.0 : 0.0; glFragData[7] = normPos.z >= nearPlane + 7.0 * stepSize && normPos.z < nearPlane + 8.0 * stepSize ? 1.0 : 0.0; #endif +#endif } \ No newline at end of file From 6652a7acfa1af19f63381d4872af7bbc146e2ed1 Mon Sep 17 00:00:00 2001 From: Ryan Tremblay Date: Fri, 27 Feb 2026 10:14:40 -0800 Subject: [PATCH 3/6] PR feedback --- packages/tools/viewer/test/viewer.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tools/viewer/test/viewer.test.ts b/packages/tools/viewer/test/viewer.test.ts index 6033c185451..c5232fa8157 100644 --- a/packages/tools/viewer/test/viewer.test.ts +++ b/packages/tools/viewer/test/viewer.test.ts @@ -256,7 +256,7 @@ test('shadow-quality="high"', async ({ page }) => { // Wait for the viewerDetails property to become defined await page.waitForFunction((viewerElement) => { - // For now, we'll just rely on the common per-test validation that there are now unhandled page errors or console errors. + // For now, we'll just rely on the common per-test validation that there are no unhandled page errors or console errors. return (viewerElement as ViewerElement).viewerDetails; }, viewerElementHandle); }); From 6860c0038033250e389e350071effc78b424fca3 Mon Sep 17 00:00:00 2001 From: Ryan Tremblay Date: Fri, 27 Feb 2026 10:58:18 -0800 Subject: [PATCH 4/6] Add some logging --- packages/tools/viewer/test/viewer.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/tools/viewer/test/viewer.test.ts b/packages/tools/viewer/test/viewer.test.ts index c5232fa8157..969cb62d094 100644 --- a/packages/tools/viewer/test/viewer.test.ts +++ b/packages/tools/viewer/test/viewer.test.ts @@ -19,6 +19,7 @@ test.beforeEach(({ page }) => { }); page.on("console", (message) => { + console.log(`[browser] ${message.text()}`); if (message.type() === "error" || message.type() === "warning") { const text = message.text(); // Only capture messages from Babylon.js (prefixed with "BJS -"). @@ -34,6 +35,9 @@ test.afterEach(async ({ page }) => { await page.waitForFunction(() => { const viewer = document.querySelector("babylon-viewer") as ViewerElement; const engine = viewer.viewerDetails?.scene.getEngine(); + if (engine) { + console.log(`Current frame: ${engine.frameId}`); + } return engine && engine.frameId >= 100; }); expect(pageErrors, "Unhandled page errors").toEqual([]); From 82df3b1beef3682eb7787eaef57b03a2c89e1dbf Mon Sep 17 00:00:00 2001 From: Ryan Tremblay Date: Fri, 27 Feb 2026 11:24:10 -0800 Subject: [PATCH 5/6] More test fixes, reducing number of frames rendered since it is slow on build agents --- packages/tools/viewer/test/viewer.test.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/tools/viewer/test/viewer.test.ts b/packages/tools/viewer/test/viewer.test.ts index 969cb62d094..27a430cc83c 100644 --- a/packages/tools/viewer/test/viewer.test.ts +++ b/packages/tools/viewer/test/viewer.test.ts @@ -31,15 +31,17 @@ test.beforeEach(({ page }) => { }); test.afterEach(async ({ page }) => { - // Wait until 100 frames have been rendered to allow async errors (e.g. WebGPU validation) to surface. - await page.waitForFunction(() => { + // Wait until at least 50 frames have been rendered to allow async errors (e.g. WebGPU validation) to surface. + const minFrameCount = 50; + const frameIdHandle = await page.waitForFunction((minFrameCount) => { const viewer = document.querySelector("babylon-viewer") as ViewerElement; const engine = viewer.viewerDetails?.scene.getEngine(); - if (engine) { - console.log(`Current frame: ${engine.frameId}`); - } - return engine && engine.frameId >= 100; - }); + return engine && engine.frameId >= minFrameCount ? engine.frameId : null; + }, minFrameCount); + + const actualFrameCount = await frameIdHandle.jsonValue(); + console.log(`${actualFrameCount} of minimum ${minFrameCount} frames rendered.`); + expect(actualFrameCount).toBeGreaterThanOrEqual(minFrameCount); expect(pageErrors, "Unhandled page errors").toEqual([]); expect(consoleErrors, "Console errors").toEqual([]); }); From a5c741028752b435715f312390001b1784d0bdb7 Mon Sep 17 00:00:00 2001 From: Ryan Tremblay Date: Fri, 27 Feb 2026 12:51:41 -0800 Subject: [PATCH 6/6] Another similar fix --- .../core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.ts b/packages/dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.ts index 30450dc3909..b40f0a43530 100644 --- a/packages/dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.ts +++ b/packages/dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.ts @@ -295,7 +295,10 @@ export class _IblShadowsVoxelRenderer { } const isWebGPU = this._engine.isWebGPU; - this._maxDrawBuffers = this._engine.getCaps().maxDrawBuffers || 0; + // Round down to a power of 2 so it evenly divides the power-of-2 voxel resolution, + // preventing out-of-bounds layer indices in the last MRT slab. + const rawMaxDrawBuffers = this._engine.getCaps().maxDrawBuffers || 0; + this._maxDrawBuffers = rawMaxDrawBuffers >= 1 ? 1 << Math.floor(Math.log2(rawMaxDrawBuffers)) : 0; this._copyMipEffectRenderer = new EffectRenderer(this._engine); this._copyMipEffectWrapper = new EffectWrapper({