Skip to main content

WebGPU Compatibility and Migration

deck.gl-community is adding WebGPU support incrementally while continuing to support WebGL2. Compatibility is tracked per layer and integration: adding a WebGPU adapter to a package does not, by itself, make every shader, extension, or map integration portable.

Layer support matrix

✅ means implemented and verified, 🚧 means partial, planned, or dependent on additional validation, and ❌ means unavailable on that backend.

ModuleLayer or integrationWebGL2WebGPUNotes
@deck.gl-community/layersSkyboxLayerNative GLSL and WGSL cubemap shaders.
@deck.gl-community/layersDependencyArrowLayer, line modePortable LineLayer and native WGSL marker geometry.
@deck.gl-community/layersDependencyArrowLayer, arc modeBrowser-verified upstream ArcLayer and native WGSL marker geometry.
@deck.gl-community/layersDependencyArrowLayer, path modeBrowser-verified upstream PathLayer, outlines, and native WGSL markers.
@deck.gl-community/layersPathOutlineLayerUpstream dual-backend PathLayer; a local WGSL dash plugin bridges the still-GLSL-only PathStyleExtension.
@deck.gl-community/layersPathMarkerLayerBrowser-verified outlined and dashed paths with native WGSL marker geometry.
@deck.gl-community/infovis-layersBlockLayerNative WGSL, projection, picking, fills, outlines, and float32 binary attributes.
@deck.gl-community/infovis-layersAnimationLayer🚧Depends on the wrapped layer's backend support.
@deck.gl-community/infovis-layersTimeDeltaLayerPortable interval guides and native WGSL FastTextLayer labels.
@deck.gl-community/infovis-layersFastTextLayerNative WGSL adapted from luma.gl's text-renderer patterns; existing packed glyphs, bitmap/SDF atlases, clipping, alignment, and mipmaps work on both backends.
@deck.gl-community/timeline-layersHorizonGraphLayerNative WGSL; WebGPU preserves float bits in baseline-compatible r32uint textures.
@deck.gl-community/timeline-layersMultiHorizonGraphLayerPortable horizon shaders and dual-backend line dividers.
@deck.gl-community/timeline-layersTimeAxisLayer🚧Grid lines are portable; upstream TextLayer labels still require stable WebGPU validation.
@deck.gl-community/timeline-layersVerticalGridLayerBrowser-verified portable LineLayer grid marks and viewport-driven ticks.
@deck.gl-community/timeline-layersTimelineLayer geometryBrowser-verified tracks, clips, scrubber polygons, and lines using upstream dual-backend layers.
@deck.gl-community/timeline-layersTimelineLayer labels and interactions🚧Text labels and pointer/drag behavior still require stable WebGPU browser coverage.
@deck.gl-community/trace-layersTraceGraphLayer and TracePreparedStateLayerBrowser-verified span blocks, backgrounds, outlines, row separators, fast labels, and straight dependency markers.
@deck.gl-community/trace-layersTraceProcessLayerAutomatically selects WebGPU-compatible binary blocks, fast span and overflow labels, and straight dependency rendering.
@deck.gl-community/trace-layersCounter sparklinesPreserves every sparkline vertex as a dual-backend LineLayer segment.
@deck.gl-community/trace-layersCurved dependencies and row separatorsBrowser-verified upstream ArcLayer curves and portable solid LineLayer separators.
@deck.gl-community/trace-layersDeckTraceGraph and Tracevis overview🚧Managed devices and backend-neutral timing are available; complete legend, minimap, picking, and application validation remains in progress.
@deck.gl-community/graph-layersGraphLayer, EdgeLayer, and node layers🚧Static path edges, arrow decorators, and rounded nodes are portable; complete graph styling, images, labels, layouts, and picking still require end-to-end validation.
@deck.gl-community/graph-layersRoundedRectangleLayerRounded corners are CPU-tessellated and rendered with upstream dual-backend PolygonLayer.
@deck.gl-community/graph-layersPathEdgeLayer and EdgeArrowLayerBrowser-verified upstream path rendering and polygon arrowheads.
@deck.gl-community/graph-layersFlowPathLayerExisting transform-feedback implementation is incomplete; requires redesign.
@deck.gl-community/geo-layersParticleLayerBrowser-verified WebGL2 transform-feedback and WebGPU compute advection; production rendering uses GPU particle buffers without readbacks.
@deck.gl-community/geo-layersWind-field utilities and DelaunayInterpolationBackend-independent station indexing, explicit sampling, and optional CPU rasterization.
@deck.gl-community/geo-layersWindLayerNative WGSL/GLSL filled-arrow triangles and portable line shafts and arrowheads.
@deck.gl-community/geo-layersElevationLayerImage-derived mountain terrain depends on upstream TerrainLayer; skipped safely on WebGPU.
@deck.gl-community/geo-layersDelaunayCoverLayerNative WGSL/GLSL station triangles, elevation scaling, and height-based coloring.
@deck.gl-community/geo-layersComplete Wind Map showcase🚧GPU particles, arrows, labels, state boundaries, and station terrain are portable; image terrain remains upstream-dependent.
@deck.gl-community/geo-layersGlobalGridLayer and TileGridLayer bordersBrowser-verified upstream polygon and path renderers using local grid and tile data.
@deck.gl-community/geo-layersSharedTile2DLayer and TileSourceLayer🚧Validate tile formats, texture upload, labels, and picking.
@deck.gl-community/arrow-layersColumn, heatmap, path, point-cloud, polygon, scatterplot, and solid-polygon layersBrowser-verified Arrow binary attributes through the corresponding upstream renderers.
@deck.gl-community/arrow-layersArc, H3, text, and trips layers🚧Arc binary attributes exceed the baseline eight-vertex-buffer limit; the others require upstream renderer validation or remaining custom shader work.
@deck.gl-community/editable-layersGeoJSON paths, polygons, and edit handlesBrowser-verified EditableGeoJsonLayer rendering in ModifyMode, including the WebGPU picking-width shader path.
@deck.gl-community/editable-layersEditing and selection interactions🚧Pointer, drag, snapping, and selection behavior still require browser interaction coverage on WebGPU.
@deck.gl-community/basemap-layersBasemapLayer🚧Support depends on the selected style's polygon, path, and label sublayers.
@deck.gl-community/threeTreeLayer🚧Three.js builds the geometry, but deck.gl renders it through upstream SimpleMeshLayer, whose WebGPU port is still pending.
@deck.gl-community/leafletLeaflet map overlayA host-owned WebGL context cannot be switched to WebGPU.
@deck.gl-community/bing-mapsBing Maps overlayA host-owned WebGL context cannot be switched to WebGPU.
@deck.gl-community/widgetsDeviceManagerController and DeviceTabsWidgetSelects and attaches an independently managed real rendering device.

