<!--
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="LCDTextDisallowedReasonDPI">
  <variant name="HighDPI"
      summary="In web pages where device scale factor is greater than or
               equal to 1.5."/>
  <variant name="LowDPI"
      summary="In web pages where device scale factor is less than 1.5."/>
</variants>

<variants name="SmoothnessSequence">
  <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.)"/>
  <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="PinchZoom" summary="pinch to zoom interctions"/>
  <variant name="RAF" summary="raf driven 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>

<histogram name="Compositing.Browser.LayersUpdateTime" units="microseconds"
    expires_after="2024-02-05">
  <owner>pdr@chromium.org</owner>
  <owner>animations-dev@chromium.org</owner>
  <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.Browser.LayerTreeImpl.CalculateDrawPropertiesUs"
    units="microseconds" expires_after="2023-03-19">
  <owner>pdr@chromium.org</owner>
  <owner>paint-dev@chromium.org</owner>
  <summary>
    Time spent updating layer draw properties, in microseconds. Recorded when a
    LayerTreeImpl's draw properties 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="2024-02-04">
  <owner>khaslett@chromium.org</owner>
  <owner>petermcneeley@chromium.org</owner>
  <owner>graphics-dev@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.ColorGamut" enum="ColorGamut"
    expires_after="2022-02-06">
  <owner>cblume@chromium.org</owner>
  <owner>khushalsagar@chromium.org</owner>
  <summary>
    Every time a frame is presented, record the generalized color gamut of that
    frame.
  </summary>
</histogram>

<histogram name="Compositing.DecodeLCPCandidateImage.{DecodeMethod}"
    enum="Boolean" expires_after="2023-01-31">
  <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}
  </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.DidMainThreadBlockDuringCommit" enum="Boolean"
    expires_after="2024-02-11">
  <owner>szager@chromium.org</owner>
  <owner>paint-dev@chromium.org</owner>
  <owner>sky@chromium.org</owner>
  <summary>
    Recorded on every commit. Indicates whether the renderer's main thread was
    blocked waiting for the impl thread to commit. True indicates the main
    thread did block.
  </summary>
</histogram>

<histogram name="Compositing.DirectRenderer.OverlayProcessingUs"
    units="microseconds" expires_after="2024-02-11">
  <owner>khaslett@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <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="2024-03-16">
  <owner>vasilyt@chromium.org</owner>
  <owner>petermcneeley@chromium.org</owner>
  <owner>graphics-dev@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.
  </summary>
</histogram>

<histogram name="Compositing.DirectRenderer.PartialSwap.FrameBufferDamage"
    units="%" expires_after="2024-03-16">
  <owner>vasilyt@chromium.org</owner>
  <owner>petermcneeley@chromium.org</owner>
  <owner>graphics-dev@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="2024-03-16">
  <owner>vasilyt@chromium.org</owner>
  <owner>petermcneeley@chromium.org</owner>
  <owner>graphics-dev@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="2024-03-16">
  <owner>vasilyt@chromium.org</owner>
  <owner>petermcneeley@chromium.org</owner>
  <owner>graphics-dev@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.SkipAllNonRootRenderPassesPerFrame"
    enum="BooleanSkipped" expires_after="2024-02-11">
  <owner>magchen@chromium.org</owner>
  <owner>ccameron@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Whether all non-root render passes in a frame are skipped. Logged once per
    frame during DrawFrame for the frames with non-root render passes.
  </summary>
</histogram>

<histogram name="Compositing.DirectRenderer.SkipNonRootRenderPass"
    enum="BooleanSkipped" expires_after="2024-02-11">
  <owner>magchen@chromium.org</owner>
  <owner>ccameron@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Logged for every non-root render pass in DrawRenderPass during DrawFrame.
    True if there is no damages to the render pass and the rendering is skipped.
  </summary>
</histogram>

<histogram name="Compositing.DirectRenderer.SkippedNonRootRenderPassOutputSize"
    units="pixels" expires_after="2024-02-11">
  <owner>magchen@chromium.org</owner>
  <owner>ccameron@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Pixel size for a skipped nonroot render pass output surface. Recorded in Viz
    DirectRenderer draw frame.
  </summary>
</histogram>

