<!--
Copyright 2020 The Chromium Authors
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

<!--
This file is used to generate a comprehensive list of GPU histograms
along with a detailed description for each histogram.

For best practices on writing histogram descriptions, see
https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md

Please follow the instructions in the OWNERS file in this directory to find a
reviewer. If no OWNERS file exists, please consider signing up at
go/reviewing-metrics (Googlers only), as all subdirectories are expected to
have an OWNERS file. As a last resort you can send the CL to
chromium-metrics-reviews@google.com.
-->

<histogram-configuration>

<histograms>

<variants name="CacheType">
  <variant name="GrShaderCache"/>
  <variant name="PassthroughProgramCache"/>
</variants>

<variants name="GpuPersistentCacheType">
  <variant name="Ganesh"/>
  <variant name="GraphiteDawn"/>
  <variant name="WebGL"/>
  <variant name="WebGPU"/>
</variants>

<variants name="GPUProtectedVideoType">
  <variant name="Clear" summary="Clear"/>
  <variant name="HardwareProtected" summary="HardwareProtected"/>
  <variant name="SoftwareProtected" summary="SoftwareProtected"/>
</variants>

<variants name="GraphiteDawnOrWebGPU">
  <variant name="GraphiteDawn"/>
  <variant name="WebGPU"/>
</variants>

<variants name="NumDisplays">
  <variant name="FourOrMoreDisplays"/>
  <variant name="OneDisplay"/>
  <variant name="ThreeDisplays"/>
  <variant name="TwoDisplays"/>
</variants>

<variants name="ShaderType">
  <variant name="Compute" summary="compute"/>
  <variant name="Pixel" summary="pixel"/>
  <variant name="Vertex" summary="vertex"/>
</variants>

<variants name="TaskGraphValidationType">
  <variant name="GraphValidation" summary="graph-based validation"/>
  <variant name="OrderValidation" summary="order-based validation"/>
</variants>

<variants name="WebGPUAdapterType">
  <variant name="Discrete" summary="discrete"/>
  <variant name="Integrated" summary="integrated"/>
</variants>

<variants name="WebGPUCacheable">
  <variant name="D3D11.CompileShader"/>
  <variant name="D3D12.CompileShader"/>
  <variant name="D3D12.CreateComputePipelineState"/>
  <variant name="D3D12.CreateGraphicsPipelineState"/>
  <variant name="Metal.CompileShaderToMSL"/>
  <variant name="Metal.newComputePipelineStateWithDescriptor"/>
  <variant name="Metal.newLibraryWithSource"/>
  <variant name="Metal.newRenderPipelineStateWithDescriptor"/>
  <variant name="OpenGL.CompileShaderToGLSL"/>
  <variant name="Vulkan.CompileShaderToSPIRV"/>
  <variant name="Vulkan.CreateComputePipelines"/>
  <variant name="Vulkan.CreateGraphicsPipelines"/>
</variants>

<variants name="WebGPUModule">
  <variant name="ComputePipeline"/>
  <variant name="RenderPipeline"/>
  <variant name="ShaderModule"/>
</variants>

<variants name="WebGPUShaderTiming">
  <variant name="GLSL.CompileShader"/>
  <variant name="ShaderModuleGenerateGLSL"/>
  <variant name="ShaderModuleGenerateHLSL"/>
  <variant name="ShaderModuleGenerateMSL"/>
  <variant name="ShaderModuleGenerateSPIRV"/>
  <variant name="ShaderModuleProgramToIR"/>
  <variant name="ShaderModuleSingleEntryPoint"/>
  <variant name="ShaderModuleSubstituteOverrides"/>
  <variant name="Vulkan.CreateShaderModule"/>
  <variant name="Vulkan.ValidateSpirv"/>
</variants>

<histogram name="ConfigureDisplays.External.Modeset.AttemptSucceeded"
    enum="BooleanSuccess" expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@chromium.org</owner>
  <summary>
    Modeset attempt result of an external display. Every time an external
    display is connected/disconnected, or when the display mode of the external
    screen is changed by the user, Chrome attempts to modeset the display. This
    metric tracks the result of those attempts. Resolution and RefreshRate
    metrics will be recorded for each attempt.
  </summary>
</histogram>

<histogram name="ConfigureDisplays.External.Modeset.FinalStatus"
    enum="BooleanSuccess" expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@chromium.org</owner>
  <summary>
    Modeset attempt result of an external display. This is recorded after Chrome
    attempted all the available modes and finally modeset the display. All the
    previously attempted modes and refreshes, including the successful one will
    be recorded.
  </summary>
</histogram>

<histogram name="ConfigureDisplays.Internal.Modeset.AttemptSucceeded"
    enum="BooleanSuccess" expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@chromium.org</owner>
  <summary>
    Modeset attempt result of an internal display. Chrome might try additional
    modes after a failed attempt. Every time an external display is
    connected/disconnected, or when the display mode of the external screen is
    changed by the user, Chrome attempts to modeset the display. This metric
    tracks the result of those attempts. Resolution and RefreshRate metrics will
    be recorded for each attempt.
  </summary>
</histogram>

<histogram name="ConfigureDisplays.Internal.Modeset.FinalStatus"
    enum="BooleanSuccess" expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@chromium.org</owner>
  <summary>
    Modeset attempt result of an internal display. This is recorded after Chrome
    attempted all the available modes and finally modeset the display. All the
    previously attempted modes and refreshes, including the successful one will
    be recorded.
  </summary>
</histogram>

<histogram name="ConfigureDisplays.Modeset.FinalTaskStatus"
    enum="ConfigureDisplaysTaskStatus" expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@chromium.org</owner>
  <summary>
    The final result of a configuration attempt across all displays. This is
    recorded every time Chrome configures all connected displays, or fails to do
    so after exhausting all available modes in one (or more) of the displays.

    Partial success occurs when a configuration is successful, but not with the
    requested resolution/refresh rate for one (or more) of the connected
    displays (e.g. a display fails to modeset at 4k@60Hz, but succeeds at
    1440p@60Hz).
  </summary>
</histogram>

<histogram name="ConfigureDisplays.Modeset.MstExternalDisplaysCount"
    units="count" expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@chromium.org</owner>
  <summary>
    Total number of external displays connected via MST and being configured.
    This is recorded every time an external display is connected/disconnected,
    or when the display mode of a screen is about to change.
  </summary>
</histogram>

<histogram name="ConfigureDisplays.Modeset.MstExternalDisplaysPercentage"
    units="%" expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@chromium.org</owner>
  <summary>
    Percentage of external displays connected via MST and being configured. This
    is recorded every time an external display is connected/disconnected, or
    when the display mode of a screen is about to change.
  </summary>
</histogram>

<histogram
    name="ConfigureDisplays.Modeset.Test.DynamicCRTCs.{NumDisplays}.PermutationsAttempted"
    units="fallbacks attempted" expires_after="2027-01-21">
  <owner>sukoo@google.com</owner>
  <owner>chromeos-gfx-compositor@google.com</owner>
  <summary>
    Number of fallback CRTC-Connector permutations attempted after initial test
    modeset failure with {NumDisplays} connected. All permutations after success
    are not counted.
  </summary>
  <token key="NumDisplays" variants="NumDisplays"/>
</histogram>

<histogram name="ConfigureDisplays.Modeset.Test.{NumDisplays}.Outcome"
    enum="TestOnlyModesetOutcome" expires_after="2027-01-21">
  <owner>sukoo@google.com</owner>
  <owner>chromeos-gfx-compositor@google.com</owner>
  <summary>
    The outcome of test-only modeset configuration request. If a test modeset
    initially fails, but succeeds on fallback, then it will be counted as
    FallbackSuccess.
  </summary>
  <token key="NumDisplays" variants="NumDisplays"/>
</histogram>

<histogram name="ConfigureDisplays.Modeset.TotalExternalDisplaysCount"
    units="count" expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@chromium.org</owner>
  <summary>
    Total number of external displays being configured. This is recorded every
    time an external display is connected/disconnected, or when the display mode
    of a screen is about to change.
  </summary>
</histogram>

<histogram name="ConfigureDisplays.{Connection}.Modeset.Success.RefreshRate"
    units="Hz" expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@chromium.org</owner>
  <summary>
    Tracks an {Connection} display's resulting refresh rate after a successful
    display configuration.
  </summary>
  <token key="Connection">
    <variant name="External" summary="external"/>
    <variant name="Internal" summary="internal"/>
  </token>
</histogram>

<histogram name="ConfigureDisplays.{Connection}.Modeset.{Report}.Resolution"
    enum="DisplayResolution" expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@chromium.org</owner>
  <summary>{Connection} {Report}</summary>
  <token key="Connection">
    <variant name="External" summary="Tracks an external display's"/>
    <variant name="Internal" summary="Tracks an internal display's"/>
  </token>
  <token key="Report">
    <variant name="OriginalRequest"
        summary="original resolution request during display configuration."/>
    <variant name="Success"
        summary="resulting resolution after a successful display
                 configuration."/>
  </token>
</histogram>

<histogram name="Display.External.BlockZeroSerialNumberType"
    enum="BlockZeroSerialNumberType" expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@google.com</owner>
  <summary>
    The type of serial number retrieved from block zero of a display's EDID
    during EDID parsing.
  </summary>
</histogram>

<histogram name="Display.External.NumOfSerialNumbersProvided" units="count"
    expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@google.com</owner>
  <summary>
    The number of serial numbers provided in an EDID (i.e. via block zero and/or
    the serial number descriptor block). Values should be in the range of 0-2.
  </summary>
</histogram>

<histogram name="Display.External.ParseEdidOptionals" enum="ParseEdidOptionals"
    expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@google.com</owner>
  <summary>
    The availability (or lack thereof) of tracked optional fields during EDID
    parsing of external.
  </summary>
</histogram>

<histogram name="Display.MultipleDisplays.GenerateId.CollisionDetection"
    enum="BooleanDisplayIdCollision" expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@google.com</owner>
  <summary>
    Whether or not multiple connected displays produced identical display IDs
    due to incomplete EDIDs. This may occur when identical displays (same make
    and model) lack serial numbers in both the EDID's block zero or S/N
    descriptor block. Recorded every time Chrome OS detects a change in display
    configuration and attempts to get an updated list of available displays.
  </summary>
</histogram>

<histogram name="Display.ParseEdidFailure" enum="ParseEdidFailure"
    expires_after="2027-01-21">
  <owner>gildekel@chromium.org</owner>
  <owner>chromeos-gfx-display@google.com</owner>
  <summary>
    Type of failure that occurs during EDID parsing. Typically the failure is
    caused by a mismatch between the EDID size and the expected offset of the
    data component.
  </summary>
</histogram>

<histogram name="GPU.Android.HasEGLDupNativeFenceFunction" enum="Boolean"
    expires_after="2027-02-14">
  <owner>boliu@chromium.org</owner>
  <owner>vasilyt@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@google.com</owner>
  <summary>
    Recordes whether the eglDupNativeFenceFDANDROIDFn function is exported.
    Recorded once on eglDisplay init, which is basically once on GPU process
    start.
  </summary>
</histogram>

<histogram name="GPU.ANGLE.D3D11CreateDeviceError" enum="Hresult"
    expires_after="2025-02-10">
  <owner>geofflang@google.com</owner>
  <owner>angle-team@google.com</owner>
  <summary>
    An extended Windows error code returned from D3D11CreateDevice on error when
    ANGLE's D3D backend is in use. Can be almost any valid HRESULT or DXGI error
    code, which are listed at
    https://msdn.microsoft.com/en-us/library/windows/desktop/bb509553.aspx.
  </summary>
</histogram>

<histogram name="GPU.ANGLE.D3D11FeatureLevel" enum="D3DFeatureLevel"
    expires_after="2027-01-24">
  <owner>geofflang@google.com</owner>
  <owner>angle-team@google.com</owner>
  <summary>
    The maxmium supported (or currently requested) Direct3D feature level in
    D3D11 ANGLE. We support as low as 9.3, and as high as 11.1, though Chrome
    should only use 10.0+ for D3D11. Gives an indication of how new a user's
    video card is, what features it supports, and it's general speed tier.
    Recorded on D3D device initialization, loss, or reset when ANGLE's D3D
    backend is in use.
  </summary>
</histogram>

<histogram name="GPU.ANGLE.D3D11InitializeResult" enum="D3D11InitializeResult"
    expires_after="2025-02-10">
  <owner>geofflang@google.com</owner>
  <owner>angle-team@google.com</owner>
  <summary>
    The result from initializing a D3D11 device in ANGLE. Can be success, or one
    of several error codes which indicate different reasons for failing.
    Recorded on D3D11 device initialization when ANGLE's D3D backend is in use.
  </summary>
</histogram>

