// // Copyright 2013 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // IndexRangeCache.h: Defines the gl::IndexRangeCache class which stores information about // ranges of indices. #ifndef LIBANGLE_INDEXRANGECACHE_H_ #define LIBANGLE_INDEXRANGECACHE_H_ #include "angle_gl.h" #include "common/PackedEnums.h" #include "common/angleutils.h" #include "common/mathutil.h" #include namespace gl { struct IndexRangeKey { IndexRangeKey() = default; IndexRangeKey(DrawElementsType type, size_t offset, size_t count, bool primitiveRestart); bool operator<(const IndexRangeKey &rhs) const; bool operator==(const IndexRangeKey &rhs) const; DrawElementsType type{DrawElementsType::InvalidEnum}; size_t offset{0}; size_t count{0}; bool primitiveRestartEnabled{false}; }; class IndexRangeCache { public: IndexRangeCache(); ~IndexRangeCache(); void addRange(DrawElementsType type, size_t offset, size_t count, bool primitiveRestartEnabled, const IndexRange &range); bool findRange(DrawElementsType type, size_t offset, size_t count, bool primitiveRestartEnabled, IndexRange *outRange) const; void invalidateRange(size_t offset, size_t size); void clear(); private: std::map mIndexRangeCache; }; // First level cache stored inline at the query site. class IndexRangeInlineCache { public: IndexRangeInlineCache() = default; IndexRangeInlineCache(DrawElementsType type, size_t offset, size_t count, bool primitiveRestartEnabled, IndexRange indexRange) : mPayload(std::move(indexRange)), mKey(type, offset, count, primitiveRestartEnabled) {} bool get(DrawElementsType type, size_t offset, size_t count, bool primitiveRestartEnabled, IndexRange *indexRangeOut) { if (mKey == IndexRangeKey(type, offset, count, primitiveRestartEnabled)) { *indexRangeOut = mPayload; return true; } return false; } private: IndexRange mPayload{IndexRange::Undefined{}}; IndexRangeKey mKey; }; inline IndexRangeKey::IndexRangeKey(DrawElementsType type_, size_t offset_, size_t count_, bool primitiveRestartEnabled_) : type(type_), offset(offset_), count(count_), primitiveRestartEnabled(primitiveRestartEnabled_) {} inline bool IndexRangeKey::operator==(const IndexRangeKey &rhs) const { return type == rhs.type && offset == rhs.offset && count == rhs.count && primitiveRestartEnabled == rhs.primitiveRestartEnabled; } } // namespace gl #endif // LIBANGLE_INDEXRANGECACHE_H_