| // Copyright 2015 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_SYNC_TOKEN_H_ | |
| #define GPU_COMMAND_BUFFER_COMMON_SYNC_TOKEN_H_ | |
| #include <stdint.h> | |
| #include <compare> | |
| #include <string> | |
| #include <vector> | |
| #include "base/containers/span.h" | |
| #include "gpu/command_buffer/common/command_buffer_id.h" | |
| #include "gpu/command_buffer/common/constants.h" | |
| #include "gpu/command_buffer/common/gpu_command_buffer_common_export.h" | |
| // From glextchromium.h. | |
| #ifndef GL_SYNC_TOKEN_SIZE_CHROMIUM | |
| #define GL_SYNC_TOKEN_SIZE_CHROMIUM 24 | |
| #endif | |
| namespace gpu { | |
| struct GPU_COMMAND_BUFFER_COMMON_EXPORT SyncPointClientId { | |
| SyncPointClientId() = default; | |
| SyncPointClientId(CommandBufferNamespace in_namespace_id, | |
| CommandBufferId in_command_buffer_id); | |
| bool operator<(const SyncPointClientId& other) const { | |
| return std::tie(namespace_id, command_buffer_id) < | |
| std::tie(other.namespace_id, other.command_buffer_id); | |
| } | |
| bool operator==(const SyncPointClientId& other) const = default; | |
| CommandBufferNamespace namespace_id = CommandBufferNamespace::INVALID; | |
| CommandBufferId command_buffer_id; | |
| }; | |
| // A Sync Token is a binary blob which represents a waitable fence sync | |
| // on a particular command buffer namespace and id. | |
| // See src/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_sync_point.txt for more | |
| // details. | |
| struct GPU_COMMAND_BUFFER_COMMON_EXPORT SyncToken { | |
| SyncToken(); | |
| SyncToken(CommandBufferNamespace namespace_id, | |
| CommandBufferId command_buffer_id, | |
| uint64_t release_count); | |
| void Set(CommandBufferNamespace namespace_id, | |
| CommandBufferId command_buffer_id, | |
| uint64_t release_count) { | |
| namespace_id_ = namespace_id; | |
| command_buffer_id_ = command_buffer_id; | |
| release_count_ = release_count; | |
| } | |
| void Clear() { | |
| verified_flush_ = false; | |
| namespace_id_ = CommandBufferNamespace::INVALID; | |
| command_buffer_id_ = CommandBufferId(); | |
| release_count_ = 0; | |
| } | |
| void SetVerifyFlush() { | |
| verified_flush_ = true; | |
| } | |
| bool HasData() const { | |
| return namespace_id_ != CommandBufferNamespace::INVALID; | |
| } | |
| int8_t* GetData() { return reinterpret_cast<int8_t*>(this); } | |
| const int8_t* GetConstData() const { | |
| return reinterpret_cast<const int8_t*>(this); | |
| } | |
| bool verified_flush() const { return verified_flush_; } | |
| CommandBufferNamespace namespace_id() const { return namespace_id_; } | |
| CommandBufferId command_buffer_id() const { return command_buffer_id_; } | |
| uint64_t release_count() const { return release_count_; } | |
| friend bool operator==(const SyncToken&, const SyncToken&) = default; | |
| friend std::strong_ordering operator<=>(const SyncToken&, | |
| const SyncToken&) = default; | |
| std::string ToDebugString() const; | |
| SyncPointClientId GetClientId() const { | |
| return SyncPointClientId(namespace_id_, command_buffer_id_); | |
| } | |
| private: | |
| bool verified_flush_; | |
| CommandBufferNamespace namespace_id_; | |
| CommandBufferId command_buffer_id_; | |
| uint64_t release_count_; | |
| }; | |
| static_assert(sizeof(SyncToken) <= GL_SYNC_TOKEN_SIZE_CHROMIUM, | |
| "SyncToken size must not exceed GL_SYNC_TOKEN_SIZE_CHROMIUM"); | |
| // Remove redundant tokens such that it should be equivalent to wait on all | |
| // tokens in the output instead of waiting on all input `tokens`. | |
| GPU_COMMAND_BUFFER_COMMON_EXPORT std::vector<SyncToken> ReduceSyncTokens( | |
| base::span<const SyncToken> tokens); | |
| } // namespace gpu | |
| #endif // GPU_COMMAND_BUFFER_COMMON_SYNC_TOKEN_H_ |