Rev 4358 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4358 | Serge | 1 | /* |
2 | * Mesa 3-D graphics library |
||
3 | * |
||
4 | * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. |
||
5 | * Copyright (C) 2009 VMware, Inc. All Rights Reserved. |
||
6 | * |
||
7 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
8 | * copy of this software and associated documentation files (the "Software"), |
||
9 | * to deal in the Software without restriction, including without limitation |
||
10 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
11 | * and/or sell copies of the Software, and to permit persons to whom the |
||
12 | * Software is furnished to do so, subject to the following conditions: |
||
13 | * |
||
14 | * The above copyright notice and this permission notice shall be included |
||
15 | * in all copies or substantial portions of the Software. |
||
16 | * |
||
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||
18 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||
20 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
||
21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||
22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
||
23 | * OTHER DEALINGS IN THE SOFTWARE. |
||
24 | */ |
||
25 | |||
26 | /** |
||
27 | * \file mtypes.h |
||
28 | * Main Mesa data structures. |
||
29 | * |
||
30 | * Please try to mark derived values with a leading underscore ('_'). |
||
31 | */ |
||
32 | |||
33 | #ifndef MTYPES_H |
||
34 | #define MTYPES_H |
||
35 | |||
36 | |||
37 | #include "main/glheader.h" |
||
38 | #include "main/config.h" |
||
39 | #include "glapi/glapi.h" |
||
40 | #include "math/m_matrix.h" /* GLmatrix */ |
||
41 | #include "main/simple_list.h" /* struct simple_node */ |
||
42 | #include "main/formats.h" /* MESA_FORMAT_COUNT */ |
||
43 | |||
44 | |||
45 | #ifdef __cplusplus |
||
46 | extern "C" { |
||
47 | #endif |
||
48 | |||
49 | |||
50 | /** |
||
51 | * \name 64-bit extension of GLbitfield. |
||
52 | */ |
||
53 | /*@{*/ |
||
54 | typedef GLuint64 GLbitfield64; |
||
55 | |||
56 | /** Set a single bit */ |
||
57 | #define BITFIELD64_BIT(b) ((GLbitfield64)1 << (b)) |
||
58 | /** Set all bits up to excluding bit b */ |
||
59 | #define BITFIELD64_MASK(b) \ |
||
60 | ((b) == 64 ? (~(GLbitfield64)0) : BITFIELD64_BIT(b) - 1) |
||
61 | /** Set count bits starting from bit b */ |
||
62 | #define BITFIELD64_RANGE(b, count) \ |
||
63 | (BITFIELD64_MASK((b) + (count)) & ~BITFIELD64_MASK(b)) |
||
64 | |||
65 | |||
66 | /** |
||
67 | * \name Some forward type declarations |
||
68 | */ |
||
69 | /*@{*/ |
||
70 | struct _mesa_HashTable; |
||
71 | struct gl_attrib_node; |
||
72 | struct gl_list_extensions; |
||
73 | struct gl_meta_state; |
||
74 | struct gl_program_cache; |
||
75 | struct gl_texture_object; |
||
76 | struct gl_context; |
||
77 | struct st_context; |
||
78 | struct gl_uniform_storage; |
||
79 | struct prog_instruction; |
||
80 | struct gl_program_parameter_list; |
||
81 | struct set; |
||
82 | struct set_entry; |
||
83 | /*@}*/ |
||
84 | |||
85 | |||
86 | /** Extra draw modes beyond GL_POINTS, GL_TRIANGLE_FAN, etc */ |
||
87 | #define PRIM_MAX GL_TRIANGLE_STRIP_ADJACENCY |
||
88 | #define PRIM_OUTSIDE_BEGIN_END (PRIM_MAX + 1) |
||
89 | #define PRIM_UNKNOWN (PRIM_MAX + 2) |
||
90 | |||
91 | |||
92 | |||
93 | /** |
||
94 | * Indexes for vertex program attributes. |
||
95 | * GL_NV_vertex_program aliases generic attributes over the conventional |
||
96 | * attributes. In GL_ARB_vertex_program shader the aliasing is optional. |
||
97 | * In GL_ARB_vertex_shader / OpenGL 2.0 the aliasing is disallowed (the |
||
98 | * generic attributes are distinct/separate). |
||
99 | */ |
||
100 | typedef enum |
||
101 | { |
||
102 | VERT_ATTRIB_POS = 0, |
||
103 | VERT_ATTRIB_WEIGHT = 1, |
||
104 | VERT_ATTRIB_NORMAL = 2, |
||
105 | VERT_ATTRIB_COLOR0 = 3, |
||
106 | VERT_ATTRIB_COLOR1 = 4, |
||
107 | VERT_ATTRIB_FOG = 5, |
||
108 | VERT_ATTRIB_COLOR_INDEX = 6, |
||
109 | VERT_ATTRIB_EDGEFLAG = 7, |
||
110 | VERT_ATTRIB_TEX0 = 8, |
||
111 | VERT_ATTRIB_TEX1 = 9, |
||
112 | VERT_ATTRIB_TEX2 = 10, |
||
113 | VERT_ATTRIB_TEX3 = 11, |
||
114 | VERT_ATTRIB_TEX4 = 12, |
||
115 | VERT_ATTRIB_TEX5 = 13, |
||
116 | VERT_ATTRIB_TEX6 = 14, |
||
117 | VERT_ATTRIB_TEX7 = 15, |
||
118 | VERT_ATTRIB_POINT_SIZE = 16, |
||
119 | VERT_ATTRIB_GENERIC0 = 17, |
||
120 | VERT_ATTRIB_GENERIC1 = 18, |
||
121 | VERT_ATTRIB_GENERIC2 = 19, |
||
122 | VERT_ATTRIB_GENERIC3 = 20, |
||
123 | VERT_ATTRIB_GENERIC4 = 21, |
||
124 | VERT_ATTRIB_GENERIC5 = 22, |
||
125 | VERT_ATTRIB_GENERIC6 = 23, |
||
126 | VERT_ATTRIB_GENERIC7 = 24, |
||
127 | VERT_ATTRIB_GENERIC8 = 25, |
||
128 | VERT_ATTRIB_GENERIC9 = 26, |
||
129 | VERT_ATTRIB_GENERIC10 = 27, |
||
130 | VERT_ATTRIB_GENERIC11 = 28, |
||
131 | VERT_ATTRIB_GENERIC12 = 29, |
||
132 | VERT_ATTRIB_GENERIC13 = 30, |
||
133 | VERT_ATTRIB_GENERIC14 = 31, |
||
134 | VERT_ATTRIB_GENERIC15 = 32, |
||
135 | VERT_ATTRIB_MAX = 33 |
||
136 | } gl_vert_attrib; |
||
137 | |||
138 | /** |
||
139 | * Symbolic constats to help iterating over |
||
140 | * specific blocks of vertex attributes. |
||
141 | * |
||
142 | * VERT_ATTRIB_FF |
||
143 | * includes all fixed function attributes as well as |
||
144 | * the aliased GL_NV_vertex_program shader attributes. |
||
145 | * VERT_ATTRIB_TEX |
||
146 | * include the classic texture coordinate attributes. |
||
147 | * Is a subset of VERT_ATTRIB_FF. |
||
148 | * VERT_ATTRIB_GENERIC |
||
149 | * include the OpenGL 2.0+ GLSL generic shader attributes. |
||
150 | * These alias the generic GL_ARB_vertex_shader attributes. |
||
151 | */ |
||
152 | #define VERT_ATTRIB_FF(i) (VERT_ATTRIB_POS + (i)) |
||
153 | #define VERT_ATTRIB_FF_MAX VERT_ATTRIB_GENERIC0 |
||
154 | |||
155 | #define VERT_ATTRIB_TEX(i) (VERT_ATTRIB_TEX0 + (i)) |
||
156 | #define VERT_ATTRIB_TEX_MAX MAX_TEXTURE_COORD_UNITS |
||
157 | |||
158 | #define VERT_ATTRIB_GENERIC(i) (VERT_ATTRIB_GENERIC0 + (i)) |
||
159 | #define VERT_ATTRIB_GENERIC_MAX MAX_VERTEX_GENERIC_ATTRIBS |
||
160 | |||
161 | /** |
||
162 | * Bitflags for vertex attributes. |
||
163 | * These are used in bitfields in many places. |
||
164 | */ |
||
165 | /*@{*/ |
||
166 | #define VERT_BIT_POS BITFIELD64_BIT(VERT_ATTRIB_POS) |
||
167 | #define VERT_BIT_WEIGHT BITFIELD64_BIT(VERT_ATTRIB_WEIGHT) |
||
168 | #define VERT_BIT_NORMAL BITFIELD64_BIT(VERT_ATTRIB_NORMAL) |
||
169 | #define VERT_BIT_COLOR0 BITFIELD64_BIT(VERT_ATTRIB_COLOR0) |
||
170 | #define VERT_BIT_COLOR1 BITFIELD64_BIT(VERT_ATTRIB_COLOR1) |
||
171 | #define VERT_BIT_FOG BITFIELD64_BIT(VERT_ATTRIB_FOG) |
||
172 | #define VERT_BIT_COLOR_INDEX BITFIELD64_BIT(VERT_ATTRIB_COLOR_INDEX) |
||
173 | #define VERT_BIT_EDGEFLAG BITFIELD64_BIT(VERT_ATTRIB_EDGEFLAG) |
||
174 | #define VERT_BIT_TEX0 BITFIELD64_BIT(VERT_ATTRIB_TEX0) |
||
175 | #define VERT_BIT_TEX1 BITFIELD64_BIT(VERT_ATTRIB_TEX1) |
||
176 | #define VERT_BIT_TEX2 BITFIELD64_BIT(VERT_ATTRIB_TEX2) |
||
177 | #define VERT_BIT_TEX3 BITFIELD64_BIT(VERT_ATTRIB_TEX3) |
||
178 | #define VERT_BIT_TEX4 BITFIELD64_BIT(VERT_ATTRIB_TEX4) |
||
179 | #define VERT_BIT_TEX5 BITFIELD64_BIT(VERT_ATTRIB_TEX5) |
||
180 | #define VERT_BIT_TEX6 BITFIELD64_BIT(VERT_ATTRIB_TEX6) |
||
181 | #define VERT_BIT_TEX7 BITFIELD64_BIT(VERT_ATTRIB_TEX7) |
||
182 | #define VERT_BIT_POINT_SIZE BITFIELD64_BIT(VERT_ATTRIB_POINT_SIZE) |
||
183 | #define VERT_BIT_GENERIC0 BITFIELD64_BIT(VERT_ATTRIB_GENERIC0) |
||
184 | |||
185 | #define VERT_BIT(i) BITFIELD64_BIT(i) |
||
186 | #define VERT_BIT_ALL BITFIELD64_RANGE(0, VERT_ATTRIB_MAX) |
||
187 | |||
188 | #define VERT_BIT_FF(i) VERT_BIT(i) |
||
189 | #define VERT_BIT_FF_ALL BITFIELD64_RANGE(0, VERT_ATTRIB_FF_MAX) |
||
190 | #define VERT_BIT_TEX(i) VERT_BIT(VERT_ATTRIB_TEX(i)) |
||
191 | #define VERT_BIT_TEX_ALL \ |
||
192 | BITFIELD64_RANGE(VERT_ATTRIB_TEX(0), VERT_ATTRIB_TEX_MAX) |
||
193 | |||
194 | #define VERT_BIT_GENERIC(i) VERT_BIT(VERT_ATTRIB_GENERIC(i)) |
||
195 | #define VERT_BIT_GENERIC_ALL \ |
||
196 | BITFIELD64_RANGE(VERT_ATTRIB_GENERIC(0), VERT_ATTRIB_GENERIC_MAX) |
||
197 | /*@}*/ |
||
198 | |||
199 | |||
200 | /** |
||
201 | * Indexes for vertex shader outputs, geometry shader inputs/outputs, and |
||
202 | * fragment shader inputs. |
||
203 | * |
||
204 | * Note that some of these values are not available to all pipeline stages. |
||
205 | * |
||
206 | * When this enum is updated, the following code must be updated too: |
||
207 | * - vertResults (in prog_print.c's arb_output_attrib_string()) |
||
208 | * - fragAttribs (in prog_print.c's arb_input_attrib_string()) |
||
209 | * - _mesa_varying_slot_in_fs() |
||
210 | */ |
||
211 | typedef enum |
||
212 | { |
||
213 | VARYING_SLOT_POS, |
||
214 | VARYING_SLOT_COL0, /* COL0 and COL1 must be contiguous */ |
||
215 | VARYING_SLOT_COL1, |
||
216 | VARYING_SLOT_FOGC, |
||
217 | VARYING_SLOT_TEX0, /* TEX0-TEX7 must be contiguous */ |
||
218 | VARYING_SLOT_TEX1, |
||
219 | VARYING_SLOT_TEX2, |
||
220 | VARYING_SLOT_TEX3, |
||
221 | VARYING_SLOT_TEX4, |
||
222 | VARYING_SLOT_TEX5, |
||
223 | VARYING_SLOT_TEX6, |
||
224 | VARYING_SLOT_TEX7, |
||
225 | VARYING_SLOT_PSIZ, /* Does not appear in FS */ |
||
226 | VARYING_SLOT_BFC0, /* Does not appear in FS */ |
||
227 | VARYING_SLOT_BFC1, /* Does not appear in FS */ |
||
228 | VARYING_SLOT_EDGE, /* Does not appear in FS */ |
||
229 | VARYING_SLOT_CLIP_VERTEX, /* Does not appear in FS */ |
||
230 | VARYING_SLOT_CLIP_DIST0, |
||
231 | VARYING_SLOT_CLIP_DIST1, |
||
232 | VARYING_SLOT_PRIMITIVE_ID, /* Does not appear in VS */ |
||
233 | VARYING_SLOT_LAYER, /* Appears as VS or GS output */ |
||
234 | VARYING_SLOT_FACE, /* FS only */ |
||
235 | VARYING_SLOT_PNTC, /* FS only */ |
||
236 | VARYING_SLOT_VAR0, /* First generic varying slot */ |
||
237 | VARYING_SLOT_MAX = VARYING_SLOT_VAR0 + MAX_VARYING |
||
238 | } gl_varying_slot; |
||
239 | |||
240 | |||
241 | /** |
||
242 | * Bitflags for varying slots. |
||
243 | */ |
||
244 | /*@{*/ |
||
245 | #define VARYING_BIT_POS BITFIELD64_BIT(VARYING_SLOT_POS) |
||
246 | #define VARYING_BIT_COL0 BITFIELD64_BIT(VARYING_SLOT_COL0) |
||
247 | #define VARYING_BIT_COL1 BITFIELD64_BIT(VARYING_SLOT_COL1) |
||
248 | #define VARYING_BIT_FOGC BITFIELD64_BIT(VARYING_SLOT_FOGC) |
||
249 | #define VARYING_BIT_TEX0 BITFIELD64_BIT(VARYING_SLOT_TEX0) |
||
250 | #define VARYING_BIT_TEX1 BITFIELD64_BIT(VARYING_SLOT_TEX1) |
||
251 | #define VARYING_BIT_TEX2 BITFIELD64_BIT(VARYING_SLOT_TEX2) |
||
252 | #define VARYING_BIT_TEX3 BITFIELD64_BIT(VARYING_SLOT_TEX3) |
||
253 | #define VARYING_BIT_TEX4 BITFIELD64_BIT(VARYING_SLOT_TEX4) |
||
254 | #define VARYING_BIT_TEX5 BITFIELD64_BIT(VARYING_SLOT_TEX5) |
||
255 | #define VARYING_BIT_TEX6 BITFIELD64_BIT(VARYING_SLOT_TEX6) |
||
256 | #define VARYING_BIT_TEX7 BITFIELD64_BIT(VARYING_SLOT_TEX7) |
||
257 | #define VARYING_BIT_TEX(U) BITFIELD64_BIT(VARYING_SLOT_TEX0 + (U)) |
||
258 | #define VARYING_BITS_TEX_ANY BITFIELD64_RANGE(VARYING_SLOT_TEX0, \ |
||
259 | MAX_TEXTURE_COORD_UNITS) |
||
260 | #define VARYING_BIT_PSIZ BITFIELD64_BIT(VARYING_SLOT_PSIZ) |
||
261 | #define VARYING_BIT_BFC0 BITFIELD64_BIT(VARYING_SLOT_BFC0) |
||
262 | #define VARYING_BIT_BFC1 BITFIELD64_BIT(VARYING_SLOT_BFC1) |
||
263 | #define VARYING_BIT_EDGE BITFIELD64_BIT(VARYING_SLOT_EDGE) |
||
264 | #define VARYING_BIT_CLIP_VERTEX BITFIELD64_BIT(VARYING_SLOT_CLIP_VERTEX) |
||
265 | #define VARYING_BIT_CLIP_DIST0 BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST0) |
||
266 | #define VARYING_BIT_CLIP_DIST1 BITFIELD64_BIT(VARYING_SLOT_CLIP_DIST1) |
||
267 | #define VARYING_BIT_PRIMITIVE_ID BITFIELD64_BIT(VARYING_SLOT_PRIMITIVE_ID) |
||
268 | #define VARYING_BIT_LAYER BITFIELD64_BIT(VARYING_SLOT_LAYER) |
||
269 | #define VARYING_BIT_FACE BITFIELD64_BIT(VARYING_SLOT_FACE) |
||
270 | #define VARYING_BIT_PNTC BITFIELD64_BIT(VARYING_SLOT_PNTC) |
||
271 | #define VARYING_BIT_VAR(V) BITFIELD64_BIT(VARYING_SLOT_VAR0 + (V)) |
||
272 | /*@}*/ |
||
273 | |||
274 | |||
275 | /** |
||
276 | * Determine if the given gl_varying_slot appears in the fragment shader. |
||
277 | */ |
||
278 | static inline GLboolean |
||
279 | _mesa_varying_slot_in_fs(gl_varying_slot slot) |
||
280 | { |
||
281 | switch (slot) { |
||
282 | case VARYING_SLOT_PSIZ: |
||
283 | case VARYING_SLOT_BFC0: |
||
284 | case VARYING_SLOT_BFC1: |
||
285 | case VARYING_SLOT_EDGE: |
||
286 | case VARYING_SLOT_CLIP_VERTEX: |
||
287 | case VARYING_SLOT_LAYER: |
||
288 | return GL_FALSE; |
||
289 | default: |
||
290 | return GL_TRUE; |
||
291 | } |
||
292 | } |
||
293 | |||
294 | |||
295 | /** |
||
296 | * Fragment program results |
||
297 | */ |
||
298 | typedef enum |
||
299 | { |
||
300 | FRAG_RESULT_DEPTH = 0, |
||
301 | FRAG_RESULT_STENCIL = 1, |
||
302 | /* If a single color should be written to all render targets, this |
||
303 | * register is written. No FRAG_RESULT_DATAn will be written. |
||
304 | */ |
||
305 | FRAG_RESULT_COLOR = 2, |
||
306 | |||
307 | /* FRAG_RESULT_DATAn are the per-render-target (GLSL gl_FragData[n] |
||
308 | * or ARB_fragment_program fragment.color[n]) color results. If |
||
309 | * any are written, FRAG_RESULT_COLOR will not be written. |
||
310 | */ |
||
311 | FRAG_RESULT_DATA0 = 3, |
||
312 | FRAG_RESULT_MAX = (FRAG_RESULT_DATA0 + MAX_DRAW_BUFFERS) |
||
313 | } gl_frag_result; |
||
314 | |||
315 | |||
316 | /** |
||
317 | * Indexes for all renderbuffers |
||
318 | */ |
||
319 | typedef enum |
||
320 | { |
||
321 | /* the four standard color buffers */ |
||
322 | BUFFER_FRONT_LEFT, |
||
323 | BUFFER_BACK_LEFT, |
||
324 | BUFFER_FRONT_RIGHT, |
||
325 | BUFFER_BACK_RIGHT, |
||
326 | BUFFER_DEPTH, |
||
327 | BUFFER_STENCIL, |
||
328 | BUFFER_ACCUM, |
||
329 | /* optional aux buffer */ |
||
330 | BUFFER_AUX0, |
||
331 | /* generic renderbuffers */ |
||
332 | BUFFER_COLOR0, |
||
333 | BUFFER_COLOR1, |
||
334 | BUFFER_COLOR2, |
||
335 | BUFFER_COLOR3, |
||
336 | BUFFER_COLOR4, |
||
337 | BUFFER_COLOR5, |
||
338 | BUFFER_COLOR6, |
||
339 | BUFFER_COLOR7, |
||
340 | BUFFER_COUNT |
||
341 | } gl_buffer_index; |
||
342 | |||
343 | /** |
||
344 | * Bit flags for all renderbuffers |
||
345 | */ |
||
346 | #define BUFFER_BIT_FRONT_LEFT (1 << BUFFER_FRONT_LEFT) |
||
347 | #define BUFFER_BIT_BACK_LEFT (1 << BUFFER_BACK_LEFT) |
||
348 | #define BUFFER_BIT_FRONT_RIGHT (1 << BUFFER_FRONT_RIGHT) |
||
349 | #define BUFFER_BIT_BACK_RIGHT (1 << BUFFER_BACK_RIGHT) |
||
350 | #define BUFFER_BIT_AUX0 (1 << BUFFER_AUX0) |
||
351 | #define BUFFER_BIT_AUX1 (1 << BUFFER_AUX1) |
||
352 | #define BUFFER_BIT_AUX2 (1 << BUFFER_AUX2) |
||
353 | #define BUFFER_BIT_AUX3 (1 << BUFFER_AUX3) |
||
354 | #define BUFFER_BIT_DEPTH (1 << BUFFER_DEPTH) |
||
355 | #define BUFFER_BIT_STENCIL (1 << BUFFER_STENCIL) |
||
356 | #define BUFFER_BIT_ACCUM (1 << BUFFER_ACCUM) |
||
357 | #define BUFFER_BIT_COLOR0 (1 << BUFFER_COLOR0) |
||
358 | #define BUFFER_BIT_COLOR1 (1 << BUFFER_COLOR1) |
||
359 | #define BUFFER_BIT_COLOR2 (1 << BUFFER_COLOR2) |
||
360 | #define BUFFER_BIT_COLOR3 (1 << BUFFER_COLOR3) |
||
361 | #define BUFFER_BIT_COLOR4 (1 << BUFFER_COLOR4) |
||
362 | #define BUFFER_BIT_COLOR5 (1 << BUFFER_COLOR5) |
||
363 | #define BUFFER_BIT_COLOR6 (1 << BUFFER_COLOR6) |
||
364 | #define BUFFER_BIT_COLOR7 (1 << BUFFER_COLOR7) |
||
365 | |||
366 | /** |
||
367 | * Mask of all the color buffer bits (but not accum). |
||
368 | */ |
||
369 | #define BUFFER_BITS_COLOR (BUFFER_BIT_FRONT_LEFT | \ |
||
370 | BUFFER_BIT_BACK_LEFT | \ |
||
371 | BUFFER_BIT_FRONT_RIGHT | \ |
||
372 | BUFFER_BIT_BACK_RIGHT | \ |
||
373 | BUFFER_BIT_AUX0 | \ |
||
374 | BUFFER_BIT_COLOR0 | \ |
||
375 | BUFFER_BIT_COLOR1 | \ |
||
376 | BUFFER_BIT_COLOR2 | \ |
||
377 | BUFFER_BIT_COLOR3 | \ |
||
378 | BUFFER_BIT_COLOR4 | \ |
||
379 | BUFFER_BIT_COLOR5 | \ |
||
380 | BUFFER_BIT_COLOR6 | \ |
||
381 | BUFFER_BIT_COLOR7) |
||
382 | |||
383 | |||
384 | /** |
||
385 | * Framebuffer configuration (aka visual / pixelformat) |
||
386 | * Note: some of these fields should be boolean, but it appears that |
||
387 | * code in drivers/dri/common/util.c requires int-sized fields. |
||
388 | */ |
||
389 | struct gl_config |
||
390 | { |
||
391 | GLboolean rgbMode; |
||
392 | GLboolean floatMode; |
||
393 | GLboolean colorIndexMode; /* XXX is this used anywhere? */ |
||
394 | GLuint doubleBufferMode; |
||
395 | GLuint stereoMode; |
||
396 | |||
397 | GLboolean haveAccumBuffer; |
||
398 | GLboolean haveDepthBuffer; |
||
399 | GLboolean haveStencilBuffer; |
||
400 | |||
401 | GLint redBits, greenBits, blueBits, alphaBits; /* bits per comp */ |
||
402 | GLuint redMask, greenMask, blueMask, alphaMask; |
||
403 | GLint rgbBits; /* total bits for rgb */ |
||
404 | GLint indexBits; /* total bits for colorindex */ |
||
405 | |||
406 | GLint accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits; |
||
407 | GLint depthBits; |
||
408 | GLint stencilBits; |
||
409 | |||
410 | GLint numAuxBuffers; |
||
411 | |||
412 | GLint level; |
||
413 | |||
414 | /* EXT_visual_rating / GLX 1.2 */ |
||
415 | GLint visualRating; |
||
416 | |||
417 | /* EXT_visual_info / GLX 1.2 */ |
||
418 | GLint transparentPixel; |
||
419 | /* colors are floats scaled to ints */ |
||
420 | GLint transparentRed, transparentGreen, transparentBlue, transparentAlpha; |
||
421 | GLint transparentIndex; |
||
422 | |||
423 | /* ARB_multisample / SGIS_multisample */ |
||
424 | GLint sampleBuffers; |
||
425 | GLint samples; |
||
426 | |||
427 | /* SGIX_pbuffer / GLX 1.3 */ |
||
428 | GLint maxPbufferWidth; |
||
429 | GLint maxPbufferHeight; |
||
430 | GLint maxPbufferPixels; |
||
431 | GLint optimalPbufferWidth; /* Only for SGIX_pbuffer. */ |
||
432 | GLint optimalPbufferHeight; /* Only for SGIX_pbuffer. */ |
||
433 | |||
434 | /* OML_swap_method */ |
||
435 | GLint swapMethod; |
||
436 | |||
437 | /* EXT_texture_from_pixmap */ |
||
438 | GLint bindToTextureRgb; |
||
439 | GLint bindToTextureRgba; |
||
440 | GLint bindToMipmapTexture; |
||
441 | GLint bindToTextureTargets; |
||
442 | GLint yInverted; |
||
443 | |||
444 | /* EXT_framebuffer_sRGB */ |
||
445 | GLint sRGBCapable; |
||
446 | }; |
||
447 | |||
448 | |||
449 | /** |
||
450 | * \name Bit flags used for updating material values. |
||
451 | */ |
||
452 | /*@{*/ |
||
453 | #define MAT_ATTRIB_FRONT_AMBIENT 0 |
||
454 | #define MAT_ATTRIB_BACK_AMBIENT 1 |
||
455 | #define MAT_ATTRIB_FRONT_DIFFUSE 2 |
||
456 | #define MAT_ATTRIB_BACK_DIFFUSE 3 |
||
457 | #define MAT_ATTRIB_FRONT_SPECULAR 4 |
||
458 | #define MAT_ATTRIB_BACK_SPECULAR 5 |
||
459 | #define MAT_ATTRIB_FRONT_EMISSION 6 |
||
460 | #define MAT_ATTRIB_BACK_EMISSION 7 |
||
461 | #define MAT_ATTRIB_FRONT_SHININESS 8 |
||
462 | #define MAT_ATTRIB_BACK_SHININESS 9 |
||
463 | #define MAT_ATTRIB_FRONT_INDEXES 10 |
||
464 | #define MAT_ATTRIB_BACK_INDEXES 11 |
||
465 | #define MAT_ATTRIB_MAX 12 |
||
466 | |||
467 | #define MAT_ATTRIB_AMBIENT(f) (MAT_ATTRIB_FRONT_AMBIENT+(f)) |
||
468 | #define MAT_ATTRIB_DIFFUSE(f) (MAT_ATTRIB_FRONT_DIFFUSE+(f)) |
||
469 | #define MAT_ATTRIB_SPECULAR(f) (MAT_ATTRIB_FRONT_SPECULAR+(f)) |
||
470 | #define MAT_ATTRIB_EMISSION(f) (MAT_ATTRIB_FRONT_EMISSION+(f)) |
||
471 | #define MAT_ATTRIB_SHININESS(f)(MAT_ATTRIB_FRONT_SHININESS+(f)) |
||
472 | #define MAT_ATTRIB_INDEXES(f) (MAT_ATTRIB_FRONT_INDEXES+(f)) |
||
473 | |||
474 | #define MAT_INDEX_AMBIENT 0 |
||
475 | #define MAT_INDEX_DIFFUSE 1 |
||
476 | #define MAT_INDEX_SPECULAR 2 |
||
477 | |||
478 | #define MAT_BIT_FRONT_AMBIENT (1< |
||
479 | #define MAT_BIT_BACK_AMBIENT (1< |
||
480 | #define MAT_BIT_FRONT_DIFFUSE (1< |
||
481 | #define MAT_BIT_BACK_DIFFUSE (1< |
||
482 | #define MAT_BIT_FRONT_SPECULAR (1< |
||
483 | #define MAT_BIT_BACK_SPECULAR (1< |
||
484 | #define MAT_BIT_FRONT_EMISSION (1< |
||
485 | #define MAT_BIT_BACK_EMISSION (1< |
||
486 | #define MAT_BIT_FRONT_SHININESS (1< |
||
487 | #define MAT_BIT_BACK_SHININESS (1< |
||
488 | #define MAT_BIT_FRONT_INDEXES (1< |
||
489 | #define MAT_BIT_BACK_INDEXES (1< |
||
490 | |||
491 | |||
492 | #define FRONT_MATERIAL_BITS (MAT_BIT_FRONT_EMISSION | \ |
||
493 | MAT_BIT_FRONT_AMBIENT | \ |
||
494 | MAT_BIT_FRONT_DIFFUSE | \ |
||
495 | MAT_BIT_FRONT_SPECULAR | \ |
||
496 | MAT_BIT_FRONT_SHININESS | \ |
||
497 | MAT_BIT_FRONT_INDEXES) |
||
498 | |||
499 | #define BACK_MATERIAL_BITS (MAT_BIT_BACK_EMISSION | \ |
||
500 | MAT_BIT_BACK_AMBIENT | \ |
||
501 | MAT_BIT_BACK_DIFFUSE | \ |
||
502 | MAT_BIT_BACK_SPECULAR | \ |
||
503 | MAT_BIT_BACK_SHININESS | \ |
||
504 | MAT_BIT_BACK_INDEXES) |
||
505 | |||
506 | #define ALL_MATERIAL_BITS (FRONT_MATERIAL_BITS | BACK_MATERIAL_BITS) |
||
507 | /*@}*/ |
||
508 | |||
509 | |||
510 | /** |
||
511 | * Material state. |
||
512 | */ |
||
513 | struct gl_material |
||
514 | { |
||
515 | GLfloat Attrib[MAT_ATTRIB_MAX][4]; |
||
516 | }; |
||
517 | |||
518 | |||
519 | /** |
||
520 | * Light state flags. |
||
521 | */ |
||
522 | /*@{*/ |
||
523 | #define LIGHT_SPOT 0x1 |
||
524 | #define LIGHT_LOCAL_VIEWER 0x2 |
||
525 | #define LIGHT_POSITIONAL 0x4 |
||
526 | #define LIGHT_NEED_VERTICES (LIGHT_POSITIONAL|LIGHT_LOCAL_VIEWER) |
||
527 | /*@}*/ |
||
528 | |||
529 | |||
530 | /** |
||
531 | * Light source state. |
||
532 | */ |
||
533 | struct gl_light |
||
534 | { |
||
535 | struct gl_light *next; /**< double linked list with sentinel */ |
||
536 | struct gl_light *prev; |
||
537 | |||
538 | GLfloat Ambient[4]; /**< ambient color */ |
||
539 | GLfloat Diffuse[4]; /**< diffuse color */ |
||
540 | GLfloat Specular[4]; /**< specular color */ |
||
541 | GLfloat EyePosition[4]; /**< position in eye coordinates */ |
||
542 | GLfloat SpotDirection[4]; /**< spotlight direction in eye coordinates */ |
||
543 | GLfloat SpotExponent; |
||
544 | GLfloat SpotCutoff; /**< in degrees */ |
||
545 | GLfloat _CosCutoff; /**< = MAX(0, cos(SpotCutoff)) */ |
||
546 | GLfloat ConstantAttenuation; |
||
547 | GLfloat LinearAttenuation; |
||
548 | GLfloat QuadraticAttenuation; |
||
549 | GLboolean Enabled; /**< On/off flag */ |
||
550 | |||
551 | /** |
||
552 | * \name Derived fields |
||
553 | */ |
||
554 | /*@{*/ |
||
555 | GLbitfield _Flags; /**< Mask of LIGHT_x bits defined above */ |
||
556 | |||
557 | GLfloat _Position[4]; /**< position in eye/obj coordinates */ |
||
558 | GLfloat _VP_inf_norm[3]; /**< Norm direction to infinite light */ |
||
559 | GLfloat _h_inf_norm[3]; /**< Norm( _VP_inf_norm + <0,0,1> ) */ |
||
560 | GLfloat _NormSpotDirection[4]; /**< normalized spotlight direction */ |
||
561 | GLfloat _VP_inf_spot_attenuation; |
||
562 | |||
563 | GLfloat _MatAmbient[2][3]; /**< material ambient * light ambient */ |
||
564 | GLfloat _MatDiffuse[2][3]; /**< material diffuse * light diffuse */ |
||
565 | GLfloat _MatSpecular[2][3]; /**< material spec * light specular */ |
||
566 | /*@}*/ |
||
567 | }; |
||
568 | |||
569 | |||
570 | /** |
||
571 | * Light model state. |
||
572 | */ |
||
573 | struct gl_lightmodel |
||
574 | { |
||
575 | GLfloat Ambient[4]; /**< ambient color */ |
||
576 | GLboolean LocalViewer; /**< Local (or infinite) view point? */ |
||
577 | GLboolean TwoSide; /**< Two (or one) sided lighting? */ |
||
578 | GLenum ColorControl; /**< either GL_SINGLE_COLOR |
||
579 | * or GL_SEPARATE_SPECULAR_COLOR */ |
||
580 | }; |
||
581 | |||
582 | |||
583 | /** |
||
584 | * Accumulation buffer attribute group (GL_ACCUM_BUFFER_BIT) |
||
585 | */ |
||
586 | struct gl_accum_attrib |
||
587 | { |
||
588 | GLfloat ClearColor[4]; /**< Accumulation buffer clear color */ |
||
589 | }; |
||
590 | |||
591 | |||
592 | /** |
||
593 | * Used for storing clear color, texture border color, etc. |
||
594 | * The float values are typically unclamped. |
||
595 | */ |
||
596 | union gl_color_union |
||
597 | { |
||
598 | GLfloat f[4]; |
||
599 | GLint i[4]; |
||
600 | GLuint ui[4]; |
||
601 | }; |
||
602 | |||
603 | |||
604 | /** |
||
605 | * Color buffer attribute group (GL_COLOR_BUFFER_BIT). |
||
606 | */ |
||
607 | struct gl_colorbuffer_attrib |
||
608 | { |
||
609 | GLuint ClearIndex; /**< Index for glClear */ |
||
610 | union gl_color_union ClearColor; /**< Color for glClear, unclamped */ |
||
611 | GLuint IndexMask; /**< Color index write mask */ |
||
612 | GLubyte ColorMask[MAX_DRAW_BUFFERS][4]; /**< Each flag is 0xff or 0x0 */ |
||
613 | |||
614 | GLenum DrawBuffer[MAX_DRAW_BUFFERS]; /**< Which buffer to draw into */ |
||
615 | |||
616 | /** |
||
617 | * \name alpha testing |
||
618 | */ |
||
619 | /*@{*/ |
||
620 | GLboolean AlphaEnabled; /**< Alpha test enabled flag */ |
||
621 | GLenum AlphaFunc; /**< Alpha test function */ |
||
622 | GLfloat AlphaRefUnclamped; |
||
623 | GLclampf AlphaRef; /**< Alpha reference value */ |
||
624 | /*@}*/ |
||
625 | |||
626 | /** |
||
627 | * \name Blending |
||
628 | */ |
||
629 | /*@{*/ |
||
630 | GLbitfield BlendEnabled; /**< Per-buffer blend enable flags */ |
||
631 | |||
632 | /* NOTE: this does _not_ depend on fragment clamping or any other clamping |
||
633 | * control, only on the fixed-pointness of the render target. |
||
634 | * The query does however depend on fragment color clamping. |
||
635 | */ |
||
636 | GLfloat BlendColorUnclamped[4]; /**< Blending color */ |
||
637 | GLfloat BlendColor[4]; /**< Blending color */ |
||
638 | |||
639 | struct |
||
640 | { |
||
641 | GLenum SrcRGB; /**< RGB blend source term */ |
||
642 | GLenum DstRGB; /**< RGB blend dest term */ |
||
643 | GLenum SrcA; /**< Alpha blend source term */ |
||
644 | GLenum DstA; /**< Alpha blend dest term */ |
||
645 | GLenum EquationRGB; /**< GL_ADD, GL_SUBTRACT, etc. */ |
||
646 | GLenum EquationA; /**< GL_ADD, GL_SUBTRACT, etc. */ |
||
647 | /** |
||
648 | * Set if any blend factor uses SRC1. Computed at the time blend factors |
||
649 | * get set. |
||
650 | */ |
||
651 | GLboolean _UsesDualSrc; |
||
652 | } Blend[MAX_DRAW_BUFFERS]; |
||
653 | /** Are the blend func terms currently different for each buffer/target? */ |
||
654 | GLboolean _BlendFuncPerBuffer; |
||
655 | /** Are the blend equations currently different for each buffer/target? */ |
||
656 | GLboolean _BlendEquationPerBuffer; |
||
657 | /*@}*/ |
||
658 | |||
659 | /** |
||
660 | * \name Logic op |
||
661 | */ |
||
662 | /*@{*/ |
||
663 | GLenum LogicOp; /**< Logic operator */ |
||
664 | GLboolean IndexLogicOpEnabled; /**< Color index logic op enabled flag */ |
||
665 | GLboolean ColorLogicOpEnabled; /**< RGBA logic op enabled flag */ |
||
666 | /*@}*/ |
||
667 | |||
668 | GLboolean DitherFlag; /**< Dither enable flag */ |
||
669 | |||
670 | GLenum ClampFragmentColor; /**< GL_TRUE, GL_FALSE or GL_FIXED_ONLY_ARB */ |
||
671 | GLboolean _ClampFragmentColor; /** < with GL_FIXED_ONLY_ARB resolved */ |
||
672 | GLenum ClampReadColor; /**< GL_TRUE, GL_FALSE or GL_FIXED_ONLY_ARB */ |
||
673 | |||
674 | GLboolean sRGBEnabled; /**< Framebuffer sRGB blending/updating requested */ |
||
675 | }; |
||
676 | |||
677 | |||
678 | /** |
||
679 | * Current attribute group (GL_CURRENT_BIT). |
||
680 | */ |
||
681 | struct gl_current_attrib |
||
682 | { |
||
683 | /** |
||
684 | * \name Current vertex attributes. |
||
685 | * \note Values are valid only after FLUSH_VERTICES has been called. |
||
686 | * \note Index and Edgeflag current values are stored as floats in the |
||
687 | * SIX and SEVEN attribute slots. |
||
688 | */ |
||
689 | GLfloat Attrib[VERT_ATTRIB_MAX][4]; /**< Position, color, texcoords, etc */ |
||
690 | |||
691 | /** |
||
692 | * \name Current raster position attributes (always valid). |
||
693 | * \note This set of attributes is very similar to the SWvertex struct. |
||
694 | */ |
||
695 | /*@{*/ |
||
696 | GLfloat RasterPos[4]; |
||
697 | GLfloat RasterDistance; |
||
698 | GLfloat RasterColor[4]; |
||
699 | GLfloat RasterSecondaryColor[4]; |
||
700 | GLfloat RasterTexCoords[MAX_TEXTURE_COORD_UNITS][4]; |
||
701 | GLboolean RasterPosValid; |
||
702 | /*@}*/ |
||
703 | }; |
||
704 | |||
705 | |||
706 | /** |
||
707 | * Depth buffer attribute group (GL_DEPTH_BUFFER_BIT). |
||
708 | */ |
||
709 | struct gl_depthbuffer_attrib |
||
710 | { |
||
711 | GLenum Func; /**< Function for depth buffer compare */ |
||
712 | GLclampd Clear; /**< Value to clear depth buffer to */ |
||
713 | GLboolean Test; /**< Depth buffering enabled flag */ |
||
714 | GLboolean Mask; /**< Depth buffer writable? */ |
||
715 | GLboolean BoundsTest; /**< GL_EXT_depth_bounds_test */ |
||
716 | GLfloat BoundsMin, BoundsMax;/**< GL_EXT_depth_bounds_test */ |
||
717 | }; |
||
718 | |||
719 | |||
720 | /** |
||
721 | * Evaluator attribute group (GL_EVAL_BIT). |
||
722 | */ |
||
723 | struct gl_eval_attrib |
||
724 | { |
||
725 | /** |
||
726 | * \name Enable bits |
||
727 | */ |
||
728 | /*@{*/ |
||
729 | GLboolean Map1Color4; |
||
730 | GLboolean Map1Index; |
||
731 | GLboolean Map1Normal; |
||
732 | GLboolean Map1TextureCoord1; |
||
733 | GLboolean Map1TextureCoord2; |
||
734 | GLboolean Map1TextureCoord3; |
||
735 | GLboolean Map1TextureCoord4; |
||
736 | GLboolean Map1Vertex3; |
||
737 | GLboolean Map1Vertex4; |
||
738 | GLboolean Map2Color4; |
||
739 | GLboolean Map2Index; |
||
740 | GLboolean Map2Normal; |
||
741 | GLboolean Map2TextureCoord1; |
||
742 | GLboolean Map2TextureCoord2; |
||
743 | GLboolean Map2TextureCoord3; |
||
744 | GLboolean Map2TextureCoord4; |
||
745 | GLboolean Map2Vertex3; |
||
746 | GLboolean Map2Vertex4; |
||
747 | GLboolean AutoNormal; |
||
748 | /*@}*/ |
||
749 | |||
750 | /** |
||
751 | * \name Map Grid endpoints and divisions and calculated du values |
||
752 | */ |
||
753 | /*@{*/ |
||
754 | GLint MapGrid1un; |
||
755 | GLfloat MapGrid1u1, MapGrid1u2, MapGrid1du; |
||
756 | GLint MapGrid2un, MapGrid2vn; |
||
757 | GLfloat MapGrid2u1, MapGrid2u2, MapGrid2du; |
||
758 | GLfloat MapGrid2v1, MapGrid2v2, MapGrid2dv; |
||
759 | /*@}*/ |
||
760 | }; |
||
761 | |||
762 | |||
763 | /** |
||
764 | * Fog attribute group (GL_FOG_BIT). |
||
765 | */ |
||
766 | struct gl_fog_attrib |
||
767 | { |
||
768 | GLboolean Enabled; /**< Fog enabled flag */ |
||
769 | GLfloat ColorUnclamped[4]; /**< Fog color */ |
||
770 | GLfloat Color[4]; /**< Fog color */ |
||
771 | GLfloat Density; /**< Density >= 0.0 */ |
||
772 | GLfloat Start; /**< Start distance in eye coords */ |
||
773 | GLfloat End; /**< End distance in eye coords */ |
||
774 | GLfloat Index; /**< Fog index */ |
||
775 | GLenum Mode; /**< Fog mode */ |
||
776 | GLboolean ColorSumEnabled; |
||
777 | GLenum FogCoordinateSource; /**< GL_EXT_fog_coord */ |
||
778 | GLfloat _Scale; /**< (End == Start) ? 1.0 : 1.0 / (End - Start) */ |
||
779 | GLenum FogDistanceMode; /**< GL_NV_fog_distance */ |
||
780 | }; |
||
781 | |||
782 | |||
783 | /** |
||
784 | * Hint attribute group (GL_HINT_BIT). |
||
785 | * |
||
786 | * Values are always one of GL_FASTEST, GL_NICEST, or GL_DONT_CARE. |
||
787 | */ |
||
788 | struct gl_hint_attrib |
||
789 | { |
||
790 | GLenum PerspectiveCorrection; |
||
791 | GLenum PointSmooth; |
||
792 | GLenum LineSmooth; |
||
793 | GLenum PolygonSmooth; |
||
794 | GLenum Fog; |
||
795 | GLenum TextureCompression; /**< GL_ARB_texture_compression */ |
||
796 | GLenum GenerateMipmap; /**< GL_SGIS_generate_mipmap */ |
||
797 | GLenum FragmentShaderDerivative; /**< GL_ARB_fragment_shader */ |
||
798 | }; |
||
799 | |||
800 | |||
801 | /** |
||
802 | * Lighting attribute group (GL_LIGHT_BIT). |
||
803 | */ |
||
804 | struct gl_light_attrib |
||
805 | { |
||
806 | struct gl_light Light[MAX_LIGHTS]; /**< Array of light sources */ |
||
807 | struct gl_lightmodel Model; /**< Lighting model */ |
||
808 | |||
809 | /** |
||
810 | * Front and back material values. |
||
811 | * Note: must call FLUSH_VERTICES() before using. |
||
812 | */ |
||
813 | struct gl_material Material; |
||
814 | |||
815 | GLboolean Enabled; /**< Lighting enabled flag */ |
||
816 | GLenum ShadeModel; /**< GL_FLAT or GL_SMOOTH */ |
||
817 | GLenum ProvokingVertex; /**< GL_EXT_provoking_vertex */ |
||
818 | GLenum ColorMaterialFace; /**< GL_FRONT, BACK or FRONT_AND_BACK */ |
||
819 | GLenum ColorMaterialMode; /**< GL_AMBIENT, GL_DIFFUSE, etc */ |
||
820 | GLbitfield _ColorMaterialBitmask; /**< bitmask formed from Face and Mode */ |
||
821 | GLboolean ColorMaterialEnabled; |
||
822 | GLenum ClampVertexColor; /**< GL_TRUE, GL_FALSE, GL_FIXED_ONLY */ |
||
823 | GLboolean _ClampVertexColor; |
||
824 | |||
825 | struct gl_light EnabledList; /**< List sentinel */ |
||
826 | |||
827 | /** |
||
828 | * Derived state for optimizations: |
||
829 | */ |
||
830 | /*@{*/ |
||
831 | GLboolean _NeedEyeCoords; |
||
832 | GLboolean _NeedVertices; /**< Use fast shader? */ |
||
833 | GLfloat _BaseColor[2][3]; |
||
834 | /*@}*/ |
||
835 | }; |
||
836 | |||
837 | |||
838 | /** |
||
839 | * Line attribute group (GL_LINE_BIT). |
||
840 | */ |
||
841 | struct gl_line_attrib |
||
842 | { |
||
843 | GLboolean SmoothFlag; /**< GL_LINE_SMOOTH enabled? */ |
||
844 | GLboolean StippleFlag; /**< GL_LINE_STIPPLE enabled? */ |
||
845 | GLushort StipplePattern; /**< Stipple pattern */ |
||
846 | GLint StippleFactor; /**< Stipple repeat factor */ |
||
847 | GLfloat Width; /**< Line width */ |
||
848 | }; |
||
849 | |||
850 | |||
851 | /** |
||
852 | * Display list attribute group (GL_LIST_BIT). |
||
853 | */ |
||
854 | struct gl_list_attrib |
||
855 | { |
||
856 | GLuint ListBase; |
||
857 | }; |
||
858 | |||
859 | |||
860 | /** |
||
861 | * Multisample attribute group (GL_MULTISAMPLE_BIT). |
||
862 | */ |
||
863 | struct gl_multisample_attrib |
||
864 | { |
||
865 | GLboolean Enabled; |
||
866 | GLboolean _Enabled; /**< true if Enabled and multisample buffer */ |
||
867 | GLboolean SampleAlphaToCoverage; |
||
868 | GLboolean SampleAlphaToOne; |
||
869 | GLboolean SampleCoverage; |
||
870 | GLfloat SampleCoverageValue; |
||
871 | GLboolean SampleCoverageInvert; |
||
872 | |||
873 | /* ARB_texture_multisample / GL3.2 additions */ |
||
874 | GLboolean SampleMask; |
||
875 | /** The GL spec defines this as an array but >32x MSAA is madness */ |
||
876 | GLbitfield SampleMaskValue; |
||
877 | }; |
||
878 | |||
879 | |||
880 | /** |
||
881 | * A pixelmap (see glPixelMap) |
||
882 | */ |
||
883 | struct gl_pixelmap |
||
884 | { |
||
885 | GLint Size; |
||
886 | GLfloat Map[MAX_PIXEL_MAP_TABLE]; |
||
887 | }; |
||
888 | |||
889 | |||
890 | /** |
||
891 | * Collection of all pixelmaps |
||
892 | */ |
||
893 | struct gl_pixelmaps |
||
894 | { |
||
895 | struct gl_pixelmap RtoR; /**< i.e. GL_PIXEL_MAP_R_TO_R */ |
||
896 | struct gl_pixelmap GtoG; |
||
897 | struct gl_pixelmap BtoB; |
||
898 | struct gl_pixelmap AtoA; |
||
899 | struct gl_pixelmap ItoR; |
||
900 | struct gl_pixelmap ItoG; |
||
901 | struct gl_pixelmap ItoB; |
||
902 | struct gl_pixelmap ItoA; |
||
903 | struct gl_pixelmap ItoI; |
||
904 | struct gl_pixelmap StoS; |
||
905 | }; |
||
906 | |||
907 | |||
908 | /** |
||
909 | * Pixel attribute group (GL_PIXEL_MODE_BIT). |
||
910 | */ |
||
911 | struct gl_pixel_attrib |
||
912 | { |
||
913 | GLenum ReadBuffer; /**< source buffer for glRead/CopyPixels() */ |
||
914 | |||
915 | /*--- Begin Pixel Transfer State ---*/ |
||
916 | /* Fields are in the order in which they're applied... */ |
||
917 | |||
918 | /** Scale & Bias (index shift, offset) */ |
||
919 | /*@{*/ |
||
920 | GLfloat RedBias, RedScale; |
||
921 | GLfloat GreenBias, GreenScale; |
||
922 | GLfloat BlueBias, BlueScale; |
||
923 | GLfloat AlphaBias, AlphaScale; |
||
924 | GLfloat DepthBias, DepthScale; |
||
925 | GLint IndexShift, IndexOffset; |
||
926 | /*@}*/ |
||
927 | |||
928 | /* Pixel Maps */ |
||
929 | /* Note: actual pixel maps are not part of this attrib group */ |
||
930 | GLboolean MapColorFlag; |
||
931 | GLboolean MapStencilFlag; |
||
932 | |||
933 | /*--- End Pixel Transfer State ---*/ |
||
934 | |||
935 | /** glPixelZoom */ |
||
936 | GLfloat ZoomX, ZoomY; |
||
937 | }; |
||
938 | |||
939 | |||
940 | /** |
||
941 | * Point attribute group (GL_POINT_BIT). |
||
942 | */ |
||
943 | struct gl_point_attrib |
||
944 | { |
||
945 | GLboolean SmoothFlag; /**< True if GL_POINT_SMOOTH is enabled */ |
||
946 | GLfloat Size; /**< User-specified point size */ |
||
947 | GLfloat Params[3]; /**< GL_EXT_point_parameters */ |
||
948 | GLfloat MinSize, MaxSize; /**< GL_EXT_point_parameters */ |
||
949 | GLfloat Threshold; /**< GL_EXT_point_parameters */ |
||
950 | GLboolean _Attenuated; /**< True if Params != [1, 0, 0] */ |
||
951 | GLboolean PointSprite; /**< GL_NV/ARB_point_sprite */ |
||
952 | GLboolean CoordReplace[MAX_TEXTURE_COORD_UNITS]; /**< GL_ARB_point_sprite*/ |
||
953 | GLenum SpriteRMode; /**< GL_NV_point_sprite (only!) */ |
||
954 | GLenum SpriteOrigin; /**< GL_ARB_point_sprite */ |
||
955 | }; |
||
956 | |||
957 | |||
958 | /** |
||
959 | * Polygon attribute group (GL_POLYGON_BIT). |
||
960 | */ |
||
961 | struct gl_polygon_attrib |
||
962 | { |
||
963 | GLenum FrontFace; /**< Either GL_CW or GL_CCW */ |
||
964 | GLenum FrontMode; /**< Either GL_POINT, GL_LINE or GL_FILL */ |
||
965 | GLenum BackMode; /**< Either GL_POINT, GL_LINE or GL_FILL */ |
||
966 | GLboolean _FrontBit; /**< 0=GL_CCW, 1=GL_CW */ |
||
967 | GLboolean CullFlag; /**< Culling on/off flag */ |
||
968 | GLboolean SmoothFlag; /**< True if GL_POLYGON_SMOOTH is enabled */ |
||
969 | GLboolean StippleFlag; /**< True if GL_POLYGON_STIPPLE is enabled */ |
||
970 | GLenum CullFaceMode; /**< Culling mode GL_FRONT or GL_BACK */ |
||
971 | GLfloat OffsetFactor; /**< Polygon offset factor, from user */ |
||
972 | GLfloat OffsetUnits; /**< Polygon offset units, from user */ |
||
973 | GLboolean OffsetPoint; /**< Offset in GL_POINT mode */ |
||
974 | GLboolean OffsetLine; /**< Offset in GL_LINE mode */ |
||
975 | GLboolean OffsetFill; /**< Offset in GL_FILL mode */ |
||
976 | }; |
||
977 | |||
978 | |||
979 | /** |
||
980 | * Scissor attributes (GL_SCISSOR_BIT). |
||
981 | */ |
||
982 | struct gl_scissor_attrib |
||
983 | { |
||
984 | GLboolean Enabled; /**< Scissor test enabled? */ |
||
985 | GLint X, Y; /**< Lower left corner of box */ |
||
986 | GLsizei Width, Height; /**< Size of box */ |
||
987 | }; |
||
988 | |||
989 | |||
990 | /** |
||
991 | * Stencil attribute group (GL_STENCIL_BUFFER_BIT). |
||
992 | * |
||
993 | * Three sets of stencil data are tracked so that OpenGL 2.0, |
||
994 | * GL_EXT_stencil_two_side, and GL_ATI_separate_stencil can all be supported |
||
995 | * simultaneously. In each of the stencil state arrays, element 0 corresponds |
||
996 | * to GL_FRONT. Element 1 corresponds to the OpenGL 2.0 / |
||
997 | * GL_ATI_separate_stencil GL_BACK state. Element 2 corresponds to the |
||
998 | * GL_EXT_stencil_two_side GL_BACK state. |
||
999 | * |
||
1000 | * The derived value \c _BackFace is either 1 or 2 depending on whether or |
||
1001 | * not GL_STENCIL_TEST_TWO_SIDE_EXT is enabled. |
||
1002 | * |
||
1003 | * The derived value \c _TestTwoSide is set when the front-face and back-face |
||
1004 | * stencil state are different. |
||
1005 | */ |
||
1006 | struct gl_stencil_attrib |
||
1007 | { |
||
1008 | GLboolean Enabled; /**< Enabled flag */ |
||
1009 | GLboolean TestTwoSide; /**< GL_EXT_stencil_two_side */ |
||
1010 | GLubyte ActiveFace; /**< GL_EXT_stencil_two_side (0 or 2) */ |
||
1011 | GLboolean _Enabled; /**< Enabled and stencil buffer present */ |
||
1012 | GLboolean _WriteEnabled; /**< _Enabled and non-zero writemasks */ |
||
1013 | GLboolean _TestTwoSide; |
||
1014 | GLubyte _BackFace; /**< Current back stencil state (1 or 2) */ |
||
1015 | GLenum Function[3]; /**< Stencil function */ |
||
1016 | GLenum FailFunc[3]; /**< Fail function */ |
||
1017 | GLenum ZPassFunc[3]; /**< Depth buffer pass function */ |
||
1018 | GLenum ZFailFunc[3]; /**< Depth buffer fail function */ |
||
1019 | GLint Ref[3]; /**< Reference value */ |
||
1020 | GLuint ValueMask[3]; /**< Value mask */ |
||
1021 | GLuint WriteMask[3]; /**< Write mask */ |
||
1022 | GLuint Clear; /**< Clear value */ |
||
1023 | }; |
||
1024 | |||
1025 | |||
1026 | /** |
||
1027 | * An index for each type of texture object. These correspond to the GL |
||
1028 | * texture target enums, such as GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP, etc. |
||
1029 | * Note: the order is from highest priority to lowest priority. |
||
1030 | */ |
||
1031 | typedef enum |
||
1032 | { |
||
1033 | TEXTURE_2D_MULTISAMPLE_INDEX, |
||
1034 | TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX, |
||
1035 | TEXTURE_CUBE_ARRAY_INDEX, |
||
1036 | TEXTURE_BUFFER_INDEX, |
||
1037 | TEXTURE_2D_ARRAY_INDEX, |
||
1038 | TEXTURE_1D_ARRAY_INDEX, |
||
1039 | TEXTURE_EXTERNAL_INDEX, |
||
1040 | TEXTURE_CUBE_INDEX, |
||
1041 | TEXTURE_3D_INDEX, |
||
1042 | TEXTURE_RECT_INDEX, |
||
1043 | TEXTURE_2D_INDEX, |
||
1044 | TEXTURE_1D_INDEX, |
||
1045 | NUM_TEXTURE_TARGETS |
||
1046 | } gl_texture_index; |
||
1047 | |||
1048 | |||
1049 | /** |
||
1050 | * Bit flags for each type of texture object |
||
1051 | * Used for Texture.Unit[]._ReallyEnabled flags. |
||
1052 | */ |
||
1053 | /*@{*/ |
||
1054 | #define TEXTURE_2D_MULTISAMPLE_BIT (1 << TEXTURE_2D_MULTISAMPLE_INDEX) |
||
1055 | #define TEXTURE_2D_MULTISAMPLE_ARRAY_BIT (1 << TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX) |
||
1056 | #define TEXTURE_CUBE_ARRAY_BIT (1 << TEXTURE_CUBE_ARRAY_INDEX) |
||
1057 | #define TEXTURE_BUFFER_BIT (1 << TEXTURE_BUFFER_INDEX) |
||
1058 | #define TEXTURE_2D_ARRAY_BIT (1 << TEXTURE_2D_ARRAY_INDEX) |
||
1059 | #define TEXTURE_1D_ARRAY_BIT (1 << TEXTURE_1D_ARRAY_INDEX) |
||
1060 | #define TEXTURE_EXTERNAL_BIT (1 << TEXTURE_EXTERNAL_INDEX) |
||
1061 | #define TEXTURE_CUBE_BIT (1 << TEXTURE_CUBE_INDEX) |
||
1062 | #define TEXTURE_3D_BIT (1 << TEXTURE_3D_INDEX) |
||
1063 | #define TEXTURE_RECT_BIT (1 << TEXTURE_RECT_INDEX) |
||
1064 | #define TEXTURE_2D_BIT (1 << TEXTURE_2D_INDEX) |
||
1065 | #define TEXTURE_1D_BIT (1 << TEXTURE_1D_INDEX) |
||
1066 | /*@}*/ |
||
1067 | |||
1068 | |||
1069 | /** |
||
1070 | * Texture image state. Drivers will typically create a subclass of this |
||
1071 | * with extra fields for memory buffers, etc. |
||
1072 | */ |
||
1073 | struct gl_texture_image |
||
1074 | { |
||
1075 | GLint InternalFormat; /**< Internal format as given by the user */ |
||
1076 | GLenum _BaseFormat; /**< Either GL_RGB, GL_RGBA, GL_ALPHA, |
||
1077 | * GL_LUMINANCE, GL_LUMINANCE_ALPHA, |
||
1078 | * GL_INTENSITY, GL_DEPTH_COMPONENT or |
||
1079 | * GL_DEPTH_STENCIL_EXT only. Used for |
||
1080 | * choosing TexEnv arithmetic. |
||
1081 | */ |
||
1082 | gl_format TexFormat; /**< The actual texture memory format */ |
||
1083 | |||
1084 | GLuint Border; /**< 0 or 1 */ |
||
1085 | GLuint Width; /**< = 2^WidthLog2 + 2*Border */ |
||
1086 | GLuint Height; /**< = 2^HeightLog2 + 2*Border */ |
||
1087 | GLuint Depth; /**< = 2^DepthLog2 + 2*Border */ |
||
1088 | GLuint Width2; /**< = Width - 2*Border */ |
||
1089 | GLuint Height2; /**< = Height - 2*Border */ |
||
1090 | GLuint Depth2; /**< = Depth - 2*Border */ |
||
1091 | GLuint WidthLog2; /**< = log2(Width2) */ |
||
1092 | GLuint HeightLog2; /**< = log2(Height2) */ |
||
1093 | GLuint DepthLog2; /**< = log2(Depth2) */ |
||
1094 | GLuint MaxNumLevels; /**< = maximum possible number of mipmap |
||
1095 | levels, computed from the dimensions */ |
||
1096 | |||
1097 | struct gl_texture_object *TexObject; /**< Pointer back to parent object */ |
||
1098 | GLuint Level; /**< Which mipmap level am I? */ |
||
1099 | /** Cube map face: index into gl_texture_object::Image[] array */ |
||
1100 | GLuint Face; |
||
1101 | |||
1102 | /** GL_ARB_texture_multisample */ |
||
1103 | GLuint NumSamples; /**< Sample count, or 0 for non-multisample */ |
||
1104 | GLboolean FixedSampleLocations; /**< Same sample locations for all pixels? */ |
||
1105 | }; |
||
1106 | |||
1107 | |||
1108 | /** |
||
1109 | * Indexes for cube map faces. |
||
1110 | */ |
||
1111 | typedef enum |
||
1112 | { |
||
1113 | FACE_POS_X = 0, |
||
1114 | FACE_NEG_X = 1, |
||
1115 | FACE_POS_Y = 2, |
||
1116 | FACE_NEG_Y = 3, |
||
1117 | FACE_POS_Z = 4, |
||
1118 | FACE_NEG_Z = 5, |
||
1119 | MAX_FACES = 6 |
||
1120 | } gl_face_index; |
||
1121 | |||
1122 | |||
1123 | /** |
||
1124 | * Sampler object state. These objects are new with GL_ARB_sampler_objects |
||
1125 | * and OpenGL 3.3. Legacy texture objects also contain a sampler object. |
||
1126 | */ |
||
1127 | struct gl_sampler_object |
||
1128 | { |
||
1129 | GLuint Name; |
||
1130 | GLint RefCount; |
||
1131 | |||
1132 | GLenum WrapS; /**< S-axis texture image wrap mode */ |
||
1133 | GLenum WrapT; /**< T-axis texture image wrap mode */ |
||
1134 | GLenum WrapR; /**< R-axis texture image wrap mode */ |
||
1135 | GLenum MinFilter; /**< minification filter */ |
||
1136 | GLenum MagFilter; /**< magnification filter */ |
||
1137 | union gl_color_union BorderColor; /**< Interpreted according to texture format */ |
||
1138 | GLfloat MinLod; /**< min lambda, OpenGL 1.2 */ |
||
1139 | GLfloat MaxLod; /**< max lambda, OpenGL 1.2 */ |
||
1140 | GLfloat LodBias; /**< OpenGL 1.4 */ |
||
1141 | GLfloat MaxAnisotropy; /**< GL_EXT_texture_filter_anisotropic */ |
||
1142 | GLenum CompareMode; /**< GL_ARB_shadow */ |
||
1143 | GLenum CompareFunc; /**< GL_ARB_shadow */ |
||
1144 | GLenum sRGBDecode; /**< GL_DECODE_EXT or GL_SKIP_DECODE_EXT */ |
||
1145 | GLboolean CubeMapSeamless; /**< GL_AMD_seamless_cubemap_per_texture */ |
||
1146 | }; |
||
1147 | |||
1148 | |||
1149 | /** |
||
1150 | * Texture object state. Contains the array of mipmap images, border color, |
||
1151 | * wrap modes, filter modes, and shadow/texcompare state. |
||
1152 | */ |
||
1153 | struct gl_texture_object |
||
1154 | { |
||
1155 | _glthread_Mutex Mutex; /**< for thread safety */ |
||
1156 | GLint RefCount; /**< reference count */ |
||
1157 | GLuint Name; /**< the user-visible texture object ID */ |
||
1158 | GLenum Target; /**< GL_TEXTURE_1D, GL_TEXTURE_2D, etc. */ |
||
1159 | |||
1160 | struct gl_sampler_object Sampler; |
||
1161 | |||
1162 | GLenum DepthMode; /**< GL_ARB_depth_texture */ |
||
1163 | |||
1164 | GLfloat Priority; /**< in [0,1] */ |
||
1165 | GLint BaseLevel; /**< min mipmap level, OpenGL 1.2 */ |
||
1166 | GLint MaxLevel; /**< max mipmap level, OpenGL 1.2 */ |
||
1167 | GLint ImmutableLevels; /**< ES 3.0 / ARB_texture_view */ |
||
1168 | GLint _MaxLevel; /**< actual max mipmap level (q in the spec) */ |
||
1169 | GLfloat _MaxLambda; /**< = _MaxLevel - BaseLevel (q - b in spec) */ |
||
1170 | GLint CropRect[4]; /**< GL_OES_draw_texture */ |
||
1171 | GLenum Swizzle[4]; /**< GL_EXT_texture_swizzle */ |
||
1172 | GLuint _Swizzle; /**< same as Swizzle, but SWIZZLE_* format */ |
||
1173 | GLboolean GenerateMipmap; /**< GL_SGIS_generate_mipmap */ |
||
1174 | GLboolean _BaseComplete; /**< Is the base texture level valid? */ |
||
1175 | GLboolean _MipmapComplete; /**< Is the whole mipmap valid? */ |
||
1176 | GLboolean _IsIntegerFormat; /**< Does the texture store integer values? */ |
||
1177 | GLboolean _RenderToTexture; /**< Any rendering to this texture? */ |
||
1178 | GLboolean Purgeable; /**< Is the buffer purgeable under memory pressure? */ |
||
1179 | GLboolean Immutable; /**< GL_ARB_texture_storage */ |
||
1180 | |||
1181 | /** Actual texture images, indexed by [cube face] and [mipmap level] */ |
||
1182 | struct gl_texture_image *Image[MAX_FACES][MAX_TEXTURE_LEVELS]; |
||
1183 | |||
1184 | /** GL_ARB_texture_buffer_object */ |
||
1185 | struct gl_buffer_object *BufferObject; |
||
1186 | GLenum BufferObjectFormat; |
||
1187 | /** Equivalent Mesa format for BufferObjectFormat. */ |
||
1188 | gl_format _BufferObjectFormat; |
||
1189 | /** GL_ARB_texture_buffer_range */ |
||
1190 | GLintptr BufferOffset; |
||
1191 | GLsizeiptr BufferSize; /**< if this is -1, use BufferObject->Size instead */ |
||
1192 | |||
1193 | /** GL_OES_EGL_image_external */ |
||
1194 | GLint RequiredTextureImageUnits; |
||
1195 | }; |
||
1196 | |||
1197 | |||
1198 | /** Up to four combiner sources are possible with GL_NV_texture_env_combine4 */ |
||
1199 | #define MAX_COMBINER_TERMS 4 |
||
1200 | |||
1201 | |||
1202 | /** |
||
1203 | * Texture combine environment state. |
||
1204 | */ |
||
1205 | struct gl_tex_env_combine_state |
||
1206 | { |
||
1207 | GLenum ModeRGB; /**< GL_REPLACE, GL_DECAL, GL_ADD, etc. */ |
||
1208 | GLenum ModeA; /**< GL_REPLACE, GL_DECAL, GL_ADD, etc. */ |
||
1209 | /** Source terms: GL_PRIMARY_COLOR, GL_TEXTURE, etc */ |
||
1210 | GLenum SourceRGB[MAX_COMBINER_TERMS]; |
||
1211 | GLenum SourceA[MAX_COMBINER_TERMS]; |
||
1212 | /** Source operands: GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, etc */ |
||
1213 | GLenum OperandRGB[MAX_COMBINER_TERMS]; |
||
1214 | GLenum OperandA[MAX_COMBINER_TERMS]; |
||
1215 | GLuint ScaleShiftRGB; /**< 0, 1 or 2 */ |
||
1216 | GLuint ScaleShiftA; /**< 0, 1 or 2 */ |
||
1217 | GLuint _NumArgsRGB; /**< Number of inputs used for the RGB combiner */ |
||
1218 | GLuint _NumArgsA; /**< Number of inputs used for the A combiner */ |
||
1219 | }; |
||
1220 | |||
1221 | |||
1222 | /** |
||
1223 | * TexGenEnabled flags. |
||
1224 | */ |
||
1225 | /*@{*/ |
||
1226 | #define S_BIT 1 |
||
1227 | #define T_BIT 2 |
||
1228 | #define R_BIT 4 |
||
1229 | #define Q_BIT 8 |
||
1230 | #define STR_BITS (S_BIT | T_BIT | R_BIT) |
||
1231 | /*@}*/ |
||
1232 | |||
1233 | |||
1234 | /** |
||
1235 | * Bit flag versions of the corresponding GL_ constants. |
||
1236 | */ |
||
1237 | /*@{*/ |
||
1238 | #define TEXGEN_SPHERE_MAP 0x1 |
||
1239 | #define TEXGEN_OBJ_LINEAR 0x2 |
||
1240 | #define TEXGEN_EYE_LINEAR 0x4 |
||
1241 | #define TEXGEN_REFLECTION_MAP_NV 0x8 |
||
1242 | #define TEXGEN_NORMAL_MAP_NV 0x10 |
||
1243 | |||
1244 | #define TEXGEN_NEED_NORMALS (TEXGEN_SPHERE_MAP | \ |
||
1245 | TEXGEN_REFLECTION_MAP_NV | \ |
||
1246 | TEXGEN_NORMAL_MAP_NV) |
||
1247 | #define TEXGEN_NEED_EYE_COORD (TEXGEN_SPHERE_MAP | \ |
||
1248 | TEXGEN_REFLECTION_MAP_NV | \ |
||
1249 | TEXGEN_NORMAL_MAP_NV | \ |
||
1250 | TEXGEN_EYE_LINEAR) |
||
1251 | /*@}*/ |
||
1252 | |||
1253 | |||
1254 | |||
1255 | /** Tex-gen enabled for texture unit? */ |
||
1256 | #define ENABLE_TEXGEN(unit) (1 << (unit)) |
||
1257 | |||
1258 | /** Non-identity texture matrix for texture unit? */ |
||
1259 | #define ENABLE_TEXMAT(unit) (1 << (unit)) |
||
1260 | |||
1261 | |||
1262 | /** |
||
1263 | * Texture coord generation state. |
||
1264 | */ |
||
1265 | struct gl_texgen |
||
1266 | { |
||
1267 | GLenum Mode; /**< GL_EYE_LINEAR, GL_SPHERE_MAP, etc */ |
||
1268 | GLbitfield _ModeBit; /**< TEXGEN_x bit corresponding to Mode */ |
||
1269 | GLfloat ObjectPlane[4]; |
||
1270 | GLfloat EyePlane[4]; |
||
1271 | }; |
||
1272 | |||
1273 | |||
1274 | /** |
||
1275 | * Texture unit state. Contains enable flags, texture environment/function/ |
||
1276 | * combiners, texgen state, and pointers to current texture objects. |
||
1277 | */ |
||
1278 | struct gl_texture_unit |
||
1279 | { |
||
1280 | GLbitfield Enabled; /**< bitmask of TEXTURE_*_BIT flags */ |
||
1281 | GLbitfield _ReallyEnabled; /**< 0 or exactly one of TEXTURE_*_BIT flags */ |
||
1282 | |||
1283 | GLenum EnvMode; /**< GL_MODULATE, GL_DECAL, GL_BLEND, etc. */ |
||
1284 | GLclampf EnvColor[4]; |
||
1285 | GLfloat EnvColorUnclamped[4]; |
||
1286 | |||
1287 | struct gl_texgen GenS; |
||
1288 | struct gl_texgen GenT; |
||
1289 | struct gl_texgen GenR; |
||
1290 | struct gl_texgen GenQ; |
||
1291 | GLbitfield TexGenEnabled; /**< Bitwise-OR of [STRQ]_BIT values */ |
||
1292 | GLbitfield _GenFlags; /**< Bitwise-OR of Gen[STRQ]._ModeBit */ |
||
1293 | |||
1294 | GLfloat LodBias; /**< for biasing mipmap levels */ |
||
1295 | GLenum BumpTarget; |
||
1296 | GLfloat RotMatrix[4]; /* 2x2 matrix */ |
||
1297 | |||
1298 | /** Current sampler object (GL_ARB_sampler_objects) */ |
||
1299 | struct gl_sampler_object *Sampler; |
||
1300 | |||
1301 | /** |
||
1302 | * \name GL_EXT_texture_env_combine |
||
1303 | */ |
||
1304 | struct gl_tex_env_combine_state Combine; |
||
1305 | |||
1306 | /** |
||
1307 | * Derived state based on \c EnvMode and the \c BaseFormat of the |
||
1308 | * currently enabled texture. |
||
1309 | */ |
||
1310 | struct gl_tex_env_combine_state _EnvMode; |
||
1311 | |||
1312 | /** |
||
1313 | * Currently enabled combiner state. This will point to either |
||
1314 | * \c Combine or \c _EnvMode. |
||
1315 | */ |
||
1316 | struct gl_tex_env_combine_state *_CurrentCombine; |
||
1317 | |||
1318 | /** Current texture object pointers */ |
||
1319 | struct gl_texture_object *CurrentTex[NUM_TEXTURE_TARGETS]; |
||
1320 | |||
1321 | /** Points to highest priority, complete and enabled texture object */ |
||
1322 | struct gl_texture_object *_Current; |
||
1323 | }; |
||
1324 | |||
1325 | |||
1326 | /** |
||
1327 | * Texture attribute group (GL_TEXTURE_BIT). |
||
1328 | */ |
||
1329 | struct gl_texture_attrib |
||
1330 | { |
||
1331 | GLuint CurrentUnit; /**< GL_ACTIVE_TEXTURE */ |
||
1332 | struct gl_texture_unit Unit[MAX_COMBINED_TEXTURE_IMAGE_UNITS]; |
||
1333 | |||
1334 | struct gl_texture_object *ProxyTex[NUM_TEXTURE_TARGETS]; |
||
1335 | |||
1336 | /** GL_ARB_texture_buffer_object */ |
||
1337 | struct gl_buffer_object *BufferObject; |
||
1338 | |||
1339 | /** GL_ARB_seamless_cubemap */ |
||
1340 | GLboolean CubeMapSeamless; |
||
1341 | |||
1342 | /** Texture units/samplers used by vertex or fragment texturing */ |
||
1343 | GLbitfield _EnabledUnits; |
||
1344 | |||
1345 | /** Texture coord units/sets used for fragment texturing */ |
||
1346 | GLbitfield _EnabledCoordUnits; |
||
1347 | |||
1348 | /** Texture coord units that have texgen enabled */ |
||
1349 | GLbitfield _TexGenEnabled; |
||
1350 | |||
1351 | /** Texture coord units that have non-identity matrices */ |
||
1352 | GLbitfield _TexMatEnabled; |
||
1353 | |||
1354 | /** Bitwise-OR of all Texture.Unit[i]._GenFlags */ |
||
1355 | GLbitfield _GenFlags; |
||
1356 | }; |
||
1357 | |||
1358 | |||
1359 | /** |
||
1360 | * Data structure representing a single clip plane (e.g. one of the elements |
||
1361 | * of the ctx->Transform.EyeUserPlane or ctx->Transform._ClipUserPlane array). |
||
1362 | */ |
||
1363 | typedef GLfloat gl_clip_plane[4]; |
||
1364 | |||
1365 | |||
1366 | /** |
||
1367 | * Transformation attribute group (GL_TRANSFORM_BIT). |
||
1368 | */ |
||
1369 | struct gl_transform_attrib |
||
1370 | { |
||
1371 | GLenum MatrixMode; /**< Matrix mode */ |
||
1372 | gl_clip_plane EyeUserPlane[MAX_CLIP_PLANES]; /**< User clip planes */ |
||
1373 | gl_clip_plane _ClipUserPlane[MAX_CLIP_PLANES]; /**< derived */ |
||
1374 | GLbitfield ClipPlanesEnabled; /**< on/off bitmask */ |
||
1375 | GLboolean Normalize; /**< Normalize all normals? */ |
||
1376 | GLboolean RescaleNormals; /**< GL_EXT_rescale_normal */ |
||
1377 | GLboolean RasterPositionUnclipped; /**< GL_IBM_rasterpos_clip */ |
||
1378 | GLboolean DepthClamp; /**< GL_ARB_depth_clamp */ |
||
1379 | |||
1380 | GLfloat CullEyePos[4]; |
||
1381 | GLfloat CullObjPos[4]; |
||
1382 | }; |
||
1383 | |||
1384 | |||
1385 | /** |
||
1386 | * Viewport attribute group (GL_VIEWPORT_BIT). |
||
1387 | */ |
||
1388 | struct gl_viewport_attrib |
||
1389 | { |
||
1390 | GLint X, Y; /**< position */ |
||
1391 | GLsizei Width, Height; /**< size */ |
||
1392 | GLfloat Near, Far; /**< Depth buffer range */ |
||
1393 | GLmatrix _WindowMap; /**< Mapping transformation as a matrix. */ |
||
1394 | }; |
||
1395 | |||
1396 | |||
1397 | /** |
||
1398 | * GL_ARB_vertex/pixel_buffer_object buffer object |
||
1399 | */ |
||
1400 | struct gl_buffer_object |
||
1401 | { |
||
1402 | _glthread_Mutex Mutex; |
||
1403 | GLint RefCount; |
||
1404 | GLuint Name; |
||
1405 | GLenum Usage; /**< GL_STREAM_DRAW_ARB, GL_STREAM_READ_ARB, etc. */ |
||
1406 | GLsizeiptrARB Size; /**< Size of buffer storage in bytes */ |
||
1407 | GLubyte *Data; /**< Location of storage either in RAM or VRAM. */ |
||
1408 | /** Fields describing a mapped buffer */ |
||
1409 | /*@{*/ |
||
1410 | GLbitfield AccessFlags; /**< Mask of GL_MAP_x_BIT flags */ |
||
1411 | GLvoid *Pointer; /**< User-space address of mapping */ |
||
1412 | GLintptr Offset; /**< Mapped offset */ |
||
1413 | GLsizeiptr Length; /**< Mapped length */ |
||
1414 | /*@}*/ |
||
1415 | GLboolean DeletePending; /**< true if buffer object is removed from the hash */ |
||
1416 | GLboolean Written; /**< Ever written to? (for debugging) */ |
||
1417 | GLboolean Purgeable; /**< Is the buffer purgeable under memory pressure? */ |
||
1418 | }; |
||
1419 | |||
1420 | |||
1421 | /** |
||
1422 | * Client pixel packing/unpacking attributes |
||
1423 | */ |
||
1424 | struct gl_pixelstore_attrib |
||
1425 | { |
||
1426 | GLint Alignment; |
||
1427 | GLint RowLength; |
||
1428 | GLint SkipPixels; |
||
1429 | GLint SkipRows; |
||
1430 | GLint ImageHeight; |
||
1431 | GLint SkipImages; |
||
1432 | GLboolean SwapBytes; |
||
1433 | GLboolean LsbFirst; |
||
1434 | GLboolean Invert; /**< GL_MESA_pack_invert */ |
||
1435 | struct gl_buffer_object *BufferObj; /**< GL_ARB_pixel_buffer_object */ |
||
1436 | }; |
||
1437 | |||
1438 | |||
1439 | /** |
||
1440 | * Client vertex array attributes |
||
1441 | */ |
||
1442 | struct gl_client_array |
||
1443 | { |
||
1444 | GLint Size; /**< components per element (1,2,3,4) */ |
||
1445 | GLenum Type; /**< datatype: GL_FLOAT, GL_INT, etc */ |
||
1446 | GLenum Format; /**< default: GL_RGBA, but may be GL_BGRA */ |
||
1447 | GLsizei Stride; /**< user-specified stride */ |
||
1448 | GLsizei StrideB; /**< actual stride in bytes */ |
||
1449 | const GLubyte *Ptr; /**< Points to array data */ |
||
1450 | GLboolean Enabled; /**< Enabled flag is a boolean */ |
||
1451 | GLboolean Normalized; /**< GL_ARB_vertex_program */ |
||
1452 | GLboolean Integer; /**< Integer-valued? */ |
||
1453 | GLuint InstanceDivisor; /**< GL_ARB_instanced_arrays */ |
||
1454 | GLuint _ElementSize; /**< size of each element in bytes */ |
||
1455 | |||
1456 | struct gl_buffer_object *BufferObj;/**< GL_ARB_vertex_buffer_object */ |
||
1457 | GLuint _MaxElement; /**< max element index into array buffer + 1 */ |
||
1458 | }; |
||
1459 | |||
1460 | |||
1461 | /** |
||
1462 | * Collection of vertex arrays. Defined by the GL_APPLE_vertex_array_object |
||
1463 | * extension, but a nice encapsulation in any case. |
||
1464 | */ |
||
1465 | struct gl_array_object |
||
1466 | { |
||
1467 | /** Name of the array object as received from glGenVertexArrayAPPLE. */ |
||
1468 | GLuint Name; |
||
1469 | |||
1470 | GLint RefCount; |
||
1471 | _glthread_Mutex Mutex; |
||
1472 | |||
1473 | /** |
||
1474 | * Does the VAO use ARB semantics or Apple semantics? |
||
1475 | * |
||
1476 | * There are several ways in which ARB_vertex_array_object and |
||
1477 | * APPLE_vertex_array_object VAOs have differing semantics. At the very |
||
1478 | * least, |
||
1479 | * |
||
1480 | * - ARB VAOs require that all array data be sourced from vertex buffer |
||
1481 | * objects, but Apple VAOs do not. |
||
1482 | * |
||
1483 | * - ARB VAOs require that names come from GenVertexArrays. |
||
1484 | * |
||
1485 | * This flag notes which behavior governs this VAO. |
||
1486 | */ |
||
1487 | GLboolean ARBsemantics; |
||
1488 | |||
1489 | /** |
||
1490 | * Has this array object been bound? |
||
1491 | */ |
||
1492 | GLboolean EverBound; |
||
1493 | |||
1494 | /** Vertex attribute arrays */ |
||
1495 | struct gl_client_array VertexAttrib[VERT_ATTRIB_MAX]; |
||
1496 | |||
1497 | /** Mask of VERT_BIT_* values indicating which arrays are enabled */ |
||
1498 | GLbitfield64 _Enabled; |
||
1499 | |||
1500 | /** |
||
1501 | * Min of all enabled arrays' _MaxElement. When arrays reside inside VBOs |
||
1502 | * we can determine the max legal (in bounds) glDrawElements array index. |
||
1503 | */ |
||
1504 | GLuint _MaxElement; |
||
1505 | |||
1506 | struct gl_buffer_object *ElementArrayBufferObj; |
||
1507 | }; |
||
1508 | |||
1509 | |||
1510 | /** |
||
1511 | * Vertex array state |
||
1512 | */ |
||
1513 | struct gl_array_attrib |
||
1514 | { |
||
1515 | /** Currently bound array object. See _mesa_BindVertexArrayAPPLE() */ |
||
1516 | struct gl_array_object *ArrayObj; |
||
1517 | |||
1518 | /** The default vertex array object */ |
||
1519 | struct gl_array_object *DefaultArrayObj; |
||
1520 | |||
1521 | /** Array objects (GL_ARB/APPLE_vertex_array_object) */ |
||
1522 | struct _mesa_HashTable *Objects; |
||
1523 | |||
1524 | GLint ActiveTexture; /**< Client Active Texture */ |
||
1525 | GLuint LockFirst; /**< GL_EXT_compiled_vertex_array */ |
||
1526 | GLuint LockCount; /**< GL_EXT_compiled_vertex_array */ |
||
1527 | |||
1528 | /** |
||
1529 | * \name Primitive restart controls |
||
1530 | * |
||
1531 | * Primitive restart is enabled if either \c PrimitiveRestart or |
||
1532 | * \c PrimitiveRestartFixedIndex is set. |
||
1533 | */ |
||
1534 | /*@{*/ |
||
1535 | GLboolean PrimitiveRestart; |
||
1536 | GLboolean PrimitiveRestartFixedIndex; |
||
1537 | GLboolean _PrimitiveRestart; |
||
1538 | GLuint RestartIndex; |
||
1539 | /*@}*/ |
||
1540 | |||
1541 | /* GL_ARB_vertex_buffer_object */ |
||
1542 | struct gl_buffer_object *ArrayBufferObj; |
||
1543 | |||
1544 | /** |
||
1545 | * Vertex arrays as consumed by a driver. |
||
1546 | * The array pointer is set up only by the VBO module. |
||
1547 | */ |
||
1548 | const struct gl_client_array **_DrawArrays; /**< 0..VERT_ATTRIB_MAX-1 */ |
||
1549 | }; |
||
1550 | |||
1551 | |||
1552 | /** |
||
1553 | * Feedback buffer state |
||
1554 | */ |
||
1555 | struct gl_feedback |
||
1556 | { |
||
1557 | GLenum Type; |
||
1558 | GLbitfield _Mask; /**< FB_* bits */ |
||
1559 | GLfloat *Buffer; |
||
1560 | GLuint BufferSize; |
||
1561 | GLuint Count; |
||
1562 | }; |
||
1563 | |||
1564 | |||
1565 | /** |
||
1566 | * Selection buffer state |
||
1567 | */ |
||
1568 | struct gl_selection |
||
1569 | { |
||
1570 | GLuint *Buffer; /**< selection buffer */ |
||
1571 | GLuint BufferSize; /**< size of the selection buffer */ |
||
1572 | GLuint BufferCount; /**< number of values in the selection buffer */ |
||
1573 | GLuint Hits; /**< number of records in the selection buffer */ |
||
1574 | GLuint NameStackDepth; /**< name stack depth */ |
||
1575 | GLuint NameStack[MAX_NAME_STACK_DEPTH]; /**< name stack */ |
||
1576 | GLboolean HitFlag; /**< hit flag */ |
||
1577 | GLfloat HitMinZ; /**< minimum hit depth */ |
||
1578 | GLfloat HitMaxZ; /**< maximum hit depth */ |
||
1579 | }; |
||
1580 | |||
1581 | |||
1582 | /** |
||
1583 | * 1-D Evaluator control points |
||
1584 | */ |
||
1585 | struct gl_1d_map |
||
1586 | { |
||
1587 | GLuint Order; /**< Number of control points */ |
||
1588 | GLfloat u1, u2, du; /**< u1, u2, 1.0/(u2-u1) */ |
||
1589 | GLfloat *Points; /**< Points to contiguous control points */ |
||
1590 | }; |
||
1591 | |||
1592 | |||
1593 | /** |
||
1594 | * 2-D Evaluator control points |
||
1595 | */ |
||
1596 | struct gl_2d_map |
||
1597 | { |
||
1598 | GLuint Uorder; /**< Number of control points in U dimension */ |
||
1599 | GLuint Vorder; /**< Number of control points in V dimension */ |
||
1600 | GLfloat u1, u2, du; |
||
1601 | GLfloat v1, v2, dv; |
||
1602 | GLfloat *Points; /**< Points to contiguous control points */ |
||
1603 | }; |
||
1604 | |||
1605 | |||
1606 | /** |
||
1607 | * All evaluator control point state |
||
1608 | */ |
||
1609 | struct gl_evaluators |
||
1610 | { |
||
1611 | /** |
||
1612 | * \name 1-D maps |
||
1613 | */ |
||
1614 | /*@{*/ |
||
1615 | struct gl_1d_map Map1Vertex3; |
||
1616 | struct gl_1d_map Map1Vertex4; |
||
1617 | struct gl_1d_map Map1Index; |
||
1618 | struct gl_1d_map Map1Color4; |
||
1619 | struct gl_1d_map Map1Normal; |
||
1620 | struct gl_1d_map Map1Texture1; |
||
1621 | struct gl_1d_map Map1Texture2; |
||
1622 | struct gl_1d_map Map1Texture3; |
||
1623 | struct gl_1d_map Map1Texture4; |
||
1624 | /*@}*/ |
||
1625 | |||
1626 | /** |
||
1627 | * \name 2-D maps |
||
1628 | */ |
||
1629 | /*@{*/ |
||
1630 | struct gl_2d_map Map2Vertex3; |
||
1631 | struct gl_2d_map Map2Vertex4; |
||
1632 | struct gl_2d_map Map2Index; |
||
1633 | struct gl_2d_map Map2Color4; |
||
1634 | struct gl_2d_map Map2Normal; |
||
1635 | struct gl_2d_map Map2Texture1; |
||
1636 | struct gl_2d_map Map2Texture2; |
||
1637 | struct gl_2d_map Map2Texture3; |
||
1638 | struct gl_2d_map Map2Texture4; |
||
1639 | /*@}*/ |
||
1640 | }; |
||
1641 | |||
1642 | |||
1643 | struct gl_transform_feedback_varying_info |
||
1644 | { |
||
1645 | char *Name; |
||
1646 | GLenum Type; |
||
1647 | GLint Size; |
||
1648 | }; |
||
1649 | |||
1650 | |||
1651 | /** |
||
1652 | * Per-output info vertex shaders for transform feedback. |
||
1653 | */ |
||
1654 | struct gl_transform_feedback_output |
||
1655 | { |
||
1656 | unsigned OutputRegister; |
||
1657 | unsigned OutputBuffer; |
||
1658 | unsigned NumComponents; |
||
1659 | |||
1660 | /** offset (in DWORDs) of this output within the interleaved structure */ |
||
1661 | unsigned DstOffset; |
||
1662 | |||
1663 | /** |
||
1664 | * Offset into the output register of the data to output. For example, |
||
1665 | * if NumComponents is 2 and ComponentOffset is 1, then the data to |
||
1666 | * offset is in the y and z components of the output register. |
||
1667 | */ |
||
1668 | unsigned ComponentOffset; |
||
1669 | }; |
||
1670 | |||
1671 | |||
1672 | /** Post-link transform feedback info. */ |
||
1673 | struct gl_transform_feedback_info |
||
1674 | { |
||
1675 | unsigned NumOutputs; |
||
1676 | |||
1677 | /** |
||
1678 | * Number of transform feedback buffers in use by this program. |
||
1679 | */ |
||
1680 | unsigned NumBuffers; |
||
1681 | |||
1682 | struct gl_transform_feedback_output *Outputs; |
||
1683 | |||
1684 | /** Transform feedback varyings used for the linking of this shader program. |
||
1685 | * |
||
1686 | * Use for glGetTransformFeedbackVarying(). |
||
1687 | */ |
||
1688 | struct gl_transform_feedback_varying_info *Varyings; |
||
1689 | GLint NumVarying; |
||
1690 | |||
1691 | /** |
||
1692 | * Total number of components stored in each buffer. This may be used by |
||
1693 | * hardware back-ends to determine the correct stride when interleaving |
||
1694 | * multiple transform feedback outputs in the same buffer. |
||
1695 | */ |
||
1696 | unsigned BufferStride[MAX_FEEDBACK_BUFFERS]; |
||
1697 | }; |
||
1698 | |||
1699 | |||
1700 | /** |
||
1701 | * Transform feedback object state |
||
1702 | */ |
||
1703 | struct gl_transform_feedback_object |
||
1704 | { |
||
1705 | GLuint Name; /**< AKA the object ID */ |
||
1706 | GLint RefCount; |
||
1707 | GLboolean Active; /**< Is transform feedback enabled? */ |
||
1708 | GLboolean Paused; /**< Is transform feedback paused? */ |
||
1709 | GLboolean EndedAnytime; /**< Has EndTransformFeedback been called |
||
1710 | at least once? */ |
||
1711 | GLboolean EverBound; /**< Has this object been bound? */ |
||
1712 | |||
1713 | /** |
||
1714 | * GLES: if Active is true, remaining number of primitives which can be |
||
1715 | * rendered without overflow. This is necessary to track because GLES |
||
1716 | * requires us to generate INVALID_OPERATION if a call to glDrawArrays or |
||
1717 | * glDrawArraysInstanced would overflow transform feedback buffers. |
||
1718 | * Undefined if Active is false. |
||
1719 | * |
||
1720 | * Not tracked for desktop GL since it's unnecessary. |
||
1721 | */ |
||
1722 | unsigned GlesRemainingPrims; |
||
1723 | |||
1724 | /** The feedback buffers */ |
||
1725 | GLuint BufferNames[MAX_FEEDBACK_BUFFERS]; |
||
1726 | struct gl_buffer_object *Buffers[MAX_FEEDBACK_BUFFERS]; |
||
1727 | |||
1728 | /** Start of feedback data in dest buffer */ |
||
1729 | GLintptr Offset[MAX_FEEDBACK_BUFFERS]; |
||
1730 | |||
1731 | /** |
||
1732 | * Max data to put into dest buffer (in bytes). Computed based on |
||
1733 | * RequestedSize and the actual size of the buffer. |
||
1734 | */ |
||
1735 | GLsizeiptr Size[MAX_FEEDBACK_BUFFERS]; |
||
1736 | |||
1737 | /** |
||
1738 | * Size that was specified when the buffer was bound. If the buffer was |
||
1739 | * bound with glBindBufferBase() or glBindBufferOffsetEXT(), this value is |
||
1740 | * zero. |
||
1741 | */ |
||
1742 | GLsizeiptr RequestedSize[MAX_FEEDBACK_BUFFERS]; |
||
1743 | }; |
||
1744 | |||
1745 | |||
1746 | /** |
||
1747 | * Context state for transform feedback. |
||
1748 | */ |
||
1749 | struct gl_transform_feedback_state |
||
1750 | { |
||
1751 | GLenum Mode; /**< GL_POINTS, GL_LINES or GL_TRIANGLES */ |
||
1752 | |||
1753 | /** The general binding point (GL_TRANSFORM_FEEDBACK_BUFFER) */ |
||
1754 | struct gl_buffer_object *CurrentBuffer; |
||
1755 | |||
1756 | /** The table of all transform feedback objects */ |
||
1757 | struct _mesa_HashTable *Objects; |
||
1758 | |||
1759 | /** The current xform-fb object (GL_TRANSFORM_FEEDBACK_BINDING) */ |
||
1760 | struct gl_transform_feedback_object *CurrentObject; |
||
1761 | |||
1762 | /** The default xform-fb object (Name==0) */ |
||
1763 | struct gl_transform_feedback_object *DefaultObject; |
||
1764 | }; |
||
1765 | |||
1766 | |||
1767 | /** |
||
1768 | * Names of the various vertex/fragment program register files, etc. |
||
1769 | * |
||
1770 | * NOTE: first four tokens must fit into 2 bits (see t_vb_arbprogram.c) |
||
1771 | * All values should fit in a 4-bit field. |
||
1772 | * |
||
1773 | * NOTE: PROGRAM_ENV_PARAM, PROGRAM_STATE_VAR, |
||
1774 | * PROGRAM_CONSTANT, and PROGRAM_UNIFORM can all be considered to |
||
1775 | * be "uniform" variables since they can only be set outside glBegin/End. |
||
1776 | * They're also all stored in the same Parameters array. |
||
1777 | */ |
||
1778 | typedef enum |
||
1779 | { |
||
1780 | PROGRAM_TEMPORARY, /**< machine->Temporary[] */ |
||
1781 | PROGRAM_ARRAY, /**< Arrays & Matrixes */ |
||
1782 | PROGRAM_INPUT, /**< machine->Inputs[] */ |
||
1783 | PROGRAM_OUTPUT, /**< machine->Outputs[] */ |
||
1784 | PROGRAM_LOCAL_PARAM, /**< gl_program->LocalParams[] */ |
||
1785 | PROGRAM_ENV_PARAM, /**< gl_program->Parameters[] */ |
||
1786 | PROGRAM_STATE_VAR, /**< gl_program->Parameters[] */ |
||
1787 | PROGRAM_CONSTANT, /**< gl_program->Parameters[] */ |
||
1788 | PROGRAM_UNIFORM, /**< gl_program->Parameters[] */ |
||
1789 | PROGRAM_WRITE_ONLY, /**< A dummy, write-only register */ |
||
1790 | PROGRAM_ADDRESS, /**< machine->AddressReg */ |
||
1791 | PROGRAM_SAMPLER, /**< for shader samplers, compile-time only */ |
||
1792 | PROGRAM_SYSTEM_VALUE,/**< InstanceId, PrimitiveID, etc. */ |
||
1793 | PROGRAM_UNDEFINED, /**< Invalid/TBD value */ |
||
1794 | PROGRAM_FILE_MAX |
||
1795 | } gl_register_file; |
||
1796 | |||
1797 | |||
1798 | /** |
||
1799 | * If the register file is PROGRAM_SYSTEM_VALUE, the register index will be |
||
1800 | * one of these values. |
||
1801 | */ |
||
1802 | typedef enum |
||
1803 | { |
||
1804 | SYSTEM_VALUE_FRONT_FACE, /**< Fragment shader only (not done yet) */ |
||
1805 | SYSTEM_VALUE_VERTEX_ID, /**< Vertex shader only */ |
||
1806 | SYSTEM_VALUE_INSTANCE_ID, /**< Vertex shader only */ |
||
1807 | SYSTEM_VALUE_MAX /**< Number of values */ |
||
1808 | } gl_system_value; |
||
1809 | |||
1810 | |||
1811 | /** |
||
1812 | * The possible interpolation qualifiers that can be applied to a fragment |
||
1813 | * shader input in GLSL. |
||
1814 | * |
||
1815 | * Note: INTERP_QUALIFIER_NONE must be 0 so that memsetting the |
||
1816 | * gl_fragment_program data structure to 0 causes the default behavior. |
||
1817 | */ |
||
1818 | enum glsl_interp_qualifier |
||
1819 | { |
||
1820 | INTERP_QUALIFIER_NONE = 0, |
||
1821 | INTERP_QUALIFIER_SMOOTH, |
||
1822 | INTERP_QUALIFIER_FLAT, |
||
1823 | INTERP_QUALIFIER_NOPERSPECTIVE, |
||
1824 | INTERP_QUALIFIER_COUNT /**< Number of interpolation qualifiers */ |
||
1825 | }; |
||
1826 | |||
1827 | |||
1828 | /** |
||
1829 | * \brief Layout qualifiers for gl_FragDepth. |
||
1830 | * |
||
1831 | * Extension AMD_conservative_depth allows gl_FragDepth to be redeclared with |
||
1832 | * a layout qualifier. |
||
1833 | * |
||
1834 | * \see enum ir_depth_layout |
||
1835 | */ |
||
1836 | enum gl_frag_depth_layout |
||
1837 | { |
||
1838 | FRAG_DEPTH_LAYOUT_NONE, /**< No layout is specified. */ |
||
1839 | FRAG_DEPTH_LAYOUT_ANY, |
||
1840 | FRAG_DEPTH_LAYOUT_GREATER, |
||
1841 | FRAG_DEPTH_LAYOUT_LESS, |
||
1842 | FRAG_DEPTH_LAYOUT_UNCHANGED |
||
1843 | }; |
||
1844 | |||
1845 | |||
1846 | /** |
||
1847 | * Base class for any kind of program object |
||
1848 | */ |
||
1849 | struct gl_program |
||
1850 | { |
||
1851 | GLuint Id; |
||
1852 | GLubyte *String; /**< Null-terminated program text */ |
||
1853 | GLint RefCount; |
||
1854 | GLenum Target; /**< GL_VERTEX/FRAGMENT_PROGRAM_ARB */ |
||
1855 | GLenum Format; /**< String encoding format */ |
||
1856 | |||
1857 | struct prog_instruction *Instructions; |
||
1858 | |||
1859 | GLbitfield64 InputsRead; /**< Bitmask of which input regs are read */ |
||
1860 | GLbitfield64 OutputsWritten; /**< Bitmask of which output regs are written */ |
||
1861 | GLbitfield SystemValuesRead; /**< Bitmask of SYSTEM_VALUE_x inputs used */ |
||
1862 | GLbitfield InputFlags[MAX_PROGRAM_INPUTS]; /**< PROG_PARAM_BIT_x flags */ |
||
1863 | GLbitfield OutputFlags[MAX_PROGRAM_OUTPUTS]; /**< PROG_PARAM_BIT_x flags */ |
||
1864 | GLbitfield TexturesUsed[MAX_COMBINED_TEXTURE_IMAGE_UNITS]; /**< TEXTURE_x_BIT bitmask */ |
||
1865 | GLbitfield SamplersUsed; /**< Bitfield of which samplers are used */ |
||
1866 | GLbitfield ShadowSamplers; /**< Texture units used for shadow sampling. */ |
||
1867 | |||
1868 | |||
1869 | /** Named parameters, constants, etc. from program text */ |
||
1870 | struct gl_program_parameter_list *Parameters; |
||
1871 | /** Numbered local parameters */ |
||
1872 | GLfloat LocalParams[MAX_PROGRAM_LOCAL_PARAMS][4]; |
||
1873 | |||
1874 | /** Map from sampler unit to texture unit (set by glUniform1i()) */ |
||
1875 | GLubyte SamplerUnits[MAX_SAMPLERS]; |
||
1876 | |||
1877 | /** Bitmask of which register files are read/written with indirect |
||
1878 | * addressing. Mask of (1 << PROGRAM_x) bits. |
||
1879 | */ |
||
1880 | GLbitfield IndirectRegisterFiles; |
||
1881 | |||
1882 | /** Logical counts */ |
||
1883 | /*@{*/ |
||
1884 | GLuint NumInstructions; |
||
1885 | GLuint NumTemporaries; |
||
1886 | GLuint NumParameters; |
||
1887 | GLuint NumAttributes; |
||
1888 | GLuint NumAddressRegs; |
||
1889 | GLuint NumAluInstructions; |
||
1890 | GLuint NumTexInstructions; |
||
1891 | GLuint NumTexIndirections; |
||
1892 | /*@}*/ |
||
1893 | /** Native, actual h/w counts */ |
||
1894 | /*@{*/ |
||
1895 | GLuint NumNativeInstructions; |
||
1896 | GLuint NumNativeTemporaries; |
||
1897 | GLuint NumNativeParameters; |
||
1898 | GLuint NumNativeAttributes; |
||
1899 | GLuint NumNativeAddressRegs; |
||
1900 | GLuint NumNativeAluInstructions; |
||
1901 | GLuint NumNativeTexInstructions; |
||
1902 | GLuint NumNativeTexIndirections; |
||
1903 | /*@}*/ |
||
1904 | }; |
||
1905 | |||
1906 | |||
1907 | /** Vertex program object */ |
||
1908 | struct gl_vertex_program |
||
1909 | { |
||
1910 | struct gl_program Base; /**< base class */ |
||
1911 | GLboolean IsPositionInvariant; |
||
1912 | GLboolean UsesClipDistance; |
||
1913 | }; |
||
1914 | |||
1915 | |||
1916 | /** Geometry program object */ |
||
1917 | struct gl_geometry_program |
||
1918 | { |
||
1919 | struct gl_program Base; /**< base class */ |
||
1920 | |||
1921 | GLint VerticesOut; |
||
1922 | GLenum InputType; /**< GL_POINTS, GL_LINES, GL_LINES_ADJACENCY_ARB, |
||
1923 | GL_TRIANGLES, or GL_TRIANGLES_ADJACENCY_ARB */ |
||
1924 | GLenum OutputType; /**< GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP */ |
||
1925 | }; |
||
1926 | |||
1927 | |||
1928 | /** Fragment program object */ |
||
1929 | struct gl_fragment_program |
||
1930 | { |
||
1931 | struct gl_program Base; /**< base class */ |
||
1932 | GLboolean UsesKill; /**< shader uses KIL instruction */ |
||
1933 | GLboolean UsesDFdy; /**< shader uses DDY instruction */ |
||
1934 | GLboolean OriginUpperLeft; |
||
1935 | GLboolean PixelCenterInteger; |
||
1936 | enum gl_frag_depth_layout FragDepthLayout; |
||
1937 | |||
1938 | /** |
||
1939 | * GLSL interpolation qualifier associated with each fragment shader input. |
||
1940 | * For inputs that do not have an interpolation qualifier specified in |
||
1941 | * GLSL, the value is INTERP_QUALIFIER_NONE. |
||
1942 | */ |
||
1943 | enum glsl_interp_qualifier InterpQualifier[VARYING_SLOT_MAX]; |
||
1944 | |||
1945 | /** |
||
1946 | * Bitfield indicating, for each fragment shader input, 1 if that input |
||
1947 | * uses centroid interpolation, 0 otherwise. Unused inputs are 0. |
||
1948 | */ |
||
1949 | GLbitfield64 IsCentroid; |
||
1950 | }; |
||
1951 | |||
1952 | |||
1953 | /** |
||
1954 | * State common to vertex and fragment programs. |
||
1955 | */ |
||
1956 | struct gl_program_state |
||
1957 | { |
||
1958 | GLint ErrorPos; /* GL_PROGRAM_ERROR_POSITION_ARB/NV */ |
||
1959 | const char *ErrorString; /* GL_PROGRAM_ERROR_STRING_ARB/NV */ |
||
1960 | }; |
||
1961 | |||
1962 | |||
1963 | /** |
||
1964 | * Context state for vertex programs. |
||
1965 | */ |
||
1966 | struct gl_vertex_program_state |
||
1967 | { |
||
1968 | GLboolean Enabled; /**< User-set GL_VERTEX_PROGRAM_ARB/NV flag */ |
||
1969 | GLboolean _Enabled; /**< Enabled and _valid_ user program? */ |
||
1970 | GLboolean PointSizeEnabled; /**< GL_VERTEX_PROGRAM_POINT_SIZE_ARB/NV */ |
||
1971 | GLboolean TwoSideEnabled; /**< GL_VERTEX_PROGRAM_TWO_SIDE_ARB/NV */ |
||
1972 | /** Computed two sided lighting for fixed function/programs. */ |
||
1973 | GLboolean _TwoSideEnabled; |
||
1974 | struct gl_vertex_program *Current; /**< User-bound vertex program */ |
||
1975 | |||
1976 | /** Currently enabled and valid vertex program (including internal |
||
1977 | * programs, user-defined vertex programs and GLSL vertex shaders). |
||
1978 | * This is the program we must use when rendering. |
||
1979 | */ |
||
1980 | struct gl_vertex_program *_Current; |
||
1981 | |||
1982 | GLfloat Parameters[MAX_PROGRAM_ENV_PARAMS][4]; /**< Env params */ |
||
1983 | |||
1984 | /** Should fixed-function T&L be implemented with a vertex prog? */ |
||
1985 | GLboolean _MaintainTnlProgram; |
||
1986 | |||
1987 | /** Program to emulate fixed-function T&L (see above) */ |
||
1988 | struct gl_vertex_program *_TnlProgram; |
||
1989 | |||
1990 | /** Cache of fixed-function programs */ |
||
1991 | struct gl_program_cache *Cache; |
||
1992 | |||
1993 | GLboolean _Overriden; |
||
1994 | }; |
||
1995 | |||
1996 | |||
1997 | /** |
||
1998 | * Context state for geometry programs. |
||
1999 | */ |
||
2000 | struct gl_geometry_program_state |
||
2001 | { |
||
2002 | GLboolean Enabled; /**< GL_ARB_GEOMETRY_SHADER4 */ |
||
2003 | GLboolean _Enabled; /**< Enabled and valid program? */ |
||
2004 | struct gl_geometry_program *Current; /**< user-bound geometry program */ |
||
2005 | |||
2006 | /** Currently enabled and valid program (including internal programs |
||
2007 | * and compiled shader programs). |
||
2008 | */ |
||
2009 | struct gl_geometry_program *_Current; |
||
2010 | |||
2011 | GLfloat Parameters[MAX_PROGRAM_ENV_PARAMS][4]; /**< Env params */ |
||
2012 | |||
2013 | /** Cache of fixed-function programs */ |
||
2014 | struct gl_program_cache *Cache; |
||
2015 | }; |
||
2016 | |||
2017 | /** |
||
2018 | * Context state for fragment programs. |
||
2019 | */ |
||
2020 | struct gl_fragment_program_state |
||
2021 | { |
||
2022 | GLboolean Enabled; /**< User-set fragment program enable flag */ |
||
2023 | GLboolean _Enabled; /**< Enabled and _valid_ user program? */ |
||
2024 | struct gl_fragment_program *Current; /**< User-bound fragment program */ |
||
2025 | |||
2026 | /** Currently enabled and valid fragment program (including internal |
||
2027 | * programs, user-defined fragment programs and GLSL fragment shaders). |
||
2028 | * This is the program we must use when rendering. |
||
2029 | */ |
||
2030 | struct gl_fragment_program *_Current; |
||
2031 | |||
2032 | GLfloat Parameters[MAX_PROGRAM_ENV_PARAMS][4]; /**< Env params */ |
||
2033 | |||
2034 | /** Should fixed-function texturing be implemented with a fragment prog? */ |
||
2035 | GLboolean _MaintainTexEnvProgram; |
||
2036 | |||
2037 | /** Program to emulate fixed-function texture env/combine (see above) */ |
||
2038 | struct gl_fragment_program *_TexEnvProgram; |
||
2039 | |||
2040 | /** Cache of fixed-function programs */ |
||
2041 | struct gl_program_cache *Cache; |
||
2042 | }; |
||
2043 | |||
2044 | |||
2045 | /** |
||
2046 | * ATI_fragment_shader runtime state |
||
2047 | */ |
||
2048 | #define ATI_FS_INPUT_PRIMARY 0 |
||
2049 | #define ATI_FS_INPUT_SECONDARY 1 |
||
2050 | |||
2051 | struct atifs_instruction; |
||
2052 | struct atifs_setupinst; |
||
2053 | |||
2054 | /** |
||
2055 | * ATI fragment shader |
||
2056 | */ |
||
2057 | struct ati_fragment_shader |
||
2058 | { |
||
2059 | GLuint Id; |
||
2060 | GLint RefCount; |
||
2061 | struct atifs_instruction *Instructions[2]; |
||
2062 | struct atifs_setupinst *SetupInst[2]; |
||
2063 | GLfloat Constants[8][4]; |
||
2064 | GLbitfield LocalConstDef; /**< Indicates which constants have been set */ |
||
2065 | GLubyte numArithInstr[2]; |
||
2066 | GLubyte regsAssigned[2]; |
||
2067 | GLubyte NumPasses; /**< 1 or 2 */ |
||
2068 | GLubyte cur_pass; |
||
2069 | GLubyte last_optype; |
||
2070 | GLboolean interpinp1; |
||
2071 | GLboolean isValid; |
||
2072 | GLuint swizzlerq; |
||
2073 | }; |
||
2074 | |||
2075 | /** |
||
2076 | * Context state for GL_ATI_fragment_shader |
||
2077 | */ |
||
2078 | struct gl_ati_fragment_shader_state |
||
2079 | { |
||
2080 | GLboolean Enabled; |
||
2081 | GLboolean _Enabled; /**< enabled and valid shader? */ |
||
2082 | GLboolean Compiling; |
||
2083 | GLfloat GlobalConstants[8][4]; |
||
2084 | struct ati_fragment_shader *Current; |
||
2085 | }; |
||
2086 | |||
2087 | |||
2088 | /** Set by #pragma directives */ |
||
2089 | struct gl_sl_pragmas |
||
2090 | { |
||
2091 | GLboolean IgnoreOptimize; /**< ignore #pragma optimize(on/off) ? */ |
||
2092 | GLboolean IgnoreDebug; /**< ignore #pragma debug(on/off) ? */ |
||
2093 | GLboolean Optimize; /**< defaults on */ |
||
2094 | GLboolean Debug; /**< defaults off */ |
||
2095 | }; |
||
2096 | |||
2097 | |||
2098 | /** |
||
2099 | * A GLSL vertex or fragment shader object. |
||
2100 | */ |
||
2101 | struct gl_shader |
||
2102 | { |
||
2103 | /** GL_FRAGMENT_SHADER || GL_VERTEX_SHADER || GL_GEOMETRY_SHADER_ARB. |
||
2104 | * Must be the first field. |
||
2105 | */ |
||
2106 | GLenum Type; |
||
2107 | GLuint Name; /**< AKA the handle */ |
||
2108 | GLint RefCount; /**< Reference count */ |
||
2109 | GLboolean DeletePending; |
||
2110 | GLboolean CompileStatus; |
||
2111 | const GLchar *Source; /**< Source code string */ |
||
2112 | GLuint SourceChecksum; /**< for debug/logging purposes */ |
||
2113 | struct gl_program *Program; /**< Post-compile assembly code */ |
||
2114 | GLchar *InfoLog; |
||
2115 | struct gl_sl_pragmas Pragmas; |
||
2116 | |||
2117 | unsigned Version; /**< GLSL version used for linking */ |
||
2118 | GLboolean IsES; /**< True if this shader uses GLSL ES */ |
||
2119 | |||
2120 | /** |
||
2121 | * \name Sampler tracking |
||
2122 | * |
||
2123 | * \note Each of these fields is only set post-linking. |
||
2124 | */ |
||
2125 | /*@{*/ |
||
2126 | unsigned num_samplers; /**< Number of samplers used by this shader. */ |
||
2127 | GLbitfield active_samplers; /**< Bitfield of which samplers are used */ |
||
2128 | GLbitfield shadow_samplers; /**< Samplers used for shadow sampling. */ |
||
2129 | /*@}*/ |
||
2130 | |||
2131 | /** |
||
2132 | * Map from sampler unit to texture unit (set by glUniform1i()) |
||
2133 | * |
||
2134 | * A sampler unit is associated with each sampler uniform by the linker. |
||
2135 | * The sampler unit associated with each uniform is stored in the |
||
2136 | * \c gl_uniform_storage::sampler field. |
||
2137 | */ |
||
2138 | GLubyte SamplerUnits[MAX_SAMPLERS]; |
||
2139 | /** Which texture target is being sampled (TEXTURE_1D/2D/3D/etc_INDEX) */ |
||
2140 | gl_texture_index SamplerTargets[MAX_SAMPLERS]; |
||
2141 | |||
2142 | /** |
||
2143 | * Number of default uniform block components used by this shader. |
||
2144 | * |
||
2145 | * This field is only set post-linking. |
||
2146 | */ |
||
2147 | unsigned num_uniform_components; |
||
2148 | |||
2149 | /** |
||
2150 | * Number of combined uniform components used by this shader. |
||
2151 | * |
||
2152 | * This field is only set post-linking. It is the sum of the uniform block |
||
2153 | * sizes divided by sizeof(float), and num_uniform_compoennts. |
||
2154 | */ |
||
2155 | unsigned num_combined_uniform_components; |
||
2156 | |||
2157 | /** |
||
2158 | * This shader's uniform block information. |
||
2159 | * |
||
2160 | * The offsets of the variables are assigned only for shaders in a program's |
||
2161 | * _LinkedShaders[]. |
||
2162 | */ |
||
2163 | struct gl_uniform_block *UniformBlocks; |
||
2164 | unsigned NumUniformBlocks; |
||
2165 | |||
2166 | struct exec_list *ir; |
||
2167 | struct glsl_symbol_table *symbols; |
||
2168 | |||
2169 | /** Shaders containing built-in functions that are used for linking. */ |
||
2170 | struct gl_shader *builtins_to_link[16]; |
||
2171 | unsigned num_builtins_to_link; |
||
2172 | }; |
||
2173 | |||
2174 | |||
2175 | /** |
||
2176 | * Shader stages. Note that these will become 5 with tessellation. |
||
2177 | * |
||
2178 | * The order must match how shaders are ordered in the pipeline. |
||
2179 | * The GLSL linker assumes that if i |
||
2180 | * executed later than the i-th shader. |
||
2181 | */ |
||
2182 | typedef enum |
||
2183 | { |
||
2184 | MESA_SHADER_VERTEX = 0, |
||
2185 | MESA_SHADER_GEOMETRY = 1, |
||
2186 | MESA_SHADER_FRAGMENT = 2, |
||
2187 | MESA_SHADER_TYPES = 3 |
||
2188 | } gl_shader_type; |
||
2189 | |||
2190 | |||
2191 | struct gl_uniform_buffer_variable |
||
2192 | { |
||
2193 | char *Name; |
||
2194 | |||
2195 | /** |
||
2196 | * Name of the uniform as seen by glGetUniformIndices. |
||
2197 | * |
||
2198 | * glGetUniformIndices requires that the block instance index \b not be |
||
2199 | * present in the name of queried uniforms. |
||
2200 | * |
||
2201 | * \note |
||
2202 | * \c gl_uniform_buffer_variable::IndexName and |
||
2203 | * \c gl_uniform_buffer_variable::Name may point to identical storage. |
||
2204 | */ |
||
2205 | char *IndexName; |
||
2206 | |||
2207 | const struct glsl_type *Type; |
||
2208 | unsigned int Offset; |
||
2209 | GLboolean RowMajor; |
||
2210 | }; |
||
2211 | |||
2212 | |||
2213 | enum gl_uniform_block_packing |
||
2214 | { |
||
2215 | ubo_packing_std140, |
||
2216 | ubo_packing_shared, |
||
2217 | ubo_packing_packed |
||
2218 | }; |
||
2219 | |||
2220 | |||
2221 | struct gl_uniform_block |
||
2222 | { |
||
2223 | /** Declared name of the uniform block */ |
||
2224 | char *Name; |
||
2225 | |||
2226 | /** Array of supplemental information about UBO ir_variables. */ |
||
2227 | struct gl_uniform_buffer_variable *Uniforms; |
||
2228 | GLuint NumUniforms; |
||
2229 | |||
2230 | /** |
||
2231 | * Index (GL_UNIFORM_BLOCK_BINDING) into ctx->UniformBufferBindings[] to use |
||
2232 | * with glBindBufferBase to bind a buffer object to this uniform block. When |
||
2233 | * updated in the program, _NEW_BUFFER_OBJECT will be set. |
||
2234 | */ |
||
2235 | GLuint Binding; |
||
2236 | |||
2237 | /** |
||
2238 | * Minimum size of a buffer object to back this uniform buffer |
||
2239 | * (GL_UNIFORM_BLOCK_DATA_SIZE). |
||
2240 | */ |
||
2241 | GLuint UniformBufferSize; |
||
2242 | |||
2243 | /** |
||
2244 | * Layout specified in the shader |
||
2245 | * |
||
2246 | * This isn't accessible through the API, but it is used while |
||
2247 | * cross-validating uniform blocks. |
||
2248 | */ |
||
2249 | enum gl_uniform_block_packing _Packing; |
||
2250 | }; |
||
2251 | |||
2252 | |||
2253 | /** |
||
2254 | * A GLSL program object. |
||
2255 | * Basically a linked collection of vertex and fragment shaders. |
||
2256 | */ |
||
2257 | struct gl_shader_program |
||
2258 | { |
||
2259 | GLenum Type; /**< Always GL_SHADER_PROGRAM (internal token) */ |
||
2260 | GLuint Name; /**< aka handle or ID */ |
||
2261 | GLint RefCount; /**< Reference count */ |
||
2262 | GLboolean DeletePending; |
||
2263 | |||
2264 | /** |
||
2265 | * Is the application intending to glGetProgramBinary this program? |
||
2266 | */ |
||
2267 | GLboolean BinaryRetreivableHint; |
||
2268 | |||
2269 | /** |
||
2270 | * Flags that the linker should not reject the program if it lacks |
||
2271 | * a vertex or fragment shader. GLES2 doesn't allow separate |
||
2272 | * shader objects, and would reject them. However, we internally |
||
2273 | * build separate shader objects for fixed function programs, which |
||
2274 | * we use for drivers/common/meta.c and for handling |
||
2275 | * _mesa_update_state with no program bound (for example in |
||
2276 | * glClear()). |
||
2277 | */ |
||
2278 | GLboolean InternalSeparateShader; |
||
2279 | |||
2280 | GLuint NumShaders; /**< number of attached shaders */ |
||
2281 | struct gl_shader **Shaders; /**< List of attached the shaders */ |
||
2282 | |||
2283 | /** |
||
2284 | * User-defined attribute bindings |
||
2285 | * |
||
2286 | * These are set via \c glBindAttribLocation and are used to direct the |
||
2287 | * GLSL linker. These are \b not the values used in the compiled shader, |
||
2288 | * and they are \b not the values returned by \c glGetAttribLocation. |
||
2289 | */ |
||
2290 | struct string_to_uint_map *AttributeBindings; |
||
2291 | |||
2292 | /** |
||
2293 | * User-defined fragment data bindings |
||
2294 | * |
||
2295 | * These are set via \c glBindFragDataLocation and are used to direct the |
||
2296 | * GLSL linker. These are \b not the values used in the compiled shader, |
||
2297 | * and they are \b not the values returned by \c glGetFragDataLocation. |
||
2298 | */ |
||
2299 | struct string_to_uint_map *FragDataBindings; |
||
2300 | struct string_to_uint_map *FragDataIndexBindings; |
||
2301 | |||
2302 | /** |
||
2303 | * Transform feedback varyings last specified by |
||
2304 | * glTransformFeedbackVaryings(). |
||
2305 | * |
||
2306 | * For the current set of transform feeedback varyings used for transform |
||
2307 | * feedback output, see LinkedTransformFeedback. |
||
2308 | */ |
||
2309 | struct { |
||
2310 | GLenum BufferMode; |
||
2311 | GLuint NumVarying; |
||
2312 | GLchar **VaryingNames; /**< Array [NumVarying] of char * */ |
||
2313 | } TransformFeedback; |
||
2314 | |||
2315 | /** Post-link transform feedback info. */ |
||
2316 | struct gl_transform_feedback_info LinkedTransformFeedback; |
||
2317 | |||
2318 | /** Post-link gl_FragDepth layout for ARB_conservative_depth. */ |
||
2319 | enum gl_frag_depth_layout FragDepthLayout; |
||
2320 | |||
2321 | /** Geometry shader state - copied into gl_geometry_program at link time */ |
||
2322 | struct { |
||
2323 | GLint VerticesOut; |
||
2324 | GLenum InputType; /**< GL_POINTS, GL_LINES, GL_LINES_ADJACENCY_ARB, |
||
2325 | GL_TRIANGLES, or GL_TRIANGLES_ADJACENCY_ARB */ |
||
2326 | GLenum OutputType; /**< GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP */ |
||
2327 | } Geom; |
||
2328 | |||
2329 | /** Vertex shader state - copied into gl_vertex_program at link time */ |
||
2330 | struct { |
||
2331 | GLboolean UsesClipDistance; /**< True if gl_ClipDistance is written to. */ |
||
2332 | GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or |
||
2333 | |||
2334 | } Vert; |
||
2335 | |||
2336 | /* post-link info: */ |
||
2337 | unsigned NumUserUniformStorage; |
||
2338 | struct gl_uniform_storage *UniformStorage; |
||
2339 | |||
2340 | struct gl_uniform_block *UniformBlocks; |
||
2341 | unsigned NumUniformBlocks; |
||
2342 | |||
2343 | /** |
||
2344 | * Scale factor for the uniform base location |
||
2345 | * |
||
2346 | * This is used to generate locations (returned by \c glGetUniformLocation) |
||
2347 | * of uniforms. The base location of the uniform is multiplied by this |
||
2348 | * value, and the array index is added. |
||
2349 | * |
||
2350 | * \note |
||
2351 | * Must be >= 1. |
||
2352 | * |
||
2353 | * \sa |
||
2354 | * _mesa_uniform_merge_location_offset, _mesa_uniform_split_location_offset |
||
2355 | */ |
||
2356 | unsigned UniformLocationBaseScale; |
||
2357 | |||
2358 | /** |
||
2359 | * Indices into the _LinkedShaders's UniformBlocks[] array for each stage |
||
2360 | * they're used in, or -1. |
||
2361 | * |
||
2362 | * This is used to maintain the Binding values of the stage's UniformBlocks[] |
||
2363 | * and to answer the GL_UNIFORM_BLOCK_REFERENCED_BY_*_SHADER queries. |
||
2364 | */ |
||
2365 | int *UniformBlockStageIndex[MESA_SHADER_TYPES]; |
||
2366 | |||
2367 | /** |
||
2368 | * Map of active uniform names to locations |
||
2369 | * |
||
2370 | * Maps any active uniform that is not an array element to a location. |
||
2371 | * Each active uniform, including individual structure members will appear |
||
2372 | * in this map. This roughly corresponds to the set of names that would be |
||
2373 | * enumerated by \c glGetActiveUniform. |
||
2374 | */ |
||
2375 | struct string_to_uint_map *UniformHash; |
||
2376 | |||
2377 | GLboolean LinkStatus; /**< GL_LINK_STATUS */ |
||
2378 | GLboolean Validated; |
||
2379 | GLboolean _Used; /**< Ever used for drawing? */ |
||
2380 | GLchar *InfoLog; |
||
2381 | |||
2382 | unsigned Version; /**< GLSL version used for linking */ |
||
2383 | GLboolean IsES; /**< True if this program uses GLSL ES */ |
||
2384 | |||
2385 | /** |
||
2386 | * Per-stage shaders resulting from the first stage of linking. |
||
2387 | * |
||
2388 | * Set of linked shaders for this program. The array is accessed using the |
||
2389 | * \c MESA_SHADER_* defines. Entries for non-existent stages will be |
||
2390 | * \c NULL. |
||
2391 | */ |
||
2392 | struct gl_shader *_LinkedShaders[MESA_SHADER_TYPES]; |
||
2393 | }; |
||
2394 | |||
2395 | |||
2396 | #define GLSL_DUMP 0x1 /**< Dump shaders to stdout */ |
||
2397 | #define GLSL_LOG 0x2 /**< Write shaders to files */ |
||
2398 | #define GLSL_OPT 0x4 /**< Force optimizations (override pragmas) */ |
||
2399 | #define GLSL_NO_OPT 0x8 /**< Force no optimizations (override pragmas) */ |
||
2400 | #define GLSL_UNIFORMS 0x10 /**< Print glUniform calls */ |
||
2401 | #define GLSL_NOP_VERT 0x20 /**< Force no-op vertex shaders */ |
||
2402 | #define GLSL_NOP_FRAG 0x40 /**< Force no-op fragment shaders */ |
||
2403 | #define GLSL_USE_PROG 0x80 /**< Log glUseProgram calls */ |
||
2404 | #define GLSL_REPORT_ERRORS 0x100 /**< Print compilation errors */ |
||
2405 | |||
2406 | |||
2407 | /** |
||
2408 | * Context state for GLSL vertex/fragment shaders. |
||
2409 | */ |
||
2410 | struct gl_shader_state |
||
2411 | { |
||
2412 | /** |
||
2413 | * Programs used for rendering |
||
2414 | * |
||
2415 | * There is a separate program set for each shader stage. If |
||
2416 | * GL_EXT_separate_shader_objects is not supported, each of these must point |
||
2417 | * to \c NULL or to the same program. |
||
2418 | */ |
||
2419 | struct gl_shader_program *CurrentVertexProgram; |
||
2420 | struct gl_shader_program *CurrentGeometryProgram; |
||
2421 | struct gl_shader_program *CurrentFragmentProgram; |
||
2422 | |||
2423 | struct gl_shader_program *_CurrentFragmentProgram; |
||
2424 | |||
2425 | /** |
||
2426 | * Program used by glUniform calls. |
||
2427 | * |
||
2428 | * Explicitly set by \c glUseProgram and \c glActiveProgramEXT. |
||
2429 | */ |
||
2430 | struct gl_shader_program *ActiveProgram; |
||
2431 | |||
2432 | GLbitfield Flags; /**< Mask of GLSL_x flags */ |
||
2433 | }; |
||
2434 | |||
2435 | |||
2436 | /** |
||
2437 | * Compiler options for a single GLSL shaders type |
||
2438 | */ |
||
2439 | struct gl_shader_compiler_options |
||
2440 | { |
||
2441 | /** Driver-selectable options: */ |
||
2442 | GLboolean EmitCondCodes; /**< Use condition codes? */ |
||
2443 | GLboolean EmitNoLoops; |
||
2444 | GLboolean EmitNoFunctions; |
||
2445 | GLboolean EmitNoCont; /**< Emit CONT opcode? */ |
||
2446 | GLboolean EmitNoMainReturn; /**< Emit CONT/RET opcodes? */ |
||
2447 | GLboolean EmitNoNoise; /**< Emit NOISE opcodes? */ |
||
2448 | GLboolean EmitNoPow; /**< Emit POW opcodes? */ |
||
2449 | GLboolean LowerClipDistance; /**< Lower gl_ClipDistance from float[8] to vec4[2]? */ |
||
2450 | |||
2451 | /** |
||
2452 | * \name Forms of indirect addressing the driver cannot do. |
||
2453 | */ |
||
2454 | /*@{*/ |
||
2455 | GLboolean EmitNoIndirectInput; /**< No indirect addressing of inputs */ |
||
2456 | GLboolean EmitNoIndirectOutput; /**< No indirect addressing of outputs */ |
||
2457 | GLboolean EmitNoIndirectTemp; /**< No indirect addressing of temps */ |
||
2458 | GLboolean EmitNoIndirectUniform; /**< No indirect addressing of constants */ |
||
2459 | /*@}*/ |
||
2460 | |||
2461 | GLuint MaxIfDepth; /**< Maximum nested IF blocks */ |
||
2462 | GLuint MaxUnrollIterations; |
||
2463 | |||
2464 | /** |
||
2465 | * Prefer DP4 instructions (rather than MUL/MAD) for matrix * vector |
||
2466 | * operations, such as position transformation. |
||
2467 | */ |
||
2468 | GLboolean PreferDP4; |
||
2469 | |||
2470 | struct gl_sl_pragmas DefaultPragmas; /**< Default #pragma settings */ |
||
2471 | }; |
||
2472 | |||
2473 | |||
2474 | /** |
||
2475 | * Occlusion/timer query object. |
||
2476 | */ |
||
2477 | struct gl_query_object |
||
2478 | { |
||
2479 | GLenum Target; /**< The query target, when active */ |
||
2480 | GLuint Id; /**< hash table ID/name */ |
||
2481 | GLuint64EXT Result; /**< the counter */ |
||
2482 | GLboolean Active; /**< inside Begin/EndQuery */ |
||
2483 | GLboolean Ready; /**< result is ready? */ |
||
2484 | GLboolean EverBound;/**< has query object ever been bound */ |
||
2485 | }; |
||
2486 | |||
2487 | |||
2488 | /** |
||
2489 | * Context state for query objects. |
||
2490 | */ |
||
2491 | struct gl_query_state |
||
2492 | { |
||
2493 | struct _mesa_HashTable *QueryObjects; |
||
2494 | struct gl_query_object *CurrentOcclusionObject; /* GL_ARB_occlusion_query */ |
||
2495 | struct gl_query_object *CurrentTimerObject; /* GL_EXT_timer_query */ |
||
2496 | |||
2497 | /** GL_NV_conditional_render */ |
||
2498 | struct gl_query_object *CondRenderQuery; |
||
2499 | |||
2500 | /** GL_EXT_transform_feedback */ |
||
2501 | struct gl_query_object *PrimitivesGenerated; |
||
2502 | struct gl_query_object *PrimitivesWritten; |
||
2503 | |||
2504 | /** GL_ARB_timer_query */ |
||
2505 | struct gl_query_object *TimeElapsed; |
||
2506 | |||
2507 | GLenum CondRenderMode; |
||
2508 | }; |
||
2509 | |||
2510 | |||
2511 | /** Sync object state */ |
||
2512 | struct gl_sync_object |
||
2513 | { |
||
2514 | GLenum Type; /**< GL_SYNC_FENCE */ |
||
2515 | GLuint Name; /**< Fence name */ |
||
2516 | GLint RefCount; /**< Reference count */ |
||
2517 | GLboolean DeletePending; /**< Object was deleted while there were still |
||
2518 | * live references (e.g., sync not yet finished) |
||
2519 | */ |
||
2520 | GLenum SyncCondition; |
||
2521 | GLbitfield Flags; /**< Flags passed to glFenceSync */ |
||
2522 | GLuint StatusFlag:1; /**< Has the sync object been signaled? */ |
||
2523 | }; |
||
2524 | |||
2525 | |||
2526 | /** |
||
2527 | * State which can be shared by multiple contexts: |
||
2528 | */ |
||
2529 | struct gl_shared_state |
||
2530 | { |
||
2531 | _glthread_Mutex Mutex; /**< for thread safety */ |
||
2532 | GLint RefCount; /**< Reference count */ |
||
2533 | struct _mesa_HashTable *DisplayList; /**< Display lists hash table */ |
||
2534 | struct _mesa_HashTable *TexObjects; /**< Texture objects hash table */ |
||
2535 | |||
2536 | /** Default texture objects (shared by all texture units) */ |
||
2537 | struct gl_texture_object *DefaultTex[NUM_TEXTURE_TARGETS]; |
||
2538 | |||
2539 | /** Fallback texture used when a bound texture is incomplete */ |
||
2540 | struct gl_texture_object *FallbackTex[NUM_TEXTURE_TARGETS]; |
||
2541 | |||
2542 | /** |
||
2543 | * \name Thread safety and statechange notification for texture |
||
2544 | * objects. |
||
2545 | * |
||
2546 | * \todo Improve the granularity of locking. |
||
2547 | */ |
||
2548 | /*@{*/ |
||
2549 | _glthread_Mutex TexMutex; /**< texobj thread safety */ |
||
2550 | GLuint TextureStateStamp; /**< state notification for shared tex */ |
||
2551 | /*@}*/ |
||
2552 | |||
2553 | /** Default buffer object for vertex arrays that aren't in VBOs */ |
||
2554 | struct gl_buffer_object *NullBufferObj; |
||
2555 | |||
2556 | /** |
||
2557 | * \name Vertex/geometry/fragment programs |
||
2558 | */ |
||
2559 | /*@{*/ |
||
2560 | struct _mesa_HashTable *Programs; /**< All vertex/fragment programs */ |
||
2561 | struct gl_vertex_program *DefaultVertexProgram; |
||
2562 | struct gl_fragment_program *DefaultFragmentProgram; |
||
2563 | struct gl_geometry_program *DefaultGeometryProgram; |
||
2564 | /*@}*/ |
||
2565 | |||
2566 | /* GL_ATI_fragment_shader */ |
||
2567 | struct _mesa_HashTable *ATIShaders; |
||
2568 | struct ati_fragment_shader *DefaultFragmentShader; |
||
2569 | |||
2570 | struct _mesa_HashTable *BufferObjects; |
||
2571 | |||
2572 | /** Table of both gl_shader and gl_shader_program objects */ |
||
2573 | struct _mesa_HashTable *ShaderObjects; |
||
2574 | |||
2575 | /* GL_EXT_framebuffer_object */ |
||
2576 | struct _mesa_HashTable *RenderBuffers; |
||
2577 | struct _mesa_HashTable *FrameBuffers; |
||
2578 | |||
2579 | /* GL_ARB_sync */ |
||
2580 | struct set *SyncObjects; |
||
2581 | |||
2582 | /** GL_ARB_sampler_objects */ |
||
2583 | struct _mesa_HashTable *SamplerObjects; |
||
2584 | }; |
||
2585 | |||
2586 | |||
2587 | |||
2588 | /** |
||
2589 | * Renderbuffers represent drawing surfaces such as color, depth and/or |
||
2590 | * stencil. A framebuffer object has a set of renderbuffers. |
||
2591 | * Drivers will typically derive subclasses of this type. |
||
2592 | */ |
||
2593 | struct gl_renderbuffer |
||
2594 | { |
||
2595 | _glthread_Mutex Mutex; /**< for thread safety */ |
||
2596 | GLuint ClassID; /**< Useful for drivers */ |
||
2597 | GLuint Name; |
||
2598 | GLint RefCount; |
||
2599 | GLuint Width, Height; |
||
2600 | GLuint Depth; |
||
2601 | GLboolean Purgeable; /**< Is the buffer purgeable under memory pressure? */ |
||
2602 | GLboolean AttachedAnytime; /**< TRUE if it was attached to a framebuffer */ |
||
2603 | /** |
||
2604 | * True for renderbuffers that wrap textures, giving the driver a chance to |
||
2605 | * flush render caches through the FinishRenderTexture hook. |
||
2606 | * |
||
2607 | * Drivers may also set this on renderbuffers other than those generated by |
||
2608 | * glFramebufferTexture(), though it means FinishRenderTexture() would be |
||
2609 | * called without a rb->TexImage. |
||
2610 | */ |
||
2611 | GLboolean NeedsFinishRenderTexture; |
||
2612 | GLubyte NumSamples; |
||
2613 | GLenum InternalFormat; /**< The user-specified format */ |
||
2614 | GLenum _BaseFormat; /**< Either GL_RGB, GL_RGBA, GL_DEPTH_COMPONENT or |
||
2615 | GL_STENCIL_INDEX. */ |
||
2616 | gl_format Format; /**< The actual renderbuffer memory format */ |
||
2617 | /** |
||
2618 | * Pointer to the texture image if this renderbuffer wraps a texture, |
||
2619 | * otherwise NULL. |
||
2620 | * |
||
2621 | * Note that the reference on the gl_texture_object containing this |
||
2622 | * TexImage is held by the gl_renderbuffer_attachment. |
||
2623 | */ |
||
2624 | struct gl_texture_image *TexImage; |
||
2625 | |||
2626 | /** Delete this renderbuffer */ |
||
2627 | void (*Delete)(struct gl_context *ctx, struct gl_renderbuffer *rb); |
||
2628 | |||
2629 | /** Allocate new storage for this renderbuffer */ |
||
2630 | GLboolean (*AllocStorage)(struct gl_context *ctx, |
||
2631 | struct gl_renderbuffer *rb, |
||
2632 | GLenum internalFormat, |
||
2633 | GLuint width, GLuint height); |
||
2634 | }; |
||
2635 | |||
2636 | |||
2637 | /** |
||
2638 | * A renderbuffer attachment points to either a texture object (and specifies |
||
2639 | * a mipmap level, cube face or 3D texture slice) or points to a renderbuffer. |
||
2640 | */ |
||
2641 | struct gl_renderbuffer_attachment |
||
2642 | { |
||
2643 | GLenum Type; /**< \c GL_NONE or \c GL_TEXTURE or \c GL_RENDERBUFFER_EXT */ |
||
2644 | GLboolean Complete; |
||
2645 | |||
2646 | /** |
||
2647 | * If \c Type is \c GL_RENDERBUFFER_EXT, this stores a pointer to the |
||
2648 | * application supplied renderbuffer object. |
||
2649 | */ |
||
2650 | struct gl_renderbuffer *Renderbuffer; |
||
2651 | |||
2652 | /** |
||
2653 | * If \c Type is \c GL_TEXTURE, this stores a pointer to the application |
||
2654 | * supplied texture object. |
||
2655 | */ |
||
2656 | struct gl_texture_object *Texture; |
||
2657 | GLuint TextureLevel; /**< Attached mipmap level. */ |
||
2658 | GLuint CubeMapFace; /**< 0 .. 5, for cube map textures. */ |
||
2659 | GLuint Zoffset; /**< Slice for 3D textures, or layer for both 1D |
||
2660 | * and 2D array textures */ |
||
2661 | GLboolean Layered; |
||
2662 | }; |
||
2663 | |||
2664 | |||
2665 | /** |
||
2666 | * A framebuffer is a collection of renderbuffers (color, depth, stencil, etc). |
||
2667 | * In C++ terms, think of this as a base class from which device drivers |
||
2668 | * will make derived classes. |
||
2669 | */ |
||
2670 | struct gl_framebuffer |
||
2671 | { |
||
2672 | _glthread_Mutex Mutex; /**< for thread safety */ |
||
2673 | /** |
||
2674 | * If zero, this is a window system framebuffer. If non-zero, this |
||
2675 | * is a FBO framebuffer; note that for some devices (i.e. those with |
||
2676 | * a natural pixel coordinate system for FBOs that differs from the |
||
2677 | * OpenGL/Mesa coordinate system), this means that the viewport, |
||
2678 | * polygon face orientation, and polygon stipple will have to be inverted. |
||
2679 | */ |
||
2680 | GLuint Name; |
||
2681 | |||
2682 | GLint RefCount; |
||
2683 | GLboolean DeletePending; |
||
2684 | |||
2685 | /** |
||
2686 | * The framebuffer's visual. Immutable if this is a window system buffer. |
||
2687 | * Computed from attachments if user-made FBO. |
||
2688 | */ |
||
2689 | struct gl_config Visual; |
||
2690 | |||
2691 | GLuint Width, Height; /**< size of frame buffer in pixels */ |
||
2692 | |||
2693 | /** \name Drawing bounds (Intersection of buffer size and scissor box) */ |
||
2694 | /*@{*/ |
||
2695 | GLint _Xmin, _Xmax; /**< inclusive */ |
||
2696 | GLint _Ymin, _Ymax; /**< exclusive */ |
||
2697 | /*@}*/ |
||
2698 | |||
2699 | /** \name Derived Z buffer stuff */ |
||
2700 | /*@{*/ |
||
2701 | GLuint _DepthMax; /**< Max depth buffer value */ |
||
2702 | GLfloat _DepthMaxF; /**< Float max depth buffer value */ |
||
2703 | GLfloat _MRD; /**< minimum resolvable difference in Z values */ |
||
2704 | /*@}*/ |
||
2705 | |||
2706 | /** One of the GL_FRAMEBUFFER_(IN)COMPLETE_* tokens */ |
||
2707 | GLenum _Status; |
||
2708 | |||
2709 | /** Integer color values */ |
||
2710 | GLboolean _IntegerColor; |
||
2711 | |||
2712 | /* ARB_color_buffer_float */ |
||
2713 | GLboolean _AllColorBuffersFixedPoint; /* no integer, no float */ |
||
2714 | GLboolean _HasSNormOrFloatColorBuffer; |
||
2715 | |||
2716 | /** Array of all renderbuffer attachments, indexed by BUFFER_* tokens. */ |
||
2717 | struct gl_renderbuffer_attachment Attachment[BUFFER_COUNT]; |
||
2718 | |||
2719 | /* In unextended OpenGL these vars are part of the GL_COLOR_BUFFER |
||
2720 | * attribute group and GL_PIXEL attribute group, respectively. |
||
2721 | */ |
||
2722 | GLenum ColorDrawBuffer[MAX_DRAW_BUFFERS]; |
||
2723 | GLenum ColorReadBuffer; |
||
2724 | |||
2725 | /** Computed from ColorDraw/ReadBuffer above */ |
||
2726 | GLuint _NumColorDrawBuffers; |
||
2727 | GLint _ColorDrawBufferIndexes[MAX_DRAW_BUFFERS]; /**< BUFFER_x or -1 */ |
||
2728 | GLint _ColorReadBufferIndex; /* -1 = None */ |
||
2729 | struct gl_renderbuffer *_ColorDrawBuffers[MAX_DRAW_BUFFERS]; |
||
2730 | struct gl_renderbuffer *_ColorReadBuffer; |
||
2731 | |||
2732 | GLboolean Layered; |
||
2733 | |||
2734 | /** Delete this framebuffer */ |
||
2735 | void (*Delete)(struct gl_framebuffer *fb); |
||
2736 | }; |
||
2737 | |||
2738 | |||
2739 | /** |
||
2740 | * Precision info for shader datatypes. See glGetShaderPrecisionFormat(). |
||
2741 | */ |
||
2742 | struct gl_precision |
||
2743 | { |
||
2744 | GLushort RangeMin; /**< min value exponent */ |
||
2745 | GLushort RangeMax; /**< max value exponent */ |
||
2746 | GLushort Precision; /**< number of mantissa bits */ |
||
2747 | }; |
||
2748 | |||
2749 | |||
2750 | /** |
||
2751 | * Limits for vertex, geometry and fragment programs/shaders. |
||
2752 | */ |
||
2753 | struct gl_program_constants |
||
2754 | { |
||
2755 | /* logical limits */ |
||
2756 | GLuint MaxInstructions; |
||
2757 | GLuint MaxAluInstructions; |
||
2758 | GLuint MaxTexInstructions; |
||
2759 | GLuint MaxTexIndirections; |
||
2760 | GLuint MaxAttribs; |
||
2761 | GLuint MaxTemps; |
||
2762 | GLuint MaxAddressRegs; |
||
2763 | GLuint MaxAddressOffset; /**< [-MaxAddressOffset, MaxAddressOffset-1] */ |
||
2764 | GLuint MaxParameters; |
||
2765 | GLuint MaxLocalParams; |
||
2766 | GLuint MaxEnvParams; |
||
2767 | /* native/hardware limits */ |
||
2768 | GLuint MaxNativeInstructions; |
||
2769 | GLuint MaxNativeAluInstructions; |
||
2770 | GLuint MaxNativeTexInstructions; |
||
2771 | GLuint MaxNativeTexIndirections; |
||
2772 | GLuint MaxNativeAttribs; |
||
2773 | GLuint MaxNativeTemps; |
||
2774 | GLuint MaxNativeAddressRegs; |
||
2775 | GLuint MaxNativeParameters; |
||
2776 | /* For shaders */ |
||
2777 | GLuint MaxUniformComponents; /**< Usually == MaxParameters * 4 */ |
||
2778 | /* ES 2.0 and GL_ARB_ES2_compatibility */ |
||
2779 | struct gl_precision LowFloat, MediumFloat, HighFloat; |
||
2780 | struct gl_precision LowInt, MediumInt, HighInt; |
||
2781 | /* GL_ARB_uniform_buffer_object */ |
||
2782 | GLuint MaxUniformBlocks; |
||
2783 | GLuint MaxCombinedUniformComponents; |
||
2784 | GLuint MaxTextureImageUnits; |
||
2785 | }; |
||
2786 | |||
2787 | |||
2788 | /** |
||
2789 | * Constants which may be overridden by device driver during context creation |
||
2790 | * but are never changed after that. |
||
2791 | */ |
||
2792 | struct gl_constants |
||
2793 | { |
||
2794 | GLuint MaxTextureMbytes; /**< Max memory per image, in MB */ |
||
2795 | GLuint MaxTextureLevels; /**< Max mipmap levels. */ |
||
2796 | GLuint Max3DTextureLevels; /**< Max mipmap levels for 3D textures */ |
||
2797 | GLuint MaxCubeTextureLevels; /**< Max mipmap levels for cube textures */ |
||
2798 | GLuint MaxArrayTextureLayers; /**< Max layers in array textures */ |
||
2799 | GLuint MaxTextureRectSize; /**< Max rectangle texture size, in pixes */ |
||
2800 | GLuint MaxTextureCoordUnits; |
||
2801 | GLuint MaxCombinedTextureImageUnits; |
||
2802 | GLuint MaxTextureUnits; /**< = MIN(CoordUnits, FragmentProgram.ImageUnits) */ |
||
2803 | GLfloat MaxTextureMaxAnisotropy; /**< GL_EXT_texture_filter_anisotropic */ |
||
2804 | GLfloat MaxTextureLodBias; /**< GL_EXT_texture_lod_bias */ |
||
2805 | GLuint MaxTextureBufferSize; /**< GL_ARB_texture_buffer_object */ |
||
2806 | |||
2807 | GLuint TextureBufferOffsetAlignment; /**< GL_ARB_texture_buffer_range */ |
||
2808 | |||
2809 | GLuint MaxArrayLockSize; |
||
2810 | |||
2811 | GLint SubPixelBits; |
||
2812 | |||
2813 | GLfloat MinPointSize, MaxPointSize; /**< aliased */ |
||
2814 | GLfloat MinPointSizeAA, MaxPointSizeAA; /**< antialiased */ |
||
2815 | GLfloat PointSizeGranularity; |
||
2816 | GLfloat MinLineWidth, MaxLineWidth; /**< aliased */ |
||
2817 | GLfloat MinLineWidthAA, MaxLineWidthAA; /**< antialiased */ |
||
2818 | GLfloat LineWidthGranularity; |
||
2819 | |||
2820 | GLuint MaxClipPlanes; |
||
2821 | GLuint MaxLights; |
||
2822 | GLfloat MaxShininess; /**< GL_NV_light_max_exponent */ |
||
2823 | GLfloat MaxSpotExponent; /**< GL_NV_light_max_exponent */ |
||
2824 | |||
2825 | GLuint MaxViewportWidth, MaxViewportHeight; |
||
2826 | |||
2827 | struct gl_program_constants VertexProgram; /**< GL_ARB_vertex_program */ |
||
2828 | struct gl_program_constants FragmentProgram; /**< GL_ARB_fragment_program */ |
||
2829 | struct gl_program_constants GeometryProgram; /**< GL_ARB_geometry_shader4 */ |
||
2830 | GLuint MaxProgramMatrices; |
||
2831 | GLuint MaxProgramMatrixStackDepth; |
||
2832 | |||
2833 | struct { |
||
2834 | GLuint SamplesPassed; |
||
2835 | GLuint TimeElapsed; |
||
2836 | GLuint Timestamp; |
||
2837 | GLuint PrimitivesGenerated; |
||
2838 | GLuint PrimitivesWritten; |
||
2839 | } QueryCounterBits; |
||
2840 | |||
2841 | /** vertex array / buffer object bounds checking */ |
||
2842 | GLboolean CheckArrayBounds; |
||
2843 | |||
2844 | GLuint MaxDrawBuffers; /**< GL_ARB_draw_buffers */ |
||
2845 | |||
2846 | GLuint MaxColorAttachments; /**< GL_EXT_framebuffer_object */ |
||
2847 | GLuint MaxRenderbufferSize; /**< GL_EXT_framebuffer_object */ |
||
2848 | GLuint MaxSamples; /**< GL_ARB_framebuffer_object */ |
||
2849 | |||
2850 | /** Number of varying vectors between any two shader stages. */ |
||
2851 | GLuint MaxVarying; |
||
2852 | GLuint MaxVaryingComponents; |
||
2853 | |||
2854 | /** @{ |
||
2855 | * GL_ARB_uniform_buffer_object |
||
2856 | */ |
||
2857 | GLuint MaxCombinedUniformBlocks; |
||
2858 | GLuint MaxUniformBufferBindings; |
||
2859 | GLuint MaxUniformBlockSize; |
||
2860 | GLuint UniformBufferOffsetAlignment; |
||
2861 | /** @} */ |
||
2862 | |||
2863 | /** GL_ARB_geometry_shader4 */ |
||
2864 | GLuint MaxGeometryOutputVertices; |
||
2865 | GLuint MaxGeometryTotalOutputComponents; |
||
2866 | |||
2867 | GLuint GLSLVersion; /**< GLSL version supported (ex: 120 = 1.20) */ |
||
2868 | |||
2869 | /** |
||
2870 | * Changes default GLSL extension behavior from "error" to "warn". It's out |
||
2871 | * of spec, but it can make some apps work that otherwise wouldn't. |
||
2872 | */ |
||
2873 | GLboolean ForceGLSLExtensionsWarn; |
||
2874 | |||
2875 | /** |
||
2876 | * If non-zero, forces GLSL shaders without the #version directive to behave |
||
2877 | * as if they began with "#version ForceGLSLVersion". |
||
2878 | */ |
||
2879 | GLuint ForceGLSLVersion; |
||
2880 | |||
2881 | /** |
||
2882 | * Does the driver support real 32-bit integers? (Otherwise, integers are |
||
2883 | * simulated via floats.) |
||
2884 | */ |
||
2885 | GLboolean NativeIntegers; |
||
2886 | |||
2887 | /** |
||
2888 | * If the driver supports real 32-bit integers, what integer value should be |
||
2889 | * used for boolean true in uniform uploads? (Usually 1 or ~0.) |
||
2890 | */ |
||
2891 | GLuint UniformBooleanTrue; |
||
2892 | |||
2893 | /** Which texture units support GL_ATI_envmap_bumpmap as targets */ |
||
2894 | GLbitfield SupportedBumpUnits; |
||
2895 | |||
2896 | /** |
||
2897 | * Maximum amount of time, measured in nanseconds, that the server can wait. |
||
2898 | */ |
||
2899 | GLuint64 MaxServerWaitTimeout; |
||
2900 | |||
2901 | /** GL_EXT_provoking_vertex */ |
||
2902 | GLboolean QuadsFollowProvokingVertexConvention; |
||
2903 | |||
2904 | /** OpenGL version 3.0 */ |
||
2905 | GLbitfield ContextFlags; /**< Ex: GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT */ |
||
2906 | |||
2907 | /** OpenGL version 3.2 */ |
||
2908 | GLbitfield ProfileMask; /**< Mask of CONTEXT_x_PROFILE_BIT */ |
||
2909 | |||
2910 | /** GL_EXT_transform_feedback */ |
||
2911 | GLuint MaxTransformFeedbackBuffers; |
||
2912 | GLuint MaxTransformFeedbackSeparateComponents; |
||
2913 | GLuint MaxTransformFeedbackInterleavedComponents; |
||
2914 | GLuint MaxVertexStreams; |
||
2915 | |||
2916 | /** GL_EXT_gpu_shader4 */ |
||
2917 | GLint MinProgramTexelOffset, MaxProgramTexelOffset; |
||
2918 | |||
2919 | /* GL_ARB_robustness */ |
||
2920 | GLenum ResetStrategy; |
||
2921 | |||
2922 | /* GL_ARB_blend_func_extended */ |
||
2923 | GLuint MaxDualSourceDrawBuffers; |
||
2924 | |||
2925 | /** |
||
2926 | * Whether the implementation strips out and ignores texture borders. |
||
2927 | * |
||
2928 | * Many GPU hardware implementations don't support rendering with texture |
||
2929 | * borders and mipmapped textures. (Note: not static border color, but the |
||
2930 | * old 1-pixel border around each edge). Implementations then have to do |
||
2931 | * slow fallbacks to be correct, or just ignore the border and be fast but |
||
2932 | * wrong. Setting the flag strips the border off of TexImage calls, |
||
2933 | * providing "fast but wrong" at significantly reduced driver complexity. |
||
2934 | * |
||
2935 | * Texture borders are deprecated in GL 3.0. |
||
2936 | **/ |
||
2937 | GLboolean StripTextureBorder; |
||
2938 | |||
2939 | /** |
||
2940 | * For drivers which can do a better job at eliminating unused uniforms |
||
2941 | * than the GLSL compiler. |
||
2942 | * |
||
2943 | * XXX Remove these as soon as a better solution is available. |
||
2944 | */ |
||
2945 | GLboolean GLSLSkipStrictMaxUniformLimitCheck; |
||
2946 | |||
2947 | /** |
||
2948 | * Force software support for primitive restart in the VBO module. |
||
2949 | */ |
||
2950 | GLboolean PrimitiveRestartInSoftware; |
||
2951 | |||
2952 | /** GL_ARB_map_buffer_alignment */ |
||
2953 | GLuint MinMapBufferAlignment; |
||
2954 | |||
2955 | /** |
||
2956 | * Disable varying packing. This is out of spec, but potentially useful |
||
2957 | * for older platforms that supports a limited number of texture |
||
2958 | * indirections--on these platforms, unpacking the varyings in the fragment |
||
2959 | * shader increases the number of texture indirections by 1, which might |
||
2960 | * make some shaders not executable at all. |
||
2961 | * |
||
2962 | * Drivers that support transform feedback must set this value to GL_FALSE. |
||
2963 | */ |
||
2964 | GLboolean DisableVaryingPacking; |
||
2965 | |||
2966 | /* |
||
2967 | * Maximum value supported for an index in DrawElements and friends. |
||
2968 | * |
||
2969 | * This must be at least (1ull<<24)-1. The default value is |
||
2970 | * (1ull<<32)-1. |
||
2971 | * |
||
2972 | * \since ES 3.0 or GL_ARB_ES3_compatibility |
||
2973 | * \sa _mesa_init_constants |
||
2974 | */ |
||
2975 | GLuint64 MaxElementIndex; |
||
2976 | |||
2977 | /** |
||
2978 | * Disable interpretation of line continuations (lines ending with a |
||
2979 | * backslash character ('\') in GLSL source. |
||
2980 | */ |
||
2981 | GLboolean DisableGLSLLineContinuations; |
||
2982 | |||
2983 | /** GL_ARB_texture_multisample */ |
||
2984 | GLint MaxColorTextureSamples; |
||
2985 | GLint MaxDepthTextureSamples; |
||
2986 | GLint MaxIntegerSamples; |
||
2987 | }; |
||
2988 | |||
2989 | |||
2990 | /** |
||
2991 | * Enable flag for each OpenGL extension. Different device drivers will |
||
2992 | * enable different extensions at runtime. |
||
2993 | */ |
||
2994 | struct gl_extensions |
||
2995 | { |
||
2996 | GLboolean dummy; /* don't remove this! */ |
||
2997 | GLboolean dummy_true; /* Set true by _mesa_init_extensions(). */ |
||
2998 | GLboolean dummy_false; /* Set false by _mesa_init_extensions(). */ |
||
2999 | GLboolean ANGLE_texture_compression_dxt; |
||
3000 | GLboolean ARB_ES2_compatibility; |
||
3001 | GLboolean ARB_ES3_compatibility; |
||
3002 | GLboolean ARB_base_instance; |
||
3003 | GLboolean ARB_blend_func_extended; |
||
3004 | GLboolean ARB_color_buffer_float; |
||
3005 | GLboolean ARB_conservative_depth; |
||
3006 | GLboolean ARB_depth_buffer_float; |
||
3007 | GLboolean ARB_depth_clamp; |
||
3008 | GLboolean ARB_depth_texture; |
||
3009 | GLboolean ARB_draw_buffers_blend; |
||
3010 | GLboolean ARB_draw_elements_base_vertex; |
||
3011 | GLboolean ARB_draw_instanced; |
||
3012 | GLboolean ARB_fragment_coord_conventions; |
||
3013 | GLboolean ARB_fragment_program; |
||
3014 | GLboolean ARB_fragment_program_shadow; |
||
3015 | GLboolean ARB_fragment_shader; |
||
3016 | GLboolean ARB_framebuffer_object; |
||
3017 | GLboolean ARB_explicit_attrib_location; |
||
3018 | GLboolean ARB_geometry_shader4; |
||
3019 | GLboolean ARB_gpu_shader5; |
||
3020 | GLboolean ARB_half_float_pixel; |
||
3021 | GLboolean ARB_half_float_vertex; |
||
3022 | GLboolean ARB_instanced_arrays; |
||
3023 | GLboolean ARB_internalformat_query; |
||
3024 | GLboolean ARB_map_buffer_alignment; |
||
3025 | GLboolean ARB_map_buffer_range; |
||
3026 | GLboolean ARB_occlusion_query; |
||
3027 | GLboolean ARB_occlusion_query2; |
||
3028 | GLboolean ARB_point_sprite; |
||
3029 | GLboolean ARB_seamless_cube_map; |
||
3030 | GLboolean ARB_shader_bit_encoding; |
||
3031 | GLboolean ARB_shader_stencil_export; |
||
3032 | GLboolean ARB_shader_texture_lod; |
||
3033 | GLboolean ARB_shading_language_packing; |
||
3034 | GLboolean ARB_shading_language_420pack; |
||
3035 | GLboolean ARB_shadow; |
||
3036 | GLboolean ARB_sync; |
||
3037 | GLboolean ARB_texture_border_clamp; |
||
3038 | GLboolean ARB_texture_buffer_object; |
||
3039 | GLboolean ARB_texture_buffer_object_rgb32; |
||
3040 | GLboolean ARB_texture_buffer_range; |
||
3041 | GLboolean ARB_texture_compression_rgtc; |
||
3042 | GLboolean ARB_texture_cube_map; |
||
3043 | GLboolean ARB_texture_cube_map_array; |
||
3044 | GLboolean ARB_texture_env_combine; |
||
3045 | GLboolean ARB_texture_env_crossbar; |
||
3046 | GLboolean ARB_texture_env_dot3; |
||
3047 | GLboolean ARB_texture_float; |
||
3048 | GLboolean ARB_texture_multisample; |
||
3049 | GLboolean ARB_texture_non_power_of_two; |
||
3050 | GLboolean ARB_texture_query_lod; |
||
3051 | GLboolean ARB_texture_rg; |
||
3052 | GLboolean ARB_texture_rgb10_a2ui; |
||
3053 | GLboolean ARB_timer_query; |
||
3054 | GLboolean ARB_transform_feedback2; |
||
3055 | GLboolean ARB_transform_feedback3; |
||
3056 | GLboolean ARB_transform_feedback_instanced; |
||
3057 | GLboolean ARB_uniform_buffer_object; |
||
3058 | GLboolean ARB_vertex_program; |
||
3059 | GLboolean ARB_vertex_shader; |
||
3060 | GLboolean ARB_vertex_type_2_10_10_10_rev; |
||
3061 | GLboolean EXT_blend_color; |
||
3062 | GLboolean EXT_blend_equation_separate; |
||
3063 | GLboolean EXT_blend_func_separate; |
||
3064 | GLboolean EXT_blend_minmax; |
||
3065 | GLboolean EXT_depth_bounds_test; |
||
3066 | GLboolean EXT_draw_buffers2; |
||
3067 | GLboolean EXT_framebuffer_blit; |
||
3068 | GLboolean EXT_framebuffer_multisample; |
||
3069 | GLboolean EXT_framebuffer_multisample_blit_scaled; |
||
3070 | GLboolean EXT_framebuffer_sRGB; |
||
3071 | GLboolean EXT_gpu_program_parameters; |
||
3072 | GLboolean EXT_gpu_shader4; |
||
3073 | GLboolean EXT_packed_depth_stencil; |
||
3074 | GLboolean EXT_packed_float; |
||
3075 | GLboolean EXT_pixel_buffer_object; |
||
3076 | GLboolean EXT_point_parameters; |
||
3077 | GLboolean EXT_provoking_vertex; |
||
3078 | GLboolean EXT_separate_shader_objects; |
||
3079 | GLboolean EXT_stencil_two_side; |
||
3080 | GLboolean EXT_texture3D; |
||
3081 | GLboolean EXT_texture_array; |
||
3082 | GLboolean EXT_texture_compression_latc; |
||
3083 | GLboolean EXT_texture_compression_s3tc; |
||
3084 | GLboolean EXT_texture_env_dot3; |
||
3085 | GLboolean EXT_texture_filter_anisotropic; |
||
3086 | GLboolean EXT_texture_integer; |
||
3087 | GLboolean EXT_texture_mirror_clamp; |
||
3088 | GLboolean EXT_texture_shared_exponent; |
||
3089 | GLboolean EXT_texture_snorm; |
||
3090 | GLboolean EXT_texture_sRGB; |
||
3091 | GLboolean EXT_texture_sRGB_decode; |
||
3092 | GLboolean EXT_texture_swizzle; |
||
3093 | GLboolean EXT_transform_feedback; |
||
3094 | GLboolean EXT_timer_query; |
||
3095 | GLboolean EXT_vertex_array_bgra; |
||
3096 | GLboolean OES_standard_derivatives; |
||
3097 | /* vendor extensions */ |
||
3098 | GLboolean AMD_seamless_cubemap_per_texture; |
||
3099 | GLboolean AMD_vertex_shader_layer; |
||
3100 | GLboolean APPLE_object_purgeable; |
||
3101 | GLboolean ATI_envmap_bumpmap; |
||
3102 | GLboolean ATI_texture_compression_3dc; |
||
3103 | GLboolean ATI_texture_mirror_once; |
||
3104 | GLboolean ATI_texture_env_combine3; |
||
3105 | GLboolean ATI_fragment_shader; |
||
3106 | GLboolean ATI_separate_stencil; |
||
3107 | GLboolean MESA_pack_invert; |
||
3108 | GLboolean MESA_ycbcr_texture; |
||
3109 | GLboolean MESA_texture_array; |
||
3110 | GLboolean NV_conditional_render; |
||
3111 | GLboolean NV_fog_distance; |
||
3112 | GLboolean NV_fragment_program_option; |
||
3113 | GLboolean NV_point_sprite; |
||
3114 | GLboolean NV_primitive_restart; |
||
3115 | GLboolean NV_texture_barrier; |
||
3116 | GLboolean NV_texture_env_combine4; |
||
3117 | GLboolean NV_texture_rectangle; |
||
3118 | GLboolean TDFX_texture_compression_FXT1; |
||
3119 | GLboolean OES_EGL_image; |
||
3120 | GLboolean OES_draw_texture; |
||
3121 | GLboolean OES_depth_texture_cube_map; |
||
3122 | GLboolean OES_EGL_image_external; |
||
3123 | GLboolean OES_compressed_ETC1_RGB8_texture; |
||
3124 | GLboolean extension_sentinel; |
||
3125 | /** The extension string */ |
||
3126 | const GLubyte *String; |
||
3127 | /** Number of supported extensions */ |
||
3128 | GLuint Count; |
||
3129 | }; |
||
3130 | |||
3131 | |||
3132 | /** |
||
3133 | * A stack of matrices (projection, modelview, color, texture, etc). |
||
3134 | */ |
||
3135 | struct gl_matrix_stack |
||
3136 | { |
||
3137 | GLmatrix *Top; /**< points into Stack */ |
||
3138 | GLmatrix *Stack; /**< array [MaxDepth] of GLmatrix */ |
||
3139 | GLuint Depth; /**< 0 <= Depth < MaxDepth */ |
||
3140 | GLuint MaxDepth; /**< size of Stack[] array */ |
||
3141 | GLuint DirtyFlag; /**< _NEW_MODELVIEW or _NEW_PROJECTION, for example */ |
||
3142 | }; |
||
3143 | |||
3144 | |||
3145 | /** |
||
3146 | * \name Bits for image transfer operations |
||
3147 | * \sa __struct gl_contextRec::ImageTransferState. |
||
3148 | */ |
||
3149 | /*@{*/ |
||
3150 | #define IMAGE_SCALE_BIAS_BIT 0x1 |
||
3151 | #define IMAGE_SHIFT_OFFSET_BIT 0x2 |
||
3152 | #define IMAGE_MAP_COLOR_BIT 0x4 |
||
3153 | #define IMAGE_CLAMP_BIT 0x800 |
||
3154 | |||
3155 | |||
3156 | /** Pixel Transfer ops */ |
||
3157 | #define IMAGE_BITS (IMAGE_SCALE_BIAS_BIT | \ |
||
3158 | IMAGE_SHIFT_OFFSET_BIT | \ |
||
3159 | IMAGE_MAP_COLOR_BIT) |
||
3160 | |||
3161 | /** |
||
3162 | * \name Bits to indicate what state has changed. |
||
3163 | */ |
||
3164 | /*@{*/ |
||
3165 | #define _NEW_MODELVIEW (1 << 0) /**< gl_context::ModelView */ |
||
3166 | #define _NEW_PROJECTION (1 << 1) /**< gl_context::Projection */ |
||
3167 | #define _NEW_TEXTURE_MATRIX (1 << 2) /**< gl_context::TextureMatrix */ |
||
3168 | #define _NEW_COLOR (1 << 3) /**< gl_context::Color */ |
||
3169 | #define _NEW_DEPTH (1 << 4) /**< gl_context::Depth */ |
||
3170 | #define _NEW_EVAL (1 << 5) /**< gl_context::Eval, EvalMap */ |
||
3171 | #define _NEW_FOG (1 << 6) /**< gl_context::Fog */ |
||
3172 | #define _NEW_HINT (1 << 7) /**< gl_context::Hint */ |
||
3173 | #define _NEW_LIGHT (1 << 8) /**< gl_context::Light */ |
||
3174 | #define _NEW_LINE (1 << 9) /**< gl_context::Line */ |
||
3175 | #define _NEW_PIXEL (1 << 10) /**< gl_context::Pixel */ |
||
3176 | #define _NEW_POINT (1 << 11) /**< gl_context::Point */ |
||
3177 | #define _NEW_POLYGON (1 << 12) /**< gl_context::Polygon */ |
||
3178 | #define _NEW_POLYGONSTIPPLE (1 << 13) /**< gl_context::PolygonStipple */ |
||
3179 | #define _NEW_SCISSOR (1 << 14) /**< gl_context::Scissor */ |
||
3180 | #define _NEW_STENCIL (1 << 15) /**< gl_context::Stencil */ |
||
3181 | #define _NEW_TEXTURE (1 << 16) /**< gl_context::Texture */ |
||
3182 | #define _NEW_TRANSFORM (1 << 17) /**< gl_context::Transform */ |
||
3183 | #define _NEW_VIEWPORT (1 << 18) /**< gl_context::Viewport */ |
||
3184 | /* gap, re-use for core Mesa state only; use ctx->DriverFlags otherwise */ |
||
3185 | #define _NEW_ARRAY (1 << 20) /**< gl_context::Array */ |
||
3186 | #define _NEW_RENDERMODE (1 << 21) /**< gl_context::RenderMode, etc */ |
||
3187 | #define _NEW_BUFFERS (1 << 22) /**< gl_context::Visual, DrawBuffer, */ |
||
3188 | #define _NEW_CURRENT_ATTRIB (1 << 23) /**< gl_context::Current */ |
||
3189 | #define _NEW_MULTISAMPLE (1 << 24) /**< gl_context::Multisample */ |
||
3190 | #define _NEW_TRACK_MATRIX (1 << 25) /**< gl_context::VertexProgram */ |
||
3191 | #define _NEW_PROGRAM (1 << 26) /**< New program/shader state */ |
||
3192 | #define _NEW_PROGRAM_CONSTANTS (1 << 27) |
||
3193 | #define _NEW_BUFFER_OBJECT (1 << 28) |
||
3194 | #define _NEW_FRAG_CLAMP (1 << 29) |
||
3195 | /* gap, re-use for core Mesa state only; use ctx->DriverFlags otherwise */ |
||
3196 | #define _NEW_VARYING_VP_INPUTS (1 << 31) /**< gl_context::varying_vp_inputs */ |
||
3197 | #define _NEW_ALL ~0 |
||
3198 | /*@}*/ |
||
3199 | |||
3200 | |||
3201 | /** |
||
3202 | * Composite state flags |
||
3203 | */ |
||
3204 | /*@{*/ |
||
3205 | #define _MESA_NEW_NEED_EYE_COORDS (_NEW_LIGHT | \ |
||
3206 | _NEW_TEXTURE | \ |
||
3207 | _NEW_POINT | \ |
||
3208 | _NEW_PROGRAM | \ |
||
3209 | _NEW_MODELVIEW) |
||
3210 | |||
3211 | #define _MESA_NEW_SEPARATE_SPECULAR (_NEW_LIGHT | \ |
||
3212 | _NEW_FOG | \ |
||
3213 | _NEW_PROGRAM) |
||
3214 | |||
3215 | |||
3216 | /*@}*/ |
||
3217 | |||
3218 | |||
3219 | |||
3220 | |||
3221 | /* This has to be included here. */ |
||
3222 | #include "dd.h" |
||
3223 | |||
3224 | |||
3225 | /** |
||
3226 | * Display list flags. |
||
3227 | * Strictly this is a tnl-private concept, but it doesn't seem |
||
3228 | * worthwhile adding a tnl private structure just to hold this one bit |
||
3229 | * of information: |
||
3230 | */ |
||
3231 | #define DLIST_DANGLING_REFS 0x1 |
||
3232 | |||
3233 | |||
3234 | /** Opaque declaration of display list payload data type */ |
||
3235 | union gl_dlist_node; |
||
3236 | |||
3237 | |||
3238 | /** |
||
3239 | * Provide a location where information about a display list can be |
||
3240 | * collected. Could be extended with driverPrivate structures, |
||
3241 | * etc. in the future. |
||
3242 | */ |
||
3243 | struct gl_display_list |
||
3244 | { |
||
3245 | GLuint Name; |
||
3246 | GLbitfield Flags; /**< DLIST_x flags */ |
||
3247 | /** The dlist commands are in a linked list of nodes */ |
||
3248 | union gl_dlist_node *Head; |
||
3249 | }; |
||
3250 | |||
3251 | |||
3252 | /** |
||
3253 | * State used during display list compilation and execution. |
||
3254 | */ |
||
3255 | struct gl_dlist_state |
||
3256 | { |
||
3257 | GLuint CallDepth; /**< Current recursion calling depth */ |
||
3258 | |||
3259 | struct gl_display_list *CurrentList; /**< List currently being compiled */ |
||
3260 | union gl_dlist_node *CurrentBlock; /**< Pointer to current block of nodes */ |
||
3261 | GLuint CurrentPos; /**< Index into current block of nodes */ |
||
3262 | |||
3263 | GLvertexformat ListVtxfmt; |
||
3264 | |||
3265 | GLubyte ActiveAttribSize[VERT_ATTRIB_MAX]; |
||
3266 | GLfloat CurrentAttrib[VERT_ATTRIB_MAX][4]; |
||
3267 | |||
3268 | GLubyte ActiveMaterialSize[MAT_ATTRIB_MAX]; |
||
3269 | GLfloat CurrentMaterial[MAT_ATTRIB_MAX][4]; |
||
3270 | |||
3271 | struct { |
||
3272 | /* State known to have been set by the currently-compiling display |
||
3273 | * list. Used to eliminate some redundant state changes. |
||
3274 | */ |
||
3275 | GLenum ShadeModel; |
||
3276 | } Current; |
||
3277 | }; |
||
3278 | |||
3279 | /** @{ |
||
3280 | * |
||
3281 | * These are a mapping of the GL_ARB_debug_output enums to small enums |
||
3282 | * suitable for use as an array index. |
||
3283 | */ |
||
3284 | |||
3285 | enum mesa_debug_source { |
||
3286 | MESA_DEBUG_SOURCE_API, |
||
3287 | MESA_DEBUG_SOURCE_WINDOW_SYSTEM, |
||
3288 | MESA_DEBUG_SOURCE_SHADER_COMPILER, |
||
3289 | MESA_DEBUG_SOURCE_THIRD_PARTY, |
||
3290 | MESA_DEBUG_SOURCE_APPLICATION, |
||
3291 | MESA_DEBUG_SOURCE_OTHER, |
||
3292 | MESA_DEBUG_SOURCE_COUNT |
||
3293 | }; |
||
3294 | |||
3295 | enum mesa_debug_type { |
||
3296 | MESA_DEBUG_TYPE_ERROR, |
||
3297 | MESA_DEBUG_TYPE_DEPRECATED, |
||
3298 | MESA_DEBUG_TYPE_UNDEFINED, |
||
3299 | MESA_DEBUG_TYPE_PORTABILITY, |
||
3300 | MESA_DEBUG_TYPE_PERFORMANCE, |
||
3301 | MESA_DEBUG_TYPE_OTHER, |
||
3302 | MESA_DEBUG_TYPE_COUNT |
||
3303 | }; |
||
3304 | |||
3305 | enum mesa_debug_severity { |
||
3306 | MESA_DEBUG_SEVERITY_LOW, |
||
3307 | MESA_DEBUG_SEVERITY_MEDIUM, |
||
3308 | MESA_DEBUG_SEVERITY_HIGH, |
||
3309 | MESA_DEBUG_SEVERITY_COUNT |
||
3310 | }; |
||
3311 | |||
3312 | /** @} */ |
||
3313 | |||
3314 | /** |
||
3315 | * An error, warning, or other piece of debug information for an application |
||
3316 | * to consume via GL_ARB_debug_output. |
||
3317 | */ |
||
3318 | struct gl_debug_msg |
||
3319 | { |
||
3320 | enum mesa_debug_source source; |
||
3321 | enum mesa_debug_type type; |
||
3322 | GLuint id; |
||
3323 | enum mesa_debug_severity severity; |
||
3324 | GLsizei length; |
||
3325 | GLcharARB *message; |
||
3326 | }; |
||
3327 | |||
3328 | struct gl_debug_namespace |
||
3329 | { |
||
3330 | struct _mesa_HashTable *IDs; |
||
3331 | unsigned ZeroID; /* a HashTable won't take zero, so store its state here */ |
||
3332 | /** lists of IDs in the hash table at each severity */ |
||
3333 | struct simple_node Severity[MESA_DEBUG_SEVERITY_COUNT]; |
||
3334 | }; |
||
3335 | |||
3336 | struct gl_debug_state |
||
3337 | { |
||
3338 | GLDEBUGPROCARB Callback; |
||
3339 | const void *CallbackData; |
||
3340 | GLboolean SyncOutput; |
||
3341 | GLboolean Defaults[MESA_DEBUG_SEVERITY_COUNT][MESA_DEBUG_SOURCE_COUNT][MESA_DEBUG_TYPE_COUNT]; |
||
3342 | struct gl_debug_namespace Namespaces[MESA_DEBUG_SOURCE_COUNT][MESA_DEBUG_TYPE_COUNT]; |
||
3343 | struct gl_debug_msg Log[MAX_DEBUG_LOGGED_MESSAGES]; |
||
3344 | GLint NumMessages; |
||
3345 | GLint NextMsg; |
||
3346 | GLint NextMsgLength; /* redundant, but copied here from Log[NextMsg].length |
||
3347 | for the sake of the offsetof() code in get.c */ |
||
3348 | }; |
||
3349 | |||
3350 | /** |
||
3351 | * Enum for the OpenGL APIs we know about and may support. |
||
3352 | * |
||
3353 | * NOTE: This must match the api_enum table in |
||
3354 | * src/mesa/main/get_hash_generator.py |
||
3355 | */ |
||
3356 | typedef enum |
||
3357 | { |
||
3358 | API_OPENGL_COMPAT, /* legacy / compatibility contexts */ |
||
3359 | API_OPENGLES, |
||
3360 | API_OPENGLES2, |
||
3361 | API_OPENGL_CORE, |
||
3362 | API_OPENGL_LAST = API_OPENGL_CORE |
||
3363 | } gl_api; |
||
3364 | |||
3365 | /** |
||
3366 | * Driver-specific state flags. |
||
3367 | * |
||
3368 | * These are or'd with gl_context::NewDriverState to notify a driver about |
||
3369 | * a state change. The driver sets the flags at context creation and |
||
3370 | * the meaning of the bits set is opaque to core Mesa. |
||
3371 | */ |
||
3372 | struct gl_driver_flags |
||
3373 | { |
||
3374 | /** gl_context::Array::_DrawArrays (vertex array state) */ |
||
3375 | GLbitfield NewArray; |
||
3376 | |||
3377 | /** gl_context::TransformFeedback::CurrentObject */ |
||
3378 | GLbitfield NewTransformFeedback; |
||
3379 | |||
3380 | /** gl_context::RasterDiscard */ |
||
3381 | GLbitfield NewRasterizerDiscard; |
||
3382 | |||
3383 | /** |
||
3384 | * gl_context::UniformBufferBindings |
||
3385 | * gl_shader_program::UniformBlocks |
||
3386 | */ |
||
3387 | GLbitfield NewUniformBuffer; |
||
3388 | }; |
||
3389 | |||
3390 | struct gl_uniform_buffer_binding |
||
3391 | { |
||
3392 | struct gl_buffer_object *BufferObject; |
||
3393 | /** Start of uniform block data in the buffer */ |
||
3394 | GLintptr Offset; |
||
3395 | /** Size of data allowed to be referenced from the buffer (in bytes) */ |
||
3396 | GLsizeiptr Size; |
||
3397 | /** |
||
3398 | * glBindBufferBase() indicates that the Size should be ignored and only |
||
3399 | * limited by the current size of the BufferObject. |
||
3400 | */ |
||
3401 | GLboolean AutomaticSize; |
||
3402 | }; |
||
3403 | |||
3404 | /** |
||
3405 | * Mesa rendering context. |
||
3406 | * |
||
3407 | * This is the central context data structure for Mesa. Almost all |
||
3408 | * OpenGL state is contained in this structure. |
||
3409 | * Think of this as a base class from which device drivers will derive |
||
3410 | * sub classes. |
||
3411 | * |
||
3412 | * The struct gl_context typedef names this structure. |
||
3413 | */ |
||
3414 | struct gl_context |
||
3415 | { |
||
3416 | /** State possibly shared with other contexts in the address space */ |
||
3417 | struct gl_shared_state *Shared; |
||
3418 | |||
3419 | /** \name API function pointer tables */ |
||
3420 | /*@{*/ |
||
3421 | gl_api API; |
||
3422 | /** |
||
3423 | * The current dispatch table for non-displaylist-saving execution, either |
||
3424 | * BeginEnd or OutsideBeginEnd |
||
3425 | */ |
||
3426 | struct _glapi_table *Exec; |
||
3427 | /** |
||
3428 | * The normal dispatch table for non-displaylist-saving, non-begin/end |
||
3429 | */ |
||
3430 | struct _glapi_table *OutsideBeginEnd; |
||
3431 | /** The dispatch table used between glNewList() and glEndList() */ |
||
3432 | struct _glapi_table *Save; |
||
3433 | /** |
||
3434 | * The dispatch table used between glBegin() and glEnd() (outside of a |
||
3435 | * display list). Only valid functions between those two are set, which is |
||
3436 | * mostly just the set in a GLvertexformat struct. |
||
3437 | */ |
||
3438 | struct _glapi_table *BeginEnd; |
||
3439 | /** |
||
3440 | * Tracks the current dispatch table out of the 3 above, so that it can be |
||
3441 | * re-set on glXMakeCurrent(). |
||
3442 | */ |
||
3443 | struct _glapi_table *CurrentDispatch; |
||
3444 | /*@}*/ |
||
3445 | |||
3446 | struct gl_config Visual; |
||
3447 | struct gl_framebuffer *DrawBuffer; /**< buffer for writing */ |
||
3448 | struct gl_framebuffer *ReadBuffer; /**< buffer for reading */ |
||
3449 | struct gl_framebuffer *WinSysDrawBuffer; /**< set with MakeCurrent */ |
||
3450 | struct gl_framebuffer *WinSysReadBuffer; /**< set with MakeCurrent */ |
||
3451 | |||
3452 | /** |
||
3453 | * Device driver function pointer table |
||
3454 | */ |
||
3455 | struct dd_function_table Driver; |
||
3456 | |||
3457 | /** Core/Driver constants */ |
||
3458 | struct gl_constants Const; |
||
3459 | |||
3460 | /** \name The various 4x4 matrix stacks */ |
||
3461 | /*@{*/ |
||
3462 | struct gl_matrix_stack ModelviewMatrixStack; |
||
3463 | struct gl_matrix_stack ProjectionMatrixStack; |
||
3464 | struct gl_matrix_stack TextureMatrixStack[MAX_TEXTURE_UNITS]; |
||
3465 | struct gl_matrix_stack ProgramMatrixStack[MAX_PROGRAM_MATRICES]; |
||
3466 | struct gl_matrix_stack *CurrentStack; /**< Points to one of the above stacks */ |
||
3467 | /*@}*/ |
||
3468 | |||
3469 | /** Combined modelview and projection matrix */ |
||
3470 | GLmatrix _ModelProjectMatrix; |
||
3471 | |||
3472 | /** \name Display lists */ |
||
3473 | struct gl_dlist_state ListState; |
||
3474 | |||
3475 | GLboolean ExecuteFlag; /**< Execute GL commands? */ |
||
3476 | GLboolean CompileFlag; /**< Compile GL commands into display list? */ |
||
3477 | |||
3478 | /** Extension information */ |
||
3479 | struct gl_extensions Extensions; |
||
3480 | |||
3481 | /** GL version integer, for example 31 for GL 3.1, or 20 for GLES 2.0. */ |
||
3482 | GLuint Version; |
||
3483 | char *VersionString; |
||
3484 | |||
3485 | /** \name State attribute stack (for glPush/PopAttrib) */ |
||
3486 | /*@{*/ |
||
3487 | GLuint AttribStackDepth; |
||
3488 | struct gl_attrib_node *AttribStack[MAX_ATTRIB_STACK_DEPTH]; |
||
3489 | /*@}*/ |
||
3490 | |||
3491 | /** \name Renderer attribute groups |
||
3492 | * |
||
3493 | * We define a struct for each attribute group to make pushing and popping |
||
3494 | * attributes easy. Also it's a good organization. |
||
3495 | */ |
||
3496 | /*@{*/ |
||
3497 | struct gl_accum_attrib Accum; /**< Accum buffer attributes */ |
||
3498 | struct gl_colorbuffer_attrib Color; /**< Color buffer attributes */ |
||
3499 | struct gl_current_attrib Current; /**< Current attributes */ |
||
3500 | struct gl_depthbuffer_attrib Depth; /**< Depth buffer attributes */ |
||
3501 | struct gl_eval_attrib Eval; /**< Eval attributes */ |
||
3502 | struct gl_fog_attrib Fog; /**< Fog attributes */ |
||
3503 | struct gl_hint_attrib Hint; /**< Hint attributes */ |
||
3504 | struct gl_light_attrib Light; /**< Light attributes */ |
||
3505 | struct gl_line_attrib Line; /**< Line attributes */ |
||
3506 | struct gl_list_attrib List; /**< List attributes */ |
||
3507 | struct gl_multisample_attrib Multisample; |
||
3508 | struct gl_pixel_attrib Pixel; /**< Pixel attributes */ |
||
3509 | struct gl_point_attrib Point; /**< Point attributes */ |
||
3510 | struct gl_polygon_attrib Polygon; /**< Polygon attributes */ |
||
3511 | GLuint PolygonStipple[32]; /**< Polygon stipple */ |
||
3512 | struct gl_scissor_attrib Scissor; /**< Scissor attributes */ |
||
3513 | struct gl_stencil_attrib Stencil; /**< Stencil buffer attributes */ |
||
3514 | struct gl_texture_attrib Texture; /**< Texture attributes */ |
||
3515 | struct gl_transform_attrib Transform; /**< Transformation attributes */ |
||
3516 | struct gl_viewport_attrib Viewport; /**< Viewport attributes */ |
||
3517 | /*@}*/ |
||
3518 | |||
3519 | /** \name Client attribute stack */ |
||
3520 | /*@{*/ |
||
3521 | GLuint ClientAttribStackDepth; |
||
3522 | struct gl_attrib_node *ClientAttribStack[MAX_CLIENT_ATTRIB_STACK_DEPTH]; |
||
3523 | /*@}*/ |
||
3524 | |||
3525 | /** \name Client attribute groups */ |
||
3526 | /*@{*/ |
||
3527 | struct gl_array_attrib Array; /**< Vertex arrays */ |
||
3528 | struct gl_pixelstore_attrib Pack; /**< Pixel packing */ |
||
3529 | struct gl_pixelstore_attrib Unpack; /**< Pixel unpacking */ |
||
3530 | struct gl_pixelstore_attrib DefaultPacking; /**< Default params */ |
||
3531 | /*@}*/ |
||
3532 | |||
3533 | /** \name Other assorted state (not pushed/popped on attribute stack) */ |
||
3534 | /*@{*/ |
||
3535 | struct gl_pixelmaps PixelMaps; |
||
3536 | |||
3537 | struct gl_evaluators EvalMap; /**< All evaluators */ |
||
3538 | struct gl_feedback Feedback; /**< Feedback */ |
||
3539 | struct gl_selection Select; /**< Selection */ |
||
3540 | |||
3541 | struct gl_program_state Program; /**< general program state */ |
||
3542 | struct gl_vertex_program_state VertexProgram; |
||
3543 | struct gl_fragment_program_state FragmentProgram; |
||
3544 | struct gl_geometry_program_state GeometryProgram; |
||
3545 | struct gl_ati_fragment_shader_state ATIFragmentShader; |
||
3546 | |||
3547 | struct gl_shader_state Shader; /**< GLSL shader object state */ |
||
3548 | struct gl_shader_compiler_options ShaderCompilerOptions[MESA_SHADER_TYPES]; |
||
3549 | |||
3550 | struct gl_query_state Query; /**< occlusion, timer queries */ |
||
3551 | |||
3552 | struct gl_transform_feedback_state TransformFeedback; |
||
3553 | |||
3554 | struct gl_buffer_object *CopyReadBuffer; /**< GL_ARB_copy_buffer */ |
||
3555 | struct gl_buffer_object *CopyWriteBuffer; /**< GL_ARB_copy_buffer */ |
||
3556 | |||
3557 | /** |
||
3558 | * Current GL_ARB_uniform_buffer_object binding referenced by |
||
3559 | * GL_UNIFORM_BUFFER target for glBufferData, glMapBuffer, etc. |
||
3560 | */ |
||
3561 | struct gl_buffer_object *UniformBuffer; |
||
3562 | |||
3563 | /** |
||
3564 | * Array of uniform buffers for GL_ARB_uniform_buffer_object and GL 3.1. |
||
3565 | * This is set up using glBindBufferRange() or glBindBufferBase(). They are |
||
3566 | * associated with uniform blocks by glUniformBlockBinding()'s state in the |
||
3567 | * shader program. |
||
3568 | */ |
||
3569 | struct gl_uniform_buffer_binding |
||
3570 | UniformBufferBindings[MAX_COMBINED_UNIFORM_BUFFERS]; |
||
3571 | |||
3572 | /*@}*/ |
||
3573 | |||
3574 | struct gl_meta_state *Meta; /**< for "meta" operations */ |
||
3575 | |||
3576 | /* GL_EXT_framebuffer_object */ |
||
3577 | struct gl_renderbuffer *CurrentRenderbuffer; |
||
3578 | |||
3579 | GLenum ErrorValue; /**< Last error code */ |
||
3580 | |||
3581 | /* GL_ARB_robustness */ |
||
3582 | GLenum ResetStatus; |
||
3583 | |||
3584 | /** |
||
3585 | * Recognize and silence repeated error debug messages in buggy apps. |
||
3586 | */ |
||
3587 | const char *ErrorDebugFmtString; |
||
3588 | GLuint ErrorDebugCount; |
||
3589 | |||
3590 | /* GL_ARB_debug_output */ |
||
3591 | struct gl_debug_state Debug; |
||
3592 | |||
3593 | GLenum RenderMode; /**< either GL_RENDER, GL_SELECT, GL_FEEDBACK */ |
||
3594 | GLbitfield NewState; /**< bitwise-or of _NEW_* flags */ |
||
3595 | GLbitfield NewDriverState;/**< bitwise-or of flags from DriverFlags */ |
||
3596 | |||
3597 | struct gl_driver_flags DriverFlags; |
||
3598 | |||
3599 | GLboolean ViewportInitialized; /**< has viewport size been initialized? */ |
||
3600 | |||
3601 | GLbitfield64 varying_vp_inputs; /**< mask of VERT_BIT_* flags */ |
||
3602 | |||
3603 | /** \name Derived state */ |
||
3604 | GLbitfield _ImageTransferState;/**< bitwise-or of IMAGE_*_BIT flags */ |
||
3605 | GLfloat _EyeZDir[3]; |
||
3606 | GLfloat _ModelViewInvScale; |
||
3607 | GLboolean _NeedEyeCoords; |
||
3608 | GLboolean _ForceEyeCoords; |
||
3609 | |||
3610 | GLuint TextureStateTimestamp; /**< detect changes to shared state */ |
||
3611 | |||
3612 | struct gl_list_extensions *ListExt; /**< driver dlist extensions */ |
||
3613 | |||
3614 | /** \name For debugging/development only */ |
||
3615 | /*@{*/ |
||
3616 | GLboolean FirstTimeCurrent; |
||
3617 | /*@}*/ |
||
3618 | |||
3619 | /** software compression/decompression supported or not */ |
||
3620 | GLboolean Mesa_DXTn; |
||
3621 | |||
3622 | GLboolean TextureFormatSupported[MESA_FORMAT_COUNT]; |
||
3623 | |||
3624 | GLboolean RasterDiscard; /**< GL_RASTERIZER_DISCARD */ |
||
3625 | |||
3626 | /** |
||
3627 | * \name Hooks for module contexts. |
||
3628 | * |
||
3629 | * These will eventually live in the driver or elsewhere. |
||
3630 | */ |
||
3631 | /*@{*/ |
||
3632 | void *swrast_context; |
||
3633 | void *swsetup_context; |
||
3634 | void *swtnl_context; |
||
3635 | void *swtnl_im; |
||
3636 | struct st_context *st; |
||
3637 | void *aelt_context; |
||
3638 | /*@}*/ |
||
3639 | }; |
||
3640 | |||
3641 | |||
3642 | #ifdef DEBUG |
||
3643 | # define ENTER() printf("ENTER %s\n", __FUNCTION__) |
||
3644 | # define LEAVE() printf("LEAVE %s\n", __FUNCTION__) |
||
3645 | # define FAIL() printf("FAIL %s\n", __FUNCTION__) |
||
3646 | extern int MESA_VERBOSE; |
||
3647 | extern int MESA_DEBUG_FLAGS; |
||
3648 | # define MESA_FUNCTION __FUNCTION__ |
||
3649 | #else |
||
5373 | serge | 3650 | # define ENTER() |
3651 | # define LEAVE() |
||
4358 | Serge | 3652 | # define FAIL() |
3653 | # define MESA_VERBOSE 0 |
||
3654 | # define MESA_DEBUG_FLAGS 0 |
||
3655 | # define MESA_FUNCTION "a function" |
||
3656 | # ifndef NDEBUG |
||
3657 | # define NDEBUG |
||
3658 | # endif |
||
3659 | #endif |
||
3660 | |||
3661 | #ifdef BRW_DEBUG |
||
3662 | #define BRWENTER() printf("BRWENTER %s\n", __FUNCTION__) |
||
3663 | #define BRWLEAVE() printf("BRWLEAVE %s\n", __FUNCTION__) |
||
3664 | #define BRWFAIL() printf("BRWFAIL %s\n", __FUNCTION__) |
||
3665 | #else |
||
3666 | #define BRWENTER() |
||
3667 | #define BRWLEAVE() |
||
3668 | #define BRWFAIL() |
||
3669 | #endif |
||
3670 | |||
3671 | /** The MESA_VERBOSE var is a bitmask of these flags */ |
||
3672 | enum _verbose |
||
3673 | { |
||
3674 | VERBOSE_VARRAY = 0x0001, |
||
3675 | VERBOSE_TEXTURE = 0x0002, |
||
3676 | VERBOSE_MATERIAL = 0x0004, |
||
3677 | VERBOSE_PIPELINE = 0x0008, |
||
3678 | VERBOSE_DRIVER = 0x0010, |
||
3679 | VERBOSE_STATE = 0x0020, |
||
3680 | VERBOSE_API = 0x0040, |
||
3681 | VERBOSE_DISPLAY_LIST = 0x0100, |
||
3682 | VERBOSE_LIGHTING = 0x0200, |
||
3683 | VERBOSE_PRIMS = 0x0400, |
||
3684 | VERBOSE_VERTS = 0x0800, |
||
3685 | VERBOSE_DISASSEM = 0x1000, |
||
3686 | VERBOSE_DRAW = 0x2000, |
||
3687 | VERBOSE_SWAPBUFFERS = 0x4000 |
||
3688 | }; |
||
3689 | |||
3690 | |||
3691 | /** The MESA_DEBUG_FLAGS var is a bitmask of these flags */ |
||
3692 | enum _debug |
||
3693 | { |
||
3694 | DEBUG_SILENT = (1 << 0), |
||
3695 | DEBUG_ALWAYS_FLUSH = (1 << 1), |
||
3696 | DEBUG_INCOMPLETE_TEXTURE = (1 << 2), |
||
3697 | DEBUG_INCOMPLETE_FBO = (1 << 3) |
||
3698 | }; |
||
3699 | |||
3700 | |||
3701 | |||
3702 | #ifdef __cplusplus |
||
3703 | } |
||
3704 | #endif |
||
3705 | |||
3706 | #endif /* MTYPES_H */><>><>><>><>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>><>><>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>><>>>>=>>>>32)-1. |