blob: 4f165c1b285bd85337b8d667c01156f4a112e014 [file] [log] [blame]
Geoff Lang831b1952015-05-05 11:02:27 -04001//
2// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// IndexRangeCache.cpp: Defines the gl::IndexRangeCache class which stores information about
8// ranges of indices.
9
10#include "libANGLE/IndexRangeCache.h"
11
12#include "common/debug.h"
13#include "libANGLE/formatutils.h"
14
15namespace gl
16{
17
Geoff Lang3edfe032015-09-04 16:38:24 -040018void IndexRangeCache::addRange(GLenum type,
19 size_t offset,
20 size_t count,
21 bool primitiveRestartEnabled,
22 const IndexRange &range)
Geoff Lang831b1952015-05-05 11:02:27 -040023{
Geoff Lang3edfe032015-09-04 16:38:24 -040024 mIndexRangeCache[IndexRangeKey(type, offset, count, primitiveRestartEnabled)] = range;
Geoff Lang831b1952015-05-05 11:02:27 -040025}
26
Geoff Lang3edfe032015-09-04 16:38:24 -040027bool IndexRangeCache::findRange(GLenum type,
28 size_t offset,
29 size_t count,
30 bool primitiveRestartEnabled,
31 IndexRange *outRange) const
Geoff Lang831b1952015-05-05 11:02:27 -040032{
Geoff Lang3edfe032015-09-04 16:38:24 -040033 auto i = mIndexRangeCache.find(IndexRangeKey(type, offset, count, primitiveRestartEnabled));
Geoff Lang831b1952015-05-05 11:02:27 -040034 if (i != mIndexRangeCache.end())
35 {
36 if (outRange)
37 {
38 *outRange = i->second;
39 }
40 return true;
41 }
42 else
43 {
44 if (outRange)
45 {
Geoff Lang3edfe032015-09-04 16:38:24 -040046 *outRange = IndexRange();
Geoff Lang831b1952015-05-05 11:02:27 -040047 }
48 return false;
49 }
50}
51
Geoff Lang3edfe032015-09-04 16:38:24 -040052void IndexRangeCache::invalidateRange(size_t offset, size_t size)
53{
54 size_t invalidateStart = offset;
55 size_t invalidateEnd = offset + size;
56
57 auto i = mIndexRangeCache.begin();
58 while (i != mIndexRangeCache.end())
59 {
60 size_t rangeStart = i->first.offset;
61 size_t rangeEnd = i->first.offset + (GetTypeInfo(i->first.type).bytes * i->first.count);
62
63 if (invalidateEnd < rangeStart || invalidateStart > rangeEnd)
64 {
65 ++i;
66 }
67 else
68 {
69 mIndexRangeCache.erase(i++);
70 }
71 }
72}
73
Geoff Lang831b1952015-05-05 11:02:27 -040074void IndexRangeCache::clear()
75{
76 mIndexRangeCache.clear();
77}
78
Geoff Lang3edfe032015-09-04 16:38:24 -040079IndexRangeCache::IndexRangeKey::IndexRangeKey()
80 : IndexRangeCache::IndexRangeKey(GL_NONE, 0, 0, false)
Geoff Lang831b1952015-05-05 11:02:27 -040081{
82}
83
Geoff Lang3edfe032015-09-04 16:38:24 -040084IndexRangeCache::IndexRangeKey::IndexRangeKey(GLenum type_,
85 size_t offset_,
86 size_t count_,
87 bool primitiveRestartEnabled_)
88 : type(type_), offset(offset_), count(count_), primitiveRestartEnabled(primitiveRestartEnabled_)
Geoff Lang831b1952015-05-05 11:02:27 -040089{
90}
91
Geoff Lang3edfe032015-09-04 16:38:24 -040092bool IndexRangeCache::IndexRangeKey::operator<(const IndexRangeKey &rhs) const
Geoff Lang831b1952015-05-05 11:02:27 -040093{
Geoff Lang3edfe032015-09-04 16:38:24 -040094 if (type != rhs.type)
95 {
96 return type < rhs.type;
97 }
98 if (offset != rhs.offset)
99 {
100 return offset < rhs.offset;
101 }
102 if (count != rhs.count)
103 {
104 return count < rhs.count;
105 }
106 if (primitiveRestartEnabled != rhs.primitiveRestartEnabled)
107 {
108 return primitiveRestartEnabled;
109 }
110 return false;
Geoff Lang831b1952015-05-05 11:02:27 -0400111}
112
113}