• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef GPU_COMMAND_BUFFER_SERVICE_VERTEX_ATTRIB_MANAGER_H_
6 #define GPU_COMMAND_BUFFER_SERVICE_VERTEX_ATTRIB_MANAGER_H_
7 
8 #include <list>
9 #include <vector>
10 #include "base/logging.h"
11 #include "base/memory/ref_counted.h"
12 #include "build/build_config.h"
13 #include "gpu/command_buffer/service/buffer_manager.h"
14 #include "gpu/command_buffer/service/gl_utils.h"
15 #include "gpu/gpu_export.h"
16 
17 namespace gpu {
18 namespace gles2 {
19 
20 class FeatureInfo;
21 class GLES2Decoder;
22 class Program;
23 class VertexArrayManager;
24 
25 // Info about a Vertex Attribute. This is used to track what the user currently
26 // has bound on each Vertex Attribute so that checking can be done at
27 // glDrawXXX time.
28 class GPU_EXPORT VertexAttrib {
29  public:
30   typedef std::list<VertexAttrib*> VertexAttribList;
31 
32   VertexAttrib();
33   ~VertexAttrib();
34 
35   // Returns true if this VertexAttrib can access index.
36   bool CanAccess(GLuint index) const;
37 
buffer()38   Buffer* buffer() const { return buffer_.get(); }
39 
offset()40   GLsizei offset() const {
41     return offset_;
42   }
43 
index()44   GLuint index() const {
45     return index_;
46   }
47 
size()48   GLint size() const {
49     return size_;
50   }
51 
type()52   GLenum type() const {
53     return type_;
54   }
55 
normalized()56   GLboolean normalized() const {
57     return normalized_;
58   }
59 
gl_stride()60   GLsizei gl_stride() const {
61     return gl_stride_;
62   }
63 
divisor()64   GLuint divisor() const {
65     return divisor_;
66   }
67 
enabled()68   bool enabled() const {
69     return enabled_;
70   }
71 
72   // Find the maximum vertex accessed, accounting for instancing.
MaxVertexAccessed(GLsizei primcount,GLuint max_vertex_accessed)73   GLuint MaxVertexAccessed(GLsizei primcount,
74                            GLuint max_vertex_accessed) const {
75     return (primcount && divisor_) ? ((primcount - 1) / divisor_) :
76                                      max_vertex_accessed;
77   }
78 
is_client_side_array()79   bool is_client_side_array() const {
80     return is_client_side_array_;
81   }
82 
set_is_client_side_array(bool value)83   void set_is_client_side_array(bool value) {
84     is_client_side_array_ = value;
85   }
86 
87  private:
88   friend class VertexAttribManager;
89 
set_enabled(bool enabled)90   void set_enabled(bool enabled) {
91     enabled_ = enabled;
92   }
93 
set_index(GLuint index)94   void set_index(GLuint index) {
95     index_ = index;
96   }
97 
SetList(VertexAttribList * new_list)98   void SetList(VertexAttribList* new_list) {
99     DCHECK(new_list);
100 
101     if (list_) {
102       list_->erase(it_);
103     }
104 
105     it_ = new_list->insert(new_list->end(), this);
106     list_ = new_list;
107   }
108 
109   void SetInfo(
110       Buffer* buffer,
111       GLint size,
112       GLenum type,
113       GLboolean normalized,
114       GLsizei gl_stride,
115       GLsizei real_stride,
116       GLsizei offset);
117 
SetDivisor(GLsizei divisor)118   void SetDivisor(GLsizei divisor) {
119     divisor_ = divisor;
120   }
121 
122   void Unbind(Buffer* buffer);
123 
124   // The index of this attrib.
125   GLuint index_;
126 
127   // Whether or not this attribute is enabled.
128   bool enabled_;
129 
130   // number of components (1, 2, 3, 4)
131   GLint size_;
132 
133   // GL_BYTE, GL_FLOAT, etc. See glVertexAttribPointer.
134   GLenum type_;
135 
136   // The offset into the buffer.
137   GLsizei offset_;
138 
139   GLboolean normalized_;
140 
141   // The stride passed to glVertexAttribPointer.
142   GLsizei gl_stride_;
143 
144   // The stride that will be used to access the buffer. This is the actual
145   // stide, NOT the GL bogus stride. In other words there is never a stride
146   // of 0.
147   GLsizei real_stride_;
148 
149   GLsizei divisor_;
150 
151   // Will be true if this was assigned to a client side array.
152   bool is_client_side_array_;
153 
154   // The buffer bound to this attribute.
155   scoped_refptr<Buffer> buffer_;
156 
157   // List this info is on.
158   VertexAttribList* list_;
159 
160   // Iterator for list this info is on. Enabled/Disabled
161   VertexAttribList::iterator it_;
162 };
163 
164 // Manages vertex attributes.
165 // This class also acts as the service-side representation of a
166 // vertex array object and it's contained state.
167 class GPU_EXPORT VertexAttribManager :
168     public base::RefCounted<VertexAttribManager> {
169  public:
170   typedef std::list<VertexAttrib*> VertexAttribList;
171 
172   VertexAttribManager();
173 
174   void Initialize(uint32 num_vertex_attribs, bool init_attribs);
175 
176   bool Enable(GLuint index, bool enable);
177 
HaveFixedAttribs()178   bool HaveFixedAttribs() const {
179     return num_fixed_attribs_ != 0;
180   }
181 
GetEnabledVertexAttribs()182   const VertexAttribList& GetEnabledVertexAttribs() const {
183     return enabled_vertex_attribs_;
184   }
185 
GetVertexAttrib(GLuint index)186   VertexAttrib* GetVertexAttrib(GLuint index) {
187     if (index < vertex_attribs_.size()) {
188       return &vertex_attribs_[index];
189     }
190     return NULL;
191   }
192 
SetAttribInfo(GLuint index,Buffer * buffer,GLint size,GLenum type,GLboolean normalized,GLsizei gl_stride,GLsizei real_stride,GLsizei offset)193   void SetAttribInfo(
194       GLuint index,
195       Buffer* buffer,
196       GLint size,
197       GLenum type,
198       GLboolean normalized,
199       GLsizei gl_stride,
200       GLsizei real_stride,
201       GLsizei offset) {
202     VertexAttrib* attrib = GetVertexAttrib(index);
203     if (attrib) {
204       if (attrib->type() == GL_FIXED) {
205         --num_fixed_attribs_;
206       }
207       if (type == GL_FIXED) {
208         ++num_fixed_attribs_;
209       }
210       attrib->SetInfo(
211           buffer, size, type, normalized, gl_stride, real_stride, offset);
212     }
213   }
214 
SetDivisor(GLuint index,GLuint divisor)215   void SetDivisor(GLuint index, GLuint divisor) {
216     VertexAttrib* attrib = GetVertexAttrib(index);
217     if (attrib) {
218       attrib->SetDivisor(divisor);
219     }
220   }
221 
222   void SetElementArrayBuffer(Buffer* buffer);
223 
element_array_buffer()224   Buffer* element_array_buffer() const { return element_array_buffer_.get(); }
225 
service_id()226   GLuint service_id() const {
227     return service_id_;
228   }
229 
230   void Unbind(Buffer* buffer);
231 
IsDeleted()232   bool IsDeleted() const {
233     return deleted_;
234   }
235 
IsValid()236   bool IsValid() const {
237     return !IsDeleted();
238   }
239 
num_attribs()240   size_t num_attribs() const {
241     return vertex_attribs_.size();
242   }
243 
244   bool ValidateBindings(
245       const char* function_name,
246       GLES2Decoder* decoder,
247       FeatureInfo* feature_info,
248       Program* current_program,
249       GLuint max_vertex_accessed,
250       GLsizei primcount);
251 
252  private:
253   friend class VertexArrayManager;
254   friend class VertexArrayManagerTest;
255   friend class base::RefCounted<VertexAttribManager>;
256 
257   // Used when creating from a VertexArrayManager
258   VertexAttribManager(VertexArrayManager* manager, GLuint service_id,
259       uint32 num_vertex_attribs);
260 
261   ~VertexAttribManager();
262 
MarkAsDeleted()263   void MarkAsDeleted() {
264     deleted_ = true;
265   }
266 
267   // number of attribs using type GL_FIXED.
268   int num_fixed_attribs_;
269 
270   // Info for each vertex attribute saved so we can check at glDrawXXX time
271   // if it is safe to draw.
272   std::vector<VertexAttrib> vertex_attribs_;
273 
274   // The currently bound element array buffer. If this is 0 it is illegal
275   // to call glDrawElements.
276   scoped_refptr<Buffer> element_array_buffer_;
277 
278   // Lists for which vertex attribs are enabled, disabled.
279   VertexAttribList enabled_vertex_attribs_;
280   VertexAttribList disabled_vertex_attribs_;
281 
282   // The VertexArrayManager that owns this VertexAttribManager
283   VertexArrayManager* manager_;
284 
285   // True if deleted.
286   bool deleted_;
287 
288   // Service side vertex array object id.
289   GLuint service_id_;
290 };
291 
292 }  // namespace gles2
293 }  // namespace gpu
294 
295 #endif  // GPU_COMMAND_BUFFER_SERVICE_VERTEX_ATTRIB_MANAGER_H_
296 
297