<!--
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 Compositing 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="AccumulatedSequences">
  <variant name="AllAnimations"
      summary="its animations (e.g. comositor-driven animations, main-thread
               driven animations, and raf-driven animations, etc.)"/>
  <variant name="AllInteractions"
      summary="its supported combinations of interaction types (e.g.
               scrolling, pinching, etc.) and input device types (e.g.
               touchscreen, touchpad, mousewheel, etc.)"/>
</variants>

<variants name="CheckerboardingVersion">
  <variant name="3"
      summary="A frame is counted as checkerboarded if any visible tile is
               not fully rastered."/>
  <variant name="4"
      summary="A frame is counted as checkerboarded if any visible tile is
               not fully rastered or recorded."/>
</variants>

<variants name="DrawQuadMaterial">
  <variant name="AggregatedRenderPass"/>
  <variant name="TextureContent"/>
  <variant name="TiledContent"/>
</variants>

<variants name="SmoothnessSequence">
  <variant name="CanvasAnimation" summary="canvas animations"/>
  <variant name="CompositorAnimation"
      summary="compositor thread driven animations"/>
  <variant name="JSAnimation" summary="JS driven animations"/>
  <variant name="MainThreadAnimation" summary="main thread driven animations"/>
  <variant name="NativePropertyAnimation"
      summary="compositor thread native animations"/>
  <variant name="PinchZoom" summary="pinch to zoom interctions"/>
  <variant name="RAF" summary="raf driven animations"/>
  <variant name="RasterAnimation"
      summary="compositor thread rasterized animations"/>
  <variant name="ScrollbarScroll" summary="scrollbar scrolling"/>
  <variant name="SETCompositorAnimation"
      summary="compositor animations during a view transition"/>
  <variant name="SETMainThreadAnimation"
      summary="main thread animations during a view transition"/>
  <variant name="TouchScroll" summary="touch scrolling"/>
  <variant name="Video" summary="video playback"/>
  <variant name="WheelScroll" summary="wheel scrolling"/>
</variants>

<variants name="SmoothnessThread">
  <variant name="CompositorThread."/>
  <variant name="MainThread."/>
  <variant name="RasterThread."/>
</variants>

<variants name="TileManagerProcessType">
  <variant name="Browser"/>
  <variant name="Renderer"/>
</variants>

<histogram name="Compositing.Animation.MissingPropertyNodeForElementId"
    enum="PropertyMutation" expires_after="2026-01-31">
  <owner>kevers@chromium.org</owner>
  <owner>animations-dev@chromium.org</owner>
  <summary>
    Tally failures resulting from missing a map entry from element id to
    property node.
  </summary>
</histogram>

<histogram name="Compositing.BeginMainFrame.BMFReason10{FrameType}{Suffix}"
    units="reasons" expires_after="2027-06-30">
  <owner>thiabaud@google.com</owner>
  <owner>jonross@chromium.org</owner>
  <summary>
    Records the reason(s) for which we triggered a BeginMainFrame{FrameType}.
    Recorded when the BeginMainFrame is run{Suffix}. The value recorded is a
    bitset of the enum |BeginMainFrameReason|, with all the reasons the current
    BeginMainFrame was triggered.
  </summary>
  <token key="FrameType">
    <variant name="" summary=""/>
    <variant name=".Embedded" summary="for an embedded frame"/>
    <variant name=".NonEmbedded" summary="for a non-embedded frame"/>
  </token>
  <token key="Suffix">
    <variant name="" summary=""/>
    <variant name=".NoUpdate" summary=", and finished with no updates"/>
  </token>
</histogram>

<histogram name="Compositing.BeginMainFrame.MainResult"
    enum="BeginMainFrameMainResult" expires_after="2027-01-03">
  <owner>lizeb@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <summary>
    Records the outcome of BeginMainFrame, at a subsampled rate. This is
    intended to understand the fraction of main frame updates that are aborted.
  </summary>
</histogram>

<histogram name="Compositing.BeginMainFrame.TimeUs" units="microseconds"
    expires_after="2027-01-03">
  <owner>lizeb@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the duration of BeginMainFrame, at a subsampled rate. This is
    intended to understand the cost of a BeginMainFrame on the critical path.
    Only reported for platforms supporting high resolution clocks.
  </summary>
</histogram>

<histogram name="Compositing.BeginMainFrame.TimeUs.NoUpdate"
    units="microseconds" expires_after="2027-01-03">
  <owner>lizeb@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the duration of BeginMainFrame, at a subsampled rate. This is
    intended to understand the cost of a BeginMainFrame on the critical path.
    This version is recorded if the result was FinishedNoUpdates. Only reported
    for platforms supporting high resolution clocks.
  </summary>
</histogram>

<histogram name="Compositing.Browser.BeginFrame.Produced.Duration.Subsampled"
    units="microseconds" expires_after="2027-01-17">
  <owner>acondor@chromium.org</owner>
  <owner>clank-performance-team@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the duration of LayerTreeImpl::BeginFrame on cc/slim, when the frame
    is produced. Subsampled to 1/100.

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

<histogram name="Compositing.Browser.LayersUpdateTime" units="microseconds"
    expires_after="2027-01-31">
  <owner>pdr@chromium.org</owner>
  <owner>animations-dev@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time spent updating layers, in microseconds. Recorded when layers are
    updated (in a browser process).

    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. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
</histogram>

<histogram name="Compositing.BufferQueue.TimeUntilBuffersRecreatedMs"
    units="ms" expires_after="2027-07-12">
  <owner>jonross@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The time since a BufferQueue's buffers were destroyed until they were
    recreated. If this time is commonly very small, that is a problem. Recorded
    when the buffer recreates buffers that were previously destroyed. For a
    single BufferQueue this should be once per frame at worst.
  </summary>
</histogram>