<histogram name="Compositing.Display.AdpfHintUs" units="microseconds"
    expires_after="2024-02-11">
  <owner>boliu@chromium.org</owner>
  <owner>vasilyt@chromium.org</owner>
  <summary>
    This is logged once for every ADPF performance hint report, which is
    generally once every frame on Android device that supports ADPF and ADPF is
    enabled. It's the interval reported to ADPF, which is currently implemented
    as the wall clock time from vsync frame time to swap_start. Only reported
    for platforms supporting high resolution clocks.
  </summary>
</histogram>

<histogram name="Compositing.Display.Draw.Occlusion.Calculation.Time"
    units="microseconds" expires_after="2024-02-20">
  <owner>yiyix@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <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.DrawToSwapUs" units="microseconds"
    expires_after="2024-02-20">
  <owner>jonross@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <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.DrmOverlayManager.FirstTestPageFlipPassed"
    enum="Boolean" expires_after="2023-08-20">
  <owner>khaslett@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <summary>
    Logged zero or more times per frame, whether the first call to
    HardwareDisplayController.TestPageFlip succeeded.
  </summary>
</histogram>

<histogram name="Compositing.Display.DrmOverlayManager.TestPageFlipCount"
    units="units" expires_after="2024-02-04">
  <owner>khaslett@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <summary>
    Logged zero or more times per frame, the number of times TestPageFlip is
    called on the HardwareDisplayController.
  </summary>
</histogram>

<histogram name="Compositing.Display.DrmOverlayManager.TestPageFlipUs"
    units="microseconds" expires_after="2024-02-25">
  <owner>khaslett@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <summary>
    Logged zero or more times per frame, the duration of calling TestPageFlip on
    the HardwareDisplayController. Only reported for platforms supporting high
    resolution clocks.
  </summary>
</histogram>

<histogram name="Compositing.Display.DrmThread.CheckOverlayCapabilitiesSyncUs"
    units="microseconds" expires_after="2023-06-18">
  <owner>khaslett@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <summary>
    Logged zero or more times per frame, the duration of
    DrmThread::CheckOverlayCapabilitiesSync(). This is the total time spent on
    the DRM thread to check a set of overlay candidates. Only reported for
    platforms supporting high resolution clocks.
  </summary>
</histogram>

<histogram name="Compositing.Display.FlattenedRenderPassCount" units="units"
    expires_after="2024-02-11">
  <owner>jonross@chromium.org</owner>
  <owner>graphics-dev@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.HardwareDisplayController.SchedulePageFlipResult"
    enum="PageFlipResult" expires_after="2024-03-02">
  <owner>seanpaul@chromium.org</owner>
  <owner>chromeos-gfx-compositor@chromium.org</owner>
  <summary>
    Logged once per frame, represents whether we could successfully schedule a
    page flip, or what error we encountered along the way. Note: this metric was
    expired from 2023-03-02 to 2023-04-13.
  </summary>
</histogram>

<histogram name="Compositing.Display.OverlayCombinationCache.NumIdsEvicted"
    units="units" expires_after="2023-06-04">
  <owner>khaslett@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <summary>
    Logged zero or one times per frame, the number of stale candidate ids we are
    evicting from the OverlayCombinationCache this frame. If this number is high
    the CandidateIds or the candidates proposed are likely less stable than they
    should be.
  </summary>
</histogram>

<histogram name="Compositing.Display.OverlayProcessorOzone.MaxPlanesSupported"
    units="units" expires_after="2023-08-20">
  <owner>khaslett@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <summary>
    This is logged every time a valid HardwareCapabilities is received from DRM
    when display configuration may have changed. It records the number of
    overlay planes we have available on this device including the primary plane.
  </summary>
</histogram>

<histogram
    name="Compositing.Display.OverlayProcessorUsingStrategy.CandidateCombinationPreviouslySucceeded"
    enum="Boolean" expires_after="2023-08-20">
  <owner>khaslett@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <summary>
    Logged zero or one times per frame, whether or not the candidate combination
    being tested this frame was successfully promoted to overlays on the
    previous frame.
  </summary>
</histogram>

<histogram
    name="Compositing.Display.OverlayProcessorUsingStrategy.CheckOverlaySupportCallCount"
    units="units" expires_after="2024-02-04">
  <owner>khaslett@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <summary>
    This is logged once per frame, the number of times CheckOverlaySupport is
    called this frame.
  </summary>
</histogram>

