Debugging Dawn


There are various debug-related Toggles that can help diagnose issues. Useful debug toggles:

  • dump_shaders: Log input WGSL shaders and translated backend shaders (MSL/ HLSL/DXBC/DXIL / SPIR-V).
  • disable_symbol_renaming: As much as possible, disable renaming of symbols (variables, function names, etc.). This can make dumped shaders more readable.
  • emit_hlsl_debug_symbols: Sets the D3DCOMPILE_SKIP_OPTIMIZATION and D3DCOMPILE_DEBUG compilation flags when compiling HLSL code.
  • use_user_defined_labels_in_backend: Forward object labels to the backend so that they can be seen in native debugging tools like RenderDoc, PIX, or Mac Instruments.

Toggles may be enabled/disabled in different ways.

  • In code:

    Use extension struct DawnTogglesDescriptor chained on DeviceDescriptor.

    For example:

    const char* const enabledToggles[] = {"dump_shaders", "disable_symbol_renaming"};
    wgpu::DawnTogglesDescriptor deviceTogglesDesc;
    deviceTogglesDesc.enabledToggles = enabledToggles;
    deviceTogglesDesc.enabledTogglesCount = 2;
    wgpu::DeviceDescriptor deviceDescriptor;
    deviceDescriptor.nextInChain = &deviceTogglesDesc;
  • Command-line for Chrome

    Run Chrome with command line flags--enable-dawn-features and/or --disable-dawn-features to force enable/disable toggles. Toggles should be comma-delimited.

    For example: --enable-dawn-features=dump_shaders,disable_symbol_renaming

  • Command-line for dawn_end2end_tests/dawn_unittests

    Run Dawn test binaries with command line flags--enable-toggles and/or --disable-toggles to force enable/disable toggles. Toggles should be comma-delimited.

    For example: dawn_end2end_tests --enable-toggles=dump_shaders,disable_symbol_renaming

Environment Variables


    Errors in WebGPU are reported asynchronously which may make debugging difficult because at the time an error is reported, you can't easily create a breakpoint to inspect the callstack in your application.

    Setting DAWN_DEBUG_BREAK_ON_ERROR to a non-empty, non-zero value will execute a debug breakpoint instruction (dawn::Breakpoint()) as soon as any type of error is generated.