<histogram name="Compositing.DecodeLCPCandidateImage.{DecodeMethod}"
    enum="Boolean" expires_after="2027-02-07">
  <owner>mmocny@chromium.org</owner>
  <owner>paint-dev@chromium.org</owner>
  <summary>
    Reports whether an image decode was for an image that might be used as the
    Largest Contentful Image, and then whether a missing tile at raster time
    includes such an image. The goal is to get an approximate idea of how many
    LCP candidate images miss their frame deadline, and hence how often we may
    report LCP too soon.

    Recorded on every {DecodeMethod}

    Note: this metric was expired from 2023-01-31 to 2023-12-20.
  </summary>
  <token key="DecodeMethod">
    <variant name="Hardware" summary="hardware image decode task completion."/>
    <variant name="MissedDeadline"
        summary="call to PrepareTiles() in which there was a missing tile.
                 True if any missing tile contains an LCP candidate decode
                 that has not completed."/>
    <variant name="Software" summary="software image decode task completion."/>
  </token>
</histogram>

<histogram name="Compositing.DirectRenderer.DrawnRectAssignmentType"
    enum="RenderPassDrawRectAssign" expires_after="2025-09-07">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Records update type to the drawn rect for every draw to each non root
    renderpass.
  </summary>
</histogram>

<histogram name="Compositing.DirectRenderer.OverlayProcessingUs"
    units="microseconds" expires_after="2027-01-24">
  <owner>khaslett@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time spent processing quads to see which can be replaced with overlays. This
    is logged once per frame, when a frame should be drawn. Only reported for
    platforms supporting high resolution clocks.
  </summary>
</histogram>

<histogram name="Compositing.DirectRenderer.PartialSwap.ExtraDamage" units="%"
    expires_after="2026-08-30">
  <owner>vasilyt@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The area of the display damage that was added to current frame damage after
    all adjustments, including FrameBufferDamage from buffer queue and render
    pass filters.

    This metric is reported once per frame only on platforms/devices that
    support partial swap and does not include &quot;empty swap&quot; (no frame
    damage) case

    Note: this metric was expired from 2022-10-16 to 2023-06-09 and 2024-03-16
    to 2025-06-24.
  </summary>
</histogram>

<histogram name="Compositing.DirectRenderer.PartialSwap.FrameBufferDamage"
    units="%" expires_after="2024-03-16">
  <owner>vasilyt@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The area of the display that was damaged since previous draw to this frame
    buffer.

    This metric is reported once per frame only on platforms/devices that
    support partial swap and does not include &quot;empty swap&quot; (no frame
    damage) case.

    Note: this metric was expired from 2022-10-23 to 2023-06-09.
  </summary>
</histogram>

<histogram name="Compositing.DirectRenderer.PartialSwap.RootDamage" units="%"
    expires_after="2027-01-17">
  <owner>vasilyt@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The area of the display that was damaged in current frame.

    This metric is reported only on platforms/devices that support partial swap
    and does not include &quot;empty swap&quot; (no frame damage) case.
  </summary>
</histogram>

<histogram name="Compositing.DirectRenderer.PartialSwap.TotalDamage" units="%"
    expires_after="2027-01-03">
  <owner>vasilyt@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The total area of the display that will be redrawn this frame.

    This metric is reported only on platforms/devices that support partial swap
    and does not include &quot;empty swap&quot; (no frame damage) case

    Note: this metric was expired from 2023-04-30 to 2023-06-09.
  </summary>
</histogram>

<histogram name="Compositing.DirectRenderer.RenderPassDrawnRectMatch"
    enum="Boolean" expires_after="2027-01-03">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Whether a render pass drawn rect matches the expected output rect. Record
    for each non-root render pass every time it is drawn.
  </summary>
</histogram>

<histogram name="Compositing.DirectRenderer.{FocusType}" units="pixels"
    expires_after="2027-02-07">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Record every frame the sum of all rendered pixels from all render passes.
    The buckets are {FocusType}
  </summary>
  <token key="FocusType">
    <variant name="TotalPixelsRendered" summary="Full Linear view of count."/>
    <variant name="TotalPixelsRenderedNarrow"
        summary="Narrowed bucket sampling selected based on common screen
                 resolutions"/>
  </token>
</histogram>

<histogram name="Compositing.Display.Draw.AverageOverdraw2" units="units"
    expires_after="2026-12-27">
  <owner>zoraiznaeem@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The average overdraw of the aggregated compositor frame. It is logged once
    per frame. Overdraw is expected to range is [1.0, 12.0]. An overdraw of 2.0
    means that on average each pixel of the display is drawn twice. Note: The
    overdraw value is logged as `overdraw * 100,000`.
  </summary>
</histogram>

<histogram name="Compositing.Display.Draw.Occlusion.Calculation.Time"
    units="microseconds" expires_after="2027-02-07">
  <owner>yiyix@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time spent to remove invisible quads from the quad_list in CompositorFrame.

    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. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
</histogram>

<histogram name="Compositing.Display.Draw.Quads" units="quads"
    expires_after="2027-01-17">
  <owner>vmiura@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    This is logged once per frame, when the frame is drawn. The total number of
    quads in all render passes in the CompositorFrame that is produced by
    surface aggregation. Histogram was previously expired from 2019-06 to
    2024-03.
  </summary>
</histogram>

<histogram name="Compositing.Display.DrawToScheduleOverlay"
    units="microseconds" expires_after="2027-02-07">
  <owner>lehoangquyen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This is logged once per frame, if the output surface provides timing
    information and overlays are used. It measures the time from the display
    compositor starting a draw on the Viz Compositor thread to when the GPU
    thread starts scheduling overlays. Only reported for platforms supporting
    high resolution clocks.
  </summary>
</histogram>

<histogram name="Compositing.Display.DrawToSwapUs" units="microseconds"
    expires_after="2027-01-31">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This is logged once per frame, if the output surface provides timing
    information. It measures the time from the display compositor starting a
    draw on the Viz Compositor thread to issuing all related draw calls to the
    driver on the Gpu Main thread. Only reported for platforms supporting high
    resolution clocks.
  </summary>