<histogram
    name="Compositing.Display.OverlayProcessorUsingStrategy.CheckOverlaySupportUs"
    units="microseconds" expires_after="2024-02-11">
  <owner>khaslett@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <summary>
    Logged zero or more times per frame, the time spent checking if a set of
    candidates can be promoted to overlay. Only reported for platforms
    supporting high resolution clocks.
  </summary>
</histogram>

<histogram
    name="Compositing.Display.OverlayProcessorUsingStrategy.FramesAttemptingRequiredOverlays"
    units="boolean" expires_after="2024-03-24">
  <owner>zoraiznaeem@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Records once per frame, whether we will attempt to promote any required
    overlay or not in that frame.
  </summary>
</histogram>

<histogram
    name="Compositing.Display.OverlayProcessorUsingStrategy.FramesScalingRequiredOverlays"
    units="boolean" expires_after="2024-02-04">
  <owner>zoraiznaeem@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Records zero or once per frame, whether we attempted scaling any required
    overlay.
  </summary>
</histogram>

<histogram
    name="Compositing.Display.OverlayProcessorUsingStrategy.NumOverlays{Counted}"
    units="overlay candidates" expires_after="2024-02-20">
  <owner>khaslett@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <owner>chromeos-gfx-compositor@chromium.org</owner>
  <summary>
    Logged once per frame, the number of overlays {Counted}. Note: this metric
    was expired from 2022-11-30 to 2023-04-13.
  </summary>
  <token key="Counted">
    <variant name="Attempted"
        summary="attempted. This is only logged when using the
                 AttemptMultipleOverlays path."/>
    <variant name="Failed"
        summary="failed. This is only logged when using the
                 AttemptMultipleOverlays path."/>
    <variant name="Promoted" summary="promoted."/>
  </token>
</histogram>

<histogram
    name="Compositing.Display.OverlayProcessorUsingStrategy.NumQuadsConsidered"
    units="units" expires_after="2023-06-18">
  <owner>khaslett@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <summary>
    Logged once per frame, the number of quads considered for promotion to
    overlay.
  </summary>
</histogram>

<histogram
    name="Compositing.Display.OverlayProcessorUsingStrategy.ShouldAttemptMultipleOverlays"
    enum="AttemptingMultipleOverlays" expires_after="2024-02-25">
  <owner>khaslett@chromium.org</owner>
  <owner>kylechar@chromium.org</owner>
  <summary>
    Logged zero or one times per frame, whether we're using the
    AttemptingMultipleOverlays codepath this frame or why we arent.
  </summary>
</histogram>

<histogram
    name="Compositing.Display.OverlayProcessorUsingStrategy.WorkingScaleFactorForRequiredOverlays"
    units="scale_factor" expires_after="2024-02-04">
  <owner>zoraiznaeem@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Records the scale factor that is used to downscale successfully promoted
    required candidates. It is only logged once per frame if a required overlay
    is promoted. Note: The scale factor value is logged as `scale_factor * 100`.
  </summary>
</histogram>

<histogram name="Compositing.Display.PendingSwaps" units="swaps"
    expires_after="2024-04-11">
  <owner>sashamcintosh@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>
    Records the count of pending swaps in the display scheduler. Length of the
    swap chain can be used as a rough approximation for input latency. Recorded
    before the swap executes. Refer to Display::DrawAndSwap for details.
  </summary>
</histogram>

<histogram name="Compositing.Display.VizDependencyResolvedToGpuStartedDrawUs"
    units="microseconds" expires_after="2022-12-18">
  <owner>vasilyt@chromium.org</owner>
  <owner>backer@chromium.org</owner>
  <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.
  </summary>
</histogram>

<histogram name="Compositing.Display.VizScheduledDrawToDependencyResolvedUs"
    units="microseconds" expires_after="2023-08-27">
  <owner>vasilyt@chromium.org</owner>
  <owner>backer@chromium.org</owner>
  <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.
  </summary>
</histogram>

<histogram name="Compositing.Display.VizScheduledDrawToGpuStartedDrawUs"
    units="microseconds" expires_after="2022-12-18">
  <owner>vasilyt@chromium.org</owner>
  <owner>backer@chromium.org</owner>
  <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.
  </summary>
</histogram>

