• 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/VertexDataManager.h: Defines the VertexDataManager, a class that
8 // runs the Buffer translation process.
9 
10 #ifndef LIBGLESV2_GEOMETRY_VERTEXDATAMANAGER_H_
11 #define LIBGLESV2_GEOMETRY_VERTEXDATAMANAGER_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 TranslatedAttribute
25 {
26     bool active;
27 
28     D3DDECLTYPE type;
29     UINT offset;
30     UINT stride;   // 0 means not to advance the read pointer at all
31     UINT semanticIndex;
32 
33     IDirect3DVertexBuffer9 *vertexBuffer;
34 };
35 
36 class VertexBuffer
37 {
38   public:
39     VertexBuffer(IDirect3DDevice9 *device, UINT size, DWORD usageFlags);
40     virtual ~VertexBuffer();
41 
42     void unmap();
43 
44     IDirect3DVertexBuffer9 *getBuffer() const;
45 
46   protected:
47     IDirect3DDevice9 *const mDevice;
48     IDirect3DVertexBuffer9 *mVertexBuffer;
49 
50   private:
51     DISALLOW_COPY_AND_ASSIGN(VertexBuffer);
52 };
53 
54 class ConstantVertexBuffer : public VertexBuffer
55 {
56   public:
57     ConstantVertexBuffer(IDirect3DDevice9 *device, float x, float y, float z, float w);
58     ~ConstantVertexBuffer();
59 };
60 
61 class ArrayVertexBuffer : public VertexBuffer
62 {
63   public:
64     ArrayVertexBuffer(IDirect3DDevice9 *device, UINT size, DWORD usageFlags);
65     ~ArrayVertexBuffer();
66 
size()67     UINT size() const { return mBufferSize; }
68     virtual void *map(const VertexAttribute &attribute, UINT requiredSpace, UINT *streamOffset) = 0;
69     virtual void reserveRequiredSpace() = 0;
70     void addRequiredSpace(UINT requiredSpace);
71     void addRequiredSpaceFor(ArrayVertexBuffer *buffer);
72 
73   protected:
74     UINT mBufferSize;
75     UINT mWritePosition;
76     UINT mRequiredSpace;
77 };
78 
79 class StreamingVertexBuffer : public ArrayVertexBuffer
80 {
81   public:
82     StreamingVertexBuffer(IDirect3DDevice9 *device, UINT initialSize);
83     ~StreamingVertexBuffer();
84 
85     void *map(const VertexAttribute &attribute, UINT requiredSpace, UINT *streamOffset);
86     void reserveRequiredSpace();
87 };
88 
89 class StaticVertexBuffer : public ArrayVertexBuffer
90 {
91   public:
92     explicit StaticVertexBuffer(IDirect3DDevice9 *device);
93     ~StaticVertexBuffer();
94 
95     void *map(const VertexAttribute &attribute, UINT requiredSpace, UINT *streamOffset);
96     void reserveRequiredSpace();
97 
98     UINT lookupAttribute(const VertexAttribute &attribute);   // Returns the offset into the vertex buffer, or -1 if not found
99 
100   private:
101     struct VertexElement
102     {
103         GLenum type;
104         GLint size;
105         bool normalized;
106         int attributeOffset;
107 
108         UINT streamOffset;
109     };
110 
111     std::vector<VertexElement> mCache;
112 };
113 
114 class VertexDataManager
115 {
116   public:
117     VertexDataManager(Context *context, IDirect3DDevice9 *backend);
118     virtual ~VertexDataManager();
119 
dirtyCurrentValue(int index)120     void dirtyCurrentValue(int index) { mDirtyCurrentValue[index] = true; }
121 
122     void setupAttributes(const TranslatedAttribute *attributes);
123     GLenum prepareVertexData(GLint start, GLsizei count, TranslatedAttribute *outAttribs);
124 
125   private:
126     DISALLOW_COPY_AND_ASSIGN(VertexDataManager);
127 
128     UINT spaceRequired(const VertexAttribute &attrib, std::size_t count) const;
129     UINT writeAttributeData(ArrayVertexBuffer *vertexBuffer, GLint start, GLsizei count, const VertexAttribute &attribute);
130 
131     Context *const mContext;
132     IDirect3DDevice9 *const mDevice;
133 
134     StreamingVertexBuffer *mStreamingBuffer;
135 
136     bool mDirtyCurrentValue[MAX_VERTEX_ATTRIBS];
137     ConstantVertexBuffer *mCurrentValueBuffer[MAX_VERTEX_ATTRIBS];
138 
139     // Attribute format conversion
140     struct FormatConverter
141     {
142         bool identity;
143         std::size_t outputElementSize;
144         void (*convertArray)(const void *in, std::size_t stride, std::size_t n, void *out);
145         D3DDECLTYPE d3dDeclType;
146     };
147 
148     enum { NUM_GL_VERTEX_ATTRIB_TYPES = 6 };
149 
150     FormatConverter mAttributeTypes[NUM_GL_VERTEX_ATTRIB_TYPES][2][4];   // [GL types as enumerated by typeIndex()][normalized][size - 1]
151 
152     struct TranslationDescription
153     {
154         DWORD capsFlag;
155         FormatConverter preferredConversion;
156         FormatConverter fallbackConversion;
157     };
158 
159     // This table is used to generate mAttributeTypes.
160     static const TranslationDescription mPossibleTranslations[NUM_GL_VERTEX_ATTRIB_TYPES][2][4]; // [GL types as enumerated by typeIndex()][normalized][size - 1]
161 
162     void checkVertexCaps(DWORD declTypes);
163 
164     unsigned int typeIndex(GLenum type) const;
165     const FormatConverter &formatConverter(const VertexAttribute &attribute) const;
166 };
167 
168 }
169 
170 #endif   // LIBGLESV2_GEOMETRY_VERTEXDATAMANAGER_H_
171