<histogram name="GPU.ANGLE.D3D9InitializeResult" enum="D3D9InitializeResult"
    expires_after="2025-02-10">
  <owner>geofflang@google.com</owner>
  <owner>angle-team@google.com</owner>
  <summary>
    The result from initializing a D3D9 device in ANGLE. Can be success, or one
    of several error codes which indicate different reasons for failing.
    Recorded on D3D9 device initialization when ANGLE's D3D backend is in use.
  </summary>
</histogram>

<histogram name="GPU.ANGLE.D3DDeviceRemovedReason" enum="Hresult"
    expires_after="2026-06-25">
  <owner>geofflang@chromium.org</owner>
  <owner>angle-team@google.com</owner>
  <summary>
    Error codes received when checking for D3D device removal reason. HRESULT is
    DXGI error code that listed at
    https://learn.microsoft.com/en-us/windows/win32/api/d3d11/nf-d3d11-id3d11device-getdeviceremovedreason
  </summary>
</histogram>

<histogram name="GPU.ANGLE.D3DShaderBlobSizeKB" units="KB"
    expires_after="2025-01-05">
  <owner>geofflang@chromium.org</owner>
  <owner>angle-team@google.com</owner>
  <summary>The size of compiled D3D shader bytecode.</summary>
</histogram>

<histogram name="GPU.ANGLE.D3DShaderCompilationTimeUs" units="microseconds"
    expires_after="2027-02-14">
  <owner>geofflang@chromium.org</owner>
  <owner>angle-team@google.com</owner>
  <summary>
    The time it takes for fxc to compile HLSL to D3D bytecode. Recorded for all
    clients regardless of support for high resolution timers. NOTE: metric
    expired from 2025-01-05 to 2025-10-09.
  </summary>
</histogram>

<histogram name="GPU.ANGLE.MetalShaderCompilationTimeUs" units="microseconds"
    expires_after="2027-02-07">
  <owner>geofflang@chromium.org</owner>
  <owner>angle-team@google.com</owner>
  <summary>
    The time it takes for the Metal driver to compile a shader with the
    newLibraryFromSource function. Recorded for all clients regardless of
    support for high resolution timers.
  </summary>
</histogram>

<histogram name="GPU.ANGLE.SyncFromNativeContextMicroseconds"
    units="microseconds" expires_after="2024-09-01">
  <owner>blundell@chromium.org</owner>
  <owner>geofflang@chromium.org</owner>
  <owner>vasilyt@chromium.org</owner>
  <owner>angle-team@google.com</owner>
  <summary>
    Tracks the amount of time that it took for WebView to save HWUI's GL state
    when using ANGLE. Recorded once per saving of HWUI state when drawing with
    GL. Recorded for all clients as ANGLE does not support checking for
    high-resolution clocks (in practice, all Android devices have
    high-resolution clocks). Note: Expired on June 1 2024 and revived on June 10
    2024.
  </summary>
</histogram>

<histogram name="GPU.ANGLECanEmulateGLES3" enum="BooleanANGLECanEmulateGLES3"
    expires_after="2027-01-17">
  <owner>blundell@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@google.com</owner>
  <summary>
    Records whether ANGLE is able to emulate GLES3 on desktop platforms.
    Recorded once per GPU process launch.
  </summary>
</histogram>

<histogram name="GPU.BlocklistEntriesApplied" enum="GpuBlocklistEntry"
    expires_after="never">
<!-- expires-never: For monitoring GPU blocklist entries. -->

  <owner>vmiura@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    One or more entries are recorded to this histogram after each succesful GPU
    process launch. Each GPU blocklist entry, contained in
    software_rendering_list.json, that applies has the entry id recorded.
    Additionally the value 0, which doesn't correspond to a blocklist entry, is
    always recorded once to provide a denominator to calculate percentages.
  </summary>
</histogram>

<histogram name="GPU.BlocklistFeatureTestResults.{GPUBlocklistPerFeature}"
    enum="GPUBlocklistFeatureTestResults" expires_after="2026-09-27">
  <owner>vmiura@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Counts number of browser invocations for which a GPU feature is
    allowed/blocklisted/disabled.
  </summary>
  <token key="GPUBlocklistPerFeature">
    <variant name="Accelerated2dCanvas" summary="Accelerated2dCanvas"/>
    <variant name="GpuCompositing" summary="GpuCompositing"/>
    <variant name="GpuRasterization" summary="GpuRasterization"/>
    <variant name="Webgl" summary="Webgl"/>
    <variant name="Webgl2" summary="Webgl2"/>
    <variant name="Webgpu" summary="Webgpu"/>
  </token>
</histogram>

<histogram name="GPU.CanvasOopRaster.OopRasterAndGpuAcceleration"
    enum="CanvasOopRasterAndGpuAcceleration" expires_after="2026-06-28">
  <owner>vasilyt@chromium.org</owner>
  <owner>nazabris@microsoft.com</owner>
  <owner>jochin@microsoft.com</owner>
  <summary>
    Records, during GPU process initialization, the combination of the following
    two features being enabled/disabled: 1) Accelerated 2D Canvas 2) OOP
    Rasterization of Canvas.
  </summary>
</histogram>

<histogram name="GPU.CompositingMode" enum="CompositingMode"
    expires_after="never">
  <owner>kylechar@chromium.org</owner>
  <summary>
    Records what compositing mode (software, GL, etc.) Chrome is using every
    five minutes. This is the default compositing mode that most windows will
    use. There are some window types (eg. menus on some platforms) that always
    use software compositing and ignore the default.
  </summary>
</histogram>

<histogram name="GPU.CompoundImageBacking.ContentSync.DestBackingType"
    enum="SharedImageBackingType" expires_after="2027-02-09">
  <owner>vikassoni@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the SharedImageBackingType to which data is copied during content
    synchronization within CompoundImageBacking. This helps identify the
    destination of data in copy operations.
  </summary>
</histogram>

<histogram name="GPU.CompoundImageBacking.ContentSync.InitialSharedImageUsage"
    units="SharedImageUsage" expires_after="2027-02-09">
  <owner>vikassoni@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the initial SharedImageUsage of the CompoundImageBacking when a
    content synchronization (copy) occurs. This helps identify if specific
    initial usage configurations are prone to excessive copying. Recorded as a
    sparse histogram of the usage bitmask.
  </summary>
</histogram>

<histogram name="GPU.CompoundImageBacking.ContentSync.Reason"
    enum="ContentSyncReason" expires_after="2027-02-09">
  <owner>vikassoni@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the reason a content synchronization (copy) operation occurred
    within CompoundImageBacking. This distinguishes between copies triggered by
    stale data reads and those for synchronization before a write operation.
  </summary>
</histogram>

<histogram name="GPU.CompoundImageBacking.ContentSync.SourceBackingType"
    enum="SharedImageBackingType" expires_after="2027-02-09">
  <owner>vikassoni@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the SharedImageBackingType from which data is copied during content
    synchronization within CompoundImageBacking. This helps identify the source
    of data in copy operations.
  </summary>
</histogram>

<histogram name="GPU.CompoundImageBacking.ContentSync.Success"
    enum="BooleanSuccess" expires_after="2027-02-09">
  <owner>vikassoni@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Success rate of content synchronization (copy) operations within
    CompoundImageBacking. This metric indicates whether data transfer between
    different backing types completed without errors.
  </summary>
</histogram>

<histogram name="GPU.CompoundImageBacking.ContentSync.TriggeringAccessStream"
    enum="SharedImageAccessStream" expires_after="2027-02-09">
  <owner>vikassoni@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the SharedImageAccessStream that triggered a content synchronization
    (copy) operation within CompoundImageBacking. This provides insight into
    which access patterns necessitate data copies.
  </summary>
</histogram>

<histogram name="GPU.CompoundImageBacking.DynamicAllocation.AccessStream"
    enum="SharedImageAccessStream" expires_after="2027-02-09">
  <owner>vikassoni@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the SharedImageAccessStream that triggered a dynamic allocation of a
    new backing within a CompoundImageBacking. This provides insight into which
    types of access patterns are causing dynamic allocations.
  </summary>
</histogram>

<histogram name="GPU.CompoundImageBacking.DynamicAllocation.BackingType"
    enum="SharedImageBackingType" expires_after="2027-02-09">
  <owner>vikassoni@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the type of the new SharedImageBacking that was dynamically
    allocated. This helps understand the type of backings being allocated at
    runtime.
  </summary>
</histogram>

<histogram
    name="GPU.CompoundImageBacking.DynamicAllocation.InitialSharedImageUsage"
    units="SharedImageUsage" expires_after="2027-02-09">
  <owner>vikassoni@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the initial SharedImageUsage of the CompoundImageBacking when a
    dynamic allocation occurs. This helps identify which initial usage
    configurations are most likely to require additional backings later.
    Recorded as a sparse histogram of the usage bitmask.
  </summary>
</histogram>

<histogram name="GPU.CompoundImageBacking.TotalElementsAllocated"
    units="elements" expires_after="2027-02-09">
  <owner>vikassoni@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the maximum number of SharedImageBacking elements allocated within a
    CompoundImageBacking instance during its lifetime. This metric is recorded
    once in the destructor. It helps to track and fine tune peak memory
    consumption by this backing.
  </summary>
</histogram>

<histogram name="GPU.ContextLost.{ContextType}" enum="ContextLostReason"
    expires_after="2027-02-07">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The reason a GPU command buffer context of a given type was lost.
  </summary>
  <token key="ContextType">
    <variant name="BrowserCompositor"
        summary="A browser process UI + display compositor command buffer
                 context"/>
    <variant name="BrowserMainThread"
        summary="A browser process shared main thread command buffer context"/>
    <variant name="BrowserRasterWorker"
        summary="A browser process raster worker command buffer context"/>
    <variant name="DisplayCompositor"
        summary="A display compositor command buffer context"/>
    <variant name="Media" summary="A media worker command buffer context"/>
    <variant name="RendererBlinkWorker"
        summary="A renderer blink worker GPU command buffer context"/>
    <variant name="RendererCompositor"
        summary="A renderer compositor GPU command buffer context"/>
    <variant name="RendererMainThread"
        summary="A renderer shared main thread GPU command buffer context"/>
    <variant name="RendererMediaWorker"
        summary="A renderer media worker GPU command buffer context"/>
    <variant name="RendererRasterWorker"
        summary="A renderer raster worker GPU command buffer context"/>
    <variant name="Unknown"
        summary="A GPU command buffer context of unknown type"/>
    <variant name="VideoAccelerator"
        summary="A VideoAccelerator GPU command buffer context"/>
    <variant name="VideoCapture"
        summary="A VideoCapture GPU command buffer context"/>
    <variant name="VideoTrackRecorder"
        summary="A VideoTrackRecorder GPU command buffer context"/>
    <variant name="WebCodecsReadback"
        summary="A WebCodecs background readback GPU command buffer context"/>
    <variant name="WebGL" summary="A WebGL GPU command buffer context"/>
    <variant name="WebGPU" summary="A WebGPU control command buffer context"/>
    <variant name="XRCompositing"
        summary="A command buffer context used for XR compositing"/>
  </token>
</histogram>

<histogram name="GPU.D3D11FeatureLevel" enum="D3D11FeatureLevel"
    expires_after="2027-02-07">
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the highest D3D_FEATURE_LEVEL available, collected in the info
    collection GPU process, once per UMA ping. This is Windows platform only.
  </summary>
</histogram>

<histogram name="GPU.D3D12FeatureLevel" enum="D3D12FeatureLevel"
    expires_after="2026-12-27">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <summary>
    The maximum D3D12 feature level supported in the gpu drivers. It is recorded
    in the browser process 120 seconds after the browser launch.
  </summary>
</histogram>

<histogram name="GPU.D3D12HighestShaderModel2" enum="D3DShaderModel"
    expires_after="2027-02-07">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <owner>amaiorano@google.com</owner>
  <summary>
    The maximum supported D3D shader model version on a D3D12 device. It is
    recorded in the browser process 120 seconds after the browser launch. Note
    that the &quot;2&quot; suffix was added when a fix was made in how this stat
    is collected: the previous unsuffixed version would store
    &quot;unknown/unsupported&quot; on systems that supported shader model 5.1
    to 6.5, but were unaware of 6.6. The suffixed version correctly stores the
    highest supported shader model.
  </summary>
</histogram>

<histogram name="GPU.D3DShaderModel" enum="ShaderModel"
    expires_after="2024-05-26">
  <owner>geofflang@google.com</owner>
  <owner>angle-team@google.com</owner>
  <summary>
    ANGLE's currently active D3D shader model version. Logged once every startup
    of the GPU process, on Windows only. Note that Shader Models 2 and 3 map to
    D3D9 with ANGLE, and 4+ map to D3D11 ANGLE.
  </summary>