<histogram name="Compositing.MainThreadBlockedDuringCommitTime"
    units="microseconds" expires_after="2024-02-11">
  <owner>szager@chromium.org</owner>
  <owner>paint-dev@chromium.org</owner>
  <owner>sky@chromium.org</owner>
  <summary>
    The time that the renderer's main thread blocked waiting for the impl thread
    to commit. This is only reported if the main thread blocked.

    Drops reports on clients with low-resolution clocks, biasing to a portion of
    the population on Windows. See Windows.HasHighResolutionTimeTicks for the
    affected sample.
  </summary>
</histogram>

<histogram
    name="Compositing.MainThreadBlockedDuringCommitTime.ApplyCompositorChanges"
    units="microseconds" expires_after="2023-10-08">
  <owner>szager@chromium.org</owner>
  <owner>pdr@chromium.org</owner>
  <owner>paint-dev@chromium.org</owner>
  <summary>
    The time that ApplyCompositorChanges is blocked waiting for the impl thread
    to commit. This is a subset of the total time spent in
    Compositing.MainThreadBlockedDuringCommitTime.

    Drops reports on clients with low-resolution clocks, biasing to a portion of
    the population on Windows. See Windows.HasHighResolutionTimeTicks for the
    affected sample.
  </summary>
</histogram>

<histogram name="Compositing.Renderer.AnimationUpdateOnMissingPropertyNode"
    units="boolean" expires_after="2023-12-02">
  <owner>awogbemila@chromium.org</owner>
  <owner>input-dev@chromium.org</owner>
  <summary>
    Records when we attempt to update an animation with a missing property node.
    See crbug.com/1307498. We safely handle this case but until we find and fix
    the root cause, this histogram allows us to keep track of the frequency at
    this occurs.
  </summary>
</histogram>

<histogram
    name="Compositing.Renderer.CALayer.ChangedIOSurfacesPercentagePerFrame"
    units="%" expires_after="2024-01-14">
  <owner>magchen@chromium.org</owner>
  <owner>ccameron@chromium.org</owner>
  <summary>
    The percentage of changed IOSurface number in all IOSurface per frame.
    Recorded during the CALayer Tree commit to CoreAnimation on Mac.
  </summary>
</histogram>

<histogram name="Compositing.Renderer.CALayer.ChangedIOSurfacesPerFrame"
    units="surfaces" expires_after="2024-01-14">
  <owner>magchen@chromium.org</owner>
  <owner>ccameron@chromium.org</owner>
  <summary>
    The number of IOSurfaces changed per frame. Recorded during the CALayer Tree
    commit to CoreAnimation on Mac.
  </summary>
</histogram>

<histogram name="Compositing.Renderer.CALayer.ChangedIOSurfacesSizePerFrame"
    units="bytes" expires_after="2024-01-14">
  <owner>magchen@chromium.org</owner>
  <owner>ccameron@chromium.org</owner>
  <summary>
    Total IOSurfaces area size updated per frame. Recorded during the CALayer
    Tree commit to CoreAnimation on Mac.
  </summary>
</histogram>

<histogram name="Compositing.Renderer.CALayerResult" enum="CALayerResult"
    expires_after="2024-02-11">
  <owner>ccameron@chromium.org</owner>
  <owner>graphics-dev@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="2024-01-14">
  <owner>pdr@chromium.org</owner>
  <owner>paint-dev@chromium.org</owner>
  <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.LCDTextDisallowedReasonKPixels2.{DPI}"
    enum="LCDTextDisallowedReason" expires_after="2024-06-30">
  <owner>wangxianzhu@chromium.org</owner>
  <owner>paint-dev@chromium.org</owner>
  <summary>
    Records the approximate kilo-pixels covered by text drawing operations by
    LCD-text disallowed reasons. Hence the histogram value for each reason is
    the approximate number of non-LCD kilo-pixels resulting from that reason.
    Recorded when the renderer is idle, at minimum interval of the longer of 1
    minute and 500 begin frames for each local frame tree.
  </summary>
  <token key="DPI" variants="LCDTextDisallowedReasonDPI"/>
</histogram>

<histogram name="Compositing.Renderer.LCDTextDisallowedReasonLayers2.{DPI}"
    enum="LCDTextDisallowedReason" expires_after="2024-06-30">
  <owner>wangxianzhu@chromium.org</owner>
  <owner>paint-dev@chromium.org</owner>
  <summary>
    Records the number of layers containing text by LCD-text disallowed reasons.
    Recorded along with Compositing.Renderer.LCDTextDisallowedReasonKPixels.
  </summary>
  <token key="DPI" variants="LCDTextDisallowedReasonDPI"/>
