1*61046927SAndroid Build Coastguard Worker /**
2*61046927SAndroid Build Coastguard Worker * \file enable.c
3*61046927SAndroid Build Coastguard Worker * Enable/disable/query GL capabilities.
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker /*
7*61046927SAndroid Build Coastguard Worker * Mesa 3-D graphics library
8*61046927SAndroid Build Coastguard Worker *
9*61046927SAndroid Build Coastguard Worker * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
12*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
13*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
14*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
16*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
17*61046927SAndroid Build Coastguard Worker *
18*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
19*61046927SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
20*61046927SAndroid Build Coastguard Worker *
21*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
25*61046927SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
26*61046927SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27*61046927SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
28*61046927SAndroid Build Coastguard Worker */
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
32*61046927SAndroid Build Coastguard Worker #include "arrayobj.h"
33*61046927SAndroid Build Coastguard Worker #include "blend.h"
34*61046927SAndroid Build Coastguard Worker #include "clip.h"
35*61046927SAndroid Build Coastguard Worker #include "context.h"
36*61046927SAndroid Build Coastguard Worker #include "debug_output.h"
37*61046927SAndroid Build Coastguard Worker #include "draw_validate.h"
38*61046927SAndroid Build Coastguard Worker #include "enable.h"
39*61046927SAndroid Build Coastguard Worker #include "errors.h"
40*61046927SAndroid Build Coastguard Worker #include "light.h"
41*61046927SAndroid Build Coastguard Worker #include "mtypes.h"
42*61046927SAndroid Build Coastguard Worker #include "enums.h"
43*61046927SAndroid Build Coastguard Worker #include "state.h"
44*61046927SAndroid Build Coastguard Worker #include "texstate.h"
45*61046927SAndroid Build Coastguard Worker #include "varray.h"
46*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_cb_bitmap.h"
49*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_context.h"
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker void
_mesa_update_derived_primitive_restart_state(struct gl_context * ctx)52*61046927SAndroid Build Coastguard Worker _mesa_update_derived_primitive_restart_state(struct gl_context *ctx)
53*61046927SAndroid Build Coastguard Worker {
54*61046927SAndroid Build Coastguard Worker if (ctx->Array.PrimitiveRestart ||
55*61046927SAndroid Build Coastguard Worker ctx->Array.PrimitiveRestartFixedIndex) {
56*61046927SAndroid Build Coastguard Worker unsigned restart_index[3] = {
57*61046927SAndroid Build Coastguard Worker _mesa_primitive_restart_index(ctx, 1),
58*61046927SAndroid Build Coastguard Worker _mesa_primitive_restart_index(ctx, 2),
59*61046927SAndroid Build Coastguard Worker _mesa_primitive_restart_index(ctx, 4),
60*61046927SAndroid Build Coastguard Worker };
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker ctx->Array._RestartIndex[0] = restart_index[0];
63*61046927SAndroid Build Coastguard Worker ctx->Array._RestartIndex[1] = restart_index[1];
64*61046927SAndroid Build Coastguard Worker ctx->Array._RestartIndex[2] = restart_index[2];
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker /* Enable primitive restart only when the restart index can have an
67*61046927SAndroid Build Coastguard Worker * effect. This is required for correctness in AMD GFX8 support.
68*61046927SAndroid Build Coastguard Worker * Other hardware may also benefit from taking a faster, non-restart path
69*61046927SAndroid Build Coastguard Worker * when possible.
70*61046927SAndroid Build Coastguard Worker */
71*61046927SAndroid Build Coastguard Worker ctx->Array._PrimitiveRestart[0] = true && restart_index[0] <= UINT8_MAX;
72*61046927SAndroid Build Coastguard Worker ctx->Array._PrimitiveRestart[1] = true && restart_index[1] <= UINT16_MAX;
73*61046927SAndroid Build Coastguard Worker ctx->Array._PrimitiveRestart[2] = true;
74*61046927SAndroid Build Coastguard Worker } else {
75*61046927SAndroid Build Coastguard Worker ctx->Array._PrimitiveRestart[0] = false;
76*61046927SAndroid Build Coastguard Worker ctx->Array._PrimitiveRestart[1] = false;
77*61046927SAndroid Build Coastguard Worker ctx->Array._PrimitiveRestart[2] = false;
78*61046927SAndroid Build Coastguard Worker }
79*61046927SAndroid Build Coastguard Worker }
80*61046927SAndroid Build Coastguard Worker
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker /**
83*61046927SAndroid Build Coastguard Worker * Helper to enable/disable VAO client-side state.
84*61046927SAndroid Build Coastguard Worker */
85*61046927SAndroid Build Coastguard Worker static void
vao_state(struct gl_context * ctx,struct gl_vertex_array_object * vao,gl_vert_attrib attr,GLboolean state)86*61046927SAndroid Build Coastguard Worker vao_state(struct gl_context *ctx, struct gl_vertex_array_object* vao,
87*61046927SAndroid Build Coastguard Worker gl_vert_attrib attr, GLboolean state)
88*61046927SAndroid Build Coastguard Worker {
89*61046927SAndroid Build Coastguard Worker if (state)
90*61046927SAndroid Build Coastguard Worker _mesa_enable_vertex_array_attrib(ctx, vao, attr);
91*61046927SAndroid Build Coastguard Worker else
92*61046927SAndroid Build Coastguard Worker _mesa_disable_vertex_array_attrib(ctx, vao, attr);
93*61046927SAndroid Build Coastguard Worker }
94*61046927SAndroid Build Coastguard Worker
95*61046927SAndroid Build Coastguard Worker
96*61046927SAndroid Build Coastguard Worker /**
97*61046927SAndroid Build Coastguard Worker * Helper to enable/disable client-side state.
98*61046927SAndroid Build Coastguard Worker */
99*61046927SAndroid Build Coastguard Worker static void
client_state(struct gl_context * ctx,struct gl_vertex_array_object * vao,GLenum cap,GLboolean state)100*61046927SAndroid Build Coastguard Worker client_state(struct gl_context *ctx, struct gl_vertex_array_object* vao,
101*61046927SAndroid Build Coastguard Worker GLenum cap, GLboolean state)
102*61046927SAndroid Build Coastguard Worker {
103*61046927SAndroid Build Coastguard Worker switch (cap) {
104*61046927SAndroid Build Coastguard Worker case GL_VERTEX_ARRAY:
105*61046927SAndroid Build Coastguard Worker vao_state(ctx, vao, VERT_ATTRIB_POS, state);
106*61046927SAndroid Build Coastguard Worker break;
107*61046927SAndroid Build Coastguard Worker case GL_NORMAL_ARRAY:
108*61046927SAndroid Build Coastguard Worker vao_state(ctx, vao, VERT_ATTRIB_NORMAL, state);
109*61046927SAndroid Build Coastguard Worker break;
110*61046927SAndroid Build Coastguard Worker case GL_COLOR_ARRAY:
111*61046927SAndroid Build Coastguard Worker vao_state(ctx, vao, VERT_ATTRIB_COLOR0, state);
112*61046927SAndroid Build Coastguard Worker break;
113*61046927SAndroid Build Coastguard Worker case GL_INDEX_ARRAY:
114*61046927SAndroid Build Coastguard Worker vao_state(ctx, vao, VERT_ATTRIB_COLOR_INDEX, state);
115*61046927SAndroid Build Coastguard Worker break;
116*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COORD_ARRAY:
117*61046927SAndroid Build Coastguard Worker vao_state(ctx, vao, VERT_ATTRIB_TEX(ctx->Array.ActiveTexture), state);
118*61046927SAndroid Build Coastguard Worker break;
119*61046927SAndroid Build Coastguard Worker case GL_EDGE_FLAG_ARRAY:
120*61046927SAndroid Build Coastguard Worker vao_state(ctx, vao, VERT_ATTRIB_EDGEFLAG, state);
121*61046927SAndroid Build Coastguard Worker break;
122*61046927SAndroid Build Coastguard Worker case GL_FOG_COORDINATE_ARRAY_EXT:
123*61046927SAndroid Build Coastguard Worker vao_state(ctx, vao, VERT_ATTRIB_FOG, state);
124*61046927SAndroid Build Coastguard Worker break;
125*61046927SAndroid Build Coastguard Worker case GL_SECONDARY_COLOR_ARRAY_EXT:
126*61046927SAndroid Build Coastguard Worker vao_state(ctx, vao, VERT_ATTRIB_COLOR1, state);
127*61046927SAndroid Build Coastguard Worker break;
128*61046927SAndroid Build Coastguard Worker
129*61046927SAndroid Build Coastguard Worker case GL_POINT_SIZE_ARRAY_OES:
130*61046927SAndroid Build Coastguard Worker if (ctx->VertexProgram.PointSizeEnabled != state) {
131*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, ctx->st->lower_point_size ? _NEW_PROGRAM : 0,
132*61046927SAndroid Build Coastguard Worker 0);
133*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
134*61046927SAndroid Build Coastguard Worker ctx->VertexProgram.PointSizeEnabled = state;
135*61046927SAndroid Build Coastguard Worker }
136*61046927SAndroid Build Coastguard Worker vao_state(ctx, vao, VERT_ATTRIB_POINT_SIZE, state);
137*61046927SAndroid Build Coastguard Worker break;
138*61046927SAndroid Build Coastguard Worker
139*61046927SAndroid Build Coastguard Worker /* GL_NV_primitive_restart */
140*61046927SAndroid Build Coastguard Worker case GL_PRIMITIVE_RESTART_NV:
141*61046927SAndroid Build Coastguard Worker if (!_mesa_has_NV_primitive_restart(ctx))
142*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
143*61046927SAndroid Build Coastguard Worker if (ctx->Array.PrimitiveRestart == state)
144*61046927SAndroid Build Coastguard Worker return;
145*61046927SAndroid Build Coastguard Worker
146*61046927SAndroid Build Coastguard Worker ctx->Array.PrimitiveRestart = state;
147*61046927SAndroid Build Coastguard Worker _mesa_update_derived_primitive_restart_state(ctx);
148*61046927SAndroid Build Coastguard Worker return;
149*61046927SAndroid Build Coastguard Worker
150*61046927SAndroid Build Coastguard Worker default:
151*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
152*61046927SAndroid Build Coastguard Worker }
153*61046927SAndroid Build Coastguard Worker return;
154*61046927SAndroid Build Coastguard Worker
155*61046927SAndroid Build Coastguard Worker invalid_enum_error:
156*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "gl%sClientState(%s)",
157*61046927SAndroid Build Coastguard Worker state ? "Enable" : "Disable", _mesa_enum_to_string(cap));
158*61046927SAndroid Build Coastguard Worker }
159*61046927SAndroid Build Coastguard Worker
160*61046927SAndroid Build Coastguard Worker
161*61046927SAndroid Build Coastguard Worker /* Helper for GL_EXT_direct_state_access following functions:
162*61046927SAndroid Build Coastguard Worker * - EnableClientStateIndexedEXT
163*61046927SAndroid Build Coastguard Worker * - EnableClientStateiEXT
164*61046927SAndroid Build Coastguard Worker * - DisableClientStateIndexedEXT
165*61046927SAndroid Build Coastguard Worker * - DisableClientStateiEXT
166*61046927SAndroid Build Coastguard Worker */
167*61046927SAndroid Build Coastguard Worker static void
client_state_i(struct gl_context * ctx,struct gl_vertex_array_object * vao,GLenum cap,GLuint index,GLboolean state)168*61046927SAndroid Build Coastguard Worker client_state_i(struct gl_context *ctx, struct gl_vertex_array_object* vao,
169*61046927SAndroid Build Coastguard Worker GLenum cap, GLuint index, GLboolean state)
170*61046927SAndroid Build Coastguard Worker {
171*61046927SAndroid Build Coastguard Worker int saved_active;
172*61046927SAndroid Build Coastguard Worker
173*61046927SAndroid Build Coastguard Worker if (cap != GL_TEXTURE_COORD_ARRAY) {
174*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "gl%sClientStateiEXT(cap=%s)",
175*61046927SAndroid Build Coastguard Worker state ? "Enable" : "Disable",
176*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(cap));
177*61046927SAndroid Build Coastguard Worker return;
178*61046927SAndroid Build Coastguard Worker }
179*61046927SAndroid Build Coastguard Worker
180*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxTextureCoordUnits) {
181*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "gl%sClientStateiEXT(index=%d)",
182*61046927SAndroid Build Coastguard Worker state ? "Enable" : "Disable",
183*61046927SAndroid Build Coastguard Worker index);
184*61046927SAndroid Build Coastguard Worker return;
185*61046927SAndroid Build Coastguard Worker }
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard Worker saved_active = ctx->Array.ActiveTexture;
188*61046927SAndroid Build Coastguard Worker _mesa_ClientActiveTexture(GL_TEXTURE0 + index);
189*61046927SAndroid Build Coastguard Worker client_state(ctx, vao, cap, state);
190*61046927SAndroid Build Coastguard Worker _mesa_ClientActiveTexture(GL_TEXTURE0 + saved_active);
191*61046927SAndroid Build Coastguard Worker }
192*61046927SAndroid Build Coastguard Worker
193*61046927SAndroid Build Coastguard Worker
194*61046927SAndroid Build Coastguard Worker /**
195*61046927SAndroid Build Coastguard Worker * Enable GL capability.
196*61046927SAndroid Build Coastguard Worker * \param cap state to enable/disable.
197*61046927SAndroid Build Coastguard Worker *
198*61046927SAndroid Build Coastguard Worker * Get's the current context, assures that we're outside glBegin()/glEnd() and
199*61046927SAndroid Build Coastguard Worker * calls client_state().
200*61046927SAndroid Build Coastguard Worker */
201*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_EnableClientState(GLenum cap)202*61046927SAndroid Build Coastguard Worker _mesa_EnableClientState( GLenum cap )
203*61046927SAndroid Build Coastguard Worker {
204*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
205*61046927SAndroid Build Coastguard Worker client_state( ctx, ctx->Array.VAO, cap, GL_TRUE );
206*61046927SAndroid Build Coastguard Worker }
207*61046927SAndroid Build Coastguard Worker
208*61046927SAndroid Build Coastguard Worker
209*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_EnableVertexArrayEXT(GLuint vaobj,GLenum cap)210*61046927SAndroid Build Coastguard Worker _mesa_EnableVertexArrayEXT( GLuint vaobj, GLenum cap )
211*61046927SAndroid Build Coastguard Worker {
212*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
213*61046927SAndroid Build Coastguard Worker struct gl_vertex_array_object* vao = _mesa_lookup_vao_err(ctx, vaobj,
214*61046927SAndroid Build Coastguard Worker true,
215*61046927SAndroid Build Coastguard Worker "glEnableVertexArrayEXT");
216*61046927SAndroid Build Coastguard Worker if (!vao)
217*61046927SAndroid Build Coastguard Worker return;
218*61046927SAndroid Build Coastguard Worker
219*61046927SAndroid Build Coastguard Worker /* The EXT_direct_state_access spec says:
220*61046927SAndroid Build Coastguard Worker * "Additionally EnableVertexArrayEXT and DisableVertexArrayEXT accept
221*61046927SAndroid Build Coastguard Worker * the tokens TEXTURE0 through TEXTUREn where n is less than the
222*61046927SAndroid Build Coastguard Worker * implementation-dependent limit of MAX_TEXTURE_COORDS. For these
223*61046927SAndroid Build Coastguard Worker * GL_TEXTUREi tokens, EnableVertexArrayEXT and DisableVertexArrayEXT
224*61046927SAndroid Build Coastguard Worker * act identically to EnableVertexArrayEXT(vaobj, TEXTURE_COORD_ARRAY)
225*61046927SAndroid Build Coastguard Worker * or DisableVertexArrayEXT(vaobj, TEXTURE_COORD_ARRAY) respectively
226*61046927SAndroid Build Coastguard Worker * as if the active client texture is set to texture coordinate set i
227*61046927SAndroid Build Coastguard Worker * based on the token TEXTUREi indicated by array."
228*61046927SAndroid Build Coastguard Worker */
229*61046927SAndroid Build Coastguard Worker if (GL_TEXTURE0 <= cap && cap < GL_TEXTURE0 + ctx->Const.MaxTextureCoordUnits) {
230*61046927SAndroid Build Coastguard Worker GLuint saved_active = ctx->Array.ActiveTexture;
231*61046927SAndroid Build Coastguard Worker _mesa_ClientActiveTexture(cap);
232*61046927SAndroid Build Coastguard Worker client_state(ctx, vao, GL_TEXTURE_COORD_ARRAY, GL_TRUE);
233*61046927SAndroid Build Coastguard Worker _mesa_ClientActiveTexture(GL_TEXTURE0 + saved_active);
234*61046927SAndroid Build Coastguard Worker } else {
235*61046927SAndroid Build Coastguard Worker client_state(ctx, vao, cap, GL_TRUE);
236*61046927SAndroid Build Coastguard Worker }
237*61046927SAndroid Build Coastguard Worker }
238*61046927SAndroid Build Coastguard Worker
239*61046927SAndroid Build Coastguard Worker
240*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_EnableClientStateiEXT(GLenum cap,GLuint index)241*61046927SAndroid Build Coastguard Worker _mesa_EnableClientStateiEXT( GLenum cap, GLuint index )
242*61046927SAndroid Build Coastguard Worker {
243*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
244*61046927SAndroid Build Coastguard Worker client_state_i(ctx, ctx->Array.VAO, cap, index, GL_TRUE);
245*61046927SAndroid Build Coastguard Worker }
246*61046927SAndroid Build Coastguard Worker
247*61046927SAndroid Build Coastguard Worker
248*61046927SAndroid Build Coastguard Worker /**
249*61046927SAndroid Build Coastguard Worker * Disable GL capability.
250*61046927SAndroid Build Coastguard Worker * \param cap state to enable/disable.
251*61046927SAndroid Build Coastguard Worker *
252*61046927SAndroid Build Coastguard Worker * Get's the current context, assures that we're outside glBegin()/glEnd() and
253*61046927SAndroid Build Coastguard Worker * calls client_state().
254*61046927SAndroid Build Coastguard Worker */
255*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_DisableClientState(GLenum cap)256*61046927SAndroid Build Coastguard Worker _mesa_DisableClientState( GLenum cap )
257*61046927SAndroid Build Coastguard Worker {
258*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
259*61046927SAndroid Build Coastguard Worker client_state( ctx, ctx->Array.VAO, cap, GL_FALSE );
260*61046927SAndroid Build Coastguard Worker }
261*61046927SAndroid Build Coastguard Worker
262*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_DisableVertexArrayEXT(GLuint vaobj,GLenum cap)263*61046927SAndroid Build Coastguard Worker _mesa_DisableVertexArrayEXT( GLuint vaobj, GLenum cap )
264*61046927SAndroid Build Coastguard Worker {
265*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
266*61046927SAndroid Build Coastguard Worker struct gl_vertex_array_object* vao = _mesa_lookup_vao_err(ctx, vaobj,
267*61046927SAndroid Build Coastguard Worker true,
268*61046927SAndroid Build Coastguard Worker "glDisableVertexArrayEXT");
269*61046927SAndroid Build Coastguard Worker if (!vao)
270*61046927SAndroid Build Coastguard Worker return;
271*61046927SAndroid Build Coastguard Worker
272*61046927SAndroid Build Coastguard Worker /* The EXT_direct_state_access spec says:
273*61046927SAndroid Build Coastguard Worker * "Additionally EnableVertexArrayEXT and DisableVertexArrayEXT accept
274*61046927SAndroid Build Coastguard Worker * the tokens TEXTURE0 through TEXTUREn where n is less than the
275*61046927SAndroid Build Coastguard Worker * implementation-dependent limit of MAX_TEXTURE_COORDS. For these
276*61046927SAndroid Build Coastguard Worker * GL_TEXTUREi tokens, EnableVertexArrayEXT and DisableVertexArrayEXT
277*61046927SAndroid Build Coastguard Worker * act identically to EnableVertexArrayEXT(vaobj, TEXTURE_COORD_ARRAY)
278*61046927SAndroid Build Coastguard Worker * or DisableVertexArrayEXT(vaobj, TEXTURE_COORD_ARRAY) respectively
279*61046927SAndroid Build Coastguard Worker * as if the active client texture is set to texture coordinate set i
280*61046927SAndroid Build Coastguard Worker * based on the token TEXTUREi indicated by array."
281*61046927SAndroid Build Coastguard Worker */
282*61046927SAndroid Build Coastguard Worker if (GL_TEXTURE0 <= cap && cap < GL_TEXTURE0 + ctx->Const.MaxTextureCoordUnits) {
283*61046927SAndroid Build Coastguard Worker GLuint saved_active = ctx->Array.ActiveTexture;
284*61046927SAndroid Build Coastguard Worker _mesa_ClientActiveTexture(cap);
285*61046927SAndroid Build Coastguard Worker client_state(ctx, vao, GL_TEXTURE_COORD_ARRAY, GL_FALSE);
286*61046927SAndroid Build Coastguard Worker _mesa_ClientActiveTexture(GL_TEXTURE0 + saved_active);
287*61046927SAndroid Build Coastguard Worker } else {
288*61046927SAndroid Build Coastguard Worker client_state(ctx, vao, cap, GL_FALSE);
289*61046927SAndroid Build Coastguard Worker }
290*61046927SAndroid Build Coastguard Worker }
291*61046927SAndroid Build Coastguard Worker
292*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_DisableClientStateiEXT(GLenum cap,GLuint index)293*61046927SAndroid Build Coastguard Worker _mesa_DisableClientStateiEXT( GLenum cap, GLuint index )
294*61046927SAndroid Build Coastguard Worker {
295*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
296*61046927SAndroid Build Coastguard Worker client_state_i(ctx, ctx->Array.VAO, cap, index, GL_FALSE);
297*61046927SAndroid Build Coastguard Worker }
298*61046927SAndroid Build Coastguard Worker
299*61046927SAndroid Build Coastguard Worker /**
300*61046927SAndroid Build Coastguard Worker * Return pointer to current texture unit for setting/getting coordinate
301*61046927SAndroid Build Coastguard Worker * state.
302*61046927SAndroid Build Coastguard Worker * Note that we'll set GL_INVALID_OPERATION and return NULL if the active
303*61046927SAndroid Build Coastguard Worker * texture unit is higher than the number of supported coordinate units.
304*61046927SAndroid Build Coastguard Worker */
305*61046927SAndroid Build Coastguard Worker static struct gl_fixedfunc_texture_unit *
get_texcoord_unit(struct gl_context * ctx)306*61046927SAndroid Build Coastguard Worker get_texcoord_unit(struct gl_context *ctx)
307*61046927SAndroid Build Coastguard Worker {
308*61046927SAndroid Build Coastguard Worker if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
309*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glEnable/Disable(texcoord unit)");
310*61046927SAndroid Build Coastguard Worker return NULL;
311*61046927SAndroid Build Coastguard Worker }
312*61046927SAndroid Build Coastguard Worker else {
313*61046927SAndroid Build Coastguard Worker return &ctx->Texture.FixedFuncUnit[ctx->Texture.CurrentUnit];
314*61046927SAndroid Build Coastguard Worker }
315*61046927SAndroid Build Coastguard Worker }
316*61046927SAndroid Build Coastguard Worker
317*61046927SAndroid Build Coastguard Worker
318*61046927SAndroid Build Coastguard Worker /**
319*61046927SAndroid Build Coastguard Worker * Helper function to enable or disable a texture target.
320*61046927SAndroid Build Coastguard Worker * \param bit one of the TEXTURE_x_BIT values
321*61046927SAndroid Build Coastguard Worker * \return GL_TRUE if state is changing or GL_FALSE if no change
322*61046927SAndroid Build Coastguard Worker */
323*61046927SAndroid Build Coastguard Worker static GLboolean
enable_texture(struct gl_context * ctx,GLboolean state,GLbitfield texBit)324*61046927SAndroid Build Coastguard Worker enable_texture(struct gl_context *ctx, GLboolean state, GLbitfield texBit)
325*61046927SAndroid Build Coastguard Worker {
326*61046927SAndroid Build Coastguard Worker struct gl_fixedfunc_texture_unit *texUnit =
327*61046927SAndroid Build Coastguard Worker _mesa_get_fixedfunc_tex_unit(ctx, ctx->Texture.CurrentUnit);
328*61046927SAndroid Build Coastguard Worker if (!texUnit)
329*61046927SAndroid Build Coastguard Worker return GL_FALSE;
330*61046927SAndroid Build Coastguard Worker
331*61046927SAndroid Build Coastguard Worker const GLbitfield newenabled = state
332*61046927SAndroid Build Coastguard Worker ? (texUnit->Enabled | texBit) : (texUnit->Enabled & ~texBit);
333*61046927SAndroid Build Coastguard Worker
334*61046927SAndroid Build Coastguard Worker if (texUnit->Enabled == newenabled)
335*61046927SAndroid Build Coastguard Worker return GL_FALSE;
336*61046927SAndroid Build Coastguard Worker
337*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE, GL_TEXTURE_BIT | GL_ENABLE_BIT);
338*61046927SAndroid Build Coastguard Worker texUnit->Enabled = newenabled;
339*61046927SAndroid Build Coastguard Worker return GL_TRUE;
340*61046927SAndroid Build Coastguard Worker }
341*61046927SAndroid Build Coastguard Worker
342*61046927SAndroid Build Coastguard Worker
343*61046927SAndroid Build Coastguard Worker /**
344*61046927SAndroid Build Coastguard Worker * Helper function to enable or disable GL_MULTISAMPLE, skipping the check for
345*61046927SAndroid Build Coastguard Worker * whether the API supports it (GLES doesn't).
346*61046927SAndroid Build Coastguard Worker */
347*61046927SAndroid Build Coastguard Worker void
_mesa_set_multisample(struct gl_context * ctx,GLboolean state)348*61046927SAndroid Build Coastguard Worker _mesa_set_multisample(struct gl_context *ctx, GLboolean state)
349*61046927SAndroid Build Coastguard Worker {
350*61046927SAndroid Build Coastguard Worker if (ctx->Multisample.Enabled == state)
351*61046927SAndroid Build Coastguard Worker return;
352*61046927SAndroid Build Coastguard Worker
353*61046927SAndroid Build Coastguard Worker /* GL compatibility needs Multisample.Enable to determine program state
354*61046927SAndroid Build Coastguard Worker * constants.
355*61046927SAndroid Build Coastguard Worker */
356*61046927SAndroid Build Coastguard Worker if (_mesa_is_desktop_gl_compat(ctx) || _mesa_is_gles1(ctx)) {
357*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE, GL_MULTISAMPLE_BIT | GL_ENABLE_BIT);
358*61046927SAndroid Build Coastguard Worker } else {
359*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_MULTISAMPLE_BIT | GL_ENABLE_BIT);
360*61046927SAndroid Build Coastguard Worker }
361*61046927SAndroid Build Coastguard Worker
362*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ctx->DriverFlags.NewMultisampleEnable;
363*61046927SAndroid Build Coastguard Worker ctx->Multisample.Enabled = state;
364*61046927SAndroid Build Coastguard Worker }
365*61046927SAndroid Build Coastguard Worker
366*61046927SAndroid Build Coastguard Worker /**
367*61046927SAndroid Build Coastguard Worker * Helper function to enable or disable GL_FRAMEBUFFER_SRGB, skipping the
368*61046927SAndroid Build Coastguard Worker * check for whether the API supports it (GLES doesn't).
369*61046927SAndroid Build Coastguard Worker */
370*61046927SAndroid Build Coastguard Worker void
_mesa_set_framebuffer_srgb(struct gl_context * ctx,GLboolean state)371*61046927SAndroid Build Coastguard Worker _mesa_set_framebuffer_srgb(struct gl_context *ctx, GLboolean state)
372*61046927SAndroid Build Coastguard Worker {
373*61046927SAndroid Build Coastguard Worker if (ctx->Color.sRGBEnabled == state)
374*61046927SAndroid Build Coastguard Worker return;
375*61046927SAndroid Build Coastguard Worker
376*61046927SAndroid Build Coastguard Worker /* TODO: Switch i965 to the new flag and remove the conditional */
377*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
378*61046927SAndroid Build Coastguard Worker GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT);
379*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_FB_STATE;
380*61046927SAndroid Build Coastguard Worker ctx->Color.sRGBEnabled = state;
381*61046927SAndroid Build Coastguard Worker }
382*61046927SAndroid Build Coastguard Worker
383*61046927SAndroid Build Coastguard Worker /**
384*61046927SAndroid Build Coastguard Worker * Helper function to enable or disable state.
385*61046927SAndroid Build Coastguard Worker *
386*61046927SAndroid Build Coastguard Worker * \param ctx GL context.
387*61046927SAndroid Build Coastguard Worker * \param cap the state to enable/disable
388*61046927SAndroid Build Coastguard Worker * \param state whether to enable or disable the specified capability.
389*61046927SAndroid Build Coastguard Worker *
390*61046927SAndroid Build Coastguard Worker * Updates the current context and flushes the vertices as needed. For
391*61046927SAndroid Build Coastguard Worker * capabilities associated with extensions it verifies that those extensions
392*61046927SAndroid Build Coastguard Worker * are effectivly present before updating. Notifies the driver via
393*61046927SAndroid Build Coastguard Worker * dd_function_table::Enable.
394*61046927SAndroid Build Coastguard Worker */
395*61046927SAndroid Build Coastguard Worker void
_mesa_set_enable(struct gl_context * ctx,GLenum cap,GLboolean state)396*61046927SAndroid Build Coastguard Worker _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
397*61046927SAndroid Build Coastguard Worker {
398*61046927SAndroid Build Coastguard Worker if (MESA_VERBOSE & VERBOSE_API)
399*61046927SAndroid Build Coastguard Worker _mesa_debug(ctx, "%s %s (newstate is %x)\n",
400*61046927SAndroid Build Coastguard Worker state ? "glEnable" : "glDisable",
401*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(cap),
402*61046927SAndroid Build Coastguard Worker ctx->NewState);
403*61046927SAndroid Build Coastguard Worker
404*61046927SAndroid Build Coastguard Worker switch (cap) {
405*61046927SAndroid Build Coastguard Worker case GL_ALPHA_TEST:
406*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
407*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
408*61046927SAndroid Build Coastguard Worker if (ctx->Color.AlphaEnabled == state)
409*61046927SAndroid Build Coastguard Worker return;
410*61046927SAndroid Build Coastguard Worker /* AlphaEnabled is used by the fixed-func fragment program */
411*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_COLOR | _NEW_FF_FRAG_PROGRAM,
412*61046927SAndroid Build Coastguard Worker GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT);
413*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ctx->DriverFlags.NewAlphaTest;
414*61046927SAndroid Build Coastguard Worker ctx->Color.AlphaEnabled = state;
415*61046927SAndroid Build Coastguard Worker break;
416*61046927SAndroid Build Coastguard Worker case GL_AUTO_NORMAL:
417*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
418*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
419*61046927SAndroid Build Coastguard Worker if (ctx->Eval.AutoNormal == state)
420*61046927SAndroid Build Coastguard Worker return;
421*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
422*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
423*61046927SAndroid Build Coastguard Worker ctx->Eval.AutoNormal = state;
424*61046927SAndroid Build Coastguard Worker break;
425*61046927SAndroid Build Coastguard Worker case GL_BLEND:
426*61046927SAndroid Build Coastguard Worker {
427*61046927SAndroid Build Coastguard Worker GLbitfield newEnabled =
428*61046927SAndroid Build Coastguard Worker state * ((1 << ctx->Const.MaxDrawBuffers) - 1);
429*61046927SAndroid Build Coastguard Worker if (newEnabled != ctx->Color.BlendEnabled) {
430*61046927SAndroid Build Coastguard Worker _mesa_flush_vertices_for_blend_adv(ctx, newEnabled,
431*61046927SAndroid Build Coastguard Worker ctx->Color._AdvancedBlendMode);
432*61046927SAndroid Build Coastguard Worker ctx->PopAttribState |= GL_ENABLE_BIT;
433*61046927SAndroid Build Coastguard Worker ctx->Color.BlendEnabled = newEnabled;
434*61046927SAndroid Build Coastguard Worker _mesa_update_allow_draw_out_of_order(ctx);
435*61046927SAndroid Build Coastguard Worker _mesa_update_valid_to_render_state(ctx);
436*61046927SAndroid Build Coastguard Worker }
437*61046927SAndroid Build Coastguard Worker }
438*61046927SAndroid Build Coastguard Worker break;
439*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE0: /* aka GL_CLIP_PLANE0 */
440*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE1:
441*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE2:
442*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE3:
443*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE4:
444*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE5:
445*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE6:
446*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE7:
447*61046927SAndroid Build Coastguard Worker {
448*61046927SAndroid Build Coastguard Worker const GLuint p = cap - GL_CLIP_DISTANCE0;
449*61046927SAndroid Build Coastguard Worker
450*61046927SAndroid Build Coastguard Worker if (p >= ctx->Const.MaxClipPlanes)
451*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
452*61046927SAndroid Build Coastguard Worker
453*61046927SAndroid Build Coastguard Worker if ((ctx->Transform.ClipPlanesEnabled & (1 << p))
454*61046927SAndroid Build Coastguard Worker == ((GLuint) state << p))
455*61046927SAndroid Build Coastguard Worker return;
456*61046927SAndroid Build Coastguard Worker
457*61046927SAndroid Build Coastguard Worker /* The compatibility profile needs _NEW_TRANSFORM to transform
458*61046927SAndroid Build Coastguard Worker * clip planes according to the projection matrix.
459*61046927SAndroid Build Coastguard Worker */
460*61046927SAndroid Build Coastguard Worker if (_mesa_is_desktop_gl_compat(ctx) || _mesa_is_gles1(ctx)) {
461*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TRANSFORM,
462*61046927SAndroid Build Coastguard Worker GL_TRANSFORM_BIT | GL_ENABLE_BIT);
463*61046927SAndroid Build Coastguard Worker } else {
464*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_TRANSFORM_BIT | GL_ENABLE_BIT);
465*61046927SAndroid Build Coastguard Worker }
466*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ctx->DriverFlags.NewClipPlaneEnable;
467*61046927SAndroid Build Coastguard Worker
468*61046927SAndroid Build Coastguard Worker if (state) {
469*61046927SAndroid Build Coastguard Worker ctx->Transform.ClipPlanesEnabled |= (1 << p);
470*61046927SAndroid Build Coastguard Worker
471*61046927SAndroid Build Coastguard Worker /* The projection matrix transforms the clip plane. */
472*61046927SAndroid Build Coastguard Worker /* TODO: glEnable might not be the best place to do it. */
473*61046927SAndroid Build Coastguard Worker if (_mesa_is_desktop_gl_compat(ctx) || _mesa_is_gles1(ctx)) {
474*61046927SAndroid Build Coastguard Worker _mesa_update_clip_plane(ctx, p);
475*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_CLIP_STATE;
476*61046927SAndroid Build Coastguard Worker }
477*61046927SAndroid Build Coastguard Worker }
478*61046927SAndroid Build Coastguard Worker else {
479*61046927SAndroid Build Coastguard Worker ctx->Transform.ClipPlanesEnabled &= ~(1 << p);
480*61046927SAndroid Build Coastguard Worker }
481*61046927SAndroid Build Coastguard Worker }
482*61046927SAndroid Build Coastguard Worker break;
483*61046927SAndroid Build Coastguard Worker case GL_COLOR_MATERIAL:
484*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
485*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
486*61046927SAndroid Build Coastguard Worker if (ctx->Light.ColorMaterialEnabled == state)
487*61046927SAndroid Build Coastguard Worker return;
488*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_LIGHT_CONSTANTS | _NEW_FF_VERT_PROGRAM,
489*61046927SAndroid Build Coastguard Worker GL_LIGHTING_BIT | GL_ENABLE_BIT);
490*61046927SAndroid Build Coastguard Worker FLUSH_CURRENT(ctx, 0);
491*61046927SAndroid Build Coastguard Worker ctx->Light.ColorMaterialEnabled = state;
492*61046927SAndroid Build Coastguard Worker if (state) {
493*61046927SAndroid Build Coastguard Worker _mesa_update_color_material( ctx,
494*61046927SAndroid Build Coastguard Worker ctx->Current.Attrib[VERT_ATTRIB_COLOR0] );
495*61046927SAndroid Build Coastguard Worker }
496*61046927SAndroid Build Coastguard Worker break;
497*61046927SAndroid Build Coastguard Worker case GL_CULL_FACE:
498*61046927SAndroid Build Coastguard Worker if (ctx->Polygon.CullFlag == state)
499*61046927SAndroid Build Coastguard Worker return;
500*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
501*61046927SAndroid Build Coastguard Worker GL_POLYGON_BIT | GL_ENABLE_BIT);
502*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
503*61046927SAndroid Build Coastguard Worker ctx->Polygon.CullFlag = state;
504*61046927SAndroid Build Coastguard Worker break;
505*61046927SAndroid Build Coastguard Worker case GL_DEPTH_TEST:
506*61046927SAndroid Build Coastguard Worker if (ctx->Depth.Test == state)
507*61046927SAndroid Build Coastguard Worker return;
508*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
509*61046927SAndroid Build Coastguard Worker GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT);
510*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_DSA;
511*61046927SAndroid Build Coastguard Worker ctx->Depth.Test = state;
512*61046927SAndroid Build Coastguard Worker _mesa_update_allow_draw_out_of_order(ctx);
513*61046927SAndroid Build Coastguard Worker break;
514*61046927SAndroid Build Coastguard Worker case GL_DEBUG_OUTPUT:
515*61046927SAndroid Build Coastguard Worker case GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB:
516*61046927SAndroid Build Coastguard Worker _mesa_set_debug_state_int(ctx, cap, state);
517*61046927SAndroid Build Coastguard Worker _mesa_update_debug_callback(ctx);
518*61046927SAndroid Build Coastguard Worker break;
519*61046927SAndroid Build Coastguard Worker case GL_DITHER:
520*61046927SAndroid Build Coastguard Worker if (ctx->Color.DitherFlag == state)
521*61046927SAndroid Build Coastguard Worker return;
522*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
523*61046927SAndroid Build Coastguard Worker GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT);
524*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_BLEND;
525*61046927SAndroid Build Coastguard Worker ctx->Color.DitherFlag = state;
526*61046927SAndroid Build Coastguard Worker break;
527*61046927SAndroid Build Coastguard Worker case GL_FOG:
528*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
529*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
530*61046927SAndroid Build Coastguard Worker if (ctx->Fog.Enabled == state)
531*61046927SAndroid Build Coastguard Worker return;
532*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_FOG | _NEW_FF_FRAG_PROGRAM,
533*61046927SAndroid Build Coastguard Worker GL_FOG_BIT | GL_ENABLE_BIT);
534*61046927SAndroid Build Coastguard Worker ctx->Fog.Enabled = state;
535*61046927SAndroid Build Coastguard Worker ctx->Fog._PackedEnabledMode = state ? ctx->Fog._PackedMode : FOG_NONE;
536*61046927SAndroid Build Coastguard Worker break;
537*61046927SAndroid Build Coastguard Worker case GL_LIGHT0:
538*61046927SAndroid Build Coastguard Worker case GL_LIGHT1:
539*61046927SAndroid Build Coastguard Worker case GL_LIGHT2:
540*61046927SAndroid Build Coastguard Worker case GL_LIGHT3:
541*61046927SAndroid Build Coastguard Worker case GL_LIGHT4:
542*61046927SAndroid Build Coastguard Worker case GL_LIGHT5:
543*61046927SAndroid Build Coastguard Worker case GL_LIGHT6:
544*61046927SAndroid Build Coastguard Worker case GL_LIGHT7:
545*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
546*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
547*61046927SAndroid Build Coastguard Worker if (ctx->Light.Light[cap-GL_LIGHT0].Enabled == state)
548*61046927SAndroid Build Coastguard Worker return;
549*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_LIGHT_CONSTANTS | _NEW_FF_VERT_PROGRAM,
550*61046927SAndroid Build Coastguard Worker GL_LIGHTING_BIT | GL_ENABLE_BIT);
551*61046927SAndroid Build Coastguard Worker ctx->Light.Light[cap-GL_LIGHT0].Enabled = state;
552*61046927SAndroid Build Coastguard Worker if (state) {
553*61046927SAndroid Build Coastguard Worker ctx->Light._EnabledLights |= 1u << (cap - GL_LIGHT0);
554*61046927SAndroid Build Coastguard Worker }
555*61046927SAndroid Build Coastguard Worker else {
556*61046927SAndroid Build Coastguard Worker ctx->Light._EnabledLights &= ~(1u << (cap - GL_LIGHT0));
557*61046927SAndroid Build Coastguard Worker }
558*61046927SAndroid Build Coastguard Worker break;
559*61046927SAndroid Build Coastguard Worker case GL_LIGHTING:
560*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
561*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
562*61046927SAndroid Build Coastguard Worker if (ctx->Light.Enabled == state)
563*61046927SAndroid Build Coastguard Worker return;
564*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_LIGHT_CONSTANTS | _NEW_FF_VERT_PROGRAM |
565*61046927SAndroid Build Coastguard Worker _NEW_FF_FRAG_PROGRAM | _NEW_LIGHT_STATE,
566*61046927SAndroid Build Coastguard Worker GL_LIGHTING_BIT | GL_ENABLE_BIT);
567*61046927SAndroid Build Coastguard Worker ctx->Light.Enabled = state;
568*61046927SAndroid Build Coastguard Worker break;
569*61046927SAndroid Build Coastguard Worker case GL_LINE_SMOOTH:
570*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
571*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
572*61046927SAndroid Build Coastguard Worker if (ctx->Line.SmoothFlag == state)
573*61046927SAndroid Build Coastguard Worker return;
574*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
575*61046927SAndroid Build Coastguard Worker GL_LINE_BIT | GL_ENABLE_BIT);
576*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
577*61046927SAndroid Build Coastguard Worker ctx->Line.SmoothFlag = state;
578*61046927SAndroid Build Coastguard Worker break;
579*61046927SAndroid Build Coastguard Worker case GL_LINE_STIPPLE:
580*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
581*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
582*61046927SAndroid Build Coastguard Worker if (ctx->Line.StippleFlag == state)
583*61046927SAndroid Build Coastguard Worker return;
584*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
585*61046927SAndroid Build Coastguard Worker GL_LINE_BIT | GL_ENABLE_BIT);
586*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
587*61046927SAndroid Build Coastguard Worker ctx->Line.StippleFlag = state;
588*61046927SAndroid Build Coastguard Worker break;
589*61046927SAndroid Build Coastguard Worker case GL_INDEX_LOGIC_OP:
590*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
591*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
592*61046927SAndroid Build Coastguard Worker if (ctx->Color.IndexLogicOpEnabled == state)
593*61046927SAndroid Build Coastguard Worker return;
594*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
595*61046927SAndroid Build Coastguard Worker GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT);
596*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_BLEND;
597*61046927SAndroid Build Coastguard Worker ctx->Color.IndexLogicOpEnabled = state;
598*61046927SAndroid Build Coastguard Worker break;
599*61046927SAndroid Build Coastguard Worker case GL_CONSERVATIVE_RASTERIZATION_INTEL:
600*61046927SAndroid Build Coastguard Worker if (!_mesa_has_INTEL_conservative_rasterization(ctx))
601*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
602*61046927SAndroid Build Coastguard Worker if (ctx->IntelConservativeRasterization == state)
603*61046927SAndroid Build Coastguard Worker return;
604*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, 0);
605*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
606*61046927SAndroid Build Coastguard Worker ctx->IntelConservativeRasterization = state;
607*61046927SAndroid Build Coastguard Worker _mesa_update_valid_to_render_state(ctx);
608*61046927SAndroid Build Coastguard Worker break;
609*61046927SAndroid Build Coastguard Worker case GL_CONSERVATIVE_RASTERIZATION_NV:
610*61046927SAndroid Build Coastguard Worker if (!_mesa_has_NV_conservative_raster(ctx))
611*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
612*61046927SAndroid Build Coastguard Worker if (ctx->ConservativeRasterization == state)
613*61046927SAndroid Build Coastguard Worker return;
614*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_ENABLE_BIT);
615*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
616*61046927SAndroid Build Coastguard Worker ctx->ConservativeRasterization = state;
617*61046927SAndroid Build Coastguard Worker break;
618*61046927SAndroid Build Coastguard Worker case GL_COLOR_LOGIC_OP:
619*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
620*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
621*61046927SAndroid Build Coastguard Worker if (ctx->Color.ColorLogicOpEnabled == state)
622*61046927SAndroid Build Coastguard Worker return;
623*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
624*61046927SAndroid Build Coastguard Worker GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT);
625*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_BLEND;
626*61046927SAndroid Build Coastguard Worker ctx->Color.ColorLogicOpEnabled = state;
627*61046927SAndroid Build Coastguard Worker _mesa_update_allow_draw_out_of_order(ctx);
628*61046927SAndroid Build Coastguard Worker break;
629*61046927SAndroid Build Coastguard Worker case GL_MAP1_COLOR_4:
630*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
631*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
632*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map1Color4 == state)
633*61046927SAndroid Build Coastguard Worker return;
634*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
635*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
636*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1Color4 = state;
637*61046927SAndroid Build Coastguard Worker break;
638*61046927SAndroid Build Coastguard Worker case GL_MAP1_INDEX:
639*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
640*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
641*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map1Index == state)
642*61046927SAndroid Build Coastguard Worker return;
643*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
644*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
645*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1Index = state;
646*61046927SAndroid Build Coastguard Worker break;
647*61046927SAndroid Build Coastguard Worker case GL_MAP1_NORMAL:
648*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
649*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
650*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map1Normal == state)
651*61046927SAndroid Build Coastguard Worker return;
652*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
653*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
654*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1Normal = state;
655*61046927SAndroid Build Coastguard Worker break;
656*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_1:
657*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
658*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
659*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map1TextureCoord1 == state)
660*61046927SAndroid Build Coastguard Worker return;
661*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
662*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
663*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1TextureCoord1 = state;
664*61046927SAndroid Build Coastguard Worker break;
665*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_2:
666*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
667*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
668*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map1TextureCoord2 == state)
669*61046927SAndroid Build Coastguard Worker return;
670*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
671*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
672*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1TextureCoord2 = state;
673*61046927SAndroid Build Coastguard Worker break;
674*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_3:
675*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
676*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
677*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map1TextureCoord3 == state)
678*61046927SAndroid Build Coastguard Worker return;
679*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
680*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
681*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1TextureCoord3 = state;
682*61046927SAndroid Build Coastguard Worker break;
683*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_4:
684*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
685*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
686*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map1TextureCoord4 == state)
687*61046927SAndroid Build Coastguard Worker return;
688*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
689*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
690*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1TextureCoord4 = state;
691*61046927SAndroid Build Coastguard Worker break;
692*61046927SAndroid Build Coastguard Worker case GL_MAP1_VERTEX_3:
693*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
694*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
695*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map1Vertex3 == state)
696*61046927SAndroid Build Coastguard Worker return;
697*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
698*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
699*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1Vertex3 = state;
700*61046927SAndroid Build Coastguard Worker break;
701*61046927SAndroid Build Coastguard Worker case GL_MAP1_VERTEX_4:
702*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
703*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
704*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map1Vertex4 == state)
705*61046927SAndroid Build Coastguard Worker return;
706*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
707*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
708*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1Vertex4 = state;
709*61046927SAndroid Build Coastguard Worker break;
710*61046927SAndroid Build Coastguard Worker case GL_MAP2_COLOR_4:
711*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
712*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
713*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map2Color4 == state)
714*61046927SAndroid Build Coastguard Worker return;
715*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
716*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
717*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2Color4 = state;
718*61046927SAndroid Build Coastguard Worker break;
719*61046927SAndroid Build Coastguard Worker case GL_MAP2_INDEX:
720*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
721*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
722*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map2Index == state)
723*61046927SAndroid Build Coastguard Worker return;
724*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
725*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
726*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2Index = state;
727*61046927SAndroid Build Coastguard Worker break;
728*61046927SAndroid Build Coastguard Worker case GL_MAP2_NORMAL:
729*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
730*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
731*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map2Normal == state)
732*61046927SAndroid Build Coastguard Worker return;
733*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
734*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
735*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2Normal = state;
736*61046927SAndroid Build Coastguard Worker break;
737*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_1:
738*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
739*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
740*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map2TextureCoord1 == state)
741*61046927SAndroid Build Coastguard Worker return;
742*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
743*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
744*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2TextureCoord1 = state;
745*61046927SAndroid Build Coastguard Worker break;
746*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_2:
747*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
748*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
749*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map2TextureCoord2 == state)
750*61046927SAndroid Build Coastguard Worker return;
751*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
752*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
753*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2TextureCoord2 = state;
754*61046927SAndroid Build Coastguard Worker break;
755*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_3:
756*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
757*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
758*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map2TextureCoord3 == state)
759*61046927SAndroid Build Coastguard Worker return;
760*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
761*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
762*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2TextureCoord3 = state;
763*61046927SAndroid Build Coastguard Worker break;
764*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_4:
765*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
766*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
767*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map2TextureCoord4 == state)
768*61046927SAndroid Build Coastguard Worker return;
769*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
770*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
771*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2TextureCoord4 = state;
772*61046927SAndroid Build Coastguard Worker break;
773*61046927SAndroid Build Coastguard Worker case GL_MAP2_VERTEX_3:
774*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
775*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
776*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map2Vertex3 == state)
777*61046927SAndroid Build Coastguard Worker return;
778*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
779*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
780*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2Vertex3 = state;
781*61046927SAndroid Build Coastguard Worker break;
782*61046927SAndroid Build Coastguard Worker case GL_MAP2_VERTEX_4:
783*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
784*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
785*61046927SAndroid Build Coastguard Worker if (ctx->Eval.Map2Vertex4 == state)
786*61046927SAndroid Build Coastguard Worker return;
787*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT | GL_ENABLE_BIT);
788*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
789*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2Vertex4 = state;
790*61046927SAndroid Build Coastguard Worker break;
791*61046927SAndroid Build Coastguard Worker case GL_NORMALIZE:
792*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
793*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
794*61046927SAndroid Build Coastguard Worker if (ctx->Transform.Normalize == state)
795*61046927SAndroid Build Coastguard Worker return;
796*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TRANSFORM | _NEW_FF_VERT_PROGRAM,
797*61046927SAndroid Build Coastguard Worker GL_TRANSFORM_BIT | GL_ENABLE_BIT);
798*61046927SAndroid Build Coastguard Worker ctx->Transform.Normalize = state;
799*61046927SAndroid Build Coastguard Worker break;
800*61046927SAndroid Build Coastguard Worker case GL_POINT_SMOOTH:
801*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
802*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
803*61046927SAndroid Build Coastguard Worker if (ctx->Point.SmoothFlag == state)
804*61046927SAndroid Build Coastguard Worker return;
805*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_POINT, GL_POINT_BIT | GL_ENABLE_BIT);
806*61046927SAndroid Build Coastguard Worker ctx->Point.SmoothFlag = state;
807*61046927SAndroid Build Coastguard Worker break;
808*61046927SAndroid Build Coastguard Worker case GL_POLYGON_SMOOTH:
809*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx))
810*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
811*61046927SAndroid Build Coastguard Worker if (ctx->Polygon.SmoothFlag == state)
812*61046927SAndroid Build Coastguard Worker return;
813*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
814*61046927SAndroid Build Coastguard Worker GL_POLYGON_BIT | GL_ENABLE_BIT);
815*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
816*61046927SAndroid Build Coastguard Worker ctx->Polygon.SmoothFlag = state;
817*61046927SAndroid Build Coastguard Worker break;
818*61046927SAndroid Build Coastguard Worker case GL_POLYGON_STIPPLE:
819*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
820*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
821*61046927SAndroid Build Coastguard Worker if (ctx->Polygon.StippleFlag == state)
822*61046927SAndroid Build Coastguard Worker return;
823*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
824*61046927SAndroid Build Coastguard Worker GL_POLYGON_BIT | GL_ENABLE_BIT);
825*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
826*61046927SAndroid Build Coastguard Worker ctx->Polygon.StippleFlag = state;
827*61046927SAndroid Build Coastguard Worker break;
828*61046927SAndroid Build Coastguard Worker case GL_POLYGON_OFFSET_POINT:
829*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx))
830*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
831*61046927SAndroid Build Coastguard Worker if (ctx->Polygon.OffsetPoint == state)
832*61046927SAndroid Build Coastguard Worker return;
833*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
834*61046927SAndroid Build Coastguard Worker GL_POLYGON_BIT | GL_ENABLE_BIT);
835*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
836*61046927SAndroid Build Coastguard Worker ctx->Polygon.OffsetPoint = state;
837*61046927SAndroid Build Coastguard Worker break;
838*61046927SAndroid Build Coastguard Worker case GL_POLYGON_OFFSET_LINE:
839*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx))
840*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
841*61046927SAndroid Build Coastguard Worker if (ctx->Polygon.OffsetLine == state)
842*61046927SAndroid Build Coastguard Worker return;
843*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
844*61046927SAndroid Build Coastguard Worker GL_POLYGON_BIT | GL_ENABLE_BIT);
845*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
846*61046927SAndroid Build Coastguard Worker ctx->Polygon.OffsetLine = state;
847*61046927SAndroid Build Coastguard Worker break;
848*61046927SAndroid Build Coastguard Worker case GL_POLYGON_OFFSET_FILL:
849*61046927SAndroid Build Coastguard Worker if (ctx->Polygon.OffsetFill == state)
850*61046927SAndroid Build Coastguard Worker return;
851*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
852*61046927SAndroid Build Coastguard Worker GL_POLYGON_BIT | GL_ENABLE_BIT);
853*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
854*61046927SAndroid Build Coastguard Worker ctx->Polygon.OffsetFill = state;
855*61046927SAndroid Build Coastguard Worker break;
856*61046927SAndroid Build Coastguard Worker case GL_RESCALE_NORMAL_EXT:
857*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
858*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
859*61046927SAndroid Build Coastguard Worker if (ctx->Transform.RescaleNormals == state)
860*61046927SAndroid Build Coastguard Worker return;
861*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TRANSFORM | _NEW_FF_VERT_PROGRAM,
862*61046927SAndroid Build Coastguard Worker GL_TRANSFORM_BIT | GL_ENABLE_BIT);
863*61046927SAndroid Build Coastguard Worker ctx->Transform.RescaleNormals = state;
864*61046927SAndroid Build Coastguard Worker break;
865*61046927SAndroid Build Coastguard Worker case GL_SCISSOR_TEST:
866*61046927SAndroid Build Coastguard Worker {
867*61046927SAndroid Build Coastguard Worker /* Must expand glEnable to all scissors */
868*61046927SAndroid Build Coastguard Worker GLbitfield newEnabled =
869*61046927SAndroid Build Coastguard Worker state * ((1 << ctx->Const.MaxViewports) - 1);
870*61046927SAndroid Build Coastguard Worker if (newEnabled != ctx->Scissor.EnableFlags) {
871*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
872*61046927SAndroid Build Coastguard Worker GL_SCISSOR_BIT | GL_ENABLE_BIT);
873*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_SCISSOR | ST_NEW_RASTERIZER;
874*61046927SAndroid Build Coastguard Worker ctx->Scissor.EnableFlags = newEnabled;
875*61046927SAndroid Build Coastguard Worker }
876*61046927SAndroid Build Coastguard Worker }
877*61046927SAndroid Build Coastguard Worker break;
878*61046927SAndroid Build Coastguard Worker case GL_STENCIL_TEST:
879*61046927SAndroid Build Coastguard Worker if (ctx->Stencil.Enabled == state)
880*61046927SAndroid Build Coastguard Worker return;
881*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
882*61046927SAndroid Build Coastguard Worker GL_STENCIL_BUFFER_BIT | GL_ENABLE_BIT);
883*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_DSA;
884*61046927SAndroid Build Coastguard Worker ctx->Stencil.Enabled = state;
885*61046927SAndroid Build Coastguard Worker _mesa_update_allow_draw_out_of_order(ctx);
886*61046927SAndroid Build Coastguard Worker break;
887*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_1D:
888*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
889*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
890*61046927SAndroid Build Coastguard Worker if (!enable_texture(ctx, state, TEXTURE_1D_BIT)) {
891*61046927SAndroid Build Coastguard Worker return;
892*61046927SAndroid Build Coastguard Worker }
893*61046927SAndroid Build Coastguard Worker break;
894*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D:
895*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
896*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
897*61046927SAndroid Build Coastguard Worker if (!enable_texture(ctx, state, TEXTURE_2D_BIT)) {
898*61046927SAndroid Build Coastguard Worker return;
899*61046927SAndroid Build Coastguard Worker }
900*61046927SAndroid Build Coastguard Worker break;
901*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_3D:
902*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
903*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
904*61046927SAndroid Build Coastguard Worker if (!enable_texture(ctx, state, TEXTURE_3D_BIT)) {
905*61046927SAndroid Build Coastguard Worker return;
906*61046927SAndroid Build Coastguard Worker }
907*61046927SAndroid Build Coastguard Worker break;
908*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_S:
909*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_T:
910*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_R:
911*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_Q:
912*61046927SAndroid Build Coastguard Worker {
913*61046927SAndroid Build Coastguard Worker struct gl_fixedfunc_texture_unit *texUnit = get_texcoord_unit(ctx);
914*61046927SAndroid Build Coastguard Worker
915*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
916*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
917*61046927SAndroid Build Coastguard Worker
918*61046927SAndroid Build Coastguard Worker if (texUnit) {
919*61046927SAndroid Build Coastguard Worker GLbitfield coordBit = S_BIT << (cap - GL_TEXTURE_GEN_S);
920*61046927SAndroid Build Coastguard Worker GLbitfield newenabled = texUnit->TexGenEnabled & ~coordBit;
921*61046927SAndroid Build Coastguard Worker if (state)
922*61046927SAndroid Build Coastguard Worker newenabled |= coordBit;
923*61046927SAndroid Build Coastguard Worker if (texUnit->TexGenEnabled == newenabled)
924*61046927SAndroid Build Coastguard Worker return;
925*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE | _NEW_FF_VERT_PROGRAM |
926*61046927SAndroid Build Coastguard Worker _NEW_FF_FRAG_PROGRAM,
927*61046927SAndroid Build Coastguard Worker GL_TEXTURE_BIT | GL_ENABLE_BIT);
928*61046927SAndroid Build Coastguard Worker texUnit->TexGenEnabled = newenabled;
929*61046927SAndroid Build Coastguard Worker }
930*61046927SAndroid Build Coastguard Worker }
931*61046927SAndroid Build Coastguard Worker break;
932*61046927SAndroid Build Coastguard Worker
933*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_STR_OES:
934*61046927SAndroid Build Coastguard Worker /* disable S, T, and R at the same time */
935*61046927SAndroid Build Coastguard Worker {
936*61046927SAndroid Build Coastguard Worker struct gl_fixedfunc_texture_unit *texUnit = get_texcoord_unit(ctx);
937*61046927SAndroid Build Coastguard Worker
938*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGLES)
939*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
940*61046927SAndroid Build Coastguard Worker
941*61046927SAndroid Build Coastguard Worker if (texUnit) {
942*61046927SAndroid Build Coastguard Worker GLuint newenabled =
943*61046927SAndroid Build Coastguard Worker texUnit->TexGenEnabled & ~STR_BITS;
944*61046927SAndroid Build Coastguard Worker if (state)
945*61046927SAndroid Build Coastguard Worker newenabled |= STR_BITS;
946*61046927SAndroid Build Coastguard Worker if (texUnit->TexGenEnabled == newenabled)
947*61046927SAndroid Build Coastguard Worker return;
948*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE | _NEW_FF_VERT_PROGRAM |
949*61046927SAndroid Build Coastguard Worker _NEW_FF_FRAG_PROGRAM, 0);
950*61046927SAndroid Build Coastguard Worker texUnit->TexGenEnabled = newenabled;
951*61046927SAndroid Build Coastguard Worker }
952*61046927SAndroid Build Coastguard Worker }
953*61046927SAndroid Build Coastguard Worker break;
954*61046927SAndroid Build Coastguard Worker
955*61046927SAndroid Build Coastguard Worker /* client-side state */
956*61046927SAndroid Build Coastguard Worker case GL_VERTEX_ARRAY:
957*61046927SAndroid Build Coastguard Worker case GL_NORMAL_ARRAY:
958*61046927SAndroid Build Coastguard Worker case GL_COLOR_ARRAY:
959*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COORD_ARRAY:
960*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
961*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
962*61046927SAndroid Build Coastguard Worker client_state( ctx, ctx->Array.VAO, cap, state );
963*61046927SAndroid Build Coastguard Worker return;
964*61046927SAndroid Build Coastguard Worker case GL_INDEX_ARRAY:
965*61046927SAndroid Build Coastguard Worker case GL_EDGE_FLAG_ARRAY:
966*61046927SAndroid Build Coastguard Worker case GL_FOG_COORDINATE_ARRAY_EXT:
967*61046927SAndroid Build Coastguard Worker case GL_SECONDARY_COLOR_ARRAY_EXT:
968*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
969*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
970*61046927SAndroid Build Coastguard Worker client_state( ctx, ctx->Array.VAO, cap, state );
971*61046927SAndroid Build Coastguard Worker return;
972*61046927SAndroid Build Coastguard Worker case GL_POINT_SIZE_ARRAY_OES:
973*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGLES)
974*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
975*61046927SAndroid Build Coastguard Worker client_state( ctx, ctx->Array.VAO, cap, state );
976*61046927SAndroid Build Coastguard Worker return;
977*61046927SAndroid Build Coastguard Worker
978*61046927SAndroid Build Coastguard Worker /* GL_ARB_texture_cube_map */
979*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP:
980*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
981*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
982*61046927SAndroid Build Coastguard Worker if (!enable_texture(ctx, state, TEXTURE_CUBE_BIT)) {
983*61046927SAndroid Build Coastguard Worker return;
984*61046927SAndroid Build Coastguard Worker }
985*61046927SAndroid Build Coastguard Worker break;
986*61046927SAndroid Build Coastguard Worker
987*61046927SAndroid Build Coastguard Worker /* GL_EXT_secondary_color */
988*61046927SAndroid Build Coastguard Worker case GL_COLOR_SUM_EXT:
989*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
990*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
991*61046927SAndroid Build Coastguard Worker if (ctx->Fog.ColorSumEnabled == state)
992*61046927SAndroid Build Coastguard Worker return;
993*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_FOG | _NEW_FF_FRAG_PROGRAM,
994*61046927SAndroid Build Coastguard Worker GL_FOG_BIT | GL_ENABLE_BIT);
995*61046927SAndroid Build Coastguard Worker ctx->Fog.ColorSumEnabled = state;
996*61046927SAndroid Build Coastguard Worker break;
997*61046927SAndroid Build Coastguard Worker
998*61046927SAndroid Build Coastguard Worker /* GL_ARB_multisample */
999*61046927SAndroid Build Coastguard Worker case GL_MULTISAMPLE_ARB:
1000*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
1001*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1002*61046927SAndroid Build Coastguard Worker _mesa_set_multisample(ctx, state);
1003*61046927SAndroid Build Coastguard Worker return;
1004*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB:
1005*61046927SAndroid Build Coastguard Worker if (ctx->Multisample.SampleAlphaToCoverage == state)
1006*61046927SAndroid Build Coastguard Worker return;
1007*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
1008*61046927SAndroid Build Coastguard Worker GL_MULTISAMPLE_BIT | GL_ENABLE_BIT);
1009*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_BLEND;
1010*61046927SAndroid Build Coastguard Worker ctx->Multisample.SampleAlphaToCoverage = state;
1011*61046927SAndroid Build Coastguard Worker break;
1012*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_ALPHA_TO_ONE_ARB:
1013*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
1014*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1015*61046927SAndroid Build Coastguard Worker if (ctx->Multisample.SampleAlphaToOne == state)
1016*61046927SAndroid Build Coastguard Worker return;
1017*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
1018*61046927SAndroid Build Coastguard Worker GL_MULTISAMPLE_BIT | GL_ENABLE_BIT);
1019*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_BLEND;
1020*61046927SAndroid Build Coastguard Worker ctx->Multisample.SampleAlphaToOne = state;
1021*61046927SAndroid Build Coastguard Worker break;
1022*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_COVERAGE_ARB:
1023*61046927SAndroid Build Coastguard Worker if (ctx->Multisample.SampleCoverage == state)
1024*61046927SAndroid Build Coastguard Worker return;
1025*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
1026*61046927SAndroid Build Coastguard Worker GL_MULTISAMPLE_BIT | GL_ENABLE_BIT);
1027*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_SAMPLE_STATE;
1028*61046927SAndroid Build Coastguard Worker ctx->Multisample.SampleCoverage = state;
1029*61046927SAndroid Build Coastguard Worker break;
1030*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_COVERAGE_INVERT_ARB:
1031*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx))
1032*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1033*61046927SAndroid Build Coastguard Worker if (ctx->Multisample.SampleCoverageInvert == state)
1034*61046927SAndroid Build Coastguard Worker return;
1035*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_MULTISAMPLE_BIT);
1036*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_SAMPLE_STATE;
1037*61046927SAndroid Build Coastguard Worker ctx->Multisample.SampleCoverageInvert = state;
1038*61046927SAndroid Build Coastguard Worker break;
1039*61046927SAndroid Build Coastguard Worker
1040*61046927SAndroid Build Coastguard Worker /* GL_ARB_sample_shading */
1041*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_SHADING:
1042*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_sample_shading(ctx) && !_mesa_is_gles3(ctx))
1043*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1044*61046927SAndroid Build Coastguard Worker if (ctx->Multisample.SampleShading == state)
1045*61046927SAndroid Build Coastguard Worker return;
1046*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
1047*61046927SAndroid Build Coastguard Worker GL_MULTISAMPLE_BIT | GL_ENABLE_BIT);
1048*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ctx->DriverFlags.NewSampleShading;
1049*61046927SAndroid Build Coastguard Worker ctx->Multisample.SampleShading = state;
1050*61046927SAndroid Build Coastguard Worker break;
1051*61046927SAndroid Build Coastguard Worker
1052*61046927SAndroid Build Coastguard Worker /* GL_IBM_rasterpos_clip */
1053*61046927SAndroid Build Coastguard Worker case GL_RASTER_POSITION_UNCLIPPED_IBM:
1054*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1055*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1056*61046927SAndroid Build Coastguard Worker if (ctx->Transform.RasterPositionUnclipped == state)
1057*61046927SAndroid Build Coastguard Worker return;
1058*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_TRANSFORM_BIT | GL_ENABLE_BIT);
1059*61046927SAndroid Build Coastguard Worker ctx->Transform.RasterPositionUnclipped = state;
1060*61046927SAndroid Build Coastguard Worker break;
1061*61046927SAndroid Build Coastguard Worker
1062*61046927SAndroid Build Coastguard Worker /* GL_ARB_point_sprite */
1063*61046927SAndroid Build Coastguard Worker case GL_POINT_SPRITE:
1064*61046927SAndroid Build Coastguard Worker if (!(_mesa_is_desktop_gl_compat(ctx) &&
1065*61046927SAndroid Build Coastguard Worker _mesa_has_ARB_point_sprite(ctx)) &&
1066*61046927SAndroid Build Coastguard Worker !_mesa_has_OES_point_sprite(ctx))
1067*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1068*61046927SAndroid Build Coastguard Worker if (ctx->Point.PointSprite == state)
1069*61046927SAndroid Build Coastguard Worker return;
1070*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_POINT | _NEW_FF_VERT_PROGRAM |
1071*61046927SAndroid Build Coastguard Worker _NEW_FF_FRAG_PROGRAM, GL_POINT_BIT | GL_ENABLE_BIT);
1072*61046927SAndroid Build Coastguard Worker ctx->Point.PointSprite = state;
1073*61046927SAndroid Build Coastguard Worker break;
1074*61046927SAndroid Build Coastguard Worker
1075*61046927SAndroid Build Coastguard Worker case GL_VERTEX_PROGRAM_ARB:
1076*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_vertex_program(ctx))
1077*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1078*61046927SAndroid Build Coastguard Worker if (ctx->VertexProgram.Enabled == state)
1079*61046927SAndroid Build Coastguard Worker return;
1080*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PROGRAM, GL_ENABLE_BIT);
1081*61046927SAndroid Build Coastguard Worker ctx->VertexProgram.Enabled = state;
1082*61046927SAndroid Build Coastguard Worker _mesa_update_vertex_processing_mode(ctx);
1083*61046927SAndroid Build Coastguard Worker _mesa_update_valid_to_render_state(ctx);
1084*61046927SAndroid Build Coastguard Worker break;
1085*61046927SAndroid Build Coastguard Worker case GL_VERTEX_PROGRAM_POINT_SIZE_ARB:
1086*61046927SAndroid Build Coastguard Worker /* This was added with ARB_vertex_program, but it is also used with
1087*61046927SAndroid Build Coastguard Worker * GLSL vertex shaders on desktop.
1088*61046927SAndroid Build Coastguard Worker */
1089*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_vertex_program(ctx) &&
1090*61046927SAndroid Build Coastguard Worker ctx->API != API_OPENGL_CORE)
1091*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1092*61046927SAndroid Build Coastguard Worker if (ctx->VertexProgram.PointSizeEnabled == state)
1093*61046927SAndroid Build Coastguard Worker return;
1094*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, ctx->st->lower_point_size ? _NEW_PROGRAM : 0,
1095*61046927SAndroid Build Coastguard Worker GL_ENABLE_BIT);
1096*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
1097*61046927SAndroid Build Coastguard Worker ctx->VertexProgram.PointSizeEnabled = state;
1098*61046927SAndroid Build Coastguard Worker break;
1099*61046927SAndroid Build Coastguard Worker case GL_VERTEX_PROGRAM_TWO_SIDE_ARB:
1100*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_vertex_program(ctx))
1101*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1102*61046927SAndroid Build Coastguard Worker if (ctx->VertexProgram.TwoSideEnabled == state)
1103*61046927SAndroid Build Coastguard Worker return;
1104*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_ENABLE_BIT);
1105*61046927SAndroid Build Coastguard Worker if (ctx->st->lower_two_sided_color) {
1106*61046927SAndroid Build Coastguard Worker /* TODO: this could be smaller, but most drivers don't get here */
1107*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_VS_STATE |
1108*61046927SAndroid Build Coastguard Worker ST_NEW_TES_STATE |
1109*61046927SAndroid Build Coastguard Worker ST_NEW_GS_STATE;
1110*61046927SAndroid Build Coastguard Worker }
1111*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
1112*61046927SAndroid Build Coastguard Worker ctx->VertexProgram.TwoSideEnabled = state;
1113*61046927SAndroid Build Coastguard Worker break;
1114*61046927SAndroid Build Coastguard Worker
1115*61046927SAndroid Build Coastguard Worker /* GL_NV_texture_rectangle */
1116*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_RECTANGLE_NV:
1117*61046927SAndroid Build Coastguard Worker if (!_mesa_has_NV_texture_rectangle(ctx))
1118*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1119*61046927SAndroid Build Coastguard Worker if (!enable_texture(ctx, state, TEXTURE_RECT_BIT)) {
1120*61046927SAndroid Build Coastguard Worker return;
1121*61046927SAndroid Build Coastguard Worker }
1122*61046927SAndroid Build Coastguard Worker break;
1123*61046927SAndroid Build Coastguard Worker
1124*61046927SAndroid Build Coastguard Worker /* GL_EXT_stencil_two_side */
1125*61046927SAndroid Build Coastguard Worker case GL_STENCIL_TEST_TWO_SIDE_EXT:
1126*61046927SAndroid Build Coastguard Worker if (!_mesa_has_EXT_stencil_two_side(ctx))
1127*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1128*61046927SAndroid Build Coastguard Worker if (ctx->Stencil.TestTwoSide == state)
1129*61046927SAndroid Build Coastguard Worker return;
1130*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
1131*61046927SAndroid Build Coastguard Worker GL_STENCIL_BUFFER_BIT | GL_ENABLE_BIT);
1132*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_DSA;
1133*61046927SAndroid Build Coastguard Worker ctx->Stencil.TestTwoSide = state;
1134*61046927SAndroid Build Coastguard Worker if (state) {
1135*61046927SAndroid Build Coastguard Worker ctx->Stencil._BackFace = 2;
1136*61046927SAndroid Build Coastguard Worker } else {
1137*61046927SAndroid Build Coastguard Worker ctx->Stencil._BackFace = 1;
1138*61046927SAndroid Build Coastguard Worker }
1139*61046927SAndroid Build Coastguard Worker break;
1140*61046927SAndroid Build Coastguard Worker
1141*61046927SAndroid Build Coastguard Worker case GL_FRAGMENT_PROGRAM_ARB:
1142*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_fragment_program(ctx))
1143*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1144*61046927SAndroid Build Coastguard Worker if (ctx->FragmentProgram.Enabled == state)
1145*61046927SAndroid Build Coastguard Worker return;
1146*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PROGRAM, GL_ENABLE_BIT);
1147*61046927SAndroid Build Coastguard Worker ctx->FragmentProgram.Enabled = state;
1148*61046927SAndroid Build Coastguard Worker _mesa_update_valid_to_render_state(ctx);
1149*61046927SAndroid Build Coastguard Worker break;
1150*61046927SAndroid Build Coastguard Worker
1151*61046927SAndroid Build Coastguard Worker /* GL_EXT_depth_bounds_test */
1152*61046927SAndroid Build Coastguard Worker case GL_DEPTH_BOUNDS_TEST_EXT:
1153*61046927SAndroid Build Coastguard Worker if (!_mesa_has_EXT_depth_bounds_test(ctx))
1154*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1155*61046927SAndroid Build Coastguard Worker if (ctx->Depth.BoundsTest == state)
1156*61046927SAndroid Build Coastguard Worker return;
1157*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT);
1158*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_DSA;
1159*61046927SAndroid Build Coastguard Worker ctx->Depth.BoundsTest = state;
1160*61046927SAndroid Build Coastguard Worker break;
1161*61046927SAndroid Build Coastguard Worker
1162*61046927SAndroid Build Coastguard Worker case GL_DEPTH_CLAMP:
1163*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_depth_clamp(ctx) &&
1164*61046927SAndroid Build Coastguard Worker !_mesa_has_EXT_depth_clamp(ctx))
1165*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1166*61046927SAndroid Build Coastguard Worker if (ctx->Transform.DepthClampNear == state &&
1167*61046927SAndroid Build Coastguard Worker ctx->Transform.DepthClampFar == state)
1168*61046927SAndroid Build Coastguard Worker return;
1169*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
1170*61046927SAndroid Build Coastguard Worker GL_TRANSFORM_BIT | GL_ENABLE_BIT);
1171*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
1172*61046927SAndroid Build Coastguard Worker ctx->Transform.DepthClampNear = state;
1173*61046927SAndroid Build Coastguard Worker ctx->Transform.DepthClampFar = state;
1174*61046927SAndroid Build Coastguard Worker break;
1175*61046927SAndroid Build Coastguard Worker
1176*61046927SAndroid Build Coastguard Worker case GL_DEPTH_CLAMP_NEAR_AMD:
1177*61046927SAndroid Build Coastguard Worker if (!_mesa_has_AMD_depth_clamp_separate(ctx))
1178*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1179*61046927SAndroid Build Coastguard Worker if (ctx->Transform.DepthClampNear == state)
1180*61046927SAndroid Build Coastguard Worker return;
1181*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
1182*61046927SAndroid Build Coastguard Worker GL_TRANSFORM_BIT | GL_ENABLE_BIT);
1183*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
1184*61046927SAndroid Build Coastguard Worker ctx->Transform.DepthClampNear = state;
1185*61046927SAndroid Build Coastguard Worker break;
1186*61046927SAndroid Build Coastguard Worker
1187*61046927SAndroid Build Coastguard Worker case GL_DEPTH_CLAMP_FAR_AMD:
1188*61046927SAndroid Build Coastguard Worker if (!_mesa_has_AMD_depth_clamp_separate(ctx))
1189*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1190*61046927SAndroid Build Coastguard Worker if (ctx->Transform.DepthClampFar == state)
1191*61046927SAndroid Build Coastguard Worker return;
1192*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
1193*61046927SAndroid Build Coastguard Worker GL_TRANSFORM_BIT | GL_ENABLE_BIT);
1194*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
1195*61046927SAndroid Build Coastguard Worker ctx->Transform.DepthClampFar = state;
1196*61046927SAndroid Build Coastguard Worker break;
1197*61046927SAndroid Build Coastguard Worker
1198*61046927SAndroid Build Coastguard Worker case GL_FRAGMENT_SHADER_ATI:
1199*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ATI_fragment_shader(ctx))
1200*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1201*61046927SAndroid Build Coastguard Worker if (ctx->ATIFragmentShader.Enabled == state)
1202*61046927SAndroid Build Coastguard Worker return;
1203*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PROGRAM, GL_ENABLE_BIT);
1204*61046927SAndroid Build Coastguard Worker ctx->ATIFragmentShader.Enabled = state;
1205*61046927SAndroid Build Coastguard Worker break;
1206*61046927SAndroid Build Coastguard Worker
1207*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1208*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_seamless_cube_map(ctx))
1209*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1210*61046927SAndroid Build Coastguard Worker if (ctx->Texture.CubeMapSeamless != state) {
1211*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, 0);
1212*61046927SAndroid Build Coastguard Worker ctx->Texture.CubeMapSeamless = state;
1213*61046927SAndroid Build Coastguard Worker }
1214*61046927SAndroid Build Coastguard Worker break;
1215*61046927SAndroid Build Coastguard Worker
1216*61046927SAndroid Build Coastguard Worker case GL_RASTERIZER_DISCARD:
1217*61046927SAndroid Build Coastguard Worker if (!(_mesa_has_EXT_transform_feedback(ctx) || _mesa_is_gles3(ctx)))
1218*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1219*61046927SAndroid Build Coastguard Worker if (ctx->RasterDiscard != state) {
1220*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, 0);
1221*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
1222*61046927SAndroid Build Coastguard Worker ctx->RasterDiscard = state;
1223*61046927SAndroid Build Coastguard Worker }
1224*61046927SAndroid Build Coastguard Worker break;
1225*61046927SAndroid Build Coastguard Worker
1226*61046927SAndroid Build Coastguard Worker case GL_TILE_RASTER_ORDER_FIXED_MESA:
1227*61046927SAndroid Build Coastguard Worker if (!_mesa_has_MESA_tile_raster_order(ctx))
1228*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1229*61046927SAndroid Build Coastguard Worker if (ctx->TileRasterOrderFixed != state) {
1230*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_ENABLE_BIT);
1231*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
1232*61046927SAndroid Build Coastguard Worker ctx->TileRasterOrderFixed = state;
1233*61046927SAndroid Build Coastguard Worker }
1234*61046927SAndroid Build Coastguard Worker break;
1235*61046927SAndroid Build Coastguard Worker
1236*61046927SAndroid Build Coastguard Worker case GL_TILE_RASTER_ORDER_INCREASING_X_MESA:
1237*61046927SAndroid Build Coastguard Worker if (!_mesa_has_MESA_tile_raster_order(ctx))
1238*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1239*61046927SAndroid Build Coastguard Worker if (ctx->TileRasterOrderIncreasingX != state) {
1240*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_ENABLE_BIT);
1241*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
1242*61046927SAndroid Build Coastguard Worker ctx->TileRasterOrderIncreasingX = state;
1243*61046927SAndroid Build Coastguard Worker }
1244*61046927SAndroid Build Coastguard Worker break;
1245*61046927SAndroid Build Coastguard Worker
1246*61046927SAndroid Build Coastguard Worker case GL_TILE_RASTER_ORDER_INCREASING_Y_MESA:
1247*61046927SAndroid Build Coastguard Worker if (!_mesa_has_MESA_tile_raster_order(ctx))
1248*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1249*61046927SAndroid Build Coastguard Worker if (ctx->TileRasterOrderIncreasingY != state) {
1250*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_ENABLE_BIT);
1251*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_RASTERIZER;
1252*61046927SAndroid Build Coastguard Worker ctx->TileRasterOrderIncreasingY = state;
1253*61046927SAndroid Build Coastguard Worker }
1254*61046927SAndroid Build Coastguard Worker break;
1255*61046927SAndroid Build Coastguard Worker
1256*61046927SAndroid Build Coastguard Worker /* GL 3.1 primitive restart. Note: this enum is different from
1257*61046927SAndroid Build Coastguard Worker * GL_PRIMITIVE_RESTART_NV (which is client state).
1258*61046927SAndroid Build Coastguard Worker */
1259*61046927SAndroid Build Coastguard Worker case GL_PRIMITIVE_RESTART:
1260*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) || ctx->Version < 31) {
1261*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1262*61046927SAndroid Build Coastguard Worker }
1263*61046927SAndroid Build Coastguard Worker if (ctx->Array.PrimitiveRestart != state) {
1264*61046927SAndroid Build Coastguard Worker ctx->Array.PrimitiveRestart = state;
1265*61046927SAndroid Build Coastguard Worker _mesa_update_derived_primitive_restart_state(ctx);
1266*61046927SAndroid Build Coastguard Worker }
1267*61046927SAndroid Build Coastguard Worker break;
1268*61046927SAndroid Build Coastguard Worker
1269*61046927SAndroid Build Coastguard Worker case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1270*61046927SAndroid Build Coastguard Worker if (!_mesa_is_gles3_compatible(ctx))
1271*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1272*61046927SAndroid Build Coastguard Worker if (ctx->Array.PrimitiveRestartFixedIndex != state) {
1273*61046927SAndroid Build Coastguard Worker ctx->Array.PrimitiveRestartFixedIndex = state;
1274*61046927SAndroid Build Coastguard Worker _mesa_update_derived_primitive_restart_state(ctx);
1275*61046927SAndroid Build Coastguard Worker }
1276*61046927SAndroid Build Coastguard Worker break;
1277*61046927SAndroid Build Coastguard Worker
1278*61046927SAndroid Build Coastguard Worker /* GL3.0 - GL_framebuffer_sRGB */
1279*61046927SAndroid Build Coastguard Worker case GL_FRAMEBUFFER_SRGB_EXT:
1280*61046927SAndroid Build Coastguard Worker if (!_mesa_has_EXT_framebuffer_sRGB(ctx) &&
1281*61046927SAndroid Build Coastguard Worker !_mesa_has_EXT_sRGB_write_control(ctx))
1282*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1283*61046927SAndroid Build Coastguard Worker _mesa_set_framebuffer_srgb(ctx, state);
1284*61046927SAndroid Build Coastguard Worker return;
1285*61046927SAndroid Build Coastguard Worker
1286*61046927SAndroid Build Coastguard Worker /* GL_OES_EGL_image_external */
1287*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_EXTERNAL_OES:
1288*61046927SAndroid Build Coastguard Worker if (!_mesa_has_OES_EGL_image_external(ctx))
1289*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1290*61046927SAndroid Build Coastguard Worker if (!enable_texture(ctx, state, TEXTURE_EXTERNAL_BIT)) {
1291*61046927SAndroid Build Coastguard Worker return;
1292*61046927SAndroid Build Coastguard Worker }
1293*61046927SAndroid Build Coastguard Worker break;
1294*61046927SAndroid Build Coastguard Worker
1295*61046927SAndroid Build Coastguard Worker /* ARB_texture_multisample */
1296*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_MASK:
1297*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_texture_multisample(ctx) && !_mesa_is_gles31(ctx))
1298*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1299*61046927SAndroid Build Coastguard Worker if (ctx->Multisample.SampleMask == state)
1300*61046927SAndroid Build Coastguard Worker return;
1301*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, 0);
1302*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_SAMPLE_STATE;
1303*61046927SAndroid Build Coastguard Worker ctx->Multisample.SampleMask = state;
1304*61046927SAndroid Build Coastguard Worker break;
1305*61046927SAndroid Build Coastguard Worker
1306*61046927SAndroid Build Coastguard Worker case GL_BLEND_ADVANCED_COHERENT_KHR:
1307*61046927SAndroid Build Coastguard Worker if (!_mesa_has_KHR_blend_equation_advanced_coherent(ctx))
1308*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1309*61046927SAndroid Build Coastguard Worker if (ctx->Color.BlendCoherent == state)
1310*61046927SAndroid Build Coastguard Worker return;
1311*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_COLOR_BUFFER_BIT);
1312*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_BLEND;
1313*61046927SAndroid Build Coastguard Worker ctx->Color.BlendCoherent = state;
1314*61046927SAndroid Build Coastguard Worker break;
1315*61046927SAndroid Build Coastguard Worker
1316*61046927SAndroid Build Coastguard Worker case GL_BLACKHOLE_RENDER_INTEL:
1317*61046927SAndroid Build Coastguard Worker if (!_mesa_has_INTEL_blackhole_render(ctx))
1318*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1319*61046927SAndroid Build Coastguard Worker if (ctx->IntelBlackholeRender == state)
1320*61046927SAndroid Build Coastguard Worker return;
1321*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, 0);
1322*61046927SAndroid Build Coastguard Worker ctx->IntelBlackholeRender = state;
1323*61046927SAndroid Build Coastguard Worker ctx->pipe->set_frontend_noop(ctx->pipe, state);
1324*61046927SAndroid Build Coastguard Worker break;
1325*61046927SAndroid Build Coastguard Worker
1326*61046927SAndroid Build Coastguard Worker default:
1327*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1328*61046927SAndroid Build Coastguard Worker }
1329*61046927SAndroid Build Coastguard Worker return;
1330*61046927SAndroid Build Coastguard Worker
1331*61046927SAndroid Build Coastguard Worker invalid_enum_error:
1332*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "gl%s(%s)",
1333*61046927SAndroid Build Coastguard Worker state ? "Enable" : "Disable", _mesa_enum_to_string(cap));
1334*61046927SAndroid Build Coastguard Worker }
1335*61046927SAndroid Build Coastguard Worker
1336*61046927SAndroid Build Coastguard Worker
1337*61046927SAndroid Build Coastguard Worker /**
1338*61046927SAndroid Build Coastguard Worker * Enable GL capability. Called by glEnable()
1339*61046927SAndroid Build Coastguard Worker * \param cap state to enable.
1340*61046927SAndroid Build Coastguard Worker */
1341*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_Enable(GLenum cap)1342*61046927SAndroid Build Coastguard Worker _mesa_Enable( GLenum cap )
1343*61046927SAndroid Build Coastguard Worker {
1344*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1345*61046927SAndroid Build Coastguard Worker
1346*61046927SAndroid Build Coastguard Worker _mesa_set_enable( ctx, cap, GL_TRUE );
1347*61046927SAndroid Build Coastguard Worker }
1348*61046927SAndroid Build Coastguard Worker
1349*61046927SAndroid Build Coastguard Worker
1350*61046927SAndroid Build Coastguard Worker /**
1351*61046927SAndroid Build Coastguard Worker * Disable GL capability. Called by glDisable()
1352*61046927SAndroid Build Coastguard Worker * \param cap state to disable.
1353*61046927SAndroid Build Coastguard Worker */
1354*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_Disable(GLenum cap)1355*61046927SAndroid Build Coastguard Worker _mesa_Disable( GLenum cap )
1356*61046927SAndroid Build Coastguard Worker {
1357*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1358*61046927SAndroid Build Coastguard Worker
1359*61046927SAndroid Build Coastguard Worker _mesa_set_enable( ctx, cap, GL_FALSE );
1360*61046927SAndroid Build Coastguard Worker }
1361*61046927SAndroid Build Coastguard Worker
1362*61046927SAndroid Build Coastguard Worker
1363*61046927SAndroid Build Coastguard Worker
1364*61046927SAndroid Build Coastguard Worker /**
1365*61046927SAndroid Build Coastguard Worker * Enable/disable an indexed state var.
1366*61046927SAndroid Build Coastguard Worker */
1367*61046927SAndroid Build Coastguard Worker void
_mesa_set_enablei(struct gl_context * ctx,GLenum cap,GLuint index,GLboolean state)1368*61046927SAndroid Build Coastguard Worker _mesa_set_enablei(struct gl_context *ctx, GLenum cap,
1369*61046927SAndroid Build Coastguard Worker GLuint index, GLboolean state)
1370*61046927SAndroid Build Coastguard Worker {
1371*61046927SAndroid Build Coastguard Worker assert(state == 0 || state == 1);
1372*61046927SAndroid Build Coastguard Worker switch (cap) {
1373*61046927SAndroid Build Coastguard Worker case GL_BLEND:
1374*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_draw_buffers2) {
1375*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1376*61046927SAndroid Build Coastguard Worker }
1377*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxDrawBuffers) {
1378*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)",
1379*61046927SAndroid Build Coastguard Worker state ? "glEnableIndexed" : "glDisableIndexed", index);
1380*61046927SAndroid Build Coastguard Worker return;
1381*61046927SAndroid Build Coastguard Worker }
1382*61046927SAndroid Build Coastguard Worker if (((ctx->Color.BlendEnabled >> index) & 1) != state) {
1383*61046927SAndroid Build Coastguard Worker GLbitfield enabled = ctx->Color.BlendEnabled;
1384*61046927SAndroid Build Coastguard Worker
1385*61046927SAndroid Build Coastguard Worker if (state)
1386*61046927SAndroid Build Coastguard Worker enabled |= (1 << index);
1387*61046927SAndroid Build Coastguard Worker else
1388*61046927SAndroid Build Coastguard Worker enabled &= ~(1 << index);
1389*61046927SAndroid Build Coastguard Worker
1390*61046927SAndroid Build Coastguard Worker _mesa_flush_vertices_for_blend_adv(ctx, enabled,
1391*61046927SAndroid Build Coastguard Worker ctx->Color._AdvancedBlendMode);
1392*61046927SAndroid Build Coastguard Worker ctx->PopAttribState |= GL_ENABLE_BIT;
1393*61046927SAndroid Build Coastguard Worker ctx->Color.BlendEnabled = enabled;
1394*61046927SAndroid Build Coastguard Worker _mesa_update_allow_draw_out_of_order(ctx);
1395*61046927SAndroid Build Coastguard Worker _mesa_update_valid_to_render_state(ctx);
1396*61046927SAndroid Build Coastguard Worker }
1397*61046927SAndroid Build Coastguard Worker break;
1398*61046927SAndroid Build Coastguard Worker case GL_SCISSOR_TEST:
1399*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxViewports) {
1400*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)",
1401*61046927SAndroid Build Coastguard Worker state ? "glEnablei" : "glDisablei", index);
1402*61046927SAndroid Build Coastguard Worker return;
1403*61046927SAndroid Build Coastguard Worker }
1404*61046927SAndroid Build Coastguard Worker if (((ctx->Scissor.EnableFlags >> index) & 1) != state) {
1405*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0,
1406*61046927SAndroid Build Coastguard Worker GL_SCISSOR_BIT | GL_ENABLE_BIT);
1407*61046927SAndroid Build Coastguard Worker ctx->NewDriverState |= ST_NEW_SCISSOR | ST_NEW_RASTERIZER;
1408*61046927SAndroid Build Coastguard Worker if (state)
1409*61046927SAndroid Build Coastguard Worker ctx->Scissor.EnableFlags |= (1 << index);
1410*61046927SAndroid Build Coastguard Worker else
1411*61046927SAndroid Build Coastguard Worker ctx->Scissor.EnableFlags &= ~(1 << index);
1412*61046927SAndroid Build Coastguard Worker }
1413*61046927SAndroid Build Coastguard Worker break;
1414*61046927SAndroid Build Coastguard Worker /* EXT_direct_state_access */
1415*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_1D:
1416*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D:
1417*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_3D:
1418*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP:
1419*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_S:
1420*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_T:
1421*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_R:
1422*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_Q:
1423*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_RECTANGLE_ARB: {
1424*61046927SAndroid Build Coastguard Worker const GLuint curTexUnitSave = ctx->Texture.CurrentUnit;
1425*61046927SAndroid Build Coastguard Worker if (index >= MAX2(ctx->Const.MaxCombinedTextureImageUnits,
1426*61046927SAndroid Build Coastguard Worker ctx->Const.MaxTextureCoordUnits)) {
1427*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)",
1428*61046927SAndroid Build Coastguard Worker state ? "glEnablei" : "glDisablei", index);
1429*61046927SAndroid Build Coastguard Worker return;
1430*61046927SAndroid Build Coastguard Worker }
1431*61046927SAndroid Build Coastguard Worker _mesa_ActiveTexture(GL_TEXTURE0 + index);
1432*61046927SAndroid Build Coastguard Worker _mesa_set_enable( ctx, cap, state );
1433*61046927SAndroid Build Coastguard Worker _mesa_ActiveTexture(GL_TEXTURE0 + curTexUnitSave);
1434*61046927SAndroid Build Coastguard Worker break;
1435*61046927SAndroid Build Coastguard Worker }
1436*61046927SAndroid Build Coastguard Worker default:
1437*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1438*61046927SAndroid Build Coastguard Worker }
1439*61046927SAndroid Build Coastguard Worker return;
1440*61046927SAndroid Build Coastguard Worker
1441*61046927SAndroid Build Coastguard Worker invalid_enum_error:
1442*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "%s(cap=%s)",
1443*61046927SAndroid Build Coastguard Worker state ? "glEnablei" : "glDisablei",
1444*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(cap));
1445*61046927SAndroid Build Coastguard Worker }
1446*61046927SAndroid Build Coastguard Worker
1447*61046927SAndroid Build Coastguard Worker
1448*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_Disablei(GLenum cap,GLuint index)1449*61046927SAndroid Build Coastguard Worker _mesa_Disablei( GLenum cap, GLuint index )
1450*61046927SAndroid Build Coastguard Worker {
1451*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1452*61046927SAndroid Build Coastguard Worker _mesa_set_enablei(ctx, cap, index, GL_FALSE);
1453*61046927SAndroid Build Coastguard Worker }
1454*61046927SAndroid Build Coastguard Worker
1455*61046927SAndroid Build Coastguard Worker
1456*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_Enablei(GLenum cap,GLuint index)1457*61046927SAndroid Build Coastguard Worker _mesa_Enablei( GLenum cap, GLuint index )
1458*61046927SAndroid Build Coastguard Worker {
1459*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1460*61046927SAndroid Build Coastguard Worker _mesa_set_enablei(ctx, cap, index, GL_TRUE);
1461*61046927SAndroid Build Coastguard Worker }
1462*61046927SAndroid Build Coastguard Worker
1463*61046927SAndroid Build Coastguard Worker
1464*61046927SAndroid Build Coastguard Worker GLboolean GLAPIENTRY
_mesa_IsEnabledi(GLenum cap,GLuint index)1465*61046927SAndroid Build Coastguard Worker _mesa_IsEnabledi( GLenum cap, GLuint index )
1466*61046927SAndroid Build Coastguard Worker {
1467*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1468*61046927SAndroid Build Coastguard Worker ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
1469*61046927SAndroid Build Coastguard Worker switch (cap) {
1470*61046927SAndroid Build Coastguard Worker case GL_BLEND:
1471*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxDrawBuffers) {
1472*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "glIsEnabledIndexed(index=%u)",
1473*61046927SAndroid Build Coastguard Worker index);
1474*61046927SAndroid Build Coastguard Worker return GL_FALSE;
1475*61046927SAndroid Build Coastguard Worker }
1476*61046927SAndroid Build Coastguard Worker return (ctx->Color.BlendEnabled >> index) & 1;
1477*61046927SAndroid Build Coastguard Worker case GL_SCISSOR_TEST:
1478*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxViewports) {
1479*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "glIsEnabledIndexed(index=%u)",
1480*61046927SAndroid Build Coastguard Worker index);
1481*61046927SAndroid Build Coastguard Worker return GL_FALSE;
1482*61046927SAndroid Build Coastguard Worker }
1483*61046927SAndroid Build Coastguard Worker return (ctx->Scissor.EnableFlags >> index) & 1;
1484*61046927SAndroid Build Coastguard Worker /* EXT_direct_state_access */
1485*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_1D:
1486*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D:
1487*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_3D:
1488*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP:
1489*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_S:
1490*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_T:
1491*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_R:
1492*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_Q:
1493*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_RECTANGLE_ARB: {
1494*61046927SAndroid Build Coastguard Worker GLboolean state;
1495*61046927SAndroid Build Coastguard Worker const GLuint curTexUnitSave = ctx->Texture.CurrentUnit;
1496*61046927SAndroid Build Coastguard Worker if (index >= MAX2(ctx->Const.MaxCombinedTextureImageUnits,
1497*61046927SAndroid Build Coastguard Worker ctx->Const.MaxTextureCoordUnits)) {
1498*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "glIsEnabledIndexed(index=%u)",
1499*61046927SAndroid Build Coastguard Worker index);
1500*61046927SAndroid Build Coastguard Worker return GL_FALSE;
1501*61046927SAndroid Build Coastguard Worker }
1502*61046927SAndroid Build Coastguard Worker _mesa_ActiveTexture(GL_TEXTURE0 + index);
1503*61046927SAndroid Build Coastguard Worker state = _mesa_IsEnabled(cap);
1504*61046927SAndroid Build Coastguard Worker _mesa_ActiveTexture(GL_TEXTURE0 + curTexUnitSave);
1505*61046927SAndroid Build Coastguard Worker return state;
1506*61046927SAndroid Build Coastguard Worker }
1507*61046927SAndroid Build Coastguard Worker default:
1508*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabledIndexed(cap=%s)",
1509*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(cap));
1510*61046927SAndroid Build Coastguard Worker return GL_FALSE;
1511*61046927SAndroid Build Coastguard Worker }
1512*61046927SAndroid Build Coastguard Worker }
1513*61046927SAndroid Build Coastguard Worker
1514*61046927SAndroid Build Coastguard Worker
1515*61046927SAndroid Build Coastguard Worker
1516*61046927SAndroid Build Coastguard Worker /**
1517*61046927SAndroid Build Coastguard Worker * Helper function to determine whether a texture target is enabled.
1518*61046927SAndroid Build Coastguard Worker */
1519*61046927SAndroid Build Coastguard Worker static GLboolean
is_texture_enabled(struct gl_context * ctx,GLbitfield bit)1520*61046927SAndroid Build Coastguard Worker is_texture_enabled(struct gl_context *ctx, GLbitfield bit)
1521*61046927SAndroid Build Coastguard Worker {
1522*61046927SAndroid Build Coastguard Worker const struct gl_fixedfunc_texture_unit *const texUnit =
1523*61046927SAndroid Build Coastguard Worker _mesa_get_fixedfunc_tex_unit(ctx, ctx->Texture.CurrentUnit);
1524*61046927SAndroid Build Coastguard Worker
1525*61046927SAndroid Build Coastguard Worker if (!texUnit)
1526*61046927SAndroid Build Coastguard Worker return GL_FALSE;
1527*61046927SAndroid Build Coastguard Worker
1528*61046927SAndroid Build Coastguard Worker return (texUnit->Enabled & bit) ? GL_TRUE : GL_FALSE;
1529*61046927SAndroid Build Coastguard Worker }
1530*61046927SAndroid Build Coastguard Worker
1531*61046927SAndroid Build Coastguard Worker
1532*61046927SAndroid Build Coastguard Worker /**
1533*61046927SAndroid Build Coastguard Worker * Return simple enable/disable state.
1534*61046927SAndroid Build Coastguard Worker *
1535*61046927SAndroid Build Coastguard Worker * \param cap state variable to query.
1536*61046927SAndroid Build Coastguard Worker *
1537*61046927SAndroid Build Coastguard Worker * Returns the state of the specified capability from the current GL context.
1538*61046927SAndroid Build Coastguard Worker * For the capabilities associated with extensions verifies that those
1539*61046927SAndroid Build Coastguard Worker * extensions are effectively present before reporting.
1540*61046927SAndroid Build Coastguard Worker */
1541*61046927SAndroid Build Coastguard Worker GLboolean GLAPIENTRY
_mesa_IsEnabled(GLenum cap)1542*61046927SAndroid Build Coastguard Worker _mesa_IsEnabled( GLenum cap )
1543*61046927SAndroid Build Coastguard Worker {
1544*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1545*61046927SAndroid Build Coastguard Worker ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
1546*61046927SAndroid Build Coastguard Worker
1547*61046927SAndroid Build Coastguard Worker switch (cap) {
1548*61046927SAndroid Build Coastguard Worker case GL_ALPHA_TEST:
1549*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1550*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1551*61046927SAndroid Build Coastguard Worker return ctx->Color.AlphaEnabled;
1552*61046927SAndroid Build Coastguard Worker case GL_AUTO_NORMAL:
1553*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1554*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1555*61046927SAndroid Build Coastguard Worker return ctx->Eval.AutoNormal;
1556*61046927SAndroid Build Coastguard Worker case GL_BLEND:
1557*61046927SAndroid Build Coastguard Worker return ctx->Color.BlendEnabled & 1; /* return state for buffer[0] */
1558*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE0: /* aka GL_CLIP_PLANE0 */
1559*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE1:
1560*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE2:
1561*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE3:
1562*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE4:
1563*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE5:
1564*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE6:
1565*61046927SAndroid Build Coastguard Worker case GL_CLIP_DISTANCE7: {
1566*61046927SAndroid Build Coastguard Worker const GLuint p = cap - GL_CLIP_DISTANCE0;
1567*61046927SAndroid Build Coastguard Worker
1568*61046927SAndroid Build Coastguard Worker if (p >= ctx->Const.MaxClipPlanes)
1569*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1570*61046927SAndroid Build Coastguard Worker
1571*61046927SAndroid Build Coastguard Worker return (ctx->Transform.ClipPlanesEnabled >> p) & 1;
1572*61046927SAndroid Build Coastguard Worker }
1573*61046927SAndroid Build Coastguard Worker case GL_COLOR_MATERIAL:
1574*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1575*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1576*61046927SAndroid Build Coastguard Worker return ctx->Light.ColorMaterialEnabled;
1577*61046927SAndroid Build Coastguard Worker case GL_CULL_FACE:
1578*61046927SAndroid Build Coastguard Worker return ctx->Polygon.CullFlag;
1579*61046927SAndroid Build Coastguard Worker case GL_DEBUG_OUTPUT:
1580*61046927SAndroid Build Coastguard Worker case GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB:
1581*61046927SAndroid Build Coastguard Worker return (GLboolean) _mesa_get_debug_state_int(ctx, cap);
1582*61046927SAndroid Build Coastguard Worker case GL_DEPTH_TEST:
1583*61046927SAndroid Build Coastguard Worker return ctx->Depth.Test;
1584*61046927SAndroid Build Coastguard Worker case GL_DITHER:
1585*61046927SAndroid Build Coastguard Worker return ctx->Color.DitherFlag;
1586*61046927SAndroid Build Coastguard Worker case GL_FOG:
1587*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1588*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1589*61046927SAndroid Build Coastguard Worker return ctx->Fog.Enabled;
1590*61046927SAndroid Build Coastguard Worker case GL_LIGHTING:
1591*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1592*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1593*61046927SAndroid Build Coastguard Worker return ctx->Light.Enabled;
1594*61046927SAndroid Build Coastguard Worker case GL_LIGHT0:
1595*61046927SAndroid Build Coastguard Worker case GL_LIGHT1:
1596*61046927SAndroid Build Coastguard Worker case GL_LIGHT2:
1597*61046927SAndroid Build Coastguard Worker case GL_LIGHT3:
1598*61046927SAndroid Build Coastguard Worker case GL_LIGHT4:
1599*61046927SAndroid Build Coastguard Worker case GL_LIGHT5:
1600*61046927SAndroid Build Coastguard Worker case GL_LIGHT6:
1601*61046927SAndroid Build Coastguard Worker case GL_LIGHT7:
1602*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1603*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1604*61046927SAndroid Build Coastguard Worker return ctx->Light.Light[cap-GL_LIGHT0].Enabled;
1605*61046927SAndroid Build Coastguard Worker case GL_LINE_SMOOTH:
1606*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
1607*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1608*61046927SAndroid Build Coastguard Worker return ctx->Line.SmoothFlag;
1609*61046927SAndroid Build Coastguard Worker case GL_LINE_STIPPLE:
1610*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1611*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1612*61046927SAndroid Build Coastguard Worker return ctx->Line.StippleFlag;
1613*61046927SAndroid Build Coastguard Worker case GL_INDEX_LOGIC_OP:
1614*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1615*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1616*61046927SAndroid Build Coastguard Worker return ctx->Color.IndexLogicOpEnabled;
1617*61046927SAndroid Build Coastguard Worker case GL_COLOR_LOGIC_OP:
1618*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
1619*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1620*61046927SAndroid Build Coastguard Worker return ctx->Color.ColorLogicOpEnabled;
1621*61046927SAndroid Build Coastguard Worker case GL_MAP1_COLOR_4:
1622*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1623*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1624*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map1Color4;
1625*61046927SAndroid Build Coastguard Worker case GL_MAP1_INDEX:
1626*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1627*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1628*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map1Index;
1629*61046927SAndroid Build Coastguard Worker case GL_MAP1_NORMAL:
1630*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1631*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1632*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map1Normal;
1633*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_1:
1634*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1635*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1636*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map1TextureCoord1;
1637*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_2:
1638*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1639*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1640*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map1TextureCoord2;
1641*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_3:
1642*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1643*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1644*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map1TextureCoord3;
1645*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_4:
1646*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1647*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1648*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map1TextureCoord4;
1649*61046927SAndroid Build Coastguard Worker case GL_MAP1_VERTEX_3:
1650*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1651*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1652*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map1Vertex3;
1653*61046927SAndroid Build Coastguard Worker case GL_MAP1_VERTEX_4:
1654*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1655*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1656*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map1Vertex4;
1657*61046927SAndroid Build Coastguard Worker case GL_MAP2_COLOR_4:
1658*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1659*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1660*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map2Color4;
1661*61046927SAndroid Build Coastguard Worker case GL_MAP2_INDEX:
1662*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1663*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1664*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map2Index;
1665*61046927SAndroid Build Coastguard Worker case GL_MAP2_NORMAL:
1666*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1667*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1668*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map2Normal;
1669*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_1:
1670*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1671*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1672*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map2TextureCoord1;
1673*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_2:
1674*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1675*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1676*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map2TextureCoord2;
1677*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_3:
1678*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1679*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1680*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map2TextureCoord3;
1681*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_4:
1682*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1683*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1684*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map2TextureCoord4;
1685*61046927SAndroid Build Coastguard Worker case GL_MAP2_VERTEX_3:
1686*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1687*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1688*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map2Vertex3;
1689*61046927SAndroid Build Coastguard Worker case GL_MAP2_VERTEX_4:
1690*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1691*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1692*61046927SAndroid Build Coastguard Worker return ctx->Eval.Map2Vertex4;
1693*61046927SAndroid Build Coastguard Worker case GL_NORMALIZE:
1694*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1695*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1696*61046927SAndroid Build Coastguard Worker return ctx->Transform.Normalize;
1697*61046927SAndroid Build Coastguard Worker case GL_POINT_SMOOTH:
1698*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1699*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1700*61046927SAndroid Build Coastguard Worker return ctx->Point.SmoothFlag;
1701*61046927SAndroid Build Coastguard Worker case GL_POLYGON_SMOOTH:
1702*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx))
1703*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1704*61046927SAndroid Build Coastguard Worker return ctx->Polygon.SmoothFlag;
1705*61046927SAndroid Build Coastguard Worker case GL_POLYGON_STIPPLE:
1706*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1707*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1708*61046927SAndroid Build Coastguard Worker return ctx->Polygon.StippleFlag;
1709*61046927SAndroid Build Coastguard Worker case GL_POLYGON_OFFSET_POINT:
1710*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx))
1711*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1712*61046927SAndroid Build Coastguard Worker return ctx->Polygon.OffsetPoint;
1713*61046927SAndroid Build Coastguard Worker case GL_POLYGON_OFFSET_LINE:
1714*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx))
1715*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1716*61046927SAndroid Build Coastguard Worker return ctx->Polygon.OffsetLine;
1717*61046927SAndroid Build Coastguard Worker case GL_POLYGON_OFFSET_FILL:
1718*61046927SAndroid Build Coastguard Worker return ctx->Polygon.OffsetFill;
1719*61046927SAndroid Build Coastguard Worker case GL_RESCALE_NORMAL_EXT:
1720*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1721*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1722*61046927SAndroid Build Coastguard Worker return ctx->Transform.RescaleNormals;
1723*61046927SAndroid Build Coastguard Worker case GL_SCISSOR_TEST:
1724*61046927SAndroid Build Coastguard Worker return ctx->Scissor.EnableFlags & 1; /* return state for index 0 */
1725*61046927SAndroid Build Coastguard Worker case GL_STENCIL_TEST:
1726*61046927SAndroid Build Coastguard Worker return ctx->Stencil.Enabled;
1727*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_1D:
1728*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1729*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1730*61046927SAndroid Build Coastguard Worker return is_texture_enabled(ctx, TEXTURE_1D_BIT);
1731*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D:
1732*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1733*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1734*61046927SAndroid Build Coastguard Worker return is_texture_enabled(ctx, TEXTURE_2D_BIT);
1735*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_3D:
1736*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1737*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1738*61046927SAndroid Build Coastguard Worker return is_texture_enabled(ctx, TEXTURE_3D_BIT);
1739*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_S:
1740*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_T:
1741*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_R:
1742*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_Q:
1743*61046927SAndroid Build Coastguard Worker {
1744*61046927SAndroid Build Coastguard Worker const struct gl_fixedfunc_texture_unit *texUnit =
1745*61046927SAndroid Build Coastguard Worker get_texcoord_unit(ctx);
1746*61046927SAndroid Build Coastguard Worker
1747*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1748*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1749*61046927SAndroid Build Coastguard Worker
1750*61046927SAndroid Build Coastguard Worker if (texUnit) {
1751*61046927SAndroid Build Coastguard Worker GLbitfield coordBit = S_BIT << (cap - GL_TEXTURE_GEN_S);
1752*61046927SAndroid Build Coastguard Worker return (texUnit->TexGenEnabled & coordBit) ? GL_TRUE : GL_FALSE;
1753*61046927SAndroid Build Coastguard Worker }
1754*61046927SAndroid Build Coastguard Worker }
1755*61046927SAndroid Build Coastguard Worker return GL_FALSE;
1756*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_STR_OES:
1757*61046927SAndroid Build Coastguard Worker {
1758*61046927SAndroid Build Coastguard Worker const struct gl_fixedfunc_texture_unit *texUnit =
1759*61046927SAndroid Build Coastguard Worker get_texcoord_unit(ctx);
1760*61046927SAndroid Build Coastguard Worker
1761*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGLES)
1762*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1763*61046927SAndroid Build Coastguard Worker
1764*61046927SAndroid Build Coastguard Worker if (texUnit) {
1765*61046927SAndroid Build Coastguard Worker return (texUnit->TexGenEnabled & STR_BITS) == STR_BITS
1766*61046927SAndroid Build Coastguard Worker ? GL_TRUE : GL_FALSE;
1767*61046927SAndroid Build Coastguard Worker }
1768*61046927SAndroid Build Coastguard Worker
1769*61046927SAndroid Build Coastguard Worker return GL_FALSE;
1770*61046927SAndroid Build Coastguard Worker }
1771*61046927SAndroid Build Coastguard Worker
1772*61046927SAndroid Build Coastguard Worker /* client-side state */
1773*61046927SAndroid Build Coastguard Worker case GL_VERTEX_ARRAY:
1774*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1775*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1776*61046927SAndroid Build Coastguard Worker return !!(ctx->Array.VAO->Enabled & VERT_BIT_POS);
1777*61046927SAndroid Build Coastguard Worker case GL_NORMAL_ARRAY:
1778*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1779*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1780*61046927SAndroid Build Coastguard Worker return !!(ctx->Array.VAO->Enabled & VERT_BIT_NORMAL);
1781*61046927SAndroid Build Coastguard Worker case GL_COLOR_ARRAY:
1782*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1783*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1784*61046927SAndroid Build Coastguard Worker return !!(ctx->Array.VAO->Enabled & VERT_BIT_COLOR0);
1785*61046927SAndroid Build Coastguard Worker case GL_INDEX_ARRAY:
1786*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1787*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1788*61046927SAndroid Build Coastguard Worker return !!(ctx->Array.VAO->Enabled & VERT_BIT_COLOR_INDEX);
1789*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COORD_ARRAY:
1790*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1791*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1792*61046927SAndroid Build Coastguard Worker return !!(ctx->Array.VAO->Enabled &
1793*61046927SAndroid Build Coastguard Worker VERT_BIT_TEX(ctx->Array.ActiveTexture));
1794*61046927SAndroid Build Coastguard Worker case GL_EDGE_FLAG_ARRAY:
1795*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1796*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1797*61046927SAndroid Build Coastguard Worker return !!(ctx->Array.VAO->Enabled & VERT_BIT_EDGEFLAG);
1798*61046927SAndroid Build Coastguard Worker case GL_FOG_COORDINATE_ARRAY_EXT:
1799*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1800*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1801*61046927SAndroid Build Coastguard Worker return !!(ctx->Array.VAO->Enabled & VERT_BIT_FOG);
1802*61046927SAndroid Build Coastguard Worker case GL_SECONDARY_COLOR_ARRAY_EXT:
1803*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1804*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1805*61046927SAndroid Build Coastguard Worker return !!(ctx->Array.VAO->Enabled & VERT_BIT_COLOR1);
1806*61046927SAndroid Build Coastguard Worker case GL_POINT_SIZE_ARRAY_OES:
1807*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGLES)
1808*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1809*61046927SAndroid Build Coastguard Worker return !!(ctx->Array.VAO->Enabled & VERT_BIT_POINT_SIZE);
1810*61046927SAndroid Build Coastguard Worker
1811*61046927SAndroid Build Coastguard Worker /* GL_ARB_texture_cube_map */
1812*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP:
1813*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
1814*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1815*61046927SAndroid Build Coastguard Worker return is_texture_enabled(ctx, TEXTURE_CUBE_BIT);
1816*61046927SAndroid Build Coastguard Worker
1817*61046927SAndroid Build Coastguard Worker /* GL_EXT_secondary_color */
1818*61046927SAndroid Build Coastguard Worker case GL_COLOR_SUM_EXT:
1819*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1820*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1821*61046927SAndroid Build Coastguard Worker return ctx->Fog.ColorSumEnabled;
1822*61046927SAndroid Build Coastguard Worker
1823*61046927SAndroid Build Coastguard Worker /* GL_ARB_multisample */
1824*61046927SAndroid Build Coastguard Worker case GL_MULTISAMPLE_ARB:
1825*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
1826*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1827*61046927SAndroid Build Coastguard Worker return ctx->Multisample.Enabled;
1828*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB:
1829*61046927SAndroid Build Coastguard Worker return ctx->Multisample.SampleAlphaToCoverage;
1830*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_ALPHA_TO_ONE_ARB:
1831*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
1832*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1833*61046927SAndroid Build Coastguard Worker return ctx->Multisample.SampleAlphaToOne;
1834*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_COVERAGE_ARB:
1835*61046927SAndroid Build Coastguard Worker return ctx->Multisample.SampleCoverage;
1836*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_COVERAGE_INVERT_ARB:
1837*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx))
1838*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1839*61046927SAndroid Build Coastguard Worker return ctx->Multisample.SampleCoverageInvert;
1840*61046927SAndroid Build Coastguard Worker
1841*61046927SAndroid Build Coastguard Worker /* GL_IBM_rasterpos_clip */
1842*61046927SAndroid Build Coastguard Worker case GL_RASTER_POSITION_UNCLIPPED_IBM:
1843*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1844*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1845*61046927SAndroid Build Coastguard Worker return ctx->Transform.RasterPositionUnclipped;
1846*61046927SAndroid Build Coastguard Worker
1847*61046927SAndroid Build Coastguard Worker /* GL_ARB_point_sprite */
1848*61046927SAndroid Build Coastguard Worker case GL_POINT_SPRITE:
1849*61046927SAndroid Build Coastguard Worker if (!(_mesa_is_desktop_gl_compat(ctx) &&
1850*61046927SAndroid Build Coastguard Worker _mesa_has_ARB_point_sprite(ctx)) &&
1851*61046927SAndroid Build Coastguard Worker !_mesa_has_OES_point_sprite(ctx))
1852*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1853*61046927SAndroid Build Coastguard Worker return ctx->Point.PointSprite;
1854*61046927SAndroid Build Coastguard Worker
1855*61046927SAndroid Build Coastguard Worker case GL_VERTEX_PROGRAM_ARB:
1856*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_vertex_program(ctx))
1857*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1858*61046927SAndroid Build Coastguard Worker return ctx->VertexProgram.Enabled;
1859*61046927SAndroid Build Coastguard Worker case GL_VERTEX_PROGRAM_POINT_SIZE_ARB:
1860*61046927SAndroid Build Coastguard Worker /* This was added with ARB_vertex_program, but it is also used with
1861*61046927SAndroid Build Coastguard Worker * GLSL vertex shaders on desktop.
1862*61046927SAndroid Build Coastguard Worker */
1863*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_vertex_program(ctx) &&
1864*61046927SAndroid Build Coastguard Worker ctx->API != API_OPENGL_CORE)
1865*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1866*61046927SAndroid Build Coastguard Worker return ctx->VertexProgram.PointSizeEnabled;
1867*61046927SAndroid Build Coastguard Worker case GL_VERTEX_PROGRAM_TWO_SIDE_ARB:
1868*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_vertex_program(ctx))
1869*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1870*61046927SAndroid Build Coastguard Worker return ctx->VertexProgram.TwoSideEnabled;
1871*61046927SAndroid Build Coastguard Worker
1872*61046927SAndroid Build Coastguard Worker /* GL_NV_texture_rectangle */
1873*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_RECTANGLE_NV:
1874*61046927SAndroid Build Coastguard Worker if (!_mesa_has_NV_texture_rectangle(ctx))
1875*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1876*61046927SAndroid Build Coastguard Worker return is_texture_enabled(ctx, TEXTURE_RECT_BIT);
1877*61046927SAndroid Build Coastguard Worker
1878*61046927SAndroid Build Coastguard Worker /* GL_EXT_stencil_two_side */
1879*61046927SAndroid Build Coastguard Worker case GL_STENCIL_TEST_TWO_SIDE_EXT:
1880*61046927SAndroid Build Coastguard Worker if (!_mesa_has_EXT_stencil_two_side(ctx))
1881*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1882*61046927SAndroid Build Coastguard Worker return ctx->Stencil.TestTwoSide;
1883*61046927SAndroid Build Coastguard Worker
1884*61046927SAndroid Build Coastguard Worker case GL_FRAGMENT_PROGRAM_ARB:
1885*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_fragment_program(ctx))
1886*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1887*61046927SAndroid Build Coastguard Worker return ctx->FragmentProgram.Enabled;
1888*61046927SAndroid Build Coastguard Worker
1889*61046927SAndroid Build Coastguard Worker /* GL_EXT_depth_bounds_test */
1890*61046927SAndroid Build Coastguard Worker case GL_DEPTH_BOUNDS_TEST_EXT:
1891*61046927SAndroid Build Coastguard Worker if (!_mesa_has_EXT_depth_bounds_test(ctx))
1892*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1893*61046927SAndroid Build Coastguard Worker return ctx->Depth.BoundsTest;
1894*61046927SAndroid Build Coastguard Worker
1895*61046927SAndroid Build Coastguard Worker /* GL_ARB_depth_clamp */
1896*61046927SAndroid Build Coastguard Worker case GL_DEPTH_CLAMP:
1897*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_depth_clamp(ctx) &&
1898*61046927SAndroid Build Coastguard Worker !_mesa_has_EXT_depth_clamp(ctx))
1899*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1900*61046927SAndroid Build Coastguard Worker return ctx->Transform.DepthClampNear ||
1901*61046927SAndroid Build Coastguard Worker ctx->Transform.DepthClampFar;
1902*61046927SAndroid Build Coastguard Worker
1903*61046927SAndroid Build Coastguard Worker case GL_DEPTH_CLAMP_NEAR_AMD:
1904*61046927SAndroid Build Coastguard Worker if (!_mesa_has_AMD_depth_clamp_separate(ctx))
1905*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1906*61046927SAndroid Build Coastguard Worker return ctx->Transform.DepthClampNear;
1907*61046927SAndroid Build Coastguard Worker
1908*61046927SAndroid Build Coastguard Worker case GL_DEPTH_CLAMP_FAR_AMD:
1909*61046927SAndroid Build Coastguard Worker if (!_mesa_has_AMD_depth_clamp_separate(ctx))
1910*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1911*61046927SAndroid Build Coastguard Worker return ctx->Transform.DepthClampFar;
1912*61046927SAndroid Build Coastguard Worker
1913*61046927SAndroid Build Coastguard Worker case GL_FRAGMENT_SHADER_ATI:
1914*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ATI_fragment_shader(ctx))
1915*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1916*61046927SAndroid Build Coastguard Worker return ctx->ATIFragmentShader.Enabled;
1917*61046927SAndroid Build Coastguard Worker
1918*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1919*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_seamless_cube_map(ctx))
1920*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1921*61046927SAndroid Build Coastguard Worker return ctx->Texture.CubeMapSeamless;
1922*61046927SAndroid Build Coastguard Worker
1923*61046927SAndroid Build Coastguard Worker case GL_RASTERIZER_DISCARD:
1924*61046927SAndroid Build Coastguard Worker if (!(_mesa_has_EXT_transform_feedback(ctx) || _mesa_is_gles3(ctx)))
1925*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1926*61046927SAndroid Build Coastguard Worker return ctx->RasterDiscard;
1927*61046927SAndroid Build Coastguard Worker
1928*61046927SAndroid Build Coastguard Worker /* GL_NV_primitive_restart */
1929*61046927SAndroid Build Coastguard Worker case GL_PRIMITIVE_RESTART_NV:
1930*61046927SAndroid Build Coastguard Worker if (!_mesa_has_NV_primitive_restart(ctx))
1931*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1932*61046927SAndroid Build Coastguard Worker return ctx->Array.PrimitiveRestart;
1933*61046927SAndroid Build Coastguard Worker
1934*61046927SAndroid Build Coastguard Worker /* GL 3.1 primitive restart */
1935*61046927SAndroid Build Coastguard Worker case GL_PRIMITIVE_RESTART:
1936*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) || ctx->Version < 31) {
1937*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1938*61046927SAndroid Build Coastguard Worker }
1939*61046927SAndroid Build Coastguard Worker return ctx->Array.PrimitiveRestart;
1940*61046927SAndroid Build Coastguard Worker
1941*61046927SAndroid Build Coastguard Worker case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1942*61046927SAndroid Build Coastguard Worker if (!_mesa_is_gles3_compatible(ctx))
1943*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1944*61046927SAndroid Build Coastguard Worker return ctx->Array.PrimitiveRestartFixedIndex;
1945*61046927SAndroid Build Coastguard Worker
1946*61046927SAndroid Build Coastguard Worker /* GL3.0 - GL_framebuffer_sRGB */
1947*61046927SAndroid Build Coastguard Worker case GL_FRAMEBUFFER_SRGB_EXT:
1948*61046927SAndroid Build Coastguard Worker if (!_mesa_has_EXT_framebuffer_sRGB(ctx) &&
1949*61046927SAndroid Build Coastguard Worker !_mesa_has_EXT_sRGB_write_control(ctx))
1950*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1951*61046927SAndroid Build Coastguard Worker return ctx->Color.sRGBEnabled;
1952*61046927SAndroid Build Coastguard Worker
1953*61046927SAndroid Build Coastguard Worker /* GL_OES_EGL_image_external */
1954*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_EXTERNAL_OES:
1955*61046927SAndroid Build Coastguard Worker if (!_mesa_has_OES_EGL_image_external(ctx))
1956*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1957*61046927SAndroid Build Coastguard Worker return is_texture_enabled(ctx, TEXTURE_EXTERNAL_BIT);
1958*61046927SAndroid Build Coastguard Worker
1959*61046927SAndroid Build Coastguard Worker /* ARB_texture_multisample */
1960*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_MASK:
1961*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_texture_multisample(ctx) && !_mesa_is_gles31(ctx))
1962*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1963*61046927SAndroid Build Coastguard Worker return ctx->Multisample.SampleMask;
1964*61046927SAndroid Build Coastguard Worker
1965*61046927SAndroid Build Coastguard Worker /* ARB_sample_shading */
1966*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_SHADING:
1967*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_sample_shading(ctx) && !_mesa_is_gles3(ctx))
1968*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1969*61046927SAndroid Build Coastguard Worker return ctx->Multisample.SampleShading;
1970*61046927SAndroid Build Coastguard Worker
1971*61046927SAndroid Build Coastguard Worker case GL_BLEND_ADVANCED_COHERENT_KHR:
1972*61046927SAndroid Build Coastguard Worker if (!_mesa_has_KHR_blend_equation_advanced_coherent(ctx))
1973*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1974*61046927SAndroid Build Coastguard Worker return ctx->Color.BlendCoherent;
1975*61046927SAndroid Build Coastguard Worker
1976*61046927SAndroid Build Coastguard Worker case GL_CONSERVATIVE_RASTERIZATION_INTEL:
1977*61046927SAndroid Build Coastguard Worker if (!_mesa_has_INTEL_conservative_rasterization(ctx))
1978*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1979*61046927SAndroid Build Coastguard Worker return ctx->IntelConservativeRasterization;
1980*61046927SAndroid Build Coastguard Worker
1981*61046927SAndroid Build Coastguard Worker case GL_CONSERVATIVE_RASTERIZATION_NV:
1982*61046927SAndroid Build Coastguard Worker if (!_mesa_has_NV_conservative_raster(ctx))
1983*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1984*61046927SAndroid Build Coastguard Worker return ctx->ConservativeRasterization;
1985*61046927SAndroid Build Coastguard Worker
1986*61046927SAndroid Build Coastguard Worker case GL_TILE_RASTER_ORDER_FIXED_MESA:
1987*61046927SAndroid Build Coastguard Worker if (!_mesa_has_MESA_tile_raster_order(ctx))
1988*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1989*61046927SAndroid Build Coastguard Worker return ctx->TileRasterOrderFixed;
1990*61046927SAndroid Build Coastguard Worker
1991*61046927SAndroid Build Coastguard Worker case GL_TILE_RASTER_ORDER_INCREASING_X_MESA:
1992*61046927SAndroid Build Coastguard Worker if (!_mesa_has_MESA_tile_raster_order(ctx))
1993*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1994*61046927SAndroid Build Coastguard Worker return ctx->TileRasterOrderIncreasingX;
1995*61046927SAndroid Build Coastguard Worker
1996*61046927SAndroid Build Coastguard Worker case GL_TILE_RASTER_ORDER_INCREASING_Y_MESA:
1997*61046927SAndroid Build Coastguard Worker if (!_mesa_has_MESA_tile_raster_order(ctx))
1998*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
1999*61046927SAndroid Build Coastguard Worker return ctx->TileRasterOrderIncreasingY;
2000*61046927SAndroid Build Coastguard Worker
2001*61046927SAndroid Build Coastguard Worker case GL_BLACKHOLE_RENDER_INTEL:
2002*61046927SAndroid Build Coastguard Worker if (!_mesa_has_INTEL_blackhole_render(ctx))
2003*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
2004*61046927SAndroid Build Coastguard Worker return ctx->IntelBlackholeRender;
2005*61046927SAndroid Build Coastguard Worker
2006*61046927SAndroid Build Coastguard Worker default:
2007*61046927SAndroid Build Coastguard Worker goto invalid_enum_error;
2008*61046927SAndroid Build Coastguard Worker }
2009*61046927SAndroid Build Coastguard Worker
2010*61046927SAndroid Build Coastguard Worker return GL_FALSE;
2011*61046927SAndroid Build Coastguard Worker
2012*61046927SAndroid Build Coastguard Worker invalid_enum_error:
2013*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabled(%s)",
2014*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(cap));
2015*61046927SAndroid Build Coastguard Worker return GL_FALSE;
2016*61046927SAndroid Build Coastguard Worker }
2017