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