</histogram>

<histogram name="Compositing.Display.DrawToVizScheduledDraw"
    units="microseconds" expires_after="2027-02-14">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This is logged once per frame, if the output surface provides timing
    information. It measures the time from the display compositor starting a
    draw on the Viz Compositor thread to when the Viz thread scheduled work to
    the GPU thread. Only reported for platforms supporting high resolution
    clocks.
  </summary>
</histogram>

<histogram name="Compositing.Display.FlattenedRenderPassCount" units="units"
    expires_after="2027-01-24">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    This is logged once per frame. It is the number of renderer passes after
    flattening all possible render passes. If the value is more than one, then
    an intermediate rendering target must be used during the rendering of the
    frame for each render pass greater than one.
  </summary>
</histogram>

<histogram name="Compositing.Display.GpuStartedDrawToScheduleOverlayUs"
    units="microseconds" expires_after="2027-08-01">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This is logged once per frame, if the output surface provides timing
    information and overlays are used. It measures the time between the GPU
    thread starting a draw and the GPU thread starting scheduling overlays. Only
    reported for platforms supporting high resolution clocks.
  </summary>
</histogram>

<histogram name="Compositing.Display.OverlayProcessorOzone.MaxPlanesSupported"
    units="units" expires_after="2027-02-07">
  <owner>harthuang@google.com</owner>
  <owner>fangzhoug@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <owner>chromeos-gfx-compositor@chromium.org</owner>
  <summary>
    This is logged every time a valid HardwareCapabilites is received DRM thread
    when display configuration may have changed. It records the number of
    overlay planes we have available on this device including the primary plane.
    Note: this metric was expired and removed on 2024-06-17 and re-enabled on
    2025-01-09.
  </summary>
</histogram>

<histogram
    name="Compositing.Display.OverlayProcessorUsingStrategy.NumOverlays{Counted}V2"
    units="overlay candidates" expires_after="2027-08-17">
  <owner>zoraiznaeem@chromium.org</owner>
  <owner>chromeos-gfx-compositor@chromium.org</owner>
  <summary>
    Logged once per frame during display composition. Records the number of
    overlay candidates {Counted}.

    Hardware overlays allow surfaces (such as videos, web contents, or UI
    elements) to be sent directly to dedicated display controller hardware
    planes for scanout, bypassing GPU compositing.

    During frame processing, the display compositor evaluates potential visual
    elements (candidates) to determine if they can be promoted to hardware
    overlays using either single-overlay or multi-overlay strategies, testing
    them against hardware display controller capabilities.

    Note: These metrics are used in ChromeOS for performance tracking and in
    Tast tests.
  </summary>
  <token key="Counted">
    <variant name="Attempted"
        summary="Number of overlay candidates evaluated or submitted for
                 hardware capability testing."/>
    <variant name="Failed"
        summary="Number of evaluated overlay candidates that could not be
                 promoted (e.g., due to unsupported scaling/transforms, pixel
                 formats, clipping/occlusion, or lack of available hardware
                 display planes)."/>
    <variant name="Promoted"
        summary="Number of overlay candidates successfully promoted to
                 hardware overlay planes for direct scanout in the current
                 frame."/>
  </token>
</histogram>

<histogram name="Compositing.Display.ScheduleOverlayToSwapStart"
    units="microseconds" expires_after="2027-04-08">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This is logged once per frame, if the output surface provides timing
    information. It measures the time between the GPU main thread initiating
    overlay scheduling and the start of all related draw call issuances to the
    driver. Only reported for clients with high-resolution clocks.
  </summary>
</histogram>

<histogram name="Compositing.Display.SwapStartToSwapEnd" units="microseconds"
    expires_after="2027-04-08">
  <owner>magchen@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This is logged once per frame, if the output surface provides timing
    information. It measures the time between the GPU main thread initiating
    draw call issuances to the driver and their final completion. Only reported
    for clients with high-resolution clocks.
  </summary>
</histogram>

<histogram name="Compositing.Display.VizDependencyResolvedToGpuStartedDrawUs"
    units="microseconds" expires_after="2027-01-07">
  <owner>vasilyt@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This is logged once per frame, if the output surface provides timing
    information. It measures delta between the time when display compositor draw
    task's dependencies have been solved and the time when the Gpu Thread
    started processing it. Only reported for platforms supporting high
    resolution clocks. Note: this metric was expired from 2022-12-18 to
    2023-11-17 and 2024-10-20 to 2025-01-07.
  </summary>
</histogram>

<histogram name="Compositing.Display.VizScheduledDrawToDependencyResolvedUs"
    units="microseconds" expires_after="2027-01-17">
  <owner>vasilyt@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This is logged once per frame if the output surface provides timing
    information. It measures delta between the time when display compositor
    scheduled first draw task for the current frame on Viz Compositor thread and
    the time when the task's dependencies have been resolved and the task is
    ready for the Gpu Thread to start processing it. Recorded when swap
    completes. Only reported for platforms supporting high resolution clocks.
    Note: this metric was expired from 2023-08-27 to 2023-11-17.
  </summary>
</histogram>

<histogram name="Compositing.Display.VizScheduledDrawToGpuStartedDrawUs"
    units="microseconds" expires_after="2027-01-17">
  <owner>vasilyt@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This is logged once per frame if the output surface provides timing
    information. It measures delta between the time when display compositor
    scheduled first draw task for the current frame on Viz Compositor thread and
    the time when Gpu Thread started processing it. Recorded when swap
    completes. Only reported for platforms supporting high resolution clocks.
    Note: this metric was expired from 2022-12-18 to 2023-11-17.
  </summary>
</histogram>

