Chrome’s latest WebGPU update gives Linux developers a reason to revisit half-precision shaders. The Chrome 155–156 announcement, updated October 7, 2026, reports support for the optional shader-f16 feature on Linux with recent NVIDIA drivers. Before switching a browser AI workload or graphics pipeline to it, check what your application’s device actually enables.

The practical trap is checking adapter.features, seeing the feature, and then creating a device without requesting it. Build the release check around three separate questions: what the adapter offers, what the device enables, and whether the chosen shader and workload work correctly. This guide provides a repeatable worksheet for that check. It reports no hardware benchmark results.

A potato engineer compares AVAILABLE and ENABLED cards beside a GPU chip and an illustrative scene.
AI-generated conceptual illustration. Available capabilities and enabled device features are separate checks; the shapes are not feature identifiers.

Start with the device your application really uses

A GPU’s product name and a browser version are useful troubleshooting details, but they do not establish the capability of an existing application device. Inspect the object your renderer or inference runtime uses, especially when a library owns device creation.

The WebGPU specification’s optional-capabilities rules distinguish supported adapter capabilities from enabled device capabilities. For shader-f16, check adapter.features.has("shader-f16"), include that feature in requiredFeatures when calling requestDevice(), and check device.features.has("shader-f16") on the returned device. Validation follows the device’s enabled features. A supported feature does not automatically become enabled.

Request the optional capabilities your chosen path needs. Copying every advertised feature into the request makes it harder to explain the app’s actual dependencies. If a framework already created the device, use its documented configuration point rather than creating an unrelated device and assuming the framework will use it.

Keep GPU features and WGSL language features separate

The same Chrome update includes fragment_depth, a WGSL language extension. Chrome’s example checks navigator.gpu.wgslLanguageFeatures.has("fragment_depth") and uses requires fragment_depth;. Do not copy that detection pattern for half precision.

The WGSL enable-extension rules pair the shader’s f16 extension with WebGPU’s shader-f16 feature. An f16 shader needs enable f16; before its declarations, alongside the enabled device feature. By contrast, a language extension is available when the implementation supports it; its requires directive documents a dependency and rejects unsupported implementations rather than enabling a device capability.

Give these checks separate fields in your diagnostic output. A single “WebGPU supported” badge hides the distinction that matters when a shader fails.

Three folders labelled LANGUAGE, ADAPTER and DEVICE hold blank checklists beneath code, chip and gear symbols.
AI-generated conceptual illustration of three separate capability records, not an API screenshot or measured feature inventory.

Run the initialization check in order

  1. Check API availability. Test for navigator.gpu in the application’s actual page context. If absent, record that result and take the app’s documented alternative path.
  2. Request an adapter and handle absence. A request can return null. Stop before reading its properties. “No adapter” deserves its own diagnostic, separate from “adapter lacks f16.”
  3. Choose the workload path. If f16 is optional and supported, request it explicitly. Otherwise choose your already implemented baseline. An f16-only model or shader needs a clear unsupported-path message if no alternative exists.
  4. Handle device-request failure. Catch rejection and preserve the error name and message. Unsupported requested features cause failure under the device-request rules. A failed request is not evidence that an f32 workload succeeded.
  5. Verify the returned device and shader. Record enabled features, inspect shader compilation diagnostics, create the real pipeline, and run a small known input before loading the full workload.

Watch device.lost as well as request rejection. A device request can resolve with an already-lost device, so obtaining an object alone is not proof that initialization succeeded. Record device loss as a separate failure state and exercise that recovery path.

On reinitialization, obtain a fresh adapter. The adapter lifecycle allows one successful device creation per adapter object, and adapters can expire. Recovery code should rebuild the required resources rather than keep using the old device’s buffers and pipelines.

A CHECK card branches downward into SUPPORTED and FALLBACK routes with two illustrative landscapes.
AI-generated planning diagram. Both application routes need testing; the landscape differences do not predict f16 quality or performance.

Use this six-case compatibility worksheet

Run each case through your application’s initialization boundary. Where hardware cannot naturally produce a case, inject the condition into a test double and label it as simulated. Keep real-device observations separate. The expected outcomes below are test targets, not measurements.

CaseCondition to exerciseExpected application behavior
No APInavigator.gpu absentExplain unavailability; use an implemented alternative.
No adapterAdapter request returns nullExit cleanly without accessing adapter properties.
Baseline onlyAdapter lacks shader-f16Select validated f32 assets or explain the requirement.
Feature omittedAdapter offers f16; device request omits itDevice check prevents selecting the f16 shader.
Feature enabledRequest succeeds with f16 enabledCompile and execute the intended f16 path; compare output.
Initialization failsDevice request rejectsPreserve the error, release partial state, and offer recovery.

For each run, record the browser version and channel, operating system, driver version when available, application build, relevant adapter features, requested features, enabled device features, selected shader variant, and the first failing stage. Add the fixture identifier, expected result, observed result, and pass/fail decision. Save the record with the change being reviewed so another developer can reproduce the same path.

BASELINE and OPTIONAL panels show an orange sphere, teal cube and navy cone with magnifiers and empty checkboxes.
AI-generated comparison illustration, not rendered test output. Use your own deterministic scene or fixture and record the observed differences.

Make the fallback an actual workload

A fallback needs its own shader and compatible data handling. Removing enable f16; from source that still contains f16 types does not create an f32 implementation. Blind text replacement also leaves questions about buffer layout, packing, conversions, and numerical behavior. Test those boundaries explicitly.

For a browser AI application, keep a small representative input and a reference output. Decide acceptable numerical differences before comparing variants. For graphics, use a deterministic scene that exposes the calculation being changed. Include boundary inputs meaningful to the application, then check output before timing either path.

If the fallback changes where data is processed, make that visible to users. Moving a local browser task to a server introduces a separate data-handling decision; it should not be a silent consequence of a missing GPU feature.

Decide when to enable f16 by default

Keep the baseline selectable during rollout. Require a clean initialization record, a passing output comparison, and an exercised failure path before promoting the optional implementation. Measure startup and steady-state work separately on representative machines if performance motivates the change. Feature availability alone supplies no application-specific speedup estimate.

A potato engineer points to a blank matrix in a folder with BUILD, DEVICE, OUTPUT and TIMING tabs.
AI-generated evidence-record illustration. Blank cells are prompts for actual observations, not benchmark results.

Release decision: enable the f16 path only for devices where its feature is enabled and your workload checks pass. Retain a tested alternative or a clear explanation of the requirement. Re-run the worksheet after browser, driver, runtime, or shader changes. That turns the October update into a controlled compatibility improvement instead of an assumption embedded in device initialization.