Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4358 | Serge | 1 | /* |
2 | * (C) Copyright IBM Corporation 2004, 2005 |
||
3 | * All Rights Reserved. |
||
4 | * |
||
5 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
6 | * copy of this software and associated documentation files (the "Software"), |
||
7 | * to deal in the Software without restriction, including without limitation |
||
8 | * the rights to use, copy, modify, merge, publish, distribute, sub license, |
||
9 | * and/or sell copies of the Software, and to permit persons to whom the |
||
10 | * Software is furnished to do so, subject to the following conditions: |
||
11 | * |
||
12 | * The above copyright notice and this permission notice (including the next |
||
13 | * paragraph) shall be included in all copies or substantial portions of the |
||
14 | * Software. |
||
15 | * |
||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL |
||
19 | * IBM, |
||
20 | * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
||
21 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF |
||
22 | * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||
23 | * SOFTWARE. |
||
24 | */ |
||
25 | |||
26 | #ifndef _INDIRECT_VA_PRIVATE_ |
||
27 | #define _INDIRECT_VA_PRIVATE_ |
||
28 | |||
29 | /** |
||
30 | * \file indirect_va_private.h |
||
31 | * |
||
32 | * \author Ian Romanick |
||
33 | */ |
||
34 | |||
35 | #include |
||
36 | |||
37 | #include "glxclient.h" |
||
38 | #include "indirect.h" |
||
39 | #include |
||
40 | |||
41 | |||
42 | /** |
||
43 | * State descriptor for a single array of vertex data. |
||
44 | */ |
||
45 | struct array_state |
||
46 | { |
||
47 | /** |
||
48 | * Pointer to the application supplied data. |
||
49 | */ |
||
50 | const void *data; |
||
51 | |||
52 | /** |
||
53 | * Enum representing the type of the application supplied data. |
||
54 | */ |
||
55 | GLenum data_type; |
||
56 | |||
57 | /** |
||
58 | * Stride value supplied by the application. This value is not used |
||
59 | * internally. It is only kept so that it can be queried by the |
||
60 | * application using glGet*v. |
||
61 | */ |
||
62 | GLsizei user_stride; |
||
63 | |||
64 | /** |
||
65 | * Calculated size, in bytes, of a single element in the array. This |
||
66 | * is calculated based on \c count and the size of the data type |
||
67 | * represented by \c data_type. |
||
68 | */ |
||
69 | GLsizei element_size; |
||
70 | |||
71 | /** |
||
72 | * Actual byte-stride from one element to the next. This value will |
||
73 | * be equal to either \c user_stride or \c element_stride. |
||
74 | */ |
||
75 | GLsizei true_stride; |
||
76 | |||
77 | /** |
||
78 | * Number of data values in each element. |
||
79 | */ |
||
80 | GLint count; |
||
81 | |||
82 | /** |
||
83 | * "Normalized" data is on the range [0,1] (unsigned) or [-1,1] (signed). |
||
84 | * This is used for mapping integral types to floating point types. |
||
85 | */ |
||
86 | GLboolean normalized; |
||
87 | |||
88 | /** |
||
89 | * Pre-calculated GLX protocol command header. |
||
90 | */ |
||
91 | uint32_t header[2]; |
||
92 | |||
93 | /** |
||
94 | * Size of the header data. For simple data, like glColorPointerfv, |
||
95 | * this is 4. For complex data that requires either a count (e.g., |
||
96 | * glWeightfvARB), an index (e.g., glVertexAttrib1fvARB), or a |
||
97 | * selector enum (e.g., glMultiTexCoord2fv) this is 8. |
||
98 | */ |
||
99 | unsigned header_size; |
||
100 | |||
101 | /** |
||
102 | * Set to \c GL_TRUE if this array is enabled. Otherwise, it is set |
||
103 | * to \c GL_FALSE. |
||
104 | */ |
||
105 | GLboolean enabled; |
||
106 | |||
107 | /** |
||
108 | * For multi-arrayed data (e.g., texture coordinates, generic vertex |
||
109 | * program attributes, etc.), this specifies which array this is. |
||
110 | */ |
||
111 | unsigned index; |
||
112 | |||
113 | /** |
||
114 | * Per-array-type key. For most arrays, this will be the GL enum for |
||
115 | * that array (e.g., GL_VERTEX_ARRAY for vertex data, GL_NORMAL_ARRAY |
||
116 | * for normal data, GL_TEXTURE_COORD_ARRAY for texture coordinate data, |
||
117 | * etc.). |
||
118 | */ |
||
119 | GLenum key; |
||
120 | |||
121 | /** |
||
122 | * If this array can be used with the "classic" \c glDrawArrays protocol, |
||
123 | * this is set to \c GL_TRUE. Otherwise, it is set to \c GL_FALSE. |
||
124 | */ |
||
125 | GLboolean old_DrawArrays_possible; |
||
126 | }; |
||
127 | |||
128 | |||
129 | /** |
||
130 | * Array state that is pushed / poped by \c glPushClientAttrib and |
||
131 | * \c glPopClientAttrib. |
||
132 | */ |
||
133 | struct array_stack_state |
||
134 | { |
||
135 | /** |
||
136 | * Pointer to the application supplied data. |
||
137 | */ |
||
138 | const void *data; |
||
139 | |||
140 | /** |
||
141 | * Enum representing the type of the application supplied data. |
||
142 | */ |
||
143 | GLenum data_type; |
||
144 | |||
145 | /** |
||
146 | * Stride value supplied by the application. This value is not used |
||
147 | * internally. It is only kept so that it can be queried by the |
||
148 | * application using glGet*v. |
||
149 | */ |
||
150 | GLsizei user_stride; |
||
151 | |||
152 | /** |
||
153 | * Number of data values in each element. |
||
154 | */ |
||
155 | GLint count; |
||
156 | |||
157 | /** |
||
158 | * Per-array-type key. For most arrays, this will be the GL enum for |
||
159 | * that array (e.g., GL_VERTEX_ARRAY for vertex data, GL_NORMAL_ARRAY |
||
160 | * for normal data, GL_TEXTURE_COORD_ARRAY for texture coordinate data, |
||
161 | * etc.). |
||
162 | */ |
||
163 | GLenum key; |
||
164 | |||
165 | /** |
||
166 | * For multi-arrayed data (e.g., texture coordinates, generic vertex |
||
167 | * program attributes, etc.), this specifies which array this is. |
||
168 | */ |
||
169 | unsigned index; |
||
170 | |||
171 | /** |
||
172 | * Set to \c GL_TRUE if this array is enabled. Otherwise, it is set |
||
173 | * to \c GL_FALSE. |
||
174 | */ |
||
175 | GLboolean enabled; |
||
176 | }; |
||
177 | |||
178 | |||
179 | /** |
||
180 | * Collection of all the vertex array state. |
||
181 | */ |
||
182 | struct array_state_vector |
||
183 | { |
||
184 | /** |
||
185 | * Number of arrays tracked by \c ::arrays. |
||
186 | */ |
||
187 | size_t num_arrays; |
||
188 | |||
189 | /** |
||
190 | * Array of vertex array state. This array contains all of the valid |
||
191 | * vertex arrays. If a vertex array isn't in this array, then it isn't |
||
192 | * valid. For example, if an implementation does not support |
||
193 | * EXT_fog_coord, there won't be a GL_FOG_COORD_ARRAY entry in this |
||
194 | * array. |
||
195 | */ |
||
196 | struct array_state *arrays; |
||
197 | |||
198 | /** |
||
199 | * Number of currently enabled client-side arrays. The value of this |
||
200 | * field is only valid if \c array_info_cache_valid is true. |
||
201 | */ |
||
202 | size_t enabled_client_array_count; |
||
203 | |||
204 | /** |
||
205 | * \name ARRAY_INFO cache. |
||
206 | * |
||
207 | * These fields track the state of the ARRAY_INFO cache. The |
||
208 | * \c array_info_cache_size is the size of the actual data stored in |
||
209 | * \c array_info_cache. \c array_info_cache_buffer_size is the size of |
||
210 | * the buffer. This will always be greater than or equal to |
||
211 | * \c array_info_cache_size. |
||
212 | * |
||
213 | * \note |
||
214 | * There are some bytes of extra data before \c array_info_cache that is |
||
215 | * used to hold the header for RenderLarge commands. This is |
||
216 | * \b not included in \c array_info_cache_size or |
||
217 | * \c array_info_cache_buffer_size. \c array_info_cache_base stores a |
||
218 | * pointer to the true start of the buffer (i.e., what malloc returned). |
||
219 | */ |
||
220 | /*@{ */ |
||
221 | size_t array_info_cache_size; |
||
222 | size_t array_info_cache_buffer_size; |
||
223 | void *array_info_cache; |
||
224 | void *array_info_cache_base; |
||
225 | /*@} */ |
||
226 | |||
227 | |||
228 | /** |
||
229 | * Is the cache of ARRAY_INFO data valid? The cache can become invalid |
||
230 | * when one of several state changes occur. Among these chages are |
||
231 | * modifying the array settings for an enabled array and enabling / |
||
232 | * disabling an array. |
||
233 | */ |
||
234 | GLboolean array_info_cache_valid; |
||
235 | |||
236 | /** |
||
237 | * Is it possible to use the GL 1.1 / EXT_vertex_arrays protocol? Use |
||
238 | * of this protocol is disabled with really old servers (i.e., servers |
||
239 | * that don't support GL 1.1 or EXT_vertex_arrays) or when an environment |
||
240 | * variable is set. |
||
241 | * |
||
242 | * \todo |
||
243 | * GL 1.1 and EXT_vertex_arrays use identical protocol, but have different |
||
244 | * opcodes for \c glDrawArrays. For servers that advertise one or the |
||
245 | * other, there should be a way to select which opcode to use. |
||
246 | */ |
||
247 | GLboolean old_DrawArrays_possible; |
||
248 | |||
249 | /** |
||
250 | * Is it possible to use the new GL X.X / ARB_vertex_buffer_object |
||
251 | * protocol? |
||
252 | * |
||
253 | * \todo |
||
254 | * This protocol has not yet been defined by the ARB, but is currently a |
||
255 | * work in progress. This field is a place-holder. |
||
256 | */ |
||
257 | GLboolean new_DrawArrays_possible; |
||
258 | |||
259 | /** |
||
260 | * Active texture unit set by \c glClientActiveTexture. |
||
261 | * |
||
262 | * \sa __glXGetActiveTextureUnit |
||
263 | */ |
||
264 | unsigned active_texture_unit; |
||
265 | |||
266 | /** |
||
267 | * Number of supported texture units. Even if ARB_multitexture / |
||
268 | * GL 1.3 are not supported, this will be at least 1. When multitexture |
||
269 | * is supported, this will be the value queried by calling |
||
270 | * \c glGetIntegerv with \c GL_MAX_TEXTURE_UNITS. |
||
271 | * |
||
272 | * \todo |
||
273 | * Investigate if this should be the value of \c GL_MAX_TEXTURE_COORDS |
||
274 | * instead (if GL 2.0 / ARB_fragment_shader / ARB_fragment_program / |
||
275 | * NV_fragment_program are supported). |
||
276 | */ |
||
277 | unsigned num_texture_units; |
||
278 | |||
279 | /** |
||
280 | * Number of generic vertex program attribs. If GL_ARB_vertex_program |
||
281 | * is not supported, this will be zero. Otherwise it will be the value |
||
282 | * queries by calling \c glGetProgramiv with \c GL_VERTEX_PROGRAM_ARB |
||
283 | * and \c GL_MAX_PROGRAM_ATTRIBS_ARB. |
||
284 | */ |
||
285 | unsigned num_vertex_program_attribs; |
||
286 | |||
287 | /** |
||
288 | * \n Methods for implementing various GL functions. |
||
289 | * |
||
290 | * These method pointers are only valid \c array_info_cache_valid is set. |
||
291 | * When each function starts, it much check \c array_info_cache_valid. |
||
292 | * If it is not set, it must call \c fill_array_info_cache and call |
||
293 | * the new method. |
||
294 | * |
||
295 | * \sa fill_array_info_cache |
||
296 | * |
||
297 | * \todo |
||
298 | * Write code to plug these functions directly into the dispatch table. |
||
299 | */ |
||
300 | /*@{ */ |
||
301 | void (*DrawArrays) (GLenum, GLint, GLsizei); |
||
302 | void (*DrawElements) (GLenum mode, GLsizei count, GLenum type, |
||
303 | const GLvoid * indices); |
||
304 | /*@} */ |
||
305 | |||
306 | struct array_stack_state *stack; |
||
307 | unsigned active_texture_unit_stack[__GL_CLIENT_ATTRIB_STACK_DEPTH]; |
||
308 | unsigned stack_index; |
||
309 | }; |
||
310 | |||
311 | #endif /* _INDIRECT_VA_PRIVATE_ */ |