<histogram name="Compositing.Renderer.CALayerResult" enum="CALayerResult"
    expires_after="2026-12-27">
  <owner>ccameron@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The outcome of attempting to replace all renderer tiles with CALayers.
    Either success, or the first reason why a DrawQuad couldn't be replaced by a
    CALayer.
  </summary>
</histogram>

<histogram name="Compositing.Renderer.LayersUpdateTime" units="microseconds"
    expires_after="2026-10-11">
  <owner>pdr@chromium.org</owner>
  <owner>paint-dev@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time spent updating layers, in microseconds. Recorded when layers are
    updated (in a renderer process).

    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. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
</histogram>

<histogram
    name="Compositing.Renderer.PauseRenderingUntilVisibilityChangeTimeout"
    enum="Boolean" expires_after="2027-01-01">
  <owner>vmpstr@chromium.org</owner>
  <owner>rendering-core-dev@chromium.org</owner>
  <summary>
    Reported when the safety-valve timer fires after pause rendering until
    visibility change times out. This indicates that the expected visibility
    change never occurred and rendering was unpaused by the safety valve.
  </summary>
</histogram>

<histogram name="Compositing.ResourcePool.PeakMemoryUsage" units="MB"
    expires_after="2027-05-08">
  <owner>lizeb@chromium.org</owner>
  <owner>chrome-gpu-memory@google.com</owner>
  <summary>
    The maximum memory usage of the ResourcePool during its lifetime. Recorded
    when the ResourcePool is destroyed.
  </summary>
</histogram>

<histogram name="Compositing.ResourcePool.PeakMemoryUsage.NonZero" units="MB"
    expires_after="2027-05-08">
  <owner>lizeb@chromium.org</owner>
  <owner>chrome-gpu-memory@google.com</owner>
  <summary>
    The maximum memory usage of the ResourcePool during its lifetime, reported
    only when it is not 0. Recorded when the ResourcePool is destroyed.
  </summary>
</histogram>

<histogram name="Compositing.ResourcePool.PeakResourceCount" units="resources"
    expires_after="2027-05-08">
  <owner>lizeb@chromium.org</owner>
  <owner>chrome-gpu-memory@google.com</owner>
  <summary>
    The maximum number of resources in the ResourcePool during its lifetime.
    Recorded when the ResourcePool is destroyed.
  </summary>
</histogram>

<histogram name="Compositing.Scheduler.DeadlineMode"
    enum="BeginImplFrameDeadlineMode" expires_after="2026-12-06">
  <owner>lizeb@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <summary>
    Report the scheduler deadline mode when it changes, which may be multiple
    times (but at least once per frame). This histogram is subsampled.
  </summary>
</histogram>

<histogram name="Compositing.Scheduler.HighFramerateRequested" enum="Boolean"
    expires_after="2026-05-31">
  <owner>lizeb@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <summary>
    Report whether a compositor frame is run in a context where high framerate
    is requested. This is intended to assess the fraction of cases where this is
    hit, and also to diagnose over-triggering, since this is expected to be a
    relatively niche use case. Recorded when a compositor frame is started, at a
    subsampled rate.
  </summary>
</histogram>

<histogram name="Compositing.SkiaRenderer.{DrawQuadMaterial}.SrcRectConstraint"
    enum="SrcRectConstraintUMA" expires_after="2027-02-14">
  <owner>hitawala@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Reports how the edges of a DrawQuad's source rect are sampled over
    SkiaRenderer. This is done on a per DrawQuad basis and recorded through
    SrcRectConstraintUMA which corresponds to SkCanvas::SrcRectConstraint.
    Recorded at a subsampled rate (1/100) for Tile, Texture or
    AggregatedRenderPass DrawQuads per frame.
  </summary>
  <token key="DrawQuadMaterial" variants="DrawQuadMaterial"/>
</histogram>

<histogram name="Compositing.Slim.BeginFrameResult" enum="SlimBeginFrameResult"
    expires_after="2027-01-17">
  <owner>acondor@chromium.org</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    Records the outcome of a LayerTreeImpl::BeginFrame call in cc/slim. This is
    used to compare the number of times a frame is produced versus the number of
    times the call exits early because no draw was needed. Recorded every 100th
    call.
  </summary>
</histogram>

<histogram name="Compositing.SurfaceAggregator.AggregateUs"
    units="microseconds" expires_after="2027-02-07">
  <owner>kylechar@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time spent aggregating compositor frames from different surfaces in
    microseconds. This is logged once per frame.

    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. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
</histogram>

<histogram name="Compositing.SurfaceAggregator.ExcessPixelsClipped"
    units="pixels" expires_after="2025-06-08">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Record the number of excess pixels for the output rect that would not be
    visible due to the parent root clip. This is logged once per frame.
  </summary>
</histogram>

<histogram name="Compositing.SurfaceAggregator.RenderPassDamageType"
    enum="RenderPassDamage" expires_after="2025-09-07">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Record the damage type for an aggregate render pass based on clipping by the
    root. This is logged once per frame.
  </summary>
</histogram>

<histogram name="Compositing.TileManager.EnoughMemory.{ProcessType}"
    enum="Boolean" expires_after="2027-01-24">
  <owner>lizeb@chromium.org</owner>
  <owner>chrome-gpu-memory@google.com</owner>
  <summary>
    When memory is assigned to tiles, whether there was enough memory for all
    required tiles. This is collected when assigning memory for {ProcessType}
    process only.
  </summary>
  <token key="ProcessType" variants="TileManagerProcessType"/>
</histogram>

<histogram
    name="Compositing.TileManager.LimitWhenNotEnoughMemory.{ProcessType}"
    units="MB" expires_after="2027-01-03">
  <owner>lizeb@chromium.org</owner>
  <owner>chrome-gpu-memory@google.com</owner>
  <summary>
    When memory is assigned to tiles and there is not enough memory, the memory
    limit that the tile assignment was breaching. This is collected when
    assigning memory for {ProcessType} process only.
  </summary>
  <token key="ProcessType" variants="TileManagerProcessType"/>
