| // 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_ |