Skip to content

perf(engine): keep the WebGL pipeline when Model parameters change #6452

perf(engine): keep the WebGL pipeline when Model parameters change

perf(engine): keep the WebGL pipeline when Model parameters change #6452

Workflow file for this run

name: test
# On every pull request, but only on push to master
on:
push:
branches:
- master
pull_request:
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
browser_coverage:
name: Browser coverage (${{ matrix.shard }}/3)
runs-on: ubuntu-22.04
# Visual checks run separately so shard weights describe only browser specs.
timeout-minutes: 25
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3]
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup Node (with Corepack)
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
- name: Enable Corepack / Yarn 4
run: |
corepack enable
corepack prepare yarn@4.13.0 --activate
yarn -v
- name: Restore Yarn Berry artifacts
id: yarn-cache
uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: |
~/.yarn/berry/cache
.yarn/install-state.gz
key: ${{ runner.os }}-yarn4-${{ hashFiles('yarn.lock', '.yarnrc.yml', 'package.json') }}
restore-keys: |
${{ runner.os }}-yarn4-
- name: Install dependencies
run: yarn install --immutable
- name: Save Yarn Berry artifacts
if: steps.yarn-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: |
~/.yarn/berry/cache
.yarn/install-state.gz
key: ${{ steps.yarn-cache.outputs.cache-primary-key }}
- name: Cache Playwright Chromium
id: playwright-cache
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-ms-playwright-${{ hashFiles('yarn.lock', 'package.json') }}
- name: Install Playwright Chromium
run: yarn exec playwright install chromium
- name: Reclaim install cache and report disk usage
run: |
rm -rf "${HOME}/.yarn/berry/cache"
df -h .
du -sh . "${HOME}/.yarn" "${HOME}/.cache/ms-playwright" "${RUNNER_TEMP}" 2>/dev/null || true
- name: Check WebGPU and WebGL canvas capture
if: matrix.shard == 1
timeout-minutes: 2
run: xvfb-run -a yarn test-presentation
- name: Run headless tests and generate coverage
env:
# Include browser process failures alongside WebGPU test assertions.
DEBUG: pw:browser
run: |
yarn test-coverage --shard=${{ matrix.shard }}/3
- name: Report disk usage after coverage
if: always()
run: |
df -h .
du -sh . coverage "${HOME}/.yarn" "${HOME}/.cache/ms-playwright" "${RUNNER_TEMP}" 2>/dev/null || true
- name: Sanitize lcov for Coveralls
run: |
node - <<'NODE'
const fs = require('fs');
const coveragePath = 'coverage/lcov.info';
const lines = fs.readFileSync(coveragePath, 'utf8').split(/\r?\n/);
const records = [];
let currentRecord = [];
for (const line of lines) {
currentRecord.push(line);
if (line === 'end_of_record') {
const sourceFileLine = currentRecord.find(recordLine => recordLine.startsWith('SF:'));
const sourceFile = sourceFileLine ? sourceFileLine.slice(3).trim() : '';
if (sourceFile) {
records.push(currentRecord.join('\n'));
}
currentRecord = [];
}
}
if (currentRecord.length) {
const sourceFileLine = currentRecord.find(recordLine => recordLine.startsWith('SF:'));
const sourceFile = sourceFileLine ? sourceFileLine.slice(3).trim() : '';
if (sourceFile) {
records.push(currentRecord.join('\n'));
}
}
fs.writeFileSync(coveragePath, `${records.join('\n')}\n`);
NODE
- name: Upload browser coverage artifact
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: browser-coverage-lcov-${{ matrix.shard }}
path: coverage/lcov.info
if-no-files-found: error
retention-days: 1
visual_examples:
name: Visual examples (${{ matrix.group }})
runs-on: ubuntu-22.04
timeout-minutes: 25
strategy:
fail-fast: false
matrix:
group: [city, styles, effects, atlas]
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup Node (with Corepack)
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
- name: Enable Corepack / Yarn 4
run: |
corepack enable
corepack prepare yarn@4.13.0 --activate
yarn -v
- name: Restore Yarn Berry artifacts
id: yarn-cache
uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: |
~/.yarn/berry/cache
.yarn/install-state.gz
key: ${{ runner.os }}-yarn4-${{ hashFiles('yarn.lock', '.yarnrc.yml', 'package.json') }}
restore-keys: |
${{ runner.os }}-yarn4-
- name: Install dependencies
run: yarn install --immutable
- name: Save Yarn Berry artifacts
if: steps.yarn-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: |
~/.yarn/berry/cache
.yarn/install-state.gz
key: ${{ steps.yarn-cache.outputs.cache-primary-key }}
- name: Cache Playwright Chromium
id: playwright-cache
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-ms-playwright-${{ hashFiles('yarn.lock', 'package.json') }}
- name: Install Playwright Chromium
run: yarn exec playwright install chromium
- name: Run Deck pattern fill visual checks
if: ${{ matrix.group == 'styles' }}
run: xvfb-run -a yarn workspace luma.gl-examples-deck-pattern-fills test:visual
- name: Upload Deck pattern fill screenshots
if: ${{ always() && matrix.group == 'styles' }}
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: deck-pattern-fills
path: /tmp/pattern-fills-*.png
- name: Run Deck sketch edges visual checks
if: ${{ matrix.group == 'styles' }}
run: xvfb-run -a yarn workspace luma.gl-examples-deck-sketch-edges test:visual
- name: Upload Deck sketch edge screenshots
if: ${{ always() && matrix.group == 'styles' }}
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: deck-sketch-edges
path: /tmp/sketch-edges-*.png
- name: Run Deck city scene visual smoke
if: ${{ matrix.group == 'city' }}
env:
CITY_SCENE_ARTIFACTS: ${{ runner.temp }}
run: xvfb-run -a yarn workspace luma.gl-examples-deck-city-scene test:visual
- name: Upload Deck city scene screenshots
if: ${{ always() && matrix.group == 'city' }}
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: deck-city-scene
path: ${{ runner.temp }}/city-scene-*.png
if-no-files-found: warn
retention-days: 7
- name: Run Deck globe weather visual checks
if: ${{ matrix.group == 'city' }}
run: xvfb-run -a yarn workspace luma.gl-examples-deck-globe-clouds test:visual
- name: Upload globe weather screenshots
if: ${{ always() && matrix.group == 'city' }}
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: deck-globe-cloud-cover
path: /tmp/globe-cloud-cover-*.png
if-no-files-found: warn
retention-days: 7
- name: Run Deck lights and fireflies visual checks
if: ${{ matrix.group == 'styles' }}
run: xvfb-run -a yarn workspace luma.gl-examples-deck-point-glow test:visual
- name: Upload Deck lights and fireflies screenshots
if: ${{ always() && matrix.group == 'styles' }}
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: deck-point-glow
path: /tmp/riverfront-fireflies*.png
if-no-files-found: warn
retention-days: 7
- name: Run riverfront routes visual smoke
if: ${{ matrix.group == 'styles' }}
run: xvfb-run -a yarn workspace luma.gl-examples-deck-styled-paths test:visual
- name: Upload riverfront routes screenshots
if: ${{ always() && matrix.group == 'styles' }}
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: deck-styled-paths
path: /tmp/styled-paths-*.png
- name: Run riverfront effects visual smoke
if: ${{ matrix.group == 'effects' }}
run: xvfb-run -a yarn workspace luma.gl-examples-deck-scene-buffers test:visual
- name: Upload riverfront effects screenshots
if: ${{ always() && matrix.group == 'effects' }}
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: deck-scene-buffers
path: /tmp/scene-buffers-*.png
- name: Test riverfront GPU flow
if: ${{ matrix.group == 'effects' }}
run: xvfb-run -a yarn workspace luma.gl-examples-deck-flow-particles test:visual
- name: Test riverfront weather
if: ${{ matrix.group == 'effects' }}
run: xvfb-run -a yarn workspace luma.gl-examples-deck-weather test:visual
- name: Test shared height fog in Visualization City
if: ${{ matrix.group == 'effects' }}
run: xvfb-run -a yarn workspace luma.gl-examples-experimental-advanced-effects test:fog
# Atlas uses its workspace Playwright version and runs on a dedicated matrix worker.
- name: Install Spatial Atlas Playwright Chromium
if: ${{ matrix.group == 'atlas' }}
run: yarn workspace luma.gl-examples-showcase-billion-point-spatial-atlas exec playwright install chromium
- name: Run Billion-Point Spatial Atlas visual smoke
if: ${{ matrix.group == 'atlas' }}
env:
SPATIAL_ATLAS_SCREENSHOT: ${{ runner.temp }}/billion-point-spatial-atlas.png
run: yarn workspace luma.gl-examples-showcase-billion-point-spatial-atlas test:visual
- name: Upload Billion-Point Spatial Atlas visual smoke screenshot
if: ${{ always() && matrix.group == 'atlas' }}
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: billion-point-spatial-atlas-visual-smoke
path: ${{ runner.temp }}/billion-point-spatial-atlas*.png
if-no-files-found: warn
retention-days: 7
gltf_reference_evidence:
name: glTF WebGPU/WebGL2 reference evidence
# Ubuntu's CPU-backed WebGPU adapter destroys its device when the bump-material PBR command
# buffer is submitted. Use GitHub's fixed M1 runner for trustworthy hardware reference pixels.
runs-on: macos-15
timeout-minutes: 20
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup Node (with Corepack)
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
- name: Enable Corepack / Yarn 4
run: |
corepack enable
corepack prepare yarn@4.13.0 --activate
yarn -v
- name: Cache Yarn Berry artifacts
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: |
~/.yarn/berry/cache
.yarn/install-state.gz
key: ${{ runner.os }}-yarn4-${{ hashFiles('yarn.lock', '.yarnrc.yml', 'package.json') }}
restore-keys: |
${{ runner.os }}-yarn4-
- name: Install dependencies
run: yarn install --immutable
- name: Cache Playwright Chromium
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-ms-playwright-${{ hashFiles('yarn.lock', 'package.json') }}
- name: Install Playwright Chromium
run: yarn exec playwright install chromium
- name: Test glTF reference tooling
run: yarn gltf:reference-evidence:test
- name: Capture deterministic glTF evidence
run: >-
yarn gltf:reference-evidence
--headless
--artifact-base "${RUNNER_TEMP}/gltf-reference"
- name: Upload glTF reference evidence
if: always()
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: gltf-reference-evidence
path: ${{ runner.temp }}/gltf-reference
if-no-files-found: error
retention-days: 7
node_coverage:
name: Node coverage
runs-on: ubuntu-22.04
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup Node (with Corepack)
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
- name: Enable Corepack / Yarn 4
run: |
corepack enable
corepack prepare yarn@4.13.0 --activate
yarn -v
- name: Cache Yarn Berry artifacts
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: |
~/.yarn/berry/cache
.yarn/install-state.gz
key: ${{ runner.os }}-yarn4-${{ hashFiles('yarn.lock', '.yarnrc.yml', 'package.json') }}
restore-keys: |
${{ runner.os }}-yarn4-
- name: Install dependencies
run: yarn install --immutable
- name: Collect focused Node coverage
run: yarn test-node-coverage
- name: Upload Node coverage artifact
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: node-coverage-lcov
path: coverage-node/lcov.info
if-no-files-found: error
retention-days: 1
test:
name: Aggregate test coverage
needs: [browser_coverage, node_coverage, visual_examples]
if: ${{ !cancelled() }}
runs-on: ubuntu-22.04
timeout-minutes: 5
steps:
- name: Checkout code for coverage reporting
if: ${{ needs.browser_coverage.result == 'success' && needs.node_coverage.result == 'success' }}
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Download browser coverage artifacts
if: ${{ needs.browser_coverage.result == 'success' && needs.node_coverage.result == 'success' }}
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
with:
pattern: browser-coverage-lcov-*
path: coverage/shards
- name: Download Node coverage artifact
if: ${{ needs.browser_coverage.result == 'success' && needs.node_coverage.result == 'success' }}
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
with:
name: node-coverage-lcov
path: coverage/shards/node-coverage-lcov
- name: Merge browser and Node coverage reports
if: ${{ needs.browser_coverage.result == 'success' && needs.node_coverage.result == 'success' }}
run: |
node ./test/utils/merge-lcov.mjs \
--output coverage/lcov.info \
coverage/shards/browser-coverage-lcov-1/lcov.info \
coverage/shards/browser-coverage-lcov-2/lcov.info \
coverage/shards/browser-coverage-lcov-3/lcov.info \
coverage/shards/node-coverage-lcov/lcov.info
- name: Upload combined coverage to Coveralls
if: ${{ needs.browser_coverage.result == 'success' && needs.node_coverage.result == 'success' }}
uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
file: coverage/lcov.info
# Reruns must not upload into a build that a previous attempt closed.
build-number: ${{ github.run_id }}-${{ github.run_attempt }}
- name: Verify all coverage and visual jobs passed
if: always()
env:
BROWSER_COVERAGE_RESULT: ${{ needs.browser_coverage.result }}
NODE_COVERAGE_RESULT: ${{ needs.node_coverage.result }}
VISUAL_EXAMPLES_RESULT: ${{ needs.visual_examples.result }}
run: |
if [ "$BROWSER_COVERAGE_RESULT" != "success" ]; then
echo "::error::Browser coverage shards finished with status: $BROWSER_COVERAGE_RESULT"
exit 1
fi
if [ "$VISUAL_EXAMPLES_RESULT" != "success" ]; then
echo "::error::Visual example jobs finished with status: $VISUAL_EXAMPLES_RESULT"
exit 1
fi
if [ "$NODE_COVERAGE_RESULT" != "success" ]; then
echo "::error::Node coverage job finished with status: $NODE_COVERAGE_RESULT"
exit 1
fi
lighting_examples:
name: Riverfront lighting (${{ matrix.example }})
runs-on: ubuntu-22.04
# Fireflies compares emission colors, bloom, reflections and motion on SwiftShader.
timeout-minutes: ${{ matrix.example == 'fireflies' && 20 || 15 }}
strategy:
fail-fast: false
matrix:
example: [fireflies, hdr-night-lighting, global-illumination, light-shafts]
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
- name: Enable Corepack
run: corepack enable
- name: Cache Yarn Berry artifacts
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: |
~/.yarn/berry/cache
.yarn/install-state.gz
key: ${{ runner.os }}-yarn4-${{ hashFiles('yarn.lock', '.yarnrc.yml', 'package.json') }}
restore-keys: |
${{ runner.os }}-yarn4-
- name: Install dependencies
run: yarn install --immutable
- name: Build packages
run: yarn build
- name: Cache Playwright Chromium
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-ms-playwright-${{ hashFiles('yarn.lock', 'package.json') }}
- name: Install Chromium
run: yarn exec playwright install --with-deps chromium
- name: Verify shared lighting examples
run: xvfb-run -a node examples/deck/riverfront-lighting-visual.mjs "${{ matrix.example }}"
- name: Upload lighting screenshots
if: always()
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: riverfront-lighting-${{ matrix.example }}
path: /tmp/riverfront-${{ matrix.example }}.png
if-no-files-found: warn
retention-days: 7
examples:
name: Build, lint, Node tests, examples, and website
runs-on: ubuntu-22.04
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup Node (with Corepack)
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
- name: Enable Corepack / Yarn 4
run: |
corepack enable
corepack prepare yarn@4.13.0 --activate
yarn -v
- name: Cache Yarn Berry artifacts
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: |
~/.yarn/berry/cache
.yarn/install-state.gz
key: ${{ runner.os }}-yarn4-${{ hashFiles('yarn.lock', '.yarnrc.yml', 'package.json') }}
restore-keys: |
${{ runner.os }}-yarn4-
- name: Install dependencies
run: yarn install --immutable
- name: Check bundle-size budgets
run: |
bundleSizeStatus=0
yarn bundle-size --output .bundle-size || bundleSizeStatus=$?
cat .bundle-size/report.md >> "$GITHUB_STEP_SUMMARY"
exit "$bundleSizeStatus"
- name: Upload bundle-size report
if: always()
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: bundle-size-report
path: .bundle-size
if-no-files-found: error
include-hidden-files: true
- name: Build packages for example type declarations
run: |
yarn build
- name: Verify experimental geospatial package imports
run: yarn test-geospatial-package
- name: Run lint
run: |
yarn lint
- name: Run Node tests
run: yarn test-node
- name: Typecheck examples
run: |
yarn examples:typecheck
- name: Synchronize website example assets
run: node website/scripts/sync-example-assets.mjs
- name: Build standalone website examples
run: yarn workspace website-docusaurus build:standalone-examples
- name: Build Docusaurus website
env:
NODE_OPTIONS: --max-old-space-size=6144
run: yarn workspace website-docusaurus docusaurus build
- name: Normalize LLM documentation output
run: node website/scripts/normalize-llm-output.mjs
- name: Validate LLM documentation output
run: node website/scripts/check-llm-output.mjs