</histogram>

<histogram name="GPU.Dawn.AdapterFeatureLevel" enum="DawnAdapterFeatureLevel"
    expires_after="2027-01-03">
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Tracks whether the Dawn device used by Graphite supports Core or
    Compatibility level.
  </summary>
</histogram>

<histogram name="GPU.Dawn.InfoCollectionTimeMS" units="ms"
    expires_after="2026-04-28">
  <owner>enga@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Measures the time to collect Dawn information during GPU info collection.
    NOTE: metric expired from 2024-06-25 to 2025-05-01.
  </summary>
</histogram>

<histogram name="GPU.DirectComposition.CommitAndClearPendingOverlaysDuration"
    units="microseconds" expires_after="2026-12-27">
  <owner>vasilyt@chromium.org</owner>
  <owner>tangm@microsoft.com</owner>
  <summary>
    Records the duration of CommitAndClearPendingOverlays, which contains the
    work to update the DCLayerTree's visual contents, visual tree, and commit.
    This estimates the amount of work DCLayerTree needs to do per frame and can
    be used to compare incremental tree updating algorithms.

    Only reported on systems which have high resolution timers.
  </summary>
</histogram>

<histogram name="GPU.DirectComposition.CompositionMode2.VideoOrCanvas"
    enum="DxgiFramePresentationMode" expires_after="2025-02-04">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    How the Desktop Window Manager presented Chrome's DirectComposition layers
    of video or canvas elements to the screen. Only recorded on Windows. NOTE:
    This metric was expired and not collecting data between 2021-12-31 and
    crrev.com/c/4041850 (M110).
  </summary>
</histogram>

<histogram name="GPU.DirectComposition.DCLayer.YUVOverlayCount"
    units="overlays" expires_after="2027-02-14">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <summary>
    The number of YUV overlays we are going to present in each frame if the
    number is not 0. Recorded when the overlay processor is called for drawing a
    frame.
  </summary>
</histogram>

<histogram name="GPU.DirectComposition.DCLayerResult.Texture"
    enum="DCLayerResult" expires_after="2027-02-07">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Recorded for each quad (on overlay processing) the reason it was or wasn't
    put in an overlay. Reported for Texture quad type. Warning: this histogram
    was expired from 2022-05-01 to 2022-06-24 and again from 2023-08-20 and
    2023-12-21; data may be missing.
  </summary>
</histogram>

<histogram
    name="GPU.DirectComposition.DCLayerResult.Video.{GPUProtectedVideoType}"
    enum="DCLayerResult" expires_after="2026-02-01">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Recorded for each quad (on overlay processing) with protected video type the
    reason it was or wasn't put in an overlay.
  </summary>
</histogram>

<histogram name="GPU.DirectComposition.DCompCommitDuration"
    units="microseconds" expires_after="2026-12-06">
  <owner>vasilyt@chromium.org</owner>
  <owner>tangm@microsoft.com</owner>
  <summary>
    Records the duration of IDCompositionDevice2::Commit, which is the subset of
    GPU.DirectComposition.CommitAndClearPendingOverlaysDuration that only
    contains the DComp commit portion. This allows us to estimate how much of
    the former can be attributed to DComp internals vs DCLayerTree.

    Only reported on systems which have high resolution timers.
  </summary>
</histogram>

<histogram name="GPU.DirectComposition.HardwareOverlaysSupported"
    enum="BooleanOverlaySupported" expires_after="2026-02-22">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    True if the GPU driver supports hardware overlays. Recorded during Chrome
    GPU initialization and each time the overlay caps change.
  </summary>
</histogram>

<histogram name="GPU.DirectComposition.IsUnderlay" enum="BooleanUnderlay"
    expires_after="2026-01-14">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Recorded for each video quad during the video playback whether it is an
    underlay or an overlay.
  </summary>
</histogram>

<histogram name="GPU.DirectComposition.OverlayFormatUsed3" enum="DXGI_FORMAT"
    expires_after="2024-07-21">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <owner>magchen@chromium.org</owner>
  <summary>
    Which overlay format was chosen for YUV overlays. Recorded once per GPU
    process launch only if hardware overlays are supported. (Might be lack of
    metrics coverage between 2022-05-01 and 2022-06-24 due to metric
    expiration.)
  </summary>
</histogram>

<histogram name="GPU.DirectComposition.OverlaysSupported"
    enum="BooleanOverlaySupported" expires_after="2027-01-17">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <owner>magchen@chromium.org</owner>
  <summary>
    True if Chrome will try to use DirectComposition overlays. (Might be lack of
    metrics coverage between 2021-10-04 and 2022-06-24 due to metric
    expiration.)
  </summary>
</histogram>

<histogram name="GPU.DirectComposition.Supported" enum="Boolean"
    expires_after="2027-01-17">
  <owner>lehoangquyen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records whether Direct Composition is supported. Recorded on GPU process
    startup.
  </summary>
</histogram>

<histogram
    name="GPU.DirectComposition.SwapChainCreationResult3.SoftwareProtected.{SoftwareProtectedType}"
    enum="Hresult" expires_after="2025-06-08">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Whether creating swap chain for protected video succeeded. Recorded once per
    swap chain creation.
  </summary>
  <token key="SoftwareProtectedType">
    <variant name="HasOverlaySupport" summary="HasOverlaySupport"/>
    <variant name="NoOverlaySupport" summary="NoOverlaySupport"/>
  </token>
</histogram>

<histogram
    name="GPU.DirectComposition.SwapChainCreationResult3.{GPUProtectedVideoType}"
    enum="Hresult" expires_after="2025-06-08">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Whether creating swap chain for protected video succeeded. Recorded once per
    swap chain creation.
  </summary>
</histogram>

<histogram name="GPU.DirectComposition.SwapChainFormat3" enum="DXGI_FORMAT"
    expires_after="2024-01-14">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <owner>magchen@chromium.org</owner>
  <summary>
    What format was used for each overlay swap chain on each swap buffers.
    (Might be lack of metrics coverage between 2020-12-31 and 2022-06-24 due to
    metric expiration.)
  </summary>
</histogram>

<histogram name="GPU.DirectComposition.VideoPresentationMode"
    enum="DirectCompositionVideoPresentationMode" expires_after="2025-04-27">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <owner>magchen@chromium.org</owner>
  <summary>
    What code path was used to present a video frame. Recorded on each present.
    (Might be lack of metrics coverage between 2022-03-06 and 2022-06-24 due to
    metric expiration.)
  </summary>
</histogram>

<histogram name="GPU.DrDcEnabled" enum="Boolean" expires_after="2026-11-15">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Whether DrDC (Direct Rendering Display Compositor) is enabled or not.
    Recorded when CompositorGpuThread is created in GpuServiceImpl.
  </summary>
</histogram>

<histogram name="GPU.DriverBugTestResultsPerEntry"
    enum="GpuDriverBugWorkaroundEntry" expires_after="never">
<!-- expires-never: For monitoring new driver bugs. -->

  <owner>vmiura@chromium.org</owner>
  <owner>kbr@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <summary>
    For every entry in the gpu driver bug list that is hit on a machine, this
    records the id. Entry 0 is the total number of times that data is recorded.
    It should be recorded whenever new GPU information is received: on startup,
    whenever a GPU process launches, and whenever the active GPU changes.
  </summary>
</histogram>

<histogram name="GPU.EarlyInitialFrameSinkUsed" enum="Boolean"
    expires_after="2027-04-24">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-webium-product-eng@google.com</owner>
  <summary>
    Records whether the renderer's WidgetBase successfully used the initial
    CompositorFrameSink pipes provided by the browser instead of requesting
    creation of new pipes. Logged when WidgetBase initializes its
    LayerTreeFrameSink.
  </summary>
</histogram>

<histogram name="GPU.EGLDisplayType" enum="EGLDisplayType"
    expires_after="2027-01-17">
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>The display type used to ask for an EGLDisplay.</summary>
</histogram>

<histogram name="GPU.EnsureWorkVisibleDuration" units="microseconds"
    expires_after="2025-11-16">
  <owner>alemate@chromium.org</owner>
  <owner>magchen@chromium.org</owner>
  <owner>oshima@chromium.org</owner>
  <summary>
    Records the duration of EnsureWorkVisible GPU call. Since it's blocking UI
    thread we want to measure it, and this histogram must be active as long as
    this call is still blocking.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution.

    One some clients this metric will be logged only one time out of one
    thousand to reduce the overhead of taking the metric.
  </summary>
</histogram>

<histogram name="GPU.EnsureWorkVisibleDurationLowRes" units="ms"
    expires_after="2025-11-16">
  <owner>alemate@chromium.org</owner>
  <owner>magchen@chromium.org</owner>
  <owner>oshima@chromium.org</owner>
  <summary>
    Records the duration of EnsureWorkVisible GPU call. Since it's blocking UI
    thread we want to measure it, and this histogram must be active as long as
    this call is still blocking.

    This is a sister histogram to GPU.EnsureWorkVisibleDuration. The former is
    our target goal. However it's custom buckets do not have enough granularity
    to measure improvement steps. This metric will instead cap at 5s, and allow
    the buckets to give us better visibility into the 15ms-250ms interval
    ranges. We will use this one until we improve the blocking call.

    One some clients this metric will be logged only one time out of one
    thousand to reduce the overhead of taking the metric.
  </summary>
</histogram>

<histogram name="GPU.EstablishGpuChannel.Browser.{InitOrRegular}AsyncLatency"
    units="ms" expires_after="2027-04-24">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-webium-product-eng@google.com</owner>
  <summary>
    The time it takes for the browser process to establish the GPU channel for a
    renderer (either via Mojo invitation or standard callback). Measured from
    the start of the GpuClient request to when the channel is successfully
    established with the GPU process.
  </summary>
  <token key="InitOrRegular">
    <variant name="Init" summary="Initial channel for a new renderer process"/>
    <variant name="Regular" summary="Standard channel request"/>
  </token>
</histogram>

<histogram name="GPU.EstablishGpuChannel.EarliestRequestLatency" units="ms"
    expires_after="2027-04-24">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-webium-product-eng@google.com</owner>
  <summary>
    Measures the time from the earliest request in a batch until the channel is
    established. Logged once per channel establishment upon successful
    completion.
  </summary>
</histogram>

<histogram name="GPU.EstablishGpuChannel.IndividualRequestLatency" units="ms"
    expires_after="2027-04-24">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-webium-product-eng@google.com</owner>
  <summary>
    Measures the wait time for each individual request in a batch to establish
    the GPU channel. Logged for every request in the batch upon successful
    completion.
  </summary>
</histogram>

<histogram
    name="GPU.EstablishGpuChannel.InitialChannelBrowserToRendererLatency"
    units="ms" expires_after="2027-04-24">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-webium-product-eng@google.com</owner>
  <summary>
    The total time it takes to establish the initial GPU channel for a new
    renderer process. Measured from the moment the browser process starts the
    request (in GpuClient) to the moment the renderer process finishes
    initializing the channel (including getting the GPU info).
  </summary>
</histogram>

<histogram name="GPU.EstablishGpuChannel.InitialChannelLatency" units="ms"
    expires_after="2027-04-24">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-webium-product-eng@google.com</owner>
  <summary>
    Measures the total time from renderer initialization to GPU channel
    establishment. Logged once per renderer process initialization when the
    channel establishment completes successfully.
  </summary>
</histogram>

<histogram name="GPU.EstablishGpuChannelSyncRetry" enum="BooleanSuccess"
    expires_after="2027-01-17">
  <owner>fangzhoug@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the result of retrying EstableGpuChannelSync in Chrome OS. Logged
    every time when a EstableGpuChannel fails on Chrome OS.
  </summary>
</histogram>

<histogram name="GPU.EstablishGpuChannelSyncTime" units="ms"
    expires_after="2027-02-07">
  <owner>cduvall@chromium.org</owner>
  <owner>jam@chromium.org</owner>
  <summary>
    Measures the time it takes to synchronously establish the GPU channel.
    Logged every time a sync call to EstableGpuChannelSync is made and a channel
    is not already available.
  </summary>
</histogram>

<histogram name="GPU.EstablishGpuChannelSyncTime.FirstRun" units="ms"
    expires_after="2027-01-17">
  <owner>chikamune@chromium.org</owner>
  <owner>kouhei@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Measures the time it takes to synchronously establish the GPU channel.
    Logged on the first run of a sync call to EstableGpuChannelSync is made.
  </summary>
</histogram>

<histogram name="GPU.FallbackEventCause" enum="GPUFallbackEventCauseType"
    expires_after="2027-02-07">
  <owner>blundell@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@google.com</owner>
  <summary>
    Recorded once for every GPU launch mode fallback event. Records the cause of
    the fallback event.
  </summary>
</histogram>