Selecting a graphics backend

The website injects luma.gl-style WebGPU/WebGL2 tabs into every gallery example and live layer-reference example. Its shared imperative-example host owns a separate DeviceManagerController and standalone DeviceTabsWidget for each mounted surface, preserves the example's existing widgets and view state, and passes the selected luma.gl device to the actual Deck instance. Standalone examples stay independent: they only expose an optional onDeckInitialized callback so a website or another embedding application can configure their Deck.

The @deck.gl-community/widgets package also exposes both primitives for applications that want to manage their own backend selection:

import {Deck} from '@deck.gl/core';
import {DeviceManagerController, DeviceTabsWidget} from '@deck.gl-community/widgets';

const manager = new DeviceManagerController();
let deck;
let activeDevice;
let currentViewState = initialViewState;

const unsubscribe = manager.subscribe(({device}) => {
if (!device || device === activeDevice) {
return;
}

activeDevice = device;
deck?.finalize();
manager.reparentCanvas(container, device);
deck = new Deck({
device,
parent: container,
initialViewState: currentViewState,
onViewStateChange: ({viewState}) => {
currentViewState = viewState;
return viewState;
},
layers: createLayers(device),
widgets: [
new DeviceTabsWidget({
devices: ['webgpu', 'webgl2'],
manager
})
]
});
});

void manager.initialize();

// When the surface is removed:
unsubscribe();
deck?.finalize();
manager.reset();

WebGPU is preferred when available. The manager respects a previously selected backend, disables unavailable devices, and falls back to WebGL2. A backend switch must recreate Deck with the newly selected device; deck.setProps({device}) does not migrate an existing renderer, canvas, or layer resources. Preserve view state across recreation, create only layers supported by the selected backend, and call manager.reset() after finalizing the renderer to destroy every cached device.

