blob: 5540dc8a7c2db0f2ddea4d5471c53db37531cc6d [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
Jamie Madill8dc27f92018-11-29 11:45:44 -050022void IndexRangeCache::addRange(DrawElementsType type,
Geoff Lang3edfe032015-09-04 16:38:24 -040023 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
Jamie Madill8dc27f92018-11-29 11:45:44 -050031bool IndexRangeCache::findRange(DrawElementsType type,
Geoff Lang3edfe032015-09-04 16:38:24 -040032 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;
Jamie Madill8dc27f92018-11-29 11:45:44 -050065 size_t rangeEnd =
66 i->first.offset + (GetDrawElementsTypeSize(i->first.type) * i->first.count);
Geoff Lang3edfe032015-09-04 16:38:24 -040067
68 if (invalidateEnd < rangeStart || invalidateStart > rangeEnd)
69 {
70 ++i;
71 }
72 else
73 {
74 mIndexRangeCache.erase(i++);
75 }
76 }
77}
78
Geoff Lang831b1952015-05-05 11:02:27 -040079void IndexRangeCache::clear()
80{
81 mIndexRangeCache.clear();
82}
83
Geoff Lang3edfe032015-09-04 16:38:24 -040084IndexRangeCache::IndexRangeKey::IndexRangeKey()
Jamie Madill8dc27f92018-11-29 11:45:44 -050085 : IndexRangeCache::IndexRangeKey(DrawElementsType::InvalidEnum, 0, 0, false)
Jamie Madillb980c562018-11-27 11:34:27 -050086{}
Geoff Lang831b1952015-05-05 11:02:27 -040087
Jamie Madill8dc27f92018-11-29 11:45:44 -050088IndexRangeCache::IndexRangeKey::IndexRangeKey(DrawElementsType type_,
Geoff Lang3edfe032015-09-04 16:38:24 -040089 size_t offset_,
90 size_t count_,
91 bool primitiveRestartEnabled_)
92 : type(type_), offset(offset_), count(count_), primitiveRestartEnabled(primitiveRestartEnabled_)
Jamie Madillb980c562018-11-27 11:34:27 -050093{}
Geoff Lang831b1952015-05-05 11:02:27 -040094
Geoff Lang3edfe032015-09-04 16:38:24 -040095bool IndexRangeCache::IndexRangeKey::operator<(const IndexRangeKey &rhs) const
Geoff Lang831b1952015-05-05 11:02:27 -040096{
Geoff Lang3edfe032015-09-04 16:38:24 -040097 if (type != rhs.type)
98 {
99 return type < rhs.type;
100 }
101 if (offset != rhs.offset)
102 {
103 return offset < rhs.offset;
104 }
105 if (count != rhs.count)
106 {
107 return count < rhs.count;
108 }
109 if (primitiveRestartEnabled != rhs.primitiveRestartEnabled)
110 {
111 return primitiveRestartEnabled;
112 }
113 return false;
Geoff Lang831b1952015-05-05 11:02:27 -0400114}
115
Jamie Madillb980c562018-11-27 11:34:27 -0500116} // namespace gl