</histogram>

<histogram
    name="Compositing.TileManager.MemoryUsageWhenEnoughMemory.{ProcessType}"
    units="MB" expires_after="2027-01-17">
  <owner>lizeb@chromium.org</owner>
  <owner>chrome-gpu-memory@google.com</owner>
  <summary>
    When memory is assigned to tiles, whether it succeeded or not, the current
    total memory usage in MB. This is collected when assigning memory for
    {ProcessType} process only.
  </summary>
  <token key="ProcessType" variants="TileManagerProcessType"/>
</histogram>

<histogram name="Compositing.TileManager.RasterTasksDuration"
    units="microseconds" expires_after="2026-12-27">
  <owner>lizeb@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Total duration (in us) for all raster tasks to execute. Recorded when raster
    tasks are scheduled, at a downsampled rate. Only reported for platforms
    supporting high resolution clocks.
  </summary>
</histogram>

<histogram name="Compositing.{Process}.CompositorFrame.Quads" units="quads"
    expires_after="2027-02-07">
  <owner>vmiura@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    The total number of quads in all render passes in a CompositorFrame. This is
    logged as the CompositorFrame is submitted to its surface. Histogram was
    previously expired from 2019-06 to 2024-03.
  </summary>
  <token key="Process">
    <variant name="Browser"/>
    <variant name="Renderer"/>
  </token>
</histogram>

<histogram name="CompositorLatency.IpcThread.{LatencyType}"
    units="microseconds" expires_after="2027-02-07">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Reports the overhead of IPC's and thread hops during the production of a
    single frame. Measures {LatencyType}

    This is reported by the Renderer, at a subsampled rate of effectively once
    per 1000 frames. Non-Renderer clients do not report this. This metric drops
    reports on low-resolution clocks, which will bias the Windows population.
  </summary>
  <token key="LatencyType">
    <variant name="BeginMainFrameQueuing"
        summary="the time from when the Compositor thread posts
                 BeginMainFrame to when the task actually begins on the Main
                 thread. This is a subset of
                 CompositorLatency.*.SendBeginMainFrameToCommit."/>
    <variant name="DispatchToRenderer"
        summary="the time from when Viz dispatched the BeginFrameArgs to when
                 it is received by the client."/>
    <variant name="FrameTimeToDispatch"
        summary="the time from the targeted frame start time to when Viz
                 dispatches it to the client."/>
    <variant name="ImplThreadTotalLatency"
        summary="the total latency overhead for Compositor-only frames. Which
                 excludes BeginMainFrameQueuing."/>
    <variant name="MainThreadTotalLatency"
        summary="the total latency overhead for frames which had Main-thread
                 work."/>
  </token>
</histogram>

<histogram name="CompositorLatency2{InteractionType}.{StageType}"
    units="microseconds" expires_after="2027-01-10">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Tracks the duration of various stages in the pipeline as a single frame goes
    through the various stages in the compositor.

    This metric uses base::Histogram::FactoryMicrosecondsTimeGet so only users
    with high resolution clocks will report this metric.
  </summary>
  <token key="InteractionType">
    <variant name=""/>
    <variant name=".CanvasAnimation"/>
    <variant name=".CompositorAnimation"/>
    <variant name=".JSAnimation"/>
    <variant name=".MainThreadAnimation"/>
    <variant name=".NativePropertyAnimation"/>
    <variant name=".PinchZoom"/>
    <variant name=".RAF"/>
    <variant name=".RasterAnimation"/>
    <variant name=".ScrollbarScroll"/>
    <variant name=".SETCompositorAnimation"/>
    <variant name=".SETMainThreadAnimation"/>
    <variant name=".TouchScroll"/>
    <variant name=".WheelScroll"/>
  </token>
  <token key="StageType">
    <variant name="Activation"/>
    <variant name="BeginImplFrameToSendBeginMainFrame"/>
    <variant name="Commit"/>
    <variant name="EndActivateToSubmitCompositorFrame"/>
    <variant name="EndActivateToSubmitUpdateDisplayTree"/>
    <variant
        name="EndActivateToSubmitUpdateDisplayTree.DrawLayersToSubmitUpdateDisplayTree"/>
    <variant
        name="EndActivateToSubmitUpdateDisplayTree.EndActivateToDrawLayers"/>
    <variant name="EndCommitToActivation"/>
    <variant name="SendBeginMainFrameToCommit"/>
    <variant name="SendBeginMainFrameToCommit.AccessibiltyUpdate"/>
    <variant name="SendBeginMainFrameToCommit.Animate"/>
    <variant name="SendBeginMainFrameToCommit.BeginMainSentToStarted"/>
    <variant name="SendBeginMainFrameToCommit.CompositeCommit"/>
    <variant name="SendBeginMainFrameToCommit.CompositingInputs"/>
    <variant name="SendBeginMainFrameToCommit.HandleInputEvents"/>
    <variant name="SendBeginMainFrameToCommit.LayoutUpdate"/>
    <variant name="SendBeginMainFrameToCommit.Paint"/>
    <variant name="SendBeginMainFrameToCommit.Prepaint"/>
    <variant name="SendBeginMainFrameToCommit.StyleUpdate"/>
    <variant name="SendBeginMainFrameToCommit.UpdateLayers"/>
    <variant name="SubmitCompositorFrameToPresentationCompositorFrame"/>
    <variant
        name="SubmitCompositorFrameToPresentationCompositorFrame.BufferAvailableToBufferReady"/>
    <variant
        name="SubmitCompositorFrameToPresentationCompositorFrame.BufferReadyToLatch"/>
    <variant
        name="SubmitCompositorFrameToPresentationCompositorFrame.LatchToSwapEnd"/>
    <variant
        name="SubmitCompositorFrameToPresentationCompositorFrame.ReceivedCompositorFrameToStartDraw"/>
    <variant
        name="SubmitCompositorFrameToPresentationCompositorFrame.StartDrawToSwapStart"/>
    <variant
        name="SubmitCompositorFrameToPresentationCompositorFrame.SubmitToReceiveCompositorFrame"/>
    <variant
        name="SubmitCompositorFrameToPresentationCompositorFrame.SwapEndToPresentationCompositorFrame"/>
    <variant
        name="SubmitCompositorFrameToPresentationCompositorFrame.SwapStartToBufferAvailable"/>
    <variant
        name="SubmitCompositorFrameToPresentationCompositorFrame.SwapStartToSwapEnd"/>
    <variant name="SubmitUpdateDisplayTreeToPresentationCompositorFrame"/>
    <variant
        name="SubmitUpdateDisplayTreeToPresentationCompositorFrame.BufferAvailableToBufferReady"/>
    <variant
        name="SubmitUpdateDisplayTreeToPresentationCompositorFrame.BufferReadyToLatch"/>
    <variant
        name="SubmitUpdateDisplayTreeToPresentationCompositorFrame.LatchToSwapEnd"/>
    <variant
        name="SubmitUpdateDisplayTreeToPresentationCompositorFrame.ReceivedCompositorFrameToStartDraw"/>
    <variant
        name="SubmitUpdateDisplayTreeToPresentationCompositorFrame.ReceiveUpdateDisplayTreeToStartPrepareToDraw"/>
    <variant
        name="SubmitUpdateDisplayTreeToPresentationCompositorFrame.SendUpdateDisplayTreeToReceiveUpdateDisplayTree"/>
    <variant
        name="SubmitUpdateDisplayTreeToPresentationCompositorFrame.StartDrawLayersToSubmitCompositorFrame"/>
    <variant
        name="SubmitUpdateDisplayTreeToPresentationCompositorFrame.StartDrawToSwapStart"/>
    <variant
        name="SubmitUpdateDisplayTreeToPresentationCompositorFrame.StartPrepareToDrawToStartDrawLayers"/>
    <variant
        name="SubmitUpdateDisplayTreeToPresentationCompositorFrame.SubmitToReceiveCompositorFrame"/>
    <variant
        name="SubmitUpdateDisplayTreeToPresentationCompositorFrame.SwapEndToPresentationCompositorFrame"/>
    <variant
        name="SubmitUpdateDisplayTreeToPresentationCompositorFrame.SwapStartToBufferAvailable"/>
    <variant
        name="SubmitUpdateDisplayTreeToPresentationCompositorFrame.SwapStartToSwapEnd"/>
    <variant name="TotalLatency"/>
  </token>