</histogram>

<histogram name="Compositing.Renderer.NumActiveLayers" units="layers"
    expires_after="2024-03-17">
  <owner>pdr@chromium.org</owner>
  <owner>paint-dev@chromium.org</owner>
  <summary>
    The number of layers in the active tree for each compositor frame. This is
    logged once per frame, before the frame is drawn (in a renderer process).
  </summary>
</histogram>

<histogram name="Compositing.Renderer.NumActivePictureLayers" units="layers"
    expires_after="2024-03-17">
  <owner>pdr@chromium.org</owner>
  <owner>paint-dev@chromium.org</owner>
  <summary>
    The number of PictureLayers in the active tree for each compositor frame.
    This is logged once per frame, before the frame is drawn (in a renderer
    process).
  </summary>
</histogram>

<histogram name="Compositing.Renderer.NumRenderSurfaces" units="surfaces"
    expires_after="2024-03-17">
  <owner>pdr@chromium.org</owner>
  <owner>paint-dev@chromium.org</owner>
  <summary>
    The number of render surfaces in the render surface layer list. Recorded
    each time the render surface layer list is constructed (in a renderer
    process).
  </summary>
</histogram>

<histogram name="Compositing.SkiaRenderer.DirectlyDrawableRenderPassWithRPDQ"
    units="boolean" expires_after="2024-02-11">
  <owner>khushalsagar@chromium.org</owner>
  <owner>vmpstr@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Logged for every nested RenderPass to indicate whether it could have been
    drawn directly because it has a single RPDQ and no other effect which would
    require producing a render pass.
  </summary>
</histogram>

<histogram name="Compositing.SkiaRenderer.DrawTileDrawQuad.UsingRawDraw"
    units="boolean" expires_after="2023-06-11">
  <owner>penghuang@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>Records if the TileDrawQuad is rendered with RawDraw.</summary>
</histogram>

<histogram name="Compositing.SkiaRenderer.SkipOverlayRenderPassDrawQuad"
    enum="BooleanSkipped" expires_after="2024-02-11">
  <owner>magchen@chromium.org</owner>
  <owner>ccameron@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Logged for every RenderPassDrawQuad in the overlay list during
    ScheduleOverlays. An Overlay RenderPassDrawQuad is skipped if there is no
    damages to the render pass and the RenderPassDrawQuad settings are the same.
  </summary>
</histogram>

<histogram name="Compositing.SkiaRenderer.SkippedOverlayRenderPassDrawQuadSize"
    units="pixels" expires_after="2024-02-11">
  <owner>magchen@chromium.org</owner>
  <owner>ccameron@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Pixel size for a skipped overlay render pass draw quad. Recorded in
    SkiaRenderer ScheduleOverlays.
  </summary>
</histogram>

<histogram name="Compositing.SurfaceAggregator.AggregateUs"
    units="microseconds" expires_after="2024-02-01">
  <owner>kylechar@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <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.CopiedSurfaceCount"
    units="surfaces" expires_after="2024-02-01">
  <owner>kylechar@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <summary>
    The number of surfaces where the active CompositorFrame was copied into the
    AggregateFrame during surface aggregation. This is logged once per frame.
  </summary>
</histogram>

<histogram name="Compositing.SurfaceAggregator.CopyUs" units="microseconds"
    expires_after="2024-02-01">
  <owner>kylechar@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <summary>
    Time spent copying quads during surface aggregation. This is a subset of the
    time recorded for Compositing.SurfaceAggregator.AggregateUs and is logged
    once per frame.

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

<histogram name="Compositing.SurfaceAggregator.DeclareResourcesUs"
    units="microseconds" expires_after="2024-02-01">
  <owner>kylechar@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <summary>
    Time spent declaring resources as used during surface aggregation. This is a
    subset of the time recorded for Compositing.SurfaceAggregator.AggregateUs
    and is logged once per frame.

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

