// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_VIZ_SERVICE_SURFACES_SURFACE_H_ #define COMPONENTS_VIZ_SERVICE_SURFACES_SURFACE_H_ #include <stddef.h> #include <stdint.h> #include <map> #include <memory> #include <optional> #include <set> #include <unordered_set> #include <utility> #include <vector> #include "base/containers/circular_deque.h" #include "base/functional/callback.h" #include "base/functional/callback_helpers.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/platform_thread.h" #include "base/time/time.h" #include "components/viz/common/frame_sinks/copy_output_request.h" #include "components/viz/common/quads/compositor_frame.h" #include "components/viz/common/surfaces/frame_sink_id.h" #include "components/viz/common/surfaces/surface_info.h" #include "components/viz/service/surfaces/frame_index_constants.h" #include "components/viz/service/surfaces/pending_copy_output_request.h" #include "components/viz/service/surfaces/surface_client.h" #include "components/viz/service/surfaces/surface_dependency_deadline.h" #include "components/viz/service/viz_service_export.h" #include "ui/gfx/geometry/size.h" namespace gfx { struct PresentationFeedback; struct SwapTimings; } namespace ui { class LatencyInfo; } namespace viz { class CopyOutputRequest; class SurfaceAllocationGroup; class SurfaceManager; // A Surface is a representation of a sequence of CompositorFrames with a // common set of properties uniquely identified by a SurfaceId. In particular, // all CompositorFrames submitted to a single Surface share properties described // in SurfaceInfo: device scale factor and size. A Surface can hold up few // CompositorFrames at a given time: // // Uncommitted frames: It's frame that has been received, but hasn't been // processed yet. There can be up to // `max_uncommitted_frames_` in this state. If // `max_uncommitted_frames_` is zero all frames are // committed as soon as they are received. // // Pending frame: A pending CompositorFrame cannot be displayed on // screen. A CompositorFrame is pending when it has been // committed but has unresolved dependencies: surface Ids // to which there are no active CompositorFrames. There // can be only one pending frame. // // Active frame: An active frame is a candidate for display. A // CompositorFrame is active if it has been explicitly // marked as active after a deadline has passed or all // its dependencies are active. There can be only one // active frame. // // This pending+active frame mechanism for managing CompositorFrames from a // client exists to enable best-effort synchronization across clients. A surface // subtree will remain pending until all dependencies are resolved: all clients // have submitted CompositorFrames corresponding to a new property of the // subtree (e.g. a new size). // // Clients are assumed to be untrusted and so a client may not submit a // CompositorFrame to satisfy the dependency of the parent. Thus, by default, a // surface has an activation deadline associated with its dependencies. If the // deadline passes, then the CompositorFrame will activate despite missing // dependencies. The activated CompositorFrame can specify fallback behavior in // the event of missing dependencies at display time. // // On WebView display compositor runs asynchronously in regards of BeginFrames // and CompositorFrame submissions, to avoid frame drops due to racyness // uncommitted queue mechanism is used. When clients submits frame it goes to // the queue and when the display compositor draws frames are committed from // the queue to the pending or active frame. class VIZ_SERVICE_EXPORT Surface final { … }; } // namespace viz #endif // COMPONENTS_VIZ_SERVICE_SURFACES_SURFACE_H_