• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (c) 2002-2010 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 // geometry/IndexDataManager.h: Defines the IndexDataManager, a class that
8 // runs the Buffer translation process for index buffers.
9 
10 #ifndef LIBGLESV2_GEOMETRY_INDEXDATAMANAGER_H_
11 #define LIBGLESV2_GEOMETRY_INDEXDATAMANAGER_H_
12 
13 #include <vector>
14 #include <cstddef>
15 
16 #define GL_APICALL
17 #include <GLES2/gl2.h>
18 
19 #include "libGLESv2/Context.h"
20 
21 namespace gl
22 {
23 
24 struct TranslatedIndexData
25 {
26     UINT minIndex;
27     UINT maxIndex;
28     UINT startIndex;
29 
30     IDirect3DIndexBuffer9 *indexBuffer;
31 };
32 
33 class IndexBuffer
34 {
35   public:
36     IndexBuffer(IDirect3DDevice9 *device, UINT size, D3DFORMAT format);
37     virtual ~IndexBuffer();
38 
size()39     UINT size() const { return mBufferSize; }
40     virtual void *map(UINT requiredSpace, UINT *offset) = 0;
41     void unmap();
42     virtual void reserveSpace(UINT requiredSpace, GLenum type) = 0;
43 
44     IDirect3DIndexBuffer9 *getBuffer() const;
45 
46   protected:
47     IDirect3DDevice9 *const mDevice;
48 
49     IDirect3DIndexBuffer9 *mIndexBuffer;
50     UINT mBufferSize;
51 
52   private:
53     DISALLOW_COPY_AND_ASSIGN(IndexBuffer);
54 };
55 
56 class StreamingIndexBuffer : public IndexBuffer
57 {
58   public:
59     StreamingIndexBuffer(IDirect3DDevice9 *device, UINT initialSize, D3DFORMAT format);
60     ~StreamingIndexBuffer();
61 
62     void *map(UINT requiredSpace, UINT *offset);
63     void reserveSpace(UINT requiredSpace, GLenum type);
64 
65   private:
66     UINT mWritePosition;
67 };
68 
69 class StaticIndexBuffer : public IndexBuffer
70 {
71   public:
72     explicit StaticIndexBuffer(IDirect3DDevice9 *device);
73     ~StaticIndexBuffer();
74 
75     void *map(UINT requiredSpace, UINT *offset);
76     void reserveSpace(UINT requiredSpace, GLenum type);
77 
78     bool lookupType(GLenum type);
79     UINT lookupRange(intptr_t offset, GLsizei count, UINT *minIndex, UINT *maxIndex);   // Returns the offset into the index buffer, or -1 if not found
80     void addRange(intptr_t offset, GLsizei count, UINT minIndex, UINT maxIndex, UINT streamOffset);
81 
82   private:
83     GLenum mCacheType;
84 
85     struct IndexRange
86     {
87         intptr_t offset;
88         GLsizei count;
89 
90         UINT minIndex;
91         UINT maxIndex;
92         UINT streamOffset;
93     };
94 
95     std::vector<IndexRange> mCache;
96 };
97 
98 class IndexDataManager
99 {
100   public:
101     IndexDataManager(Context *context, IDirect3DDevice9 *evice);
102     virtual ~IndexDataManager();
103 
104     GLenum prepareIndexData(GLenum type, GLsizei count, Buffer *arrayElementBuffer, const void *indices, TranslatedIndexData *translated);
105 
106   private:
107     DISALLOW_COPY_AND_ASSIGN(IndexDataManager);
108 
109     std::size_t typeSize(GLenum type) const;
110     std::size_t indexSize(D3DFORMAT format) const;
111 
112     IDirect3DDevice9 *const mDevice;
113 
114     StreamingIndexBuffer *mStreamingBufferShort;
115     StreamingIndexBuffer *mStreamingBufferInt;
116 };
117 
118 }
119 
120 #endif   // LIBGLESV2_GEOMETRY_INDEXDATAMANAGER_H_
121