Every documentation page also displays a generated WebGPU status badge linked to this matrix. Specific verified or blocked layer pages override their package's aggregate status, while backend-neutral APIs are marked not applicable. Standalone example applications accept an optional device and widgets but do not own device management. Path outlines, path markers, and dependency routes now render through the selected backend.

Compatibility roadmap

StageLayers or integrationsStatus
Existing referenceSkyboxLayerProvides native WGSL and GLSL sources, portable cubemap bindings, and a switchable skybox example.
First waveBlockLayer, DependencyArrowLayer marker geometry, HorizonGraphLayer, and MultiHorizonGraphLayerNative WGSL and existing GLSL are maintained together. Stacked horizon dividers use the upstream dual-backend LineLayer; the website injects real WebGPU/WebGL2 device selection into the skybox, path, block, and horizon examples.
Wind showcaseParticleLayer, wind-field utilities, WindLayer, and DelaunayCoverLayerWebGL2 transform-feedback, WebGPU compute, native arrow triangles, and station-surface rendering are browser-verified. Image-based mountain terrain still depends on upstream TerrainLayer.
Path and polygon unblockPathOutlineLayer, PathMarkerLayer, DependencyArrowLayer, TimelineLayer geometry, GeoArrow renderers, editable GeoJSON, global-grid and tile-border layers, and static graph geometrydeck.gl 9.4 alpha.2 supplies dual-backend path and polygon shaders. Community layers use them directly, with a local WGSL dash plugin until PathStyleExtension gains native WGSL.
Fast textFastTextLayerThe existing bitmap/SDF glyph layer now has native WGSL and remains available while upstream TextLayer WebGPU support stabilizes.
Trace renderingTraceGraphLayer, TracePreparedStateLayer, TraceProcessLayer, and counter sparklinesReuse shared dual-backend blocks, fast text, arcs, and lines; preserve external float32 trace attributes; validate straight and curved dependency routes on WebGPU.
Upstream follow-upsTextLayer, TripsLayer, SimpleMeshLayer, and specialized geo-cell layersAdopt and validate upstream WebGPU implementations as they become available; keep local fallbacks narrowly scoped.
Graph geometryRoundedRectangleLayer, PathEdgeLayer, and EdgeArrowLayerReplace the fragment-only rounded rectangle and mesh arrowhead with CPU-tessellated polygons, then validate static path and polygon geometry on both backends. Full GraphLayer integration remains in progress.
Dedicated redesignFlowPathLayer and animated graph flowsThe current transform-feedback implementation is incomplete and WebGL-specific. Replace it with a backend-neutral animation or compute design; do not treat shader translation alone as a port.
Subsequent validationArrow arc/H3/text/trips, editable interactions, geospatial tile sources, and basemap layersReduce Arrow arc vertex-buffer usage; validate remaining upstream sublayers, picking interactions, tile and texture formats, and each demonstrated example independently.
Host-dependent integrationsLeaflet, Bing Maps, and external map renderersSupport depends on the host renderer and canvas ownership. A host-owned WebGL context cannot be switched to WebGPU by adding device tabs.

The skybox map example also composes a basemap. SkyboxLayer itself has native WebGPU shaders, while complete basemap compatibility remains subject to the downstream GeoJSON, polygon, path, and label sublayers used by the selected style.

Porting a custom layer

Provide one native WGSL source in addition to the existing GLSL vs and fs:

getShaders() {
return super.getShaders({
source: webgpuShader,
vs: webglVertexShader,
fs: webglFragmentShader,
modules: [project32, color, picking, layerUniforms]
});
}

Declare WGSL resource bindings with @binding(auto), keep each shader module's uniform types in the same order as its WGSL structure, and use Model, Geometry, Texture, and renderPass rather than a raw WebGL context. Include real browser coverage for available devices, and explicitly skip WebGPU rendering when a browser cannot supply a WebGPU adapter.

Do not assume r32float or rgba32float textures are filterable on a baseline WebGPU adapter. For nearest-neighbor data textures, an integer texture plus WGSL bitcast preserves the original float bits without requiring the optional float32-filterable feature.

To explicitly run the complete Chromium suite with software WebGPU, use:

DECK_GL_COMMUNITY_SOFTWARE_WEBGPU=true yarn test-headless

WebGPU rendering tests wait for submitted GPU work and fail on native shader, pipeline, and validation errors. Browser environments without an adapter continue to run the WebGL2 assertions.

Do not update a package-wide WebGPU compatibility badge until all of the package's advertised layers and integrations have been validated.