<histogram name="Gpu.FenceHandle.CloneCountsPerSubmit" units="clones"
    expires_after="2025-12-28">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Counts the number of GpuFenceHandle clone calls between (post) submits.
  </summary>
</histogram>

<histogram name="GPU.FenceSyncRelease.GraphValidation.ForceReleaseNamespace"
    enum="CommandBufferNamespace" expires_after="2027-01-18">
  <owner>vasilyt@chromium.org</owner>
  <owner>yzshen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the command buffer namespace when TaskGraph validation forcefully
    releases fence sync.
  </summary>
</histogram>

<histogram name="GPU.FenceSyncRelease.{TaskGraphValidationType}.Cause"
    enum="ReleaseCause" expires_after="2027-01-18">
  <owner>vasilyt@chromium.org</owner>
  <owner>yzshen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the cause of calls to SyncPointManager::EnsureFenceSyncReleased()
    for releasing fence sync. This histogram is ~1/100 sub-sampled.
  </summary>
  <token key="TaskGraphValidationType" variants="TaskGraphValidationType"/>
</histogram>

<histogram name="GPU.FrameSink.BindToFirstFrameLatency.{PathType}" units="ms"
    expires_after="2027-04-24">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-webium-product-eng@google.com</owner>
  <summary>
    Measures the wait time from when the renderer is ready to establish the
    frame sink (in FinishRequestNewLayerTreeFrameSink) until it receives the
    first BeginMainFrame. Logged when the first frame arrives on the frame sink.
  </summary>
  <token key="PathType">
    <variant name="Early" summary="Wait time for the early path"/>
    <variant name="Standard" summary="Wait time for the standard path"/>
  </token>
</histogram>

<histogram name="GPU.GLImplementation" enum="GLImplementation"
    expires_after="2026-12-06">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the OpenGL implementation mode. Recorded during GPU process
    initilization.
  </summary>
</histogram>

<histogram name="GPU.GPUInitializationTime.V4" units="ms"
    expires_after="2027-02-07">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The time between the GPU process start and the collection of GPU info during
    the process's startup phase. The time range is between 5ms and 90s. Emitted
    after the collection of GPU info. Reported for all clients.

    This metric is similar to GPU.GPUInitializationTime.V3, but there are two
    main differences. First, the range for GPU.GPUInitializationTime.V4 is
    capped at 90s while the range of the other metric is capped at 5s. Second,
    this metric is emitted earlier in the execution because this metric is
    recorded at the same time as trace events which require the timestamp
    marking the start and end of the GPU initialization to be in scope, whereas
    V3 only requires the time spent.
  </summary>
</histogram>

<histogram name="GPU.GPUProcessExitCode" enum="CrashExitCodes"
    expires_after="2027-01-17">
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Counts for the exit codes returned by the GPU process when it terminated.
  </summary>
</histogram>

<histogram name="GPU.GPUProcessLaunchTime" units="ms"
    expires_after="2027-01-17">
  <owner>vmiura@chromium.org</owner>
  <summary>
    Startup time of the GPU process as measured by the GPU process host.
  </summary>
</histogram>

<histogram name="GPU.GPUProcessTerminationOrigin" enum="GpuTerminationOrigin"
    expires_after="never">
<!-- expires-never: For monitoring unexpected shifts in GPU process exit statuses. -->

  <owner>jonross@chromium.org</owner>
  <owner>msisov@igalia.com</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The reason a GPU process is terminated. It works only when
    TERMINATION_STATUS_PROCESS_WAS_KILLED TerminationStatus is set. The goal of
    this histogram is to get spikes of the above mentioned case when
    Ozone/Wayland terminates the GPU process due to invalid data it received if
    any. NOTE: this metric was expired from 2019-08-14 to 2022-11-30 and was
    brought back by crrev.com/c/4040947.
  </summary>
</histogram>

<histogram name="GPU.GPUProcessTerminationStatus2" enum="GpuTerminationStatus"
    expires_after="2027-01-03">
  <owner>vmiura@chromium.org</owner>
  <summary>
    Counts for each time the GPU Process Host detects the process dies.
  </summary>
</histogram>

<histogram name="Gpu.Graphite.GraphiteImageProviderAccessHitInCache"
    enum="Boolean" expires_after="2026-03-22">
  <owner>blundell@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    For each request of an image from GraphiteImageProvider, records whether the
    image was found in the cache or needed to be created.
  </summary>
</histogram>

<histogram name="GPU.Graphite.InsertRecordingStatus"
    enum="GraphiteInsertRecordingStatus" expires_after="2027-06-30">
  <owner>kylechar@chromium.org</owner>
  <owner>michaelludwig@google.com</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The return value for each Graphite insertRecording call made by Chromium.
  </summary>
</histogram>

<histogram name="GPU.Graphite.SkiaOutputDeviceSubmitDurationUs"
    units="microseconds" expires_after="2027-06-30">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The duration of each Graphite context submit call in SkiaOutputDevice in
    microseconds. This is subsampled at 1%. Only reported on platforms
    supporting high-resolution clocks.
  </summary>
</histogram>

<histogram name="GPU.Graphite.SubmitDurationUs" units="microseconds"
    expires_after="2027-06-30">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The duration of each Graphite context submit call in microseconds. This is
    subsampled at 1%. Only reported on platforms supporting high-resolution
    clocks.
  </summary>
</histogram>

<histogram name="GPU.GraphiteDawn.DeviceLockAcquireTimeAvgUs"
    units="microseconds" expires_after="2027-06-01">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Tracks the average lock acquisition time (in microseconds) for the Dawn
    device lock. Computed and emitted on every 100th lock acquisition on each
    Dawn device as the average of the previous 100 lock acquisition durations.
    Only reported on platforms supporting high-resolution clocks.
  </summary>
</histogram>

<histogram name="GPU.GraphiteDawn.DeviceLockAcquireTimeMaxUs"
    units="microseconds" expires_after="2027-06-01">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Tracks the maximum lock acquisition time (in microseconds) for the Dawn
    device lock. Computed and emitted on every 100th lock acquisition for each
    Dawn device as the maximum of the previous 100 lock acquisition durations.
    Only reported on platforms supporting high-resolution clocks.
  </summary>
</histogram>

<histogram name="Gpu.GraphiteSharedContext.LockAcquireTimeUs"
    units="microseconds" expires_after="2026-12-27">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the time spent waiting to acquire the lock in GraphiteSharedContext.
    Recorded when AutoLock is created. This is subsampled at 1%. Only reported
    for platforms supporting high resolution clocks.
  </summary>
</histogram>

<histogram
    name="Gpu.GraphiteSharedContext.LockAcquireTimeUs.LockedThreadInInsertRecording"
    units="microseconds" expires_after="2026-12-27">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the time spent waiting to acquire the lock in GraphiteSharedContext
    when the thread holding the lock was in insertRecording. Recorded when
    AutoLock is created. This is subsampled at 1%. Only reported for platforms
    supporting high resolution clocks.
  </summary>
</histogram>

<histogram
    name="Gpu.GraphiteSharedContext.LockAcquireTimeUs.LockedThreadInSubmit"
    units="microseconds" expires_after="2026-12-27">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the time spent waiting to acquire the lock in GraphiteSharedContext
    when the thread holding the lock was in submit or submitAndFlushBackend.
    Recorded when AutoLock is created. This is subsampled at 1%. Only reported
    for platforms supporting high resolution clocks.
  </summary>
</histogram>

<histogram name="GPU.GraphValidation.Duration" units="ms"
    expires_after="2025-11-15">
  <owner>vasilyt@chromium.org</owner>
  <owner>yzshen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    For each graph validation of TaskGraph, records the time it takes in
    milliseconds.
  </summary>
</histogram>

<histogram name="GPU.GraphValidation.NeedsForceRelease" enum="Boolean"
    expires_after="2025-11-15">
  <owner>vasilyt@chromium.org</owner>
  <owner>yzshen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    For each graph valiation of TaskGraph, records whether it finds invalid
    waits that require forceful release.
  </summary>
</histogram>

<histogram name="Gpu.GrCompileShaderUs" units="microseconds"
    expires_after="2027-01-10">
  <owner>geofflang@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Time to compile and resolve a Skia OpenGL shader in microseconds.

    Only reported on systems which have high resolution timers.
  </summary>
</histogram>

<histogram name="Gpu.GrLinkProgramUs" units="microseconds"
    expires_after="2027-01-10">
  <owner>geofflang@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Time to link and resolve a Skia OpenGL program in microseconds.

    Only reported on systems which have high resolution timers.
  </summary>
</histogram>

<histogram name="Gpu.GrShaderCacheEnabled" enum="Boolean"
    expires_after="2027-02-07">
  <owner>geofflang@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    If the GrShaderCache is in use. Recorded at GPU channel manager creation.
  </summary>
</histogram>

<histogram name="GPU.HardwareAccelerationModeEnabled" enum="BooleanEnabled"
    expires_after="2027-03-27">
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records if GPU hardware acceleration is explicitly disabled by the user.
    Recorded when the browser process launches.

    Warning: this histogram was expired from 2022-01-30 to 2022-04-29, and then
    from 2024-06-30 to 2026-03-27; data may be missing.
  </summary>
</histogram>

<histogram name="GPU.HardwareSupportsVulkan" enum="Boolean"
    expires_after="2027-02-14">
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records if a device can support running on Vulkan. This value is decided
    after the first successful GPU service launch and remains constant. If the
    device doesn't attempt to use Vulkan (eg. it's blocklisted or disabled) or
    Vulkan compatibility checks fail this will be false.

    This is recorded with every ongoing UMA log record, except if the UMA record
    is finalized before the first successful GPU service launch. This should be
    uncommon. This metric is NOT recorded in records that reflect information
    from a previous session (i.e., &quot;stability records&quot; or
    &quot;persistent UMA&quot; data related to the previous session but not
    uploaded during the previous session).
  </summary>
</histogram>

<histogram name="GPU.HasDiscreteGpu" enum="HasDiscreteGpu"
    expires_after="2023-08-27">
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records whether the system has a discrete GPU, collected in the info
    collection GPU process, once per UMA ping. This is Windows platform only.

    Warning: this histogram was expired from 2020-04-24 to 2022-04-29; data may
    be missing.
  </summary>
</histogram>

<histogram name="GPU.InitialChannelEstablishmentSucceeded" enum="Boolean"
    expires_after="2027-04-24">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-webium-product-eng@google.com</owner>
  <summary>
    Records whether the initial GPU channel was successfully established and
    created the GpuChannelHost with correct GPU info. Logged once per renderer
    process initialization when the channel establishment completes.
  </summary>
</histogram>

<histogram name="GPU.IntelGpuGeneration" enum="IntelGpuGeneration"
    expires_after="2027-01-17">
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the highest Intel GPU generation of the system using the GPU info
    collected at GPU process startup time, once per UMA ping.
  </summary>
</histogram>

<histogram name="GPU.IntelGpuSeriesType" enum="IntelGpuSeriesType"
    expires_after="2025-12-14">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <summary>
    Records user device's GPU series type. Only recorded on Windows platform at
    GPU process launch time. Only meaningful with Intel GPUs.
  </summary>
</histogram>

<histogram name="GPU.IOSurface.CreationTimeUs" units="microseconds"
    expires_after="2026-01-18">
  <owner>vasilyt@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The time that it took to create an IOSurface. Recorded for every IOSurface
    that's created. This metric is only collected on Mac, which only has
    high-resolution clocks.
  </summary>
</histogram>

<histogram name="Gpu.Mac.BackpressureUs" units="microseconds"
    expires_after="2027-06-28">
  <owner>magchen@chromium.org</owner>
  <owner>ccameron@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The time that the GPU's main CPU thread spends waiting for previous frames'
    GPU work to complete. Recorded at every frame. This metric is only collected
    on Mac, which only has high-resolution clocks.
  </summary>
</histogram>

<histogram name="GPU.MaximumGLESVersion" enum="MaximumGLESVersion"
    expires_after="2025-02-01">
  <owner>blundell@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@google.com</owner>
  <summary>
    Records the maximum GLES version supported on Android. Recorded once per GPU
    process launch and recorded only for non-ANGLE due to complexities in
    obtaining this information for ANGLE.
  </summary>
</histogram>

<histogram name="Gpu.Metal.FamilyMac" enum="MetalFamilyMac"
    expires_after="2027-01-10">
  <owner>cwallez@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    MTLGPUFamilyMac1 is deprecated since macOS 13 and iOS 16. This histograms is
    meant to gather information so that the WebGPU W3C group can decide whether
    to drop MTLGPUFamilyMac1 support. The histogram is recorded at GPU process
    startup time.
  </summary>
</histogram>