<histogram name="Compositing.SurfaceAggregator.Has{Type}PerFrame"
    enum="Boolean" expires_after="2024-02-20">
  <owner>magchen@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Record whether a frame has a specific type of render pass. This is logged
    once per frame.
  </summary>
  <token key="Type">
    <variant name="CopyRequests"/>
    <variant name="PixelMovingBackdropFilters"/>
    <variant name="PixelMovingFilters"/>
    <variant name="UnembeddedRenderPasses"/>
  </token>
</histogram>

<histogram name="Compositing.SurfaceAggregator.PrewalkedSurfaceCount"
    units="surfaces" expires_after="2024-02-01">
  <owner>kylechar@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <summary>
    The number of surfaces that were looked at during the prewalk phase of
    surface aggregation. This is logged once per frame.
  </summary>
</histogram>

<histogram name="Compositing.SurfaceAggregator.PrewalkUs" units="microseconds"
    expires_after="2024-02-01">
  <owner>kylechar@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <summary>
    Time spent doing prewalk during surface aggregation. This is a subset of the
    time recorded for Compositing.SurfaceAggregator.AggregateUs and is logged
    once per frame.

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

<histogram name="Compositing.SurfaceManager.MarkForDestructionToDestroy"
    units="ms" expires_after="2023-12-01">
  <owner>jonross@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    The time between when a Surface has been Marked for Destruction, to when it
    is actually Destroyed.

    This time denotes how long the Surface remains referenced by other Surfaces,
    preventing deletion. This does not include the following time until the
    associated resources are released, and their memory is freed. This is logged
    once per destroyed Surface.
  </summary>
</histogram>

<histogram name="Compositing.TileManager.EnoughMemory" units="boolean"
    expires_after="2024-02-11">
  <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.
  </summary>
</histogram>

<histogram name="Compositing.TileManager.LimitWhenNotEnoughMemory" units="MB"
    expires_after="2024-02-11">
  <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..
  </summary>
</histogram>

<histogram
    name="CompositorLatency.CompositorOnlyFrame{InteractionType}.{StageType}"
    units="microseconds" expires_after="2024-05-05">
  <owner>jonross@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Tracks the duration of various stages in the pipeline as a single frame goes
    through the various stages in the compositor in the cases that there is no
    damage from main thread.

    This metric uses base::Histogram::FactoryMicrosecondsTimeGet so only users
    with high resolution clocks will report this metric.

    Note: This metric was expired from 2023-03-01 to 2023-05-05.
  </summary>
  <token key="InteractionType">
    <variant name=""/>
    <variant name=".CanvasAnimation"/>
    <variant name=".CompositorAnimation"/>
    <variant name=".JSAnimation"/>
    <variant name=".MainThreadAnimation"/>
    <variant name=".PinchZoom"/>
    <variant name=".RAF"/>
    <variant name=".ScrollbarScroll"/>
    <variant name=".SETCompositorAnimation"/>
    <variant name=".SETMainThreadAnimation"/>
    <variant name=".TouchScroll"/>
    <variant name=".WheelScroll"/>
  </token>
  <token key="StageType">
    <variant name="BeginImplFrameToFinishImpl"/>
    <variant name="ImplFrameDoneToSubmitCompositorFrame"/>
    <variant name="SendBeginMainFrameToBeginMainAbort"/>
    <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="TotalLatency"/>
  </token>
</histogram>

<histogram name="CompositorLatency.IpcThread.{LatencyType}"
    units="microseconds" expires_after="2024-06-12">
  <owner>jonross@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <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="CompositorLatency.Type" enum="FrameReportType"
    expires_after="2024-03-17">
  <owner>jonross@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Whether frame is dropped or presented meeting or missing the deadline or is
    a compositor only frame.
  </summary>
</histogram>

<histogram name="CompositorLatency{ReportType}{InteractionType}.{StageType}"
    units="microseconds" expires_after="2024-07-24">
  <owner>jonross@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Tracks the duration of various stages in the pipeline as a single frame goes
    through the various stages in the compositor {ReportType}.

    This metric uses base::Histogram::FactoryMicrosecondsTimeGet so only users
    with high resolution clocks will report this metric.
  </summary>
  <token key="ReportType">
    <variant name=""
        summary="reported for frames that went through all the compositor
                 stages in chromium, and was presented to the user"/>
    <variant name=".DroppedFrame"
        summary="reported for frames that the user did not see: this includes
                 frames that are dropped in various stages inside chromium,
                 or even frames that went through all stages in chromium, but
                 ultimately was not presented to the user"/>
    <variant name=".MissedDeadlineFrame"
        summary="reported for frames that went through all the compositor
                 stages in chromium, and was presented to the user, but were
                 delayed and missed their deadline"/>
  </token>
  <token key="InteractionType">
    <variant name=""/>
    <variant name=".CanvasAnimation"/>
    <variant name=".CompositorAnimation"/>
    <variant name=".JSAnimation"/>
    <variant name=".MainThreadAnimation"/>
    <variant name=".PinchZoom"/>
    <variant name=".RAF"/>
    <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="EndCommitToActivation"/>
    <variant name="SendBeginMainFrameToCommit"/>
    <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="TotalLatency"/>
  </token>
