blob: 18987729fefa81ebf7df7ac6660255f45f3bb2c7 [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 Madillb980c562018-11-27 11:34:27 -050018IndexRangeCache::IndexRangeCache() {}
Jamie Madillacf2f3a2017-11-21 19:22:44 -050019
Jamie Madillb980c562018-11-27 11:34:27 -050020IndexRangeCache::~IndexRangeCache() {}
Jamie Madillacf2f3a2017-11-21 19:22:44 -050021
Geoff Lang3edfe032015-09-04 16:38:24 -040022void IndexRangeCache::addRange(GLenum type,
23 size_t offset,
24 size_t count,
25 bool primitiveRestartEnabled,
26 const IndexRange &range)
Geoff Lang831b1952015-05-05 11:02:27 -040027{
Geoff Lang3edfe032015-09-04 16:38:24 -040028 mIndexRangeCache[IndexRangeKey(type, offset, count, primitiveRestartEnabled)] = range;
Geoff Lang831b1952015-05-05 11:02:27 -040029}
30
Geoff Lang3edfe032015-09-04 16:38:24 -040031bool IndexRangeCache::findRange(GLenum type,
32 size_t offset,
33 size_t count,
34 bool primitiveRestartEnabled,
35 IndexRange *outRange) const
Geoff Lang831b1952015-05-05 11:02:27 -040036{
Geoff Lang3edfe032015-09-04 16:38:24 -040037 auto i = mIndexRangeCache.find(IndexRangeKey(type, offset, count, primitiveRestartEnabled));
Geoff Lang831b1952015-05-05 11:02:27 -040038 if (i != mIndexRangeCache.end())
39 {
40 if (outRange)
41 {
42 *outRange = i->second;
43 }
44 return true;
45 }
46 else
47 {
48 if (outRange)
49 {
Geoff Lang3edfe032015-09-04 16:38:24 -040050 *outRange = IndexRange();
Geoff Lang831b1952015-05-05 11:02:27 -040051 }
52 return false;
53 }
54}
55
Geoff Lang3edfe032015-09-04 16:38:24 -040056void IndexRangeCache::invalidateRange(size_t offset, size_t size)
57{
58 size_t invalidateStart = offset;
59 size_t invalidateEnd = offset + size;
60
61 auto i = mIndexRangeCache.begin();
62 while (i != mIndexRangeCache.end())
63 {
64 size_t rangeStart = i->first.offset;
65 size_t rangeEnd = i->first.offset + (GetTypeInfo(i->first.type).bytes * i->first.count);
66
67 if (invalidateEnd < rangeStart || invalidateStart > rangeEnd)
68 {
69 ++i;
70 }
71 else
72 {
73 mIndexRangeCache.erase(i++);
74 }
75 }
76}
77
Geoff Lang831b1952015-05-05 11:02:27 -040078void IndexRangeCache::clear()
79{
80 mIndexRangeCache.clear();
81}
82
Geoff Lang3edfe032015-09-04 16:38:24 -040083IndexRangeCache::IndexRangeKey::IndexRangeKey()
84 : IndexRangeCache::IndexRangeKey(GL_NONE, 0, 0, false)
Jamie Madillb980c562018-11-27 11:34:27 -050085{}
Geoff Lang831b1952015-05-05 11:02:27 -040086
Geoff Lang3edfe032015-09-04 16:38:24 -040087IndexRangeCache::IndexRangeKey::IndexRangeKey(GLenum type_,
88 size_t offset_,
89 size_t count_,
90 bool primitiveRestartEnabled_)
91 : type(type_), offset(offset_), count(count_), primitiveRestartEnabled(primitiveRestartEnabled_)
Jamie Madillb980c562018-11-27 11:34:27 -050092{}
Geoff Lang831b1952015-05-05 11:02:27 -040093
Geoff Lang3edfe032015-09-04 16:38:24 -040094bool IndexRangeCache::IndexRangeKey::operator<(const IndexRangeKey &rhs) const
Geoff Lang831b1952015-05-05 11:02:27 -040095{
Geoff Lang3edfe032015-09-04 16:38:24 -040096 if (type != rhs.type)
97 {
98 return type < rhs.type;
99 }
100 if (offset != rhs.offset)
101 {
102 return offset < rhs.offset;
103 }
104 if (count != rhs.count)
105 {
106 return count < rhs.count;
107 }
108 if (primitiveRestartEnabled != rhs.primitiveRestartEnabled)
109 {
110 return primitiveRestartEnabled;
111 }
112 return false;
Geoff Lang831b1952015-05-05 11:02:27 -0400113}
114
Jamie Madillb980c562018-11-27 11:34:27 -0500115} // namespace gl