Skip to content

feat: make wind rendering and backend switching WebGPU-portable - #702

Merged
ibgreen-openai merged 3 commits into
masterfrom
codex/webgpu-wind-renderer-followup
Jul 30, 2026
Merged

feat: make wind rendering and backend switching WebGPU-portable#702
ibgreen-openai merged 3 commits into
masterfrom
codex/webgpu-wind-renderer-followup

Conversation

@ibgreen-openai

Copy link
Copy Markdown
Collaborator

Summary

Follow up on #699 and the deck.gl/luma.gl 9.4 alpha upgrade by making the historical wind scene and adjacent community layers render portably on WebGPU without regressing the merged million-particle showcase.

Wind and GPU rendering

  • Preserve the smooth image-derived WebGL2 mountain terrain and debounced 1,000–1,000,000 GPU-particle density controls.
  • Add native GLSL/WGSL triangle geometry for filled WindLayer arrows and DelaunayCoverLayer station surfaces.
  • Render WebGPU particles directly from GPU-resident point buffers while preserving transform-feedback/WGSL-compute advection and avoiding production CPU readbacks.
  • Correct shared simulation-buffer ownership and defer resource destruction until submitted WebGPU work completes.
  • Use station-triangulated terrain and native fast-text labels on WebGPU while image-derived mountain terrain remains blocked on upstream TerrainLayer support.

Device switching and portable scenes

  • Recreate the underlying Deck renderer when switching WebGL/WebGPU, preserving camera state and widgets.
  • Release cached and late-finishing device instances correctly.
  • Extend dual-backend support and browser coverage for fast text, timeline labels, vertical grids, dependency markers, skyboxes, and horizon graphs.
  • Update the WebGPU compatibility matrix, wind reference pages, showcase guide, upgrade guidance, and release notes.

Validation

  • yarn build — complete workspace package/type/declaration build.
  • yarn test168 files, 1,417 passing tests, nine existing skips.
  • DECK_GL_COMMUNITY_SOFTWARE_WEBGPU=true yarn vitest run --project headless modules/geo-layers/test/wind-layer/wind-layers.browser.spec.ts modules/infovis-layers/test/fast-text-layer.browser.spec.ts modules/layers/test/webgpu-layers.browser.spec.tsseven Chromium WebGL2/WebGPU tests, including native WebGPU error validation and 4,096 GPU-resident wind particles.
  • yarn vitest run --project examples examples/geo-layers/wind/wind-device-tabs.spec.ts examples/geo-layers/wind/wind-terrain.spec.tsfive focused showcase tests.
  • yarn workspace wind-layer-example build — standalone wind production bundle.
  • cd website && yarn build — complete production documentation/website build.
  • yarn lint-fix and the repository's standard commit hooks.

@github-actions

Copy link
Copy Markdown

Coverage

Stmts: 51.00% ▼-0.03% | Branch: 42.11% | Funcs: 49.15% ▼-0.06% | Lines: 51.11% ▼-0.03%

Test Files 168 passed (168)

@ibgreen-openai
ibgreen-openai marked this pull request as ready for review July 30, 2026 15:25

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d208535de9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +98 to +102
varyings.position = projected.clipPosition;
varyings.color = vec4<f32>(
windParticlePoint.color.rgb,
windParticlePoint.color.a * fadeIn * fadeOut * layer.opacity
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Expand WebGPU particles to honor pointRadiusPixels

On WebGPU, this shader emits only one clip-space position for each point-list vertex, whose rasterized size is fixed at one pixel; it never consumes windParticlePoint.pointSize. Consequently, every pointRadiusPixels value—including the documented default radius of 1.6—is ignored and particle heads render as one-pixel squares rather than the requested circular size. The WebGPU path needs to expand each particle into screen-space quad geometry, or use an equivalent size-aware primitive.

Useful? React with 👍 / 👎.

@ibgreen-openai
ibgreen-openai merged commit 0e2d2b7 into master Jul 30, 2026
4 checks passed
@ibgreen-openai
ibgreen-openai deleted the codex/webgpu-wind-renderer-followup branch July 30, 2026 15:57
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.

2 participants