</histogram>

<histogram name="Graphics.Exo.Smoothness.DidNotProduceToFrameArrival"
    units="microseconds" expires_after="2024-03-03">
  <owner>jonross@chromium.org</owner>
  <owner>yzshen@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Measures the time duration between Exo sending a DidNotProduceFrame response
    and the next frame arrival, if the next frame arrives before a new
    BeginFrame request. Reported for clients with high-resolution clocks.

    This metric is used to measure whether the deadline Exo uses to wait for
    frames is reasonable. Please note that a value is reported for each
    DidNotProduceFrame. If (1) DidNotProduceFrame is issued when there are
    already queued BeginFrame requests; or (2) a new BeginFrame request arrives
    before the next frame; or (3) BeginFrame requests are paused, then the value
    reported is 0.
  </summary>
</histogram>

<histogram name="Graphics.Exo.Smoothness.PercentDidNotProduceFrame" units="%"
    expires_after="2024-03-03">
  <owner>jonross@chromium.org</owner>
  <owner>yzshen@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Tracks the percent of BeginFrame requests that Exo receives and responds
    with DidNotProduceFrame.

    A new value is reported for every 100 BeginFrame requests that a shell
    surface receives. Note that this metric is reported only when there are
    sufficient number of BeginFrame requests (&gt;= 100).
  </summary>
</histogram>

<histogram name="Graphics.Exo.Smoothness.PercentFrameDiscarded" units="%"
    expires_after="2023-12-31">
  <owner>jonross@chromium.org</owner>
  <owner>yzshen@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Tracks the percent of compositor frames that are submitted from Exo clients
    and directly discarded without being sent to the GPU process.

    A new value is reported for every 100 frames that a shell surface submits.
    Note that this metric is reported only when there are sufficient number of
    frames (&gt;= 100).
  </summary>
</histogram>

<histogram name="Graphics.Smoothness.95pctPercentDroppedFrames_1sWindow"
    units="%" expires_after="2024-03-17">
  <owner>jonross@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    The percent dropped frame is calculated for each sliding window of 1 second
    length and added to a histogram, and then the 95 percentile of that
    histogram is reported as 95pctPercentDroppedFrames_1sWindow.

    The sliding windows cover the duration of page-load (From start of page-load
    until user navigates away, or closes the tab/chrome, or when app goes to
    background). Note that this means that this metric will bias toward tabs
    that are closed more quickly, and might underreport tabs that remain open
    for a long duration.

    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 experience.
  </summary>
</histogram>

<histogram name="Graphics.Smoothness.Checkerboarding3.AllSequences" units="%"
    expires_after="2024-05-08">
  <owner>jonross@chromium.org</owner>
  <owner>graphics-dev@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>
</histogram>

<histogram name="Graphics.Smoothness.Checkerboarding3.{Sequence}" units="%"
    expires_after="2024-05-08">
  <owner>jonross@chromium.org</owner>
  <owner>graphics-dev@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="Sequence" variants="SmoothnessSequence"/>
</histogram>

