| /* |
| * Copyright 2025 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef skgpu_Token_DEFINED |
| #define skgpu_Token_DEFINED |
| |
| #include <cstdint> |
| |
| class GrOpFlushState; |
| class TestingUploadTarget; |
| namespace skgpu::graphite { |
| class RecorderPriv; |
| } |
| |
| namespace skgpu { |
| |
| /** |
| * A generic token used to sequence operations within a Recorder. |
| */ |
| class Token { |
| public: |
| static Token InvalidToken() { return Token(0); } |
| |
| Token(const Token&) = default; |
| Token& operator=(const Token&) = default; |
| |
| bool operator==(const Token& that) const { return fSequenceNumber == that.fSequenceNumber; } |
| bool operator!=(const Token& that) const { return !(*this == that); } |
| bool operator<(const Token that) const { return fSequenceNumber < that.fSequenceNumber; } |
| bool operator<=(const Token that) const { return fSequenceNumber <= that.fSequenceNumber; } |
| bool operator>(const Token that) const { return fSequenceNumber > that.fSequenceNumber; } |
| bool operator>=(const Token that) const { return fSequenceNumber >= that.fSequenceNumber; } |
| |
| Token& operator++() { |
| ++fSequenceNumber; |
| return *this; |
| } |
| Token operator++(int) { |
| auto old = fSequenceNumber; |
| ++fSequenceNumber; |
| return Token(old); |
| } |
| |
| Token next() const { return Token(fSequenceNumber + 1); } |
| |
| /** Returns the raw value for debugging and comparison. */ |
| uint64_t value() const { return fSequenceNumber; } |
| |
| /** Is this token in the [start, end] inclusive interval? */ |
| bool inInterval(const Token& start, const Token& end) { |
| return *this >= start && *this <= end; |
| } |
| |
| private: |
| explicit Token(uint64_t sequenceNumber) : fSequenceNumber(sequenceNumber) {} |
| uint64_t fSequenceNumber; |
| |
| friend class TokenTracker; // Allow TokenTracker to construct one |
| }; |
| |
| /** |
| * Encapsulates the incrementing and distribution of Tokens for a Recorder. |
| */ |
| class TokenTracker { |
| public: |
| /** |
| * Gets the token one beyond the last token that has been flushed. |
| * This represents the ID for the *current* batch of work being recorded. |
| */ |
| Token nextFlushToken() const { return fCurrentFlushToken.next(); } |
| |
| /** |
| * Gets the token that was *just issued*. This represents the ID of the |
| * flush that was most recently completed. |
| */ |
| Token currentFlushToken() const { return fCurrentFlushToken; } |
| |
| /** |
| * Gets the next draw token. |
| */ |
| Token nextDrawToken() const { return fCurrentDrawToken.next(); } |
| |
| private: |
| // Only these classes get to increment the token counters |
| friend class ::GrOpFlushState; // Ganesh |
| friend class ::TestingUploadTarget; // `` |
| friend class skgpu::graphite::RecorderPriv; // Graphite |
| |
| Token issueDrawToken() { return ++fCurrentDrawToken; } |
| Token issueFlushToken() { return ++fCurrentFlushToken; } |
| |
| Token fCurrentDrawToken = Token::InvalidToken(); |
| Token fCurrentFlushToken = Token::InvalidToken(); |
| }; |
| |
| } // namespace skgpu |
| |
| #endif // skgpu_Token_DEFINED |