<histogram name="Gpu.Metal.ReadWriteTextureSupport"
    enum="MetalReadWriteTextureSupportTier" expires_after="2024-09-01">
  <owner>cwallez@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Read-write textures are not always supported on Metal. This histograms is
    meant to gather information so that the WebGPU W3C group can decide whether
    to require support for this feature. The reported tier is the best tier that
    was found on the system. Meaning that if only one of the GPUs support
    read-write textures, a non-zero tier will be reported. The histogram is
    recorded at GPU process startup time.
  </summary>
</histogram>

<histogram name="GPU.MultiGpu.Nvidia" enum="NvidiaDeviceId"
    expires_after="2023-04-16">
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Nvidia device IDs from multi-gpu devices. Recorded when GPU process launches
    and sends GPUInfo to browser process.
  </summary>
</histogram>

<histogram name="GPU.OsCompositor.NumLayersModified" units="layers"
    expires_after="2026-06-01">
  <owner>vasilyt@chromium.org</owner>
  <owner>tangm@microsoft.com</owner>
  <summary>
    A count of the number of OS compositor layers that were dirtied in a single
    commit. This estimates the amount of work the OS compositor needs to do per
    frame and can be used to compare incremental tree updating algorithms.
  </summary>
</histogram>

<histogram name="GPU.Output.HDR" enum="Boolean" expires_after="2026-12-27">
  <owner>hubbe@chromium.org</owner>
  <owner>cassew@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records if any connected monitor is HDR capable. Recorded when the gpu
    process starts. Only recorded on Windows as of M-61. If monitor enumeration
    fails, this metric will not be provided.
  </summary>
</histogram>

<histogram name="GPU.OutputSurface.InsertRenderPassRecording" enum="Boolean"
    expires_after="2027-02-14">
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records if graphite::Recording to draw a render pass was successfully
    inserted into the graphite::Context. Recorded for each insertRecording()
    call made with a render pass recording.
  </summary>
</histogram>

<histogram name="Gpu.OutputSurface.ScheduleOverlaysUs" units="microseconds"
    expires_after="2027-01-17">
  <owner>magchen@chromium.org</owner>
  <owner>ccameron@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The time that the GPU's main CPU thread spends producing pending CALayer
    tree on Mac. Recorded when Skia output surface schedules overlays at every
    frame. This metric is only collected on Mac, which only has high-resolution
    clocks.
  </summary>
</histogram>

<histogram name="GPU.PaintOpReader.DeserializationError"
    enum="PaintOpDeserializationError" expires_after="2027-02-22">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the reason why the deserialization of a PaintOp failed. Recorded in
    PaintOpReader::Read* methods when the decoding a paint op fails. These
    failures are typically caused by an invalid or unexpected state or invalid
    serialized data.
  </summary>
</histogram>

<histogram name="GPU.PersistentCache.StaleCacheDeleted" enum="Boolean"
    expires_after="2026-12-27">
  <owner>geofflang@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Records if any existing persistent cache databases were deleted due to
    incompatible versions. Recorded on GPU process launch.
  </summary>
</histogram>

<histogram name="GPU.PersistentCache.{GpuPersistentCacheType}.KeySize"
    units="KB" expires_after="2026-12-20">
  <owner>geofflang@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Records the size of cache entry keys added to the cache.

    Subsampled to 1/100.
  </summary>
  <token key="GpuPersistentCacheType" variants="GpuPersistentCacheType"/>
</histogram>

<histogram name="GPU.PersistentCache.{GpuPersistentCacheType}.Load"
    units="microseconds" expires_after="2027-02-07">
  <owner>lehoangquyen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Time it takes in gpu::GpuPersistentCache::LoadData (only when it is ready).
    Recorded only for clients that support high-resolution clocks.
  </summary>
  <token key="GpuPersistentCacheType" variants="GpuPersistentCacheType"/>
</histogram>

<histogram name="GPU.PersistentCache.{GpuPersistentCacheType}.LoadResult"
    enum="GpuPersistentCacheLoadResult" expires_after="2027-01-03">
  <owner>geofflang@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Records the results of gpu::GpuPersistentCache::Load for determining cache
    hit rates.
  </summary>
  <token key="GpuPersistentCacheType" variants="GpuPersistentCacheType"/>
</histogram>

<histogram name="GPU.PersistentCache.{GpuPersistentCacheType}.MetadataEvent"
    enum="GpuPersistentCacheMetadataEvent" expires_after="2026-09-27">
  <owner>geofflang@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Records various usages of GpuPersistentCache metadata for calculating rates
    of load and stores.
  </summary>
  <token key="GpuPersistentCacheType" variants="GpuPersistentCacheType"/>
</histogram>

<histogram name="GPU.PersistentCache.{GpuPersistentCacheType}.Store"
    units="microseconds" expires_after="2027-01-31">
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Time it takes in gpu::GpuPersistentCache::StoreData (only when it is ready).
    Recorded only for clients that support high-resolution clocks.
  </summary>
  <token key="GpuPersistentCacheType" variants="GpuPersistentCacheType"/>
</histogram>

<histogram name="GPU.PersistentCache.{GpuPersistentCacheType}.ValueSize"
    units="KB" expires_after="2026-12-20">
  <owner>geofflang@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Records the size of cache entry values added to the cache.

    Subsampled to 1/100.
  </summary>
  <token key="GpuPersistentCacheType" variants="GpuPersistentCacheType"/>
</histogram>

<histogram
    name="GPU.PersistentCache.{GpuPersistentCacheType}.VkPipelineCache.LoadedSize"
    units="KB" expires_after="2027-04-30">
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the size of the serialized VkPipelineCache that is loaded from the
    cache.
  </summary>
  <token key="GpuPersistentCacheType" variants="GpuPersistentCacheType"/>
</histogram>

<histogram
    name="GPU.PersistentCache.{GpuPersistentCacheType}.{LoadStore}.CacheAvailable"
    enum="Boolean" expires_after="2027-02-07">
  <owner>lehoangquyen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Whether the gpu::GpuPersistentCache is ready when {LoadStore}Data() is
    called. Recorded only for first 100 {LoadStore}.
  </summary>
  <token key="GpuPersistentCacheType" variants="GpuPersistentCacheType"/>
  <token key="LoadStore">
    <variant name="Load"/>
    <variant name="Store"/>
  </token>
</histogram>

<histogram name="GPU.Presentation.FrameHandlesAnimationOrInteraction"
    enum="FrameHandlingType" expires_after="2026-11-22">
  <owner>magchen@chromium.org</owner>
  <owner>vmiura@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Recorded when a display frame is swapped in Viz. It records whether the
    current frame is handling interaction, animation, both, or none.
  </summary>
</histogram>

<histogram name="GPU.Presentation.VSyncCallbackDelay" units="microseconds"
    expires_after="2027-01-03">
  <owner>magchen@chromium.org</owner>
  <owner>vmiura@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The VSync callback delay from the system CVDisplayLink or CADisplaylink
    source to CrGpuMain. Recorded once per frame when OnVSyncPresentation is
    called. This histogram is ~1/1000 sub-sampled under the CPU reduction
    experiment. The recorded delay is capped to the maximum of 33 ms.

    This metric is only for Mac clients with high-resolution clocks.
  </summary>
</histogram>

<histogram name="GPU.ProcessLifetime2" units="seconds"
    expires_after="2027-02-07">
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>GPU process lifetime as measured by GPU process host.</summary>
</histogram>

<histogram name="GPU.ProcessLifetimeEvents.HardwareAccelerated"
    enum="GPUProcessLifetimeEvent" expires_after="2027-01-17">
  <owner>vmiura@chromium.org</owner>
  <summary>
    Recorded once for every GPU process launch and crash when GPU process is
    started for hardware accelerated GPU compositing and/or WebGL. Crash buckets
    are based on crash count for disabling features. With OOP-D enabled the
    display compositor also runs in the GPU process.
  </summary>
</histogram>

<histogram name="GPU.ProcessLifetimeEvents.SwiftShader"
    enum="GPUProcessLifetimeEvent" expires_after="2026-11-08">
  <owner>vmiura@chromium.org</owner>
  <summary>
    Recorded once for every GPU process launch and crash when GPU process is
    started for SwiftShader WebGL. Crash buckets are based on crash count for
    disabling features. With OOP-D enabled the display compositor with software
    compositing will also run as part of the GPU process.

    Note this was expired from 2024-12-08 to 2015-03-13.
  </summary>
</histogram>

<histogram name="GPU.RasterDecoder.TimeToFlush" units="microseconds"
    expires_after="2024-04-28">
  <owner>vasilyt@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Time it takes for RasterDecoderImpl::FlushSurfaces() to complete. Recorded
    for the first 100 flushes.
  </summary>
</histogram>

<histogram name="GPU.RequestAdapterStatus.WebGPU"
    enum="WebGPURequestAdapterStatus" expires_after="2027-01-17">
  <owner>olivierli@chromium.org</owner>
  <owner>fdoray@chromium.org</owner>
  <summary>
    The result of requesting a WebGPU adapater. Recorded for each attempt.
  </summary>
</histogram>

<histogram name="GPU.Sandboxed" enum="Boolean" expires_after="2027-02-01">
  <owner>akhna@google.com</owner>
  <owner>chromeos-hardening@google.com</owner>
  <summary>
    A boolean that indicates whether sandboxing is successfully applied. A value
    of true means the GPU is sandboxed. A value of false means the GPU is not
    sandboxed. Recorded once per GPU process start-up in gpu_init.cc.
  </summary>
</histogram>

<histogram name="GPU.Scheduler.PercentConcurrentTaskExecution{Priority}"
    units="%" expires_after="2027-02-14">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the percentage of time each GPU scheduler task spent executing while
    at least one other task was also executing on another thread.
  </summary>
  <token key="Priority">
    <variant name=""/>
    <variant name=".HighPriority"/>
    <variant name=".LowPriority"/>
    <variant name=".NormalPriority"/>
  </token>
</histogram>

<histogram name="GPU.Scheduler.{Stage}{Priority}" units="microseconds"
    expires_after="2027-02-14">
  <owner>vikassoni@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the wall time for GPU Scheduler task at various stages and with
    various priorities. Only recorded for clients with high resolution clocks.
    Note that the histograms for GPU.Scheduler.{Stage} was expired on 2022-08-07
    and was re-enabled on 2023-11-17. It was then expired again on 2024-08-07
    and was re-enable on 2026-04-15.
  </summary>
  <token key="Priority">
    <variant name=""/>
    <variant name=".HighPriority"/>
    <variant name=".LowPriority"/>
    <variant name=".NormalPriority"/>
  </token>
  <token key="Stage">
    <variant name="TaskDependencyTime"
        summary="Records the wall time taken spent by each GPU scheduler task
                 waiting on it's dependencies to resolve. The time delta
                 starts when the waiting fence is added and finishes when the
                 last fence is removed"/>
    <variant name="TaskSchedulingDelayTime"
        summary="Records the wall time taken spent by each GPU scheduler task
                 waiting on to be scheduled once all its dependencies have
                 been resolved. The time delta starts when the last waiting
                 fence is passed and stops when the tasks starts running. If
                 the schedulers is working properly, for a high priority
                 task, this metric should be minimal"/>
    <variant name="TaskTotalDelayTime"
        summary="Records the wall time taken spent by each GPU scheduler task
                 waiting for it's execution from the time it was registered.
                 This is a sum of TaskDependencyTime, TaskSchedulingDelayTime
                 and ThreadSuspendedTime."/>
    <variant name="ThreadSuspendedTime"
        summary="Records the wall time taken between calls to schedule the
                 task run and the actual run of the task. Ideally this should
                 always be as close to 0 as possible"/>
  </token>
</histogram>

<histogram name="GPU.ShaderLoadPrefixOK" enum="BooleanMatched"
    expires_after="2026-06-28">
  <owner>vikassoni@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@google.com</owner>
  <summary>
    Whether or not the shader prefix loaded from disk matched the expected
    prefix for the data and system configuration. False indicates either disk
    corruption or a system configuration change, and should be rare.
  </summary>
</histogram>

<histogram name="GPU.SharedImage.BackingType" enum="SharedImageBackingType"
    expires_after="2027-01-17">
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@google.com</owner>
  <summary>
    Records the type of each SharedImageBacking that's initialized/registered.
  </summary>
</histogram>

<histogram name="GPU.SharedImage.R16FToLuminanceF16Fallback" enum="Boolean"
    expires_after="2027-07-01">
  <owner>hitawala@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records whether a single-channel 16-bit half-float texture (R_F16) fell back
    to LUMINANCE_F16 because the OpenGL ES context lacks ES3 or half-float
    linear filtering support. Recorded when getting GL format info for a plane
    during backing creation.
  </summary>
</histogram>