</histogram>

<histogram name="Graphics.Paint.UI.NormalizedInvalidatedArea" units="%"
    expires_after="2027-04-26">
  <owner>zoraiznaeem@chromium.org</owner>
  <owner>cros-sw-perf@google.com</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Tracks the total invalidated area (i.e repainted area) per frame. It is
    normalized by a frame's output size.

    Frames with zero invalidated area are not reported in the histogram.

    The paint metric is only tracked for nat UI compositor, meaning that
    invalidated area of renderers are not taken into account.

    Note: the metric is logged as `invalidated_area * 100,000`.
  </summary>
</histogram>

<histogram name="Graphics.Smoothness.CheckerboardingNeedRaster4.AllSequences"
    units="%" expires_after="2027-01-03">
  <owner>wangxianzhu@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Tracks the percent of checkerboarded frames that contain any not fully
    rastered visible tiles, for a sequence by aggregating all its animations and
    interactions, where a sequence is a series of frames produced which contain
    at least one of the animations/interactions. Such animations and
    interactions encompass: Compositor-thread animations; Main-thread
    animations; JS animations; scrolling; and pinch-gestures.

    Checkerboarding is measured by tracking the number of times checkerboard
    frames are displayed (as opposed to the number of checkerboard frames
    produced), since the same checkerboard frame can be displayed more than
    once.

    Note that this metric is reported only when there are a sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until an additional sequence completes where there are (&gt;=
    100) frames available in total.
  </summary>
</histogram>

<histogram name="Graphics.Smoothness.CheckerboardingNeedRecord4.AllSequences"
    units="%" expires_after="2026-12-27">
  <owner>wangxianzhu@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Tracks the percent of checkerboarded frames that contain any not fully
    recorded visible tiles, for a sequence by aggregating all its animations and
    interactions, where a sequence is a series of frames produced which contain
    at least one of the animations/interactions. Such animations and
    interactions encompass: Compositor-thread animations; Main-thread
    animations; JS animations; scrolling; and pinch-gestures.

    Checkerboarding is measured by tracking the number of times checkerboard
    frames are displayed (as opposed to the number of checkerboard frames
    produced), since the same checkerboard frame can be displayed more than
    once.

    Note that this metric is reported only when there are a sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until an additional sequence completes where there are (&gt;=
    100) frames available in total.
  </summary>
</histogram>

<histogram name="Graphics.Smoothness.Checkerboarding{Version}.AllSequences"
    units="%" expires_after="2027-02-07">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Tracks the percent of checkerboarded frames for a sequence by aggregating
    all its animations and interactions, where a sequence is a series of frames
    produced which contain at least one of the animations/interactions. Such
    animations and interactions encompass: Compositor-thread animations;
    Main-thread animations; JS animations; scrolling; and pinch-gestures.

    Checkerboarding is measured by tracking the number of times checkerboard
    frames are displayed (as opposed to the number of checkerboard frames
    produced), since the same checkerboard frame can be displayed more than
    once.

    Note that this metric is reported only when there are a sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until an additional sequence completes where there are (&gt;=
    100) frames available in total.
  </summary>
  <token key="Version" variants="CheckerboardingVersion"/>
</histogram>

