| // | |
| // 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.cpp: Defines the gl::IndexRangeCache class which stores information about | |
| // ranges of indices. | |
| #include "libANGLE/IndexRangeCache.h" | |
| #include "common/debug.h" | |
| #include "libANGLE/formatutils.h" | |
| namespace gl | |
| { | |
| IndexRangeCache::IndexRangeCache() {} | |
| IndexRangeCache::~IndexRangeCache() {} | |
| void IndexRangeCache::addRange(DrawElementsType type, | |
| size_t offset, | |
| size_t count, | |
| bool primitiveRestartEnabled, | |
| const IndexRange &range) | |
| { | |
| mIndexRangeCache[IndexRangeKey(type, offset, count, primitiveRestartEnabled)] = range; | |
| } | |
| bool IndexRangeCache::findRange(DrawElementsType type, | |
| size_t offset, | |
| size_t count, | |
| bool primitiveRestartEnabled, | |
| IndexRange *outRange) const | |
| { | |
| auto i = mIndexRangeCache.find(IndexRangeKey(type, offset, count, primitiveRestartEnabled)); | |
| if (i != mIndexRangeCache.end()) | |
| { | |
| if (outRange) | |
| { | |
| *outRange = i->second; | |
| } | |
| return true; | |
| } | |
| else | |
| { | |
| if (outRange) | |
| { | |
| *outRange = IndexRange(); | |
| } | |
| return false; | |
| } | |
| } | |
| void IndexRangeCache::invalidateRange(size_t offset, size_t size) | |
| { | |
| size_t invalidateStart = offset; | |
| size_t invalidateEnd = offset + size; | |
| auto i = mIndexRangeCache.begin(); | |
| while (i != mIndexRangeCache.end()) | |
| { | |
| size_t rangeStart = i->first.offset; | |
| size_t rangeEnd = | |
| i->first.offset + (GetDrawElementsTypeSize(i->first.type) * i->first.count); | |
| if (invalidateEnd < rangeStart || invalidateStart > rangeEnd) | |
| { | |
| ++i; | |
| } | |
| else | |
| { | |
| mIndexRangeCache.erase(i++); | |
| } | |
| } | |
| } | |
| void IndexRangeCache::clear() | |
| { | |
| mIndexRangeCache.clear(); | |
| } | |
| IndexRangeCache::IndexRangeKey::IndexRangeKey() | |
| : IndexRangeCache::IndexRangeKey(DrawElementsType::InvalidEnum, 0, 0, false) | |
| {} | |
| IndexRangeCache::IndexRangeKey::IndexRangeKey(DrawElementsType type_, | |
| size_t offset_, | |
| size_t count_, | |
| bool primitiveRestartEnabled_) | |
| : type(type_), offset(offset_), count(count_), primitiveRestartEnabled(primitiveRestartEnabled_) | |
| {} | |
| bool IndexRangeCache::IndexRangeKey::operator<(const IndexRangeKey &rhs) const | |
| { | |
| if (type != rhs.type) | |
| { | |
| return type < rhs.type; | |
| } | |
| if (offset != rhs.offset) | |
| { | |
| return offset < rhs.offset; | |
| } | |
| if (count != rhs.count) | |
| { | |
| return count < rhs.count; | |
| } | |
| if (primitiveRestartEnabled != rhs.primitiveRestartEnabled) | |
| { | |
| return primitiveRestartEnabled; | |
| } | |
| return false; | |
| } | |
| } // namespace gl |