<histogram name="GPU.SharedImage.R8ToAlpha8Fallback" enum="Boolean"
    expires_after="2027-07-01">
  <owner>hitawala@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records whether a single-channel 8-bit texture (R_8) fell back to ALPHA_8
    because the OpenGL context lacks ext_texture_rg support. Recorded only for
    single-channel 8-bit planes (R_8) of a multi-planar texture and only when
    getting GL format info for such textures during GL based backing creation.
  </summary>
</histogram>

<histogram name="GPU.SharedImage.SharedImageFormat" enum="SharedImageFormatUMA"
    expires_after="2027-02-14">
  <owner>hitawala@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records the SharedImageFormat type for a SharedImageBacking that's
    initialized/registered.
  </summary>
</histogram>

<histogram name="GPU.SkiaBackendType" enum="SkiaBackendType"
    expires_after="2027-01-03">
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@google.com</owner>
  <summary>
    Records what backend Skia is initialized with for compositing/rasterization
    in the GPU process. This is only recorded the first time Skia is initialized
    per GPU process launch, in case it's initialized on more than one thread or
    reinitialized on context loss.
  </summary>
</histogram>

<histogram name="GPU.SoftwareRendering" enum="BooleanSoftwareRendering"
    expires_after="2027-01-17">
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Collects whether Chrome uses software renderer or hardware GPU 20 seconds
    after Chrome starts, and records this value once per UMA ping. This value is
    not re-collected at each recording time because GPU process could crash for
    various reasons and fall back to software rendering. This value is intended
    to reflect device capabilities rather than the current state.
  </summary>
</histogram>

<histogram name="GPU.TransferCache.EntryFound" enum="BooleanYesNo"
    expires_after="2027-03-01">
  <owner>boliu@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Whether a transfer cache entry is found when trying to retrieve it. Recorded
    on every transfer cache look up.
  </summary>
</histogram>

<histogram name="GPU.TransferCache.MaxHistoricalTimeSinceLastUse" units="ms"
    expires_after="2027-03-01">
  <owner>boliu@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    When a transfer cache is found, record max historical time between reuses.
    Recorded on every successful transfer cache look up.
  </summary>
</histogram>

<histogram name="GPU.TransferCache.ReusedTimes" units="Reuses"
    expires_after="2027-03-01">
  <owner>boliu@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    When a transfer cache entry is deleted, record how many times it was used.
    Recorded when an entry is deleted.
  </summary>
</histogram>

<histogram name="GPU.TransferCache.TimeSinceLastUse" units="ms"
    expires_after="2027-03-01">
  <owner>boliu@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    When a transfer cache is found, record the time since last use. Recorded on
    every successful transfer cache look up. Expired from 2025-06-22 to
    2026-03-24.
  </summary>
</histogram>

<histogram name="GPU.TransferCache.TimeSinceLastUseOnDelete" units="ms"
    expires_after="2027-03-01">
  <owner>boliu@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    When a transfer cache entry is deleted, record the last time the entry was
    used. Recorded when an entry is deleted. Expired from 2025-06-22 to
    2026-03-30.
  </summary>
</histogram>

<histogram name="GPU.Vulkan.SkiaContext.vkCreateGraphicsPipelinesUS"
    units="microseconds" expires_after="2027-05-01">
  <owner>hitawala@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Duration of vkCreateGraphicsPipelines call. Recorded every time
    Ganesh-Vulkan or Graphite-Dawn-Vulkan on Skia context creates graphics
    pipeline. Only reported for platforms supporting high resolution clocks.
  </summary>
</histogram>

<histogram name="GPU.Vulkan.SkiaContext.vkQueueSubmitUS" units="microseconds"
    expires_after="2027-05-06">
  <owner>hitawala@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Duration of vkQueueSubmit call. Recorded every time Ganesh-Vulkan or
    Graphite-Dawn-Vulkan on Skia context submits to vulkan queue. Only reported
    for platforms supporting high resolution clocks.
  </summary>
</histogram>

<histogram name="GPU.WatchdogThread.Event{ThreadType}"
    enum="GpuWatchdogThreadEvent" expires_after="2026-11-29">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Recorded for each time the GPU watchdog thread starts, crashes and ends.
  </summary>
  <token key="ThreadType">
    <variant name=""/>
    <variant name=".compositor"/>
    <variant name=".main"/>
  </token>
</histogram>

<histogram name="GPU.WatchdogThread.Timeout{WatchdogStage}{ThreadType}"
    enum="GpuWatchdogTimeoutEvent" expires_after="2027-02-07">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Recorded timeout events when the GPU watchdog enters OnWatchdogTimeout.
  </summary>
  <token key="WatchdogStage">
    <variant name=""/>
    <variant name=".Foregrounded"/>
    <variant name=".Init"/>
    <variant name=".Normal"/>
    <variant name=".PowerResume"/>
  </token>
  <token key="ThreadType">
    <variant name=""/>
    <variant name=".compositor"/>
    <variant name=".main"/>
  </token>
</histogram>

<histogram name="GPU.WebGLDisplayType" enum="EGLDisplayType"
    expires_after="2025-12-14">
  <owner>geofflang@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Types of EGL displays used to back WebGL contexts. Recorded at context
    creation time in the GPU process.
  </summary>
</histogram>

<histogram
    name="GPU.{ANGLEOrGraphiteDawnOrWebGPU}.D3D11.Create{ShaderType}ShaderUs"
    units="microseconds" expires_after="2027-02-07">
  <owner>lehoangquyen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@google.com</owner>
  <summary>
    Tracks the amount of time in microseconds it takes to create a D3D11
    {ShaderType} shader. Recorded only for clients that support high-resolution
    clocks.
  </summary>
  <token key="ANGLEOrGraphiteDawnOrWebGPU">
    <variant name="ANGLE" summary="ANGLE"/>
    <variant name="GraphiteDawn" summary="Graphite Dawn"/>
    <variant name="WebGPU" summary="WebGPU"/>
  </token>
  <token key="ShaderType" variants="ShaderType"/>
</histogram>

<histogram name="Gpu.{CacheType}LoadHitInCache" enum="Boolean"
    expires_after="2027-02-07">
  <owner>blundell@chromium.org</owner>
  <owner>geofflang@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    For each load of an entry from {CacheType}, records whether the entry was
    found in the cache. Expired on June 1 2024 and revived on June 11 2024.
  </summary>
</histogram>

<histogram name="GPU.{GraphiteDawnOrWebGPU}.Create{Module}Success"
    enum="Boolean" expires_after="2027-01-31">
  <owner>enga@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Tracks whether a call to Create{Module} was successful, excluding when the
    result is found in frontend cache.
  </summary>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
  <token key="Module" variants="WebGPUModule"/>
</histogram>

<histogram name="GPU.{GraphiteDawnOrWebGPU}.Create{Module}US"
    units="microseconds" expires_after="2027-01-31">
  <owner>enga@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Tracks the amount of time in microseconds it takes for a call to
    Create{Module} to complete, excluding when the result is found in frontend
    cache. Recorded only for clients that support high-resolution clocks.
  </summary>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
  <token key="Module" variants="WebGPUModule"/>
</histogram>

<histogram name="GPU.{GraphiteDawnOrWebGPU}.D3DDeviceRemovedReason"
    enum="Hresult" expires_after="2026-06-25">
  <owner>cwallez@google.com</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Error codes received when checking for D3D device removal reason. HRESULT is
    DXGI error code that listed at
    https://learn.microsoft.com/en-us/windows/win32/api/d3d11/nf-d3d11-id3d11device-getdeviceremovedreason
  </summary>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
</histogram>

<histogram name="GPU.{GraphiteDawnOrWebGPU}.HasGpuAdapter" enum="Boolean"
    expires_after="2026-07-26">
  <owner>cduvall@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Records whether WebGPU or Graphite Dawn has any GPU adapters available. This
    is recorded during GPU process startup.
  </summary>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
</histogram>

<histogram
    name="GPU.{GraphiteDawnOrWebGPU}.MaxStorageBufferBindingSize.{AdapterType}"
    units="MB" expires_after="2024-11-03">
  <owner>cduvall@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Records the maximum storage buffer binding size if {AdapterType} GPU is
    available. This is recorded during GPU process startup.
  </summary>
  <token key="AdapterType" variants="WebGPUAdapterType"/>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
</histogram>

<histogram
    name="GPU.{GraphiteDawnOrWebGPU}.MaxTextureDimension2D.{AdapterType}"
    units="dimensions" expires_after="2026-01-11">
  <owner>cduvall@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Records the maximum 2D texture dimensions if {AdapterType} GPU is available.
    This is recorded during GPU process startup.
  </summary>
  <token key="AdapterType" variants="WebGPUAdapterType"/>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
</histogram>

<histogram name="GPU.{GraphiteDawnOrWebGPU}.Support" enum="WebGPUSupport"
    expires_after="2027-02-07">
  <owner>cwallez@google.com</owner>
  <owner>enga@google.com</owner>
  <owner>kainino@google.com</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    WebGPU or Graphite Dawn support level. Recorded on GPU info collection a
    couple minutes after browser startup. Compatibility mode support means that
    WebGPU or Graphite Dawn is supported on a non-core backend like OpenGLES.
    Core backends can always support compatibility mode so
    compat-on-core-adapter is not reported in this metric. Supported means at
    least one adapter of that type was available. Blocklisted means all adapters
    of that type were blocklisted. None means that no adapters of that type were
    available. Software adapters are considered as None in this metric.
  </summary>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
</histogram>

<histogram name="GPU.{GraphiteDawnOrWebGPU}.Vulkan.VkQueueSubmitUS"
    units="microseconds" expires_after="2027-05-06">
  <owner>hitawala@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Tracks the amount of time in microseconds it takes for a call to
    vkQueueSubmit to complete. Recorded only for clients that support
    high-resolution clocks.
  </summary>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
</histogram>

<histogram name="GPU.{GraphiteDawnOrWebGPU}.{Cacheable}.CacheHit"
    units="microseconds" expires_after="2027-02-07">
  <owner>lokokung@google.com</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Tracks the amount of time in microseconds it takes for a cached call to
    {Cacheable} to complete without error when we have a cache hit. This
    includes the load time from the cache and time to deserialize the result.
    Recorded only for clients that support high-resolution clocks.
  </summary>
  <token key="Cacheable" variants="WebGPUCacheable"/>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
</histogram>

<histogram
    name="GPU.{GraphiteDawnOrWebGPU}.{Cacheable}.CacheHit.Counts.1stPresent"
    units="%" expires_after="2026-11-29">
  <owner>lehoangquyen@google.com</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Tracks the number of cache hits for {Cacheable} for the 1st Presentation.
    Recorded only for clients that support high-resolution clocks.
  </summary>
  <token key="Cacheable" variants="WebGPUCacheable"/>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
</histogram>

<histogram
    name="GPU.{GraphiteDawnOrWebGPU}.{Cacheable}.CacheHit.Percentage.1stPresent"
    units="%" expires_after="2027-02-07">
  <owner>lehoangquyen@google.com</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Tracks the percentage of cache hits for {Cacheable} for the 1st
    Presentation. Recorded only for clients that support high-resolution clocks.
  </summary>
  <token key="Cacheable" variants="WebGPUCacheable"/>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
</histogram>

<histogram
    name="GPU.{GraphiteDawnOrWebGPU}.{Cacheable}.CacheHit.Percentage.90SecondsPostStartup"
    units="%" expires_after="2027-02-07">
  <owner>lehoangquyen@google.com</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Tracks the percentage of cache hits for {Cacheable} within 90 seconds of
    browser start up. Recorded only for clients that support high-resolution
    clocks.
  </summary>
  <token key="Cacheable" variants="WebGPUCacheable"/>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
</histogram>

<histogram name="GPU.{GraphiteDawnOrWebGPU}.{Cacheable}.CacheMiss"
    units="microseconds" expires_after="2027-02-07">
  <owner>lokokung@google.com</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Tracks the amount of time in microseconds it takes for a cached call to
    {Cacheable} to complete without error when we have a cache miss. This
    includes the time necessary to create the results of {Cacheable} from
    scratch, but does not include the time taken to write the results back into
    the cache. Recorded only for clients that support high-resolution clocks.
  </summary>
  <token key="Cacheable" variants="WebGPUCacheable"/>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
</histogram>

<histogram
    name="GPU.{GraphiteDawnOrWebGPU}.{Cacheable}.{CacheHitMiss}.90SecondsPostStartup"
    units="microseconds" expires_after="2027-02-07">
  <owner>hitawala@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Tracks the amount of time in microseconds it takes for a cached call to
    {Cacheable}.{CacheHitMiss} to complete without error when we have a cache
    hit or miss within 90 seconds of browser start up. Based off the
    {Cacheable}.CacheHit and {Cacheable}.CacheMiss metrics above. Recorded only
    for clients that support high-resolution clocks.
  </summary>
  <token key="Cacheable" variants="WebGPUCacheable"/>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
  <token key="CacheHitMiss">
    <variant name="CacheHit"/>
    <variant name="CacheMiss"/>
  </token>
