Hash :
8dc27f99
Author :
Date :
2018-11-29T11:45:44
Use packed enum for DrawElementsType. The packing and unpacking take a few extra instructions. But it completely obviates the need for any switches in the validation code. Speed is slightly faster or the similar depending on the back-end. Also add gl_angle_ext.xml to GL entry point generator inputs. This was missing and would cause the code generation to miss certain changes. Bug: angleproject:2985 Change-Id: I1ea41a71db71135000166ead8305ec42d22ff7b3 Reviewed-on: https://chromium-review.googlesource.com/c/1351729 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
//
// Copyright (c) 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