<histogram name="Graphics.Smoothness.Jank" units="%" expires_after="2023-10-08">
  <owner>jonross@chromium.org</owner>
  <owner>mjzhang@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Tracks the percent of janks for a particular sequence of frames (e.g. during
    scroll, animation, etc.). This is reported in various sub-metrics with
    suffixes describing the type of the sequence (e.g. TouchScroll etc.).

    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.Jank.All{Type}" units="%"
    expires_after="2024-06-01">
  <owner>jonross@chromium.org</owner>
  <owner>mjzhang@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Tracks the percent of janks for a particular frame sequence. {Type}

    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="Type">
    <variant name="Animations"
        summary="This metric aggregates data reported from all types of
                 animations (e.g. comositor-driven animations, main-thread
                 driven animations, and raf-driven animations, etc.)."/>
    <variant name="Interactions"
        summary="This metric aggregates data reported for all supported
                 combinations of interaction types (e.g. scrolling, pinching,
                 etc.) and input device types (e.g. touchscreen, touchpad,
                 mousewheel, etc.)."/>
    <variant name="Sequences"
        summary="This metric aggregates data from all animations and all
                 interactions."/>
  </token>
</histogram>

<histogram name="Graphics.Smoothness.Jank3.All{Type}" units="%"
    expires_after="2024-06-05">
  <owner>jonross@chromium.org</owner>
  <owner>mjzhang@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Tracks the percent of janks for a sequence by aggregating all its {Type}

    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="Type">
    <variant name="Animations"
        summary="animations, where a sequence is a series of frames produced
                 which contain at least one of: Compositor-thread animations;
                 Main-thread animations; and JS animations."/>
    <variant name="Interactions"
        summary="interactions, where a sequence is a series of frames
                 produced which contain scrolling or pinch-gestures."/>
    <variant name="Sequences"
        summary="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."/>
  </token>
</histogram>

<histogram name="Graphics.Smoothness.Jank3.{Thread}{Sequence}" units="%"
    expires_after="2024-06-05">
  <owner>jonross@chromium.org</owner>
  <owner>mjzhang@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <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">
    <variant name="CompositorThread."/>
    <variant name="MainThread."/>
  </token>
  <token key="Sequence" variants="SmoothnessSequence"/>
</histogram>

<histogram name="Graphics.Smoothness.MaxPercentDroppedFrames_1sWindow"
    units="%" expires_after="2024-01-14">
  <owner>jonross@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Tracks the percent of dropped frames for in a 1 second sliding window.

    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 experience.
  </summary>
</histogram>

<histogram name="Graphics.Smoothness.MaxStale" units="ms"
    expires_after="2024-03-17">
  <owner>jonross@chromium.org</owner>
  <owner>mjzhang@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Tracks the maximum staleness value for all presentations for a particular
    sequence of frames (e.g. during scroll, animation, etc.). This is reported
    in various sub-metrics with suffixes describing the type of the sequence
    (e.g. TouchScroll etc.).

    Typically, a frame presentation is expected to last at least one vsync
    cycle, plus any number of additional vsync cycles if no updates are expected
    duration that time. If the presentation interval is prolonged due to reasons
    other than listed above, then that prolonged portion will be considered
    staleness for that frame.

    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.PercentDroppedFrames3.AllSequences"
    units="%" expires_after="never">
<!-- expires-never: guiding metric (internal: go/chrome-browser-guiding-metrics) -->

  <owner>jonross@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <owner>chrome-analysis-team@google.com</owner>
  <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.

    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.{Thread}{Sequence}"
    units="%" expires_after="2024-05-11">
  <owner>jonross@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <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 is a new implementation of the older
    Graphics.Smoothness.PercentDroppedFrames.AllInteractions metric.
  </summary>
  <token key="Thread">
    <variant name=""/>
    <variant name="CompositorThread."/>
    <variant name="MainThread."/>
  </token>
  <token key="Sequence" variants="SmoothnessSequence"/>
</histogram>

<histogram name="Graphics.Smoothness.Stale" units="ms"
    expires_after="2024-03-17">
  <owner>jonross@chromium.org</owner>
  <owner>mjzhang@chromium.org</owner>
  <owner>graphics-dev@chromium.org</owner>
  <summary>
    Tracks the staleness value for each frame presentation for a particular
    sequence of frames (e.g. during scroll, animation, etc.). This is reported
    in various sub-metrics with suffixes describing the type of the sequence
    (e.g. TouchScroll etc.).

    Typically, a frame presentation is expected to last at least one vsync
    cycle, plus any number of additional vsync cycles if no updates are expected
    duration that time. If the presentation interval is prolonged due to reasons
    other than listed above, then that prolonged portion will be considered
    staleness.

    Note that the reporting of this metric occurs as soon as a frame is
    presented, and is not affected by the length of the frame sequence.
  </summary>
</histogram>

</histograms>

</histogram-configuration>
