1 //
2 // Copyright 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.h: Defines the gl::IndexRangeCache class which stores information about
8 // ranges of indices.
9 
10 #ifndef LIBANGLE_INDEXRANGECACHE_H_
11 #define LIBANGLE_INDEXRANGECACHE_H_
12 
13 #include "angle_gl.h"
14 #include "common/PackedEnums.h"
15 #include "common/angleutils.h"
16 #include "common/mathutil.h"
17 
18 #include <map>
19 
20 namespace gl
21 {
22 
23 class IndexRangeCache
24 {
25   public:
26     IndexRangeCache();
27     ~IndexRangeCache();
28 
29     void addRange(DrawElementsType type,
30                   size_t offset,
31                   size_t count,
32                   bool primitiveRestartEnabled,
33                   const IndexRange &range);
34     bool findRange(DrawElementsType type,
35                    size_t offset,
36                    size_t count,
37                    bool primitiveRestartEnabled,
38                    IndexRange *outRange) const;
39 
40     void invalidateRange(size_t offset, size_t size);
41     void clear();
42 
43   private:
44     struct IndexRangeKey
45     {
46         IndexRangeKey();
47         IndexRangeKey(DrawElementsType type, size_t offset, size_t count, bool primitiveRestart);
48 
49         bool operator<(const IndexRangeKey &rhs) const;
50 
51         DrawElementsType type;
52         size_t offset;
53         size_t count;
54         bool primitiveRestartEnabled;
55     };
56 
57     typedef std::map<IndexRangeKey, IndexRange> IndexRangeMap;
58     IndexRangeMap mIndexRangeCache;
59 };
60 
61 }  // namespace gl
62 
63 #endif  // LIBANGLE_INDEXRANGECACHE_H_
64