</histogram>

<histogram
    name="GPU.{GraphiteDawnOrWebGPU}.{Cacheable}.{CacheHitMiss}.Counts.90SecondsPostStartup"
    units="count" expires_after="2027-02-07">
  <owner>hitawala@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Tracks the number of times calls to {Cacheable}.{CacheHitMiss} are emitted
    within 90 seconds of browser start up. Recorded only for clients that
    support high-resolution clocks.
  </summary>
  <token key="Cacheable" variants="WebGPUCacheable"/>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
  <token key="CacheHitMiss">
    <variant name="CacheHit"/>
    <variant name="CacheMiss"/>
  </token>
</histogram>

<histogram name="GPU.{GraphiteDawnOrWebGPU}.{ShaderTiming}"
    units="microseconds" expires_after="2027-02-14">
  <owner>hitawala@chromium.org</owner>
  <owner>mdb.webgpu-dev-team@google.com</owner>
  <summary>
    Tracks the amount of time in microseconds it takes for a call to
    {ShaderTiming} to complete, excluding when the result is found in frontend
    cache. Recorded only for clients that support high-resolution clocks.
  </summary>
  <token key="GraphiteDawnOrWebGPU" variants="GraphiteDawnOrWebGPU"/>
  <token key="ShaderTiming" variants="WebGPUShaderTiming"/>
</histogram>

<histogram name="Graphics.Gbm.SupportsZeroCopyWebGPUImport" enum="Boolean"
    expires_after="2027-02-07">
  <owner>hitawala@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records whether zero-copy WebGPU import is supported for a GBM buffer.
    Logged on GbmBuffer creation and when checking compatibility.
  </summary>
</histogram>

<histogram name="NPU.Intel.DeviceId" enum="IntelNpuDeviceId"
    expires_after="2026-12-27">
  <owner>reillyg@chromium.org</owner>
  <owner>src/services/webnn/OWNERS</owner>
  <summary>
    Record Intel NPU device ID when GPU process launches and sends GPUInfo to
    browser process.
  </summary>
</histogram>

<histogram name="Skia.Graphite.PipelineCache.PipelineUsesInEpoch" units="count"
    expires_after="2026-01-01">
  <owner>robertphillips@google.com</owner>
  <owner>michaelludwig@google.com</owner>
  <owner>skia-gpu-team@google.com</owner>
  <summary>
    This reports the number of Pipelines used in a five-minute window. This
    provides information regarding the size of the optimal Pipeline active set.

    This is only recorded on clients using both Graphite and Precompilation. It
    is recorded every five minutes.
  </summary>
</histogram>

<histogram name="Skia.Graphite.PipelineCreationRace"
    enum="SkiaPipelineCreationRace" expires_after="2026-12-20">
  <owner>robertphillips@google.com</owner>
  <owner>michaelludwig@google.com</owner>
  <owner>skia-gpu-team@google.com</owner>
  <summary>
    Records the number of Pipeline creation races in Skia broken down by the
    origin (Normal compilation vs Pre-compilation) and which instances won
    (i.e., made it into the cache before the other one).
  </summary>
</histogram>

<histogram name="Skia.Graphite.PipelineCreationTimes.{CompilationType}"
    units="microseconds" expires_after="2026-05-17">
  <owner>robertphillips@google.com</owner>
  <owner>michaelludwig@google.com</owner>
  <owner>skia-gpu-team@google.com</owner>
  <summary>
    Measures the time taken to create a Pipeline in Skia's Dawn backend for
    {CompilationType} compilations.

    This is only recorded on clients with high-resolution clocks.
  </summary>
  <token key="CompilationType">
    <variant name="Asynchronous" summary="Asynchronous Normal compilations"/>
    <variant name="Precompile" summary="Synchronous Pre-compilations"/>
    <variant name="Synchronous" summary="Synchronous Normal compilations"/>
  </token>
</histogram>

<histogram name="Skia.Graphite.Precompile.{PipelineStatistic}" units="count"
    expires_after="2026-01-01">
  <owner>robertphillips@google.com</owner>
  <owner>michaelludwig@google.com</owner>
  <owner>skia-gpu-team@google.com</owner>
  <summary>
    Reports the number of Pipelines that were categorized as
    {PipelineStatistic}.

    This is only recorded on clients using both Graphite and Precompilation. It
    is recorded after a 30 minute delay.
  </summary>
  <token key="PipelineStatistic">
    <variant name="NormalPreemptedByPrecompile"
        summary="Reports the number of times a Precompiled Pipeline is chosen
                 over a Normally compiled Pipeline. This is roughly the
                 benefit Chromium is seeing from Precompilation. Higher is
                 better."/>
    <variant name="UnpreemptedPrecompilePipelines"
        summary="Reports the number of times a Precompiled Pipeline reaches
                 the Pipeline cache. A Precompiled Pipeline may be pruned
                 before reaching the cache either because it was preempted by
                 a Normal Pipeline or by a different Precompilation Pipeline.
                 This is roughly the overall cost Chromium is incurring for
                 Precompilation. Lower is better as long as
                 NormalPreemptedByPrecompile doesn't decrease."/>
    <variant name="UnusedPrecompiledPipelines"
        summary="Reports the number of times a Precompiled Pipeline is either
                 purged from the Pipeline cache before being ever used or is
                 residing (unused) in the Pipeline cache after 30 minutes.
                 This is roughly the wasted cost of over-generation in the
                 Precompilation system. Ideally this would be zero."/>
  </token>
</histogram>

<histogram name="Skia.VulkanMemoryAllocator.AmountAllocated" units="KB"
    expires_after="2026-05-10">
  <owner>egdaniel@google.com</owner>
  <owner>michaelludwig@google.com</owner>
  <owner>skia-gpu-team@google.com</owner>
  <summary>
    The total amount of memory that the VulkanMemoryAllocator used by Skia's
    Vulkan backend has allocated. This is GPU memory for VkImages and VkBuffers.
    Note that the allocator may be shared with other users outside of Skia and
    this amount includes their uses as well. This is collected each time we
    request an allocation from Skia.

    Warning: this histogram was expired from 2024-09-01 to 2025-04-02; data may
    be missing.
  </summary>
</histogram>

<histogram name="Viz.BeginFrameSource.Accuracy.AverageDelta2"
    units="microseconds" expires_after="2027-02-07">
  <owner>magchen@chromium.org</owner>
  <owner>ccameron@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The average time delta between the expected BeginFrame time and the actual
    time of BeginFrame on Mac. Each recorded number is an average result of 3600
    frames. It's recorded every 3600 frames when OnBeginFrame or OnTimerTick is
    called. The max delta is capped to 33 ms.

    This metric is only for Mac clients with high-resolution clocks.

    Expired on 2025-08-24 and restarted on 2025-09-09.
  </summary>
</histogram>

<histogram name="Viz.BeginFrameSource.Accuracy.CallbackTimeError"
    units="microseconds" expires_after="2027-02-07">
  <owner>magchen@chromium.org</owner>
  <owner>ccameron@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The time delta between the expected and actual BeginFrame callback times on
    Mac. It's recorded during the BeginFrameSource callbacks using 0.1%
    subsampling.

    This metric is only for Mac clients with high-resolution clocks.
  </summary>
</histogram>

<histogram name="Viz.BeginFrameSource.IPC.LatencyUs2" units="microseconds"
    expires_after="2027-03-31">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This metric tracks the IPC (Mojo) latency for forwarding CADisplayLink VSync
    signals on Mac. The duration is measured from
    DisplayLinkMacMojo::OnDisplayLinkVSyncCallback() within the Browser process
    to ExternalBeginFrameSourceMojoMac::IssueExternalVSync() in the GPU process.
    Recorded once per frame upon the invocation of IssueExternalVSync,

    This metric is only for Mac clients with high-resolution clocks.
  </summary>
</histogram>

<histogram name="Viz.BeginFrameSource.VrrFrameCount" units="frames"
    expires_after="2025-08-10">
  <owner>aswolfers@chromium.org</owner>
  <owner>chromeos-gfx-compositor@chromium.org</owner>
  <summary>
    This is logged once per session of the variable refresh rate (VRR) feature
    being enabled. This counts the number of BeginFrames which are issued using
    VRR.
  </summary>
</histogram>

<histogram name="Viz.BeginFrameSource.VSyncCallbackDelay" units="microseconds"
    expires_after="2027-01-03">
  <owner>magchen@chromium.org</owner>
  <owner>vmiura@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The VSync callback delay from the system CVDisplayLink or CADisplaylink
    source to VizCompositorThread. Recorded once per frame when
    OnDisplayLinkCallback is called. This histogram is ~1/1000 sub-sampled under
    the CPU reduction experiment. The recorded delay is capped to the maximum of
    33 ms.

    This metric is only for Mac clients with high-resolution clocks.
  </summary>
</histogram>

<histogram
    name="Viz.CompositorFrameSinkSupport.HasSurfaceAnimationManagerOnAnimate"
    enum="Boolean" expires_after="2027-01-03">
  <owner>hitawala@chromium.org</owner>
  <owner>vasilyt@chromium.org</owner>
  <summary>
    Records if SurfaceAnimationManager is cached by FrameSinkManagerImpl on
    Animate. The SurfaceAnimationManager may not be cached if
    CompositorFrameTransitionDirective::Type::kAnimateRenderer directive is
    issued before CompositorFrameTransitionDirective::Type::kSave directive is
    completely processed leading to an incomplete CopyOutputRequest.
  </summary>
</histogram>

<histogram name="Viz.CreateFallbackImageResult"
    enum="CreateFallbackImageResult" expires_after="2026-12-27">
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    This is recorded each time SkiaRenderer attempts to create a fallback image
    to replace a missing shared image. The result captures success and failure
    with a reason for the failure.
  </summary>
</histogram>

<histogram name="Viz.DelegatedCompositing.Status" enum="DelegatedStatus"
    expires_after="2025-07-13">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    An enum status result for attempted delegated compositing (success or
    failure reason) recorded every drawn frame.
  </summary>
</histogram>

<histogram name="Viz.DisplayCompositor.OverlayNumProposedCandidates"
    units="units" expires_after="2025-08-24">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    A count of the number of proposed overlay candidates available for overlay
    selection. Recorded every time a frame is rendered by the display
    compositor.
  </summary>
</histogram>

<histogram name="Viz.DisplayCompositor.OverlayStrategy"
    enum="OverlayStrategies" expires_after="2027-02-07">
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Overlay strategies used to promote Hardware Overlays, once or more per
    frame. Recorded every time a frame is rendered by the display compositor, or
    once per overlay promoted if multiple were promoted.
  </summary>
</histogram>

<histogram name="Viz.DisplayCompositor.RootDamageRect.Overlay"
    enum="BooleanOverlayDamageRect" expires_after="2027-02-14">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <summary>
    Any root damage excluding overlay damage in the current frame?
  </summary>
</histogram>

<histogram name="Viz.DisplayCompositor.RootDamageRect.Underlay"
    enum="UnderlayDamageRect" expires_after="2025-07-21">
  <owner>magchen@chromium.org</owner>
  <owner>zmo@chromium.org</owner>
  <summary>
    The root damage type excluding underlay damage in the current frame.
  </summary>
</histogram>

<histogram name="Viz.DisplayLink.Create.GPU.{Source}" enum="BooleanSuccess"
    expires_after="2027-03-30">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The result of creating {Source} in the GPU process for each display.
    Recorded whenever a DisplayLink is created in ExternalBeginFrameSourceMac or
    ImageTransportSurfaceOverlayMacEGL within the GPU process.
  </summary>
  <token key="Source">
    <variant name="CADisplayLinkV2"
        summary="CADisplayLink using [screen displayLinkWithTarget]"/>
    <variant name="CVDisplayLink"
        summary="CVDisplayLink using CVDisplayLinkCreateWithCGDisplay"/>
    <variant name="ExternalDisplayLink"
        summary="ExternalDisplayLink using CADisplayLink in the Browser
                 process"/>
  </token>
</histogram>

<histogram name="Viz.DisplayLink.IpcTimeFromNeedsBeginFramesToVSyncReceived"
    units="ms" expires_after="2027-06-28">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The time elapsed from when a NeedsBeginFrames(true) request is sent via IPC
    to the browser process until the first VSync signal is received by the GPU
    process. This is recorded once per request cycle per display. This is
    recorded only when the CADisplayLinkInBrowser feature is enabled (which uses
    ExternalDisplayLink and VSyncProviderMac).
  </summary>
</histogram>

<histogram name="Viz.ExternalBeginFrameSource.Interval" units="ms"
    expires_after="2027-01-24">
  <owner>lizeb@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>
    Frame interval, as provided in OnBeginFrame() for external sources.
    Subsampled, but recorded at BeginFrame() time.
  </summary>
