blob: 71a1392b1b8c1ed33fdc8181e597a1a0f9424d16 [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
Jamie Madillacf2f3a2017-11-21 19:22:44 -050018IndexRangeCache::IndexRangeCache()
19{
20}
21
22IndexRangeCache::~IndexRangeCache()
23{
24}
25
Geoff Lang3edfe032015-09-04 16:38:24 -040026void IndexRangeCache::addRange(GLenum type,
27 size_t offset,
28 size_t count,
29 bool primitiveRestartEnabled,
30 const IndexRange &range)
Geoff Lang831b1952015-05-05 11:02:27 -040031{
Geoff Lang3edfe032015-09-04 16:38:24 -040032 mIndexRangeCache[IndexRangeKey(type, offset, count, primitiveRestartEnabled)] = range;
Geoff Lang831b1952015-05-05 11:02:27 -040033}
34
Geoff Lang3edfe032015-09-04 16:38:24 -040035bool IndexRangeCache::findRange(GLenum type,
36 size_t offset,
37 size_t count,
38 bool primitiveRestartEnabled,
39 IndexRange *outRange) const
Geoff Lang831b1952015-05-05 11:02:27 -040040{
Geoff Lang3edfe032015-09-04 16:38:24 -040041 auto i = mIndexRangeCache.find(IndexRangeKey(type, offset, count, primitiveRestartEnabled));
Geoff Lang831b1952015-05-05 11:02:27 -040042 if (i != mIndexRangeCache.end())
43 {
44 if (outRange)
45 {
46 *outRange = i->second;
47 }
48 return true;
49 }
50 else
51 {
52 if (outRange)
53 {
Geoff Lang3edfe032015-09-04 16:38:24 -040054 *outRange = IndexRange();
Geoff Lang831b1952015-05-05 11:02:27 -040055 }
56 return false;
57 }
58}
59
Geoff Lang3edfe032015-09-04 16:38:24 -040060void IndexRangeCache::invalidateRange(size_t offset, size_t size)
61{
62 size_t invalidateStart = offset;
63 size_t invalidateEnd = offset + size;
64
65 auto i = mIndexRangeCache.begin();
66 while (i != mIndexRangeCache.end())
67 {
68 size_t rangeStart = i->first.offset;
69 size_t rangeEnd = i->first.offset + (GetTypeInfo(i->first.type).bytes * i->first.count);
70
71 if (invalidateEnd < rangeStart || invalidateStart > rangeEnd)
72 {
73 ++i;
74 }
75 else
76 {
77 mIndexRangeCache.erase(i++);
78 }
79 }
80}
81
Geoff Lang831b1952015-05-05 11:02:27 -040082void IndexRangeCache::clear()
83{
84 mIndexRangeCache.clear();
85}
86
Geoff Lang3edfe032015-09-04 16:38:24 -040087IndexRangeCache::IndexRangeKey::IndexRangeKey()
88 : IndexRangeCache::IndexRangeKey(GL_NONE, 0, 0, false)
Geoff Lang831b1952015-05-05 11:02:27 -040089{
90}
91
Geoff Lang3edfe032015-09-04 16:38:24 -040092IndexRangeCache::IndexRangeKey::IndexRangeKey(GLenum type_,
93 size_t offset_,
94 size_t count_,
95 bool primitiveRestartEnabled_)
96 : type(type_), offset(offset_), count(count_), primitiveRestartEnabled(primitiveRestartEnabled_)
Geoff Lang831b1952015-05-05 11:02:27 -040097{
98}
99
Geoff Lang3edfe032015-09-04 16:38:24 -0400100bool IndexRangeCache::IndexRangeKey::operator<(const IndexRangeKey &rhs) const
Geoff Lang831b1952015-05-05 11:02:27 -0400101{
Geoff Lang3edfe032015-09-04 16:38:24 -0400102 if (type != rhs.type)
103 {
104 return type < rhs.type;
105 }
106 if (offset != rhs.offset)
107 {
108 return offset < rhs.offset;
109 }
110 if (count != rhs.count)
111 {
112 return count < rhs.count;
113 }
114 if (primitiveRestartEnabled != rhs.primitiveRestartEnabled)
115 {
116 return primitiveRestartEnabled;
117 }
118 return false;
Geoff Lang831b1952015-05-05 11:02:27 -0400119}
120
121}