// Copyright 2017 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_COMMON_SURFACES_LOCAL_SURFACE_ID_H_ #define COMPONENTS_VIZ_COMMON_SURFACES_LOCAL_SURFACE_ID_H_ #include <inttypes.h> #include <compare> #include <iosfwd> #include <limits> #include <string> #include "base/tracing/protos/chrome_track_event.pbzero.h" #include "base/unguessable_token.h" #include "components/viz/common/viz_common_export.h" #include "mojo/public/cpp/bindings/struct_traits.h" #include "third_party/perfetto/include/perfetto/tracing/traced_proto.h" namespace viz { namespace mojom { class LocalSurfaceIdDataView; } class ParentLocalSurfaceIdAllocator; class ChildLocalSurfaceIdAllocator; constexpr uint32_t kInvalidParentSequenceNumber = …; constexpr uint32_t kInvalidChildSequenceNumber = …; constexpr uint32_t kInitialParentSequenceNumber = …; constexpr uint32_t kInitialChildSequenceNumber = …; constexpr uint32_t kMaxParentSequenceNumber = …; constexpr uint32_t kMaxChildSequenceNumber = …; // This struct is the part of SurfaceId that can be modified by the client. // LocalSurfaceId uniquely identifies a surface among the surfaces created by a // particular client. A SurfaceId, which is FrameSinkId+LocalSurfaceId, uniquely // identifies a surface globally across all clients. // // LocalSurfaceId consists of: // // - parent_sequence_number: This part is incremented by the embedder of the // client. // // - child_sequence_number: This part is incremented by the client itself. // // - embed_token: An UnguessableToken generated by the embedder. The purpose of // this value is to make SurfaceIds unguessable, because FrameSinkIds and // LocalSurfaceIds are otherwise predictable and clients might exploit this // fact to embed surfaces they're not allowed to. This value is generated once // by ParentLocalSurfaceIdAllocator and remains constant during the lifetime // of the embedding, even if a new LocalSurfaceId is generated for the // embedded client because of some change in its state (e.g. size, // device scale factor, etc.), or for other reasons. If a client is // re-parented, then the new parent allocates a new LocalSurfaceId, with a new // embed token, and communicates that to the embedded client. // // The embedder uses ParentLocalSurfaceIdAllocator to generate LocalSurfaceIds // for the embedee. If Surface Synchronization is on, the embedee uses // ChildLocalSurfaceIdAllocator to generate LocalSurfaceIds for itself. If // Surface Synchronization is off, the embedee also uses // ParentLocalSurfaceIdAllocator, as the parent doesn't generate LocalSurfaceIds // for the child. class VIZ_COMMON_EXPORT LocalSurfaceId { … }; VIZ_COMMON_EXPORT std::ostream& operator<<( std::ostream& out, const LocalSurfaceId& local_surface_id); } // namespace viz #endif // COMPONENTS_VIZ_COMMON_SURFACES_LOCAL_SURFACE_ID_H_