</histogram>

<histogram name="Viz.ExternalBeginFrameSourceMac.DisplayLink"
    enum="DisplayLinkCreateResult" expires_after="2027-02-14">
  <owner>magchen@chromium.org</owner>
  <owner>ccameron@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The result of creating CVDisplaylink in ExternalBeginFrameSourceMac. If
    successful, BeginFrameSource is driven by HW VSync instead of timer. This
    histogram does not include the data from DelayBasedBeginFrameSourceMac. It's
    recorded each time a DisplayLink is created during
    RootCompositorFrameSinkImpl/ExternalBeginFrameSourceMac creation or during
    the monitor change in the existing ExternalBeginFrameSourceMac.
  </summary>
</histogram>

<histogram name="Viz.ExternalBeginFrameSourceMac.DisplayLink.Create2"
    enum="BooleanSuccess" expires_after="2027-03-30">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The result of creating CVDisplaylink with CVDisplayLinkCreateWithCGDisplay
    or CADisplayLink with [screen displayLinkWithTarget] per display. It does
    not track ExternalDisplayLinkMac or Timer. This histogram is recorded each
    time a DisplayLink is created in ExternalBeginFrameSourceMac,
    ImageTransportSurfaceOverlayMacEGL, or DisplayLinkMacMojo.
  </summary>
</histogram>

<histogram
    name="Viz.ExternalBeginFrameSourceMac.TimeFromConstructionToFirstFrame{Source}"
    units="ms" expires_after="2027-05-14">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The time elapsed from when ExternalBeginFrameSourceMac is constructed to
    when the first OnDisplayLinkCallback or OnTimerTick is called. This measures
    the latency to start the first frame using {Source}. This is not recorded if
    a power event occurs before the first frame.
  </summary>
  <token key="Source">
    <variant name="" summary="DisplayLink or Timer"/>
    <variant name=".DisplayLink" summary="DisplayLink"/>
    <variant name=".Timer" summary="Timer"/>
  </token>
</histogram>

<histogram
    name="Viz.ExternalBeginFrameSourceMac.TimeFromFirstNeedsBeginFramesToFirstFrame{Source}"
    units="ms" expires_after="2027-05-14">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The time elapsed from when the first OnNeedsBeginFrames(true) is called to
    when the first OnDisplayLinkCallback or OnTimerTick is called. This measures
    the latency from the first request for frames to the first frame delivery
    using {Source}. This is not recorded if a power event occurs before the
    first frame.
  </summary>
  <token key="Source">
    <variant name="" summary="DisplayLink or Timer"/>
    <variant name=".DisplayLink" summary="DisplayLink"/>
    <variant name=".Timer" summary="Timer"/>
  </token>
</histogram>

<histogram name="Viz.FileDescriptorTracking.TimeToCompute" units="microseconds"
    expires_after="2027-02-14">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Time spent computing the number of active File Descriptors. This is logged
    once every 5 minutes as the cost of this computation is estimated to be at
    least 1ms.

    Warning: This metric does not include reports from clients with
    low-resolution clocks.
  </summary>
</histogram>

<histogram name="Viz.FileDescriptorTracking.{FdStat}" units="units"
    expires_after="2027-02-14">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    {FdStat} File Descriptors for the GPU process. This is logged once every 5
    minutes as the cost of this computation is estimated to be at least 1ms.
  </summary>
  <token key="FdStat">
    <variant name="NumActive" summary="Current number of active"/>
    <variant name="NumSoftMax" summary="Maximum number of"/>
    <variant name="PercentageUsed" summary="Percentage of in use"/>
  </token>
</histogram>

<histogram name="Viz.FrameDeadlineDecider.SelectedSustainableDeadline"
    enum="Boolean" expires_after="2027-02-14">
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    Records whether the deadline selected by viz::FrameDeadlineDecider has a
    presentation delta that is sustainable with the current number of allowed
    buffers to avoid multiple-vsync swap throttling. Recorded every time a frame
    is drawn and swapped.
  </summary>
</histogram>

<histogram name="Viz.FrameDeadlineDecider.SelectionReason"
    enum="FrameDeadlineDeciderSelectionReason" expires_after="2027-02-14">
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    Records the reason why a specific frame deadline was selected by
    viz::FrameDeadlineDecider. Recorded every time a frame is drawn and swapped.
  </summary>
</histogram>

<histogram name="Viz.FrameIntervalDecider.ActualIntervalDefault" units="ms"
    expires_after="2027-08-02">
  <owner>boliu@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Record the actual frame rate when FrameIntervalDecider decides system should
    use its default behavior. Useful as reference histogram for
    ActualIntervalForXXhz histograms, to see the effect of FrameIntervalDecider
    deciding on a particular frame rate. Note however it's not a perfect
    reference since the conditions leading to use system default is not
    independent from conditions leading a particular frame rate being selected.
    Recorded every viz frame, sub-sampled with probability 0.001. Note this
    requires FrameIntervalDecider to be enabled as well as using an
    ExternalBeginFrameSource.
  </summary>
</histogram>

<histogram name="Viz.FrameIntervalDecider.ActualIntervalFor{DecidedHz}hz"
    units="ms" expires_after="2027-08-02">
  <owner>boliu@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    For a few common result intervals (named in hz), record the distribution of
    actual frame intervals. Recorded every viz frame, sub-sampled with
    probability 0.001. Note this requires FrameIntervalDecider to be enabled as
    well as using an ExternalBeginFrameSource.
  </summary>
  <token key="DecidedHz">
    <variant name="20" summary="20hz"/>
    <variant name="24" summary="24hz"/>
    <variant name="25" summary="25hz"/>
    <variant name="30" summary="30hz"/>
  </token>
</histogram>

<histogram name="Viz.FrameIntervalDecider.ResultMatcherType"
    enum="FrameIntervalMatcherType" expires_after="2026-11-29">
  <owner>boliu@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Frame interval matcher type matched current frame. Recorded every viz frame,
    sub-sampled with probability 0.001.
  </summary>
</histogram>

<histogram name="Viz.FrameIntervalDecider.ResultTimeDelta" units="ms"
    expires_after="2027-02-07">
  <owner>boliu@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Frame interval decider result interval. Recorded every viz frame but only if
    the result variant is an interval time delta, sub-sampled with probability
    0.001.
  </summary>
</histogram>

<histogram name="Viz.FrameSink.GpuBusyDuration" units="microseconds"
    expires_after="2024-10-20">
  <owner>sashamcintosh@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>
    The time that a begin frame is throttled due to max pending swaps. Recorded
    when draw and swap executes (only when a frame is throttled). Refer to
    BeginFrameSource::SetIsGpuBusy for details.

    Warning: This metric does not include reports from clients with
    low-resolution clocks.
  </summary>
</histogram>

<histogram name="Viz.FrameSinkVideoCapturer.CaptureDuration" units="ms"
    expires_after="2027-06-30">
  <owner>jophba@chromium.org</owner>
  <owner>media-capture-dev@chromium.org</owner>
  <summary>
    The time it took from when FrameSinkVideoCapturerImpl sent a request for
    frame capture until the result becomes available to the capturer.

    Format-agnostic version of
    `Viz.FrameSinkVideoCapturer.[NV12/I420].CaptureDuration` histograms.

    Warning: this histogram was expired from 2023-07-15 to 2026-06-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Viz.FrameSinkVideoCapturer.CaptureSucceeded"
    enum="BooleanSuccess" expires_after="2027-06-30">
  <owner>jophba@chromium.org</owner>
  <owner>media-capture-dev@chromium.org</owner>
  <summary>
    Whether a capture initiated by FrameSinkVideoCapturerImpl succeeded.

    Format-agnostic version of
    `Viz.FrameSinkVideoCapturer.[NV12/I420].CaptureSucceeded` histograms.

    Warning: this histogram was expired from 2023-07-15 to 2026-06-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Viz.FrameSinkVideoCapturer.FrameResurrected" enum="Boolean"
    expires_after="2027-06-30">
  <owner>jophba@chromium.org</owner>
  <owner>media-capture-dev@chromium.org</owner>
  <summary>
    True if the capturer has used a resurrected video frame, thus avoiding
    having to reserve it from a frame pool, false otherwise.

    Warning: this histogram was expired from 2023-07-15 to 2026-06-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Viz.FrameSinkVideoCapturer.I420.CaptureDuration" units="ms"
    expires_after="2027-06-30">
  <owner>jophba@chromium.org</owner>
  <owner>media-capture-dev@chromium.org</owner>
  <summary>
    The time it took from when FrameSinkVideoCapturerImpl sent a request for an
    I420 readback until the result comes back and ReadI420Planes successfully
    finishes.

    Warning: this histogram was expired from 2021-03-07 to 2022-03-10; data may
    be missing.

    Warning: this histogram was expired from 2024-09-29 to 2026-06-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Viz.FrameSinkVideoCapturer.I420.CaptureSucceeded"
    enum="BooleanSuccess" expires_after="2027-06-30">
  <owner>jophba@chromium.org</owner>
  <owner>media-capture-dev@chromium.org</owner>
  <summary>
    Whether an I420 readback initiated by FrameSinkVideoCapturerImpl succeeded.

    Warning: this histogram was expired from 2020-12-31 to 2022-03-10; data may
    be missing.

    Warning: this histogram was expired from 2025-05-26 to 2026-06-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Viz.FrameSinkVideoCapturer.I420.TotalDuration" units="ms"
    expires_after="2027-06-30">
  <owner>jophba@chromium.org</owner>
  <owner>media-capture-dev@chromium.org</owner>
  <summary>
    The time it took from when FrameSinkVideoCapturerImpl decided that a new
    I420 frame needs to be produced to the moment when it was ready to deliver
    it. This encompasses the `Viz.FrameSinkVideoCapturer.I420.CaptureDuration`
    time, but also includes time taken to render video capture overlays.

    Warning: this histogram was expired from 2024-09-29 to 2026-06-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Viz.FrameSinkVideoCapturer.NV12.CaptureDuration" units="ms"
    expires_after="2027-06-30">
  <owner>jophba@chromium.org</owner>
  <owner>media-capture-dev@chromium.org</owner>
  <summary>
    The time it took from when FrameSinkVideoCapturerImpl sent a request for an
    NV12 copy until the result comes back.

    Note: The histogram logging was adjusted in M102 to align with how
    `Viz.FrameSinkVideoCapturer.[RGBA/I420].CaptureDuration` histograms behave.
    After the change, this histogram also started including the time taken to
    set the color space on a video frame.

    Warning: this histogram was expired from 2023-07-15 to 2026-06-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Viz.FrameSinkVideoCapturer.NV12.CaptureSucceeded"
    enum="BooleanSuccess" expires_after="2027-06-30">
  <owner>jophba@chromium.org</owner>
  <owner>media-capture-dev@chromium.org</owner>
  <summary>
    Whether an NV12 capture initiated by FrameSinkVideoCapturerImpl succeeded.

    Warning: this histogram was expired from 2023-07-15 to 2026-06-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Viz.FrameSinkVideoCapturer.NV12.TotalDuration" units="ms"
    expires_after="2027-06-30">
  <owner>jophba@chromium.org</owner>
  <owner>media-capture-dev@chromium.org</owner>
  <summary>
    The time it took from when FrameSinkVideoCapturerImpl decided that a new
    NV12 frame needs to be produced to the moment when it was ready to deliver
    it. This encompasses the `Viz.FrameSinkVideoCapturer.NV12.CaptureDuration`
    time.

    Warning: this histogram was expired from 2023-07-15 to 2026-06-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Viz.FrameSinkVideoCapturer.RGBA.CaptureDuration" units="ms"
    expires_after="2023-07-15">
  <owner>jonross@chromium.org</owner>
  <owner>viz-team-wat@google.com</owner>
  <summary>
    The time it took from when FrameSinkVideoCapturerImpl sent a request for an
    RGBA readback until the result comes back and ReadRGBAPlane successfully
    finishes.
  </summary>
</histogram>

<histogram name="Viz.FrameSinkVideoCapturer.TotalDuration" units="ms"
    expires_after="2023-07-15">
  <owner>jophba@chromium.org</owner>
  <owner>media-capture-dev@chromium.org</owner>
  <summary>
    The time it took from when FrameSinkVideoCapturerImpl decided that a new
    frame needs to be produced to the moment when it was ready to deliver it.
    This encompasses the `Viz.FrameSinkVideoCapturer.CaptureDuration` time, but
    also includes time taken to render video capture overlays.

    Format-agnostic version of
    `Viz.FrameSinkVideoCapturer.[NV12/I420].TotalDuration` histograms.
  </summary>
</histogram>

</histograms>

</histogram-configuration>
