| // Copyright 2013 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef GPU_COMMAND_BUFFER_COMMON_MAILBOX_H_ | 
 | #define GPU_COMMAND_BUFFER_COMMON_MAILBOX_H_ | 
 |  | 
 | #include <stdint.h> | 
 | #include <string.h> | 
 |  | 
 | #include <string> | 
 |  | 
 | #include "base/component_export.h" | 
 |  | 
 | // From gl2/gl2ext.h. | 
 | #ifndef GL_MAILBOX_SIZE_CHROMIUM | 
 | #define GL_MAILBOX_SIZE_CHROMIUM 16 | 
 | #endif | 
 |  | 
 | namespace gpu { | 
 |  | 
 | // Importance to use in tracing. Higher values get the memory cost attributed, | 
 | // and equal values share the cost. We want the client to "win" over the | 
 | // service, since the service is acting on its behalf. | 
 | enum class TracingImportance : int { | 
 |   kNotOwner = 0, | 
 |   kServiceOwner = 1, | 
 |   kClientOwner = 2, | 
 | }; | 
 |  | 
 | // A mailbox is an unguessable name that references a SharedImage. | 
 | // This name can be passed across processes permitting one process to share | 
 | // a SharedImage with another. The mailbox name consists of a random | 
 | // set of bytes, optionally with a checksum (in debug mode) to verify the | 
 | // name is valid. | 
 | struct COMPONENT_EXPORT(GPU_MAILBOX) Mailbox { | 
 |   using Name = int8_t[GL_MAILBOX_SIZE_CHROMIUM]; | 
 |  | 
 |   Mailbox(); | 
 |  | 
 |   static Mailbox FromVolatile(const volatile Mailbox& other) { | 
 |     // Because the copy constructor is trivial, const_cast is safe. | 
 |     return const_cast<const Mailbox&>(other); | 
 |   } | 
 |  | 
 |   bool IsZero() const; | 
 |   void SetZero(); | 
 |   void SetName(const int8_t* name); | 
 |  | 
 |   // Generate a unique unguessable mailbox name. | 
 |   static Mailbox Generate(); | 
 |  | 
 |   // Verify that the mailbox was created through Mailbox::Generate. This only | 
 |   // works in Debug (always returns true in Release). This is not a secure | 
 |   // check, only to catch bugs where clients forgot to call Mailbox::Generate. | 
 |   bool Verify() const; | 
 |  | 
 |   // Returns the first four bytes of the mailbox name as an unsigned integer. | 
 |   uint32_t ToU32() const; | 
 |  | 
 |   std::string ToDebugString() const; | 
 |  | 
 |   bool operator==(const Mailbox& other) const; | 
 |   std::strong_ordering operator<=>(const Mailbox& other) const; | 
 |  | 
 |   template <typename H> | 
 |   friend H AbslHashValue(H h, const Mailbox& m) { | 
 |     // As the name is cryptographically random bytes, the first few bytes should | 
 |     // be more than sufficient as a hash. | 
 |     return H::combine(std::move(h), m.ToU32()); | 
 |   } | 
 |  | 
 |   Name name; | 
 | }; | 
 |  | 
 | }  // namespace gpu | 
 |  | 
 | template <> | 
 | struct std::hash<gpu::Mailbox> { | 
 |   std::size_t operator()(const gpu::Mailbox& m) const noexcept { | 
 |     // As the name is cryptographically random bytes, the first few bytes should | 
 |     // be more than sufficient as a hash. | 
 |     return m.ToU32(); | 
 |   } | 
 | }; | 
 |  | 
 | #endif  // GPU_COMMAND_BUFFER_COMMON_MAILBOX_H_ |