• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Mesa 3-D graphics library
3  *
4  * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
5  * (C) Copyright IBM Corporation 2006
6  * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a
9  * copy of this software and associated documentation files (the "Software"),
10  * to deal in the Software without restriction, including without limitation
11  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12  * and/or sell copies of the Software, and to permit persons to whom the
13  * Software is furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included
16  * in all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
22  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24  * OTHER DEALINGS IN THE SOFTWARE.
25  */
26 
27 #ifndef ARRAYOBJ_H
28 #define ARRAYOBJ_H
29 
30 #include "glheader.h"
31 #include "mtypes.h"
32 #include "glformats.h"
33 #include "vbo/vbo.h"
34 
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38 
39 struct gl_context;
40 
41 /**
42  * \file arrayobj.h
43  * Functions for the GL_ARB_vertex_array_object extension.
44  *
45  * \author Ian Romanick <idr@us.ibm.com>
46  * \author Brian Paul
47  */
48 
49 /*
50  * Internal functions
51  */
52 
53 extern struct gl_vertex_array_object *
54 _mesa_lookup_vao(struct gl_context *ctx, GLuint id);
55 
56 extern struct gl_vertex_array_object *
57 _mesa_lookup_vao_err(struct gl_context *ctx, GLuint id,
58                      bool is_ext_dsa, const char *caller);
59 
60 extern struct gl_vertex_array_object *
61 _mesa_new_vao(struct gl_context *ctx, GLuint name);
62 
63 extern void
64 _mesa_unbind_array_object_vbos(struct gl_context *ctx,
65                                struct gl_vertex_array_object *obj);
66 
67 extern void
68 _mesa_delete_vao(struct gl_context *ctx, struct gl_vertex_array_object *obj);
69 
70 extern void
71 _mesa_reference_vao_(struct gl_context *ctx,
72                      struct gl_vertex_array_object **ptr,
73                      struct gl_vertex_array_object *vao);
74 
75 static inline void
_mesa_reference_vao(struct gl_context * ctx,struct gl_vertex_array_object ** ptr,struct gl_vertex_array_object * vao)76 _mesa_reference_vao(struct gl_context *ctx,
77                     struct gl_vertex_array_object **ptr,
78                     struct gl_vertex_array_object *vao)
79 {
80    if (*ptr != vao)
81       _mesa_reference_vao_(ctx, ptr, vao);
82 }
83 
84 
85 extern void
86 _mesa_initialize_vao(struct gl_context *ctx,
87                      struct gl_vertex_array_object *obj, GLuint name);
88 
89 
90 extern void
91 _mesa_update_vao_derived_arrays(struct gl_context *ctx,
92                                 struct gl_vertex_array_object *vao);
93 
94 
95 /**
96  * Mark the vao as shared and immutable, do remaining updates.
97  */
98 extern void
99 _mesa_set_vao_immutable(struct gl_context *ctx,
100                         struct gl_vertex_array_object *vao);
101 
102 
103 extern void
104 _mesa_vao_map_arrays(struct gl_context *ctx, struct gl_vertex_array_object *vao,
105                      GLbitfield access);
106 
107 extern void
108 _mesa_vao_map(struct gl_context *ctx, struct gl_vertex_array_object *vao,
109               GLbitfield access);
110 
111 
112 extern void
113 _mesa_vao_unmap_arrays(struct gl_context *ctx,
114                        struct gl_vertex_array_object *vao);
115 
116 extern void
117 _mesa_vao_unmap(struct gl_context *ctx,
118                 struct gl_vertex_array_object *vao);
119 
120 
121 /**
122  * Array to apply the position/generic0 aliasing map to
123  * an attribute value used in vertex processing inputs to an attribute
124  * as they appear in the vao.
125  */
126 extern const GLubyte
127 _mesa_vao_attribute_map[ATTRIBUTE_MAP_MODE_MAX][VERT_ATTRIB_MAX];
128 
129 
130 /**
131  * Apply the position/generic0 aliasing map to a bitfield from the vao.
132  * Use for example to convert gl_vertex_array_object::Enabled
133  * or gl_vertex_buffer_binding::_VertexBinding from the vao numbering to
134  * the numbering used with vertex processing inputs.
135  */
136 static inline GLbitfield
_mesa_vao_enable_to_vp_inputs(gl_attribute_map_mode mode,GLbitfield enabled)137 _mesa_vao_enable_to_vp_inputs(gl_attribute_map_mode mode, GLbitfield enabled)
138 {
139    switch (mode) {
140    case ATTRIBUTE_MAP_MODE_IDENTITY:
141       return enabled;
142    case ATTRIBUTE_MAP_MODE_POSITION:
143       /* Copy VERT_ATTRIB_POS enable bit into GENERIC0 position */
144       return (enabled & ~VERT_BIT_GENERIC0)
145          | ((enabled & VERT_BIT_POS) << VERT_ATTRIB_GENERIC0);
146    case ATTRIBUTE_MAP_MODE_GENERIC0:
147       /* Copy VERT_ATTRIB_GENERIC0 enable bit into POS position */
148       return (enabled & ~VERT_BIT_POS)
149          | ((enabled & VERT_BIT_GENERIC0) >> VERT_ATTRIB_GENERIC0);
150    default:
151       return 0;
152    }
153 }
154 
155 
156 /**
157  * Helper functions for consuming backends to walk the
158  * ctx->Array._DrawVAO for driver side array setup.
159  * Note that mesa provides preprocessed minimal binding information
160  * in the VAO. See _mesa_update_vao_derived_arrays for documentation.
161  */
162 
163 /**
164  * Return enabled vertex attribute bits for draw.
165  */
166 static inline GLbitfield
_mesa_draw_array_bits(const struct gl_context * ctx)167 _mesa_draw_array_bits(const struct gl_context *ctx)
168 {
169    return ctx->Array._DrawVAOEnabledAttribs;
170 }
171 
172 
173 /**
174  * Return enabled buffer object vertex attribute bits for draw.
175  *
176  * Needs the a fully updated VAO ready for draw.
177  */
178 static inline GLbitfield
_mesa_draw_vbo_array_bits(const struct gl_context * ctx)179 _mesa_draw_vbo_array_bits(const struct gl_context *ctx)
180 {
181    const struct gl_vertex_array_object *const vao = ctx->Array._DrawVAO;
182    assert(!vao->NewVertexBuffers && !vao->NewVertexElements);
183    return vao->_EffEnabledVBO & ctx->Array._DrawVAOEnabledAttribs;
184 }
185 
186 
187 /**
188  * Return enabled user space vertex attribute bits for draw.
189  *
190  * Needs the a fully updated VAO ready for draw.
191  */
192 static inline GLbitfield
_mesa_draw_user_array_bits(const struct gl_context * ctx)193 _mesa_draw_user_array_bits(const struct gl_context *ctx)
194 {
195    const struct gl_vertex_array_object *const vao = ctx->Array._DrawVAO;
196    assert(!vao->NewVertexBuffers && !vao->NewVertexElements);
197    return ~vao->_EffEnabledVBO & ctx->Array._DrawVAOEnabledAttribs;
198 }
199 
200 
201 /**
202  * Return which enabled vertex attributes have a non-zero instance divisor.
203  *
204  * Needs the a fully updated VAO ready for draw.
205  */
206 static inline GLbitfield
_mesa_draw_nonzero_divisor_bits(const struct gl_context * ctx)207 _mesa_draw_nonzero_divisor_bits(const struct gl_context *ctx)
208 {
209    const struct gl_vertex_array_object *const vao = ctx->Array._DrawVAO;
210    assert(!vao->NewVertexBuffers && !vao->NewVertexElements);
211    return vao->_EffEnabledNonZeroDivisor & ctx->Array._DrawVAOEnabledAttribs;
212 }
213 
214 
215 /**
216  * Return enabled current values attribute bits for draw.
217  */
218 static inline GLbitfield
_mesa_draw_current_bits(const struct gl_context * ctx)219 _mesa_draw_current_bits(const struct gl_context *ctx)
220 {
221    return ~ctx->Array._DrawVAOEnabledAttribs & VERT_BIT_ALL;
222 }
223 
224 
225 /**
226  * Return vertex buffer binding provided the attribute struct.
227  *
228  * Needs the a fully updated VAO ready for draw.
229  */
230 static inline const struct gl_vertex_buffer_binding*
_mesa_draw_buffer_binding_from_attrib(const struct gl_vertex_array_object * vao,const struct gl_array_attributes * attrib)231 _mesa_draw_buffer_binding_from_attrib(const struct gl_vertex_array_object *vao,
232                                       const struct gl_array_attributes *attrib)
233 {
234    assert(!vao->NewVertexBuffers && !vao->NewVertexElements);
235    return &vao->BufferBinding[attrib->_EffBufferBindingIndex];
236 }
237 
238 
239 /**
240  * Return vertex array attribute provided the attribute number.
241  */
242 static inline const struct gl_array_attributes*
_mesa_draw_array_attrib(const struct gl_vertex_array_object * vao,gl_vert_attrib attr)243 _mesa_draw_array_attrib(const struct gl_vertex_array_object *vao,
244                         gl_vert_attrib attr)
245 {
246    assert(!vao->NewVertexBuffers && !vao->NewVertexElements);
247    const gl_attribute_map_mode map_mode = vao->_AttributeMapMode;
248    return &vao->VertexAttrib[_mesa_vao_attribute_map[map_mode][attr]];
249 }
250 
251 
252 /**
253  * Return a vertex array vertex format provided the attribute number.
254  */
255 static inline const struct gl_vertex_format *
_mesa_draw_array_format(const struct gl_vertex_array_object * vao,gl_vert_attrib attr)256 _mesa_draw_array_format(const struct gl_vertex_array_object *vao,
257                         gl_vert_attrib attr)
258 {
259    return &_mesa_draw_array_attrib(vao, attr)->Format;
260 }
261 
262 
263 /**
264  * Return vertex buffer binding provided an attribute number.
265  */
266 static inline const struct gl_vertex_buffer_binding*
_mesa_draw_buffer_binding(const struct gl_vertex_array_object * vao,gl_vert_attrib attr)267 _mesa_draw_buffer_binding(const struct gl_vertex_array_object *vao,
268                           gl_vert_attrib attr)
269 {
270    const struct gl_array_attributes *const attrib
271       = _mesa_draw_array_attrib(vao, attr);
272    return _mesa_draw_buffer_binding_from_attrib(vao, attrib);
273 }
274 
275 
276 /**
277  * Return vertex attribute bits bound at the provided binding.
278  *
279  * Needs the a fully updated VAO ready for draw.
280  */
281 static inline GLbitfield
_mesa_draw_bound_attrib_bits(const struct gl_vertex_buffer_binding * binding)282 _mesa_draw_bound_attrib_bits(const struct gl_vertex_buffer_binding *binding)
283 {
284    return binding->_EffBoundArrays;
285 }
286 
287 
288 /**
289  * Return the vertex offset bound at the provided binding.
290  *
291  * Needs the a fully updated VAO ready for draw.
292  */
293 static inline GLintptr
_mesa_draw_binding_offset(const struct gl_vertex_buffer_binding * binding)294 _mesa_draw_binding_offset(const struct gl_vertex_buffer_binding *binding)
295 {
296    return binding->_EffOffset;
297 }
298 
299 
300 /**
301  * Return the relative offset of the provided attrib.
302  *
303  * Needs the a fully updated VAO ready for draw.
304  */
305 static inline GLushort
_mesa_draw_attributes_relative_offset(const struct gl_array_attributes * attrib)306 _mesa_draw_attributes_relative_offset(const struct gl_array_attributes *attrib)
307 {
308    return attrib->_EffRelativeOffset;
309 }
310 
311 
312 /**
313  * Return a current value vertex array attribute provided the attribute number.
314  */
315 static inline const struct gl_array_attributes*
_mesa_draw_current_attrib(const struct gl_context * ctx,gl_vert_attrib attr)316 _mesa_draw_current_attrib(const struct gl_context *ctx, gl_vert_attrib attr)
317 {
318    return _vbo_current_attrib(ctx, attr);
319 }
320 
321 
322 /**
323  * Return a current value vertex format provided the attribute number.
324  */
325 static inline const struct gl_vertex_format *
_mesa_draw_current_format(const struct gl_context * ctx,gl_vert_attrib attr)326 _mesa_draw_current_format(const struct gl_context *ctx, gl_vert_attrib attr)
327 {
328    return &_vbo_current_attrib(ctx, attr)->Format;
329 }
330 
331 
332 /**
333  * Return true if we have the VERT_ATTRIB_EDGEFLAG array enabled.
334  */
335 static inline bool
_mesa_draw_edge_flag_array_enabled(const struct gl_context * ctx)336 _mesa_draw_edge_flag_array_enabled(const struct gl_context *ctx)
337 {
338    return ctx->Array._DrawVAOEnabledAttribs & VERT_BIT_EDGEFLAG;
339 }
340 
341 
342 #ifdef __cplusplus
343 }
344 #endif
345 
346 #endif /* ARRAYOBJ_H */
347