<histogram name="Graphics.Smoothness.Checkerboarding{Version}.{Sequence}"
    units="%" expires_after="2027-01-03">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Tracks the percent of checkerboarded frames for a sequence by aggregating
    all {Sequence}, where a sequence is a series of frames produced which
    contain at least one of the aforementioned effects.

    Checkerboarding is measured by tracking the number of times checkerboard
    frames are displayed (as opposed to the number of checkerboard frames
    produced), since the same checkerboard frame can be displayed more than
    once.

    Note that this metric is reported only when there are a sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until an additional sequence completes where there are (&gt;=
    100) frames available in total.
  </summary>
  <token key="Version" variants="CheckerboardingVersion"/>
  <token key="Sequence" variants="AccumulatedSequences"/>
</histogram>

<histogram
    name="Graphics.Smoothness.Checkerboarding{Version}.{Thread}{Sequence}"
    units="%" expires_after="2027-01-03">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <summary>
    Tracks the percent of checkerboarded frames for a sequence by aggregating
    all {Sequence}, where a sequence is a series of frames produced which
    contain at least one of the aforementioned effects.

    Checkerboarding is measured by tracking the number of times checkerboard
    frames are displayed (as opposed to the number of checkerboard frames
    produced), since the same checkerboard frame can be displayed more than
    once.

    Note that this metric is reported only when there are a sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until an additional sequence completes where there are (&gt;=
    100) frames available in total.
  </summary>
  <token key="Version" variants="CheckerboardingVersion"/>
  <token key="Thread" variants="SmoothnessThread"/>
  <token key="Sequence" variants="SmoothnessSequence"/>
</histogram>

<histogram name="Graphics.Smoothness.Jank3.AllSequences" units="%"
    expires_after="2027-01-17">
  <owner>jonross@chromium.org</owner>
  <owner>mjzhang@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Tracks the percent of janks for a sequence by aggregating all its animations
    and interactions, where a sequence is a series of frames produced which
    contain at least one of the animations/interactions. Such animations and
    interactions encompass: Compositor-thread animations; Main-thread
    animations; JS animations; scrolling; and pinch-gestures.

    Jank is measured by tracking the number of abrupt increases in frame
    presentation interval, divided by the total number of frames expected to be
    produced and displayed. The lower this number is, the less the smoothness
    varies over time.

    Note that this metric is reported only when there are sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until there are enough frames to produce the metric.
  </summary>
</histogram>

<histogram name="Graphics.Smoothness.Jank3.{Sequence}" units="%"
    expires_after="2027-02-07">
  <owner>jonross@chromium.org</owner>
  <owner>mjzhang@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Tracks the percent of janks for a sequence by aggregating all {Sequence},
    where a sequence is a series of frames produced which contain at least one
    of the aforementioned effects.

    Jank is measured by tracking the number of abrupt increases in frame
    presentation interval, divided by the total number of frames expected to be
    produced and displayed. The lower this number is, the less the smoothness
    varies over time.

    Note that this metric is reported only when there are sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until there are enough frames to produce the metric.
  </summary>
  <token key="Sequence" variants="AccumulatedSequences"/>
</histogram>

<histogram name="Graphics.Smoothness.Jank3.{Thread}{Sequence}" units="%"
    expires_after="2027-01-31">
  <owner>jonross@chromium.org</owner>
  <owner>mjzhang@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Tracks the percent of janks for a sequence by aggregating all {Sequence},
    where a sequence is a series of frames produced which contain at least one
    of the aforementioned effects.

    Jank is measured by tracking the number of abrupt increases in frame
    presentation interval, divided by the total number of frames expected to be
    produced and displayed. The lower this number is, the less the smoothness
    varies over time.

    Note that this metric is reported only when there are sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until there are enough frames to produce the metric.
  </summary>
  <token key="Thread" variants="SmoothnessThread"/>
  <token key="Sequence" variants="SmoothnessSequence"/>
</histogram>

<histogram name="Graphics.Smoothness.PercentDroppedFrames3.AllSequences"
    units="%" expires_after="never">
<!-- expires-never: guiding metric (internal: go/chrome-browser-guiding-metrics) -->

  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <owner>chrome-analysis-team@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Tracks the percent of dropped frames for a sequence by aggregating all its
    animations and interactions, where a sequence is a series of frames produced
    which contain at least one of the animations/interactions. Such animations
    and interactions encompass: Compositor-thread animations; Main-thread
    animations; JS animations; scrolling; and pinch-gestures.

    PercentDroppedFrames is measured by tracking the number of frames which were
    not displayed on screen out of the total number of frames expected to be
    produced and displayed. In other words, the lower this number is, the
    smoother the experience.

    Note that this metric is reported only when there are a sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until an additional sequence completes where there are (&gt;=
    100) frames available in total.

    While this is reported in WebView, it is not accurate on this platform,
    please ignore.

    This is a new implementation of the older
    Graphics.Smoothness.PercentDroppedFrames.AllInteractions metric.

    See http://shortn/_ItBDdHoyCf (internal only) for more details.

    This histogram is of special interest to the chrome-analysis-team@. Do not
    change its semantics or retire it without talking to them first.
  </summary>
</histogram>

<histogram name="Graphics.Smoothness.PercentDroppedFrames3.{Sequence}"
    units="%" expires_after="2027-01-03">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Tracks the percent of dropped frames for a sequence by aggregating all
    {Sequence}, where a sequence is a series of frames produced which contain at
    least one of the aforementioned effects.

    PercentDroppedFrames is measured by tracking the number of frames which were
    not displayed on screen out of the total number of frames expected to be
    produced and displayed. In other words, the lower this number is, the
    smoother the experience.

    Note that this metric is reported only when there are a sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until an additional sequence completes where there are (&gt;=
    100) frames available in total.

    While this is reported in WebView, it is not accurate on this platform,
    please ignore.

    This is a new implementation of the older
    Graphics.Smoothness.PercentDroppedFrames.AllInteractions metric.
  </summary>
  <token key="Sequence" variants="AccumulatedSequences"/>
