15e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen/*
25e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * Mesa 3-D graphics library
3a335d334d45701a42c283257fa44f2f7148e186dBrian Paul * Version:  7.7
4ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes *
55761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
65761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
7ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes *
85e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * Permission is hereby granted, free of charge, to any person obtaining a
95e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * copy of this software and associated documentation files (the "Software"),
105e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * to deal in the Software without restriction, including without limitation
115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * the rights to use, copy, modify, merge, publish, distribute, sublicense,
125e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * and/or sell copies of the Software, and to permit persons to whom the
135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * Software is furnished to do so, subject to the following conditions:
14ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes *
155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * The above copyright notice and this permission notice shall be included
165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * in all copies or substantial portions of the Software.
17ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes *
185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
195e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
205e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
215e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
225e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
235e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
245e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
255e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
26e9b34885b8ff2ccb67a801cd1ce07e0df1b0e397Brian Paul/**
27e9b34885b8ff2ccb67a801cd1ce07e0df1b0e397Brian Paul * \file mtypes.h
28e9b34885b8ff2ccb67a801cd1ce07e0df1b0e397Brian Paul * Main Mesa data structures.
29e9b34885b8ff2ccb67a801cd1ce07e0df1b0e397Brian Paul *
30e9b34885b8ff2ccb67a801cd1ce07e0df1b0e397Brian Paul * Please try to mark derived values with a leading underscore ('_').
31e9b34885b8ff2ccb67a801cd1ce07e0df1b0e397Brian Paul */
325e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
331d5a68970f1d8fcca29ce24e6667a143733197f0Brian Paul#ifndef MTYPES_H
341d5a68970f1d8fcca29ce24e6667a143733197f0Brian Paul#define MTYPES_H
35ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes
365e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
37f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul#include "main/glheader.h"
38f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul#include "main/config.h"
39f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul#include "main/mfeatures.h"
402dbc515a669be123a019aeb4aa5aae6b1679f6a9Brian Paul#include "glapi/glapi.h"
415e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "math/m_matrix.h"	/* GLmatrix */
4216b393d05990b6e917e144f9de87d0103b4c3e6dIan Romanick#include "main/simple_list.h"	/* struct simple_node */
43001d944fd50e0579739b8865e6e09be5d267c05aEric Anholt#include "main/formats.h"       /* MESA_FORMAT_COUNT */
445e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
45ede4205b245ee58bacf866d298273ebbe31feacfLuca Barbieri
4663e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#ifdef __cplusplus
4763e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonsecaextern "C" {
4863e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#endif
4963e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
5063e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
51da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin/**
525606dfb572bf4b89b4882265924705bacc8c182bIan Romanick * \name 64-bit extension of GLbitfield.
535606dfb572bf4b89b4882265924705bacc8c182bIan Romanick */
545606dfb572bf4b89b4882265924705bacc8c182bIan Romanick/*@{*/
555606dfb572bf4b89b4882265924705bacc8c182bIan Romanicktypedef GLuint64 GLbitfield64;
565606dfb572bf4b89b4882265924705bacc8c182bIan Romanick
575606dfb572bf4b89b4882265924705bacc8c182bIan Romanick/** Set a single bit */
585fc5820cbc0faf57a48154466b4792294841a690José Fonseca#define BITFIELD64_BIT(b)      ((GLbitfield64)1 << (b))
5950e0091a9d70f9e6383ad322d4df7576bd7c38f7Mathias Fröhlich/** Set all bits up to excluding bit b */
6050e0091a9d70f9e6383ad322d4df7576bd7c38f7Mathias Fröhlich#define BITFIELD64_MASK(b)      \
6150e0091a9d70f9e6383ad322d4df7576bd7c38f7Mathias Fröhlich   ((b) == 64 ? (~(GLbitfield64)0) : BITFIELD64_BIT(b) - 1)
6250e0091a9d70f9e6383ad322d4df7576bd7c38f7Mathias Fröhlich/** Set count bits starting from bit b  */
6350e0091a9d70f9e6383ad322d4df7576bd7c38f7Mathias Fröhlich#define BITFIELD64_RANGE(b, count) \
6450e0091a9d70f9e6383ad322d4df7576bd7c38f7Mathias Fröhlich   (BITFIELD64_MASK((b) + (count)) & ~BITFIELD64_MASK(b))
655606dfb572bf4b89b4882265924705bacc8c182bIan Romanick
665606dfb572bf4b89b4882265924705bacc8c182bIan Romanick
675606dfb572bf4b89b4882265924705bacc8c182bIan Romanick/**
686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \name Some forward type declarations
695e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
715e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansenstruct _mesa_HashTable;
727f25d9ebb4856273c46ea4bbba4152b85f610a91Brian Paulstruct gl_attrib_node;
7333e9ac20e3b399c6ec6ec2f586a9402b68590992Brian Paulstruct gl_list_extensions;
74e9d9dab0cd8614898ecc2aceb49d8faf354cdbdfBrian Paulstruct gl_meta_state;
7532ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwellstruct gl_program_cache;
765e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansenstruct gl_texture_object;
77f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstruct gl_context;
78b939adfa155f2b3ca5c5226e86da85629654d79bKeith Whitwellstruct st_context;
799a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanickstruct gl_uniform_storage;
8084870e215667c999202be31057df6e31a0389bb7Brian Paulstruct prog_instruction;
8184870e215667c999202be31057df6e31a0389bb7Brian Paulstruct gl_program_parameter_list;
826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
835e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
845e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
85fe49dcb3b03454ec1451b610ea89f2374946e090Brian Paul/** Extra draw modes beyond GL_POINTS, GL_TRIANGLE_FAN, etc */
86fe49dcb3b03454ec1451b610ea89f2374946e090Brian Paul#define PRIM_OUTSIDE_BEGIN_END   (GL_POLYGON+1)
87fe49dcb3b03454ec1451b610ea89f2374946e090Brian Paul#define PRIM_INSIDE_UNKNOWN_PRIM (GL_POLYGON+2)
88fe49dcb3b03454ec1451b610ea89f2374946e090Brian Paul#define PRIM_UNKNOWN             (GL_POLYGON+3)
89fe49dcb3b03454ec1451b610ea89f2374946e090Brian Paul
905e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
91c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul
92c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul/**
9353f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul * Indexes for vertex program attributes.
9453f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul * GL_NV_vertex_program aliases generic attributes over the conventional
9553f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul * attributes.  In GL_ARB_vertex_program shader the aliasing is optional.
9653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul * In GL_ARB_vertex_shader / OpenGL 2.0 the aliasing is disallowed (the
9753f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul * generic attributes are distinct/separate).
986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
994c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paultypedef enum
1004dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
10153f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   VERT_ATTRIB_POS = 0,
10253f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   VERT_ATTRIB_WEIGHT = 1,
10353f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   VERT_ATTRIB_NORMAL = 2,
10453f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   VERT_ATTRIB_COLOR0 = 3,
10553f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   VERT_ATTRIB_COLOR1 = 4,
10653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   VERT_ATTRIB_FOG = 5,
10794b30dc390f1fdd526c080080830016fad3e2ee2Brian Paul   VERT_ATTRIB_COLOR_INDEX = 6,
108fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell   VERT_ATTRIB_EDGEFLAG = 7,
10953f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   VERT_ATTRIB_TEX0 = 8,
11053f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   VERT_ATTRIB_TEX1 = 9,
11153f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   VERT_ATTRIB_TEX2 = 10,
11253f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   VERT_ATTRIB_TEX3 = 11,
11353f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   VERT_ATTRIB_TEX4 = 12,
11453f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   VERT_ATTRIB_TEX5 = 13,
11553f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   VERT_ATTRIB_TEX6 = 14,
11653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   VERT_ATTRIB_TEX7 = 15,
117762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_POINT_SIZE = 16,
118762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC0 = 17,
119762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC1 = 18,
120762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC2 = 19,
121762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC3 = 20,
122762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC4 = 21,
123762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC5 = 22,
124762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC6 = 23,
125762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC7 = 24,
126762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC8 = 25,
127762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC9 = 26,
128762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC10 = 27,
129762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC11 = 28,
130762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC12 = 29,
131762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC13 = 30,
132762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC14 = 31,
133762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_GENERIC15 = 32,
134762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   VERT_ATTRIB_MAX = 33
1354c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul} gl_vert_attrib;
13653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul
13753f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul/**
138b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich * Symbolic constats to help iterating over
139b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich * specific blocks of vertex attributes.
140b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich *
141b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich * VERT_ATTRIB_FF
142b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich *   includes all fixed function attributes as well as
143b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich *   the aliased GL_NV_vertex_program shader attributes.
144b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich * VERT_ATTRIB_TEX
145b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich *   include the classic texture coordinate attributes.
146b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich *   Is a subset of VERT_ATTRIB_FF.
147b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich * VERT_ATTRIB_GENERIC_NV
148b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich *   include the NV shader attributes.
149b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich *   Is a subset of VERT_ATTRIB_FF.
150b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich * VERT_ATTRIB_GENERIC
151b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich *   include the OpenGL 2.0+ GLSL generic shader attributes.
152b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich *   These alias the generic GL_ARB_vertex_shader attributes.
153b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich */
154b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_ATTRIB_FF(i)           (VERT_ATTRIB_POS + (i))
155b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_ATTRIB_FF_MAX          VERT_ATTRIB_GENERIC0
156b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich
157b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_ATTRIB_TEX(i)          (VERT_ATTRIB_TEX0 + (i))
158b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_ATTRIB_TEX_MAX         MAX_TEXTURE_COORD_UNITS
159b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich
160b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_ATTRIB_GENERIC_NV(i)   (VERT_ATTRIB_POS + (i))
161b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_ATTRIB_GENERIC_NV_MAX  MAX_VERTEX_GENERIC_ATTRIBS
162b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich
163b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_ATTRIB_GENERIC(i)      (VERT_ATTRIB_GENERIC0 + (i))
164b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_ATTRIB_GENERIC_MAX     MAX_VERTEX_GENERIC_ATTRIBS
165b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich
166b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich/**
16753f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul * Bitflags for vertex attributes.
16853f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul * These are used in bitfields in many places.
16953f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul */
17053f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul/*@{*/
171f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_POS             BITFIELD64_BIT(VERT_ATTRIB_POS)
172f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_WEIGHT          BITFIELD64_BIT(VERT_ATTRIB_WEIGHT)
173f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_NORMAL          BITFIELD64_BIT(VERT_ATTRIB_NORMAL)
174f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_COLOR0          BITFIELD64_BIT(VERT_ATTRIB_COLOR0)
175f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_COLOR1          BITFIELD64_BIT(VERT_ATTRIB_COLOR1)
176f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_FOG             BITFIELD64_BIT(VERT_ATTRIB_FOG)
177f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_COLOR_INDEX     BITFIELD64_BIT(VERT_ATTRIB_COLOR_INDEX)
178f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_EDGEFLAG        BITFIELD64_BIT(VERT_ATTRIB_EDGEFLAG)
179f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_TEX0            BITFIELD64_BIT(VERT_ATTRIB_TEX0)
180f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_TEX1            BITFIELD64_BIT(VERT_ATTRIB_TEX1)
181f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_TEX2            BITFIELD64_BIT(VERT_ATTRIB_TEX2)
182f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_TEX3            BITFIELD64_BIT(VERT_ATTRIB_TEX3)
183f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_TEX4            BITFIELD64_BIT(VERT_ATTRIB_TEX4)
184f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_TEX5            BITFIELD64_BIT(VERT_ATTRIB_TEX5)
185f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_TEX6            BITFIELD64_BIT(VERT_ATTRIB_TEX6)
186f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_TEX7            BITFIELD64_BIT(VERT_ATTRIB_TEX7)
187762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich#define VERT_BIT_POINT_SIZE      BITFIELD64_BIT(VERT_ATTRIB_POINT_SIZE)
188f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT_GENERIC0        BITFIELD64_BIT(VERT_ATTRIB_GENERIC0)
189f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich
190f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich#define VERT_BIT(i)              BITFIELD64_BIT(i)
191f60e892c5017f66282080983da87f638d13917c5Mathias Fröhlich#define VERT_BIT_ALL             BITFIELD64_RANGE(0, VERT_ATTRIB_MAX)
192b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich
193b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_BIT_FF(i)           VERT_BIT(i)
194f60e892c5017f66282080983da87f638d13917c5Mathias Fröhlich#define VERT_BIT_FF_ALL          BITFIELD64_RANGE(0, VERT_ATTRIB_FF_MAX)
195b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_BIT_TEX(i)          VERT_BIT(VERT_ATTRIB_TEX(i))
196b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_BIT_TEX_ALL         \
197f60e892c5017f66282080983da87f638d13917c5Mathias Fröhlich   BITFIELD64_RANGE(VERT_ATTRIB_TEX(0), VERT_ATTRIB_TEX_MAX)
1982a207c4bf95312b68093280b97229cc4316f5724Mathias Froehlich#define VERT_BIT_FF_NVALIAS      \
1992a207c4bf95312b68093280b97229cc4316f5724Mathias Froehlich   BITFIELD64_RANGE(VERT_ATTRIB_POS, VERT_ATTRIB_TEX(VERT_ATTRIB_TEX_MAX))
2002a207c4bf95312b68093280b97229cc4316f5724Mathias Froehlich
201b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_BIT_GENERIC_NV(i)   VERT_BIT(VERT_ATTRIB_GENERIC_NV(i))
202b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_BIT_GENERIC_NV_ALL  \
203f60e892c5017f66282080983da87f638d13917c5Mathias Fröhlich   BITFIELD64_RANGE(VERT_ATTRIB_GENERIC_NV(0), VERT_ATTRIB_GENERIC_NV_MAX)
2042a207c4bf95312b68093280b97229cc4316f5724Mathias Froehlich
205b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_BIT_GENERIC(i)      VERT_BIT(VERT_ATTRIB_GENERIC(i))
206b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich#define VERT_BIT_GENERIC_ALL     \
207f60e892c5017f66282080983da87f638d13917c5Mathias Fröhlich   BITFIELD64_RANGE(VERT_ATTRIB_GENERIC(0), VERT_ATTRIB_GENERIC_MAX)
20853f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul/*@}*/
2094c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul
210bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol
211bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol/**
2126489a1d5bab75589569658d374257bf23cb67a23Paul Berry * Indexes for vertex program result attributes.  Note that
21351e7b058750cc480c296d45f773d7a5a662457f5Brian Paul * _mesa_vert_result_to_frag_attrib() and _mesa_frag_attrib_to_vert_result() make
2146489a1d5bab75589569658d374257bf23cb67a23Paul Berry * assumptions about the layout of this enum.
2157c26b61f9366a397e353d7b7f1f1d1f6d0dcd0c7Keith Whitwell */
2164c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paultypedef enum
2175761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul{
2185761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_HPOS = 0,
2195761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_COL0 = 1,
2205761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_COL1 = 2,
2215761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_FOGC = 3,
2225761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_TEX0 = 4,
2235761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_TEX1 = 5,
2245761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_TEX2 = 6,
2255761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_TEX3 = 7,
2265761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_TEX4 = 8,
2275761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_TEX5 = 9,
2285761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_TEX6 = 10,
2295761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_TEX7 = 11,
2305761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_PSIZ = 12,
2315761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_BFC0 = 13,
2325761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_BFC1 = 14,
2335761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_EDGE = 15,
2347d68c639ddb0f9df45cf698b8e8227bf1860b5fePaul Berry   VERT_RESULT_CLIP_VERTEX = 16,
2357d68c639ddb0f9df45cf698b8e8227bf1860b5fePaul Berry   VERT_RESULT_CLIP_DIST0 = 17,
2367d68c639ddb0f9df45cf698b8e8227bf1860b5fePaul Berry   VERT_RESULT_CLIP_DIST1 = 18,
2377d68c639ddb0f9df45cf698b8e8227bf1860b5fePaul Berry   VERT_RESULT_VAR0 = 19,  /**< shader varying */
2385761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul   VERT_RESULT_MAX = (VERT_RESULT_VAR0 + MAX_VARYING)
2394c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul} gl_vert_result;
2407c26b61f9366a397e353d7b7f1f1d1f6d0dcd0c7Keith Whitwell
2417c26b61f9366a397e353d7b7f1f1d1f6d0dcd0c7Keith Whitwell
242da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin/*********************************************/
243da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
244da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin/**
245da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Indexes for geometry program attributes.
246da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */
247da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusintypedef enum
248da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{
2497c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   GEOM_ATTRIB_POSITION = 0,
2507c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   GEOM_ATTRIB_COLOR0 = 1,
2517c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   GEOM_ATTRIB_COLOR1 = 2,
2527c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   GEOM_ATTRIB_SECONDARY_COLOR0 = 3,
2537c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   GEOM_ATTRIB_SECONDARY_COLOR1 = 4,
2547c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   GEOM_ATTRIB_FOG_FRAG_COORD = 5,
2557c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   GEOM_ATTRIB_POINT_SIZE = 6,
2567c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   GEOM_ATTRIB_CLIP_VERTEX = 7,
2577c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   GEOM_ATTRIB_PRIMITIVE_ID = 8,
2587c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   GEOM_ATTRIB_TEX_COORD = 9,
259da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
260da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_ATTRIB_VAR0 = 16,
261da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_ATTRIB_MAX = (GEOM_ATTRIB_VAR0 + MAX_VARYING)
262da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin} gl_geom_attrib;
263da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
264da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin/**
265da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Bitflags for geometry attributes.
266da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * These are used in bitfields in many places.
267da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */
268da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin/*@{*/
269da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#define GEOM_BIT_COLOR0      (1 << GEOM_ATTRIB_COLOR0)
270da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#define GEOM_BIT_COLOR1      (1 << GEOM_ATTRIB_COLOR1)
271da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#define GEOM_BIT_SCOLOR0     (1 << GEOM_ATTRIB_SECONDARY_COLOR0)
272da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#define GEOM_BIT_SCOLOR1     (1 << GEOM_ATTRIB_SECONDARY_COLOR1)
273da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#define GEOM_BIT_TEX_COORD   (1 << GEOM_ATTRIB_TEX_COORD)
274da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#define GEOM_BIT_FOG_COORD   (1 << GEOM_ATTRIB_FOG_FRAG_COORD)
275da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#define GEOM_BIT_POSITION    (1 << GEOM_ATTRIB_POSITION)
276da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#define GEOM_BIT_POINT_SIDE  (1 << GEOM_ATTRIB_POINT_SIZE)
277da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#define GEOM_BIT_CLIP_VERTEX (1 << GEOM_ATTRIB_CLIP_VERTEX)
278da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#define GEOM_BIT_PRIM_ID     (1 << GEOM_ATTRIB_PRIMITIVE_ID)
279da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#define GEOM_BIT_VAR0        (1 << GEOM_ATTRIB_VAR0)
280da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
281da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#define GEOM_BIT_VAR(g)  (1 << (GEOM_BIT_VAR0 + (g)))
282da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin/*@}*/
283da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
284da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
285da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin/**
286da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Indexes for geometry program result attributes
287da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */
288cfae745a8bcbc108611178b69c645cfe29f28b37Brian Paultypedef enum
289cfae745a8bcbc108611178b69c645cfe29f28b37Brian Paul{
290da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_POS  = 0,
291da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_COL0  = 1,
292da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_COL1  = 2,
293da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_SCOL0 = 3,
294da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_SCOL1 = 4,
295da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_FOGC = 5,
296da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_TEX0 = 6,
297da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_TEX1 = 7,
298da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_TEX2 = 8,
299da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_TEX3 = 9,
300da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_TEX4 = 10,
301da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_TEX5 = 11,
302da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_TEX6 = 12,
303da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_TEX7 = 13,
304da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_PSIZ = 14,
305da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_CLPV = 15,
306da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_PRID = 16,
307da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_LAYR = 17,
308da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_VAR0 = 18,  /**< shader varying, should really be 16 */
309da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* ### we need to -2 because var0 is 18 instead 16 like in the others */
310da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GEOM_RESULT_MAX  =  (GEOM_RESULT_VAR0 + MAX_VARYING - 2)
311da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin} gl_geom_result;
312cfae745a8bcbc108611178b69c645cfe29f28b37Brian Paul
313da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
3147c26b61f9366a397e353d7b7f1f1d1f6d0dcd0c7Keith Whitwell/**
3156489a1d5bab75589569658d374257bf23cb67a23Paul Berry * Indexes for fragment program input attributes.  Note that
31651e7b058750cc480c296d45f773d7a5a662457f5Brian Paul * _mesa_vert_result_to_frag_attrib() and frag_attrib_to_vert_result() make
3176489a1d5bab75589569658d374257bf23cb67a23Paul Berry * assumptions about the layout of this enum.
31827413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell */
3194c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paultypedef enum
3204dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
32153f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   FRAG_ATTRIB_WPOS = 0,
32253f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   FRAG_ATTRIB_COL0 = 1,
32353f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   FRAG_ATTRIB_COL1 = 2,
32453f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   FRAG_ATTRIB_FOGC = 3,
32553f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   FRAG_ATTRIB_TEX0 = 4,
32653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   FRAG_ATTRIB_TEX1 = 5,
32753f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   FRAG_ATTRIB_TEX2 = 6,
32853f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   FRAG_ATTRIB_TEX3 = 7,
32953f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   FRAG_ATTRIB_TEX4 = 8,
33053f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   FRAG_ATTRIB_TEX5 = 9,
33153f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   FRAG_ATTRIB_TEX6 = 10,
332c3626a91cee5034528f3f92c802a8e5947ea5f92Keith Whitwell   FRAG_ATTRIB_TEX7 = 11,
3339d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul   FRAG_ATTRIB_FACE = 12,  /**< front/back face */
3349d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul   FRAG_ATTRIB_PNTC = 13,  /**< sprite/point coord */
3353d7c5a4f6f4155e249f6eac76d861eb1bc59eb69Paul Berry   FRAG_ATTRIB_CLIP_DIST0 = 14,
3363d7c5a4f6f4155e249f6eac76d861eb1bc59eb69Paul Berry   FRAG_ATTRIB_CLIP_DIST1 = 15,
3373d7c5a4f6f4155e249f6eac76d861eb1bc59eb69Paul Berry   FRAG_ATTRIB_VAR0 = 16,  /**< shader varying */
338a90046f1097ad95de2aa95ca65741dff5cddced9Brian   FRAG_ATTRIB_MAX = (FRAG_ATTRIB_VAR0 + MAX_VARYING)
3394c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul} gl_frag_attrib;
34027413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell
3411a65d098cea54352335460fedf97f705d20f2ab7Brian Paul
34290ebb581e60d29bd565ad4d8a49e642de7b0ce5dBrian Paul/**
3436489a1d5bab75589569658d374257bf23cb67a23Paul Berry * Convert from a gl_vert_result value to the corresponding gl_frag_attrib.
3446489a1d5bab75589569658d374257bf23cb67a23Paul Berry *
3456489a1d5bab75589569658d374257bf23cb67a23Paul Berry * VERT_RESULT_HPOS is converted to FRAG_ATTRIB_WPOS.
3466489a1d5bab75589569658d374257bf23cb67a23Paul Berry *
3476489a1d5bab75589569658d374257bf23cb67a23Paul Berry * gl_vert_result values which have no corresponding gl_frag_attrib
3486489a1d5bab75589569658d374257bf23cb67a23Paul Berry * (VERT_RESULT_PSIZ, VERT_RESULT_BFC0, VERT_RESULT_BFC1, and
3496489a1d5bab75589569658d374257bf23cb67a23Paul Berry * VERT_RESULT_EDGE) are converted to a value of -1.
3506489a1d5bab75589569658d374257bf23cb67a23Paul Berry */
3519520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline int
3521a65d098cea54352335460fedf97f705d20f2ab7Brian Paul_mesa_vert_result_to_frag_attrib(gl_vert_result vert_result)
3536489a1d5bab75589569658d374257bf23cb67a23Paul Berry{
3543d7c5a4f6f4155e249f6eac76d861eb1bc59eb69Paul Berry   if (vert_result >= VERT_RESULT_CLIP_DIST0)
3553d7c5a4f6f4155e249f6eac76d861eb1bc59eb69Paul Berry      return vert_result - VERT_RESULT_CLIP_DIST0 + FRAG_ATTRIB_CLIP_DIST0;
3566489a1d5bab75589569658d374257bf23cb67a23Paul Berry   else if (vert_result <= VERT_RESULT_TEX7)
3576489a1d5bab75589569658d374257bf23cb67a23Paul Berry      return vert_result;
3586489a1d5bab75589569658d374257bf23cb67a23Paul Berry   else
3596489a1d5bab75589569658d374257bf23cb67a23Paul Berry      return -1;
3606489a1d5bab75589569658d374257bf23cb67a23Paul Berry}
3616489a1d5bab75589569658d374257bf23cb67a23Paul Berry
3621a65d098cea54352335460fedf97f705d20f2ab7Brian Paul
3636489a1d5bab75589569658d374257bf23cb67a23Paul Berry/**
3646489a1d5bab75589569658d374257bf23cb67a23Paul Berry * Convert from a gl_frag_attrib value to the corresponding gl_vert_result.
3656489a1d5bab75589569658d374257bf23cb67a23Paul Berry *
3666489a1d5bab75589569658d374257bf23cb67a23Paul Berry * FRAG_ATTRIB_WPOS is converted to VERT_RESULT_HPOS.
3676489a1d5bab75589569658d374257bf23cb67a23Paul Berry *
3686489a1d5bab75589569658d374257bf23cb67a23Paul Berry * gl_frag_attrib values which have no corresponding gl_vert_result
3696489a1d5bab75589569658d374257bf23cb67a23Paul Berry * (FRAG_ATTRIB_FACE and FRAG_ATTRIB_PNTC) are converted to a value of -1.
3706489a1d5bab75589569658d374257bf23cb67a23Paul Berry */
3719520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline int
3721a65d098cea54352335460fedf97f705d20f2ab7Brian Paul_mesa_frag_attrib_to_vert_result(gl_frag_attrib frag_attrib)
3736489a1d5bab75589569658d374257bf23cb67a23Paul Berry{
3746489a1d5bab75589569658d374257bf23cb67a23Paul Berry   if (frag_attrib <= FRAG_ATTRIB_TEX7)
3756489a1d5bab75589569658d374257bf23cb67a23Paul Berry      return frag_attrib;
3763d7c5a4f6f4155e249f6eac76d861eb1bc59eb69Paul Berry   else if (frag_attrib >= FRAG_ATTRIB_CLIP_DIST0)
3773d7c5a4f6f4155e249f6eac76d861eb1bc59eb69Paul Berry      return frag_attrib - FRAG_ATTRIB_CLIP_DIST0 + VERT_RESULT_CLIP_DIST0;
3786489a1d5bab75589569658d374257bf23cb67a23Paul Berry   else
3796489a1d5bab75589569658d374257bf23cb67a23Paul Berry      return -1;
3806489a1d5bab75589569658d374257bf23cb67a23Paul Berry}
3816489a1d5bab75589569658d374257bf23cb67a23Paul Berry
3821a65d098cea54352335460fedf97f705d20f2ab7Brian Paul
3836489a1d5bab75589569658d374257bf23cb67a23Paul Berry/**
38490ebb581e60d29bd565ad4d8a49e642de7b0ce5dBrian Paul * Bitflags for fragment program input attributes.
38553f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul */
38653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul/*@{*/
38727413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell#define FRAG_BIT_WPOS  (1 << FRAG_ATTRIB_WPOS)
38827413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell#define FRAG_BIT_COL0  (1 << FRAG_ATTRIB_COL0)
38927413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell#define FRAG_BIT_COL1  (1 << FRAG_ATTRIB_COL1)
39027413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell#define FRAG_BIT_FOGC  (1 << FRAG_ATTRIB_FOGC)
3919d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul#define FRAG_BIT_FACE  (1 << FRAG_ATTRIB_FACE)
3929d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul#define FRAG_BIT_PNTC  (1 << FRAG_ATTRIB_PNTC)
39327413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell#define FRAG_BIT_TEX0  (1 << FRAG_ATTRIB_TEX0)
39427413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell#define FRAG_BIT_TEX1  (1 << FRAG_ATTRIB_TEX1)
39527413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell#define FRAG_BIT_TEX2  (1 << FRAG_ATTRIB_TEX2)
39627413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell#define FRAG_BIT_TEX3  (1 << FRAG_ATTRIB_TEX3)
39727413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell#define FRAG_BIT_TEX4  (1 << FRAG_ATTRIB_TEX4)
39827413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell#define FRAG_BIT_TEX5  (1 << FRAG_ATTRIB_TEX5)
39927413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell#define FRAG_BIT_TEX6  (1 << FRAG_ATTRIB_TEX6)
40027413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell#define FRAG_BIT_TEX7  (1 << FRAG_ATTRIB_TEX7)
40107373512c72ca0fc19cccd1d102f14f1a41fd1bdBrian#define FRAG_BIT_VAR0  (1 << FRAG_ATTRIB_VAR0)
40207373512c72ca0fc19cccd1d102f14f1a41fd1bdBrian
40307373512c72ca0fc19cccd1d102f14f1a41fd1bdBrian#define FRAG_BIT_TEX(U)  (FRAG_BIT_TEX0 << (U))
40407373512c72ca0fc19cccd1d102f14f1a41fd1bdBrian#define FRAG_BIT_VAR(V)  (FRAG_BIT_VAR0 << (V))
40527413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell
40627413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell#define FRAG_BITS_TEX_ANY (FRAG_BIT_TEX0|	\
40727413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell			   FRAG_BIT_TEX1|	\
40827413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell			   FRAG_BIT_TEX2|	\
40927413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell			   FRAG_BIT_TEX3|	\
41027413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell			   FRAG_BIT_TEX4|	\
41127413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell			   FRAG_BIT_TEX5|	\
41227413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell			   FRAG_BIT_TEX6|	\
41327413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell			   FRAG_BIT_TEX7)
41453f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul/*@}*/
41527413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell
41627413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell
41790ebb581e60d29bd565ad4d8a49e642de7b0ce5dBrian Paul/**
41890ebb581e60d29bd565ad4d8a49e642de7b0ce5dBrian Paul * Fragment program results
419c3626a91cee5034528f3f92c802a8e5947ea5f92Keith Whitwell */
4204c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paultypedef enum
421a90046f1097ad95de2aa95ca65741dff5cddced9Brian{
4228d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul   FRAG_RESULT_DEPTH = 0,
423bec341d00c5fbc9c5f1c19c1b6729de636ffbfcbDave Airlie   FRAG_RESULT_STENCIL = 1,
424e4da46e007de5c83202976a12efb0e894494a354Eric Anholt   /* If a single color should be written to all render targets, this
425e4da46e007de5c83202976a12efb0e894494a354Eric Anholt    * register is written.  No FRAG_RESULT_DATAn will be written.
426e4da46e007de5c83202976a12efb0e894494a354Eric Anholt    */
427bec341d00c5fbc9c5f1c19c1b6729de636ffbfcbDave Airlie   FRAG_RESULT_COLOR = 2,
428e4da46e007de5c83202976a12efb0e894494a354Eric Anholt
429e4da46e007de5c83202976a12efb0e894494a354Eric Anholt   /* FRAG_RESULT_DATAn are the per-render-target (GLSL gl_FragData[n]
430e4da46e007de5c83202976a12efb0e894494a354Eric Anholt    * or ARB_fragment_program fragment.color[n]) color results.  If
431e4da46e007de5c83202976a12efb0e894494a354Eric Anholt    * any are written, FRAG_RESULT_COLOR will not be written.
432e4da46e007de5c83202976a12efb0e894494a354Eric Anholt    */
433bec341d00c5fbc9c5f1c19c1b6729de636ffbfcbDave Airlie   FRAG_RESULT_DATA0 = 3,
4341c09bcfdda4083636a3ac27d804a34ef87875ce7Brian   FRAG_RESULT_MAX = (FRAG_RESULT_DATA0 + MAX_DRAW_BUFFERS)
4354c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul} gl_frag_result;
436c3626a91cee5034528f3f92c802a8e5947ea5f92Keith Whitwell
437c3626a91cee5034528f3f92c802a8e5947ea5f92Keith Whitwell
438894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul/**
439e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Indexes for all renderbuffers
440e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
4414c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paultypedef enum
4424c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul{
4434c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   /* the four standard color buffers */
4444c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_FRONT_LEFT,
4454c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_BACK_LEFT,
4464c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_FRONT_RIGHT,
4474c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_BACK_RIGHT,
4484c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_DEPTH,
4494c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_STENCIL,
4504c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_ACCUM,
451555f0a88182e2b1af809b2d97abdac02814a2f28Brian Paul   /* optional aux buffer */
452555f0a88182e2b1af809b2d97abdac02814a2f28Brian Paul   BUFFER_AUX0,
4534c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   /* generic renderbuffers */
4544c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_COLOR0,
4554c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_COLOR1,
4564c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_COLOR2,
4574c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_COLOR3,
4584c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_COLOR4,
4594c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_COLOR5,
4604c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_COLOR6,
4614c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_COLOR7,
4624c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   BUFFER_COUNT
4634c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul} gl_buffer_index;
464e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
465e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
466e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Bit flags for all renderbuffers
467e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
468e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_FRONT_LEFT   (1 << BUFFER_FRONT_LEFT)
469e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_BACK_LEFT    (1 << BUFFER_BACK_LEFT)
470e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_FRONT_RIGHT  (1 << BUFFER_FRONT_RIGHT)
471e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_BACK_RIGHT   (1 << BUFFER_BACK_RIGHT)
472e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_AUX0         (1 << BUFFER_AUX0)
473e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_AUX1         (1 << BUFFER_AUX1)
474e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_AUX2         (1 << BUFFER_AUX2)
475e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_AUX3         (1 << BUFFER_AUX3)
476e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_DEPTH        (1 << BUFFER_DEPTH)
477e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_STENCIL      (1 << BUFFER_STENCIL)
478e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_ACCUM        (1 << BUFFER_ACCUM)
479e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_COLOR0       (1 << BUFFER_COLOR0)
480e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_COLOR1       (1 << BUFFER_COLOR1)
481e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_COLOR2       (1 << BUFFER_COLOR2)
482e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_COLOR3       (1 << BUFFER_COLOR3)
483e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_COLOR4       (1 << BUFFER_COLOR4)
484e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_COLOR5       (1 << BUFFER_COLOR5)
485e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_COLOR6       (1 << BUFFER_COLOR6)
486e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define BUFFER_BIT_COLOR7       (1 << BUFFER_COLOR7)
487894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul
488ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul/**
489ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Mask of all the color buffer bits (but not accum).
490ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */
491ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul#define BUFFER_BITS_COLOR  (BUFFER_BIT_FRONT_LEFT | \
492ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                            BUFFER_BIT_BACK_LEFT | \
493ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                            BUFFER_BIT_FRONT_RIGHT | \
494ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                            BUFFER_BIT_BACK_RIGHT | \
495ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                            BUFFER_BIT_AUX0 | \
496ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                            BUFFER_BIT_COLOR0 | \
497ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                            BUFFER_BIT_COLOR1 | \
498ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                            BUFFER_BIT_COLOR2 | \
499ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                            BUFFER_BIT_COLOR3 | \
500ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                            BUFFER_BIT_COLOR4 | \
501ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                            BUFFER_BIT_COLOR5 | \
502ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                            BUFFER_BIT_COLOR6 | \
503ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                            BUFFER_BIT_COLOR7)
504ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
505ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
5064c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul/**
5070fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul * Framebuffer configuration (aka visual / pixelformat)
5080fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul * Note: some of these fields should be boolean, but it appears that
5090fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul * code in drivers/dri/common/util.c requires int-sized fields.
5100fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul */
5110fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paulstruct gl_config
5120fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul{
5130fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLboolean rgbMode;
5140fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLboolean floatMode;
5150fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLboolean colorIndexMode;  /* XXX is this used anywhere? */
5160fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLuint doubleBufferMode;
5170fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLuint stereoMode;
5180fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5190fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLboolean haveAccumBuffer;
5200fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLboolean haveDepthBuffer;
5210fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLboolean haveStencilBuffer;
5220fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5230fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint redBits, greenBits, blueBits, alphaBits;	/* bits per comp */
5240fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLuint redMask, greenMask, blueMask, alphaMask;
5250fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint rgbBits;		/* total bits for rgb */
5260fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint indexBits;		/* total bits for colorindex */
5270fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5280fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits;
5290fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint depthBits;
5300fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint stencilBits;
5310fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5320fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint numAuxBuffers;
5330fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5340fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint level;
5350fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5360fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   /* EXT_visual_rating / GLX 1.2 */
5370fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint visualRating;
5380fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5390fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   /* EXT_visual_info / GLX 1.2 */
5400fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint transparentPixel;
5410fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   /*    colors are floats scaled to ints */
5420fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint transparentRed, transparentGreen, transparentBlue, transparentAlpha;
5430fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint transparentIndex;
5440fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5450fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   /* ARB_multisample / SGIS_multisample */
5460fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint sampleBuffers;
5470fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint samples;
5480fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5490fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   /* SGIX_pbuffer / GLX 1.3 */
5500fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint maxPbufferWidth;
5510fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint maxPbufferHeight;
5520fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint maxPbufferPixels;
5530fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint optimalPbufferWidth;   /* Only for SGIX_pbuffer. */
5540fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint optimalPbufferHeight;  /* Only for SGIX_pbuffer. */
5550fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5560fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   /* OML_swap_method */
5570fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint swapMethod;
5580fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5590fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   /* EXT_texture_from_pixmap */
5600fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint bindToTextureRgb;
5610fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint bindToTextureRgba;
5620fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint bindToMipmapTexture;
5630fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint bindToTextureTargets;
5640fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul   GLint yInverted;
565a637280e42b9a2f4ccbb5e7b209c5645073f584eDave Airlie
566a637280e42b9a2f4ccbb5e7b209c5645073f584eDave Airlie   /* EXT_framebuffer_sRGB */
567a637280e42b9a2f4ccbb5e7b209c5645073f584eDave Airlie   GLint sRGBCapable;
5680fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul};
5690fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5700fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5710fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul/**
5726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \name Bit flags used for updating material values.
5735e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
5746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
575ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_FRONT_AMBIENT           0
576ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_BACK_AMBIENT            1
577ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_FRONT_DIFFUSE           2
578ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_BACK_DIFFUSE            3
579ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_FRONT_SPECULAR          4
580ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_BACK_SPECULAR           5
581ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_FRONT_EMISSION          6
582ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_BACK_EMISSION           7
583ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_FRONT_SHININESS         8
584ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_BACK_SHININESS          9
585ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_FRONT_INDEXES           10
586ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_BACK_INDEXES            11
587ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_MAX                     12
588ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
589ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_AMBIENT(f)  (MAT_ATTRIB_FRONT_AMBIENT+(f))
590ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_DIFFUSE(f)  (MAT_ATTRIB_FRONT_DIFFUSE+(f))
591ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_SPECULAR(f) (MAT_ATTRIB_FRONT_SPECULAR+(f))
592ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_EMISSION(f) (MAT_ATTRIB_FRONT_EMISSION+(f))
593ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_SHININESS(f)(MAT_ATTRIB_FRONT_SHININESS+(f))
594ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_ATTRIB_INDEXES(f)  (MAT_ATTRIB_FRONT_INDEXES+(f))
595ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
596ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_INDEX_AMBIENT  0
597ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_INDEX_DIFFUSE  1
598ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_INDEX_SPECULAR 2
599ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
600ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_BIT_FRONT_AMBIENT         (1<<MAT_ATTRIB_FRONT_AMBIENT)
601ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_BIT_BACK_AMBIENT          (1<<MAT_ATTRIB_BACK_AMBIENT)
602ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_BIT_FRONT_DIFFUSE         (1<<MAT_ATTRIB_FRONT_DIFFUSE)
603ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_BIT_BACK_DIFFUSE          (1<<MAT_ATTRIB_BACK_DIFFUSE)
604ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_BIT_FRONT_SPECULAR        (1<<MAT_ATTRIB_FRONT_SPECULAR)
605ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_BIT_BACK_SPECULAR         (1<<MAT_ATTRIB_BACK_SPECULAR)
606ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_BIT_FRONT_EMISSION        (1<<MAT_ATTRIB_FRONT_EMISSION)
607ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_BIT_BACK_EMISSION         (1<<MAT_ATTRIB_BACK_EMISSION)
608ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_BIT_FRONT_SHININESS       (1<<MAT_ATTRIB_FRONT_SHININESS)
609ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_BIT_BACK_SHININESS        (1<<MAT_ATTRIB_BACK_SHININESS)
610ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_BIT_FRONT_INDEXES         (1<<MAT_ATTRIB_FRONT_INDEXES)
611ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define MAT_BIT_BACK_INDEXES          (1<<MAT_ATTRIB_BACK_INDEXES)
612ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
613ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
614ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define FRONT_MATERIAL_BITS	(MAT_BIT_FRONT_EMISSION | 	\
615ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell				 MAT_BIT_FRONT_AMBIENT |	\
616ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell				 MAT_BIT_FRONT_DIFFUSE | 	\
617ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell				 MAT_BIT_FRONT_SPECULAR |	\
618ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell				 MAT_BIT_FRONT_SHININESS | 	\
619ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell				 MAT_BIT_FRONT_INDEXES)
620ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
621ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell#define BACK_MATERIAL_BITS	(MAT_BIT_BACK_EMISSION |	\
622ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell				 MAT_BIT_BACK_AMBIENT |		\
623ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell				 MAT_BIT_BACK_DIFFUSE |		\
624ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell				 MAT_BIT_BACK_SPECULAR |	\
625ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell				 MAT_BIT_BACK_SHININESS |	\
626ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell				 MAT_BIT_BACK_INDEXES)
6275e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
6285e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#define ALL_MATERIAL_BITS	(FRONT_MATERIAL_BITS | BACK_MATERIAL_BITS)
6296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
6305e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
6315e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
6326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
633b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul * Material state.
634b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul */
635b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paulstruct gl_material
636b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul{
637b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul   GLfloat Attrib[MAT_ATTRIB_MAX][4];
638b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul};
639b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul
640b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul
641b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul/**
642b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul * Light state flags.
643b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul */
644b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul/*@{*/
645b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul#define LIGHT_SPOT         0x1
646b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul#define LIGHT_LOCAL_VIEWER 0x2
647b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul#define LIGHT_POSITIONAL   0x4
648b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul#define LIGHT_NEED_VERTICES (LIGHT_POSITIONAL|LIGHT_LOCAL_VIEWER)
649b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul/*@}*/
650b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul
651b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul
652b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul/**
6534dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Light source state.
6546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
6554dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_light
6564dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
6576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_light *next;	/**< double linked list with sentinel */
6585e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_light *prev;
6595e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
6606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat Ambient[4];		/**< ambient color */
6616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat Diffuse[4];		/**< diffuse color */
6626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat Specular[4];		/**< specular color */
6636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat EyePosition[4];	/**< position in eye coordinates */
6647391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul   GLfloat SpotDirection[4];	/**< spotlight direction in eye coordinates */
6655e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat SpotExponent;
666180b0dab8b87ef7987b9f2c44068d1eea3f54939Jouk Jansen   GLfloat SpotCutoff;		/**< in degrees */
6676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat _CosCutoff;		/**< = MAX(0, cos(SpotCutoff)) */
6685e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat ConstantAttenuation;
6695e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat LinearAttenuation;
6705e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat QuadraticAttenuation;
6716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean Enabled;		/**< On/off flag */
6725e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
6736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
6746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    * \name Derived fields
6756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    */
6766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
677b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul   GLbitfield _Flags;		/**< Mask of LIGHT_x bits defined above */
6785e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
6796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat _Position[4];	/**< position in eye/obj coordinates */
6806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat _VP_inf_norm[3];	/**< Norm direction to infinite light */
6816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat _h_inf_norm[3];	/**< Norm( _VP_inf_norm + <0,0,1> ) */
6827391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul   GLfloat _NormSpotDirection[4]; /**< normalized spotlight direction */
683ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes   GLfloat _VP_inf_spot_attenuation;
6845e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
6856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat _MatAmbient[2][3];	/**< material ambient * light ambient */
6866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat _MatDiffuse[2][3];	/**< material diffuse * light diffuse */
6876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat _MatSpecular[2][3];	/**< material spec * light specular */
6886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
6895e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
6905e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
6915e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
6926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
6934dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Light model state.
6946dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
6954dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_lightmodel
6964dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
6976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat Ambient[4];		/**< ambient color */
6986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean LocalViewer;	/**< Local (or infinite) view point? */
6996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean TwoSide;		/**< Two (or one) sided lighting? */
7006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum ColorControl;		/**< either GL_SINGLE_COLOR
7016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell				 *    or GL_SEPARATE_SPECULAR_COLOR */
7025e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
7035e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
7045e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
7056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
7064dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Accumulation buffer attribute group (GL_ACCUM_BUFFER_BIT)
7075e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
7084dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_accum_attrib
7094dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
7106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat ClearColor[4];	/**< Accumulation buffer clear color */
7115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
7125e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
7134d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul
7144d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul/**
7154d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul * Used for storing clear color, texture border color, etc.
7164d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul * The float values are typically unclamped.
7174d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul */
7184d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paulunion gl_color_union
7194d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul{
720093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airlie   GLfloat f[4];
721093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airlie   GLint i[4];
722093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airlie   GLuint ui[4];
723093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airlie};
7245e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
7254d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul
7266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
7274dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Color buffer attribute group (GL_COLOR_BUFFER_BIT).
7286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
7294dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_colorbuffer_attrib
7304dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
7314d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul   GLuint ClearIndex;                      /**< Index for glClear */
7324d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul   union gl_color_union ClearColor;        /**< Color for glClear, unclamped */
7334d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul   GLuint IndexMask;                       /**< Color index write mask */
7344d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul   GLubyte ColorMask[MAX_DRAW_BUFFERS][4]; /**< Each flag is 0xff or 0x0 */
7356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
73653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   GLenum DrawBuffer[MAX_DRAW_BUFFERS];	/**< Which buffer to draw into */
7376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
7386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
7396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    * \name alpha testing
7406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    */
7416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
7426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean AlphaEnabled;		/**< Alpha test enabled flag */
7436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum AlphaFunc;			/**< Alpha test function */
744e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   GLfloat AlphaRefUnclamped;
7456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLclampf AlphaRef;			/**< Alpha reference value */
7466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
7476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
7486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
7496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    * \name Blending
7506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    */
7516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
7523728673bd1b974e54858fbab6ff62d3607b0d3f0Brian Paul   GLbitfield BlendEnabled;		/**< Per-buffer blend enable flags */
753e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák
7544d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul   /* NOTE: this does _not_ depend on fragment clamping or any other clamping
7554d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul    * control, only on the fixed-pointness of the render target.
756e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák    * The query does however depend on fragment color clamping.
757e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák    */
758e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   GLfloat BlendColorUnclamped[4];               /**< Blending color */
7596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat BlendColor[4];		/**< Blending color */
760e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák
76174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   struct
76274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   {
76374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      GLenum SrcRGB;             /**< RGB blend source term */
76474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      GLenum DstRGB;             /**< RGB blend dest term */
76574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      GLenum SrcA;               /**< Alpha blend source term */
76674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      GLenum DstA;               /**< Alpha blend dest term */
76774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      GLenum EquationRGB;        /**< GL_ADD, GL_SUBTRACT, etc. */
76874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      GLenum EquationA;          /**< GL_ADD, GL_SUBTRACT, etc. */
769175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt      /**
770175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt       * Set if any blend factor uses SRC1.  Computed at the time blend factors
771175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt       * get set.
772175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt       */
773175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt      GLboolean _UsesDualSrc;
77474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   } Blend[MAX_DRAW_BUFFERS];
77574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   /** Are the blend func terms currently different for each buffer/target? */
77674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   GLboolean _BlendFuncPerBuffer;
77774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   /** Are the blend equations currently different for each buffer/target? */
77874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   GLboolean _BlendEquationPerBuffer;
7796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
7806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
7816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
7826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    * \name Logic op
7836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    */
7846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
7856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum LogicOp;			/**< Logic operator */
7866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean IndexLogicOpEnabled;	/**< Color index logic op enabled flag */
7876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean ColorLogicOpEnabled;	/**< RGBA logic op enabled flag */
7886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
7896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
7906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean DitherFlag;		/**< Dither enable flag */
791ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
792ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   GLenum ClampFragmentColor; /**< GL_TRUE, GL_FALSE or GL_FIXED_ONLY_ARB */
793e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   GLboolean _ClampFragmentColor; /** < with GL_FIXED_ONLY_ARB resolved */
794ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   GLenum ClampReadColor;     /**< GL_TRUE, GL_FALSE or GL_FIXED_ONLY_ARB */
795e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   GLboolean _ClampReadColor;     /** < with GL_FIXED_ONLY_ARB resolved */
796a637280e42b9a2f4ccbb5e7b209c5645073f584eDave Airlie
797a637280e42b9a2f4ccbb5e7b209c5645073f584eDave Airlie   GLboolean sRGBEnabled;	/**< Framebuffer sRGB blending/updating requested */
7985e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
7995e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8005e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
8024dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Current attribute group (GL_CURRENT_BIT).
8036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
8044dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_current_attrib
8054dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
8066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
807095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul    * \name Current vertex attributes.
808095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul    * \note Values are valid only after FLUSH_VERTICES has been called.
809fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell    * \note Index and Edgeflag current values are stored as floats in the
810fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell    * SIX and SEVEN attribute slots.
8115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    */
812095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   GLfloat Attrib[VERT_ATTRIB_MAX][4];	/**< Position, color, texcoords, etc */
813ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes
8146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
815095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul    * \name Current raster position attributes (always valid).
816095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul    * \note This set of attributes is very similar to the SWvertex struct.
8175e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    */
8186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
819095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   GLfloat RasterPos[4];
820095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   GLfloat RasterDistance;
821095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   GLfloat RasterColor[4];
822095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   GLfloat RasterSecondaryColor[4];
823ea81daf9544205b892926bdbbcdfdfc63fd7d872Brian Paul   GLfloat RasterTexCoords[MAX_TEXTURE_COORD_UNITS][4];
824095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   GLboolean RasterPosValid;
8256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
8265e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
8275e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8285e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
8304dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Depth buffer attribute group (GL_DEPTH_BUFFER_BIT).
8316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
8324dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_depthbuffer_attrib
8334dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
8346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum Func;			/**< Function for depth buffer compare */
835bcb3957b6c22caf35d9b300440648c3e656e8b4cKeith Whitwell   GLclampd Clear;		/**< Value to clear depth buffer to */
8366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean Test;		/**< Depth buffering enabled flag */
8376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean Mask;		/**< Depth buffer writable? */
8386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean BoundsTest;        /**< GL_EXT_depth_bounds_test */
8396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat BoundsMin, BoundsMax;/**< GL_EXT_depth_bounds_test */
8405e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
8415e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8425e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
8444dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Evaluator attribute group (GL_EVAL_BIT).
8456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
8464dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_eval_attrib
8474dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
8486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
8496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    * \name Enable bits
8506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    */
8516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
8525e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map1Color4;
8535e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map1Index;
8545e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map1Normal;
8555e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map1TextureCoord1;
8565e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map1TextureCoord2;
8575e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map1TextureCoord3;
8585e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map1TextureCoord4;
8595e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map1Vertex3;
8605e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map1Vertex4;
861bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   GLboolean Map1Attrib[16];  /* GL_NV_vertex_program */
8625e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map2Color4;
8635e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map2Index;
8645e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map2Normal;
8655e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map2TextureCoord1;
8665e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map2TextureCoord2;
8675e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map2TextureCoord3;
8685e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map2TextureCoord4;
8695e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map2Vertex3;
8705e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean Map2Vertex4;
871bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   GLboolean Map2Attrib[16];  /* GL_NV_vertex_program */
8725e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean AutoNormal;
8736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
8746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
8756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
8766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    * \name Map Grid endpoints and divisions and calculated du values
8776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    */
8786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
8795e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLint MapGrid1un;
8805e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat MapGrid1u1, MapGrid1u2, MapGrid1du;
8815e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLint MapGrid2un, MapGrid2vn;
8825e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat MapGrid2u1, MapGrid2u2, MapGrid2du;
8835e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat MapGrid2v1, MapGrid2v2, MapGrid2dv;
8846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
8855e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
8865e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8875e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
8894dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Fog attribute group (GL_FOG_BIT).
8906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
8914dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_fog_attrib
8924dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
8936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean Enabled;		/**< Fog enabled flag */
894e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   GLfloat ColorUnclamped[4];            /**< Fog color */
8956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat Color[4];		/**< Fog color */
8966dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat Density;		/**< Density >= 0.0 */
8976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat Start;		/**< Start distance in eye coords */
8986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat End;			/**< End distance in eye coords */
8996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat Index;		/**< Fog index */
9006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum Mode;			/**< Fog mode */
9015e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean ColorSumEnabled;
902180b0dab8b87ef7987b9f2c44068d1eea3f54939Jouk Jansen   GLenum FogCoordinateSource;  /**< GL_EXT_fog_coord */
903071357096e682e9af59ad45ea5abc444ab431837Michal Krol   GLfloat _Scale;		/**< (End == Start) ? 1.0 : 1.0 / (End - Start) */
904740467dd62962b4effdaf51e38edc032e2a39487Nicholas Miell   GLenum FogDistanceMode;     /**< GL_NV_fog_distance */
9055e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
9065e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
9075e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
9086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
9094dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Hint attribute group (GL_HINT_BIT).
9106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
9116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Values are always one of GL_FASTEST, GL_NICEST, or GL_DONT_CARE.
9126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
9134dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_hint_attrib
9144dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
9155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLenum PerspectiveCorrection;
9165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLenum PointSmooth;
9175e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLenum LineSmooth;
9185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLenum PolygonSmooth;
9195e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLenum Fog;
9206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum ClipVolumeClipping;   /**< GL_EXT_clip_volume_hint */
9216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum TextureCompression;   /**< GL_ARB_texture_compression */
922efb41b07ff213735e8ea08f38a7799f9d80459fcBrian Paul   GLenum GenerateMipmap;       /**< GL_SGIS_generate_mipmap */
9232a37053fd5591eeb21db33aa8f6ee444da1eee7aMichal Krol   GLenum FragmentShaderDerivative; /**< GL_ARB_fragment_shader */
9245e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
9255e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
92686b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
9276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
9284dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Lighting attribute group (GL_LIGHT_BIT).
9296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
9304dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_light_attrib
9314dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
9324dafbc3dc75be565704f437016f70a63c48d1539Brian Paul   struct gl_light Light[MAX_LIGHTS];	/**< Array of light sources */
9336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_lightmodel Model;		/**< Lighting model */
934cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
9356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
936b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul    * Front and back material values.
937b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul    * Note: must call FLUSH_VERTICES() before using.
938cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
939b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul   struct gl_material Material;
9406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
9416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean Enabled;			/**< Lighting enabled flag */
9426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum ShadeModel;			/**< GL_FLAT or GL_SMOOTH */
94389966cdb1b5974059c32308d74b5bb09943a6fa1Brian Paul   GLenum ProvokingVertex;              /**< GL_EXT_provoking_vertex */
9446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum ColorMaterialFace;		/**< GL_FRONT, BACK or FRONT_AND_BACK */
9456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum ColorMaterialMode;		/**< GL_AMBIENT, GL_DIFFUSE, etc */
9464cb3579e52fed48d623698610e31d05ac8c8946fBrian Paul   GLbitfield _ColorMaterialBitmask;	/**< bitmask formed from Face and Mode */
9475e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean ColorMaterialEnabled;
948b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul   GLenum ClampVertexColor;             /**< GL_TRUE, GL_FALSE, GL_FIXED_ONLY */
949e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   GLboolean _ClampVertexColor;
9505e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
9516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_light EnabledList;         /**< List sentinel */
9525e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
9536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
9544dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    * Derived state for optimizations:
9556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    */
9566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
9576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean _NeedEyeCoords;
9586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean _NeedVertices;		/**< Use fast shader? */
9595e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat _BaseColor[2][3];
9606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
9615e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
9625e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
9635e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
9646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
9654dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Line attribute group (GL_LINE_BIT).
9666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
9674dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_line_attrib
9684dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
9696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean SmoothFlag;	/**< GL_LINE_SMOOTH enabled? */
9706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean StippleFlag;	/**< GL_LINE_STIPPLE enabled? */
9716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLushort StipplePattern;	/**< Stipple pattern */
9726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLint StippleFactor;		/**< Stipple repeat factor */
9736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat Width;		/**< Line width */
9745e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
9755e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
9765e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
97753f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul/**
9784dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Display list attribute group (GL_LIST_BIT).
97953f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul */
9804dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_list_attrib
9814dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
9825e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLuint ListBase;
9835e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
9845e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
98586b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
9864dafbc3dc75be565704f437016f70a63c48d1539Brian Paul/**
9874dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Multisample attribute group (GL_MULTISAMPLE_BIT).
98853f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul */
9894dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_multisample_attrib
9904dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
991736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul   GLboolean Enabled;
9925ef4e4ffb8053db87f52df3c9b2ddb71d9c7d6e5Roland Scheidegger   GLboolean _Enabled;   /**< true if Enabled and multisample buffer */
993736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul   GLboolean SampleAlphaToCoverage;
994736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul   GLboolean SampleAlphaToOne;
995736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul   GLboolean SampleCoverage;
996736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul   GLfloat SampleCoverageValue;
997736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul   GLboolean SampleCoverageInvert;
998736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul};
999736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul
1000736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul
10016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1002b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian * A pixelmap (see glPixelMap)
1003b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian */
1004b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brianstruct gl_pixelmap
1005b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian{
1006b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   GLint Size;
1007b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   GLfloat Map[MAX_PIXEL_MAP_TABLE];
1008b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian};
1009b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian
1010b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian
1011b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian/**
1012b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian * Collection of all pixelmaps
1013b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian */
1014b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brianstruct gl_pixelmaps
1015b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian{
1016b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   struct gl_pixelmap RtoR;  /**< i.e. GL_PIXEL_MAP_R_TO_R */
1017b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   struct gl_pixelmap GtoG;
1018b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   struct gl_pixelmap BtoB;
1019b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   struct gl_pixelmap AtoA;
1020b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   struct gl_pixelmap ItoR;
1021b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   struct gl_pixelmap ItoG;
1022b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   struct gl_pixelmap ItoB;
1023b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   struct gl_pixelmap ItoA;
1024b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   struct gl_pixelmap ItoI;
1025b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   struct gl_pixelmap StoS;
1026b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian};
1027b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian
1028b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian
1029b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian/**
10304dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Pixel attribute group (GL_PIXEL_MODE_BIT).
10316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
10324dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_pixel_attrib
10334dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
1034e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLenum ReadBuffer;		/**< source buffer for glRead/CopyPixels() */
1035b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian
1036b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   /*--- Begin Pixel Transfer State ---*/
1037b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   /* Fields are in the order in which they're applied... */
1038b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian
1039bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   /** Scale & Bias (index shift, offset) */
1040bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   /*@{*/
10415e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat RedBias, RedScale;
10425e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat GreenBias, GreenScale;
10435e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat BlueBias, BlueScale;
10445e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat AlphaBias, AlphaScale;
10455e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat DepthBias, DepthScale;
10465e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLint IndexShift, IndexOffset;
1047bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   /*@}*/
1048b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian
1049b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   /* Pixel Maps */
1050b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   /* Note: actual pixel maps are not part of this attrib group */
10515e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean MapColorFlag;
10525e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean MapStencilFlag;
1053b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian
1054b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   /*--- End Pixel Transfer State ---*/
1055b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian
10564dfa3757c58255c3ad8c3fe343541d2aa677f44cBrian Paul   /** glPixelZoom */
1057b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   GLfloat ZoomX, ZoomY;
10585e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
10595e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
10605e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
10616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
10624dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Point attribute group (GL_POINT_BIT).
10636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
10644dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_point_attrib
10654dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
10666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean SmoothFlag;	/**< True if GL_POINT_SMOOTH is enabled */
10676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat Size;		/**< User-specified point size */
10686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat Params[3];		/**< GL_EXT_point_parameters */
10696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat MinSize, MaxSize;	/**< GL_EXT_point_parameters */
10706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat Threshold;		/**< GL_EXT_point_parameters */
10716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean _Attenuated;	/**< True if Params != [1, 0, 0] */
1072ee4e75bd6f768b7210436feeb32b4545ed62e025Brian Paul   GLboolean PointSprite;	/**< GL_NV/ARB_point_sprite */
1073ea81daf9544205b892926bdbbcdfdfc63fd7d872Brian Paul   GLboolean CoordReplace[MAX_TEXTURE_COORD_UNITS]; /**< GL_ARB_point_sprite*/
107463736723678ef30e7f90835cfbd48c520e39bf11Ian Romanick   GLenum SpriteRMode;		/**< GL_NV_point_sprite (only!) */
1075a9ea1628da5f17274cd7ee023f438046dc992073Daniel Borca   GLenum SpriteOrigin;		/**< GL_ARB_point_sprite */
10765e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
10775e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
10785e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
10796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
10804dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Polygon attribute group (GL_POLYGON_BIT).
10816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
10824dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_polygon_attrib
10834dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
10846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum FrontFace;		/**< Either GL_CW or GL_CCW */
10856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum FrontMode;		/**< Either GL_POINT, GL_LINE or GL_FILL */
10866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum BackMode;		/**< Either GL_POINT, GL_LINE or GL_FILL */
10876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean _FrontBit;		/**< 0=GL_CCW, 1=GL_CW */
10886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean CullFlag;		/**< Culling on/off flag */
10896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean SmoothFlag;	/**< True if GL_POLYGON_SMOOTH is enabled */
10906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean StippleFlag;	/**< True if GL_POLYGON_STIPPLE is enabled */
10916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum CullFaceMode;		/**< Culling mode GL_FRONT or GL_BACK */
10926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat OffsetFactor;	/**< Polygon offset factor, from user */
10936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat OffsetUnits;		/**< Polygon offset units, from user */
10946dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean OffsetPoint;	/**< Offset in GL_POINT mode */
10956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean OffsetLine;	/**< Offset in GL_LINE mode */
10966dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean OffsetFill;	/**< Offset in GL_FILL mode */
10975e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
10985e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
10995e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
11006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
11014dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Scissor attributes (GL_SCISSOR_BIT).
11026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
11034dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_scissor_attrib
11044dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
11056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean Enabled;		/**< Scissor test enabled? */
11066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLint X, Y;			/**< Lower left corner of box */
11076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLsizei Width, Height;	/**< Size of box */
11085e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
11095e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
11105e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
11116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
11124dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Stencil attribute group (GL_STENCIL_BUFFER_BIT).
1113dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick *
1114dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick * Three sets of stencil data are tracked so that OpenGL 2.0,
1115dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick * GL_EXT_stencil_two_side, and GL_ATI_separate_stencil can all be supported
1116dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick * simultaneously.  In each of the stencil state arrays, element 0 corresponds
1117dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick * to GL_FRONT.  Element 1 corresponds to the OpenGL 2.0 /
1118dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick * GL_ATI_separate_stencil GL_BACK state.  Element 2 corresponds to the
1119dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick * GL_EXT_stencil_two_side GL_BACK state.
1120dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick *
1121dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick * The derived value \c _BackFace is either 1 or 2 depending on whether or
1122dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick * not GL_STENCIL_TEST_TWO_SIDE_EXT is enabled.
1123dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick *
1124dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick * The derived value \c _TestTwoSide is set when the front-face and back-face
1125dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick * stencil state are different.
11266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
11274dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_stencil_attrib
11284dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
11296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean Enabled;		/**< Enabled flag */
11306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean TestTwoSide;	/**< GL_EXT_stencil_two_side */
1131dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick   GLubyte ActiveFace;		/**< GL_EXT_stencil_two_side (0 or 2) */
1132f352a80aec10c3faf2d84e0b35d59b4edc0395efBrian Paul   GLboolean _Enabled;          /**< Enabled and stencil buffer present */
113342c34efd23d7ad05df9f3c71f7d52dd259e179d8Brian Paul   GLboolean _TestTwoSide;
1134a304cc6cca2ee21c3b25041abf882ef0616e5244Brian Paul   GLubyte _BackFace;           /**< Current back stencil state (1 or 2) */
1135dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick   GLenum Function[3];		/**< Stencil function */
1136dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick   GLenum FailFunc[3];		/**< Fail function */
1137dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick   GLenum ZPassFunc[3];		/**< Depth buffer pass function */
1138dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick   GLenum ZFailFunc[3];		/**< Depth buffer fail function */
1139dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick   GLint Ref[3];		/**< Reference value */
1140dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick   GLuint ValueMask[3];		/**< Value mask */
1141dde7cb962860e72e1bf3175069767358cc5b3f3cIan Romanick   GLuint WriteMask[3];		/**< Write mask */
1142b5932cfc9d48cf21554e2f9fdaccb7d8b52f2f8dBrian Paul   GLuint Clear;		/**< Clear value */
11435e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
11445e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
11455e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
114653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul/**
1147d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul * An index for each type of texture object.  These correspond to the GL
114830b3d800917cc5b41ec508fd38a0ae1da8624a36Brian Paul * texture target enums, such as GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP, etc.
1149d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul * Note: the order is from highest priority to lowest priority.
115053f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul */
11514c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paultypedef enum
11524c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul{
1153874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   TEXTURE_BUFFER_INDEX,
1154d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul   TEXTURE_2D_ARRAY_INDEX,
1155d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul   TEXTURE_1D_ARRAY_INDEX,
11560c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu   TEXTURE_EXTERNAL_INDEX,
1157d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul   TEXTURE_CUBE_INDEX,
1158d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul   TEXTURE_3D_INDEX,
1159d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul   TEXTURE_RECT_INDEX,
1160d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul   TEXTURE_2D_INDEX,
1161d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul   TEXTURE_1D_INDEX,
1162d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul   NUM_TEXTURE_TARGETS
11634c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul} gl_texture_index;
1164d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul
116514e6bbccffa0a4d6b9d505212e812521da3677b6Brian Paul
116653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul/**
116753f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul * Bit flags for each type of texture object
116853f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul * Used for Texture.Unit[]._ReallyEnabled flags.
116953f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul */
117053f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul/*@{*/
1171874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul#define TEXTURE_BUFFER_BIT   (1 << TEXTURE_BUFFER_INDEX)
1172d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul#define TEXTURE_2D_ARRAY_BIT (1 << TEXTURE_2D_ARRAY_INDEX)
1173d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul#define TEXTURE_1D_ARRAY_BIT (1 << TEXTURE_1D_ARRAY_INDEX)
11740c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu#define TEXTURE_EXTERNAL_BIT (1 << TEXTURE_EXTERNAL_INDEX)
117503ec41ddc51e539c989a546f33d22daa2af69095Brian#define TEXTURE_CUBE_BIT     (1 << TEXTURE_CUBE_INDEX)
1176d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul#define TEXTURE_3D_BIT       (1 << TEXTURE_3D_INDEX)
117703ec41ddc51e539c989a546f33d22daa2af69095Brian#define TEXTURE_RECT_BIT     (1 << TEXTURE_RECT_INDEX)
1178d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul#define TEXTURE_2D_BIT       (1 << TEXTURE_2D_INDEX)
1179d059d030342fc232a5b54298c0591f5f814f4adbBrian Paul#define TEXTURE_1D_BIT       (1 << TEXTURE_1D_INDEX)
118053f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul/*@}*/
118114e6bbccffa0a4d6b9d505212e812521da3677b6Brian Paul
118214e6bbccffa0a4d6b9d505212e812521da3677b6Brian Paul
118353f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul/**
11848c3b5cf943808faa7c57c19a2b4c7b6fffe653d6Brian Paul * Texture image state.  Drivers will typically create a subclass of this
11858c3b5cf943808faa7c57c19a2b4c7b6fffe653d6Brian Paul * with extra fields for memory buffers, etc.
11866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
11874dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_texture_image
11884dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
1189960d49b387ff4b64f802097c5013beee4de3649dBrian Paul   GLint InternalFormat;	/**< Internal format as given by the user */
1190a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul   GLenum _BaseFormat;		/**< Either GL_RGB, GL_RGBA, GL_ALPHA,
1191f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul				 *   GL_LUMINANCE, GL_LUMINANCE_ALPHA,
1192eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick				 *   GL_INTENSITY, GL_DEPTH_COMPONENT or
1193eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick				 *   GL_DEPTH_STENCIL_EXT only. Used for
1194eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick				 *   choosing TexEnv arithmetic.
11955e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen				 */
1196fc5ab1b19780ef97c5e7f6257a2d91121503bd53Brian Paul   gl_format TexFormat;         /**< The actual texture memory format */
1197960d49b387ff4b64f802097c5013beee4de3649dBrian Paul
11986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint Border;		/**< 0 or 1 */
11996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint Width;		/**< = 2^WidthLog2 + 2*Border */
12006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint Height;		/**< = 2^HeightLog2 + 2*Border */
12016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint Depth;		/**< = 2^DepthLog2 + 2*Border */
12026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint Width2;		/**< = Width - 2*Border */
12036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint Height2;		/**< = Height - 2*Border */
12046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint Depth2;		/**< = Depth - 2*Border */
12056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint WidthLog2;		/**< = log2(Width2) */
12066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint HeightLog2;		/**< = log2(Height2) */
12076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint DepthLog2;		/**< = log2(Depth2) */
1208efa6b5e42b427c1ec9f2d636d280c84e7da71346Marek Olšák   GLuint MaxNumLevels;		/**< = maximum possible number of mipmap
1209efa6b5e42b427c1ec9f2d636d280c84e7da71346Marek Olšák                                       levels, computed from the dimensions */
12108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
1211a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul   struct gl_texture_object *TexObject;  /**< Pointer back to parent object */
1212a231d245514b43cf547ccb996b68efc0186e6821Brian Paul   GLuint Level;                /**< Which mipmap level am I? */
1213a231d245514b43cf547ccb996b68efc0186e6821Brian Paul   /** Cube map face: index into gl_texture_object::Image[] array */
1214a231d245514b43cf547ccb996b68efc0186e6821Brian Paul   GLuint Face;
12155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
12165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
121753f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul
121853f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul/**
121953f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul * Indexes for cube map faces.
122053f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul */
12214c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paultypedef enum
12224c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul{
12234c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   FACE_POS_X = 0,
12244c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   FACE_NEG_X = 1,
12254c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   FACE_POS_Y = 2,
12264c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   FACE_NEG_Y = 3,
12274c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   FACE_POS_Z = 4,
12284c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   FACE_NEG_Z = 5,
12294c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul   MAX_FACES = 6
12304c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul} gl_face_index;
123153f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul
12325e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
12336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1234ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul * Sampler object state.  These objects are new with GL_ARB_sampler_objects
1235ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul * and OpenGL 3.3.  Legacy texture objects also contain a sampler object.
12366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
1237ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paulstruct gl_sampler_object
12384dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
1239ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   GLuint Name;
1240ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   GLint RefCount;
1241ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul
1242bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul   GLenum WrapS;		/**< S-axis texture image wrap mode */
1243bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul   GLenum WrapT;		/**< T-axis texture image wrap mode */
1244bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul   GLenum WrapR;		/**< R-axis texture image wrap mode */
12456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum MinFilter;		/**< minification filter */
12466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum MagFilter;		/**< magnification filter */
1247093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airlie   union gl_color_union BorderColor;  /**< Interpreted according to texture format */
12486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat MinLod;		/**< min lambda, OpenGL 1.2 */
12496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat MaxLod;		/**< max lambda, OpenGL 1.2 */
1250781fb93877ea3a6faeefcdb48d9b463da7d954a3Brian Paul   GLfloat LodBias;		/**< OpenGL 1.4 */
12516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat MaxAnisotropy;	/**< GL_EXT_texture_filter_anisotropic */
12526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum CompareMode;		/**< GL_ARB_shadow */
12536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum CompareFunc;		/**< GL_ARB_shadow */
1254ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   GLenum sRGBDecode;           /**< GL_DECODE_EXT or GL_SKIP_DECODE_EXT */
1255a19c42ffc606b594558a0c4f981662442ad6bb83Marek Olšák   GLboolean CubeMapSeamless;   /**< GL_AMD_seamless_cubemap_per_texture */
1256ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul};
1257ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul
1258ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul
1259ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul/**
1260ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul * Texture object state.  Contains the array of mipmap images, border color,
1261eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick * wrap modes, filter modes, and shadow/texcompare state.
1262ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul */
1263ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paulstruct gl_texture_object
1264ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul{
1265ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   _glthread_Mutex Mutex;	/**< for thread safety */
1266ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   GLint RefCount;		/**< reference count */
1267ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   GLuint Name;			/**< the user-visible texture object ID */
1268ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   GLenum Target;               /**< GL_TEXTURE_1D, GL_TEXTURE_2D, etc. */
1269ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul
1270ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   struct gl_sampler_object Sampler;
1271ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul
1272c37efbfe4c415b6fd2d4f968220d7c9b62f11ecfPauli Nieminen   GLenum DepthMode;		/**< GL_ARB_depth_texture */
1273c37efbfe4c415b6fd2d4f968220d7c9b62f11ecfPauli Nieminen
1274ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   GLfloat Priority;		/**< in [0,1] */
1275ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   GLint BaseLevel;		/**< min mipmap level, OpenGL 1.2 */
1276ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   GLint MaxLevel;		/**< max mipmap level, OpenGL 1.2 */
12776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLint _MaxLevel;		/**< actual max mipmap level (q in the spec) */
12786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat _MaxLambda;		/**< = _MaxLevel - BaseLevel (q - b in spec) */
12791b7e90984511cfa47597c255d73ca416ddd2db6fBrian Paul   GLint CropRect[4];           /**< GL_OES_draw_texture */
12804a89e51c5f88b57040b361b62e80a57c8248ba4bBrian Paul   GLenum Swizzle[4];           /**< GL_EXT_texture_swizzle */
12814a89e51c5f88b57040b361b62e80a57c8248ba4bBrian Paul   GLuint _Swizzle;             /**< same as Swizzle, but SWIZZLE_* format */
12826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean GenerateMipmap;    /**< GL_SGIS_generate_mipmap */
1283f4a93e0665881dd58a95abb6525676bd1cc2e6afBrian Paul   GLboolean _BaseComplete;     /**< Is the base texture level valid? */
1284f4a93e0665881dd58a95abb6525676bd1cc2e6afBrian Paul   GLboolean _MipmapComplete;   /**< Is the whole mipmap valid? */
128573fd269d2f5aa2a0b9bc03ef904b81e263e3cc37Brian Paul   GLboolean _IsIntegerFormat;  /**< Does the texture store integer values? */
12862897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul   GLboolean _RenderToTexture;  /**< Any rendering to this texture? */
128799864d595f7d4c13e9548f83d5972db9af64e67bChris Wilson   GLboolean Purgeable;         /**< Is the buffer purgeable under memory pressure? */
1288b296315881e4da60798e546f24c727a49deb9a89Brian Paul   GLboolean Immutable;         /**< GL_ARB_texture_storage */
12893893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul
1290bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul   /** Actual texture images, indexed by [cube face] and [mipmap level] */
129118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell   struct gl_texture_image *Image[MAX_FACES][MAX_TEXTURE_LEVELS];
12925e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
1293874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   /** GL_ARB_texture_buffer_object */
1294874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   struct gl_buffer_object *BufferObject;
1295874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   GLenum BufferObjectFormat;
1296664355f05b39303fa0995b72160c82f5bf50e95eEric Anholt   /** Equivalent Mesa format for BufferObjectFormat. */
1297664355f05b39303fa0995b72160c82f5bf50e95eEric Anholt   gl_format _BufferObjectFormat;
1298874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
12990c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu   /** GL_OES_EGL_image_external */
13000c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu   GLint RequiredTextureImageUnits;
13015e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
13025e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
130353f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul
1304bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul/** Up to four combiner sources are possible with GL_NV_texture_env_combine4 */
1305bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul#define MAX_COMBINER_TERMS 4
1306bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul
1307bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul
130807d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick/**
130907d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick * Texture combine environment state.
131007d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick */
13114dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_tex_env_combine_state
13124dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
131307d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick   GLenum ModeRGB;       /**< GL_REPLACE, GL_DECAL, GL_ADD, etc. */
131407d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick   GLenum ModeA;         /**< GL_REPLACE, GL_DECAL, GL_ADD, etc. */
1315bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul   /** Source terms: GL_PRIMARY_COLOR, GL_TEXTURE, etc */
1316bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul   GLenum SourceRGB[MAX_COMBINER_TERMS];
1317bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul   GLenum SourceA[MAX_COMBINER_TERMS];
1318bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul   /** Source operands: GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, etc */
1319bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul   GLenum OperandRGB[MAX_COMBINER_TERMS];
1320bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul   GLenum OperandA[MAX_COMBINER_TERMS];
132107d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick   GLuint ScaleShiftRGB; /**< 0, 1 or 2 */
132207d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick   GLuint ScaleShiftA;   /**< 0, 1 or 2 */
1323f5d3027c0a03e26fe90efc067766c996dea05948Brian Paul   GLuint _NumArgsRGB;   /**< Number of inputs used for the RGB combiner */
1324f5d3027c0a03e26fe90efc067766c996dea05948Brian Paul   GLuint _NumArgsA;     /**< Number of inputs used for the A combiner */
132507d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick};
13265e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
132753f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul
13286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
132986ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul * TexGenEnabled flags.
133086ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul */
133186ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul/*@{*/
133286ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul#define S_BIT 1
133386ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul#define T_BIT 2
133486ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul#define R_BIT 4
133586ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul#define Q_BIT 8
133686ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul#define STR_BITS (S_BIT | T_BIT | R_BIT)
133786ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul/*@}*/
133886ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul
133986ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul
134086ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul/**
134186ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul * Bit flag versions of the corresponding GL_ constants.
134286ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul */
134386ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul/*@{*/
134486ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul#define TEXGEN_SPHERE_MAP        0x1
134586ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul#define TEXGEN_OBJ_LINEAR        0x2
134686ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul#define TEXGEN_EYE_LINEAR        0x4
134786ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul#define TEXGEN_REFLECTION_MAP_NV 0x8
134886ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul#define TEXGEN_NORMAL_MAP_NV     0x10
134986ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul
135086ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul#define TEXGEN_NEED_NORMALS      (TEXGEN_SPHERE_MAP        | \
135186ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul				  TEXGEN_REFLECTION_MAP_NV | \
135286ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul				  TEXGEN_NORMAL_MAP_NV)
135386ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul#define TEXGEN_NEED_EYE_COORD    (TEXGEN_SPHERE_MAP        | \
135486ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul				  TEXGEN_REFLECTION_MAP_NV | \
135586ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul				  TEXGEN_NORMAL_MAP_NV     | \
135686ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul				  TEXGEN_EYE_LINEAR)
135786ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul/*@}*/
135886ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul
135986ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul
136086ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul
136186ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul/** Tex-gen enabled for texture unit? */
136286ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul#define ENABLE_TEXGEN(unit) (1 << (unit))
136386ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul
136486ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul/** Non-identity texture matrix for texture unit? */
136586ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul#define ENABLE_TEXMAT(unit) (1 << (unit))
136686ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul
136786ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul
136886ccd9aaacc5358984faa11c3b94281f0b1a85f9Brian Paul/**
13699705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul * Texture coord generation state.
13709705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul */
13719705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paulstruct gl_texgen
13729705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul{
13739705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul   GLenum Mode;         /**< GL_EYE_LINEAR, GL_SPHERE_MAP, etc */
13749705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul   GLbitfield _ModeBit; /**< TEXGEN_x bit corresponding to Mode */
13759705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul   GLfloat ObjectPlane[4];
13769705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul   GLfloat EyePlane[4];
13779705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul};
13789705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul
13799705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul
13809705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul/**
13814dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Texture unit state.  Contains enable flags, texture environment/function/
1382f3f080e526017f9643fd25543b4e0039f1905f4bBrian Paul * combiners, texgen state, and pointers to current texture objects.
13836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
13844dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_texture_unit
13854dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
1386e00ac11d4dd05c56584622dc2707bbdcfe4b2707Brian Paul   GLbitfield Enabled;          /**< bitmask of TEXTURE_*_BIT flags */
1387e00ac11d4dd05c56584622dc2707bbdcfe4b2707Brian Paul   GLbitfield _ReallyEnabled;   /**< 0 or exactly one of TEXTURE_*_BIT flags */
13885e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
13896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum EnvMode;              /**< GL_MODULATE, GL_DECAL, GL_BLEND, etc. */
1390e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   GLclampf EnvColor[4];
1391e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   GLfloat EnvColorUnclamped[4];
13929705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul
13939705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul   struct gl_texgen GenS;
13949705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul   struct gl_texgen GenT;
13959705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul   struct gl_texgen GenR;
13969705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul   struct gl_texgen GenQ;
1397e00ac11d4dd05c56584622dc2707bbdcfe4b2707Brian Paul   GLbitfield TexGenEnabled;	/**< Bitwise-OR of [STRQ]_BIT values */
13989705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul   GLbitfield _GenFlags;	/**< Bitwise-OR of Gen[STRQ]._ModeBit */
13999705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul
14006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat LodBias;		/**< for biasing mipmap levels */
1401114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   GLenum BumpTarget;
1402114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   GLfloat RotMatrix[4]; /* 2x2 matrix */
14036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
1404ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   /** Current sampler object (GL_ARB_sampler_objects) */
1405ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   struct gl_sampler_object *Sampler;
1406ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul
14076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
14086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    * \name GL_EXT_texture_env_combine
14096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    */
141007d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick   struct gl_tex_env_combine_state Combine;
141107d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick
141207d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick   /**
141307d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick    * Derived state based on \c EnvMode and the \c BaseFormat of the
141407d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick    * currently enabled texture.
141507d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick    */
141607d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick   struct gl_tex_env_combine_state _EnvMode;
141707d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick
141807d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick   /**
141907d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick    * Currently enabled combiner state.  This will point to either
142007d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick    * \c Combine or \c _EnvMode.
142107d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick    */
142207d6a983595b7ee52c8448fc579d952ce36472b8Ian Romanick   struct gl_tex_env_combine_state *_CurrentCombine;
14235e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
14249818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul   /** Current texture object pointers */
14259818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul   struct gl_texture_object *CurrentTex[NUM_TEXTURE_TARGETS];
14269818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul
14279818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul   /** Points to highest priority, complete and enabled texture object */
14289818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul   struct gl_texture_object *_Current;
14295e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
14305e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
14315ddc53f899598396003ec6c723f8132c76aafe79Keith Whitwell
14326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
14334dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Texture attribute group (GL_TEXTURE_BIT).
14346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
14354dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_texture_attrib
14364dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
1437bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLuint CurrentUnit;   /**< GL_ACTIVE_TEXTURE */
1438b2a30497cc8b107ea74c3d8fbb646e59a4d55a05Brian Paul   struct gl_texture_unit Unit[MAX_COMBINED_TEXTURE_IMAGE_UNITS];
1439ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes
1440fe469007037d9d5cdbe1677d8ff7368b276e9e7cBrian   struct gl_texture_object *ProxyTex[NUM_TEXTURE_TARGETS];
14415e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
1442874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   /** GL_ARB_texture_buffer_object */
1443874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   struct gl_buffer_object *BufferObject;
1444874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul
14459d5bb3c6f820a5a99e1f55b2fd14d250761fcddcIan Romanick   /** GL_ARB_seamless_cubemap */
14469d5bb3c6f820a5a99e1f55b2fd14d250761fcddcIan Romanick   GLboolean CubeMapSeamless;
14479d5bb3c6f820a5a99e1f55b2fd14d250761fcddcIan Romanick
1448e30f7657639d53dc87fa35aa2ec02ed13c70f796Brian Paul   /** Texture units/samplers used by vertex or fragment texturing */
1449e30f7657639d53dc87fa35aa2ec02ed13c70f796Brian Paul   GLbitfield _EnabledUnits;
1450e30f7657639d53dc87fa35aa2ec02ed13c70f796Brian Paul
1451e30f7657639d53dc87fa35aa2ec02ed13c70f796Brian Paul   /** Texture coord units/sets used for fragment texturing */
1452e30f7657639d53dc87fa35aa2ec02ed13c70f796Brian Paul   GLbitfield _EnabledCoordUnits;
1453e30f7657639d53dc87fa35aa2ec02ed13c70f796Brian Paul
1454e30f7657639d53dc87fa35aa2ec02ed13c70f796Brian Paul   /** Texture coord units that have texgen enabled */
1455e30f7657639d53dc87fa35aa2ec02ed13c70f796Brian Paul   GLbitfield _TexGenEnabled;
1456e30f7657639d53dc87fa35aa2ec02ed13c70f796Brian Paul
1457e30f7657639d53dc87fa35aa2ec02ed13c70f796Brian Paul   /** Texture coord units that have non-identity matrices */
1458e30f7657639d53dc87fa35aa2ec02ed13c70f796Brian Paul   GLbitfield _TexMatEnabled;
1459e30f7657639d53dc87fa35aa2ec02ed13c70f796Brian Paul
1460e30f7657639d53dc87fa35aa2ec02ed13c70f796Brian Paul   /** Bitwise-OR of all Texture.Unit[i]._GenFlags */
1461e30f7657639d53dc87fa35aa2ec02ed13c70f796Brian Paul   GLbitfield _GenFlags;
14625e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
14635e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
14645e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
14656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1466d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry * Data structure representing a single clip plane (e.g. one of the elements
1467d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry * of the ctx->Transform.EyeUserPlane or ctx->Transform._ClipUserPlane array).
1468d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry */
1469d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berrytypedef GLfloat gl_clip_plane[4];
1470d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry
1471d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry
1472d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry/**
14734dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Transformation attribute group (GL_TRANSFORM_BIT).
14746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
14754dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_transform_attrib
14764dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
14776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum MatrixMode;				/**< Matrix mode */
1478d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry   gl_clip_plane EyeUserPlane[MAX_CLIP_PLANES];	/**< User clip planes */
1479d912669034eb7bf5c162358a7a574ec7a4c963c7Paul Berry   gl_clip_plane _ClipUserPlane[MAX_CLIP_PLANES]; /**< derived */
1480e00ac11d4dd05c56584622dc2707bbdcfe4b2707Brian Paul   GLbitfield ClipPlanesEnabled;                /**< on/off bitmask */
14816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean Normalize;				/**< Normalize all normals? */
14826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean RescaleNormals;			/**< GL_EXT_rescale_normal */
14836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean RasterPositionUnclipped;           /**< GL_IBM_rasterpos_clip */
1484b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt   GLboolean DepthClamp;			/**< GL_ARB_depth_clamp */
1485352d4dbfb24c65f327759c00c7db7d30a9482e35Keith Whitwell
1486352d4dbfb24c65f327759c00c7db7d30a9482e35Keith Whitwell   GLfloat CullEyePos[4];
1487352d4dbfb24c65f327759c00c7db7d30a9482e35Keith Whitwell   GLfloat CullObjPos[4];
14885e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
14895e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
14905e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
14916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
14924dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Viewport attribute group (GL_VIEWPORT_BIT).
14936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
14944dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_viewport_attrib
14954dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
14966dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLint X, Y;			/**< position */
14976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLsizei Width, Height;	/**< size */
14986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat Near, Far;		/**< Depth buffer range */
14996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLmatrix _WindowMap;		/**< Mapping transformation as a matrix. */
15005e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
15015e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
15025e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
15036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
15047a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * GL_ARB_vertex/pixel_buffer_object buffer object
1505148a2847a105ce9d9189ad3081091de60f803a33Brian Paul */
15064dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_buffer_object
15074dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
1508eeec2c3d951fed0d22e5dbf436d4a2d887e24221Michal Krol   _glthread_Mutex Mutex;
1509148a2847a105ce9d9189ad3081091de60f803a33Brian Paul   GLint RefCount;
1510148a2847a105ce9d9189ad3081091de60f803a33Brian Paul   GLuint Name;
1511462a9525c78d5757afd2a8d4dc60afc68a69579bBrian Paul   GLenum Usage;        /**< GL_STREAM_DRAW_ARB, GL_STREAM_READ_ARB, etc. */
1512462a9525c78d5757afd2a8d4dc60afc68a69579bBrian Paul   GLsizeiptrARB Size;  /**< Size of buffer storage in bytes */
1513462a9525c78d5757afd2a8d4dc60afc68a69579bBrian Paul   GLubyte *Data;       /**< Location of storage either in RAM or VRAM. */
1514462a9525c78d5757afd2a8d4dc60afc68a69579bBrian Paul   /** Fields describing a mapped buffer */
1515462a9525c78d5757afd2a8d4dc60afc68a69579bBrian Paul   /*@{*/
1516e75b283b45add351dbe5a09289fe85546df8a79aBrian Paul   GLbitfield AccessFlags; /**< Mask of GL_MAP_x_BIT flags */
1517462a9525c78d5757afd2a8d4dc60afc68a69579bBrian Paul   GLvoid *Pointer;     /**< User-space address of mapping */
1518462a9525c78d5757afd2a8d4dc60afc68a69579bBrian Paul   GLintptr Offset;     /**< Mapped offset */
1519462a9525c78d5757afd2a8d4dc60afc68a69579bBrian Paul   GLsizeiptr Length;   /**< Mapped length */
1520462a9525c78d5757afd2a8d4dc60afc68a69579bBrian Paul   /*@}*/
15219ed88983b03114d66d527354248e26f77d8868b9Mathias Fröhlich   GLboolean DeletePending;   /**< true if buffer object is removed from the hash */
1522462a9525c78d5757afd2a8d4dc60afc68a69579bBrian Paul   GLboolean Written;   /**< Ever written to? (for debugging) */
152399864d595f7d4c13e9548f83d5972db9af64e67bChris Wilson   GLboolean Purgeable; /**< Is the buffer purgeable under memory pressure? */
1524148a2847a105ce9d9189ad3081091de60f803a33Brian Paul};
1525148a2847a105ce9d9189ad3081091de60f803a33Brian Paul
1526148a2847a105ce9d9189ad3081091de60f803a33Brian Paul
1527148a2847a105ce9d9189ad3081091de60f803a33Brian Paul/**
15285e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * Client pixel packing/unpacking attributes
15295e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
15304dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_pixelstore_attrib
15314dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
15325e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLint Alignment;
15335e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLint RowLength;
15345e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLint SkipPixels;
15355e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLint SkipRows;
1536bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLint ImageHeight;
1537bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLint SkipImages;
15385e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean SwapBytes;
15395e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean LsbFirst;
15406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean Invert;        /**< GL_MESA_pack_invert */
15417a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   struct gl_buffer_object *BufferObj; /**< GL_ARB_pixel_buffer_object */
15425e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
15435e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
15445e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
15456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
15465e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * Client vertex array attributes
15475e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
15484dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_client_array
15494dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
15501675058a346a57d89a18147799579c0ad574bfd2Brian Paul   GLint Size;                  /**< components per element (1,2,3,4) */
15511675058a346a57d89a18147799579c0ad574bfd2Brian Paul   GLenum Type;                 /**< datatype: GL_FLOAT, GL_INT, etc */
1552f7c1a2dacd1643a19fbf975c21ac3e64b708c8d7Brian Paul   GLenum Format;               /**< default: GL_RGBA, but may be GL_BGRA */
15536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLsizei Stride;		/**< user-specified stride */
15546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLsizei StrideB;		/**< actual stride in bytes */
15551675058a346a57d89a18147799579c0ad574bfd2Brian Paul   const GLubyte *Ptr;          /**< Points to array data */
155699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell   GLboolean Enabled;		/**< Enabled flag is a boolean */
15576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean Normalized;        /**< GL_ARB_vertex_program */
1558d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   GLboolean Integer;           /**< Integer-valued? */
15591d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   GLuint InstanceDivisor;      /**< GL_ARB_instanced_arrays */
15600077c879b57f663c038becdde37b2f6671f59150Brian Paul   GLuint _ElementSize;         /**< size of each element in bytes */
1561148a2847a105ce9d9189ad3081091de60f803a33Brian Paul
1562b102c1d8f9ea359879e6c1c4fd8c80c00d21cad5Brian Paul   struct gl_buffer_object *BufferObj;/**< GL_ARB_vertex_buffer_object */
156315f21bf357980284d4aea6270f68bb9b83d26fbdBrian Paul   GLuint _MaxElement;          /**< max element index into array buffer + 1 */
15645e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
15655e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
15665e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
15679960ddcd66b9c2c6f4b12fc7db7326ba83d65956Brian Paul/**
15689960ddcd66b9c2c6f4b12fc7db7326ba83d65956Brian Paul * Collection of vertex arrays.  Defined by the GL_APPLE_vertex_array_object
15699960ddcd66b9c2c6f4b12fc7db7326ba83d65956Brian Paul * extension, but a nice encapsulation in any case.
15709960ddcd66b9c2c6f4b12fc7db7326ba83d65956Brian Paul */
15719960ddcd66b9c2c6f4b12fc7db7326ba83d65956Brian Paulstruct gl_array_object
15729960ddcd66b9c2c6f4b12fc7db7326ba83d65956Brian Paul{
1573ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick   /** Name of the array object as received from glGenVertexArrayAPPLE. */
1574ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick   GLuint Name;
1575ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick
15761030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul   GLint RefCount;
15771030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul   _glthread_Mutex Mutex;
157809639901530da7df7347428512c2bee86af1ef8eIan Romanick
157909639901530da7df7347428512c2bee86af1ef8eIan Romanick   /**
158009639901530da7df7347428512c2bee86af1ef8eIan Romanick    * Does the VAO use ARB semantics or Apple semantics?
158109639901530da7df7347428512c2bee86af1ef8eIan Romanick    *
158209639901530da7df7347428512c2bee86af1ef8eIan Romanick    * There are several ways in which ARB_vertex_array_object and
158309639901530da7df7347428512c2bee86af1ef8eIan Romanick    * APPLE_vertex_array_object VAOs have differing semantics.  At the very
158409639901530da7df7347428512c2bee86af1ef8eIan Romanick    * least,
158509639901530da7df7347428512c2bee86af1ef8eIan Romanick    *
158609639901530da7df7347428512c2bee86af1ef8eIan Romanick    *     - ARB VAOs require that all array data be sourced from vertex buffer
158709639901530da7df7347428512c2bee86af1ef8eIan Romanick    *       objects, but Apple VAOs do not.
158809639901530da7df7347428512c2bee86af1ef8eIan Romanick    *
158909639901530da7df7347428512c2bee86af1ef8eIan Romanick    *     - ARB VAOs require that names come from GenVertexArrays.
159009639901530da7df7347428512c2bee86af1ef8eIan Romanick    *
159109639901530da7df7347428512c2bee86af1ef8eIan Romanick    * This flag notes which behavior governs this VAO.
159209639901530da7df7347428512c2bee86af1ef8eIan Romanick    */
159309639901530da7df7347428512c2bee86af1ef8eIan Romanick   GLboolean ARBsemantics;
15949bb6684799f00fabc313ee50be671454e498d8a9Brian Paul
1595e06b1c65bc576a9b239841cbe3a8a8c2d6a8d09fIan Romanick   /**
1596e06b1c65bc576a9b239841cbe3a8a8c2d6a8d09fIan Romanick    * Has this array object been bound?
1597e06b1c65bc576a9b239841cbe3a8a8c2d6a8d09fIan Romanick    */
1598e06b1c65bc576a9b239841cbe3a8a8c2d6a8d09fIan Romanick   GLboolean _Used;
1599e06b1c65bc576a9b239841cbe3a8a8c2d6a8d09fIan Romanick
1600762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   /** Vertex attribute arrays */
1601762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   struct gl_client_array VertexAttrib[VERT_ATTRIB_MAX];
160286b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
1603104b81def4c09f3012e44778d104f00ff87dd4f0Mathias Fröhlich   /** Mask of VERT_BIT_* values indicating which arrays are enabled */
1604f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich   GLbitfield64 _Enabled;
1605a185bcbdec856cc98c26098e4e447a683eed14d1Brian Paul
1606b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul   /** Mask of VERT_BIT_* values indicating changed/dirty arrays */
1607b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul   GLbitfield64 NewArrays;
1608b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul
1609a185bcbdec856cc98c26098e4e447a683eed14d1Brian Paul   /**
1610a185bcbdec856cc98c26098e4e447a683eed14d1Brian Paul    * Min of all enabled arrays' _MaxElement.  When arrays reside inside VBOs
1611a185bcbdec856cc98c26098e4e447a683eed14d1Brian Paul    * we can determine the max legal (in bounds) glDrawElements array index.
1612a185bcbdec856cc98c26098e4e447a683eed14d1Brian Paul    */
1613a185bcbdec856cc98c26098e4e447a683eed14d1Brian Paul   GLuint _MaxElement;
1614a0a5bd4bb30a73c10b02c3c3b914940a03f9b790Yuanhan Liu
1615a0a5bd4bb30a73c10b02c3c3b914940a03f9b790Yuanhan Liu   struct gl_buffer_object *ElementArrayBufferObj;
1616ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick};
1617ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick
1618ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick
1619ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick/**
1620ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick * Vertex array state
1621ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick */
1622ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanickstruct gl_array_attrib
1623ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick{
16249bb6684799f00fabc313ee50be671454e498d8a9Brian Paul   /** Currently bound array object. See _mesa_BindVertexArrayAPPLE() */
1625ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick   struct gl_array_object *ArrayObj;
16269bb6684799f00fabc313ee50be671454e498d8a9Brian Paul
16279bb6684799f00fabc313ee50be671454e498d8a9Brian Paul   /** The default vertex array object */
1628ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick   struct gl_array_object *DefaultArrayObj;
1629ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick
163012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   /** Array objects (GL_ARB/APPLE_vertex_array_object) */
163112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   struct _mesa_HashTable *Objects;
163212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
16336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLint ActiveTexture;		/**< Client Active Texture */
1634148a2847a105ce9d9189ad3081091de60f803a33Brian Paul   GLuint LockFirst;            /**< GL_EXT_compiled_vertex_array */
1635148a2847a105ce9d9189ad3081091de60f803a33Brian Paul   GLuint LockCount;            /**< GL_EXT_compiled_vertex_array */
1636cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
1637a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   /** GL 3.1 (slightly different from GL_NV_primitive_restart) */
1638a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   GLboolean PrimitiveRestart;
1639a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   GLuint RestartIndex;
1640a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1641f90b5936d07c4c8f280318ab5cf5894ecb67aef6Chia-I Wu   /* GL_ARB_vertex_buffer_object */
1642148a2847a105ce9d9189ad3081091de60f803a33Brian Paul   struct gl_buffer_object *ArrayBufferObj;
164350f7e75f9e945cfbb2ae868cc961a2205a0b6e73Marek Olšák
164450f7e75f9e945cfbb2ae868cc961a2205a0b6e73Marek Olšák   /**
164550f7e75f9e945cfbb2ae868cc961a2205a0b6e73Marek Olšák    * Vertex arrays as consumed by a driver.
164650f7e75f9e945cfbb2ae868cc961a2205a0b6e73Marek Olšák    * The array pointer is set up only by the VBO module. */
164750f7e75f9e945cfbb2ae868cc961a2205a0b6e73Marek Olšák   const struct gl_client_array **_DrawArrays; /**< 0..VERT_ATTRIB_MAX-1 */
16485e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
16495e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
16505e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
165153f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul/**
165253f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul * Feedback buffer state
165353f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul */
16544dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_feedback
16554dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
16565e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLenum Type;
1657bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLbitfield _Mask;    /**< FB_* bits */
16585e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat *Buffer;
16595e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLuint BufferSize;
16605e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLuint Count;
16615e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
16625e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
16635e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
16646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
166553f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul * Selection buffer state
16666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
16674dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_selection
16684dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
16696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint *Buffer;	/**< selection buffer */
16706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint BufferSize;	/**< size of the selection buffer */
16716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint BufferCount;	/**< number of values in the selection buffer */
16726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint Hits;		/**< number of records in the selection buffer */
16736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint NameStackDepth; /**< name stack depth */
16746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint NameStack[MAX_NAME_STACK_DEPTH]; /**< name stack */
16756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean HitFlag;	/**< hit flag */
16766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat HitMinZ;	/**< minimum hit depth */
16776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat HitMaxZ;	/**< maximum hit depth */
16785e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
16795e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
16805e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
16816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
16825e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 1-D Evaluator control points
16835e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
1684f2dd273322cc9ec0cfe80a609f9a1e5db5931e2eBrian Paulstruct gl_1d_map
1685f2dd273322cc9ec0cfe80a609f9a1e5db5931e2eBrian Paul{
16866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint Order;	/**< Number of control points */
16876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat u1, u2, du;	/**< u1, u2, 1.0/(u2-u1) */
16886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat *Points;	/**< Points to contiguous control points */
16895e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
1690ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes
16915e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
16926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
16935e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 2-D Evaluator control points
16945e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
1695f2dd273322cc9ec0cfe80a609f9a1e5db5931e2eBrian Paulstruct gl_2d_map
1696f2dd273322cc9ec0cfe80a609f9a1e5db5931e2eBrian Paul{
16976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint Uorder;		/**< Number of control points in U dimension */
16986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint Vorder;		/**< Number of control points in V dimension */
16995e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat u1, u2, du;
17005e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat v1, v2, dv;
17016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLfloat *Points;		/**< Points to contiguous control points */
17025e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
17035e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
17045e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
17056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
170653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul * All evaluator control point state
17075e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
1708f2dd273322cc9ec0cfe80a609f9a1e5db5931e2eBrian Paulstruct gl_evaluators
1709f2dd273322cc9ec0cfe80a609f9a1e5db5931e2eBrian Paul{
17106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
17116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    * \name 1-D maps
17126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    */
17136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
17145e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_1d_map Map1Vertex3;
17155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_1d_map Map1Vertex4;
17165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_1d_map Map1Index;
17175e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_1d_map Map1Color4;
17185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_1d_map Map1Normal;
17195e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_1d_map Map1Texture1;
17205e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_1d_map Map1Texture2;
17215e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_1d_map Map1Texture3;
17225e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_1d_map Map1Texture4;
17236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_1d_map Map1Attrib[16];  /**< GL_NV_vertex_program */
17246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
17255e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
17266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
17276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    * \name 2-D maps
17286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    */
17296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
17305e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_2d_map Map2Vertex3;
17315e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_2d_map Map2Vertex4;
17325e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_2d_map Map2Index;
17335e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_2d_map Map2Color4;
17345e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_2d_map Map2Normal;
17355e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_2d_map Map2Texture1;
17365e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_2d_map Map2Texture2;
17375e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_2d_map Map2Texture3;
17385e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_2d_map Map2Texture4;
17396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_2d_map Map2Attrib[16];  /**< GL_NV_vertex_program */
17406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
17415e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
17425e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
17435e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
174484870e215667c999202be31057df6e31a0389bb7Brian Paulstruct gl_transform_feedback_varying_info
174584870e215667c999202be31057df6e31a0389bb7Brian Paul{
174684870e215667c999202be31057df6e31a0389bb7Brian Paul   char *Name;
174784870e215667c999202be31057df6e31a0389bb7Brian Paul   GLenum Type;
174884870e215667c999202be31057df6e31a0389bb7Brian Paul   GLint Size;
174984870e215667c999202be31057df6e31a0389bb7Brian Paul};
175084870e215667c999202be31057df6e31a0389bb7Brian Paul
175184870e215667c999202be31057df6e31a0389bb7Brian Paul
175284870e215667c999202be31057df6e31a0389bb7Brian Paul/**
175384870e215667c999202be31057df6e31a0389bb7Brian Paul * Per-output info vertex shaders for transform feedback.
175484870e215667c999202be31057df6e31a0389bb7Brian Paul */
175584870e215667c999202be31057df6e31a0389bb7Brian Paulstruct gl_transform_feedback_output
175684870e215667c999202be31057df6e31a0389bb7Brian Paul{
175784870e215667c999202be31057df6e31a0389bb7Brian Paul   unsigned OutputRegister;
175884870e215667c999202be31057df6e31a0389bb7Brian Paul   unsigned OutputBuffer;
175984870e215667c999202be31057df6e31a0389bb7Brian Paul   unsigned NumComponents;
176084870e215667c999202be31057df6e31a0389bb7Brian Paul
176184870e215667c999202be31057df6e31a0389bb7Brian Paul   /** offset (in DWORDs) of this output within the interleaved structure */
176284870e215667c999202be31057df6e31a0389bb7Brian Paul   unsigned DstOffset;
176384870e215667c999202be31057df6e31a0389bb7Brian Paul
176484870e215667c999202be31057df6e31a0389bb7Brian Paul   /**
176584870e215667c999202be31057df6e31a0389bb7Brian Paul    * Offset into the output register of the data to output.  For example,
176684870e215667c999202be31057df6e31a0389bb7Brian Paul    * if NumComponents is 2 and ComponentOffset is 1, then the data to
176784870e215667c999202be31057df6e31a0389bb7Brian Paul    * offset is in the y and z components of the output register.
176884870e215667c999202be31057df6e31a0389bb7Brian Paul    */
176984870e215667c999202be31057df6e31a0389bb7Brian Paul   unsigned ComponentOffset;
177084870e215667c999202be31057df6e31a0389bb7Brian Paul};
177184870e215667c999202be31057df6e31a0389bb7Brian Paul
177284870e215667c999202be31057df6e31a0389bb7Brian Paul
177384870e215667c999202be31057df6e31a0389bb7Brian Paul/** Post-link transform feedback info. */
177484870e215667c999202be31057df6e31a0389bb7Brian Paulstruct gl_transform_feedback_info
177584870e215667c999202be31057df6e31a0389bb7Brian Paul{
177684870e215667c999202be31057df6e31a0389bb7Brian Paul   unsigned NumOutputs;
177784870e215667c999202be31057df6e31a0389bb7Brian Paul
177884870e215667c999202be31057df6e31a0389bb7Brian Paul   /**
177984870e215667c999202be31057df6e31a0389bb7Brian Paul    * Number of transform feedback buffers in use by this program.
178084870e215667c999202be31057df6e31a0389bb7Brian Paul    */
178184870e215667c999202be31057df6e31a0389bb7Brian Paul   unsigned NumBuffers;
178284870e215667c999202be31057df6e31a0389bb7Brian Paul
178384870e215667c999202be31057df6e31a0389bb7Brian Paul   struct gl_transform_feedback_output *Outputs;
178484870e215667c999202be31057df6e31a0389bb7Brian Paul
178584870e215667c999202be31057df6e31a0389bb7Brian Paul   /** Transform feedback varyings used for the linking of this shader program.
178684870e215667c999202be31057df6e31a0389bb7Brian Paul    *
178784870e215667c999202be31057df6e31a0389bb7Brian Paul    * Use for glGetTransformFeedbackVarying().
178884870e215667c999202be31057df6e31a0389bb7Brian Paul    */
178984870e215667c999202be31057df6e31a0389bb7Brian Paul   struct gl_transform_feedback_varying_info *Varyings;
179084870e215667c999202be31057df6e31a0389bb7Brian Paul   GLint NumVarying;
179184870e215667c999202be31057df6e31a0389bb7Brian Paul
179284870e215667c999202be31057df6e31a0389bb7Brian Paul   /**
179384870e215667c999202be31057df6e31a0389bb7Brian Paul    * Total number of components stored in each buffer.  This may be used by
179484870e215667c999202be31057df6e31a0389bb7Brian Paul    * hardware back-ends to determine the correct stride when interleaving
179584870e215667c999202be31057df6e31a0389bb7Brian Paul    * multiple transform feedback outputs in the same buffer.
179684870e215667c999202be31057df6e31a0389bb7Brian Paul    */
179715ac66e331abdab12e882d80a6b4f647bc905298Marek Olšák   unsigned BufferStride[MAX_FEEDBACK_BUFFERS];
179884870e215667c999202be31057df6e31a0389bb7Brian Paul};
179984870e215667c999202be31057df6e31a0389bb7Brian Paul
180084870e215667c999202be31057df6e31a0389bb7Brian Paul
180184870e215667c999202be31057df6e31a0389bb7Brian Paul/**
180284870e215667c999202be31057df6e31a0389bb7Brian Paul * Transform feedback object state
180384870e215667c999202be31057df6e31a0389bb7Brian Paul */
180484870e215667c999202be31057df6e31a0389bb7Brian Paulstruct gl_transform_feedback_object
180584870e215667c999202be31057df6e31a0389bb7Brian Paul{
180684870e215667c999202be31057df6e31a0389bb7Brian Paul   GLuint Name;  /**< AKA the object ID */
180784870e215667c999202be31057df6e31a0389bb7Brian Paul   GLint RefCount;
180884870e215667c999202be31057df6e31a0389bb7Brian Paul   GLboolean Active;  /**< Is transform feedback enabled? */
180984870e215667c999202be31057df6e31a0389bb7Brian Paul   GLboolean Paused;  /**< Is transform feedback paused? */
181084870e215667c999202be31057df6e31a0389bb7Brian Paul   GLboolean EndedAnytime; /**< Has EndTransformFeedback been called
181184870e215667c999202be31057df6e31a0389bb7Brian Paul                                at least once? */
181284870e215667c999202be31057df6e31a0389bb7Brian Paul
181384870e215667c999202be31057df6e31a0389bb7Brian Paul   /** The feedback buffers */
181415ac66e331abdab12e882d80a6b4f647bc905298Marek Olšák   GLuint BufferNames[MAX_FEEDBACK_BUFFERS];
181515ac66e331abdab12e882d80a6b4f647bc905298Marek Olšák   struct gl_buffer_object *Buffers[MAX_FEEDBACK_BUFFERS];
181684870e215667c999202be31057df6e31a0389bb7Brian Paul
181784870e215667c999202be31057df6e31a0389bb7Brian Paul   /** Start of feedback data in dest buffer */
181815ac66e331abdab12e882d80a6b4f647bc905298Marek Olšák   GLintptr Offset[MAX_FEEDBACK_BUFFERS];
181984870e215667c999202be31057df6e31a0389bb7Brian Paul   /** Max data to put into dest buffer (in bytes) */
182015ac66e331abdab12e882d80a6b4f647bc905298Marek Olšák   GLsizeiptr Size[MAX_FEEDBACK_BUFFERS];
182184870e215667c999202be31057df6e31a0389bb7Brian Paul};
182284870e215667c999202be31057df6e31a0389bb7Brian Paul
182384870e215667c999202be31057df6e31a0389bb7Brian Paul
182484870e215667c999202be31057df6e31a0389bb7Brian Paul/**
182584870e215667c999202be31057df6e31a0389bb7Brian Paul * Context state for transform feedback.
182684870e215667c999202be31057df6e31a0389bb7Brian Paul */
182784870e215667c999202be31057df6e31a0389bb7Brian Paulstruct gl_transform_feedback_state
182884870e215667c999202be31057df6e31a0389bb7Brian Paul{
182984870e215667c999202be31057df6e31a0389bb7Brian Paul   GLenum Mode;       /**< GL_POINTS, GL_LINES or GL_TRIANGLES */
183084870e215667c999202be31057df6e31a0389bb7Brian Paul
183184870e215667c999202be31057df6e31a0389bb7Brian Paul   /** The general binding point (GL_TRANSFORM_FEEDBACK_BUFFER) */
183284870e215667c999202be31057df6e31a0389bb7Brian Paul   struct gl_buffer_object *CurrentBuffer;
183384870e215667c999202be31057df6e31a0389bb7Brian Paul
183484870e215667c999202be31057df6e31a0389bb7Brian Paul   /** The table of all transform feedback objects */
183584870e215667c999202be31057df6e31a0389bb7Brian Paul   struct _mesa_HashTable *Objects;
183684870e215667c999202be31057df6e31a0389bb7Brian Paul
183784870e215667c999202be31057df6e31a0389bb7Brian Paul   /** The current xform-fb object (GL_TRANSFORM_FEEDBACK_BINDING) */
183884870e215667c999202be31057df6e31a0389bb7Brian Paul   struct gl_transform_feedback_object *CurrentObject;
183984870e215667c999202be31057df6e31a0389bb7Brian Paul
184084870e215667c999202be31057df6e31a0389bb7Brian Paul   /** The default xform-fb object (Name==0) */
184184870e215667c999202be31057df6e31a0389bb7Brian Paul   struct gl_transform_feedback_object *DefaultObject;
184284870e215667c999202be31057df6e31a0389bb7Brian Paul};
184384870e215667c999202be31057df6e31a0389bb7Brian Paul
184484870e215667c999202be31057df6e31a0389bb7Brian Paul
18456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1846613e1ad5d517d9964bd9cf94daa931dda33113feBrian Paul * Names of the various vertex/fragment program register files, etc.
1847a90046f1097ad95de2aa95ca65741dff5cddced9Brian *
1848613e1ad5d517d9964bd9cf94daa931dda33113feBrian Paul * NOTE: first four tokens must fit into 2 bits (see t_vb_arbprogram.c)
1849613e1ad5d517d9964bd9cf94daa931dda33113feBrian Paul * All values should fit in a 4-bit field.
1850a90046f1097ad95de2aa95ca65741dff5cddced9Brian *
1851a90046f1097ad95de2aa95ca65741dff5cddced9Brian * NOTE: PROGRAM_ENV_PARAM, PROGRAM_STATE_VAR, PROGRAM_NAMED_PARAM,
1852a90046f1097ad95de2aa95ca65741dff5cddced9Brian * PROGRAM_CONSTANT, and PROGRAM_UNIFORM can all be considered to
1853a90046f1097ad95de2aa95ca65741dff5cddced9Brian * be "uniform" variables since they can only be set outside glBegin/End.
1854a90046f1097ad95de2aa95ca65741dff5cddced9Brian * They're also all stored in the same Parameters array.
18556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
1856b4026d9be828bd0b6f60158456edf24994efb053Brian Paultypedef enum
185786b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul{
1858b4026d9be828bd0b6f60158456edf24994efb053Brian Paul   PROGRAM_TEMPORARY,   /**< machine->Temporary[] */
18599457d9ff4482f9b3796e2989e9ac3385d7d5404dBrian Paul   PROGRAM_INPUT,       /**< machine->Inputs[] */
18609457d9ff4482f9b3796e2989e9ac3385d7d5404dBrian Paul   PROGRAM_OUTPUT,      /**< machine->Outputs[] */
18619457d9ff4482f9b3796e2989e9ac3385d7d5404dBrian Paul   PROGRAM_VARYING,     /**< machine->Inputs[]/Outputs[] */
1862b4026d9be828bd0b6f60158456edf24994efb053Brian Paul   PROGRAM_LOCAL_PARAM, /**< gl_program->LocalParams[] */
1863b4026d9be828bd0b6f60158456edf24994efb053Brian Paul   PROGRAM_ENV_PARAM,   /**< gl_program->Parameters[] */
1864b4026d9be828bd0b6f60158456edf24994efb053Brian Paul   PROGRAM_STATE_VAR,   /**< gl_program->Parameters[] */
1865b4026d9be828bd0b6f60158456edf24994efb053Brian Paul   PROGRAM_NAMED_PARAM, /**< gl_program->Parameters[] */
1866b4026d9be828bd0b6f60158456edf24994efb053Brian Paul   PROGRAM_CONSTANT,    /**< gl_program->Parameters[] */
1867b4026d9be828bd0b6f60158456edf24994efb053Brian Paul   PROGRAM_UNIFORM,     /**< gl_program->Parameters[] */
1868b4026d9be828bd0b6f60158456edf24994efb053Brian Paul   PROGRAM_WRITE_ONLY,  /**< A dummy, write-only register */
1869b4026d9be828bd0b6f60158456edf24994efb053Brian Paul   PROGRAM_ADDRESS,     /**< machine->AddressReg */
1870b4026d9be828bd0b6f60158456edf24994efb053Brian Paul   PROGRAM_SAMPLER,     /**< for shader samplers, compile-time only */
1871c6d74bcbfcb54e0c03f4c3d7e82bc1267f36ffe4Brian Paul   PROGRAM_SYSTEM_VALUE,/**< InstanceId, PrimitiveID, etc. */
1872b4026d9be828bd0b6f60158456edf24994efb053Brian Paul   PROGRAM_UNDEFINED,   /**< Invalid/TBD value */
18737b52bed98729a05feab28f6d2b0677e4f84c44c3Eric Anholt   PROGRAM_FILE_MAX
1874b4026d9be828bd0b6f60158456edf24994efb053Brian Paul} gl_register_file;
187586b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
187686b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
1877c6d74bcbfcb54e0c03f4c3d7e82bc1267f36ffe4Brian Paul/**
1878c6d74bcbfcb54e0c03f4c3d7e82bc1267f36ffe4Brian Paul * If the register file is PROGRAM_SYSTEM_VALUE, the register index will be
1879c6d74bcbfcb54e0c03f4c3d7e82bc1267f36ffe4Brian Paul * one of these values.
1880c6d74bcbfcb54e0c03f4c3d7e82bc1267f36ffe4Brian Paul */
1881c6d74bcbfcb54e0c03f4c3d7e82bc1267f36ffe4Brian Paultypedef enum
1882c6d74bcbfcb54e0c03f4c3d7e82bc1267f36ffe4Brian Paul{
1883c6d74bcbfcb54e0c03f4c3d7e82bc1267f36ffe4Brian Paul   SYSTEM_VALUE_FRONT_FACE,  /**< Fragment shader only (not done yet) */
1884919c53e87a1f6f5322bc1f1486bb3e6b954b00d5Eric Anholt   SYSTEM_VALUE_VERTEX_ID,   /**< Vertex shader only */
1885c6d74bcbfcb54e0c03f4c3d7e82bc1267f36ffe4Brian Paul   SYSTEM_VALUE_INSTANCE_ID, /**< Vertex shader only */
1886c6d74bcbfcb54e0c03f4c3d7e82bc1267f36ffe4Brian Paul   SYSTEM_VALUE_MAX          /**< Number of values */
1887c6d74bcbfcb54e0c03f4c3d7e82bc1267f36ffe4Brian Paul} gl_system_value;
1888c6d74bcbfcb54e0c03f4c3d7e82bc1267f36ffe4Brian Paul
1889c6d74bcbfcb54e0c03f4c3d7e82bc1267f36ffe4Brian Paul
1890cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry/**
1891cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry * The possible interpolation qualifiers that can be applied to a fragment
1892cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry * shader input in GLSL.
1893c488150dea083a9677429b4185c6b20d7facd52bPaul Berry *
1894c488150dea083a9677429b4185c6b20d7facd52bPaul Berry * Note: INTERP_QUALIFIER_NONE must be 0 so that memsetting the
1895c488150dea083a9677429b4185c6b20d7facd52bPaul Berry * gl_fragment_program data structure to 0 causes the default behavior.
1896cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry */
1897cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berryenum glsl_interp_qualifier
1898cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry{
1899c488150dea083a9677429b4185c6b20d7facd52bPaul Berry   INTERP_QUALIFIER_NONE = 0,
1900cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry   INTERP_QUALIFIER_SMOOTH,
1901cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry   INTERP_QUALIFIER_FLAT,
1902cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry   INTERP_QUALIFIER_NOPERSPECTIVE
1903cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry};
1904cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry
1905cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry
190684870e215667c999202be31057df6e31a0389bb7Brian Paul/**
190784870e215667c999202be31057df6e31a0389bb7Brian Paul * \brief Layout qualifiers for gl_FragDepth.
190884870e215667c999202be31057df6e31a0389bb7Brian Paul *
190984870e215667c999202be31057df6e31a0389bb7Brian Paul * Extension AMD_conservative_depth allows gl_FragDepth to be redeclared with
191084870e215667c999202be31057df6e31a0389bb7Brian Paul * a layout qualifier.
191184870e215667c999202be31057df6e31a0389bb7Brian Paul *
191284870e215667c999202be31057df6e31a0389bb7Brian Paul * \see enum ir_depth_layout
191384870e215667c999202be31057df6e31a0389bb7Brian Paul */
191484870e215667c999202be31057df6e31a0389bb7Brian Paulenum gl_frag_depth_layout
191584870e215667c999202be31057df6e31a0389bb7Brian Paul{
191684870e215667c999202be31057df6e31a0389bb7Brian Paul   FRAG_DEPTH_LAYOUT_NONE, /**< No layout is specified. */
191784870e215667c999202be31057df6e31a0389bb7Brian Paul   FRAG_DEPTH_LAYOUT_ANY,
191884870e215667c999202be31057df6e31a0389bb7Brian Paul   FRAG_DEPTH_LAYOUT_GREATER,
191984870e215667c999202be31057df6e31a0389bb7Brian Paul   FRAG_DEPTH_LAYOUT_LESS,
192084870e215667c999202be31057df6e31a0389bb7Brian Paul   FRAG_DEPTH_LAYOUT_UNCHANGED
1921d540af554adfe302387014c0f46d6ac3aaa75121Christoph Bumiller};
1922d540af554adfe302387014c0f46d6ac3aaa75121Christoph Bumiller
192386b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
19246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
19256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Base class for any kind of program object
19266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
1927122629f27925a9dc50029bebc5079f87f416a7e1Brian Paulstruct gl_program
192886b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul{
1929610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLuint Id;
19303209c3ed0d82c158eed1020759aacf51ba1c1ad5Brian   GLubyte *String;  /**< Null-terminated program text */
1931610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLint RefCount;
19323209c3ed0d82c158eed1020759aacf51ba1c1ad5Brian   GLenum Target;    /**< GL_VERTEX/FRAGMENT_PROGRAM_ARB, GL_FRAGMENT_PROGRAM_NV */
19333209c3ed0d82c158eed1020759aacf51ba1c1ad5Brian   GLenum Format;    /**< String encoding format */
1934610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLboolean Resident;
1935de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul
1936de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   struct prog_instruction *Instructions;
1937de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul
1938dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich   GLbitfield64 InputsRead;     /**< Bitmask of which input regs are read */
19395606dfb572bf4b89b4882265924705bacc8c182bIan Romanick   GLbitfield64 OutputsWritten; /**< Bitmask of which output regs are written */
1940c6d74bcbfcb54e0c03f4c3d7e82bc1267f36ffe4Brian Paul   GLbitfield SystemValuesRead;   /**< Bitmask of SYSTEM_VALUE_x inputs used */
1941b730d0d3e9b202b17a0815cb820fc9905f35cb98Brian Paul   GLbitfield InputFlags[MAX_PROGRAM_INPUTS];   /**< PROG_PARAM_BIT_x flags */
1942b730d0d3e9b202b17a0815cb820fc9905f35cb98Brian Paul   GLbitfield OutputFlags[MAX_PROGRAM_OUTPUTS]; /**< PROG_PARAM_BIT_x flags */
194386adc2b29effb573c18eb0de7016cef605ab1edcHenri Verbeet   GLbitfield TexturesUsed[MAX_COMBINED_TEXTURE_IMAGE_UNITS];  /**< TEXTURE_x_BIT bitmask */
1944ade508312c701ce89d3c2cd717994dbbabb4f207Brian Paul   GLbitfield SamplersUsed;   /**< Bitfield of which samplers are used */
19457b559a91028d297b34df9ec939bd4d00fad6027cIan Romanick   GLbitfield ShadowSamplers; /**< Texture units used for shadow sampling. */
1946de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul
1947b730d0d3e9b202b17a0815cb820fc9905f35cb98Brian Paul
1948de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   /** Named parameters, constants, etc. from program text */
1949122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_program_parameter_list *Parameters;
1950de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   /** Numbered local parameters */
1951edd677454dc38a590bd6fc1cd3e2759d2a4d55e3Brian Paul   GLfloat LocalParams[MAX_PROGRAM_LOCAL_PARAMS][4];
1952de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul
1953ade508312c701ce89d3c2cd717994dbbabb4f207Brian Paul   /** Map from sampler unit to texture unit (set by glUniform1i()) */
1954ade508312c701ce89d3c2cd717994dbbabb4f207Brian Paul   GLubyte SamplerUnits[MAX_SAMPLERS];
1955ade508312c701ce89d3c2cd717994dbbabb4f207Brian Paul
195656643096f1eb01eefa1a532ac096b32d23b6b8baBrian Paul   /** Bitmask of which register files are read/written with indirect
195756643096f1eb01eefa1a532ac096b32d23b6b8baBrian Paul    * addressing.  Mask of (1 << PROGRAM_x) bits.
195856643096f1eb01eefa1a532ac096b32d23b6b8baBrian Paul    */
195956643096f1eb01eefa1a532ac096b32d23b6b8baBrian Paul   GLbitfield IndirectRegisterFiles;
196056643096f1eb01eefa1a532ac096b32d23b6b8baBrian Paul
1961de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   /** Logical counts */
1962de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   /*@{*/
1963de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   GLuint NumInstructions;
1964d0492cf1377897c8113a109aa936ee7a7084b9c8Brian Paul   GLuint NumTemporaries;
1965d0492cf1377897c8113a109aa936ee7a7084b9c8Brian Paul   GLuint NumParameters;
1966d0492cf1377897c8113a109aa936ee7a7084b9c8Brian Paul   GLuint NumAttributes;
1967d0492cf1377897c8113a109aa936ee7a7084b9c8Brian Paul   GLuint NumAddressRegs;
196821f99792a916a62fcfae7c208f50f192d4ce5926Brian   GLuint NumAluInstructions;
196921f99792a916a62fcfae7c208f50f192d4ce5926Brian   GLuint NumTexInstructions;
197021f99792a916a62fcfae7c208f50f192d4ce5926Brian   GLuint NumTexIndirections;
1971de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   /*@}*/
1972de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   /** Native, actual h/w counts */
1973de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   /*@{*/
197405051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint NumNativeInstructions;
197505051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint NumNativeTemporaries;
197605051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint NumNativeParameters;
197705051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint NumNativeAttributes;
197805051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint NumNativeAddressRegs;
197921f99792a916a62fcfae7c208f50f192d4ce5926Brian   GLuint NumNativeAluInstructions;
198021f99792a916a62fcfae7c208f50f192d4ce5926Brian   GLuint NumNativeTexInstructions;
198121f99792a916a62fcfae7c208f50f192d4ce5926Brian   GLuint NumNativeTexIndirections;
1982de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   /*@}*/
198386b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul};
198486b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
198586b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
19866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** Vertex program object */
1987122629f27925a9dc50029bebc5079f87f416a7e1Brian Paulstruct gl_vertex_program
198886b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul{
1989122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_program Base;   /**< base class */
1990122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   GLboolean IsNVProgram;    /**< is this a GL_NV_vertex_program program? */
1991122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   GLboolean IsPositionInvariant;
19921ad54ae0b1713e399c5db43d0eba87861075b4c7Paul Berry   GLboolean UsesClipDistance;
199386b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul};
199486b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
199586b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
1996da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin/** Geometry program object */
1997da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinstruct gl_geometry_program
1998da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{
1999da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct gl_program Base;   /**< base class */
2000da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
2001da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLint VerticesOut;
2002e3c961de3696911d8ab1351e64bd6e904de103d0Brian Paul   GLenum InputType;  /**< GL_POINTS, GL_LINES, GL_LINES_ADJACENCY_ARB,
2003e3c961de3696911d8ab1351e64bd6e904de103d0Brian Paul                           GL_TRIANGLES, or GL_TRIANGLES_ADJACENCY_ARB */
2004e3c961de3696911d8ab1351e64bd6e904de103d0Brian Paul   GLenum OutputType; /**< GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP */
2005da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin};
2006da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
2007da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
20086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** Fragment program object */
2009122629f27925a9dc50029bebc5079f87f416a7e1Brian Paulstruct gl_fragment_program
201086b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul{
2011122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_program Base;   /**< base class */
2012ec76910187adc88fc54907ffa3506309ee2abcf3Brian Paul   GLboolean UsesKill;          /**< shader uses KIL instruction */
20135e310e9f8300a357d6bdaf098c72098518b564f3Paul Berry   GLboolean UsesDFdy;          /**< shader uses DDY instruction */
2014e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri   GLboolean OriginUpperLeft;
2015e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri   GLboolean PixelCenterInteger;
2016a1b83464ffb1125b77e6f5664e0071f95167055dChad Versace   enum gl_frag_depth_layout FragDepthLayout;
2017cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry
2018cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry   /**
2019cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry    * GLSL interpolation qualifier associated with each fragment shader input.
2020cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry    * For inputs that do not have an interpolation qualifier specified in
2021c488150dea083a9677429b4185c6b20d7facd52bPaul Berry    * GLSL, the value is INTERP_QUALIFIER_NONE.
2022cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry    */
2023cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry   enum glsl_interp_qualifier InterpQualifier[FRAG_ATTRIB_MAX];
2024bebb0438113efdcc1c2aaed95c70ba87de1d3053Paul Berry
2025bebb0438113efdcc1c2aaed95c70ba87de1d3053Paul Berry   /**
2026bebb0438113efdcc1c2aaed95c70ba87de1d3053Paul Berry    * Bitfield indicating, for each fragment shader input, 1 if that input
2027bebb0438113efdcc1c2aaed95c70ba87de1d3053Paul Berry    * uses centroid interpolation, 0 otherwise.  Unused inputs are 0.
2028bebb0438113efdcc1c2aaed95c70ba87de1d3053Paul Berry    */
2029bebb0438113efdcc1c2aaed95c70ba87de1d3053Paul Berry   GLbitfield64 IsCentroid;
2030610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul};
2031610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul
2032610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul
20336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
2034610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul * State common to vertex and fragment programs.
2035610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul */
20364dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_program_state
20374dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
2038e1e03b32ab651e992f7b979eba046fdc84fedf2eRoland Scheidegger   GLint ErrorPos;                       /* GL_PROGRAM_ERROR_POSITION_ARB/NV */
2039e1e03b32ab651e992f7b979eba046fdc84fedf2eRoland Scheidegger   const char *ErrorString;              /* GL_PROGRAM_ERROR_STRING_ARB/NV */
204086b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul};
204186b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
204286b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
20436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
204481968ec49d9e06be0e095fa0084aa61b68b23d75Brian Paul * Context state for vertex programs.
204586b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul */
20464dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_vertex_program_state
204786b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul{
2048bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLboolean Enabled;            /**< User-set GL_VERTEX_PROGRAM_ARB/NV flag */
2049bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLboolean _Enabled;           /**< Enabled and _valid_ user program? */
2050bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLboolean PointSizeEnabled;   /**< GL_VERTEX_PROGRAM_POINT_SIZE_ARB/NV */
2051bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLboolean TwoSideEnabled;     /**< GL_VERTEX_PROGRAM_TWO_SIDE_ARB/NV */
2052b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt   /** Computed two sided lighting for fixed function/programs. */
2053b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt   GLboolean _TwoSideEnabled;
205420555835b68c58b52d7954a0b237a9a331013e68Brian Paul   struct gl_vertex_program *Current;  /**< User-bound vertex program */
2055a90046f1097ad95de2aa95ca65741dff5cddced9Brian
2056bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   /** Currently enabled and valid vertex program (including internal
2057bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul    * programs, user-defined vertex programs and GLSL vertex shaders).
205820555835b68c58b52d7954a0b237a9a331013e68Brian Paul    * This is the program we must use when rendering.
20595e80c62f3178a65bebca942aa0b1e5d16c34b2a9Brian    */
2060a90046f1097ad95de2aa95ca65741dff5cddced9Brian   struct gl_vertex_program *_Current;
206186b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
2062b7aeac0de1c9c533f78c5d6acf358bdc206161abBrian   GLfloat Parameters[MAX_PROGRAM_ENV_PARAMS][4]; /**< Env params */
206381968ec49d9e06be0e095fa0084aa61b68b23d75Brian Paul
206481968ec49d9e06be0e095fa0084aa61b68b23d75Brian Paul   /* For GL_NV_vertex_program only: */
2065b7aeac0de1c9c533f78c5d6acf358bdc206161abBrian   GLenum TrackMatrix[MAX_PROGRAM_ENV_PARAMS / 4];
2066b7aeac0de1c9c533f78c5d6acf358bdc206161abBrian   GLenum TrackMatrixTransform[MAX_PROGRAM_ENV_PARAMS / 4];
206708ff059f203f05a0cc417a46fe37f83929963db5Brian Paul
2068a90046f1097ad95de2aa95ca65741dff5cddced9Brian   /** Should fixed-function T&L be implemented with a vertex prog? */
2069a90046f1097ad95de2aa95ca65741dff5cddced9Brian   GLboolean _MaintainTnlProgram;
2070a90046f1097ad95de2aa95ca65741dff5cddced9Brian
2071a90046f1097ad95de2aa95ca65741dff5cddced9Brian   /** Program to emulate fixed-function T&L (see above) */
2072a90046f1097ad95de2aa95ca65741dff5cddced9Brian   struct gl_vertex_program *_TnlProgram;
2073a90046f1097ad95de2aa95ca65741dff5cddced9Brian
207432ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell   /** Cache of fixed-function programs */
207532ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell   struct gl_program_cache *Cache;
207632ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell
20776d4d51d647c27288aa625560bc080231099c0b01Brian Paul   GLboolean _Overriden;
207886b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul};
207986b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
208086b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
208123ffc3a85d6172f8a98d17d7f23610bab808d84eBrian Paul/**
2082da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Context state for geometry programs.
2083da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */
2084da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinstruct gl_geometry_program_state
2085da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{
2086da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLboolean Enabled;               /**< GL_ARB_GEOMETRY_SHADER4 */
2087da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLboolean _Enabled;              /**< Enabled and valid program? */
2088da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct gl_geometry_program *Current;  /**< user-bound geometry program */
2089da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
2090da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /** Currently enabled and valid program (including internal programs
2091da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * and compiled shader programs).
2092da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    */
2093da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct gl_geometry_program *_Current;
2094da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
2095da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLfloat Parameters[MAX_PROGRAM_ENV_PARAMS][4]; /**< Env params */
2096da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
2097da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /** Cache of fixed-function programs */
2098da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct gl_program_cache *Cache;
2099da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin};
2100da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
2101da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin/**
210281968ec49d9e06be0e095fa0084aa61b68b23d75Brian Paul * Context state for fragment programs.
2103610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul */
21044dafbc3dc75be565704f437016f70a63c48d1539Brian Paulstruct gl_fragment_program_state
2105610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul{
210639c4daa6bc15a83a97c3c0b456bf1795ef9e6099Brian Paul   GLboolean Enabled;     /**< User-set fragment program enable flag */
210720555835b68c58b52d7954a0b237a9a331013e68Brian Paul   GLboolean _Enabled;    /**< Enabled and _valid_ user program? */
21085e80c62f3178a65bebca942aa0b1e5d16c34b2a9Brian   struct gl_fragment_program *Current;  /**< User-bound fragment program */
2109a90046f1097ad95de2aa95ca65741dff5cddced9Brian
2110bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   /** Currently enabled and valid fragment program (including internal
2111bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul    * programs, user-defined fragment programs and GLSL fragment shaders).
211220555835b68c58b52d7954a0b237a9a331013e68Brian Paul    * This is the program we must use when rendering.
21135e80c62f3178a65bebca942aa0b1e5d16c34b2a9Brian    */
2114a90046f1097ad95de2aa95ca65741dff5cddced9Brian   struct gl_fragment_program *_Current;
2115a90046f1097ad95de2aa95ca65741dff5cddced9Brian
2116b7aeac0de1c9c533f78c5d6acf358bdc206161abBrian   GLfloat Parameters[MAX_PROGRAM_ENV_PARAMS][4]; /**< Env params */
211708ff059f203f05a0cc417a46fe37f83929963db5Brian Paul
2118a90046f1097ad95de2aa95ca65741dff5cddced9Brian   /** Should fixed-function texturing be implemented with a fragment prog? */
2119a90046f1097ad95de2aa95ca65741dff5cddced9Brian   GLboolean _MaintainTexEnvProgram;
2120a90046f1097ad95de2aa95ca65741dff5cddced9Brian
2121a90046f1097ad95de2aa95ca65741dff5cddced9Brian   /** Program to emulate fixed-function texture env/combine (see above) */
2122a90046f1097ad95de2aa95ca65741dff5cddced9Brian   struct gl_fragment_program *_TexEnvProgram;
2123a90046f1097ad95de2aa95ca65741dff5cddced9Brian
212432ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell   /** Cache of fixed-function programs */
212532ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell   struct gl_program_cache *Cache;
2126610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul};
2127610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul
212823ffc3a85d6172f8a98d17d7f23610bab808d84eBrian Paul
212923ffc3a85d6172f8a98d17d7f23610bab808d84eBrian Paul/**
213063d683091fe3a9600b65ae7ef3b554168b805406Brian Paul * ATI_fragment_shader runtime state
213163d683091fe3a9600b65ae7ef3b554168b805406Brian Paul */
213263d683091fe3a9600b65ae7ef3b554168b805406Brian Paul#define ATI_FS_INPUT_PRIMARY 0
213363d683091fe3a9600b65ae7ef3b554168b805406Brian Paul#define ATI_FS_INPUT_SECONDARY 1
213463d683091fe3a9600b65ae7ef3b554168b805406Brian Paul
213563d683091fe3a9600b65ae7ef3b554168b805406Brian Paulstruct atifs_instruction;
213663d683091fe3a9600b65ae7ef3b554168b805406Brian Paulstruct atifs_setupinst;
213763d683091fe3a9600b65ae7ef3b554168b805406Brian Paul
213863d683091fe3a9600b65ae7ef3b554168b805406Brian Paul/**
213963d683091fe3a9600b65ae7ef3b554168b805406Brian Paul * ATI fragment shader
214063d683091fe3a9600b65ae7ef3b554168b805406Brian Paul */
214163d683091fe3a9600b65ae7ef3b554168b805406Brian Paulstruct ati_fragment_shader
214263d683091fe3a9600b65ae7ef3b554168b805406Brian Paul{
214363d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   GLuint Id;
214463d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   GLint RefCount;
214563d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   struct atifs_instruction *Instructions[2];
214663d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   struct atifs_setupinst *SetupInst[2];
214763d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   GLfloat Constants[8][4];
2148a335d334d45701a42c283257fa44f2f7148e186dBrian Paul   GLbitfield LocalConstDef;  /**< Indicates which constants have been set */
214963d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   GLubyte numArithInstr[2];
215063d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   GLubyte regsAssigned[2];
2151a335d334d45701a42c283257fa44f2f7148e186dBrian Paul   GLubyte NumPasses;         /**< 1 or 2 */
215263d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   GLubyte cur_pass;
215363d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   GLubyte last_optype;
215463d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   GLboolean interpinp1;
215563d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   GLboolean isValid;
215663d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   GLuint swizzlerq;
215763d683091fe3a9600b65ae7ef3b554168b805406Brian Paul};
215863d683091fe3a9600b65ae7ef3b554168b805406Brian Paul
215963d683091fe3a9600b65ae7ef3b554168b805406Brian Paul/**
216063d683091fe3a9600b65ae7ef3b554168b805406Brian Paul * Context state for GL_ATI_fragment_shader
21617f752fed993e5e9423abac200dd59141edbada56Dave Airlie */
21627f752fed993e5e9423abac200dd59141edbada56Dave Airliestruct gl_ati_fragment_shader_state
21637f752fed993e5e9423abac200dd59141edbada56Dave Airlie{
21643deaa01c2bd576ae81fc6d3ea67c583cb3c22159Brian Paul   GLboolean Enabled;
2165a335d334d45701a42c283257fa44f2f7148e186dBrian Paul   GLboolean _Enabled;                  /**< enabled and valid shader? */
21663deaa01c2bd576ae81fc6d3ea67c583cb3c22159Brian Paul   GLboolean Compiling;
216763d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   GLfloat GlobalConstants[8][4];
21683deaa01c2bd576ae81fc6d3ea67c583cb3c22159Brian Paul   struct ati_fragment_shader *Current;
21697f752fed993e5e9423abac200dd59141edbada56Dave Airlie};
217086b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
217123ffc3a85d6172f8a98d17d7f23610bab808d84eBrian Paul
2172fae9604727c048834a7d5a90f8a652c86cff057aBrian Paul/** Set by #pragma directives */
2173fae9604727c048834a7d5a90f8a652c86cff057aBrian Paulstruct gl_sl_pragmas
2174fae9604727c048834a7d5a90f8a652c86cff057aBrian Paul{
217565fc2ca82a38bc00ae4223124932af6771765041Brian Paul   GLboolean IgnoreOptimize;  /**< ignore #pragma optimize(on/off) ? */
217665fc2ca82a38bc00ae4223124932af6771765041Brian Paul   GLboolean IgnoreDebug;     /**< ignore #pragma debug(on/off) ? */
2177fae9604727c048834a7d5a90f8a652c86cff057aBrian Paul   GLboolean Optimize;  /**< defaults on */
2178fae9604727c048834a7d5a90f8a652c86cff057aBrian Paul   GLboolean Debug;     /**< defaults off */
2179fae9604727c048834a7d5a90f8a652c86cff057aBrian Paul};
2180fae9604727c048834a7d5a90f8a652c86cff057aBrian Paul
2181a90046f1097ad95de2aa95ca65741dff5cddced9Brian
2182a90046f1097ad95de2aa95ca65741dff5cddced9Brian/**
2183ade508312c701ce89d3c2cd717994dbbabb4f207Brian Paul * A GLSL vertex or fragment shader object.
2184a90046f1097ad95de2aa95ca65741dff5cddced9Brian */
2185a90046f1097ad95de2aa95ca65741dff5cddced9Brianstruct gl_shader
2186a90046f1097ad95de2aa95ca65741dff5cddced9Brian{
2187da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLenum Type;  /**< GL_FRAGMENT_SHADER || GL_VERTEX_SHADER || GL_GEOMETRY_SHADER_ARB (first field!) */
2188a90046f1097ad95de2aa95ca65741dff5cddced9Brian   GLuint Name;  /**< AKA the handle */
21899e4bae9ccac5a76a2361c5c3cbe377a3c6b6a95bBrian   GLint RefCount;  /**< Reference count */
21909e4bae9ccac5a76a2361c5c3cbe377a3c6b6a95bBrian   GLboolean DeletePending;
2191a90046f1097ad95de2aa95ca65741dff5cddced9Brian   GLboolean CompileStatus;
2192fae9604727c048834a7d5a90f8a652c86cff057aBrian Paul   const GLchar *Source;  /**< Source code string */
2193b501263bf5965aa89c408cb8f0db3688847a8384Brian Paul   GLuint SourceChecksum;       /**< for debug/logging purposes */
21943d500f00d2a09becccd62abc0472090c4faa53d6Brian Paul   struct gl_program *Program;  /**< Post-compile assembly code */
21950bf5dbe002a64e198f55724cc1542602c012490fBrian   GLchar *InfoLog;
2196fae9604727c048834a7d5a90f8a652c86cff057aBrian Paul   struct gl_sl_pragmas Pragmas;
219716b68b1952d0da14b9ce8306efa64988ce46b4b7Eric Anholt
219825f51d3b9b8c36c41cd23d2797b6a06f6e27ff86Ian Romanick   unsigned Version;       /**< GLSL version used for linking */
219925f51d3b9b8c36c41cd23d2797b6a06f6e27ff86Ian Romanick
22006c0df75803e1944f82a1468dcca47d23de82ea6bIan Romanick   /**
22016c0df75803e1944f82a1468dcca47d23de82ea6bIan Romanick    * \name Sampler tracking
22026c0df75803e1944f82a1468dcca47d23de82ea6bIan Romanick    *
22036c0df75803e1944f82a1468dcca47d23de82ea6bIan Romanick    * \note Each of these fields is only set post-linking.
22046c0df75803e1944f82a1468dcca47d23de82ea6bIan Romanick    */
22056c0df75803e1944f82a1468dcca47d23de82ea6bIan Romanick   /*@{*/
22066c0df75803e1944f82a1468dcca47d23de82ea6bIan Romanick   unsigned num_samplers;	/**< Number of samplers used by this shader. */
22076c0df75803e1944f82a1468dcca47d23de82ea6bIan Romanick   GLbitfield active_samplers;	/**< Bitfield of which samplers are used */
22086c0df75803e1944f82a1468dcca47d23de82ea6bIan Romanick   GLbitfield shadow_samplers;	/**< Samplers used for shadow sampling. */
22096c0df75803e1944f82a1468dcca47d23de82ea6bIan Romanick   /*@}*/
22106c0df75803e1944f82a1468dcca47d23de82ea6bIan Romanick
22116ac895a664b25eb6252f33d5cfb0e9dd33190490Ian Romanick   /**
22126ac895a664b25eb6252f33d5cfb0e9dd33190490Ian Romanick    * Number of uniform components used by this shader.
22136ac895a664b25eb6252f33d5cfb0e9dd33190490Ian Romanick    *
22146ac895a664b25eb6252f33d5cfb0e9dd33190490Ian Romanick    * This field is only set post-linking.
22156ac895a664b25eb6252f33d5cfb0e9dd33190490Ian Romanick    */
22166ac895a664b25eb6252f33d5cfb0e9dd33190490Ian Romanick   unsigned num_uniform_components;
22176ac895a664b25eb6252f33d5cfb0e9dd33190490Ian Romanick
2218f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt   /**
2219f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    * This shader's uniform block information.
2220f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    *
2221f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    * The offsets of the variables are assigned only for shaders in a program's
2222f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    * _LinkedShaders[].
2223f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    */
2224f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt   struct gl_uniform_block *UniformBlocks;
2225f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt   unsigned NumUniformBlocks;
2226f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt
222716b68b1952d0da14b9ce8306efa64988ce46b4b7Eric Anholt   struct exec_list *ir;
222816b68b1952d0da14b9ce8306efa64988ce46b4b7Eric Anholt   struct glsl_symbol_table *symbols;
2229d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick
2230d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick   /** Shaders containing built-in functions that are used for linking. */
2231d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick   struct gl_shader *builtins_to_link[16];
2232d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick   unsigned num_builtins_to_link;
2233a90046f1097ad95de2aa95ca65741dff5cddced9Brian};
2234a90046f1097ad95de2aa95ca65741dff5cddced9Brian
2235a90046f1097ad95de2aa95ca65741dff5cddced9Brian
2236a90046f1097ad95de2aa95ca65741dff5cddced9Brian/**
223784870e215667c999202be31057df6e31a0389bb7Brian Paul * Shader stages. Note that these will become 5 with tessellation.
223884870e215667c999202be31057df6e31a0389bb7Brian Paul * These MUST have the same values as gallium's PIPE_SHADER_*
223984870e215667c999202be31057df6e31a0389bb7Brian Paul */
224084870e215667c999202be31057df6e31a0389bb7Brian Paultypedef enum
224184870e215667c999202be31057df6e31a0389bb7Brian Paul{
224284870e215667c999202be31057df6e31a0389bb7Brian Paul   MESA_SHADER_VERTEX = 0,
224384870e215667c999202be31057df6e31a0389bb7Brian Paul   MESA_SHADER_FRAGMENT = 1,
224484870e215667c999202be31057df6e31a0389bb7Brian Paul   MESA_SHADER_GEOMETRY = 2,
224584870e215667c999202be31057df6e31a0389bb7Brian Paul   MESA_SHADER_TYPES = 3
224684870e215667c999202be31057df6e31a0389bb7Brian Paul} gl_shader_type;
224784870e215667c999202be31057df6e31a0389bb7Brian Paul
2248b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholtstruct gl_uniform_buffer_variable
2249b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt{
2250b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt   char *Name;
2251b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt   const struct glsl_type *Type;
2252b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt   unsigned int Buffer;
2253b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt   unsigned int Offset;
2254b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt   GLboolean RowMajor;
2255b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt};
2256b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt
2257b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholtstruct gl_uniform_block
2258b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt{
2259b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt   /** Declared name of the uniform block */
2260b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt   char *Name;
2261b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt
2262b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt   /** Array of supplemental information about UBO ir_variables. */
2263b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt   struct gl_uniform_buffer_variable *Uniforms;
2264b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt   GLuint NumUniforms;
2265f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt
2266f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt   /**
2267f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    * Index (GL_UNIFORM_BLOCK_BINDING) into ctx->UniformBufferBindings[] to use
2268f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    * with glBindBufferBase to bind a buffer object to this uniform block.  When
2269f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    * updated in the program, _NEW_BUFFER_OBJECT will be set.
2270f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    */
2271f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt   GLuint Binding;
2272f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt
2273f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt   /**
2274f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    * Minimum size of a buffer object to back this uniform buffer
2275f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    * (GL_UNIFORM_BLOCK_DATA_SIZE).
2276f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    */
2277f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt   GLuint UniformBufferSize;
2278b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt};
227984870e215667c999202be31057df6e31a0389bb7Brian Paul
228084870e215667c999202be31057df6e31a0389bb7Brian Paul/**
2281ade508312c701ce89d3c2cd717994dbbabb4f207Brian Paul * A GLSL program object.
2282ade508312c701ce89d3c2cd717994dbbabb4f207Brian Paul * Basically a linked collection of vertex and fragment shaders.
2283a90046f1097ad95de2aa95ca65741dff5cddced9Brian */
228465a18442e5d846940714bb662f5b1bb47ab60c29Brianstruct gl_shader_program
2285a90046f1097ad95de2aa95ca65741dff5cddced9Brian{
228665a18442e5d846940714bb662f5b1bb47ab60c29Brian   GLenum Type;  /**< Always GL_SHADER_PROGRAM (internal token) */
2287a90046f1097ad95de2aa95ca65741dff5cddced9Brian   GLuint Name;  /**< aka handle or ID */
22889e4bae9ccac5a76a2361c5c3cbe377a3c6b6a95bBrian   GLint RefCount;  /**< Reference count */
22899e4bae9ccac5a76a2361c5c3cbe377a3c6b6a95bBrian   GLboolean DeletePending;
22909e4bae9ccac5a76a2361c5c3cbe377a3c6b6a95bBrian
229157f7978b1de40be6eb138d391c8d9f95b68cbf62Eric Anholt   /**
229257f7978b1de40be6eb138d391c8d9f95b68cbf62Eric Anholt    * Flags that the linker should not reject the program if it lacks
229357f7978b1de40be6eb138d391c8d9f95b68cbf62Eric Anholt    * a vertex or fragment shader.  GLES2 doesn't allow separate
229457f7978b1de40be6eb138d391c8d9f95b68cbf62Eric Anholt    * shader objects, and would reject them.  However, we internally
229557f7978b1de40be6eb138d391c8d9f95b68cbf62Eric Anholt    * build separate shader objects for fixed function programs, which
229657f7978b1de40be6eb138d391c8d9f95b68cbf62Eric Anholt    * we use for drivers/common/meta.c and for handling
229757f7978b1de40be6eb138d391c8d9f95b68cbf62Eric Anholt    * _mesa_update_state with no program bound (for example in
229857f7978b1de40be6eb138d391c8d9f95b68cbf62Eric Anholt    * glClear()).
229957f7978b1de40be6eb138d391c8d9f95b68cbf62Eric Anholt    */
230057f7978b1de40be6eb138d391c8d9f95b68cbf62Eric Anholt   GLboolean InternalSeparateShader;
230157f7978b1de40be6eb138d391c8d9f95b68cbf62Eric Anholt
23029e4bae9ccac5a76a2361c5c3cbe377a3c6b6a95bBrian   GLuint NumShaders;          /**< number of attached shaders */
23039e4bae9ccac5a76a2361c5c3cbe377a3c6b6a95bBrian   struct gl_shader **Shaders; /**< List of attached the shaders */
23049e4bae9ccac5a76a2361c5c3cbe377a3c6b6a95bBrian
2305015d4f61ef9116c9e844299ab9f2b15c653c0450Ian Romanick   /**
2306015d4f61ef9116c9e844299ab9f2b15c653c0450Ian Romanick    * User-defined attribute bindings
2307015d4f61ef9116c9e844299ab9f2b15c653c0450Ian Romanick    *
2308015d4f61ef9116c9e844299ab9f2b15c653c0450Ian Romanick    * These are set via \c glBindAttribLocation and are used to direct the
2309015d4f61ef9116c9e844299ab9f2b15c653c0450Ian Romanick    * GLSL linker.  These are \b not the values used in the compiled shader,
2310015d4f61ef9116c9e844299ab9f2b15c653c0450Ian Romanick    * and they are \b not the values returned by \c glGetAttribLocation.
2311015d4f61ef9116c9e844299ab9f2b15c653c0450Ian Romanick    */
2312015d4f61ef9116c9e844299ab9f2b15c653c0450Ian Romanick   struct string_to_uint_map *AttributeBindings;
231327341a97a17b23fdf57d33f78b475a474db71e4aBrian Paul
2314b12b5d9ab5c0153c93ca5ad9cd93cb36e41be4ebIan Romanick   /**
2315b12b5d9ab5c0153c93ca5ad9cd93cb36e41be4ebIan Romanick    * User-defined fragment data bindings
2316b12b5d9ab5c0153c93ca5ad9cd93cb36e41be4ebIan Romanick    *
2317b12b5d9ab5c0153c93ca5ad9cd93cb36e41be4ebIan Romanick    * These are set via \c glBindFragDataLocation and are used to direct the
2318b12b5d9ab5c0153c93ca5ad9cd93cb36e41be4ebIan Romanick    * GLSL linker.  These are \b not the values used in the compiled shader,
2319b12b5d9ab5c0153c93ca5ad9cd93cb36e41be4ebIan Romanick    * and they are \b not the values returned by \c glGetFragDataLocation.
2320b12b5d9ab5c0153c93ca5ad9cd93cb36e41be4ebIan Romanick    */
2321b12b5d9ab5c0153c93ca5ad9cd93cb36e41be4ebIan Romanick   struct string_to_uint_map *FragDataBindings;
2322f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie   struct string_to_uint_map *FragDataIndexBindings;
2323b12b5d9ab5c0153c93ca5ad9cd93cb36e41be4ebIan Romanick
23249d36c96d6ec9f2c05c8e0b9ef18c5462cddee8c1Eric Anholt   /**
23259d36c96d6ec9f2c05c8e0b9ef18c5462cddee8c1Eric Anholt    * Transform feedback varyings last specified by
23269d36c96d6ec9f2c05c8e0b9ef18c5462cddee8c1Eric Anholt    * glTransformFeedbackVaryings().
23279d36c96d6ec9f2c05c8e0b9ef18c5462cddee8c1Eric Anholt    *
23289d36c96d6ec9f2c05c8e0b9ef18c5462cddee8c1Eric Anholt    * For the current set of transform feeedback varyings used for transform
23299d36c96d6ec9f2c05c8e0b9ef18c5462cddee8c1Eric Anholt    * feedback output, see LinkedTransformFeedback.
23309d36c96d6ec9f2c05c8e0b9ef18c5462cddee8c1Eric Anholt    */
2331066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul   struct {
2332066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul      GLenum BufferMode;
2333066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul      GLuint NumVarying;
2334066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul      GLchar **VaryingNames;  /**< Array [NumVarying] of char * */
2335066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul   } TransformFeedback;
2336066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul
2337871ddb919b424293894a23a8f83200fed572d6a9Paul Berry   /** Post-link transform feedback info. */
2338871ddb919b424293894a23a8f83200fed572d6a9Paul Berry   struct gl_transform_feedback_info LinkedTransformFeedback;
2339871ddb919b424293894a23a8f83200fed572d6a9Paul Berry
2340ec174a424489664626796126f937fbce3e7d8cd8Marek Olšák   /** Post-link gl_FragDepth layout for ARB_conservative_depth. */
2341ec174a424489664626796126f937fbce3e7d8cd8Marek Olšák   enum gl_frag_depth_layout FragDepthLayout;
2342ec174a424489664626796126f937fbce3e7d8cd8Marek Olšák
2343ae8164a67b05cdc6d9b520b9704330537f3a6024Brian Paul   /** Geometry shader state - copied into gl_geometry_program at link time */
2344ae8164a67b05cdc6d9b520b9704330537f3a6024Brian Paul   struct {
2345ae8164a67b05cdc6d9b520b9704330537f3a6024Brian Paul      GLint VerticesOut;
2346ae8164a67b05cdc6d9b520b9704330537f3a6024Brian Paul      GLenum InputType;  /**< GL_POINTS, GL_LINES, GL_LINES_ADJACENCY_ARB,
2347ae8164a67b05cdc6d9b520b9704330537f3a6024Brian Paul                              GL_TRIANGLES, or GL_TRIANGLES_ADJACENCY_ARB */
2348ae8164a67b05cdc6d9b520b9704330537f3a6024Brian Paul      GLenum OutputType; /**< GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP */
2349ae8164a67b05cdc6d9b520b9704330537f3a6024Brian Paul   } Geom;
2350ae8164a67b05cdc6d9b520b9704330537f3a6024Brian Paul
23511ad54ae0b1713e399c5db43d0eba87861075b4c7Paul Berry   /** Vertex shader state - copied into gl_vertex_program at link time */
23521ad54ae0b1713e399c5db43d0eba87861075b4c7Paul Berry   struct {
23531ad54ae0b1713e399c5db43d0eba87861075b4c7Paul Berry      GLboolean UsesClipDistance; /**< True if gl_ClipDistance is written to. */
2354642e5b413e0890b2070ba78fde42db381eaf02e5Paul Berry      GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
2355642e5b413e0890b2070ba78fde42db381eaf02e5Paul Berry                                         0 if not present. */
23561ad54ae0b1713e399c5db43d0eba87861075b4c7Paul Berry   } Vert;
23571ad54ae0b1713e399c5db43d0eba87861075b4c7Paul Berry
23589e4bae9ccac5a76a2361c5c3cbe377a3c6b6a95bBrian   /* post-link info: */
23599a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick   unsigned NumUserUniformStorage;
23609a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick   struct gl_uniform_storage *UniformStorage;
23619a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick
2362f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt   struct gl_uniform_block *UniformBlocks;
2363f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt   unsigned NumUniformBlocks;
2364f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt
2365f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt   /**
2366f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    * Indices into the _LinkedShaders's UniformBlocks[] array for each stage
2367f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    * they're used in, or -1.
2368f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    *
2369f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    * This is used to maintain the Binding values of the stage's UniformBlocks[]
2370f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    * and to answer the GL_UNIFORM_BLOCK_REFERENCED_BY_*_SHADER queries.
2371f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt    */
2372f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt   int *UniformBlockStageIndex[MESA_SHADER_TYPES];
2373f609cf782ab5e90ddf045dc4b0da8cebf99be0d1Eric Anholt
23749a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick   /**
23759a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick    * Map of active uniform names to locations
23769a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick    *
23779a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick    * Maps any active uniform that is not an array element to a location.
23789a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick    * Each active uniform, including individual structure members will appear
23799a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick    * in this map.  This roughly corresponds to the set of names that would be
23809a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick    * enumerated by \c glGetActiveUniform.
23819a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick    */
23829a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick   struct string_to_uint_map *UniformHash;
23839a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick
23849a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick   /**
23859a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick    * Map from sampler unit to texture unit (set by glUniform1i())
23869a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick    *
23879a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick    * A sampler unit is associated with each sampler uniform by the linker.
23889a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick    * The sampler unit associated with each uniform is stored in the
23899a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick    * \c gl_uniform_storage::sampler field.
23909a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick    */
23919a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick   GLubyte SamplerUnits[MAX_SAMPLERS];
23929a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick   /** Which texture target is being sampled (TEXTURE_1D/2D/3D/etc_INDEX) */
23939a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick   gl_texture_index SamplerTargets[MAX_SAMPLERS];
23949a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick
23950bf5dbe002a64e198f55724cc1542602c012490fBrian   GLboolean LinkStatus;   /**< GL_LINK_STATUS */
23960bf5dbe002a64e198f55724cc1542602c012490fBrian   GLboolean Validated;
239771b1610941f9bfefa01d827fd19cc2368e6cdae3Brian Paul   GLboolean _Used;        /**< Ever used for drawing? */
23980bf5dbe002a64e198f55724cc1542602c012490fBrian   GLchar *InfoLog;
2399849e18153cd91d812f694b806a84008498860bc3Eric Anholt
240025f51d3b9b8c36c41cd23d2797b6a06f6e27ff86Ian Romanick   unsigned Version;       /**< GLSL version used for linking */
240125f51d3b9b8c36c41cd23d2797b6a06f6e27ff86Ian Romanick
2402ef5f1948316664055c1444d12076c7d86589a8b9Ian Romanick   /**
2403ef5f1948316664055c1444d12076c7d86589a8b9Ian Romanick    * Per-stage shaders resulting from the first stage of linking.
24043322fbaf3b5e305ce00c1d08c26965bb98e0cef0Ian Romanick    *
24053322fbaf3b5e305ce00c1d08c26965bb98e0cef0Ian Romanick    * Set of linked shaders for this program.  The array is accessed using the
24063322fbaf3b5e305ce00c1d08c26965bb98e0cef0Ian Romanick    * \c MESA_SHADER_* defines.  Entries for non-existent stages will be
24073322fbaf3b5e305ce00c1d08c26965bb98e0cef0Ian Romanick    * \c NULL.
2408ef5f1948316664055c1444d12076c7d86589a8b9Ian Romanick    */
24093322fbaf3b5e305ce00c1d08c26965bb98e0cef0Ian Romanick   struct gl_shader *_LinkedShaders[MESA_SHADER_TYPES];
2410a90046f1097ad95de2aa95ca65741dff5cddced9Brian};
2411a90046f1097ad95de2aa95ca65741dff5cddced9Brian
2412a90046f1097ad95de2aa95ca65741dff5cddced9Brian
2413e01a03d2220199a4541f2cb8b42035237a571aa4Brian Paul#define GLSL_DUMP      0x1  /**< Dump shaders to stdout */
2414e01a03d2220199a4541f2cb8b42035237a571aa4Brian Paul#define GLSL_LOG       0x2  /**< Write shaders to files */
2415e01a03d2220199a4541f2cb8b42035237a571aa4Brian Paul#define GLSL_OPT       0x4  /**< Force optimizations (override pragmas) */
2416e01a03d2220199a4541f2cb8b42035237a571aa4Brian Paul#define GLSL_NO_OPT    0x8  /**< Force no optimizations (override pragmas) */
2417e01a03d2220199a4541f2cb8b42035237a571aa4Brian Paul#define GLSL_UNIFORMS 0x10  /**< Print glUniform calls */
2418cb0de06301cd086a02ca709917819119dc1a8fd9Brian Paul#define GLSL_NOP_VERT 0x20  /**< Force no-op vertex shaders */
2419cb0de06301cd086a02ca709917819119dc1a8fd9Brian Paul#define GLSL_NOP_FRAG 0x40  /**< Force no-op fragment shaders */
24202ee7fd8d584abf051c552f455aeb588e2936b0eaBrian Paul#define GLSL_USE_PROG 0x80  /**< Log glUseProgram calls */
24210161691f3518db310411c5f02c05aa639050f129Brian Paul#define GLSL_REPORT_ERRORS 0x100  /**< Print compilation errors */
2422e01a03d2220199a4541f2cb8b42035237a571aa4Brian Paul
2423e01a03d2220199a4541f2cb8b42035237a571aa4Brian Paul
242463d683091fe3a9600b65ae7ef3b554168b805406Brian Paul/**
24250bf5dbe002a64e198f55724cc1542602c012490fBrian * Context state for GLSL vertex/fragment shaders.
242663d683091fe3a9600b65ae7ef3b554168b805406Brian Paul */
24270bf5dbe002a64e198f55724cc1542602c012490fBrianstruct gl_shader_state
2428848ff851575241454935c205eace88e799966563Brian Paul{
242975c6f472880706dcbb9d1e20727fa8f71db8b11cIan Romanick   /**
243084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick    * Programs used for rendering
243184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick    *
243284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick    * There is a separate program set for each shader stage.  If
243384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick    * GL_EXT_separate_shader_objects is not supported, each of these must point
243484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick    * to \c NULL or to the same program.
243575c6f472880706dcbb9d1e20727fa8f71db8b11cIan Romanick    */
243684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   struct gl_shader_program *CurrentVertexProgram;
243784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   struct gl_shader_program *CurrentGeometryProgram;
243884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   struct gl_shader_program *CurrentFragmentProgram;
243975c6f472880706dcbb9d1e20727fa8f71db8b11cIan Romanick
2440b527dd65c830a2b008816cf390d5be906e29bb23Ian Romanick   struct gl_shader_program *_CurrentFragmentProgram;
2441b527dd65c830a2b008816cf390d5be906e29bb23Ian Romanick
244275c6f472880706dcbb9d1e20727fa8f71db8b11cIan Romanick   /**
244375c6f472880706dcbb9d1e20727fa8f71db8b11cIan Romanick    * Program used by glUniform calls.
244475c6f472880706dcbb9d1e20727fa8f71db8b11cIan Romanick    *
244575c6f472880706dcbb9d1e20727fa8f71db8b11cIan Romanick    * Explicitly set by \c glUseProgram and \c glActiveProgramEXT.
244675c6f472880706dcbb9d1e20727fa8f71db8b11cIan Romanick    */
244775c6f472880706dcbb9d1e20727fa8f71db8b11cIan Romanick   struct gl_shader_program *ActiveProgram;
244875c6f472880706dcbb9d1e20727fa8f71db8b11cIan Romanick
24496d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri   GLbitfield Flags;                    /**< Mask of GLSL_x flags */
24506d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri};
24516d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri
245284870e215667c999202be31057df6e31a0389bb7Brian Paul
24536d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri/**
24546d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri * Compiler options for a single GLSL shaders type
24556d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri */
24566d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieristruct gl_shader_compiler_options
24576d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri{
245863556fa9949f543a8134b6b5ff3d216acb71dd9fBrian   /** Driver-selectable options: */
245963556fa9949f543a8134b6b5ff3d216acb71dd9fBrian   GLboolean EmitCondCodes;             /**< Use condition codes? */
2460726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   GLboolean EmitNVTempInitialization;  /**< 0-fill NV temp registers */
2461e591c4625cae63660c5000fbab366e40fe154ab0Luca Barbieri   GLboolean EmitNoLoops;
2462e591c4625cae63660c5000fbab366e40fe154ab0Luca Barbieri   GLboolean EmitNoFunctions;
2463e591c4625cae63660c5000fbab366e40fe154ab0Luca Barbieri   GLboolean EmitNoCont;                  /**< Emit CONT opcode? */
2464e591c4625cae63660c5000fbab366e40fe154ab0Luca Barbieri   GLboolean EmitNoMainReturn;            /**< Emit CONT/RET opcodes? */
24652b70dbfe091af5ae7c788e16275e1af2cb1c284cIan Romanick   GLboolean EmitNoNoise;                 /**< Emit NOISE opcodes? */
2466c4285be9a5bd1adaa89050989374b95a9a601cdcIan Romanick   GLboolean EmitNoPow;                   /**< Emit POW opcodes? */
2467c06e32596735074536b0e613cbddb1c5fd7b367aPaul Berry   GLboolean LowerClipDistance; /**< Lower gl_ClipDistance from float[8] to vec4[2]? */
2468e591c4625cae63660c5000fbab366e40fe154ab0Luca Barbieri
2469a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick   /**
2470a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick    * \name Forms of indirect addressing the driver cannot do.
2471a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick    */
2472a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick   /*@{*/
2473a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick   GLboolean EmitNoIndirectInput;   /**< No indirect addressing of inputs */
2474a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick   GLboolean EmitNoIndirectOutput;  /**< No indirect addressing of outputs */
2475a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick   GLboolean EmitNoIndirectTemp;    /**< No indirect addressing of temps */
2476a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick   GLboolean EmitNoIndirectUniform; /**< No indirect addressing of constants */
2477a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick   /*@}*/
2478a6ecd1c3724a78b76ab9e81ea39632f1279021f8Ian Romanick
2479488fe51cf823ccd137c667f1e92dd86f8323b723Bryan Cain   GLuint MaxIfDepth;               /**< Maximum nested IF blocks */
2480e591c4625cae63660c5000fbab366e40fe154ab0Luca Barbieri   GLuint MaxUnrollIterations;
24816d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri
248265fc2ca82a38bc00ae4223124932af6771765041Brian Paul   struct gl_sl_pragmas DefaultPragmas; /**< Default #pragma settings */
2483848ff851575241454935c205eace88e799966563Brian Paul};
2484b17a722ca3989e8563ee04cb2939f4835f8a171eBrian Paul
248584870e215667c999202be31057df6e31a0389bb7Brian Paul
24866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
248784870e215667c999202be31057df6e31a0389bb7Brian Paul * Occlusion/timer query object.
2488066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul */
248984870e215667c999202be31057df6e31a0389bb7Brian Paulstruct gl_query_object
2490066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul{
249184870e215667c999202be31057df6e31a0389bb7Brian Paul   GLenum Target;      /**< The query target, when active */
249284870e215667c999202be31057df6e31a0389bb7Brian Paul   GLuint Id;          /**< hash table ID/name */
249384870e215667c999202be31057df6e31a0389bb7Brian Paul   GLuint64EXT Result; /**< the counter */
249484870e215667c999202be31057df6e31a0389bb7Brian Paul   GLboolean Active;   /**< inside Begin/EndQuery */
249584870e215667c999202be31057df6e31a0389bb7Brian Paul   GLboolean Ready;    /**< result is ready? */
2496fef6e36e0736a68e24d7844bae65a01de8359214Brian Paul};
2497fef6e36e0736a68e24d7844bae65a01de8359214Brian Paul
2498fef6e36e0736a68e24d7844bae65a01de8359214Brian Paul
2499fef6e36e0736a68e24d7844bae65a01de8359214Brian Paul/**
250084870e215667c999202be31057df6e31a0389bb7Brian Paul * Context state for query objects.
2501fef6e36e0736a68e24d7844bae65a01de8359214Brian Paul */
250284870e215667c999202be31057df6e31a0389bb7Brian Paulstruct gl_query_state
2503fef6e36e0736a68e24d7844bae65a01de8359214Brian Paul{
250484870e215667c999202be31057df6e31a0389bb7Brian Paul   struct _mesa_HashTable *QueryObjects;
250584870e215667c999202be31057df6e31a0389bb7Brian Paul   struct gl_query_object *CurrentOcclusionObject; /* GL_ARB_occlusion_query */
250684870e215667c999202be31057df6e31a0389bb7Brian Paul   struct gl_query_object *CurrentTimerObject;     /* GL_EXT_timer_query */
2507fef6e36e0736a68e24d7844bae65a01de8359214Brian Paul
250884870e215667c999202be31057df6e31a0389bb7Brian Paul   /** GL_NV_conditional_render */
250984870e215667c999202be31057df6e31a0389bb7Brian Paul   struct gl_query_object *CondRenderQuery;
2510066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul
251184870e215667c999202be31057df6e31a0389bb7Brian Paul   /** GL_EXT_transform_feedback */
251284870e215667c999202be31057df6e31a0389bb7Brian Paul   struct gl_query_object *PrimitivesGenerated;
251384870e215667c999202be31057df6e31a0389bb7Brian Paul   struct gl_query_object *PrimitivesWritten;
2514fef6e36e0736a68e24d7844bae65a01de8359214Brian Paul
251584870e215667c999202be31057df6e31a0389bb7Brian Paul   /** GL_ARB_timer_query */
251684870e215667c999202be31057df6e31a0389bb7Brian Paul   struct gl_query_object *TimeElapsed;
2517fef6e36e0736a68e24d7844bae65a01de8359214Brian Paul
251884870e215667c999202be31057df6e31a0389bb7Brian Paul   GLenum CondRenderMode;
2519066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul};
2520066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul
2521066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul
252284870e215667c999202be31057df6e31a0389bb7Brian Paul/** Sync object state */
252384870e215667c999202be31057df6e31a0389bb7Brian Paulstruct gl_sync_object
252484870e215667c999202be31057df6e31a0389bb7Brian Paul{
252584870e215667c999202be31057df6e31a0389bb7Brian Paul   struct simple_node link;
252684870e215667c999202be31057df6e31a0389bb7Brian Paul   GLenum Type;               /**< GL_SYNC_FENCE */
252784870e215667c999202be31057df6e31a0389bb7Brian Paul   GLuint Name;               /**< Fence name */
252884870e215667c999202be31057df6e31a0389bb7Brian Paul   GLint RefCount;            /**< Reference count */
252984870e215667c999202be31057df6e31a0389bb7Brian Paul   GLboolean DeletePending;   /**< Object was deleted while there were still
253084870e215667c999202be31057df6e31a0389bb7Brian Paul			       * live references (e.g., sync not yet finished)
253184870e215667c999202be31057df6e31a0389bb7Brian Paul			       */
253284870e215667c999202be31057df6e31a0389bb7Brian Paul   GLenum SyncCondition;
253384870e215667c999202be31057df6e31a0389bb7Brian Paul   GLbitfield Flags;          /**< Flags passed to glFenceSync */
253484870e215667c999202be31057df6e31a0389bb7Brian Paul   GLuint StatusFlag:1;       /**< Has the sync object been signaled? */
253584870e215667c999202be31057df6e31a0389bb7Brian Paul};
253684870e215667c999202be31057df6e31a0389bb7Brian Paul
2537066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul
2538066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul/**
25395e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * State which can be shared by multiple contexts:
25405e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
2541f2dd273322cc9ec0cfe80a609f9a1e5db5931e2eBrian Paulstruct gl_shared_state
2542f2dd273322cc9ec0cfe80a609f9a1e5db5931e2eBrian Paul{
25436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   _glthread_Mutex Mutex;		   /**< for thread safety */
25446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLint RefCount;			   /**< Reference count */
25456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct _mesa_HashTable *DisplayList;	   /**< Display lists hash table */
25466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct _mesa_HashTable *TexObjects;	   /**< Texture objects hash table */
25475e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
25484d24b639d160fe485a3e8f7395e7654538be29e0Brian Paul   /** Default texture objects (shared by all texture units) */
25494d24b639d160fe485a3e8f7395e7654538be29e0Brian Paul   struct gl_texture_object *DefaultTex[NUM_TEXTURE_TARGETS];
25505e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
25513f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul   /** Fallback texture used when a bound texture is incomplete */
2552c04db7f7fad883891084d7f2e9a0040a17c48fe8Brian Paul   struct gl_texture_object *FallbackTex[NUM_TEXTURE_TARGETS];
25533f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul
25546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
25555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell    * \name Thread safety and statechange notification for texture
25565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell    * objects.
25575ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell    *
25585ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell    * \todo Improve the granularity of locking.
25595ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell    */
25605ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   /*@{*/
256103ec41ddc51e539c989a546f33d22daa2af69095Brian   _glthread_Mutex TexMutex;		/**< texobj thread safety */
256203ec41ddc51e539c989a546f33d22daa2af69095Brian   GLuint TextureStateStamp;	        /**< state notification for shared tex */
25635ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   /*@}*/
25645ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
25654f6b704f9796775d8d9937c3cf75a2901b99b896Brian Paul   /** Default buffer object for vertex arrays that aren't in VBOs */
25664f6b704f9796775d8d9937c3cf75a2901b99b896Brian Paul   struct gl_buffer_object *NullBufferObj;
25675ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
25685ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   /**
2569da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * \name Vertex/geometry/fragment programs
25706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    */
25716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
25723c2f8b22b9b87ccc06e33ecc088703c68d8230d8Brian Paul   struct _mesa_HashTable *Programs; /**< All vertex/fragment programs */
2573df43fb661b2030d9b833a42dd47b8d7bf58d73aaBrian   struct gl_vertex_program *DefaultVertexProgram;
2574df43fb661b2030d9b833a42dd47b8d7bf58d73aaBrian   struct gl_fragment_program *DefaultFragmentProgram;
2575da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct gl_geometry_program *DefaultGeometryProgram;
257663d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   /*@}*/
257763d683091fe3a9600b65ae7ef3b554168b805406Brian Paul
2578f90b5936d07c4c8f280318ab5cf5894ecb67aef6Chia-I Wu   /* GL_ATI_fragment_shader */
257963d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   struct _mesa_HashTable *ATIShaders;
258063d683091fe3a9600b65ae7ef3b554168b805406Brian Paul   struct ati_fragment_shader *DefaultFragmentShader;
258130f51ae067379c2b3573c06b707d25a9704df7beBrian Paul
25820207b47aafebc06cf83fbdb8c9b01f63374fac66Ian Romanick   struct _mesa_HashTable *BufferObjects;
2583848ff851575241454935c205eace88e799966563Brian Paul
2584aef47c4dc87075fd63002b50c4b32b1049e5e4d1Xiang, Haihao   /** Table of both gl_shader and gl_shader_program objects */
2585a90046f1097ad95de2aa95ca65741dff5cddced9Brian   struct _mesa_HashTable *ShaderObjects;
25860207b47aafebc06cf83fbdb8c9b01f63374fac66Ian Romanick
2587f90b5936d07c4c8f280318ab5cf5894ecb67aef6Chia-I Wu   /* GL_EXT_framebuffer_object */
2588ddc82eefca591f0ee93d3a77e1268571629a6d5cBrian Paul   struct _mesa_HashTable *RenderBuffers;
2589ddc82eefca591f0ee93d3a77e1268571629a6d5cBrian Paul   struct _mesa_HashTable *FrameBuffers;
2590ddc82eefca591f0ee93d3a77e1268571629a6d5cBrian Paul
2591f90b5936d07c4c8f280318ab5cf5894ecb67aef6Chia-I Wu   /* GL_ARB_sync */
259216b393d05990b6e917e144f9de87d0103b4c3e6dIan Romanick   struct simple_node SyncObjects;
259316b393d05990b6e917e144f9de87d0103b4c3e6dIan Romanick
2594ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   /** GL_ARB_sampler_objects */
2595ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   struct _mesa_HashTable *SamplerObjects;
25965e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
25975e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
25985e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
2599e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
26006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
26011da7d6c919e9a6d756b208caa6685bfa1146b543Brian Paul * Renderbuffers represent drawing surfaces such as color, depth and/or
26021da7d6c919e9a6d756b208caa6685bfa1146b543Brian Paul * stencil.  A framebuffer object has a set of renderbuffers.
26031da7d6c919e9a6d756b208caa6685bfa1146b543Brian Paul * Drivers will typically derive subclasses of this type.
2604e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
2605e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstruct gl_renderbuffer
2606e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{
26071da7d6c919e9a6d756b208caa6685bfa1146b543Brian Paul   _glthread_Mutex Mutex; /**< for thread safety */
2608ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   GLuint ClassID;        /**< Useful for drivers */
2609e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLuint Name;
2610e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLint RefCount;
2611e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLuint Width, Height;
26121da7d6c919e9a6d756b208caa6685bfa1146b543Brian Paul   GLboolean Purgeable;  /**< Is the buffer purgeable under memory pressure? */
2613348ea34d0310cc862ad3c078d8703c6c1f0b602fEric Anholt   GLboolean AttachedAnytime; /**< TRUE if it was attached to a framebuffer */
2614348ea34d0310cc862ad3c078d8703c6c1f0b602fEric Anholt   GLubyte NumSamples;
2615ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   GLenum InternalFormat; /**< The user-specified format */
2616ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   GLenum _BaseFormat;    /**< Either GL_RGB, GL_RGBA, GL_DEPTH_COMPONENT or
2617ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                               GL_STENCIL_INDEX. */
2618fc5ab1b19780ef97c5e7f6257a2d91121503bd53Brian Paul   gl_format Format;      /**< The actual renderbuffer memory format */
2619960d49b387ff4b64f802097c5013beee4de3649dBrian Paul
26201da7d6c919e9a6d756b208caa6685bfa1146b543Brian Paul   /** Delete this renderbuffer */
26219d4ab9a663d4088ec553edaae0eeafb746d2490dBrian Paul   void (*Delete)(struct gl_context *ctx, struct gl_renderbuffer *rb);
2622e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
26231da7d6c919e9a6d756b208caa6685bfa1146b543Brian Paul   /** Allocate new storage for this renderbuffer */
26241da7d6c919e9a6d756b208caa6685bfa1146b543Brian Paul   GLboolean (*AllocStorage)(struct gl_context *ctx,
26251da7d6c919e9a6d756b208caa6685bfa1146b543Brian Paul                             struct gl_renderbuffer *rb,
2626e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                             GLenum internalFormat,
2627e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                             GLuint width, GLuint height);
2628e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul};
2629e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
2630e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
2631e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
2632bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul * A renderbuffer attachment points to either a texture object (and specifies
2633bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul * a mipmap level, cube face or 3D texture slice) or points to a renderbuffer.
2634e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
2635e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstruct gl_renderbuffer_attachment
2636e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{
2637bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick   GLenum Type;  /**< \c GL_NONE or \c GL_TEXTURE or \c GL_RENDERBUFFER_EXT */
2638e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLboolean Complete;
2639e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
2640bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick   /**
2641bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick    * If \c Type is \c GL_RENDERBUFFER_EXT, this stores a pointer to the
2642bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick    * application supplied renderbuffer object.
2643bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick    */
2644e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_renderbuffer *Renderbuffer;
2645e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
2646bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick   /**
2647bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick    * If \c Type is \c GL_TEXTURE, this stores a pointer to the application
2648bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick    * supplied texture object.
2649bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick    */
2650e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_texture_object *Texture;
2651bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick   GLuint TextureLevel; /**< Attached mipmap level. */
2652bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick   GLuint CubeMapFace;  /**< 0 .. 5, for cube map textures. */
2653bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick   GLuint Zoffset;      /**< Slice for 3D textures,  or layer for both 1D
2654bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick                         * and 2D array textures */
2655e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul};
2656e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
2657e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
2658e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
2659e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * A framebuffer is a collection of renderbuffers (color, depth, stencil, etc).
26605e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * In C++ terms, think of this as a base class from which device drivers
26615e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * will make derived classes.
26625e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
2663e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstruct gl_framebuffer
2664f2dd273322cc9ec0cfe80a609f9a1e5db5931e2eBrian Paul{
2665bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   _glthread_Mutex Mutex;  /**< for thread safety */
26666dceeb2eb804d708639d68a13a924d65f366458aRobert Ellison   /**
26676dceeb2eb804d708639d68a13a924d65f366458aRobert Ellison    * If zero, this is a window system framebuffer.  If non-zero, this
26686dceeb2eb804d708639d68a13a924d65f366458aRobert Ellison    * is a FBO framebuffer; note that for some devices (i.e. those with
266929309b45b011b4c44721b8f7346272fb22a4d4c2Robert Ellison    * a natural pixel coordinate system for FBOs that differs from the
267029309b45b011b4c44721b8f7346272fb22a4d4c2Robert Ellison    * OpenGL/Mesa coordinate system), this means that the viewport,
267129309b45b011b4c44721b8f7346272fb22a4d4c2Robert Ellison    * polygon face orientation, and polygon stipple will have to be inverted.
26726dceeb2eb804d708639d68a13a924d65f366458aRobert Ellison    */
26736dceeb2eb804d708639d68a13a924d65f366458aRobert Ellison   GLuint Name;
26746dceeb2eb804d708639d68a13a924d65f366458aRobert Ellison
2675e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLint RefCount;
2676e6a9381f78605072cab52447fce35eaa98c1e75cBrian   GLboolean DeletePending;
26775e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
2678bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   /**
2679bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul    * The framebuffer's visual. Immutable if this is a window system buffer.
2680bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul    * Computed from attachments if user-made FBO.
2681bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul    */
2682d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg   struct gl_config Visual;
26835e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
268465a66f5bc37383c00423c21baf8ba9d6771e0259Brian Paul   GLboolean Initialized;
268565a66f5bc37383c00423c21baf8ba9d6771e0259Brian Paul
2686e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLuint Width, Height;	/**< size of frame buffer in pixels */
26876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
2688e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   /** \name  Drawing bounds (Intersection of buffer size and scissor box) */
26896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
2690e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLint _Xmin, _Xmax;  /**< inclusive */
2691e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLint _Ymin, _Ymax;  /**< exclusive */
26926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
26936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
2694e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   /** \name  Derived Z buffer stuff */
26956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
2696e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLuint _DepthMax;	/**< Max depth buffer value */
2697e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLfloat _DepthMaxF;	/**< Float max depth buffer value */
2698e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLfloat _MRD;	/**< minimum resolvable difference in Z values */
26996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
27006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
2701bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   /** One of the GL_FRAMEBUFFER_(IN)COMPLETE_* tokens */
2702bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLenum _Status;
27036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
2704f681ea4741c8136b2c169ff17c9d5b49b1d791baBrian Paul   /** Integer color values */
2705f681ea4741c8136b2c169ff17c9d5b49b1d791baBrian Paul   GLboolean _IntegerColor;
2706f681ea4741c8136b2c169ff17c9d5b49b1d791baBrian Paul
2707bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   /** Array of all renderbuffer attachments, indexed by BUFFER_* tokens. */
2708e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_renderbuffer_attachment Attachment[BUFFER_COUNT];
2709894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul
2710e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   /* In unextended OpenGL these vars are part of the GL_COLOR_BUFFER
2711e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul    * attribute group and GL_PIXEL attribute group, respectively.
27126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    */
2713e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLenum ColorDrawBuffer[MAX_DRAW_BUFFERS];
2714e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLenum ColorReadBuffer;
2715e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
2716601a6b872c33bfe3cb4ea03a5a8ba5ebe92dedafBrian   /** Computed from ColorDraw/ReadBuffer above */
2717ff73c783cc47361ff0dd819c82d067b4b85870ddBrian   GLuint _NumColorDrawBuffers;
2718601a6b872c33bfe3cb4ea03a5a8ba5ebe92dedafBrian   GLint _ColorDrawBufferIndexes[MAX_DRAW_BUFFERS]; /**< BUFFER_x or -1 */
2719601a6b872c33bfe3cb4ea03a5a8ba5ebe92dedafBrian   GLint _ColorReadBufferIndex; /* -1 = None */
2720ff73c783cc47361ff0dd819c82d067b4b85870ddBrian   struct gl_renderbuffer *_ColorDrawBuffers[MAX_DRAW_BUFFERS];
2721e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_renderbuffer *_ColorReadBuffer;
2722e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
2723e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   /** Delete this framebuffer */
2724e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   void (*Delete)(struct gl_framebuffer *fb);
27255e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
27265e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
27275e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
27286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
27293ee60a3558a3546b3c3a0a9732d384afcf02994aBrian Paul * Precision info for shader datatypes.  See glGetShaderPrecisionFormat().
27303ee60a3558a3546b3c3a0a9732d384afcf02994aBrian Paul */
27313ee60a3558a3546b3c3a0a9732d384afcf02994aBrian Paulstruct gl_precision
27323ee60a3558a3546b3c3a0a9732d384afcf02994aBrian Paul{
27333ee60a3558a3546b3c3a0a9732d384afcf02994aBrian Paul   GLushort RangeMin;   /**< min value exponent */
27343ee60a3558a3546b3c3a0a9732d384afcf02994aBrian Paul   GLushort RangeMax;   /**< max value exponent */
27353ee60a3558a3546b3c3a0a9732d384afcf02994aBrian Paul   GLushort Precision;  /**< number of mantissa bits */
27363ee60a3558a3546b3c3a0a9732d384afcf02994aBrian Paul};
27373ee60a3558a3546b3c3a0a9732d384afcf02994aBrian Paul
27383ee60a3558a3546b3c3a0a9732d384afcf02994aBrian Paul
27393ee60a3558a3546b3c3a0a9732d384afcf02994aBrian Paul/**
2740e0e94026a0648d6b33d6b7cf2b9b01429cf945e4Brian Paul * Limits for vertex, geometry and fragment programs/shaders.
274105051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul */
274205051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paulstruct gl_program_constants
274305051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul{
274405051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   /* logical limits */
274505051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint MaxInstructions;
2746f6ca938bcb7ebf82721590c8e4059ebf4d073a0bBrian Paul   GLuint MaxAluInstructions;
2747f6ca938bcb7ebf82721590c8e4059ebf4d073a0bBrian Paul   GLuint MaxTexInstructions;
2748f6ca938bcb7ebf82721590c8e4059ebf4d073a0bBrian Paul   GLuint MaxTexIndirections;
274905051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint MaxAttribs;
275005051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint MaxTemps;
2751f6ca938bcb7ebf82721590c8e4059ebf4d073a0bBrian Paul   GLuint MaxAddressRegs;
27528ad821df0a2d49964141f2ea4ef8179f4edc052fBrian Paul   GLuint MaxAddressOffset;  /**< [-MaxAddressOffset, MaxAddressOffset-1] */
275305051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint MaxParameters;
275405051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint MaxLocalParams;
275505051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint MaxEnvParams;
275605051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   /* native/hardware limits */
275705051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint MaxNativeInstructions;
2758f6ca938bcb7ebf82721590c8e4059ebf4d073a0bBrian Paul   GLuint MaxNativeAluInstructions;
2759f6ca938bcb7ebf82721590c8e4059ebf4d073a0bBrian Paul   GLuint MaxNativeTexInstructions;
2760f6ca938bcb7ebf82721590c8e4059ebf4d073a0bBrian Paul   GLuint MaxNativeTexIndirections;
276105051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint MaxNativeAttribs;
276205051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint MaxNativeTemps;
2763f6ca938bcb7ebf82721590c8e4059ebf4d073a0bBrian Paul   GLuint MaxNativeAddressRegs;
276405051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   GLuint MaxNativeParameters;
276590fcf6ccc345c287309d7d17b2ff256cc22fb2b7Brian Paul   /* For shaders */
2766e0e94026a0648d6b33d6b7cf2b9b01429cf945e4Brian Paul   GLuint MaxUniformComponents;  /**< Usually == MaxParameters * 4 */
27673ee60a3558a3546b3c3a0a9732d384afcf02994aBrian Paul   /* ES 2.0 and GL_ARB_ES2_compatibility */
27683ee60a3558a3546b3c3a0a9732d384afcf02994aBrian Paul   struct gl_precision LowFloat, MediumFloat, HighFloat;
27693ee60a3558a3546b3c3a0a9732d384afcf02994aBrian Paul   struct gl_precision LowInt, MediumInt, HighInt;
27705426b1ade9c97497bdf5ecd7c44701a6d5ef04dcEric Anholt   /* GL_ARB_uniform_buffer_object */
27715426b1ade9c97497bdf5ecd7c44701a6d5ef04dcEric Anholt   GLuint MaxUniformBlocks;
27725426b1ade9c97497bdf5ecd7c44701a6d5ef04dcEric Anholt   GLuint MaxCombinedUniformComponents;
277305051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul};
277405051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul
277505051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul
277605051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul/**
27776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Constants which may be overridden by device driver during context creation
2778ee403ff0ba272f5be539ddc921d3fffb3d250cc4Brian Paul * but are never changed after that.
27795e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
2780f2dd273322cc9ec0cfe80a609f9a1e5db5931e2eBrian Paulstruct gl_constants
2781f2dd273322cc9ec0cfe80a609f9a1e5db5931e2eBrian Paul{
27824b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul   GLint MaxTextureMbytes;      /**< Max memory per image, in MB */
2783bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLint MaxTextureLevels;      /**< Max mipmap levels. */
2784bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLint Max3DTextureLevels;    /**< Max mipmap levels for 3D textures */
2785bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLint MaxCubeTextureLevels;  /**< Max mipmap levels for cube textures */
2786bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLint MaxArrayTextureLayers; /**< Max layers in array textures */
2787bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLint MaxTextureRectSize;    /**< Max rectangle texture size, in pixes */
2788610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLuint MaxTextureCoordUnits;
2789610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLuint MaxTextureImageUnits;
2790bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLuint MaxVertexTextureImageUnits;
2791853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol   GLuint MaxCombinedTextureImageUnits;
2792e0e94026a0648d6b33d6b7cf2b9b01429cf945e4Brian Paul   GLuint MaxGeometryTextureImageUnits;
2793bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLuint MaxTextureUnits;           /**< = MIN(CoordUnits, ImageUnits) */
2794bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLfloat MaxTextureMaxAnisotropy;  /**< GL_EXT_texture_filter_anisotropic */
2795bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLfloat MaxTextureLodBias;        /**< GL_EXT_texture_lod_bias */
2796874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul   GLuint MaxTextureBufferSize;      /**< GL_ARB_texture_buffer_object */
2797bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul
27985e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLuint MaxArrayLockSize;
2799bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul
28005e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLint SubPixelBits;
2801bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul
2802bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLfloat MinPointSize, MaxPointSize;	     /**< aliased */
2803bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLfloat MinPointSizeAA, MaxPointSizeAA;   /**< antialiased */
28045e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat PointSizeGranularity;
2805bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLfloat MinLineWidth, MaxLineWidth;       /**< aliased */
2806bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLfloat MinLineWidthAA, MaxLineWidthAA;   /**< antialiased */
28075e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat LineWidthGranularity;
2808bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul
28095e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLuint MaxColorTableSize;
2810bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul
2811a864432fb4333dfbbe669554de7485d8426e1c38Brian Paul   GLuint MaxClipPlanes;
2812a864432fb4333dfbbe669554de7485d8426e1c38Brian Paul   GLuint MaxLights;
2813bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLfloat MaxShininess;                     /**< GL_NV_light_max_exponent */
2814bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLfloat MaxSpotExponent;                  /**< GL_NV_light_max_exponent */
2815bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul
281653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   GLuint MaxViewportWidth, MaxViewportHeight;
2817bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul
2818bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   struct gl_program_constants VertexProgram;   /**< GL_ARB_vertex_program */
2819bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   struct gl_program_constants FragmentProgram; /**< GL_ARB_fragment_program */
2820da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct gl_program_constants GeometryProgram;  /**< GL_ARB_geometry_shader4 */
2821edd677454dc38a590bd6fc1cd3e2759d2a4d55e3Brian Paul   GLuint MaxProgramMatrices;
2822edd677454dc38a590bd6fc1cd3e2759d2a4d55e3Brian Paul   GLuint MaxProgramMatrixStackDepth;
2823bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul
2824b765119c5d2cd41a7f47cce10fd1fdbcf162b03dEric Anholt   struct {
2825b765119c5d2cd41a7f47cce10fd1fdbcf162b03dEric Anholt      GLuint SamplesPassed;
2826b765119c5d2cd41a7f47cce10fd1fdbcf162b03dEric Anholt      GLuint TimeElapsed;
2827b765119c5d2cd41a7f47cce10fd1fdbcf162b03dEric Anholt      GLuint Timestamp;
2828b765119c5d2cd41a7f47cce10fd1fdbcf162b03dEric Anholt      GLuint PrimitivesGenerated;
2829b765119c5d2cd41a7f47cce10fd1fdbcf162b03dEric Anholt      GLuint PrimitivesWritten;
2830b765119c5d2cd41a7f47cce10fd1fdbcf162b03dEric Anholt   } QueryCounterBits;
2831b765119c5d2cd41a7f47cce10fd1fdbcf162b03dEric Anholt
2832bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   /** vertex array / buffer object bounds checking */
2833a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul   GLboolean CheckArrayBounds;
2834bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul
2835bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLuint MaxDrawBuffers;    /**< GL_ARB_draw_buffers */
2836bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul
2837bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLuint MaxColorAttachments;   /**< GL_EXT_framebuffer_object */
2838bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLuint MaxRenderbufferSize;   /**< GL_EXT_framebuffer_object */
2839bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLuint MaxSamples;            /**< GL_ARB_framebuffer_object */
2840bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul
2841e0e94026a0648d6b33d6b7cf2b9b01429cf945e4Brian Paul   /** Number of varying vectors between vertex and fragment shaders */
2842e0e94026a0648d6b33d6b7cf2b9b01429cf945e4Brian Paul   GLuint MaxVarying;
2843e0e94026a0648d6b33d6b7cf2b9b01429cf945e4Brian Paul   GLuint MaxVertexVaryingComponents;   /**< Between vert and geom shader */
2844e0e94026a0648d6b33d6b7cf2b9b01429cf945e4Brian Paul   GLuint MaxGeometryVaryingComponents; /**< Between geom and frag shader */
2845e0e94026a0648d6b33d6b7cf2b9b01429cf945e4Brian Paul
28465426b1ade9c97497bdf5ecd7c44701a6d5ef04dcEric Anholt   /** @{
28475426b1ade9c97497bdf5ecd7c44701a6d5ef04dcEric Anholt    * GL_ARB_uniform_buffer_object
28485426b1ade9c97497bdf5ecd7c44701a6d5ef04dcEric Anholt    */
28495426b1ade9c97497bdf5ecd7c44701a6d5ef04dcEric Anholt   GLuint MaxCombinedUniformBlocks;
28505426b1ade9c97497bdf5ecd7c44701a6d5ef04dcEric Anholt   GLuint MaxUniformBufferBindings;
28515426b1ade9c97497bdf5ecd7c44701a6d5ef04dcEric Anholt   GLuint MaxUniformBlockSize;
28525426b1ade9c97497bdf5ecd7c44701a6d5ef04dcEric Anholt   GLuint UniformBufferOffsetAlignment;
28535426b1ade9c97497bdf5ecd7c44701a6d5ef04dcEric Anholt   /** @} */
28545426b1ade9c97497bdf5ecd7c44701a6d5ef04dcEric Anholt
2855e0e94026a0648d6b33d6b7cf2b9b01429cf945e4Brian Paul   /** GL_ARB_geometry_shader4 */
2856e0e94026a0648d6b33d6b7cf2b9b01429cf945e4Brian Paul   GLuint MaxGeometryOutputVertices;
2857e0e94026a0648d6b33d6b7cf2b9b01429cf945e4Brian Paul   GLuint MaxGeometryTotalOutputComponents;
2858114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger
2859e7087175f8a04f777403366fb34b58edd00f4d60Brian Paul   GLuint GLSLVersion;  /**< GLSL version supported (ex: 120 = 1.20) */
2860e7087175f8a04f777403366fb34b58edd00f4d60Brian Paul
286101d81dedc795005ed235856ce762bb1981655716Kenneth Graunke   /**
2862b9e27cc1426e3242a003fa5ae91fab330694009aEric Anholt    * Changes default GLSL extension behavior from "error" to "warn".  It's out
2863b9e27cc1426e3242a003fa5ae91fab330694009aEric Anholt    * of spec, but it can make some apps work that otherwise wouldn't.
2864b9e27cc1426e3242a003fa5ae91fab330694009aEric Anholt    */
2865b9e27cc1426e3242a003fa5ae91fab330694009aEric Anholt   GLboolean ForceGLSLExtensionsWarn;
2866b9e27cc1426e3242a003fa5ae91fab330694009aEric Anholt
2867b9e27cc1426e3242a003fa5ae91fab330694009aEric Anholt   /**
286801d81dedc795005ed235856ce762bb1981655716Kenneth Graunke    * Does the driver support real 32-bit integers?  (Otherwise, integers are
286901d81dedc795005ed235856ce762bb1981655716Kenneth Graunke    * simulated via floats.)
287001d81dedc795005ed235856ce762bb1981655716Kenneth Graunke    */
287101d81dedc795005ed235856ce762bb1981655716Kenneth Graunke   GLboolean NativeIntegers;
287201d81dedc795005ed235856ce762bb1981655716Kenneth Graunke
28734e64cfbb4ec92877803e70257af8b97c484c00c0Bryan Cain   /**
28744e64cfbb4ec92877803e70257af8b97c484c00c0Bryan Cain    * If the driver supports real 32-bit integers, what integer value should be
28754e64cfbb4ec92877803e70257af8b97c484c00c0Bryan Cain    * used for boolean true in uniform uploads?  (Usually 1 or ~0.)
28764e64cfbb4ec92877803e70257af8b97c484c00c0Bryan Cain    */
28774e64cfbb4ec92877803e70257af8b97c484c00c0Bryan Cain   GLuint UniformBooleanTrue;
28784e64cfbb4ec92877803e70257af8b97c484c00c0Bryan Cain
28798680c1324097ec3df51e8bf6f25a3347df6f798cBrian Paul   /** Which texture units support GL_ATI_envmap_bumpmap as targets */
28808680c1324097ec3df51e8bf6f25a3347df6f798cBrian Paul   GLbitfield SupportedBumpUnits;
288189966cdb1b5974059c32308d74b5bb09943a6fa1Brian Paul
2882f37070bab6af350caec905ea7658e9241042b6ccIan Romanick   /**
2883f37070bab6af350caec905ea7658e9241042b6ccIan Romanick    * Maximum amount of time, measured in nanseconds, that the server can wait.
2884f37070bab6af350caec905ea7658e9241042b6ccIan Romanick    */
2885f37070bab6af350caec905ea7658e9241042b6ccIan Romanick   GLuint64 MaxServerWaitTimeout;
2886f37070bab6af350caec905ea7658e9241042b6ccIan Romanick
2887bd1d35fb5d3c889b11de5a1d493f711fc091fbedBrian Paul   /** GL_EXT_provoking_vertex */
288889966cdb1b5974059c32308d74b5bb09943a6fa1Brian Paul   GLboolean QuadsFollowProvokingVertexConvention;
288900225af999acabcd5eced0b075b0a56018fd5eb8Brian Paul
2890bd1d35fb5d3c889b11de5a1d493f711fc091fbedBrian Paul   /** OpenGL version 3.0 */
289100225af999acabcd5eced0b075b0a56018fd5eb8Brian Paul   GLbitfield ContextFlags;  /**< Ex: GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT */
2892066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul
2893bd1d35fb5d3c889b11de5a1d493f711fc091fbedBrian Paul   /** OpenGL version 3.2 */
2894bd1d35fb5d3c889b11de5a1d493f711fc091fbedBrian Paul   GLbitfield ProfileMask;   /**< Mask of CONTEXT_x_PROFILE_BIT */
2895bd1d35fb5d3c889b11de5a1d493f711fc091fbedBrian Paul
2896066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul   /** GL_EXT_transform_feedback */
289715ac66e331abdab12e882d80a6b4f647bc905298Marek Olšák   GLuint MaxTransformFeedbackBuffers;
2898066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul   GLuint MaxTransformFeedbackSeparateComponents;
2899066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul   GLuint MaxTransformFeedbackInterleavedComponents;
2900375e73d85948b43aa509e25f0a210ebd10238b6fMarek Olšák   GLuint MaxVertexStreams;
29013b82ceec677e875d2f2f9edbcfceafd4d9a85cb7Brian Paul
29023b82ceec677e875d2f2f9edbcfceafd4d9a85cb7Brian Paul   /** GL_EXT_gpu_shader4 */
29033b82ceec677e875d2f2f9edbcfceafd4d9a85cb7Brian Paul   GLint MinProgramTexelOffset, MaxProgramTexelOffset;
290488ffa9ce5b8e5fe2b93238f8b9a7a888be28324eDave Airlie
29056b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   /* GL_ARB_robustness */
29066b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   GLenum ResetStrategy;
29079c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt
2908f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie   /* GL_ARB_blend_func_extended */
2909f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie   GLuint MaxDualSourceDrawBuffers;
2910f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie
29119c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   /**
29129c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt    * Whether the implementation strips out and ignores texture borders.
29139c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt    *
29149c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt    * Many GPU hardware implementations don't support rendering with texture
29159c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt    * borders and mipmapped textures.  (Note: not static border color, but the
29169c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt    * old 1-pixel border around each edge).  Implementations then have to do
29179c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt    * slow fallbacks to be correct, or just ignore the border and be fast but
2918068b9dc26882b85ff0c7d0894b4c11791a5b641eBrian Paul    * wrong.  Setting the flag strips the border off of TexImage calls,
29199c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt    * providing "fast but wrong" at significantly reduced driver complexity.
29209c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt    *
29219c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt    * Texture borders are deprecated in GL 3.0.
29229c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt    **/
29239c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt   GLboolean StripTextureBorder;
2924df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák
2925df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák   /**
2926df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák    * For drivers which can do a better job at eliminating unused varyings
2927df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák    * and uniforms than the GLSL compiler.
2928df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák    *
2929df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák    * XXX Remove these as soon as a better solution is available.
2930df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák    */
2931df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák   GLboolean GLSLSkipStrictMaxVaryingLimitCheck;
2932df809ae92343bb83c162ea4c807cefb67686717dMarek Olšák   GLboolean GLSLSkipStrictMaxUniformLimitCheck;
2933fc22fde9d8ba633f9f13ea0c46baa1c826d1377fJordan Justen
2934fc22fde9d8ba633f9f13ea0c46baa1c826d1377fJordan Justen   /**
2935fc22fde9d8ba633f9f13ea0c46baa1c826d1377fJordan Justen    * Force software support for primitive restart in the VBO module.
2936fc22fde9d8ba633f9f13ea0c46baa1c826d1377fJordan Justen    */
2937fc22fde9d8ba633f9f13ea0c46baa1c826d1377fJordan Justen   GLboolean PrimitiveRestartInSoftware;
29385e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
29395e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
29405e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
29416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
29424dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Enable flag for each OpenGL extension.  Different device drivers will
29434dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * enable different extensions at runtime.
29445e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
2945f2dd273322cc9ec0cfe80a609f9a1e5db5931e2eBrian Paulstruct gl_extensions
2946f2dd273322cc9ec0cfe80a609f9a1e5db5931e2eBrian Paul{
2947de4f460e20cf76ece883530ffe3f82a0afc817f3Brian Paul   GLboolean dummy;  /* don't remove this! */
29489b260c377f5b437b7e03607fefa022459ef758edChad Versace   GLboolean dummy_true;  /* Set true by _mesa_init_extensions(). */
29499b260c377f5b437b7e03607fefa022459ef758edChad Versace   GLboolean dummy_false; /* Set false by _mesa_init_extensions(). */
29509c6954fc9d254e0d6dc9bc7aac5badee04fe0f9bEric Anholt   GLboolean ARB_ES2_compatibility;
2951ae5d7d5e8970f90b9713897387d7d46a2b4485abFredrik Höglund   GLboolean ARB_base_instance;
295244732103b2b7a8765299e586fb3b9bf91e32f6d4Brian Paul   GLboolean ARB_blend_func_extended;
2953e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   GLboolean ARB_color_buffer_float;
2954bbcb648bc2f45dd85e33c7301527c8f6d97cbce6Marek Olšák   GLboolean ARB_conservative_depth;
295596a30b06dbc60ff63392cf8ae9dcb3d245b41c27Brian Paul   GLboolean ARB_copy_buffer;
29566988f65e43297ae63bbce30bf882f870b370096cBrian Paul   GLboolean ARB_depth_buffer_float;
2957b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt   GLboolean ARB_depth_clamp;
29586988f65e43297ae63bbce30bf882f870b370096cBrian Paul   GLboolean ARB_depth_texture;
295974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   GLboolean ARB_draw_buffers_blend;
296092d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt   GLboolean ARB_draw_elements_base_vertex;
29613258dfbbbda69b46003362e94e75129c277c7a61Brian Paul   GLboolean ARB_draw_instanced;
2962e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri   GLboolean ARB_fragment_coord_conventions;
2963d0492cf1377897c8113a109aa936ee7a7084b9c8Brian Paul   GLboolean ARB_fragment_program;
29647b559a91028d297b34df9ec939bd4d00fad6027cIan Romanick   GLboolean ARB_fragment_program_shadow;
2965678ea6cd5cb68d22668c93bf4ed830226ef26b0cMichal Krol   GLboolean ARB_fragment_shader;
29667d98f5ab6e207586dcac4b165221ea9852fcf035Brian Paul   GLboolean ARB_framebuffer_object;
296744732103b2b7a8765299e586fb3b9bf91e32f6d4Brian Paul   GLboolean ARB_explicit_attrib_location;
2968da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLboolean ARB_geometry_shader4;
2969f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLboolean ARB_half_float_pixel;
2970cfe884e2030466df673881da8e830c300dda40dbDave Airlie   GLboolean ARB_half_float_vertex;
297144732103b2b7a8765299e586fb3b9bf91e32f6d4Brian Paul   GLboolean ARB_instanced_arrays;
2972e75b283b45add351dbe5a09289fe85546df8a79aBrian Paul   GLboolean ARB_map_buffer_range;
2973b17a722ca3989e8563ee04cb2939f4835f8a171eBrian Paul   GLboolean ARB_occlusion_query;
297444732103b2b7a8765299e586fb3b9bf91e32f6d4Brian Paul   GLboolean ARB_occlusion_query2;
297563736723678ef30e7f90835cfbd48c520e39bf11Ian Romanick   GLboolean ARB_point_sprite;
29769d5bb3c6f820a5a99e1f55b2fd14d250761fcddcIan Romanick   GLboolean ARB_seamless_cube_map;
2977199771bc325900eb1d3acc7fa03808894a94fdb2Olivier Galibert   GLboolean ARB_shader_bit_encoding;
2978efb41b07ff213735e8ea08f38a7799f9d80459fcBrian Paul   GLboolean ARB_shader_objects;
2979d9671863eaae41ba28b6fe82e3e7d1dac12f514cDave Airlie   GLboolean ARB_shader_stencil_export;
29801d4eb8d5d82fca2bc6689cff90a8b971feac8054Kenneth Graunke   GLboolean ARB_shader_texture_lod;
29812a37053fd5591eeb21db33aa8f6ee444da1eee7aMichal Krol   GLboolean ARB_shading_language_100;
2982014ec1ac5e98e86836285a176d7674bc43a00cd7Brian Paul   GLboolean ARB_shadow;
2983f37070bab6af350caec905ea7658e9241042b6ccIan Romanick   GLboolean ARB_sync;
29842bb04cad14f5edd9e2657a1122ceeb1fb468f4a9Brian Paul   GLboolean ARB_texture_border_clamp;
298544732103b2b7a8765299e586fb3b9bf91e32f6d4Brian Paul   GLboolean ARB_texture_buffer_object;
2986e2a054b70cb5dace40fc1426cbf936366dc72fb9Ian Romanick   GLboolean ARB_texture_compression_rgtc;
29875e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean ARB_texture_cube_map;
2988bcfe3936a8722f43639ad853649c7f0ea8591cf3Brian Paul   GLboolean ARB_texture_env_combine;
2989f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul   GLboolean ARB_texture_env_crossbar;
2990bcfe3936a8722f43639ad853649c7f0ea8591cf3Brian Paul   GLboolean ARB_texture_env_dot3;
2991f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   GLboolean ARB_texture_float;
299244732103b2b7a8765299e586fb3b9bf91e32f6d4Brian Paul   GLboolean ARB_texture_multisample;
2993887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul   GLboolean ARB_texture_non_power_of_two;
29946988f65e43297ae63bbce30bf882f870b370096cBrian Paul   GLboolean ARB_texture_rg;
299544732103b2b7a8765299e586fb3b9bf91e32f6d4Brian Paul   GLboolean ARB_texture_rgb10_a2ui;
2996b296315881e4da60798e546f24c727a49deb9a89Brian Paul   GLboolean ARB_texture_storage;
299744732103b2b7a8765299e586fb3b9bf91e32f6d4Brian Paul   GLboolean ARB_timer_query;
2998fef6e36e0736a68e24d7844bae65a01de8359214Brian Paul   GLboolean ARB_transform_feedback2;
299921cb5ed20d1d7984b7695395327ed0ba0b0d16e2Marek Olšák   GLboolean ARB_transform_feedback3;
3000d24ece97e5ac755b9fd11d1d00d2eafc8524ca04Marek Olšák   GLboolean ARB_transform_feedback_instanced;
3001e5a94ba138f9a628b1237fa815c2af9c9da077ebBrian Paul   GLboolean ARB_transpose_matrix;
300244732103b2b7a8765299e586fb3b9bf91e32f6d4Brian Paul   GLboolean ARB_uniform_buffer_object;
3003d0492cf1377897c8113a109aa936ee7a7084b9c8Brian Paul   GLboolean ARB_vertex_program;
3004678ea6cd5cb68d22668c93bf4ed830226ef26b0cMichal Krol   GLboolean ARB_vertex_shader;
300544732103b2b7a8765299e586fb3b9bf91e32f6d4Brian Paul   GLboolean ARB_vertex_type_2_10_10_10_rev;
30065b7dab2e4c7df1fde0a7fcf28b8b54745b9fcd2eBrian Paul   GLboolean ARB_window_pos;
30075e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean EXT_blend_color;
3008c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   GLboolean EXT_blend_equation_separate;
30095e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean EXT_blend_func_separate;
30105e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean EXT_blend_minmax;
3011e5a94ba138f9a628b1237fa815c2af9c9da077ebBrian Paul   GLboolean EXT_clip_volume_hint;
30125e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean EXT_compiled_vertex_array;
3013e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   GLboolean EXT_depth_bounds_test;
30148f6f1124634cf659dde4c75549b84e35505d892dBrian Paul   GLboolean EXT_draw_buffers2;
3015e5a94ba138f9a628b1237fa815c2af9c9da077ebBrian Paul   GLboolean EXT_draw_range_elements;
30165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean EXT_fog_coord;
30170bffb1192a599b11af11604ad590f6a50c054bf1Brian Paul   GLboolean EXT_framebuffer_blit;
30184d6ec214396461c0cf3ad8ede449b299ff06c1aaIan Romanick   GLboolean EXT_framebuffer_multisample;
30194d6ec214396461c0cf3ad8ede449b299ff06c1aaIan Romanick   GLboolean EXT_framebuffer_object;
302044732103b2b7a8765299e586fb3b9bf91e32f6d4Brian Paul   GLboolean EXT_framebuffer_sRGB;
30218c41c757fe8efa04df0dd5cdfb33a75b84891c19Ian Romanick   GLboolean EXT_gpu_program_parameters;
30229ee07a0a27f515c11ae6d3061565863da757a8edBrian Paul   GLboolean EXT_gpu_shader4;
30231ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul   GLboolean EXT_packed_depth_stencil;
302444732103b2b7a8765299e586fb3b9bf91e32f6d4Brian Paul   GLboolean EXT_packed_float;
3025e5a94ba138f9a628b1237fa815c2af9c9da077ebBrian Paul   GLboolean EXT_packed_pixels;
30267a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   GLboolean EXT_pixel_buffer_object;
30275e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean EXT_point_parameters;
302889966cdb1b5974059c32308d74b5bb09943a6fa1Brian Paul   GLboolean EXT_provoking_vertex;
3029e5a94ba138f9a628b1237fa815c2af9c9da077ebBrian Paul   GLboolean EXT_rescale_normal;
3030636b2801d981872d3111be0cd11aa79b4cc8643bBrian Paul   GLboolean EXT_shadow_funcs;
30315e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean EXT_secondary_color;
3032b97794c041f848a5c9481cfeac6401f5dc9f0e48Ian Romanick   GLboolean EXT_separate_shader_objects;
3033e5a94ba138f9a628b1237fa815c2af9c9da077ebBrian Paul   GLboolean EXT_separate_specular_color;
30345f60a0b50ada1865d4fc6a724366e8ea0cc9a72fBrian Paul   GLboolean EXT_stencil_two_side;
30355e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean EXT_texture3D;
30361edd444c2e9afadb56df55682ae606b5cefd811cBrian Paul   GLboolean EXT_texture_array;
30377d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák   GLboolean EXT_texture_compression_latc;
30385e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean EXT_texture_compression_s3tc;
3039ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes   GLboolean EXT_texture_env_dot3;
30402c3d34c905fa6b831a066afae83b938de05eb241Gareth Hughes   GLboolean EXT_texture_filter_anisotropic;
304144732103b2b7a8765299e586fb3b9bf91e32f6d4Brian Paul   GLboolean EXT_texture_integer;
3042c8363a31cfcd8e3c60387df31525158847ab1457Ian Romanick   GLboolean EXT_texture_mirror_clamp;
30436988f65e43297ae63bbce30bf882f870b370096cBrian Paul   GLboolean EXT_texture_shared_exponent;
30440be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák   GLboolean EXT_texture_snorm;
30458d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul   GLboolean EXT_texture_sRGB;
3046edc2dd8e4788e556d445c9f59974ed95b33c2bbcDave Airlie   GLboolean EXT_texture_sRGB_decode;
30474a89e51c5f88b57040b361b62e80a57c8248ba4bBrian Paul   GLboolean EXT_texture_swizzle;
3048066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul   GLboolean EXT_transform_feedback;
30494fb995084e1b4b629667f09331adf060aa0fac4cBrian Paul   GLboolean EXT_timer_query;
3050f7c1a2dacd1643a19fbf975c21ac3e64b708c8d7Brian Paul   GLboolean EXT_vertex_array_bgra;
305178838b2d1bd88f948030cd60479b832b661ccd3cChad Versace   GLboolean OES_standard_derivatives;
3052e5a94ba138f9a628b1237fa815c2af9c9da077ebBrian Paul   /* vendor extensions */
3053a19c42ffc606b594558a0c4f981662442ad6bb83Marek Olšák   GLboolean AMD_seamless_cubemap_per_texture;
3054e5a94ba138f9a628b1237fa815c2af9c9da077ebBrian Paul   GLboolean APPLE_packed_pixels;
305599864d595f7d4c13e9548f83d5972db9af64e67bChris Wilson   GLboolean APPLE_object_purgeable;
3056114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger   GLboolean ATI_envmap_bumpmap;
305769f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák   GLboolean ATI_texture_compression_3dc;
3058e5a94ba138f9a628b1237fa815c2af9c9da077ebBrian Paul   GLboolean ATI_texture_mirror_once;
3059e5a94ba138f9a628b1237fa815c2af9c9da077ebBrian Paul   GLboolean ATI_texture_env_combine3;
30607f752fed993e5e9423abac200dd59141edbada56Dave Airlie   GLboolean ATI_fragment_shader;
30616d104cb932080c5c0d951fbc0ec6d30fb7ebef45Alan Hourihane   GLboolean ATI_separate_stencil;
30628c2f6c5059a60d845716277973c826f4069926e6Brian Paul   GLboolean IBM_rasterpos_clip;
30633baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GLboolean IBM_multimode_draw_arrays;
3064551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul   GLboolean MESA_pack_invert;
30655e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean MESA_resize_buffers;
3066c5b995066020191982b2315fc45d05e068eee761Brian Paul   GLboolean MESA_ycbcr_texture;
3067bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick   GLboolean MESA_texture_array;
30685e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean NV_blend_square;
30692be0d77a97cbe92f09dd97fb85a3d5372e52ad4cBrian Paul   GLboolean NV_conditional_render;
3070740467dd62962b4effdaf51e38edc032e2a39487Nicholas Miell   GLboolean NV_fog_distance;
3071610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLboolean NV_fragment_program;
3072efff7aa980e78dc3ee1782308f0c9f3861c9992aIan Romanick   GLboolean NV_fragment_program_option;
3073e5a94ba138f9a628b1237fa815c2af9c9da077ebBrian Paul   GLboolean NV_light_max_exponent;
30746c408b46678637959dba04663fbc34eb9c4bc397Brian Paul   GLboolean NV_point_sprite;
307544732103b2b7a8765299e586fb3b9bf91e32f6d4Brian Paul   GLboolean NV_primitive_restart;
30762d7b2d7a87f037fa435772b7ce7c7cc0f426d912Kristian Høgsberg   GLboolean NV_read_buffer;
3077867f9b07d42c2b49ddb9e5bb17f0ac5c4a80d8acMarek Olšák   GLboolean NV_texture_barrier;
3078e5a94ba138f9a628b1237fa815c2af9c9da077ebBrian Paul   GLboolean NV_texgen_reflection;
3079f5d3027c0a03e26fe90efc067766c996dea05948Brian Paul   GLboolean NV_texture_env_combine4;
30808afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul   GLboolean NV_texture_rectangle;
308186b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul   GLboolean NV_vertex_program;
3082f9708e45ac819a0c589e14ea81e635fbbc8033f8Brian Paul   GLboolean NV_vertex_program1_1;
3083e5a94ba138f9a628b1237fa815c2af9c9da077ebBrian Paul   GLboolean SGIS_texture_lod;
308489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul   GLboolean TDFX_texture_compression_FXT1;
3085663a9e1b7ef7b8384abe2f81e1a8749b942f6d3aDaniel Borca   GLboolean S3_s3tc;
30862002e4d06e2627241cd4af88f65b54d2101ef151Chia-I Wu   GLboolean OES_EGL_image;
308734064756a5e2c8952c9de26eaebafddabd562540Chia-I Wu   GLboolean OES_draw_texture;
3088db73264e1471a594d49ca0bc397cbb6746ee1dceChia-I Wu   GLboolean OES_EGL_image_external;
3089d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu   GLboolean OES_compressed_ETC1_RGB8_texture;
30909b260c377f5b437b7e03607fefa022459ef758edChad Versace   GLboolean extension_sentinel;
3091bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   /** The extension string */
3092de4f460e20cf76ece883530ffe3f82a0afc817f3Brian Paul   const GLubyte *String;
3093802b80893943cf129039a37fb2afe26444b09332Brian Paul   /** Number of supported extensions */
3094802b80893943cf129039a37fb2afe26444b09332Brian Paul   GLuint Count;
30955e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
30965e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
30975e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
30986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
30993b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul * A stack of matrices (projection, modelview, color, texture, etc).
31003b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul */
31010e1bd2302537a9684158cb353b876af4ce6346e7Brianstruct gl_matrix_stack
310286b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul{
31036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLmatrix *Top;      /**< points into Stack */
31046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLmatrix *Stack;    /**< array [MaxDepth] of GLmatrix */
31056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint Depth;       /**< 0 <= Depth < MaxDepth */
31066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint MaxDepth;    /**< size of Stack[] array */
31076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint DirtyFlag;   /**< _NEW_MODELVIEW or _NEW_PROJECTION, for example */
310886b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul};
310986b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul
31105e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
31116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
31126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \name Bits for image transfer operations
3113f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg * \sa __struct gl_contextRec::ImageTransferState.
31145e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
31156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
31165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#define IMAGE_SCALE_BIAS_BIT                      0x1
31175e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#define IMAGE_SHIFT_OFFSET_BIT                    0x2
31185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#define IMAGE_MAP_COLOR_BIT                       0x4
3119bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul#define IMAGE_CLAMP_BIT                           0x800
3120833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
31215e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
3122a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt/** Pixel Transfer ops */
3123a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt#define IMAGE_BITS (IMAGE_SCALE_BIAS_BIT |			\
3124a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt		    IMAGE_SHIFT_OFFSET_BIT |			\
3125a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt		    IMAGE_MAP_COLOR_BIT)
31265e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
31276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
31286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \name Bits to indicate what state has changed.
31296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
31306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
3131fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_MODELVIEW         (1 << 0)   /**< gl_context::ModelView */
3132fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_PROJECTION        (1 << 1)   /**< gl_context::Projection */
3133fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_TEXTURE_MATRIX    (1 << 2)   /**< gl_context::TextureMatrix */
3134fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_COLOR             (1 << 3)   /**< gl_context::Color */
3135fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_DEPTH             (1 << 4)   /**< gl_context::Depth */
3136fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_EVAL              (1 << 5)   /**< gl_context::Eval, EvalMap */
3137fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_FOG               (1 << 6)   /**< gl_context::Fog */
3138fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_HINT              (1 << 7)   /**< gl_context::Hint */
3139fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_LIGHT             (1 << 8)   /**< gl_context::Light */
3140fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_LINE              (1 << 9)   /**< gl_context::Line */
3141fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_PIXEL             (1 << 10)  /**< gl_context::Pixel */
3142fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_POINT             (1 << 11)  /**< gl_context::Point */
3143fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_POLYGON           (1 << 12)  /**< gl_context::Polygon */
3144fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_POLYGONSTIPPLE    (1 << 13)  /**< gl_context::PolygonStipple */
3145fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_SCISSOR           (1 << 14)  /**< gl_context::Scissor */
3146fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_STENCIL           (1 << 15)  /**< gl_context::Stencil */
3147fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_TEXTURE           (1 << 16)  /**< gl_context::Texture */
3148fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_TRANSFORM         (1 << 17)  /**< gl_context::Transform */
3149fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_VIEWPORT          (1 << 18)  /**< gl_context::Viewport */
3150fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_PACKUNPACK        (1 << 19)  /**< gl_context::Pack, Unpack */
3151fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_ARRAY             (1 << 20)  /**< gl_context::Array */
3152fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_RENDERMODE        (1 << 21)  /**< gl_context::RenderMode, etc */
3153fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_BUFFERS           (1 << 22)  /**< gl_context::Visual, DrawBuffer, */
3154fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_CURRENT_ATTRIB    (1 << 23)  /**< gl_context::Current */
3155fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_MULTISAMPLE       (1 << 24)  /**< gl_context::Multisample */
3156fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_TRACK_MATRIX      (1 << 25)  /**< gl_context::VertexProgram */
3157fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_PROGRAM           (1 << 26)  /**< New program/shader state */
3158fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_PROGRAM_CONSTANTS (1 << 27)
3159fb7efb1b194831cc6cb0b69291949ac693f20f25Brian Paul#define _NEW_BUFFER_OBJECT     (1 << 28)
3160e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák#define _NEW_FRAG_CLAMP        (1 << 29)
3161a98ceee0ee3692783047c6f8f9f6bf6afbf4dd3bPaul Berry#define _NEW_TRANSFORM_FEEDBACK (1 << 30) /**< gl_context::TransformFeedback */
3162576c8c592a4be7047a00b0c8fe3851b09f10d8d4Marek Olšák#define _NEW_VARYING_VP_INPUTS (1 << 31) /**< gl_context::varying_vp_inputs */
31635e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#define _NEW_ALL ~0
3164d44878e754e65550c0725feb76fe0cbab0ae5d93Paul Berry
3165d44878e754e65550c0725feb76fe0cbab0ae5d93Paul Berry/**
3166d44878e754e65550c0725feb76fe0cbab0ae5d93Paul Berry * We use _NEW_TRANSFORM for GL_RASTERIZER_DISCARD.  This #define is for
3167d44878e754e65550c0725feb76fe0cbab0ae5d93Paul Berry * clarity.
3168d44878e754e65550c0725feb76fe0cbab0ae5d93Paul Berry */
3169d44878e754e65550c0725feb76fe0cbab0ae5d93Paul Berry#define _NEW_RASTERIZER_DISCARD _NEW_TRANSFORM
31706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
31715e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
31725e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
31736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
31746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \name A bunch of flags that we think might be useful to drivers.
31756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3176f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg * Set in the __struct gl_contextRec::_TriangleCaps bitfield.
31775e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
31786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
317992c42d8170711d76568cd8caeaeacb2442814f49Brian Paul#define DD_SEPARATE_SPECULAR        (1 << 0)
318092c42d8170711d76568cd8caeaeacb2442814f49Brian Paul#define DD_TRI_LIGHT_TWOSIDE        (1 << 1)
318192c42d8170711d76568cd8caeaeacb2442814f49Brian Paul#define DD_TRI_UNFILLED             (1 << 2)
318292c42d8170711d76568cd8caeaeacb2442814f49Brian Paul#define DD_TRI_SMOOTH               (1 << 3)
318392c42d8170711d76568cd8caeaeacb2442814f49Brian Paul#define DD_TRI_STIPPLE              (1 << 4)
318492c42d8170711d76568cd8caeaeacb2442814f49Brian Paul#define DD_TRI_OFFSET               (1 << 5)
318592c42d8170711d76568cd8caeaeacb2442814f49Brian Paul#define DD_LINE_SMOOTH              (1 << 6)
318692c42d8170711d76568cd8caeaeacb2442814f49Brian Paul#define DD_LINE_STIPPLE             (1 << 7)
318792c42d8170711d76568cd8caeaeacb2442814f49Brian Paul#define DD_POINT_SMOOTH             (1 << 8)
318892c42d8170711d76568cd8caeaeacb2442814f49Brian Paul#define DD_POINT_ATTEN              (1 << 9)
31896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
31905e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
31913b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul
31926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
31931ed5fe5cbfb64c57997ec46684748f8ae516d19cBrian Paul * Composite state flags
31941ed5fe5cbfb64c57997ec46684748f8ae516d19cBrian Paul */
31951ed5fe5cbfb64c57997ec46684748f8ae516d19cBrian Paul/*@{*/
3196ee403ff0ba272f5be539ddc921d3fffb3d250cc4Brian Paul#define _MESA_NEW_NEED_EYE_COORDS         (_NEW_LIGHT |		\
3197ee403ff0ba272f5be539ddc921d3fffb3d250cc4Brian Paul                                           _NEW_TEXTURE |	\
3198ee403ff0ba272f5be539ddc921d3fffb3d250cc4Brian Paul                                           _NEW_POINT |		\
319968fc4ff1d7f749670684119647e0ef945d23dfa9Brian                                           _NEW_PROGRAM |	\
3200ee403ff0ba272f5be539ddc921d3fffb3d250cc4Brian Paul                                           _NEW_MODELVIEW)
32015edd7b8c46bbbaa59a421aa2c082374fc7dc101fBrian Paul
32025edd7b8c46bbbaa59a421aa2c082374fc7dc101fBrian Paul#define _MESA_NEW_SEPARATE_SPECULAR        (_NEW_LIGHT | \
32035edd7b8c46bbbaa59a421aa2c082374fc7dc101fBrian Paul                                            _NEW_FOG | \
32045edd7b8c46bbbaa59a421aa2c082374fc7dc101fBrian Paul                                            _NEW_PROGRAM)
32055edd7b8c46bbbaa59a421aa2c082374fc7dc101fBrian Paul
32065edd7b8c46bbbaa59a421aa2c082374fc7dc101fBrian Paul
32071ed5fe5cbfb64c57997ec46684748f8ae516d19cBrian Paul/*@}*/
32085e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
32095e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
32105e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
32115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
32125e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen/* This has to be included here. */
32135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "dd.h"
32145e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
32155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
32167721bf267b64ef28376f07daae7713814e91af35Brian/**
3217446abc2799a143c32c4c48472f3f964f9288a623Brian * Display list flags.
3218446abc2799a143c32c4c48472f3f964f9288a623Brian * Strictly this is a tnl-private concept, but it doesn't seem
321936a35c5614336bffdac4827c1e04bcaa8ab2fa27Keith Whitwell * worthwhile adding a tnl private structure just to hold this one bit
322036a35c5614336bffdac4827c1e04bcaa8ab2fa27Keith Whitwell * of information:
322136a35c5614336bffdac4827c1e04bcaa8ab2fa27Keith Whitwell */
3222446abc2799a143c32c4c48472f3f964f9288a623Brian#define DLIST_DANGLING_REFS     0x1
3223446abc2799a143c32c4c48472f3f964f9288a623Brian
32240001deef1108b77cf4879fff4647401fb68c421eBrian
32250001deef1108b77cf4879fff4647401fb68c421eBrian/** Opaque declaration of display list payload data type */
3226446abc2799a143c32c4c48472f3f964f9288a623Brianunion gl_dlist_node;
322736a35c5614336bffdac4827c1e04bcaa8ab2fa27Keith Whitwell
32287721bf267b64ef28376f07daae7713814e91af35Brian
32297721bf267b64ef28376f07daae7713814e91af35Brian/**
32307721bf267b64ef28376f07daae7713814e91af35Brian * Provide a location where information about a display list can be
323136a35c5614336bffdac4827c1e04bcaa8ab2fa27Keith Whitwell * collected.  Could be extended with driverPrivate structures,
323236a35c5614336bffdac4827c1e04bcaa8ab2fa27Keith Whitwell * etc. in the future.
323336a35c5614336bffdac4827c1e04bcaa8ab2fa27Keith Whitwell */
3234446abc2799a143c32c4c48472f3f964f9288a623Brianstruct gl_display_list
323536a35c5614336bffdac4827c1e04bcaa8ab2fa27Keith Whitwell{
3236446abc2799a143c32c4c48472f3f964f9288a623Brian   GLuint Name;
3237446abc2799a143c32c4c48472f3f964f9288a623Brian   GLbitfield Flags;  /**< DLIST_x flags */
3238446abc2799a143c32c4c48472f3f964f9288a623Brian   /** The dlist commands are in a linked list of nodes */
3239446abc2799a143c32c4c48472f3f964f9288a623Brian   union gl_dlist_node *Head;
324036a35c5614336bffdac4827c1e04bcaa8ab2fa27Keith Whitwell};
324136a35c5614336bffdac4827c1e04bcaa8ab2fa27Keith Whitwell
32424dafbc3dc75be565704f437016f70a63c48d1539Brian Paul
32434dafbc3dc75be565704f437016f70a63c48d1539Brian Paul/**
32444dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * State used during display list compilation and execution.
32454dafbc3dc75be565704f437016f70a63c48d1539Brian Paul */
32460e1bd2302537a9684158cb353b876af4ce6346e7Brianstruct gl_dlist_state
32474dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
3248ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint CallDepth;		/**< Current recursion calling depth */
324936a35c5614336bffdac4827c1e04bcaa8ab2fa27Keith Whitwell
32500001deef1108b77cf4879fff4647401fb68c421eBrian   struct gl_display_list *CurrentList; /**< List currently being compiled */
3251446abc2799a143c32c4c48472f3f964f9288a623Brian   union gl_dlist_node *CurrentBlock; /**< Pointer to current block of nodes */
3252ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLuint CurrentPos;		/**< Index into current block of nodes */
325336a35c5614336bffdac4827c1e04bcaa8ab2fa27Keith Whitwell
3254ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLvertexformat ListVtxfmt;
3255ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
3256ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte ActiveAttribSize[VERT_ATTRIB_MAX];
3257ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat CurrentAttrib[VERT_ATTRIB_MAX][4];
3258ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
3259ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLubyte ActiveMaterialSize[MAT_ATTRIB_MAX];
3260ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell   GLfloat CurrentMaterial[MAT_ATTRIB_MAX][4];
3261ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
326247173cf67f0ed55012b0820397f6d620d8ad4473Keith Whitwell   struct {
326347173cf67f0ed55012b0820397f6d620d8ad4473Keith Whitwell      /* State known to have been set by the currently-compiling display
326447173cf67f0ed55012b0820397f6d620d8ad4473Keith Whitwell       * list.  Used to eliminate some redundant state changes.
326547173cf67f0ed55012b0820397f6d620d8ad4473Keith Whitwell       */
326647173cf67f0ed55012b0820397f6d620d8ad4473Keith Whitwell      GLenum ShadeModel;
326747173cf67f0ed55012b0820397f6d620d8ad4473Keith Whitwell   } Current;
3268ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell};
3269ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
3270ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled/**
3271ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled * An error, warning, or other piece of debug information for an application
3272ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled * to consume via GL_ARB_debug_output.
3273ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled */
3274ed087ee49808a692ce8a0389fcf6c9da27f99d8enobledstruct gl_debug_msg
3275ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled{
3276ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   GLenum source;
3277ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   GLenum type;
3278ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   GLuint id;
3279ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   GLenum severity;
3280ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   GLsizei length;
3281ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   GLcharARB *message;
3282ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled};
3283ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled
328476414cded8dcfc274fe47f347c64986680e8b95anobledtypedef enum {
328576414cded8dcfc274fe47f347c64986680e8b95anobled   API_ERROR_UNKNOWN,
328676414cded8dcfc274fe47f347c64986680e8b95anobled   API_ERROR_COUNT
328776414cded8dcfc274fe47f347c64986680e8b95anobled} gl_api_error;
328876414cded8dcfc274fe47f347c64986680e8b95anobled
328976414cded8dcfc274fe47f347c64986680e8b95anobledtypedef enum {
329076414cded8dcfc274fe47f347c64986680e8b95anobled   WINSYS_ERROR_UNKNOWN,
329176414cded8dcfc274fe47f347c64986680e8b95anobled   WINSYS_ERROR_COUNT
329276414cded8dcfc274fe47f347c64986680e8b95anobled} gl_winsys_error;
329376414cded8dcfc274fe47f347c64986680e8b95anobled
329476414cded8dcfc274fe47f347c64986680e8b95anobledtypedef enum {
329576414cded8dcfc274fe47f347c64986680e8b95anobled   SHADER_ERROR_UNKNOWN,
329676414cded8dcfc274fe47f347c64986680e8b95anobled   SHADER_ERROR_COUNT
329776414cded8dcfc274fe47f347c64986680e8b95anobled} gl_shader_error;
329876414cded8dcfc274fe47f347c64986680e8b95anobled
329976414cded8dcfc274fe47f347c64986680e8b95anobledtypedef enum {
330076414cded8dcfc274fe47f347c64986680e8b95anobled   OTHER_ERROR_UNKNOWN,
330176414cded8dcfc274fe47f347c64986680e8b95anobled   OTHER_ERROR_OUT_OF_MEMORY,
330276414cded8dcfc274fe47f347c64986680e8b95anobled   OTHER_ERROR_COUNT
330376414cded8dcfc274fe47f347c64986680e8b95anobled} gl_other_error;
330476414cded8dcfc274fe47f347c64986680e8b95anobled
330541308d969921d28a3159099420c145d2dcf10fe6nobledstruct gl_client_namespace
330641308d969921d28a3159099420c145d2dcf10fe6nobled{
330741308d969921d28a3159099420c145d2dcf10fe6nobled   struct _mesa_HashTable *IDs;
330841308d969921d28a3159099420c145d2dcf10fe6nobled   unsigned ZeroID; /* a HashTable won't take zero, so store its state here */
330941308d969921d28a3159099420c145d2dcf10fe6nobled   struct simple_node Severity[3]; /* lists of IDs in the hash table */
331041308d969921d28a3159099420c145d2dcf10fe6nobled};
331141308d969921d28a3159099420c145d2dcf10fe6nobled
33124667cb2162d02f5b0fe620a5394aee92c725fb86nobledstruct gl_client_debug
33134667cb2162d02f5b0fe620a5394aee92c725fb86nobled{
33144667cb2162d02f5b0fe620a5394aee92c725fb86nobled   GLboolean Defaults[3][2][6]; /* severity, source, type */
331541308d969921d28a3159099420c145d2dcf10fe6nobled   struct gl_client_namespace Namespaces[2][6]; /* source, type */
33164667cb2162d02f5b0fe620a5394aee92c725fb86nobled};
33174667cb2162d02f5b0fe620a5394aee92c725fb86nobled
3318ed087ee49808a692ce8a0389fcf6c9da27f99d8enobledstruct gl_debug_state
3319ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled{
3320ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   GLDEBUGPROCARB Callback;
3321ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   GLvoid *CallbackData;
3322ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   GLboolean SyncOutput;
332376414cded8dcfc274fe47f347c64986680e8b95anobled   GLboolean ApiErrors[API_ERROR_COUNT];
332476414cded8dcfc274fe47f347c64986680e8b95anobled   GLboolean WinsysErrors[WINSYS_ERROR_COUNT];
332576414cded8dcfc274fe47f347c64986680e8b95anobled   GLboolean ShaderErrors[SHADER_ERROR_COUNT];
332676414cded8dcfc274fe47f347c64986680e8b95anobled   GLboolean OtherErrors[OTHER_ERROR_COUNT];
33274667cb2162d02f5b0fe620a5394aee92c725fb86nobled   struct gl_client_debug ClientIDs;
3328ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   struct gl_debug_msg Log[MAX_DEBUG_LOGGED_MESSAGES];
3329ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   GLint NumMessages;
3330ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   GLint NextMsg;
3331ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   GLint NextMsgLength; /* redundant, but copied here from Log[NextMsg].length
3332ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled                           for the sake of the offsetof() code in get.c */
3333ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled};
3334cfae745a8bcbc108611178b69c645cfe29f28b37Brian Paul
33352ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg/**
33362ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg * Enum for the OpenGL APIs we know about and may support.
33372ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg */
3338cfae745a8bcbc108611178b69c645cfe29f28b37Brian Paultypedef enum
3339cfae745a8bcbc108611178b69c645cfe29f28b37Brian Paul{
33401c29b73f4d9f633e32c03bebc8d505b321d833d9Jordan Justen   API_OPENGL,      /* legacy / compatibility contexts */
33412ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg   API_OPENGLES,
33421c29b73f4d9f633e32c03bebc8d505b321d833d9Jordan Justen   API_OPENGLES2,
33431c29b73f4d9f633e32c03bebc8d505b321d833d9Jordan Justen   API_OPENGL_CORE,
33448dc79ae7d73cf6711c2182ff9a5d37ef6c989d23Imre Deak
33458dc79ae7d73cf6711c2182ff9a5d37ef6c989d23Imre Deak   API_LAST = API_OPENGL_CORE,
33462ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg} gl_api;
3347d8aa0269cdadba1608522287bcb3b446c5848c09Gareth Hughes
3348c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák/**
3349c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák * Driver-specific state flags.
3350c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák *
3351c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák * These are or'd with gl_context::NewDriverState to notify a driver about
3352c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák * a state change. The driver sets the flags at context creation and
3353c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák * the meaning of the bits set is opaque to core Mesa.
3354c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák */
3355c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšákstruct gl_driver_flags
3356c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák{
3357c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák   GLbitfield NewArray;             /**< Vertex array state */
3358c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák};
3359cfae745a8bcbc108611178b69c645cfe29f28b37Brian Paul
33605527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholtstruct gl_uniform_buffer_binding
33615527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt{
33625527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt   struct gl_buffer_object *BufferObject;
33635527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt   /** Start of uniform block data in the buffer */
33645527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt   GLintptr Offset;
33655527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt   /** Size of data allowed to be referenced from the buffer (in bytes) */
33665527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt   GLsizeiptr Size;
33675527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt   /**
33685527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt    * glBindBufferBase() indicates that the Size should be ignored and only
33695527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt    * limited by the current size of the BufferObject.
33705527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt    */
33715527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt   GLboolean AutomaticSize;
33725527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt};
33735527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt
33744c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul/**
33754dafbc3dc75be565704f437016f70a63c48d1539Brian Paul * Mesa rendering context.
33766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
33774c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul * This is the central context data structure for Mesa.  Almost all
33784c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul * OpenGL state is contained in this structure.
33799a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul * Think of this as a base class from which device drivers will derive
33809a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul * sub classes.
33814dafbc3dc75be565704f437016f70a63c48d1539Brian Paul *
3382f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg * The struct gl_context typedef names this structure.
33835e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen */
3384f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstruct gl_context
33854dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
33866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /** State possibly shared with other contexts in the address space */
33875e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_shared_state *Shared;
33885e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
33896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /** \name API function pointer tables */
33906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
33912ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg   gl_api API;
33926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct _glapi_table *Save;	/**< Display list save functions */
33936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct _glapi_table *Exec;	/**< Execute functions */
33944c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul   struct _glapi_table *CurrentDispatch;  /**< == Save or Exec !! */
33956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
3396ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes
3397d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg   struct gl_config Visual;
339831aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg   struct gl_framebuffer *DrawBuffer;	/**< buffer for writing */
339931aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg   struct gl_framebuffer *ReadBuffer;	/**< buffer for reading */
340031aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg   struct gl_framebuffer *WinSysDrawBuffer;  /**< set with MakeCurrent */
340131aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg   struct gl_framebuffer *WinSysReadBuffer;  /**< set with MakeCurrent */
34025e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
34034c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul   /**
34044c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul    * Device driver function pointer table
34054c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul    */
34065e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct dd_function_table Driver;
34075e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
34084c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul   void *DriverCtx;	/**< Points to device driver context/state */
34095e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
34106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /** Core/Driver constants */
34115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_constants Const;
34125e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
34136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /** \name The various 4x4 matrix stacks */
34146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
34150e1bd2302537a9684158cb353b876af4ce6346e7Brian   struct gl_matrix_stack ModelviewMatrixStack;
34160e1bd2302537a9684158cb353b876af4ce6346e7Brian   struct gl_matrix_stack ProjectionMatrixStack;
3417e9b34885b8ff2ccb67a801cd1ce07e0df1b0e397Brian Paul   struct gl_matrix_stack TextureMatrixStack[MAX_TEXTURE_UNITS];
34180e1bd2302537a9684158cb353b876af4ce6346e7Brian   struct gl_matrix_stack ProgramMatrixStack[MAX_PROGRAM_MATRICES];
34190e1bd2302537a9684158cb353b876af4ce6346e7Brian   struct gl_matrix_stack *CurrentStack; /**< Points to one of the above stacks */
34206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
34215e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
34226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /** Combined modelview and projection matrix */
34235e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLmatrix _ModelProjectMatrix;
34245e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
34256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /** \name Display lists */
34260e1bd2302537a9684158cb353b876af4ce6346e7Brian   struct gl_dlist_state ListState;
3427ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
34286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean ExecuteFlag;	/**< Execute GL commands? */
34296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLboolean CompileFlag;	/**< Compile GL commands into display list? */
34306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
34313c2f8b22b9b87ccc06e33ecc088703c68d8230d8Brian Paul   /** Extension information */
34325e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_extensions Extensions;
34335e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
34349c1b41879aab2ff7386c547a2ccce7686c018cf5Eric Anholt   /** GL version integer, for example 31 for GL 3.1, or 20 for GLES 2.0. */
34359c1b41879aab2ff7386c547a2ccce7686c018cf5Eric Anholt   GLuint Version;
3436e16fd07225b07e87b79015988b9806aefa032dd3Brian Paul   char *VersionString;
3437e16fd07225b07e87b79015988b9806aefa032dd3Brian Paul
34383c2f8b22b9b87ccc06e33ecc088703c68d8230d8Brian Paul   /** \name State attribute stack (for glPush/PopAttrib) */
34396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
34405e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLuint AttribStackDepth;
34415e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_attrib_node *AttribStack[MAX_ATTRIB_STACK_DEPTH];
34426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
34435e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
34446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /** \name Renderer attribute groups
34456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    *
34466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    * We define a struct for each attribute group to make pushing and popping
34476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    * attributes easy.  Also it's a good organization.
34486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    */
34496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
34503c2f8b22b9b87ccc06e33ecc088703c68d8230d8Brian Paul   struct gl_accum_attrib	Accum;		/**< Accum buffer attributes */
34513c2f8b22b9b87ccc06e33ecc088703c68d8230d8Brian Paul   struct gl_colorbuffer_attrib	Color;		/**< Color buffer attributes */
34526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_current_attrib	Current;	/**< Current attributes */
34536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_depthbuffer_attrib	Depth;		/**< Depth buffer attributes */
34546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_eval_attrib	Eval;		/**< Eval attributes */
34556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_fog_attrib		Fog;		/**< Fog attributes */
34566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_hint_attrib	Hint;		/**< Hint attributes */
34576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_light_attrib	Light;		/**< Light attributes */
34586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_line_attrib	Line;		/**< Line attributes */
34596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_list_attrib	List;		/**< List attributes */
3460736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul   struct gl_multisample_attrib Multisample;
34616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_pixel_attrib	Pixel;		/**< Pixel attributes */
34626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_point_attrib	Point;		/**< Point attributes */
34636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_polygon_attrib	Polygon;	/**< Polygon attributes */
34646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLuint PolygonStipple[32];			/**< Polygon stipple */
34656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_scissor_attrib	Scissor;	/**< Scissor attributes */
34666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_stencil_attrib	Stencil;	/**< Stencil buffer attributes */
34676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_texture_attrib	Texture;	/**< Texture attributes */
34686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_transform_attrib	Transform;	/**< Transformation attributes */
34696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_viewport_attrib	Viewport;	/**< Viewport attributes */
34706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
34716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
34726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /** \name Client attribute stack */
34736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
34745e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLuint ClientAttribStackDepth;
34755e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   struct gl_attrib_node *ClientAttribStack[MAX_CLIENT_ATTRIB_STACK_DEPTH];
34766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
34775e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
34786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /** \name Client attribute groups */
34796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
34806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_array_attrib	Array;	/**< Vertex arrays */
34816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_pixelstore_attrib	Pack;	/**< Pixel packing */
34826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_pixelstore_attrib	Unpack;	/**< Pixel unpacking */
34837a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul   struct gl_pixelstore_attrib	DefaultPacking;	/**< Default params */
34844dafbc3dc75be565704f437016f70a63c48d1539Brian Paul   /*@}*/
34854dafbc3dc75be565704f437016f70a63c48d1539Brian Paul
34864dafbc3dc75be565704f437016f70a63c48d1539Brian Paul   /** \name Other assorted state (not pushed/popped on attribute stack) */
34874dafbc3dc75be565704f437016f70a63c48d1539Brian Paul   /*@{*/
3488b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian   struct gl_pixelmaps          PixelMaps;
34895e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
34906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_evaluators EvalMap;   /**< All evaluators */
34916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_feedback   Feedback;  /**< Feedback */
34926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   struct gl_selection  Select;    /**< Selection */
34935e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
3494bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   struct gl_program_state Program;  /**< general program state */
3495bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   struct gl_vertex_program_state VertexProgram;
3496bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   struct gl_fragment_program_state FragmentProgram;
3497da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct gl_geometry_program_state GeometryProgram;
3498bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   struct gl_ati_fragment_shader_state ATIFragmentShader;
3499848ff851575241454935c205eace88e799966563Brian Paul
35000bf5dbe002a64e198f55724cc1542602c012490fBrian   struct gl_shader_state Shader; /**< GLSL shader object state */
35016d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri   struct gl_shader_compiler_options ShaderCompilerOptions[MESA_SHADER_TYPES];
3502bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul
3503bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   struct gl_query_state Query;  /**< occlusion, timer queries */
350496a30b06dbc60ff63392cf8ae9dcb3d245b41c27Brian Paul
350584870e215667c999202be31057df6e31a0389bb7Brian Paul   struct gl_transform_feedback_state TransformFeedback;
3506066f0097959fe705c57556b658a09af0ba6be8fbBrian Paul
350796a30b06dbc60ff63392cf8ae9dcb3d245b41c27Brian Paul   struct gl_buffer_object *CopyReadBuffer; /**< GL_ARB_copy_buffer */
350896a30b06dbc60ff63392cf8ae9dcb3d245b41c27Brian Paul   struct gl_buffer_object *CopyWriteBuffer; /**< GL_ARB_copy_buffer */
3509c5c696e7fbce2e0b598ed5d4b1d73f086a664a57Eric Anholt
3510c5c696e7fbce2e0b598ed5d4b1d73f086a664a57Eric Anholt   /**
3511c5c696e7fbce2e0b598ed5d4b1d73f086a664a57Eric Anholt    * Current GL_ARB_uniform_buffer_object binding referenced by
3512c5c696e7fbce2e0b598ed5d4b1d73f086a664a57Eric Anholt    * GL_UNIFORM_BUFFER target for glBufferData, glMapBuffer, etc.
3513c5c696e7fbce2e0b598ed5d4b1d73f086a664a57Eric Anholt    */
3514c5c696e7fbce2e0b598ed5d4b1d73f086a664a57Eric Anholt   struct gl_buffer_object *UniformBuffer;
3515c5c696e7fbce2e0b598ed5d4b1d73f086a664a57Eric Anholt
35165527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt   /**
35175527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt    * Array of uniform buffers for GL_ARB_uniform_buffer_object and GL 3.1.
35185527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt    * This is set up using glBindBufferRange() or glBindBufferBase().  They are
35195527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt    * associated with uniform blocks by glUniformBlockBinding()'s state in the
35205527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt    * shader program.
35215527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt    */
35225527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt   struct gl_uniform_buffer_binding *UniformBufferBindings;
35235527c2d22027e9e27e55372d8adf2ba4ff855b53Eric Anholt
35244dafbc3dc75be565704f437016f70a63c48d1539Brian Paul   /*@}*/
3525b17a722ca3989e8563ee04cb2939f4835f8a171eBrian Paul
3526e9d9dab0cd8614898ecc2aceb49d8faf354cdbdfBrian Paul   struct gl_meta_state *Meta;  /**< for "meta" operations */
3527e9d9dab0cd8614898ecc2aceb49d8faf354cdbdfBrian Paul
3528f90b5936d07c4c8f280318ab5cf5894ecb67aef6Chia-I Wu   /* GL_EXT_framebuffer_object */
35292c6f911e10761c0946261d494bf149b19072821dBrian Paul   struct gl_renderbuffer *CurrentRenderbuffer;
35303deaa01c2bd576ae81fc6d3ea67c583cb3c22159Brian Paul
35316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum ErrorValue;        /**< Last error code */
3532fdeb77899052302053459b8a840a747346e30468Keith Whitwell
35336b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   /* GL_ARB_robustness */
35346b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   GLenum ResetStatus;
35356b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul
3536fdeb77899052302053459b8a840a747346e30468Keith Whitwell   /**
3537fdeb77899052302053459b8a840a747346e30468Keith Whitwell    * Recognize and silence repeated error debug messages in buggy apps.
3538fdeb77899052302053459b8a840a747346e30468Keith Whitwell    */
3539fdeb77899052302053459b8a840a747346e30468Keith Whitwell   const char *ErrorDebugFmtString;
3540fdeb77899052302053459b8a840a747346e30468Keith Whitwell   GLuint ErrorDebugCount;
3541fdeb77899052302053459b8a840a747346e30468Keith Whitwell
3542ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   /* GL_ARB_debug_output */
3543ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled   struct gl_debug_state Debug;
3544ed087ee49808a692ce8a0389fcf6c9da27f99d8enobled
35456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   GLenum RenderMode;        /**< either GL_RENDER, GL_SELECT, GL_FEEDBACK */
3546e00ac11d4dd05c56584622dc2707bbdcfe4b2707Brian Paul   GLbitfield NewState;      /**< bitwise-or of _NEW_* flags */
3547c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák   GLbitfield NewDriverState;/**< bitwise-or of flags from DriverFlags */
3548c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák
3549c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák   struct gl_driver_flags DriverFlags;
35505e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
35513f856c6b6b7fa95ef97a8712876de88d7d57932eBrian Paul   GLboolean ViewportInitialized;  /**< has viewport size been initialized? */
35523f856c6b6b7fa95ef97a8712876de88d7d57932eBrian Paul
3553dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich   GLbitfield64 varying_vp_inputs;  /**< mask of VERT_BIT_* flags */
35541680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell
35554dafbc3dc75be565704f437016f70a63c48d1539Brian Paul   /** \name Derived state */
35566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
3557ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian   /** Bitwise-or of DD_* flags.  Note that this bitfield may be used before
3558ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian    * state validation so they need to always be current.
3559ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian    */
3560ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian   GLbitfield _TriangleCaps;
3561e00ac11d4dd05c56584622dc2707bbdcfe4b2707Brian Paul   GLbitfield _ImageTransferState;/**< bitwise-or of IMAGE_*_BIT flags */
35625e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat _EyeZDir[3];
35635e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLfloat _ModelViewInvScale;
3564e00ac11d4dd05c56584622dc2707bbdcfe4b2707Brian Paul   GLboolean _NeedEyeCoords;
3565e00ac11d4dd05c56584622dc2707bbdcfe4b2707Brian Paul   GLboolean _ForceEyeCoords;
35665e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
3567bedd20743b80b5a6d7d9954e4479a44a76c7ea02Brian Paul   GLuint TextureStateTimestamp; /**< detect changes to shared state */
35685ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
356933e9ac20e3b399c6ec6ec2f586a9402b68590992Brian Paul   struct gl_list_extensions *ListExt; /**< driver dlist extensions */
35705e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
35716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /** \name For debugging/development only */
35726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
35735e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   GLboolean FirstTimeCurrent;
35746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
35755e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
3576d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   /** software compression/decompression supported or not */
3577d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   GLboolean Mesa_DXTn;
3578d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
3579001d944fd50e0579739b8865e6e09be5d267c05aEric Anholt   GLboolean TextureFormatSupported[MESA_FORMAT_COUNT];
3580001d944fd50e0579739b8865e6e09be5d267c05aEric Anholt
3581113403ef51e2ec764db061aabf569d6f1a1a3ef0Keith Whitwell   /**
3582113403ef51e2ec764db061aabf569d6f1a1a3ef0Keith Whitwell    * Use dp4 (rather than mul/mad) instructions for position
3583113403ef51e2ec764db061aabf569d6f1a1a3ef0Keith Whitwell    * transformation?
3584113403ef51e2ec764db061aabf569d6f1a1a3ef0Keith Whitwell    */
3585113403ef51e2ec764db061aabf569d6f1a1a3ef0Keith Whitwell   GLboolean mvp_with_dp4;
3586113403ef51e2ec764db061aabf569d6f1a1a3ef0Keith Whitwell
3587aee96806f049c17384a8edc11acce76257d98a57Paul Berry   GLboolean RasterDiscard;  /**< GL_RASTERIZER_DISCARD */
3588aee96806f049c17384a8edc11acce76257d98a57Paul Berry
35896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /**
35906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    * \name Hooks for module contexts.
35916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    *
35926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    * These will eventually live in the driver or elsewhere.
35935e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    */
35946dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@{*/
35955e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   void *swrast_context;
35965e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   void *swsetup_context;
35975e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   void *swtnl_context;
35985e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   void *swtnl_im;
3599b939adfa155f2b3ca5c5226e86da85629654d79bKeith Whitwell   struct st_context *st;
3600cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   void *aelt_context;
36016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /*@}*/
36025e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen};
36035e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
36045e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
36051984aabe8362ee2b29711d2fa08e56e341eafdddBrian Paul#ifdef DEBUG
3606ba8f6172bdfb44594537a304225b54152584d701Gareth Hughesextern int MESA_VERBOSE;
36075e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansenextern int MESA_DEBUG_FLAGS;
3608b65bc4f87b356cf6228151cd2f341432e80dc6b8Brian Paul# define MESA_FUNCTION __FUNCTION__
36095e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#else
36105e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen# define MESA_VERBOSE 0
36115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen# define MESA_DEBUG_FLAGS 0
3612b65bc4f87b356cf6228151cd2f341432e80dc6b8Brian Paul# define MESA_FUNCTION "a function"
36135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen# ifndef NDEBUG
36145e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#  define NDEBUG
36155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen# endif
36165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#endif
36175e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
36185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
3619ade1cc992410c8696fdfe0f84fb613fd0dc8099fBrian Paul/** The MESA_VERBOSE var is a bitmask of these flags */
36204dafbc3dc75be565704f437016f70a63c48d1539Brian Paulenum _verbose
36214dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
3622b3678f108044302dc6f50a14568d47c1b345df9bGareth Hughes   VERBOSE_VARRAY		= 0x0001,
3623b3678f108044302dc6f50a14568d47c1b345df9bGareth Hughes   VERBOSE_TEXTURE		= 0x0002,
3624d9099f8602eb6d15e9fc2e0b0987e7a58fb98b68Brian Paul   VERBOSE_MATERIAL		= 0x0004,
3625b3678f108044302dc6f50a14568d47c1b345df9bGareth Hughes   VERBOSE_PIPELINE		= 0x0008,
3626b3678f108044302dc6f50a14568d47c1b345df9bGareth Hughes   VERBOSE_DRIVER		= 0x0010,
3627b3678f108044302dc6f50a14568d47c1b345df9bGareth Hughes   VERBOSE_STATE		= 0x0020,
3628b3678f108044302dc6f50a14568d47c1b345df9bGareth Hughes   VERBOSE_API			= 0x0040,
3629306d3fcdbad523428501833405e47e9897896defKeith Whitwell   VERBOSE_DISPLAY_LIST		= 0x0100,
3630306d3fcdbad523428501833405e47e9897896defKeith Whitwell   VERBOSE_LIGHTING		= 0x0200,
3631306d3fcdbad523428501833405e47e9897896defKeith Whitwell   VERBOSE_PRIMS		= 0x0400,
3632269e3895d9837ac7303b91948f003ca5c12c0fe4Keith Whitwell   VERBOSE_VERTS		= 0x0800,
3633131d42573ce1fc120c8ef75634979b6206e1eb0aBrian Paul   VERBOSE_DISASSEM		= 0x1000,
36342fd5cb713338e91999a036399a4bea4406687ca0Brian Paul   VERBOSE_DRAW                 = 0x2000,
3635042a333028eba49f21b45cafaf9dd15d34c68033Kristian Høgsberg   VERBOSE_SWAPBUFFERS          = 0x4000
3636ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes};
36375e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
36385e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
3639ade1cc992410c8696fdfe0f84fb613fd0dc8099fBrian Paul/** The MESA_DEBUG_FLAGS var is a bitmask of these flags */
36404dafbc3dc75be565704f437016f70a63c48d1539Brian Paulenum _debug
36414dafbc3dc75be565704f437016f70a63c48d1539Brian Paul{
3642da35c2b38c1419690b6647fbc2f930cb04c6877fBrian Paul   DEBUG_SILENT                 = (1 << 0),
364393bcf7825d023d3d7108bc47a7a0929338bba6b9Brian Paul   DEBUG_ALWAYS_FLUSH		= (1 << 1),
364493bcf7825d023d3d7108bc47a7a0929338bba6b9Brian Paul   DEBUG_INCOMPLETE_TEXTURE     = (1 << 2),
364593bcf7825d023d3d7108bc47a7a0929338bba6b9Brian Paul   DEBUG_INCOMPLETE_FBO         = (1 << 3)
3646ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes};
36475e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
36485e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
36495e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
365063e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#ifdef __cplusplus
365163e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca}
365263e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#endif
365363e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
36541d5a68970f1d8fcca29ce24e6667a143733197f0Brian Paul#endif /* MTYPES_H */
3655