blob: f847d0b53386764b8616a2fd0321078b70d17336 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CC_SURFACES_SURFACE_SEQUENCE_H_
#define CC_SURFACES_SURFACE_SEQUENCE_H_
#include <stddef.h>
#include <stdint.h>
#include <tuple>
#include "base/hash.h"
#include "cc/surfaces/frame_sink_id.h"
namespace cc {
// A per-surface-namespace sequence number that's used to coordinate
// dependencies between frames. A sequence number may be satisfied once, and
// may be depended on once.
struct SurfaceSequence {
SurfaceSequence() : sequence(0u) {}
SurfaceSequence(const FrameSinkId& frame_sink_id, uint32_t sequence)
: frame_sink_id(frame_sink_id), sequence(sequence) {}
bool is_null() const { return frame_sink_id.is_null() && sequence == 0u; }
FrameSinkId frame_sink_id;
uint32_t sequence;
};
inline bool operator==(const SurfaceSequence& a, const SurfaceSequence& b) {
return a.frame_sink_id == b.frame_sink_id && a.sequence == b.sequence;
}
inline bool operator!=(const SurfaceSequence& a, const SurfaceSequence& b) {
return !(a == b);
}
inline bool operator<(const SurfaceSequence& a, const SurfaceSequence& b) {
return std::tie(a.frame_sink_id, a.sequence) <
std::tie(b.frame_sink_id, b.sequence);
}
struct SurfaceSequenceHash {
size_t operator()(SurfaceSequence key) const {
return base::HashInts(static_cast<uint64_t>(key.frame_sink_id.hash()),
key.sequence);
}
};
} // namespace cc
#endif // CC_SURFACES_SURFACE_SEQUENCE_H_