blob: 1c5319eeec4ccd63f96dd6dde977c11468756e59 [file] [log] [blame]
/*
* 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