</histogram>

<histogram
    name="Graphics.Smoothness.PercentDroppedFrames3.{Sequence}.1MinAfterResume"
    units="%" expires_after="2027-02-07">
  <owner>kawasin@google.com</owner>
  <owner>baseos-perf@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Tracks the percent of dropped frames for a sequence by aggregating all
    {Sequence}, where a sequence is a series of frames produced which contain at
    least one of the aforementioned effects.

    PercentDroppedFrames is measured by tracking the number of frames which were
    not displayed on screen out of the total number of frames expected to be
    produced and displayed. In other words, the lower this number is, the
    smoother the experience.

    Note that this metric is reported only when there are a sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until an additional sequence completes where there are (&gt;=
    100) frames available in total.

    This metric is only recorded for 1 minute after the device is resumed.

    This is supported by ChromeOS only.
  </summary>
  <token key="Sequence" variants="AccumulatedSequences"/>
</histogram>

<histogram name="Graphics.Smoothness.PercentDroppedFrames3.{Thread}{Sequence}"
    units="%" expires_after="2027-01-03">
  <owner>jonross@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Tracks the percent of dropped frames for a sequence by aggregating all
    {Sequence}, where a sequence is a series of frames produced which contain at
    least one of the aforementioned effects.

    PercentDroppedFrames is measured by tracking the number of frames which were
    not displayed on screen out of the total number of frames expected to be
    produced and displayed. In other words, the lower this number is, the
    smoother the experience.

    Note that this metric is reported only when there are a sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until an additional sequence completes where there are (&gt;=
    100) frames available in total.

    While this is reported in WebView, it is not accurate on this platform,
    please ignore.

    This is a new implementation of the older
    Graphics.Smoothness.PercentDroppedFrames.AllInteractions metric.
  </summary>
  <token key="Thread" variants="SmoothnessThread"/>
  <token key="Sequence" variants="SmoothnessSequence"/>
</histogram>

<histogram name="Graphics.Smoothness.PercentDroppedFrames4.AllSequences"
    units="%" expires_after="2027-01-03">
  <owner>jonross@chromium.org</owner>
  <owner>gaiko@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Tracks the percent of dropped frames for a sequence by aggregating all its
    animations and interactions, where a sequence is a series of frames produced
    which contain at least one of the animations/interactions. Such animations
    and interactions encompass: Compositor-thread animations; Main-thread
    animations; JS animations; scrolling; and pinch-gestures.

    PercentDroppedFrames is measured by tracking the number of frames which were
    not displayed on screen out of the total number of frames expected to be
    produced and displayed. In other words, the lower this number is, the
    smoother the experience.

    The V4 metic differs from it's V3 counterpart in that it accounts for frames
    dropped during compositor thread invalidation.

    Note that this metric is reported only when there are a sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until an additional sequence completes where there are (&gt;=
    100) frames available in total.

    This is a new implementation of the older
    Graphics.Smoothness.PercentDroppedFrames.AllInteractions metric.

    See http://shortn/_ItBDdHoyCf (internal only) for more details.

    This histogram is of special interest to the chrome-analysis-team@. Do not
    change its semantics or retire it without talking to them first.
  </summary>
</histogram>

<histogram name="Graphics.Smoothness.PercentDroppedFrames4.{Sequence}"
    units="%" expires_after="2027-02-07">
  <owner>jonross@chromium.org</owner>
  <owner>gaiko@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Tracks the percent of dropped frames for a sequence by aggregating all
    {Sequence}, where a sequence is a series of frames produced which contain at
    least one of the aforementioned effects.

    PercentDroppedFrames is measured by tracking the number of frames which were
    not displayed on screen out of the total number of frames expected to be
    produced and displayed. In other words, the lower this number is, the
    smoother the experience.

    The V4 metic differs from it's V3 counterpart in that it accounts for frames
    dropped during compositor thread invalidation.

    Note that this metric is reported only when there are a sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until an additional sequence completes where there are (&gt;=
    100) frames available in total.

    While this is reported in WebView, it is not accurate on this platform,
    please ignore.

    This is a new implementation of the older
    Graphics.Smoothness.PercentDroppedFrames.AllInteractions metric.
  </summary>
  <token key="Sequence" variants="AccumulatedSequences"/>
</histogram>

<histogram name="Graphics.Smoothness.PercentDroppedFrames4.{Thread}{Sequence}"
    units="%" expires_after="2027-02-07">
  <owner>jonross@chromium.org</owner>
  <owner>gaiko@chromium.org</owner>
  <owner>chrome-gpu-metric-alerts@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Tracks the percent of dropped frames for a sequence by aggregating all
    {Sequence}, where a sequence is a series of frames produced which contain at
    least one of the aforementioned effects.

    PercentDroppedFrames is measured by tracking the number of frames which were
    not displayed on screen out of the total number of frames expected to be
    produced and displayed. In other words, the lower this number is, the
    smoother the experience.

    The V4 metic differs from it's V3 counterpart in that it accounts for frames
    dropped during compositor thread invalidation.

    Note that this metric is reported only when there are a sufficient number of
    frames (&gt;= 100). If there are sequences with fewer frames, then these are
    aggregated until an additional sequence completes where there are (&gt;=
    100) frames available in total.

    While this is reported in WebView, it is not accurate on this platform,
    please ignore.

    This is a new implementation of the older
    Graphics.Smoothness.PercentDroppedFrames.AllInteractions metric. It also
    replaces the Graphics.Smoothness.PercentDroppedFrames3.{Thread}{Sequence}
    metric.
  </summary>
  <token key="Thread" variants="SmoothnessThread"/>
  <token key="Sequence" variants="SmoothnessSequence"/>
</histogram>

</histograms>

</histogram-configuration>
