xref: /aosp_15_r20/external/mesa3d/src/mesa/main/context.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Mesa 3-D graphics library
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker  * Copyright (C) 2008  VMware, Inc.  All Rights Reserved.
6*61046927SAndroid Build Coastguard Worker  *
7*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
8*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
9*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
10*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
12*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
13*61046927SAndroid Build Coastguard Worker  *
14*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included
15*61046927SAndroid Build Coastguard Worker  * in all copies or substantial portions of the Software.
16*61046927SAndroid Build Coastguard Worker  *
17*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18*61046927SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21*61046927SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22*61046927SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23*61046927SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
24*61046927SAndroid Build Coastguard Worker  */
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker /**
27*61046927SAndroid Build Coastguard Worker  * \file context.c
28*61046927SAndroid Build Coastguard Worker  * Mesa context/visual/framebuffer management functions.
29*61046927SAndroid Build Coastguard Worker  * \author Brian Paul
30*61046927SAndroid Build Coastguard Worker  */
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker /**
33*61046927SAndroid Build Coastguard Worker  * \mainpage Mesa Main Module
34*61046927SAndroid Build Coastguard Worker  *
35*61046927SAndroid Build Coastguard Worker  * \section MainIntroduction Introduction
36*61046927SAndroid Build Coastguard Worker  *
37*61046927SAndroid Build Coastguard Worker  * The Mesa Main module consists of all the files in the main/ directory.
38*61046927SAndroid Build Coastguard Worker  * Among the features of this module are:
39*61046927SAndroid Build Coastguard Worker  * <UL>
40*61046927SAndroid Build Coastguard Worker  * <LI> Structures to represent most GL state </LI>
41*61046927SAndroid Build Coastguard Worker  * <LI> State set/get functions </LI>
42*61046927SAndroid Build Coastguard Worker  * <LI> Display lists </LI>
43*61046927SAndroid Build Coastguard Worker  * <LI> Texture unit, object and image handling </LI>
44*61046927SAndroid Build Coastguard Worker  * <LI> Matrix and attribute stacks </LI>
45*61046927SAndroid Build Coastguard Worker  * </UL>
46*61046927SAndroid Build Coastguard Worker  *
47*61046927SAndroid Build Coastguard Worker  * Other modules are responsible for API dispatch, vertex transformation,
48*61046927SAndroid Build Coastguard Worker  * point/line/triangle setup, rasterization, vertex array caching,
49*61046927SAndroid Build Coastguard Worker  * vertex/fragment programs/shaders, etc.
50*61046927SAndroid Build Coastguard Worker  *
51*61046927SAndroid Build Coastguard Worker  *
52*61046927SAndroid Build Coastguard Worker  * \section AboutDoxygen About Doxygen
53*61046927SAndroid Build Coastguard Worker  *
54*61046927SAndroid Build Coastguard Worker  * If you're viewing this information as Doxygen-generated HTML you'll
55*61046927SAndroid Build Coastguard Worker  * see the documentation index at the top of this page.
56*61046927SAndroid Build Coastguard Worker  *
57*61046927SAndroid Build Coastguard Worker  * The first line lists the Mesa source code modules.
58*61046927SAndroid Build Coastguard Worker  * The second line lists the indexes available for viewing the documentation
59*61046927SAndroid Build Coastguard Worker  * for each module.
60*61046927SAndroid Build Coastguard Worker  *
61*61046927SAndroid Build Coastguard Worker  * Selecting the <b>Main page</b> link will display a summary of the module
62*61046927SAndroid Build Coastguard Worker  * (this page).
63*61046927SAndroid Build Coastguard Worker  *
64*61046927SAndroid Build Coastguard Worker  * Selecting <b>Data Structures</b> will list all C structures.
65*61046927SAndroid Build Coastguard Worker  *
66*61046927SAndroid Build Coastguard Worker  * Selecting the <b>File List</b> link will list all the source files in
67*61046927SAndroid Build Coastguard Worker  * the module.
68*61046927SAndroid Build Coastguard Worker  * Selecting a filename will show a list of all functions defined in that file.
69*61046927SAndroid Build Coastguard Worker  *
70*61046927SAndroid Build Coastguard Worker  * Selecting the <b>Data Fields</b> link will display a list of all
71*61046927SAndroid Build Coastguard Worker  * documented structure members.
72*61046927SAndroid Build Coastguard Worker  *
73*61046927SAndroid Build Coastguard Worker  * Selecting the <b>Globals</b> link will display a list
74*61046927SAndroid Build Coastguard Worker  * of all functions, structures, global variables and macros in the module.
75*61046927SAndroid Build Coastguard Worker  *
76*61046927SAndroid Build Coastguard Worker  */
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker #include "accum.h"
82*61046927SAndroid Build Coastguard Worker #include "arrayobj.h"
83*61046927SAndroid Build Coastguard Worker #include "attrib.h"
84*61046927SAndroid Build Coastguard Worker #include "bbox.h"
85*61046927SAndroid Build Coastguard Worker #include "blend.h"
86*61046927SAndroid Build Coastguard Worker #include "buffers.h"
87*61046927SAndroid Build Coastguard Worker #include "bufferobj.h"
88*61046927SAndroid Build Coastguard Worker #include "conservativeraster.h"
89*61046927SAndroid Build Coastguard Worker #include "context.h"
90*61046927SAndroid Build Coastguard Worker #include "debug.h"
91*61046927SAndroid Build Coastguard Worker #include "debug_output.h"
92*61046927SAndroid Build Coastguard Worker #include "depth.h"
93*61046927SAndroid Build Coastguard Worker #include "dlist.h"
94*61046927SAndroid Build Coastguard Worker #include "draw_validate.h"
95*61046927SAndroid Build Coastguard Worker #include "eval.h"
96*61046927SAndroid Build Coastguard Worker #include "extensions.h"
97*61046927SAndroid Build Coastguard Worker #include "fbobject.h"
98*61046927SAndroid Build Coastguard Worker #include "feedback.h"
99*61046927SAndroid Build Coastguard Worker #include "fog.h"
100*61046927SAndroid Build Coastguard Worker #include "formats.h"
101*61046927SAndroid Build Coastguard Worker #include "framebuffer.h"
102*61046927SAndroid Build Coastguard Worker #include "glthread.h"
103*61046927SAndroid Build Coastguard Worker #include "hint.h"
104*61046927SAndroid Build Coastguard Worker #include "hash.h"
105*61046927SAndroid Build Coastguard Worker #include "light.h"
106*61046927SAndroid Build Coastguard Worker #include "lines.h"
107*61046927SAndroid Build Coastguard Worker #include "macros.h"
108*61046927SAndroid Build Coastguard Worker #include "matrix.h"
109*61046927SAndroid Build Coastguard Worker #include "multisample.h"
110*61046927SAndroid Build Coastguard Worker #include "performance_monitor.h"
111*61046927SAndroid Build Coastguard Worker #include "performance_query.h"
112*61046927SAndroid Build Coastguard Worker #include "pipelineobj.h"
113*61046927SAndroid Build Coastguard Worker #include "pixel.h"
114*61046927SAndroid Build Coastguard Worker #include "pixelstore.h"
115*61046927SAndroid Build Coastguard Worker #include "points.h"
116*61046927SAndroid Build Coastguard Worker #include "polygon.h"
117*61046927SAndroid Build Coastguard Worker #include "queryobj.h"
118*61046927SAndroid Build Coastguard Worker #include "syncobj.h"
119*61046927SAndroid Build Coastguard Worker #include "rastpos.h"
120*61046927SAndroid Build Coastguard Worker #include "remap.h"
121*61046927SAndroid Build Coastguard Worker #include "scissor.h"
122*61046927SAndroid Build Coastguard Worker #include "shared.h"
123*61046927SAndroid Build Coastguard Worker #include "shaderobj.h"
124*61046927SAndroid Build Coastguard Worker #include "shaderimage.h"
125*61046927SAndroid Build Coastguard Worker #include "state.h"
126*61046927SAndroid Build Coastguard Worker #include "util/u_debug.h"
127*61046927SAndroid Build Coastguard Worker #include "util/disk_cache.h"
128*61046927SAndroid Build Coastguard Worker #include "util/strtod.h"
129*61046927SAndroid Build Coastguard Worker #include "util/u_call_once.h"
130*61046927SAndroid Build Coastguard Worker #include "stencil.h"
131*61046927SAndroid Build Coastguard Worker #include "shaderimage.h"
132*61046927SAndroid Build Coastguard Worker #include "texcompress_s3tc.h"
133*61046927SAndroid Build Coastguard Worker #include "texstate.h"
134*61046927SAndroid Build Coastguard Worker #include "transformfeedback.h"
135*61046927SAndroid Build Coastguard Worker #include "mtypes.h"
136*61046927SAndroid Build Coastguard Worker #include "varray.h"
137*61046927SAndroid Build Coastguard Worker #include "version.h"
138*61046927SAndroid Build Coastguard Worker #include "viewport.h"
139*61046927SAndroid Build Coastguard Worker #include "texturebindless.h"
140*61046927SAndroid Build Coastguard Worker #include "program/program.h"
141*61046927SAndroid Build Coastguard Worker #include "math/m_matrix.h"
142*61046927SAndroid Build Coastguard Worker #include "main/dispatch.h" /* for _gloffset_COUNT */
143*61046927SAndroid Build Coastguard Worker #include "macros.h"
144*61046927SAndroid Build Coastguard Worker #include "git_sha1.h"
145*61046927SAndroid Build Coastguard Worker 
146*61046927SAndroid Build Coastguard Worker #include "compiler/glsl_types.h"
147*61046927SAndroid Build Coastguard Worker #include "compiler/glsl/builtin_functions.h"
148*61046927SAndroid Build Coastguard Worker #include "compiler/glsl/glsl_parser_extras.h"
149*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
150*61046927SAndroid Build Coastguard Worker #include "util/u_memory.h"
151*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
152*61046927SAndroid Build Coastguard Worker 
153*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_cb_texture.h"
154*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_cb_flush.h"
155*61046927SAndroid Build Coastguard Worker 
156*61046927SAndroid Build Coastguard Worker #ifndef MESA_VERBOSE
157*61046927SAndroid Build Coastguard Worker int MESA_VERBOSE = 0;
158*61046927SAndroid Build Coastguard Worker #endif
159*61046927SAndroid Build Coastguard Worker 
160*61046927SAndroid Build Coastguard Worker #ifndef MESA_DEBUG_FLAGS
161*61046927SAndroid Build Coastguard Worker int MESA_DEBUG_FLAGS = 0;
162*61046927SAndroid Build Coastguard Worker #endif
163*61046927SAndroid Build Coastguard Worker 
164*61046927SAndroid Build Coastguard Worker 
165*61046927SAndroid Build Coastguard Worker /* ubyte -> float conversion */
166*61046927SAndroid Build Coastguard Worker GLfloat _mesa_ubyte_to_float_color_tab[256];
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker /**********************************************************************/
170*61046927SAndroid Build Coastguard Worker /** \name Context allocation, initialization, destroying
171*61046927SAndroid Build Coastguard Worker  *
172*61046927SAndroid Build Coastguard Worker  * The purpose of the most initialization functions here is to provide the
173*61046927SAndroid Build Coastguard Worker  * default state values according to the OpenGL specification.
174*61046927SAndroid Build Coastguard Worker  */
175*61046927SAndroid Build Coastguard Worker /**********************************************************************/
176*61046927SAndroid Build Coastguard Worker /*@{*/
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker 
179*61046927SAndroid Build Coastguard Worker /**
180*61046927SAndroid Build Coastguard Worker  * Calls all the various one-time-fini functions in Mesa
181*61046927SAndroid Build Coastguard Worker  */
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker static void
one_time_fini(void)184*61046927SAndroid Build Coastguard Worker one_time_fini(void)
185*61046927SAndroid Build Coastguard Worker {
186*61046927SAndroid Build Coastguard Worker    glsl_type_singleton_decref();
187*61046927SAndroid Build Coastguard Worker }
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker /**
190*61046927SAndroid Build Coastguard Worker  * Calls all the various one-time-init functions in Mesa
191*61046927SAndroid Build Coastguard Worker  */
192*61046927SAndroid Build Coastguard Worker 
193*61046927SAndroid Build Coastguard Worker static void
one_time_init(const char * extensions_override)194*61046927SAndroid Build Coastguard Worker one_time_init(const char *extensions_override)
195*61046927SAndroid Build Coastguard Worker {
196*61046927SAndroid Build Coastguard Worker    GLuint i;
197*61046927SAndroid Build Coastguard Worker 
198*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT(sizeof(GLbyte) == 1);
199*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT(sizeof(GLubyte) == 1);
200*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT(sizeof(GLshort) == 2);
201*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT(sizeof(GLushort) == 2);
202*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT(sizeof(GLint) == 4);
203*61046927SAndroid Build Coastguard Worker    STATIC_ASSERT(sizeof(GLuint) == 4);
204*61046927SAndroid Build Coastguard Worker 
205*61046927SAndroid Build Coastguard Worker    const char *env_const = os_get_option("MESA_EXTENSION_OVERRIDE");
206*61046927SAndroid Build Coastguard Worker    if (env_const) {
207*61046927SAndroid Build Coastguard Worker       if (extensions_override &&
208*61046927SAndroid Build Coastguard Worker           strcmp(extensions_override, env_const)) {
209*61046927SAndroid Build Coastguard Worker          printf("Warning: MESA_EXTENSION_OVERRIDE used instead of driconf setting\n");
210*61046927SAndroid Build Coastguard Worker       }
211*61046927SAndroid Build Coastguard Worker       extensions_override = env_const;
212*61046927SAndroid Build Coastguard Worker    }
213*61046927SAndroid Build Coastguard Worker 
214*61046927SAndroid Build Coastguard Worker    _mesa_one_time_init_extension_overrides(extensions_override);
215*61046927SAndroid Build Coastguard Worker 
216*61046927SAndroid Build Coastguard Worker 
217*61046927SAndroid Build Coastguard Worker    for (i = 0; i < 256; i++) {
218*61046927SAndroid Build Coastguard Worker       _mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
219*61046927SAndroid Build Coastguard Worker    }
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker    atexit(one_time_fini);
222*61046927SAndroid Build Coastguard Worker 
223*61046927SAndroid Build Coastguard Worker #if MESA_DEBUG
224*61046927SAndroid Build Coastguard Worker    if (MESA_VERBOSE != 0) {
225*61046927SAndroid Build Coastguard Worker       _mesa_debug(NULL, "Mesa " PACKAGE_VERSION " DEBUG build" MESA_GIT_SHA1 "\n");
226*61046927SAndroid Build Coastguard Worker    }
227*61046927SAndroid Build Coastguard Worker #endif
228*61046927SAndroid Build Coastguard Worker 
229*61046927SAndroid Build Coastguard Worker    /* Take a glsl type reference for the duration of libGL's life to avoid
230*61046927SAndroid Build Coastguard Worker     * unecessary creation/destruction of glsl types.
231*61046927SAndroid Build Coastguard Worker     */
232*61046927SAndroid Build Coastguard Worker    glsl_type_singleton_init_or_ref();
233*61046927SAndroid Build Coastguard Worker 
234*61046927SAndroid Build Coastguard Worker    _mesa_init_remap_table();
235*61046927SAndroid Build Coastguard Worker }
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker /**
238*61046927SAndroid Build Coastguard Worker  * Calls all the various one-time-init functions in Mesa.
239*61046927SAndroid Build Coastguard Worker  *
240*61046927SAndroid Build Coastguard Worker  * While holding a global mutex lock, calls several initialization functions,
241*61046927SAndroid Build Coastguard Worker  * and sets the glapi callbacks if the \c MESA_DEBUG environment variable is
242*61046927SAndroid Build Coastguard Worker  * defined.
243*61046927SAndroid Build Coastguard Worker  */
244*61046927SAndroid Build Coastguard Worker void
_mesa_initialize(const char * extensions_override)245*61046927SAndroid Build Coastguard Worker _mesa_initialize(const char *extensions_override)
246*61046927SAndroid Build Coastguard Worker {
247*61046927SAndroid Build Coastguard Worker    static util_once_flag once = UTIL_ONCE_FLAG_INIT;
248*61046927SAndroid Build Coastguard Worker    util_call_once_data(&once,
249*61046927SAndroid Build Coastguard Worker       (util_call_once_data_func)one_time_init, extensions_override);
250*61046927SAndroid Build Coastguard Worker }
251*61046927SAndroid Build Coastguard Worker 
252*61046927SAndroid Build Coastguard Worker 
253*61046927SAndroid Build Coastguard Worker /**
254*61046927SAndroid Build Coastguard Worker  * Initialize fields of gl_current_attrib (aka ctx->Current.*)
255*61046927SAndroid Build Coastguard Worker  */
256*61046927SAndroid Build Coastguard Worker static void
_mesa_init_current(struct gl_context * ctx)257*61046927SAndroid Build Coastguard Worker _mesa_init_current(struct gl_context *ctx)
258*61046927SAndroid Build Coastguard Worker {
259*61046927SAndroid Build Coastguard Worker    GLuint i;
260*61046927SAndroid Build Coastguard Worker 
261*61046927SAndroid Build Coastguard Worker    /* Init all to (0,0,0,1) */
262*61046927SAndroid Build Coastguard Worker    for (i = 0; i < ARRAY_SIZE(ctx->Current.Attrib); i++) {
263*61046927SAndroid Build Coastguard Worker       ASSIGN_4V( ctx->Current.Attrib[i], 0.0, 0.0, 0.0, 1.0 );
264*61046927SAndroid Build Coastguard Worker    }
265*61046927SAndroid Build Coastguard Worker 
266*61046927SAndroid Build Coastguard Worker    /* redo special cases: */
267*61046927SAndroid Build Coastguard Worker    ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 );
268*61046927SAndroid Build Coastguard Worker    ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
269*61046927SAndroid Build Coastguard Worker    ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 1.0 );
270*61046927SAndroid Build Coastguard Worker    ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR_INDEX], 1.0, 0.0, 0.0, 1.0 );
271*61046927SAndroid Build Coastguard Worker    ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG], 1.0, 0.0, 0.0, 1.0 );
272*61046927SAndroid Build Coastguard Worker }
273*61046927SAndroid Build Coastguard Worker 
274*61046927SAndroid Build Coastguard Worker 
275*61046927SAndroid Build Coastguard Worker /**
276*61046927SAndroid Build Coastguard Worker  * Init vertex/fragment/geometry program limits.
277*61046927SAndroid Build Coastguard Worker  * Important: drivers should override these with actual limits.
278*61046927SAndroid Build Coastguard Worker  */
279*61046927SAndroid Build Coastguard Worker static void
init_program_limits(struct gl_constants * consts,gl_shader_stage stage,struct gl_program_constants * prog)280*61046927SAndroid Build Coastguard Worker init_program_limits(struct gl_constants *consts, gl_shader_stage stage,
281*61046927SAndroid Build Coastguard Worker                     struct gl_program_constants *prog)
282*61046927SAndroid Build Coastguard Worker {
283*61046927SAndroid Build Coastguard Worker    prog->MaxInstructions = MAX_PROGRAM_INSTRUCTIONS;
284*61046927SAndroid Build Coastguard Worker    prog->MaxAluInstructions = MAX_PROGRAM_INSTRUCTIONS;
285*61046927SAndroid Build Coastguard Worker    prog->MaxTexInstructions = MAX_PROGRAM_INSTRUCTIONS;
286*61046927SAndroid Build Coastguard Worker    prog->MaxTexIndirections = MAX_PROGRAM_INSTRUCTIONS;
287*61046927SAndroid Build Coastguard Worker    prog->MaxTemps = MAX_PROGRAM_TEMPS;
288*61046927SAndroid Build Coastguard Worker    prog->MaxEnvParams = MAX_PROGRAM_ENV_PARAMS;
289*61046927SAndroid Build Coastguard Worker    prog->MaxLocalParams = MAX_PROGRAM_LOCAL_PARAMS;
290*61046927SAndroid Build Coastguard Worker    prog->MaxAddressOffset = MAX_PROGRAM_LOCAL_PARAMS;
291*61046927SAndroid Build Coastguard Worker 
292*61046927SAndroid Build Coastguard Worker    switch (stage) {
293*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_VERTEX:
294*61046927SAndroid Build Coastguard Worker       prog->MaxParameters = MAX_VERTEX_PROGRAM_PARAMS;
295*61046927SAndroid Build Coastguard Worker       prog->MaxAttribs = MAX_VERTEX_GENERIC_ATTRIBS;
296*61046927SAndroid Build Coastguard Worker       prog->MaxAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS;
297*61046927SAndroid Build Coastguard Worker       prog->MaxUniformComponents = 4 * MAX_UNIFORMS;
298*61046927SAndroid Build Coastguard Worker       prog->MaxInputComponents = 0; /* value not used */
299*61046927SAndroid Build Coastguard Worker       prog->MaxOutputComponents = 16 * 4; /* old limit not to break tnl and swrast */
300*61046927SAndroid Build Coastguard Worker       break;
301*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_FRAGMENT:
302*61046927SAndroid Build Coastguard Worker       prog->MaxParameters = MAX_FRAGMENT_PROGRAM_PARAMS;
303*61046927SAndroid Build Coastguard Worker       prog->MaxAttribs = MAX_FRAGMENT_PROGRAM_INPUTS;
304*61046927SAndroid Build Coastguard Worker       prog->MaxAddressRegs = MAX_FRAGMENT_PROGRAM_ADDRESS_REGS;
305*61046927SAndroid Build Coastguard Worker       prog->MaxUniformComponents = 4 * MAX_UNIFORMS;
306*61046927SAndroid Build Coastguard Worker       prog->MaxInputComponents = 16 * 4; /* old limit not to break tnl and swrast */
307*61046927SAndroid Build Coastguard Worker       prog->MaxOutputComponents = 0; /* value not used */
308*61046927SAndroid Build Coastguard Worker       break;
309*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_TESS_CTRL:
310*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_TESS_EVAL:
311*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_GEOMETRY:
312*61046927SAndroid Build Coastguard Worker       prog->MaxParameters = MAX_VERTEX_PROGRAM_PARAMS;
313*61046927SAndroid Build Coastguard Worker       prog->MaxAttribs = MAX_VERTEX_GENERIC_ATTRIBS;
314*61046927SAndroid Build Coastguard Worker       prog->MaxAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS;
315*61046927SAndroid Build Coastguard Worker       prog->MaxUniformComponents = 4 * MAX_UNIFORMS;
316*61046927SAndroid Build Coastguard Worker       prog->MaxInputComponents = 16 * 4; /* old limit not to break tnl and swrast */
317*61046927SAndroid Build Coastguard Worker       prog->MaxOutputComponents = 16 * 4; /* old limit not to break tnl and swrast */
318*61046927SAndroid Build Coastguard Worker       break;
319*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_COMPUTE:
320*61046927SAndroid Build Coastguard Worker       prog->MaxParameters = 0; /* not meaningful for compute shaders */
321*61046927SAndroid Build Coastguard Worker       prog->MaxAttribs = 0; /* not meaningful for compute shaders */
322*61046927SAndroid Build Coastguard Worker       prog->MaxAddressRegs = 0; /* not meaningful for compute shaders */
323*61046927SAndroid Build Coastguard Worker       prog->MaxUniformComponents = 4 * MAX_UNIFORMS;
324*61046927SAndroid Build Coastguard Worker       prog->MaxInputComponents = 0; /* not meaningful for compute shaders */
325*61046927SAndroid Build Coastguard Worker       prog->MaxOutputComponents = 0; /* not meaningful for compute shaders */
326*61046927SAndroid Build Coastguard Worker       break;
327*61046927SAndroid Build Coastguard Worker    default:
328*61046927SAndroid Build Coastguard Worker       assert(0 && "Bad shader stage in init_program_limits()");
329*61046927SAndroid Build Coastguard Worker    }
330*61046927SAndroid Build Coastguard Worker 
331*61046927SAndroid Build Coastguard Worker    /* Set the native limits to zero.  This implies that there is no native
332*61046927SAndroid Build Coastguard Worker     * support for shaders.  Let the drivers fill in the actual values.
333*61046927SAndroid Build Coastguard Worker     */
334*61046927SAndroid Build Coastguard Worker    prog->MaxNativeInstructions = 0;
335*61046927SAndroid Build Coastguard Worker    prog->MaxNativeAluInstructions = 0;
336*61046927SAndroid Build Coastguard Worker    prog->MaxNativeTexInstructions = 0;
337*61046927SAndroid Build Coastguard Worker    prog->MaxNativeTexIndirections = 0;
338*61046927SAndroid Build Coastguard Worker    prog->MaxNativeAttribs = 0;
339*61046927SAndroid Build Coastguard Worker    prog->MaxNativeTemps = 0;
340*61046927SAndroid Build Coastguard Worker    prog->MaxNativeAddressRegs = 0;
341*61046927SAndroid Build Coastguard Worker    prog->MaxNativeParameters = 0;
342*61046927SAndroid Build Coastguard Worker 
343*61046927SAndroid Build Coastguard Worker    /* Set GLSL datatype range/precision info assuming IEEE float values.
344*61046927SAndroid Build Coastguard Worker     * Drivers should override these defaults as needed.
345*61046927SAndroid Build Coastguard Worker     */
346*61046927SAndroid Build Coastguard Worker    prog->MediumFloat.RangeMin = 127;
347*61046927SAndroid Build Coastguard Worker    prog->MediumFloat.RangeMax = 127;
348*61046927SAndroid Build Coastguard Worker    prog->MediumFloat.Precision = 23;
349*61046927SAndroid Build Coastguard Worker    prog->LowFloat = prog->HighFloat = prog->MediumFloat;
350*61046927SAndroid Build Coastguard Worker 
351*61046927SAndroid Build Coastguard Worker    /* Assume ints are stored as floats for now, since this is the least-common
352*61046927SAndroid Build Coastguard Worker     * denominator.  The OpenGL ES spec implies (page 132) that the precision
353*61046927SAndroid Build Coastguard Worker     * of integer types should be 0.  Practically speaking, IEEE
354*61046927SAndroid Build Coastguard Worker     * single-precision floating point values can only store integers in the
355*61046927SAndroid Build Coastguard Worker     * range [-0x01000000, 0x01000000] without loss of precision.
356*61046927SAndroid Build Coastguard Worker     */
357*61046927SAndroid Build Coastguard Worker    prog->MediumInt.RangeMin = 24;
358*61046927SAndroid Build Coastguard Worker    prog->MediumInt.RangeMax = 24;
359*61046927SAndroid Build Coastguard Worker    prog->MediumInt.Precision = 0;
360*61046927SAndroid Build Coastguard Worker    prog->LowInt = prog->HighInt = prog->MediumInt;
361*61046927SAndroid Build Coastguard Worker 
362*61046927SAndroid Build Coastguard Worker    prog->MaxUniformBlocks = 12;
363*61046927SAndroid Build Coastguard Worker    prog->MaxCombinedUniformComponents = (prog->MaxUniformComponents +
364*61046927SAndroid Build Coastguard Worker                                          consts->MaxUniformBlockSize / 4 *
365*61046927SAndroid Build Coastguard Worker                                          prog->MaxUniformBlocks);
366*61046927SAndroid Build Coastguard Worker 
367*61046927SAndroid Build Coastguard Worker    prog->MaxAtomicBuffers = 0;
368*61046927SAndroid Build Coastguard Worker    prog->MaxAtomicCounters = 0;
369*61046927SAndroid Build Coastguard Worker 
370*61046927SAndroid Build Coastguard Worker    prog->MaxShaderStorageBlocks = 8;
371*61046927SAndroid Build Coastguard Worker }
372*61046927SAndroid Build Coastguard Worker 
373*61046927SAndroid Build Coastguard Worker 
374*61046927SAndroid Build Coastguard Worker /**
375*61046927SAndroid Build Coastguard Worker  * Initialize fields of gl_constants (aka ctx->Const.*).
376*61046927SAndroid Build Coastguard Worker  * Use defaults from config.h.  The device drivers will often override
377*61046927SAndroid Build Coastguard Worker  * some of these values (such as number of texture units).
378*61046927SAndroid Build Coastguard Worker  */
379*61046927SAndroid Build Coastguard Worker void
_mesa_init_constants(struct gl_constants * consts,gl_api api)380*61046927SAndroid Build Coastguard Worker _mesa_init_constants(struct gl_constants *consts, gl_api api)
381*61046927SAndroid Build Coastguard Worker {
382*61046927SAndroid Build Coastguard Worker    int i;
383*61046927SAndroid Build Coastguard Worker    assert(consts);
384*61046927SAndroid Build Coastguard Worker 
385*61046927SAndroid Build Coastguard Worker    /* Constants, may be overriden (usually only reduced) by device drivers */
386*61046927SAndroid Build Coastguard Worker    consts->MaxTextureMbytes = MAX_TEXTURE_MBYTES;
387*61046927SAndroid Build Coastguard Worker    consts->MaxTextureSize = 1 << (MAX_TEXTURE_LEVELS - 1);
388*61046927SAndroid Build Coastguard Worker    consts->Max3DTextureLevels = MAX_TEXTURE_LEVELS;
389*61046927SAndroid Build Coastguard Worker    consts->MaxCubeTextureLevels = MAX_TEXTURE_LEVELS;
390*61046927SAndroid Build Coastguard Worker    consts->MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
391*61046927SAndroid Build Coastguard Worker    consts->MaxArrayTextureLayers = MAX_ARRAY_TEXTURE_LAYERS;
392*61046927SAndroid Build Coastguard Worker    consts->MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;
393*61046927SAndroid Build Coastguard Worker    consts->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
394*61046927SAndroid Build Coastguard Worker    consts->MaxTextureUnits = MIN2(consts->MaxTextureCoordUnits,
395*61046927SAndroid Build Coastguard Worker                                      consts->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits);
396*61046927SAndroid Build Coastguard Worker    consts->MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
397*61046927SAndroid Build Coastguard Worker    consts->MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
398*61046927SAndroid Build Coastguard Worker    consts->MaxTextureBufferSize = 65536;
399*61046927SAndroid Build Coastguard Worker    consts->TextureBufferOffsetAlignment = 1;
400*61046927SAndroid Build Coastguard Worker    consts->MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
401*61046927SAndroid Build Coastguard Worker    consts->SubPixelBits = SUB_PIXEL_BITS;
402*61046927SAndroid Build Coastguard Worker    consts->MinPointSize = MIN_POINT_SIZE;
403*61046927SAndroid Build Coastguard Worker    consts->MaxPointSize = MAX_POINT_SIZE;
404*61046927SAndroid Build Coastguard Worker    consts->MinPointSizeAA = MIN_POINT_SIZE;
405*61046927SAndroid Build Coastguard Worker    consts->MaxPointSizeAA = MAX_POINT_SIZE;
406*61046927SAndroid Build Coastguard Worker    consts->PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
407*61046927SAndroid Build Coastguard Worker    consts->MinLineWidth = MIN_LINE_WIDTH;
408*61046927SAndroid Build Coastguard Worker    consts->MaxLineWidth = MAX_LINE_WIDTH;
409*61046927SAndroid Build Coastguard Worker    consts->MinLineWidthAA = MIN_LINE_WIDTH;
410*61046927SAndroid Build Coastguard Worker    consts->MaxLineWidthAA = MAX_LINE_WIDTH;
411*61046927SAndroid Build Coastguard Worker    consts->LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
412*61046927SAndroid Build Coastguard Worker    consts->MaxClipPlanes = 6;
413*61046927SAndroid Build Coastguard Worker    consts->MaxLights = MAX_LIGHTS;
414*61046927SAndroid Build Coastguard Worker    consts->MaxShininess = 128.0;
415*61046927SAndroid Build Coastguard Worker    consts->MaxSpotExponent = 128.0;
416*61046927SAndroid Build Coastguard Worker    consts->MaxViewportWidth = 16384;
417*61046927SAndroid Build Coastguard Worker    consts->MaxViewportHeight = 16384;
418*61046927SAndroid Build Coastguard Worker    consts->MinMapBufferAlignment = 64;
419*61046927SAndroid Build Coastguard Worker 
420*61046927SAndroid Build Coastguard Worker    /* Driver must override these values if ARB_viewport_array is supported. */
421*61046927SAndroid Build Coastguard Worker    consts->MaxViewports = 1;
422*61046927SAndroid Build Coastguard Worker    consts->ViewportSubpixelBits = 0;
423*61046927SAndroid Build Coastguard Worker    consts->ViewportBounds.Min = 0;
424*61046927SAndroid Build Coastguard Worker    consts->ViewportBounds.Max = 0;
425*61046927SAndroid Build Coastguard Worker 
426*61046927SAndroid Build Coastguard Worker    /** GL_ARB_uniform_buffer_object */
427*61046927SAndroid Build Coastguard Worker    consts->MaxCombinedUniformBlocks = 36;
428*61046927SAndroid Build Coastguard Worker    consts->MaxUniformBufferBindings = 36;
429*61046927SAndroid Build Coastguard Worker    consts->MaxUniformBlockSize = 16384;
430*61046927SAndroid Build Coastguard Worker    consts->UniformBufferOffsetAlignment = 1;
431*61046927SAndroid Build Coastguard Worker 
432*61046927SAndroid Build Coastguard Worker    /** GL_ARB_shader_storage_buffer_object */
433*61046927SAndroid Build Coastguard Worker    consts->MaxCombinedShaderStorageBlocks = 8;
434*61046927SAndroid Build Coastguard Worker    consts->MaxShaderStorageBufferBindings = 8;
435*61046927SAndroid Build Coastguard Worker    consts->MaxShaderStorageBlockSize = 128 * 1024 * 1024; /* 2^27 */
436*61046927SAndroid Build Coastguard Worker    consts->ShaderStorageBufferOffsetAlignment = 256;
437*61046927SAndroid Build Coastguard Worker 
438*61046927SAndroid Build Coastguard Worker    /* GL_ARB_explicit_uniform_location, GL_MAX_UNIFORM_LOCATIONS */
439*61046927SAndroid Build Coastguard Worker    consts->MaxUserAssignableUniformLocations =
440*61046927SAndroid Build Coastguard Worker       4 * MESA_SHADER_STAGES * MAX_UNIFORMS;
441*61046927SAndroid Build Coastguard Worker 
442*61046927SAndroid Build Coastguard Worker    for (i = 0; i < MESA_SHADER_STAGES; i++)
443*61046927SAndroid Build Coastguard Worker       init_program_limits(consts, i, &consts->Program[i]);
444*61046927SAndroid Build Coastguard Worker 
445*61046927SAndroid Build Coastguard Worker    consts->MaxProgramMatrices = MAX_PROGRAM_MATRICES;
446*61046927SAndroid Build Coastguard Worker    consts->MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH;
447*61046927SAndroid Build Coastguard Worker 
448*61046927SAndroid Build Coastguard Worker    /* Set the absolute minimum possible GLSL version.  API_OPENGL_CORE can
449*61046927SAndroid Build Coastguard Worker     * mean an OpenGL 3.0 forward-compatible context, so that implies a minimum
450*61046927SAndroid Build Coastguard Worker     * possible version of 1.30.  Otherwise, the minimum possible version 1.20.
451*61046927SAndroid Build Coastguard Worker     * Since Mesa unconditionally advertises GL_ARB_shading_language_100 and
452*61046927SAndroid Build Coastguard Worker     * GL_ARB_shader_objects, every driver has GLSL 1.20... even if they don't
453*61046927SAndroid Build Coastguard Worker     * advertise any extensions to enable any shader stages (e.g.,
454*61046927SAndroid Build Coastguard Worker     * GL_ARB_vertex_shader).
455*61046927SAndroid Build Coastguard Worker     */
456*61046927SAndroid Build Coastguard Worker    consts->GLSLVersion = api == API_OPENGL_CORE ? 130 : 120;
457*61046927SAndroid Build Coastguard Worker    consts->GLSLVersionCompat = consts->GLSLVersion;
458*61046927SAndroid Build Coastguard Worker 
459*61046927SAndroid Build Coastguard Worker    consts->GLSLLowerConstArrays = true;
460*61046927SAndroid Build Coastguard Worker 
461*61046927SAndroid Build Coastguard Worker    /* GL_ARB_draw_buffers */
462*61046927SAndroid Build Coastguard Worker    consts->MaxDrawBuffers = MAX_DRAW_BUFFERS;
463*61046927SAndroid Build Coastguard Worker 
464*61046927SAndroid Build Coastguard Worker    consts->MaxColorAttachments = MAX_COLOR_ATTACHMENTS;
465*61046927SAndroid Build Coastguard Worker    consts->MaxRenderbufferSize = MAX_RENDERBUFFER_SIZE;
466*61046927SAndroid Build Coastguard Worker 
467*61046927SAndroid Build Coastguard Worker    consts->Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
468*61046927SAndroid Build Coastguard Worker    consts->MaxCombinedTextureImageUnits = MAX_COMBINED_TEXTURE_IMAGE_UNITS;
469*61046927SAndroid Build Coastguard Worker    consts->MaxVarying = 16; /* old limit not to break tnl and swrast */
470*61046927SAndroid Build Coastguard Worker    consts->Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
471*61046927SAndroid Build Coastguard Worker    consts->MaxGeometryOutputVertices = MAX_GEOMETRY_OUTPUT_VERTICES;
472*61046927SAndroid Build Coastguard Worker    consts->MaxGeometryTotalOutputComponents = MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS;
473*61046927SAndroid Build Coastguard Worker    consts->MaxGeometryShaderInvocations = MAX_GEOMETRY_SHADER_INVOCATIONS;
474*61046927SAndroid Build Coastguard Worker 
475*61046927SAndroid Build Coastguard Worker #if MESA_DEBUG
476*61046927SAndroid Build Coastguard Worker    consts->GenerateTemporaryNames = true;
477*61046927SAndroid Build Coastguard Worker #else
478*61046927SAndroid Build Coastguard Worker    consts->GenerateTemporaryNames = false;
479*61046927SAndroid Build Coastguard Worker #endif
480*61046927SAndroid Build Coastguard Worker 
481*61046927SAndroid Build Coastguard Worker    /* GL_ARB_framebuffer_object */
482*61046927SAndroid Build Coastguard Worker    consts->MaxSamples = 0;
483*61046927SAndroid Build Coastguard Worker 
484*61046927SAndroid Build Coastguard Worker    /* GLSL default if NativeIntegers == FALSE */
485*61046927SAndroid Build Coastguard Worker    consts->UniformBooleanTrue = FLOAT_AS_UNION(1.0f).u;
486*61046927SAndroid Build Coastguard Worker 
487*61046927SAndroid Build Coastguard Worker    /* GL_ARB_sync */
488*61046927SAndroid Build Coastguard Worker    consts->MaxServerWaitTimeout = 0x7fffffff7fffffffULL;
489*61046927SAndroid Build Coastguard Worker 
490*61046927SAndroid Build Coastguard Worker    /* GL_EXT_provoking_vertex */
491*61046927SAndroid Build Coastguard Worker    consts->QuadsFollowProvokingVertexConvention = GL_TRUE;
492*61046927SAndroid Build Coastguard Worker 
493*61046927SAndroid Build Coastguard Worker    /** GL_ARB_viewport_array */
494*61046927SAndroid Build Coastguard Worker    consts->LayerAndVPIndexProvokingVertex = GL_UNDEFINED_VERTEX;
495*61046927SAndroid Build Coastguard Worker 
496*61046927SAndroid Build Coastguard Worker    /* GL_EXT_transform_feedback */
497*61046927SAndroid Build Coastguard Worker    consts->MaxTransformFeedbackBuffers = MAX_FEEDBACK_BUFFERS;
498*61046927SAndroid Build Coastguard Worker    consts->MaxTransformFeedbackSeparateComponents = 4 * MAX_FEEDBACK_ATTRIBS;
499*61046927SAndroid Build Coastguard Worker    consts->MaxTransformFeedbackInterleavedComponents = 4 * MAX_FEEDBACK_ATTRIBS;
500*61046927SAndroid Build Coastguard Worker    consts->MaxVertexStreams = 1;
501*61046927SAndroid Build Coastguard Worker 
502*61046927SAndroid Build Coastguard Worker    /* GL 3.2  */
503*61046927SAndroid Build Coastguard Worker    consts->ProfileMask = api == API_OPENGL_CORE
504*61046927SAndroid Build Coastguard Worker                           ? GL_CONTEXT_CORE_PROFILE_BIT
505*61046927SAndroid Build Coastguard Worker                           : GL_CONTEXT_COMPATIBILITY_PROFILE_BIT;
506*61046927SAndroid Build Coastguard Worker 
507*61046927SAndroid Build Coastguard Worker    /* GL 4.4 */
508*61046927SAndroid Build Coastguard Worker    consts->MaxVertexAttribStride = 2048;
509*61046927SAndroid Build Coastguard Worker 
510*61046927SAndroid Build Coastguard Worker    /** GL_EXT_gpu_shader4 */
511*61046927SAndroid Build Coastguard Worker    consts->MinProgramTexelOffset = -8;
512*61046927SAndroid Build Coastguard Worker    consts->MaxProgramTexelOffset = 7;
513*61046927SAndroid Build Coastguard Worker 
514*61046927SAndroid Build Coastguard Worker    /* GL_ARB_texture_gather */
515*61046927SAndroid Build Coastguard Worker    consts->MinProgramTextureGatherOffset = -8;
516*61046927SAndroid Build Coastguard Worker    consts->MaxProgramTextureGatherOffset = 7;
517*61046927SAndroid Build Coastguard Worker 
518*61046927SAndroid Build Coastguard Worker    /* GL_ARB_robustness */
519*61046927SAndroid Build Coastguard Worker    consts->ResetStrategy = GL_NO_RESET_NOTIFICATION_ARB;
520*61046927SAndroid Build Coastguard Worker 
521*61046927SAndroid Build Coastguard Worker    /* GL_KHR_robustness */
522*61046927SAndroid Build Coastguard Worker    consts->RobustAccess = GL_FALSE;
523*61046927SAndroid Build Coastguard Worker 
524*61046927SAndroid Build Coastguard Worker    /* ES 3.0 or ARB_ES3_compatibility */
525*61046927SAndroid Build Coastguard Worker    consts->MaxElementIndex = 0xffffffffu;
526*61046927SAndroid Build Coastguard Worker 
527*61046927SAndroid Build Coastguard Worker    /* GL_ARB_texture_multisample */
528*61046927SAndroid Build Coastguard Worker    consts->MaxColorTextureSamples = 1;
529*61046927SAndroid Build Coastguard Worker    consts->MaxDepthTextureSamples = 1;
530*61046927SAndroid Build Coastguard Worker    consts->MaxIntegerSamples = 1;
531*61046927SAndroid Build Coastguard Worker 
532*61046927SAndroid Build Coastguard Worker    /* GL_ARB_shader_atomic_counters */
533*61046927SAndroid Build Coastguard Worker    consts->MaxAtomicBufferBindings = MAX_COMBINED_ATOMIC_BUFFERS;
534*61046927SAndroid Build Coastguard Worker    consts->MaxAtomicBufferSize = MAX_ATOMIC_COUNTERS * ATOMIC_COUNTER_SIZE;
535*61046927SAndroid Build Coastguard Worker    consts->MaxCombinedAtomicBuffers = MAX_COMBINED_ATOMIC_BUFFERS;
536*61046927SAndroid Build Coastguard Worker    consts->MaxCombinedAtomicCounters = MAX_ATOMIC_COUNTERS;
537*61046927SAndroid Build Coastguard Worker 
538*61046927SAndroid Build Coastguard Worker    /* GL_ARB_vertex_attrib_binding */
539*61046927SAndroid Build Coastguard Worker    consts->MaxVertexAttribRelativeOffset = 2047;
540*61046927SAndroid Build Coastguard Worker    consts->MaxVertexAttribBindings = MAX_VERTEX_GENERIC_ATTRIBS;
541*61046927SAndroid Build Coastguard Worker 
542*61046927SAndroid Build Coastguard Worker    /* GL_ARB_compute_shader */
543*61046927SAndroid Build Coastguard Worker    consts->MaxComputeWorkGroupCount[0] = 65535;
544*61046927SAndroid Build Coastguard Worker    consts->MaxComputeWorkGroupCount[1] = 65535;
545*61046927SAndroid Build Coastguard Worker    consts->MaxComputeWorkGroupCount[2] = 65535;
546*61046927SAndroid Build Coastguard Worker    consts->MaxComputeWorkGroupSize[0] = 1024;
547*61046927SAndroid Build Coastguard Worker    consts->MaxComputeWorkGroupSize[1] = 1024;
548*61046927SAndroid Build Coastguard Worker    consts->MaxComputeWorkGroupSize[2] = 64;
549*61046927SAndroid Build Coastguard Worker    /* Enables compute support for GLES 3.1 if >= 128 */
550*61046927SAndroid Build Coastguard Worker    consts->MaxComputeWorkGroupInvocations = 0;
551*61046927SAndroid Build Coastguard Worker 
552*61046927SAndroid Build Coastguard Worker    /** GL_ARB_gpu_shader5 */
553*61046927SAndroid Build Coastguard Worker    consts->MinFragmentInterpolationOffset = MIN_FRAGMENT_INTERPOLATION_OFFSET;
554*61046927SAndroid Build Coastguard Worker    consts->MaxFragmentInterpolationOffset = MAX_FRAGMENT_INTERPOLATION_OFFSET;
555*61046927SAndroid Build Coastguard Worker 
556*61046927SAndroid Build Coastguard Worker    /** GL_KHR_context_flush_control */
557*61046927SAndroid Build Coastguard Worker    consts->ContextReleaseBehavior = GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH;
558*61046927SAndroid Build Coastguard Worker 
559*61046927SAndroid Build Coastguard Worker    /** GL_ARB_tessellation_shader */
560*61046927SAndroid Build Coastguard Worker    consts->MaxTessGenLevel = MAX_TESS_GEN_LEVEL;
561*61046927SAndroid Build Coastguard Worker    consts->MaxPatchVertices = MAX_PATCH_VERTICES;
562*61046927SAndroid Build Coastguard Worker    consts->Program[MESA_SHADER_TESS_CTRL].MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
563*61046927SAndroid Build Coastguard Worker    consts->Program[MESA_SHADER_TESS_EVAL].MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
564*61046927SAndroid Build Coastguard Worker    consts->MaxTessPatchComponents = MAX_TESS_PATCH_COMPONENTS;
565*61046927SAndroid Build Coastguard Worker    consts->MaxTessControlTotalOutputComponents = MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS;
566*61046927SAndroid Build Coastguard Worker    consts->PrimitiveRestartForPatches = false;
567*61046927SAndroid Build Coastguard Worker 
568*61046927SAndroid Build Coastguard Worker    /** GL_ARB_compute_variable_group_size */
569*61046927SAndroid Build Coastguard Worker    consts->MaxComputeVariableGroupSize[0] = 512;
570*61046927SAndroid Build Coastguard Worker    consts->MaxComputeVariableGroupSize[1] = 512;
571*61046927SAndroid Build Coastguard Worker    consts->MaxComputeVariableGroupSize[2] = 64;
572*61046927SAndroid Build Coastguard Worker    consts->MaxComputeVariableGroupInvocations = 512;
573*61046927SAndroid Build Coastguard Worker 
574*61046927SAndroid Build Coastguard Worker    /** GL_NV_conservative_raster */
575*61046927SAndroid Build Coastguard Worker    consts->MaxSubpixelPrecisionBiasBits = 0;
576*61046927SAndroid Build Coastguard Worker 
577*61046927SAndroid Build Coastguard Worker    /** GL_NV_conservative_raster_dilate */
578*61046927SAndroid Build Coastguard Worker    consts->ConservativeRasterDilateRange[0] = 0.0;
579*61046927SAndroid Build Coastguard Worker    consts->ConservativeRasterDilateRange[1] = 0.0;
580*61046927SAndroid Build Coastguard Worker    consts->ConservativeRasterDilateGranularity = 0.0;
581*61046927SAndroid Build Coastguard Worker 
582*61046927SAndroid Build Coastguard Worker    consts->glBeginEndBufferSize = 512 * 1024;
583*61046927SAndroid Build Coastguard Worker }
584*61046927SAndroid Build Coastguard Worker 
585*61046927SAndroid Build Coastguard Worker 
586*61046927SAndroid Build Coastguard Worker /**
587*61046927SAndroid Build Coastguard Worker  * Do some sanity checks on the limits/constants for the given context.
588*61046927SAndroid Build Coastguard Worker  * Only called the first time a context is bound.
589*61046927SAndroid Build Coastguard Worker  */
590*61046927SAndroid Build Coastguard Worker static void
check_context_limits(struct gl_context * ctx)591*61046927SAndroid Build Coastguard Worker check_context_limits(struct gl_context *ctx)
592*61046927SAndroid Build Coastguard Worker {
593*61046927SAndroid Build Coastguard Worker    (void) ctx;
594*61046927SAndroid Build Coastguard Worker 
595*61046927SAndroid Build Coastguard Worker    /* check that we don't exceed the size of various bitfields */
596*61046927SAndroid Build Coastguard Worker    assert(VARYING_SLOT_MAX <=
597*61046927SAndroid Build Coastguard Worker           (8 * sizeof(ctx->VertexProgram._Current->info.outputs_written)));
598*61046927SAndroid Build Coastguard Worker    assert(VARYING_SLOT_MAX <=
599*61046927SAndroid Build Coastguard Worker           (8 * sizeof(ctx->FragmentProgram._Current->info.inputs_read)));
600*61046927SAndroid Build Coastguard Worker 
601*61046927SAndroid Build Coastguard Worker    /* shader-related checks */
602*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS);
603*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.Program[MESA_SHADER_VERTEX].MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS);
604*61046927SAndroid Build Coastguard Worker 
605*61046927SAndroid Build Coastguard Worker    /* Texture unit checks */
606*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits > 0);
607*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits <= MAX_TEXTURE_IMAGE_UNITS);
608*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxTextureCoordUnits > 0);
609*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxTextureCoordUnits <= MAX_TEXTURE_COORD_UNITS);
610*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxTextureUnits > 0);
611*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_IMAGE_UNITS);
612*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_COORD_UNITS);
613*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxTextureUnits == MIN2(ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
614*61046927SAndroid Build Coastguard Worker                                              ctx->Const.MaxTextureCoordUnits));
615*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxCombinedTextureImageUnits > 0);
616*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxCombinedTextureImageUnits <= MAX_COMBINED_TEXTURE_IMAGE_UNITS);
617*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxTextureCoordUnits <= MAX_COMBINED_TEXTURE_IMAGE_UNITS);
618*61046927SAndroid Build Coastguard Worker    /* number of coord units cannot be greater than number of image units */
619*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxTextureCoordUnits <= ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits);
620*61046927SAndroid Build Coastguard Worker 
621*61046927SAndroid Build Coastguard Worker 
622*61046927SAndroid Build Coastguard Worker    /* Texture size checks */
623*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxTextureSize <= (1 << (MAX_TEXTURE_LEVELS - 1)));
624*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.Max3DTextureLevels <= MAX_TEXTURE_LEVELS);
625*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxCubeTextureLevels <= MAX_TEXTURE_LEVELS);
626*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxTextureRectSize <= MAX_TEXTURE_RECT_SIZE);
627*61046927SAndroid Build Coastguard Worker 
628*61046927SAndroid Build Coastguard Worker    /* Max texture size should be <= max viewport size (render to texture) */
629*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxTextureSize <= ctx->Const.MaxViewportWidth);
630*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxTextureSize <= ctx->Const.MaxViewportHeight);
631*61046927SAndroid Build Coastguard Worker 
632*61046927SAndroid Build Coastguard Worker    assert(ctx->Const.MaxDrawBuffers <= MAX_DRAW_BUFFERS);
633*61046927SAndroid Build Coastguard Worker 
634*61046927SAndroid Build Coastguard Worker    /* if this fails, add more enum values to gl_buffer_index */
635*61046927SAndroid Build Coastguard Worker    assert(BUFFER_COLOR0 + MAX_DRAW_BUFFERS <= BUFFER_COUNT);
636*61046927SAndroid Build Coastguard Worker 
637*61046927SAndroid Build Coastguard Worker    /* XXX probably add more tests */
638*61046927SAndroid Build Coastguard Worker }
639*61046927SAndroid Build Coastguard Worker 
640*61046927SAndroid Build Coastguard Worker 
641*61046927SAndroid Build Coastguard Worker /**
642*61046927SAndroid Build Coastguard Worker  * Initialize the attribute groups in a GL context.
643*61046927SAndroid Build Coastguard Worker  *
644*61046927SAndroid Build Coastguard Worker  * \param ctx GL context.
645*61046927SAndroid Build Coastguard Worker  *
646*61046927SAndroid Build Coastguard Worker  * Initializes all the attributes, calling the respective <tt>init*</tt>
647*61046927SAndroid Build Coastguard Worker  * functions for the more complex data structures.
648*61046927SAndroid Build Coastguard Worker  */
649*61046927SAndroid Build Coastguard Worker static GLboolean
init_attrib_groups(struct gl_context * ctx)650*61046927SAndroid Build Coastguard Worker init_attrib_groups(struct gl_context *ctx)
651*61046927SAndroid Build Coastguard Worker {
652*61046927SAndroid Build Coastguard Worker    assert(ctx);
653*61046927SAndroid Build Coastguard Worker 
654*61046927SAndroid Build Coastguard Worker    /* Constants */
655*61046927SAndroid Build Coastguard Worker    _mesa_init_constants(&ctx->Const, ctx->API);
656*61046927SAndroid Build Coastguard Worker 
657*61046927SAndroid Build Coastguard Worker    /* Extensions */
658*61046927SAndroid Build Coastguard Worker    _mesa_init_extensions(&ctx->Extensions);
659*61046927SAndroid Build Coastguard Worker 
660*61046927SAndroid Build Coastguard Worker    /* Attribute Groups */
661*61046927SAndroid Build Coastguard Worker    _mesa_init_accum( ctx );
662*61046927SAndroid Build Coastguard Worker    _mesa_init_attrib( ctx );
663*61046927SAndroid Build Coastguard Worker    _mesa_init_bbox( ctx );
664*61046927SAndroid Build Coastguard Worker    _mesa_init_buffer_objects( ctx );
665*61046927SAndroid Build Coastguard Worker    _mesa_init_color( ctx );
666*61046927SAndroid Build Coastguard Worker    _mesa_init_conservative_raster( ctx );
667*61046927SAndroid Build Coastguard Worker    _mesa_init_current( ctx );
668*61046927SAndroid Build Coastguard Worker    _mesa_init_depth( ctx );
669*61046927SAndroid Build Coastguard Worker    _mesa_init_debug( ctx );
670*61046927SAndroid Build Coastguard Worker    _mesa_init_debug_output( ctx );
671*61046927SAndroid Build Coastguard Worker    _mesa_init_display_list( ctx );
672*61046927SAndroid Build Coastguard Worker    _mesa_init_eval( ctx );
673*61046927SAndroid Build Coastguard Worker    _mesa_init_feedback( ctx );
674*61046927SAndroid Build Coastguard Worker    _mesa_init_fog( ctx );
675*61046927SAndroid Build Coastguard Worker    _mesa_init_hint( ctx );
676*61046927SAndroid Build Coastguard Worker    _mesa_init_image_units( ctx );
677*61046927SAndroid Build Coastguard Worker    _mesa_init_line( ctx );
678*61046927SAndroid Build Coastguard Worker    _mesa_init_lighting( ctx );
679*61046927SAndroid Build Coastguard Worker    _mesa_init_matrix( ctx );
680*61046927SAndroid Build Coastguard Worker    _mesa_init_multisample( ctx );
681*61046927SAndroid Build Coastguard Worker    _mesa_init_performance_monitors( ctx );
682*61046927SAndroid Build Coastguard Worker    _mesa_init_performance_queries( ctx );
683*61046927SAndroid Build Coastguard Worker    _mesa_init_pipeline( ctx );
684*61046927SAndroid Build Coastguard Worker    _mesa_init_pixel( ctx );
685*61046927SAndroid Build Coastguard Worker    _mesa_init_pixelstore( ctx );
686*61046927SAndroid Build Coastguard Worker    _mesa_init_point( ctx );
687*61046927SAndroid Build Coastguard Worker    _mesa_init_polygon( ctx );
688*61046927SAndroid Build Coastguard Worker    _mesa_init_varray( ctx ); /* should be before _mesa_init_program */
689*61046927SAndroid Build Coastguard Worker    _mesa_init_program( ctx );
690*61046927SAndroid Build Coastguard Worker    _mesa_init_queryobj( ctx );
691*61046927SAndroid Build Coastguard Worker    _mesa_init_sync( ctx );
692*61046927SAndroid Build Coastguard Worker    _mesa_init_rastpos( ctx );
693*61046927SAndroid Build Coastguard Worker    _mesa_init_scissor( ctx );
694*61046927SAndroid Build Coastguard Worker    _mesa_init_shader_state( ctx );
695*61046927SAndroid Build Coastguard Worker    _mesa_init_stencil( ctx );
696*61046927SAndroid Build Coastguard Worker    _mesa_init_transform( ctx );
697*61046927SAndroid Build Coastguard Worker    _mesa_init_transform_feedback( ctx );
698*61046927SAndroid Build Coastguard Worker    _mesa_init_viewport( ctx );
699*61046927SAndroid Build Coastguard Worker    _mesa_init_resident_handles( ctx );
700*61046927SAndroid Build Coastguard Worker 
701*61046927SAndroid Build Coastguard Worker    if (!_mesa_init_texture( ctx ))
702*61046927SAndroid Build Coastguard Worker       return GL_FALSE;
703*61046927SAndroid Build Coastguard Worker 
704*61046927SAndroid Build Coastguard Worker    /* Miscellaneous */
705*61046927SAndroid Build Coastguard Worker    ctx->TileRasterOrderIncreasingX = GL_TRUE;
706*61046927SAndroid Build Coastguard Worker    ctx->TileRasterOrderIncreasingY = GL_TRUE;
707*61046927SAndroid Build Coastguard Worker    ctx->NewState = _NEW_ALL;
708*61046927SAndroid Build Coastguard Worker    ctx->NewDriverState = ST_ALL_STATES_MASK;
709*61046927SAndroid Build Coastguard Worker    ctx->ErrorValue = GL_NO_ERROR;
710*61046927SAndroid Build Coastguard Worker    ctx->ShareGroupReset = false;
711*61046927SAndroid Build Coastguard Worker    ctx->IntelBlackholeRender = debug_get_bool_option("INTEL_BLACKHOLE_DEFAULT", false);
712*61046927SAndroid Build Coastguard Worker 
713*61046927SAndroid Build Coastguard Worker    return GL_TRUE;
714*61046927SAndroid Build Coastguard Worker }
715*61046927SAndroid Build Coastguard Worker 
716*61046927SAndroid Build Coastguard Worker 
717*61046927SAndroid Build Coastguard Worker /**
718*61046927SAndroid Build Coastguard Worker  * Update default objects in a GL context with respect to shared state.
719*61046927SAndroid Build Coastguard Worker  *
720*61046927SAndroid Build Coastguard Worker  * \param ctx GL context.
721*61046927SAndroid Build Coastguard Worker  *
722*61046927SAndroid Build Coastguard Worker  * Removes references to old default objects, (texture objects, program
723*61046927SAndroid Build Coastguard Worker  * objects, etc.) and changes to reference those from the current shared
724*61046927SAndroid Build Coastguard Worker  * state.
725*61046927SAndroid Build Coastguard Worker  */
726*61046927SAndroid Build Coastguard Worker static GLboolean
update_default_objects(struct gl_context * ctx)727*61046927SAndroid Build Coastguard Worker update_default_objects(struct gl_context *ctx)
728*61046927SAndroid Build Coastguard Worker {
729*61046927SAndroid Build Coastguard Worker    assert(ctx);
730*61046927SAndroid Build Coastguard Worker 
731*61046927SAndroid Build Coastguard Worker    _mesa_update_default_objects_program(ctx);
732*61046927SAndroid Build Coastguard Worker    _mesa_update_default_objects_texture(ctx);
733*61046927SAndroid Build Coastguard Worker    _mesa_update_default_objects_buffer_objects(ctx);
734*61046927SAndroid Build Coastguard Worker 
735*61046927SAndroid Build Coastguard Worker    return GL_TRUE;
736*61046927SAndroid Build Coastguard Worker }
737*61046927SAndroid Build Coastguard Worker 
738*61046927SAndroid Build Coastguard Worker 
739*61046927SAndroid Build Coastguard Worker /* XXX this is temporary and should be removed at some point in the
740*61046927SAndroid Build Coastguard Worker  * future when there's a reasonable expectation that the libGL library
741*61046927SAndroid Build Coastguard Worker  * contains the _glapi_new_nop_table() and _glapi_set_nop_handler()
742*61046927SAndroid Build Coastguard Worker  * functions which were added in Mesa 10.6.
743*61046927SAndroid Build Coastguard Worker  */
744*61046927SAndroid Build Coastguard Worker #if !defined(_WIN32)
745*61046927SAndroid Build Coastguard Worker /* Avoid libGL / driver ABI break */
746*61046927SAndroid Build Coastguard Worker #define USE_GLAPI_NOP_FEATURES 0
747*61046927SAndroid Build Coastguard Worker #else
748*61046927SAndroid Build Coastguard Worker #define USE_GLAPI_NOP_FEATURES 1
749*61046927SAndroid Build Coastguard Worker #endif
750*61046927SAndroid Build Coastguard Worker 
751*61046927SAndroid Build Coastguard Worker 
752*61046927SAndroid Build Coastguard Worker /**
753*61046927SAndroid Build Coastguard Worker  * This function is called by the glapi no-op functions.  For each OpenGL
754*61046927SAndroid Build Coastguard Worker  * function/entrypoint there's a simple no-op function.  These "no-op"
755*61046927SAndroid Build Coastguard Worker  * functions call this function.
756*61046927SAndroid Build Coastguard Worker  *
757*61046927SAndroid Build Coastguard Worker  * If there's a current OpenGL context for the calling thread, we record a
758*61046927SAndroid Build Coastguard Worker  * GL_INVALID_OPERATION error.  This can happen either because the app's
759*61046927SAndroid Build Coastguard Worker  * calling an unsupported extension function, or calling an illegal function
760*61046927SAndroid Build Coastguard Worker  * (such as glClear between glBegin/glEnd).
761*61046927SAndroid Build Coastguard Worker  *
762*61046927SAndroid Build Coastguard Worker  * If there's no current OpenGL context for the calling thread, we can
763*61046927SAndroid Build Coastguard Worker  * print a message to stderr.
764*61046927SAndroid Build Coastguard Worker  *
765*61046927SAndroid Build Coastguard Worker  * \param name  the name of the OpenGL function
766*61046927SAndroid Build Coastguard Worker  */
767*61046927SAndroid Build Coastguard Worker #if USE_GLAPI_NOP_FEATURES
768*61046927SAndroid Build Coastguard Worker static void
nop_handler(const char * name)769*61046927SAndroid Build Coastguard Worker nop_handler(const char *name)
770*61046927SAndroid Build Coastguard Worker {
771*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
772*61046927SAndroid Build Coastguard Worker    if (ctx) {
773*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION, "%s(invalid call)", name);
774*61046927SAndroid Build Coastguard Worker    }
775*61046927SAndroid Build Coastguard Worker #ifndef NDEBUG
776*61046927SAndroid Build Coastguard Worker    else if (getenv("MESA_DEBUG") || getenv("LIBGL_DEBUG")) {
777*61046927SAndroid Build Coastguard Worker       fprintf(stderr,
778*61046927SAndroid Build Coastguard Worker               "GL User Error: gl%s called without a rendering context\n",
779*61046927SAndroid Build Coastguard Worker               name);
780*61046927SAndroid Build Coastguard Worker       fflush(stderr);
781*61046927SAndroid Build Coastguard Worker    }
782*61046927SAndroid Build Coastguard Worker #endif
783*61046927SAndroid Build Coastguard Worker }
784*61046927SAndroid Build Coastguard Worker #endif
785*61046927SAndroid Build Coastguard Worker 
786*61046927SAndroid Build Coastguard Worker 
787*61046927SAndroid Build Coastguard Worker /**
788*61046927SAndroid Build Coastguard Worker  * Special no-op glFlush, see below.
789*61046927SAndroid Build Coastguard Worker  */
790*61046927SAndroid Build Coastguard Worker #if defined(_WIN32)
791*61046927SAndroid Build Coastguard Worker static void GLAPIENTRY
nop_glFlush(void)792*61046927SAndroid Build Coastguard Worker nop_glFlush(void)
793*61046927SAndroid Build Coastguard Worker {
794*61046927SAndroid Build Coastguard Worker    /* don't record an error like we do in nop_handler() */
795*61046927SAndroid Build Coastguard Worker }
796*61046927SAndroid Build Coastguard Worker #endif
797*61046927SAndroid Build Coastguard Worker 
798*61046927SAndroid Build Coastguard Worker 
799*61046927SAndroid Build Coastguard Worker #if !USE_GLAPI_NOP_FEATURES
800*61046927SAndroid Build Coastguard Worker static int
generic_nop(void)801*61046927SAndroid Build Coastguard Worker generic_nop(void)
802*61046927SAndroid Build Coastguard Worker {
803*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
804*61046927SAndroid Build Coastguard Worker    _mesa_error(ctx, GL_INVALID_OPERATION,
805*61046927SAndroid Build Coastguard Worker                "unsupported function called "
806*61046927SAndroid Build Coastguard Worker                "(unsupported extension or deprecated function?)");
807*61046927SAndroid Build Coastguard Worker    return 0;
808*61046927SAndroid Build Coastguard Worker }
809*61046927SAndroid Build Coastguard Worker #endif
810*61046927SAndroid Build Coastguard Worker 
811*61046927SAndroid Build Coastguard Worker 
812*61046927SAndroid Build Coastguard Worker static int
glthread_nop(void)813*61046927SAndroid Build Coastguard Worker glthread_nop(void)
814*61046927SAndroid Build Coastguard Worker {
815*61046927SAndroid Build Coastguard Worker    /* This writes the error into the glthread command buffer if glthread is
816*61046927SAndroid Build Coastguard Worker     * enabled.
817*61046927SAndroid Build Coastguard Worker     */
818*61046927SAndroid Build Coastguard Worker    CALL_InternalSetError(GET_DISPATCH(), (GL_INVALID_OPERATION));
819*61046927SAndroid Build Coastguard Worker    return 0;
820*61046927SAndroid Build Coastguard Worker }
821*61046927SAndroid Build Coastguard Worker 
822*61046927SAndroid Build Coastguard Worker 
823*61046927SAndroid Build Coastguard Worker /**
824*61046927SAndroid Build Coastguard Worker  * Create a new API dispatch table in which all entries point to the
825*61046927SAndroid Build Coastguard Worker  * generic_nop() function.  This will not work on Windows because of
826*61046927SAndroid Build Coastguard Worker  * the __stdcall convention which requires the callee to clean up the
827*61046927SAndroid Build Coastguard Worker  * call stack.  That's impossible with one generic no-op function.
828*61046927SAndroid Build Coastguard Worker  */
829*61046927SAndroid Build Coastguard Worker struct _glapi_table *
_mesa_new_nop_table(unsigned numEntries,bool glthread)830*61046927SAndroid Build Coastguard Worker _mesa_new_nop_table(unsigned numEntries, bool glthread)
831*61046927SAndroid Build Coastguard Worker {
832*61046927SAndroid Build Coastguard Worker    struct _glapi_table *table;
833*61046927SAndroid Build Coastguard Worker 
834*61046927SAndroid Build Coastguard Worker #if !USE_GLAPI_NOP_FEATURES
835*61046927SAndroid Build Coastguard Worker    table = malloc(numEntries * sizeof(_glapi_proc));
836*61046927SAndroid Build Coastguard Worker    if (table) {
837*61046927SAndroid Build Coastguard Worker       _glapi_proc *entry = (_glapi_proc *) table;
838*61046927SAndroid Build Coastguard Worker       unsigned i;
839*61046927SAndroid Build Coastguard Worker       for (i = 0; i < numEntries; i++) {
840*61046927SAndroid Build Coastguard Worker          entry[i] = (_glapi_proc) generic_nop;
841*61046927SAndroid Build Coastguard Worker       }
842*61046927SAndroid Build Coastguard Worker    }
843*61046927SAndroid Build Coastguard Worker #else
844*61046927SAndroid Build Coastguard Worker    table = _glapi_new_nop_table(numEntries);
845*61046927SAndroid Build Coastguard Worker #endif
846*61046927SAndroid Build Coastguard Worker 
847*61046927SAndroid Build Coastguard Worker    if (glthread) {
848*61046927SAndroid Build Coastguard Worker       _glapi_proc *entry = (_glapi_proc *) table;
849*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < numEntries; i++)
850*61046927SAndroid Build Coastguard Worker          entry[i] = (_glapi_proc)glthread_nop;
851*61046927SAndroid Build Coastguard Worker    }
852*61046927SAndroid Build Coastguard Worker 
853*61046927SAndroid Build Coastguard Worker    return table;
854*61046927SAndroid Build Coastguard Worker }
855*61046927SAndroid Build Coastguard Worker 
856*61046927SAndroid Build Coastguard Worker 
857*61046927SAndroid Build Coastguard Worker /**
858*61046927SAndroid Build Coastguard Worker  * Allocate and initialize a new dispatch table.  The table will be
859*61046927SAndroid Build Coastguard Worker  * populated with pointers to "no-op" functions.  In turn, the no-op
860*61046927SAndroid Build Coastguard Worker  * functions will call nop_handler() above.
861*61046927SAndroid Build Coastguard Worker  */
862*61046927SAndroid Build Coastguard Worker struct _glapi_table *
_mesa_alloc_dispatch_table(bool glthread)863*61046927SAndroid Build Coastguard Worker _mesa_alloc_dispatch_table(bool glthread)
864*61046927SAndroid Build Coastguard Worker {
865*61046927SAndroid Build Coastguard Worker    /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
866*61046927SAndroid Build Coastguard Worker     * In practice, this'll be the same for stand-alone Mesa.  But for DRI
867*61046927SAndroid Build Coastguard Worker     * Mesa we do this to accommodate different versions of libGL and various
868*61046927SAndroid Build Coastguard Worker     * DRI drivers.
869*61046927SAndroid Build Coastguard Worker     */
870*61046927SAndroid Build Coastguard Worker    int numEntries = MAX2(_glapi_get_dispatch_table_size(), _gloffset_COUNT);
871*61046927SAndroid Build Coastguard Worker 
872*61046927SAndroid Build Coastguard Worker    struct _glapi_table *table = _mesa_new_nop_table(numEntries, glthread);
873*61046927SAndroid Build Coastguard Worker 
874*61046927SAndroid Build Coastguard Worker #if defined(_WIN32)
875*61046927SAndroid Build Coastguard Worker    if (table) {
876*61046927SAndroid Build Coastguard Worker       /* This is a special case for Windows in the event that
877*61046927SAndroid Build Coastguard Worker        * wglGetProcAddress is called between glBegin/End().
878*61046927SAndroid Build Coastguard Worker        *
879*61046927SAndroid Build Coastguard Worker        * The MS opengl32.dll library apparently calls glFlush from
880*61046927SAndroid Build Coastguard Worker        * wglGetProcAddress().  If we're inside glBegin/End(), glFlush
881*61046927SAndroid Build Coastguard Worker        * will dispatch to _mesa_generic_nop() and we'll generate a
882*61046927SAndroid Build Coastguard Worker        * GL_INVALID_OPERATION error.
883*61046927SAndroid Build Coastguard Worker        *
884*61046927SAndroid Build Coastguard Worker        * The specific case which hits this is piglit's primitive-restart
885*61046927SAndroid Build Coastguard Worker        * test which calls glPrimitiveRestartNV() inside glBegin/End.  The
886*61046927SAndroid Build Coastguard Worker        * first time we call glPrimitiveRestartNV() Piglit's API dispatch
887*61046927SAndroid Build Coastguard Worker        * code will try to resolve the function by calling wglGetProcAddress.
888*61046927SAndroid Build Coastguard Worker        * This raises GL_INVALID_OPERATION and an assert(glGetError()==0)
889*61046927SAndroid Build Coastguard Worker        * will fail causing the test to fail.  By suppressing the error, the
890*61046927SAndroid Build Coastguard Worker        * assertion passes and the test continues.
891*61046927SAndroid Build Coastguard Worker        */
892*61046927SAndroid Build Coastguard Worker       SET_Flush(table, nop_glFlush);
893*61046927SAndroid Build Coastguard Worker    }
894*61046927SAndroid Build Coastguard Worker #endif
895*61046927SAndroid Build Coastguard Worker 
896*61046927SAndroid Build Coastguard Worker #if USE_GLAPI_NOP_FEATURES
897*61046927SAndroid Build Coastguard Worker    _glapi_set_nop_handler(nop_handler);
898*61046927SAndroid Build Coastguard Worker #endif
899*61046927SAndroid Build Coastguard Worker 
900*61046927SAndroid Build Coastguard Worker    return table;
901*61046927SAndroid Build Coastguard Worker }
902*61046927SAndroid Build Coastguard Worker 
903*61046927SAndroid Build Coastguard Worker /**
904*61046927SAndroid Build Coastguard Worker  * Allocate dispatch tables and set all functions to nop.
905*61046927SAndroid Build Coastguard Worker  * It also makes the OutsideBeginEnd dispatch table current within gl_dispatch.
906*61046927SAndroid Build Coastguard Worker  *
907*61046927SAndroid Build Coastguard Worker  * \param glthread Whether to set nop dispatch for glthread or regular dispatch
908*61046927SAndroid Build Coastguard Worker  */
909*61046927SAndroid Build Coastguard Worker bool
_mesa_alloc_dispatch_tables(gl_api api,struct gl_dispatch * d,bool glthread)910*61046927SAndroid Build Coastguard Worker _mesa_alloc_dispatch_tables(gl_api api, struct gl_dispatch *d, bool glthread)
911*61046927SAndroid Build Coastguard Worker {
912*61046927SAndroid Build Coastguard Worker    d->OutsideBeginEnd = _mesa_alloc_dispatch_table(glthread);
913*61046927SAndroid Build Coastguard Worker    if (!d->OutsideBeginEnd)
914*61046927SAndroid Build Coastguard Worker       return false;
915*61046927SAndroid Build Coastguard Worker 
916*61046927SAndroid Build Coastguard Worker    if (api == API_OPENGL_COMPAT) {
917*61046927SAndroid Build Coastguard Worker       d->BeginEnd = _mesa_alloc_dispatch_table(glthread);
918*61046927SAndroid Build Coastguard Worker       d->Save = _mesa_alloc_dispatch_table(glthread);
919*61046927SAndroid Build Coastguard Worker       if (!d->BeginEnd || !d->Save)
920*61046927SAndroid Build Coastguard Worker          return false;
921*61046927SAndroid Build Coastguard Worker    }
922*61046927SAndroid Build Coastguard Worker 
923*61046927SAndroid Build Coastguard Worker    d->Current = d->Exec = d->OutsideBeginEnd;
924*61046927SAndroid Build Coastguard Worker    return true;
925*61046927SAndroid Build Coastguard Worker }
926*61046927SAndroid Build Coastguard Worker 
927*61046927SAndroid Build Coastguard Worker static void
_mesa_free_dispatch_tables(struct gl_dispatch * d)928*61046927SAndroid Build Coastguard Worker _mesa_free_dispatch_tables(struct gl_dispatch *d)
929*61046927SAndroid Build Coastguard Worker {
930*61046927SAndroid Build Coastguard Worker    free(d->OutsideBeginEnd);
931*61046927SAndroid Build Coastguard Worker    free(d->BeginEnd);
932*61046927SAndroid Build Coastguard Worker    free(d->HWSelectModeBeginEnd);
933*61046927SAndroid Build Coastguard Worker    free(d->Save);
934*61046927SAndroid Build Coastguard Worker    free(d->ContextLost);
935*61046927SAndroid Build Coastguard Worker }
936*61046927SAndroid Build Coastguard Worker 
937*61046927SAndroid Build Coastguard Worker bool
_mesa_initialize_dispatch_tables(struct gl_context * ctx)938*61046927SAndroid Build Coastguard Worker _mesa_initialize_dispatch_tables(struct gl_context *ctx)
939*61046927SAndroid Build Coastguard Worker {
940*61046927SAndroid Build Coastguard Worker    if (!_mesa_alloc_dispatch_tables(ctx->API, &ctx->Dispatch, false))
941*61046927SAndroid Build Coastguard Worker       return false;
942*61046927SAndroid Build Coastguard Worker 
943*61046927SAndroid Build Coastguard Worker    /* Do the code-generated initialization of dispatch tables. */
944*61046927SAndroid Build Coastguard Worker    _mesa_init_dispatch(ctx);
945*61046927SAndroid Build Coastguard Worker    vbo_init_dispatch_begin_end(ctx);
946*61046927SAndroid Build Coastguard Worker 
947*61046927SAndroid Build Coastguard Worker    if (_mesa_is_desktop_gl_compat(ctx)) {
948*61046927SAndroid Build Coastguard Worker       _mesa_init_dispatch_save(ctx);
949*61046927SAndroid Build Coastguard Worker       _mesa_init_dispatch_save_begin_end(ctx);
950*61046927SAndroid Build Coastguard Worker    }
951*61046927SAndroid Build Coastguard Worker 
952*61046927SAndroid Build Coastguard Worker    /* This binds the dispatch table to the context, but MakeCurrent will
953*61046927SAndroid Build Coastguard Worker     * bind it for the user. If glthread is enabled, it will override it.
954*61046927SAndroid Build Coastguard Worker     */
955*61046927SAndroid Build Coastguard Worker    ctx->GLApi = ctx->Dispatch.Current;
956*61046927SAndroid Build Coastguard Worker    return true;
957*61046927SAndroid Build Coastguard Worker }
958*61046927SAndroid Build Coastguard Worker 
959*61046927SAndroid Build Coastguard Worker /**
960*61046927SAndroid Build Coastguard Worker  * Initialize a struct gl_context struct (rendering context).
961*61046927SAndroid Build Coastguard Worker  *
962*61046927SAndroid Build Coastguard Worker  * This includes allocating all the other structs and arrays which hang off of
963*61046927SAndroid Build Coastguard Worker  * the context by pointers.
964*61046927SAndroid Build Coastguard Worker  * Note that the driver needs to pass in its dd_function_table here since
965*61046927SAndroid Build Coastguard Worker  * we need to at least call st_NewTextureObject to create the
966*61046927SAndroid Build Coastguard Worker  * default texture objects.
967*61046927SAndroid Build Coastguard Worker  *
968*61046927SAndroid Build Coastguard Worker  * Called by _mesa_create_context().
969*61046927SAndroid Build Coastguard Worker  *
970*61046927SAndroid Build Coastguard Worker  * Performs the imports and exports callback tables initialization, and
971*61046927SAndroid Build Coastguard Worker  * miscellaneous one-time initializations. If no shared context is supplied one
972*61046927SAndroid Build Coastguard Worker  * is allocated, and increase its reference count.  Setups the GL API dispatch
973*61046927SAndroid Build Coastguard Worker  * tables.  Initialize the TNL module. Sets the maximum Z buffer depth.
974*61046927SAndroid Build Coastguard Worker  * Finally queries the \c MESA_DEBUG and \c MESA_VERBOSE environment variables
975*61046927SAndroid Build Coastguard Worker  * for debug flags.
976*61046927SAndroid Build Coastguard Worker  *
977*61046927SAndroid Build Coastguard Worker  * \param ctx the context to initialize
978*61046927SAndroid Build Coastguard Worker  * \param api the GL API type to create the context for
979*61046927SAndroid Build Coastguard Worker  * \param visual describes the visual attributes for this context or NULL to
980*61046927SAndroid Build Coastguard Worker  *               create a configless context
981*61046927SAndroid Build Coastguard Worker  * \param share_list points to context to share textures, display lists,
982*61046927SAndroid Build Coastguard Worker  *        etc with, or NULL
983*61046927SAndroid Build Coastguard Worker  * \param driverFunctions table of device driver functions for this context
984*61046927SAndroid Build Coastguard Worker  *        to use
985*61046927SAndroid Build Coastguard Worker  */
986*61046927SAndroid Build Coastguard Worker GLboolean
_mesa_initialize_context(struct gl_context * ctx,gl_api api,bool no_error,const struct gl_config * visual,struct gl_context * share_list,const struct dd_function_table * driverFunctions)987*61046927SAndroid Build Coastguard Worker _mesa_initialize_context(struct gl_context *ctx,
988*61046927SAndroid Build Coastguard Worker                          gl_api api,
989*61046927SAndroid Build Coastguard Worker                          bool no_error,
990*61046927SAndroid Build Coastguard Worker                          const struct gl_config *visual,
991*61046927SAndroid Build Coastguard Worker                          struct gl_context *share_list,
992*61046927SAndroid Build Coastguard Worker                          const struct dd_function_table *driverFunctions)
993*61046927SAndroid Build Coastguard Worker {
994*61046927SAndroid Build Coastguard Worker    struct gl_shared_state *shared;
995*61046927SAndroid Build Coastguard Worker    int i;
996*61046927SAndroid Build Coastguard Worker 
997*61046927SAndroid Build Coastguard Worker    switch (api) {
998*61046927SAndroid Build Coastguard Worker    case API_OPENGL_COMPAT:
999*61046927SAndroid Build Coastguard Worker    case API_OPENGL_CORE:
1000*61046927SAndroid Build Coastguard Worker       if (!HAVE_OPENGL)
1001*61046927SAndroid Build Coastguard Worker          return GL_FALSE;
1002*61046927SAndroid Build Coastguard Worker       break;
1003*61046927SAndroid Build Coastguard Worker    case API_OPENGLES2:
1004*61046927SAndroid Build Coastguard Worker       if (!HAVE_OPENGL_ES_2)
1005*61046927SAndroid Build Coastguard Worker          return GL_FALSE;
1006*61046927SAndroid Build Coastguard Worker       break;
1007*61046927SAndroid Build Coastguard Worker    case API_OPENGLES:
1008*61046927SAndroid Build Coastguard Worker       if (!HAVE_OPENGL_ES_1)
1009*61046927SAndroid Build Coastguard Worker          return GL_FALSE;
1010*61046927SAndroid Build Coastguard Worker       break;
1011*61046927SAndroid Build Coastguard Worker    default:
1012*61046927SAndroid Build Coastguard Worker       return GL_FALSE;
1013*61046927SAndroid Build Coastguard Worker    }
1014*61046927SAndroid Build Coastguard Worker 
1015*61046927SAndroid Build Coastguard Worker    ctx->API = api;
1016*61046927SAndroid Build Coastguard Worker    ctx->DrawBuffer = NULL;
1017*61046927SAndroid Build Coastguard Worker    ctx->ReadBuffer = NULL;
1018*61046927SAndroid Build Coastguard Worker    ctx->WinSysDrawBuffer = NULL;
1019*61046927SAndroid Build Coastguard Worker    ctx->WinSysReadBuffer = NULL;
1020*61046927SAndroid Build Coastguard Worker 
1021*61046927SAndroid Build Coastguard Worker    if (visual) {
1022*61046927SAndroid Build Coastguard Worker       ctx->Visual = *visual;
1023*61046927SAndroid Build Coastguard Worker       ctx->HasConfig = GL_TRUE;
1024*61046927SAndroid Build Coastguard Worker    }
1025*61046927SAndroid Build Coastguard Worker    else {
1026*61046927SAndroid Build Coastguard Worker       memset(&ctx->Visual, 0, sizeof ctx->Visual);
1027*61046927SAndroid Build Coastguard Worker       ctx->HasConfig = GL_FALSE;
1028*61046927SAndroid Build Coastguard Worker    }
1029*61046927SAndroid Build Coastguard Worker 
1030*61046927SAndroid Build Coastguard Worker    _mesa_override_gl_version(ctx);
1031*61046927SAndroid Build Coastguard Worker 
1032*61046927SAndroid Build Coastguard Worker    /* misc one-time initializations */
1033*61046927SAndroid Build Coastguard Worker    _mesa_initialize(NULL);
1034*61046927SAndroid Build Coastguard Worker 
1035*61046927SAndroid Build Coastguard Worker    /* Plug in driver functions and context pointer here.
1036*61046927SAndroid Build Coastguard Worker     * This is important because when we call alloc_shared_state() below
1037*61046927SAndroid Build Coastguard Worker     * we'll call ctx->Driver.NewTextureObject() to create the default
1038*61046927SAndroid Build Coastguard Worker     * textures.
1039*61046927SAndroid Build Coastguard Worker     */
1040*61046927SAndroid Build Coastguard Worker    ctx->Driver = *driverFunctions;
1041*61046927SAndroid Build Coastguard Worker 
1042*61046927SAndroid Build Coastguard Worker    if (share_list) {
1043*61046927SAndroid Build Coastguard Worker       /* share state with another context */
1044*61046927SAndroid Build Coastguard Worker       shared = share_list->Shared;
1045*61046927SAndroid Build Coastguard Worker    }
1046*61046927SAndroid Build Coastguard Worker    else {
1047*61046927SAndroid Build Coastguard Worker       /* allocate new, unshared state */
1048*61046927SAndroid Build Coastguard Worker       shared = _mesa_alloc_shared_state(ctx);
1049*61046927SAndroid Build Coastguard Worker       if (!shared)
1050*61046927SAndroid Build Coastguard Worker          return GL_FALSE;
1051*61046927SAndroid Build Coastguard Worker    }
1052*61046927SAndroid Build Coastguard Worker 
1053*61046927SAndroid Build Coastguard Worker    /* all supported by default */
1054*61046927SAndroid Build Coastguard Worker    ctx->Const.DriverSupportedPrimMask = 0xffffffff;
1055*61046927SAndroid Build Coastguard Worker 
1056*61046927SAndroid Build Coastguard Worker    _mesa_reference_shared_state(ctx, &ctx->Shared, shared);
1057*61046927SAndroid Build Coastguard Worker 
1058*61046927SAndroid Build Coastguard Worker    if (!init_attrib_groups( ctx ))
1059*61046927SAndroid Build Coastguard Worker       goto fail;
1060*61046927SAndroid Build Coastguard Worker 
1061*61046927SAndroid Build Coastguard Worker    if (no_error)
1062*61046927SAndroid Build Coastguard Worker       ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR;
1063*61046927SAndroid Build Coastguard Worker 
1064*61046927SAndroid Build Coastguard Worker    _mesa_reset_vertex_processing_mode(ctx);
1065*61046927SAndroid Build Coastguard Worker 
1066*61046927SAndroid Build Coastguard Worker    /* Mesa core handles all the formats that mesa core knows about.
1067*61046927SAndroid Build Coastguard Worker     * Drivers will want to override this list with just the formats
1068*61046927SAndroid Build Coastguard Worker     * they can handle.
1069*61046927SAndroid Build Coastguard Worker     */
1070*61046927SAndroid Build Coastguard Worker    memset(&ctx->TextureFormatSupported, GL_TRUE,
1071*61046927SAndroid Build Coastguard Worker           sizeof(ctx->TextureFormatSupported));
1072*61046927SAndroid Build Coastguard Worker 
1073*61046927SAndroid Build Coastguard Worker    switch (ctx->API) {
1074*61046927SAndroid Build Coastguard Worker    case API_OPENGL_COMPAT:
1075*61046927SAndroid Build Coastguard Worker    case API_OPENGL_CORE:
1076*61046927SAndroid Build Coastguard Worker    case API_OPENGLES2:
1077*61046927SAndroid Build Coastguard Worker       break;
1078*61046927SAndroid Build Coastguard Worker    case API_OPENGLES:
1079*61046927SAndroid Build Coastguard Worker       /**
1080*61046927SAndroid Build Coastguard Worker        * GL_OES_texture_cube_map says
1081*61046927SAndroid Build Coastguard Worker        * "Initially all texture generation modes are set to REFLECTION_MAP_OES"
1082*61046927SAndroid Build Coastguard Worker        */
1083*61046927SAndroid Build Coastguard Worker       for (i = 0; i < ARRAY_SIZE(ctx->Texture.FixedFuncUnit); i++) {
1084*61046927SAndroid Build Coastguard Worker          struct gl_fixedfunc_texture_unit *texUnit =
1085*61046927SAndroid Build Coastguard Worker             &ctx->Texture.FixedFuncUnit[i];
1086*61046927SAndroid Build Coastguard Worker 
1087*61046927SAndroid Build Coastguard Worker          texUnit->GenS.Mode = GL_REFLECTION_MAP_NV;
1088*61046927SAndroid Build Coastguard Worker          texUnit->GenT.Mode = GL_REFLECTION_MAP_NV;
1089*61046927SAndroid Build Coastguard Worker          texUnit->GenR.Mode = GL_REFLECTION_MAP_NV;
1090*61046927SAndroid Build Coastguard Worker          texUnit->GenS._ModeBit = TEXGEN_REFLECTION_MAP_NV;
1091*61046927SAndroid Build Coastguard Worker          texUnit->GenT._ModeBit = TEXGEN_REFLECTION_MAP_NV;
1092*61046927SAndroid Build Coastguard Worker          texUnit->GenR._ModeBit = TEXGEN_REFLECTION_MAP_NV;
1093*61046927SAndroid Build Coastguard Worker       }
1094*61046927SAndroid Build Coastguard Worker       break;
1095*61046927SAndroid Build Coastguard Worker    }
1096*61046927SAndroid Build Coastguard Worker    ctx->VertexProgram.PointSizeEnabled = _mesa_is_gles2(ctx);
1097*61046927SAndroid Build Coastguard Worker    ctx->PointSizeIsSet = GL_TRUE;
1098*61046927SAndroid Build Coastguard Worker 
1099*61046927SAndroid Build Coastguard Worker    ctx->FirstTimeCurrent = GL_TRUE;
1100*61046927SAndroid Build Coastguard Worker 
1101*61046927SAndroid Build Coastguard Worker    return GL_TRUE;
1102*61046927SAndroid Build Coastguard Worker 
1103*61046927SAndroid Build Coastguard Worker fail:
1104*61046927SAndroid Build Coastguard Worker    _mesa_reference_shared_state(ctx, &ctx->Shared, NULL);
1105*61046927SAndroid Build Coastguard Worker    return GL_FALSE;
1106*61046927SAndroid Build Coastguard Worker }
1107*61046927SAndroid Build Coastguard Worker 
1108*61046927SAndroid Build Coastguard Worker 
1109*61046927SAndroid Build Coastguard Worker /**
1110*61046927SAndroid Build Coastguard Worker  * Free the data associated with the given context.
1111*61046927SAndroid Build Coastguard Worker  *
1112*61046927SAndroid Build Coastguard Worker  * But doesn't free the struct gl_context struct itself.
1113*61046927SAndroid Build Coastguard Worker  *
1114*61046927SAndroid Build Coastguard Worker  * \sa _mesa_initialize_context() and init_attrib_groups().
1115*61046927SAndroid Build Coastguard Worker  */
1116*61046927SAndroid Build Coastguard Worker void
_mesa_free_context_data(struct gl_context * ctx,bool destroy_debug_output)1117*61046927SAndroid Build Coastguard Worker _mesa_free_context_data(struct gl_context *ctx, bool destroy_debug_output)
1118*61046927SAndroid Build Coastguard Worker {
1119*61046927SAndroid Build Coastguard Worker    if (!_mesa_get_current_context()){
1120*61046927SAndroid Build Coastguard Worker       /* No current context, but we may need one in order to delete
1121*61046927SAndroid Build Coastguard Worker        * texture objs, etc.  So temporarily bind the context now.
1122*61046927SAndroid Build Coastguard Worker        */
1123*61046927SAndroid Build Coastguard Worker       _mesa_make_current(ctx, NULL, NULL);
1124*61046927SAndroid Build Coastguard Worker    }
1125*61046927SAndroid Build Coastguard Worker 
1126*61046927SAndroid Build Coastguard Worker    /* unreference WinSysDraw/Read buffers */
1127*61046927SAndroid Build Coastguard Worker    _mesa_reference_framebuffer(&ctx->WinSysDrawBuffer, NULL);
1128*61046927SAndroid Build Coastguard Worker    _mesa_reference_framebuffer(&ctx->WinSysReadBuffer, NULL);
1129*61046927SAndroid Build Coastguard Worker    _mesa_reference_framebuffer(&ctx->DrawBuffer, NULL);
1130*61046927SAndroid Build Coastguard Worker    _mesa_reference_framebuffer(&ctx->ReadBuffer, NULL);
1131*61046927SAndroid Build Coastguard Worker 
1132*61046927SAndroid Build Coastguard Worker    _mesa_reference_program(ctx, &ctx->VertexProgram.Current, NULL);
1133*61046927SAndroid Build Coastguard Worker    _mesa_reference_program(ctx, &ctx->VertexProgram._Current, NULL);
1134*61046927SAndroid Build Coastguard Worker    _mesa_reference_program(ctx, &ctx->VertexProgram._TnlProgram, NULL);
1135*61046927SAndroid Build Coastguard Worker 
1136*61046927SAndroid Build Coastguard Worker    _mesa_reference_program(ctx, &ctx->TessCtrlProgram._Current, NULL);
1137*61046927SAndroid Build Coastguard Worker    _mesa_reference_program(ctx, &ctx->TessEvalProgram._Current, NULL);
1138*61046927SAndroid Build Coastguard Worker    _mesa_reference_program(ctx, &ctx->GeometryProgram._Current, NULL);
1139*61046927SAndroid Build Coastguard Worker 
1140*61046927SAndroid Build Coastguard Worker    _mesa_reference_program(ctx, &ctx->FragmentProgram.Current, NULL);
1141*61046927SAndroid Build Coastguard Worker    _mesa_reference_program(ctx, &ctx->FragmentProgram._Current, NULL);
1142*61046927SAndroid Build Coastguard Worker    _mesa_reference_program(ctx, &ctx->FragmentProgram._TexEnvProgram, NULL);
1143*61046927SAndroid Build Coastguard Worker 
1144*61046927SAndroid Build Coastguard Worker    _mesa_reference_program(ctx, &ctx->ComputeProgram._Current, NULL);
1145*61046927SAndroid Build Coastguard Worker 
1146*61046927SAndroid Build Coastguard Worker    _mesa_reference_vao(ctx, &ctx->Array.VAO, NULL);
1147*61046927SAndroid Build Coastguard Worker    _mesa_reference_vao(ctx, &ctx->Array.DefaultVAO, NULL);
1148*61046927SAndroid Build Coastguard Worker    _mesa_reference_vao(ctx, &ctx->Array._DrawVAO, NULL);
1149*61046927SAndroid Build Coastguard Worker 
1150*61046927SAndroid Build Coastguard Worker    _mesa_free_attrib_data(ctx);
1151*61046927SAndroid Build Coastguard Worker    _mesa_free_eval_data( ctx );
1152*61046927SAndroid Build Coastguard Worker    _mesa_free_feedback(ctx);
1153*61046927SAndroid Build Coastguard Worker    _mesa_free_texture_data( ctx );
1154*61046927SAndroid Build Coastguard Worker    _mesa_free_image_textures(ctx);
1155*61046927SAndroid Build Coastguard Worker    _mesa_free_matrix_data( ctx );
1156*61046927SAndroid Build Coastguard Worker    _mesa_free_pipeline_data(ctx);
1157*61046927SAndroid Build Coastguard Worker    _mesa_free_program_data(ctx);
1158*61046927SAndroid Build Coastguard Worker    _mesa_free_shader_state(ctx);
1159*61046927SAndroid Build Coastguard Worker    _mesa_free_queryobj_data(ctx);
1160*61046927SAndroid Build Coastguard Worker    _mesa_free_sync_data(ctx);
1161*61046927SAndroid Build Coastguard Worker    _mesa_free_varray_data(ctx);
1162*61046927SAndroid Build Coastguard Worker    _mesa_free_transform_feedback(ctx);
1163*61046927SAndroid Build Coastguard Worker    _mesa_free_performance_monitors(ctx);
1164*61046927SAndroid Build Coastguard Worker    _mesa_free_performance_queries(ctx);
1165*61046927SAndroid Build Coastguard Worker    _mesa_free_perfomance_monitor_groups(ctx);
1166*61046927SAndroid Build Coastguard Worker    _mesa_free_resident_handles(ctx);
1167*61046927SAndroid Build Coastguard Worker 
1168*61046927SAndroid Build Coastguard Worker    _mesa_reference_buffer_object(ctx, &ctx->Pack.BufferObj, NULL);
1169*61046927SAndroid Build Coastguard Worker    _mesa_reference_buffer_object(ctx, &ctx->Unpack.BufferObj, NULL);
1170*61046927SAndroid Build Coastguard Worker    _mesa_reference_buffer_object(ctx, &ctx->DefaultPacking.BufferObj, NULL);
1171*61046927SAndroid Build Coastguard Worker    _mesa_reference_buffer_object(ctx, &ctx->Array.ArrayBufferObj, NULL);
1172*61046927SAndroid Build Coastguard Worker 
1173*61046927SAndroid Build Coastguard Worker    /* This must be called after all buffers are unbound because global buffer
1174*61046927SAndroid Build Coastguard Worker     * references that this context holds will be removed.
1175*61046927SAndroid Build Coastguard Worker     */
1176*61046927SAndroid Build Coastguard Worker    _mesa_free_buffer_objects(ctx);
1177*61046927SAndroid Build Coastguard Worker 
1178*61046927SAndroid Build Coastguard Worker    /* free dispatch tables */
1179*61046927SAndroid Build Coastguard Worker    _mesa_free_dispatch_tables(&ctx->Dispatch);
1180*61046927SAndroid Build Coastguard Worker    free(ctx->MarshalExec);
1181*61046927SAndroid Build Coastguard Worker 
1182*61046927SAndroid Build Coastguard Worker    /* Shared context state (display lists, textures, etc) */
1183*61046927SAndroid Build Coastguard Worker    _mesa_reference_shared_state(ctx, &ctx->Shared, NULL);
1184*61046927SAndroid Build Coastguard Worker 
1185*61046927SAndroid Build Coastguard Worker    if (destroy_debug_output)
1186*61046927SAndroid Build Coastguard Worker       _mesa_destroy_debug_output(ctx);
1187*61046927SAndroid Build Coastguard Worker 
1188*61046927SAndroid Build Coastguard Worker    free((void *)ctx->Extensions.String);
1189*61046927SAndroid Build Coastguard Worker 
1190*61046927SAndroid Build Coastguard Worker    free(ctx->VersionString);
1191*61046927SAndroid Build Coastguard Worker 
1192*61046927SAndroid Build Coastguard Worker    ralloc_free(ctx->SoftFP64);
1193*61046927SAndroid Build Coastguard Worker 
1194*61046927SAndroid Build Coastguard Worker    /* unbind the context if it's currently bound */
1195*61046927SAndroid Build Coastguard Worker    if (ctx == _mesa_get_current_context()) {
1196*61046927SAndroid Build Coastguard Worker       _mesa_make_current(NULL, NULL, NULL);
1197*61046927SAndroid Build Coastguard Worker    }
1198*61046927SAndroid Build Coastguard Worker 
1199*61046927SAndroid Build Coastguard Worker    /* Do this after unbinding context to ensure any thread is finished. */
1200*61046927SAndroid Build Coastguard Worker    if (ctx->shader_builtin_ref) {
1201*61046927SAndroid Build Coastguard Worker       _mesa_glsl_builtin_functions_decref();
1202*61046927SAndroid Build Coastguard Worker       ctx->shader_builtin_ref = false;
1203*61046927SAndroid Build Coastguard Worker    }
1204*61046927SAndroid Build Coastguard Worker 
1205*61046927SAndroid Build Coastguard Worker    free(ctx->Const.SpirVExtensions);
1206*61046927SAndroid Build Coastguard Worker    free(ctx->tmp_draws);
1207*61046927SAndroid Build Coastguard Worker }
1208*61046927SAndroid Build Coastguard Worker 
1209*61046927SAndroid Build Coastguard Worker 
1210*61046927SAndroid Build Coastguard Worker /**
1211*61046927SAndroid Build Coastguard Worker  * Copy attribute groups from one context to another.
1212*61046927SAndroid Build Coastguard Worker  *
1213*61046927SAndroid Build Coastguard Worker  * \param src source context
1214*61046927SAndroid Build Coastguard Worker  * \param dst destination context
1215*61046927SAndroid Build Coastguard Worker  * \param mask bitwise OR of GL_*_BIT flags
1216*61046927SAndroid Build Coastguard Worker  *
1217*61046927SAndroid Build Coastguard Worker  * According to the bits specified in \p mask, copies the corresponding
1218*61046927SAndroid Build Coastguard Worker  * attributes from \p src into \p dst.  For many of the attributes a simple \c
1219*61046927SAndroid Build Coastguard Worker  * memcpy is not enough due to the existence of internal pointers in their data
1220*61046927SAndroid Build Coastguard Worker  * structures.
1221*61046927SAndroid Build Coastguard Worker  */
1222*61046927SAndroid Build Coastguard Worker void
_mesa_copy_context(const struct gl_context * src,struct gl_context * dst,GLuint mask)1223*61046927SAndroid Build Coastguard Worker _mesa_copy_context( const struct gl_context *src, struct gl_context *dst,
1224*61046927SAndroid Build Coastguard Worker                     GLuint mask )
1225*61046927SAndroid Build Coastguard Worker {
1226*61046927SAndroid Build Coastguard Worker    if (mask & GL_ACCUM_BUFFER_BIT) {
1227*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1228*61046927SAndroid Build Coastguard Worker       dst->Accum = src->Accum;
1229*61046927SAndroid Build Coastguard Worker    }
1230*61046927SAndroid Build Coastguard Worker    if (mask & GL_COLOR_BUFFER_BIT) {
1231*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1232*61046927SAndroid Build Coastguard Worker       dst->Color = src->Color;
1233*61046927SAndroid Build Coastguard Worker    }
1234*61046927SAndroid Build Coastguard Worker    if (mask & GL_CURRENT_BIT) {
1235*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1236*61046927SAndroid Build Coastguard Worker       dst->Current = src->Current;
1237*61046927SAndroid Build Coastguard Worker    }
1238*61046927SAndroid Build Coastguard Worker    if (mask & GL_DEPTH_BUFFER_BIT) {
1239*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1240*61046927SAndroid Build Coastguard Worker       dst->Depth = src->Depth;
1241*61046927SAndroid Build Coastguard Worker    }
1242*61046927SAndroid Build Coastguard Worker    if (mask & GL_ENABLE_BIT) {
1243*61046927SAndroid Build Coastguard Worker       /* no op */
1244*61046927SAndroid Build Coastguard Worker    }
1245*61046927SAndroid Build Coastguard Worker    if (mask & GL_EVAL_BIT) {
1246*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1247*61046927SAndroid Build Coastguard Worker       dst->Eval = src->Eval;
1248*61046927SAndroid Build Coastguard Worker    }
1249*61046927SAndroid Build Coastguard Worker    if (mask & GL_FOG_BIT) {
1250*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1251*61046927SAndroid Build Coastguard Worker       dst->Fog = src->Fog;
1252*61046927SAndroid Build Coastguard Worker    }
1253*61046927SAndroid Build Coastguard Worker    if (mask & GL_HINT_BIT) {
1254*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1255*61046927SAndroid Build Coastguard Worker       dst->Hint = src->Hint;
1256*61046927SAndroid Build Coastguard Worker    }
1257*61046927SAndroid Build Coastguard Worker    if (mask & GL_LIGHTING_BIT) {
1258*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1259*61046927SAndroid Build Coastguard Worker       dst->Light = src->Light;
1260*61046927SAndroid Build Coastguard Worker    }
1261*61046927SAndroid Build Coastguard Worker    if (mask & GL_LINE_BIT) {
1262*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1263*61046927SAndroid Build Coastguard Worker       dst->Line = src->Line;
1264*61046927SAndroid Build Coastguard Worker    }
1265*61046927SAndroid Build Coastguard Worker    if (mask & GL_LIST_BIT) {
1266*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1267*61046927SAndroid Build Coastguard Worker       dst->List = src->List;
1268*61046927SAndroid Build Coastguard Worker    }
1269*61046927SAndroid Build Coastguard Worker    if (mask & GL_PIXEL_MODE_BIT) {
1270*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1271*61046927SAndroid Build Coastguard Worker       dst->Pixel = src->Pixel;
1272*61046927SAndroid Build Coastguard Worker    }
1273*61046927SAndroid Build Coastguard Worker    if (mask & GL_POINT_BIT) {
1274*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1275*61046927SAndroid Build Coastguard Worker       dst->Point = src->Point;
1276*61046927SAndroid Build Coastguard Worker    }
1277*61046927SAndroid Build Coastguard Worker    if (mask & GL_POLYGON_BIT) {
1278*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1279*61046927SAndroid Build Coastguard Worker       dst->Polygon = src->Polygon;
1280*61046927SAndroid Build Coastguard Worker    }
1281*61046927SAndroid Build Coastguard Worker    if (mask & GL_POLYGON_STIPPLE_BIT) {
1282*61046927SAndroid Build Coastguard Worker       /* Use loop instead of memcpy due to problem with Portland Group's
1283*61046927SAndroid Build Coastguard Worker        * C compiler.  Reported by John Stone.
1284*61046927SAndroid Build Coastguard Worker        */
1285*61046927SAndroid Build Coastguard Worker       GLuint i;
1286*61046927SAndroid Build Coastguard Worker       for (i = 0; i < 32; i++) {
1287*61046927SAndroid Build Coastguard Worker          dst->PolygonStipple[i] = src->PolygonStipple[i];
1288*61046927SAndroid Build Coastguard Worker       }
1289*61046927SAndroid Build Coastguard Worker    }
1290*61046927SAndroid Build Coastguard Worker    if (mask & GL_SCISSOR_BIT) {
1291*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1292*61046927SAndroid Build Coastguard Worker       dst->Scissor = src->Scissor;
1293*61046927SAndroid Build Coastguard Worker    }
1294*61046927SAndroid Build Coastguard Worker    if (mask & GL_STENCIL_BUFFER_BIT) {
1295*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1296*61046927SAndroid Build Coastguard Worker       dst->Stencil = src->Stencil;
1297*61046927SAndroid Build Coastguard Worker    }
1298*61046927SAndroid Build Coastguard Worker    if (mask & GL_TEXTURE_BIT) {
1299*61046927SAndroid Build Coastguard Worker       /* Cannot memcpy because of pointers */
1300*61046927SAndroid Build Coastguard Worker       _mesa_copy_texture_state(src, dst);
1301*61046927SAndroid Build Coastguard Worker    }
1302*61046927SAndroid Build Coastguard Worker    if (mask & GL_TRANSFORM_BIT) {
1303*61046927SAndroid Build Coastguard Worker       /* OK to memcpy */
1304*61046927SAndroid Build Coastguard Worker       dst->Transform = src->Transform;
1305*61046927SAndroid Build Coastguard Worker    }
1306*61046927SAndroid Build Coastguard Worker    if (mask & GL_VIEWPORT_BIT) {
1307*61046927SAndroid Build Coastguard Worker       unsigned i;
1308*61046927SAndroid Build Coastguard Worker       for (i = 0; i < src->Const.MaxViewports; i++) {
1309*61046927SAndroid Build Coastguard Worker          /* OK to memcpy */
1310*61046927SAndroid Build Coastguard Worker          dst->ViewportArray[i] = src->ViewportArray[i];
1311*61046927SAndroid Build Coastguard Worker       }
1312*61046927SAndroid Build Coastguard Worker    }
1313*61046927SAndroid Build Coastguard Worker 
1314*61046927SAndroid Build Coastguard Worker    /* XXX FIXME:  Call callbacks?
1315*61046927SAndroid Build Coastguard Worker     */
1316*61046927SAndroid Build Coastguard Worker    dst->NewState = _NEW_ALL;
1317*61046927SAndroid Build Coastguard Worker    dst->NewDriverState = ST_ALL_STATES_MASK;
1318*61046927SAndroid Build Coastguard Worker }
1319*61046927SAndroid Build Coastguard Worker 
1320*61046927SAndroid Build Coastguard Worker 
1321*61046927SAndroid Build Coastguard Worker /**
1322*61046927SAndroid Build Coastguard Worker  * Check if the given context can render into the given framebuffer
1323*61046927SAndroid Build Coastguard Worker  * by checking visual attributes.
1324*61046927SAndroid Build Coastguard Worker  *
1325*61046927SAndroid Build Coastguard Worker  * \return GL_TRUE if compatible, GL_FALSE otherwise.
1326*61046927SAndroid Build Coastguard Worker  */
1327*61046927SAndroid Build Coastguard Worker static GLboolean
check_compatible(const struct gl_context * ctx,const struct gl_framebuffer * buffer)1328*61046927SAndroid Build Coastguard Worker check_compatible(const struct gl_context *ctx,
1329*61046927SAndroid Build Coastguard Worker                  const struct gl_framebuffer *buffer)
1330*61046927SAndroid Build Coastguard Worker {
1331*61046927SAndroid Build Coastguard Worker    const struct gl_config *ctxvis = &ctx->Visual;
1332*61046927SAndroid Build Coastguard Worker    const struct gl_config *bufvis = &buffer->Visual;
1333*61046927SAndroid Build Coastguard Worker 
1334*61046927SAndroid Build Coastguard Worker    if (buffer == _mesa_get_incomplete_framebuffer())
1335*61046927SAndroid Build Coastguard Worker       return GL_TRUE;
1336*61046927SAndroid Build Coastguard Worker 
1337*61046927SAndroid Build Coastguard Worker #define check_component(foo)           \
1338*61046927SAndroid Build Coastguard Worker    if (ctxvis->foo && bufvis->foo &&   \
1339*61046927SAndroid Build Coastguard Worker        ctxvis->foo != bufvis->foo)     \
1340*61046927SAndroid Build Coastguard Worker       return GL_FALSE
1341*61046927SAndroid Build Coastguard Worker 
1342*61046927SAndroid Build Coastguard Worker    check_component(redShift);
1343*61046927SAndroid Build Coastguard Worker    check_component(greenShift);
1344*61046927SAndroid Build Coastguard Worker    check_component(blueShift);
1345*61046927SAndroid Build Coastguard Worker    check_component(redBits);
1346*61046927SAndroid Build Coastguard Worker    check_component(greenBits);
1347*61046927SAndroid Build Coastguard Worker    check_component(blueBits);
1348*61046927SAndroid Build Coastguard Worker    check_component(depthBits);
1349*61046927SAndroid Build Coastguard Worker    check_component(stencilBits);
1350*61046927SAndroid Build Coastguard Worker 
1351*61046927SAndroid Build Coastguard Worker #undef check_component
1352*61046927SAndroid Build Coastguard Worker 
1353*61046927SAndroid Build Coastguard Worker    return GL_TRUE;
1354*61046927SAndroid Build Coastguard Worker }
1355*61046927SAndroid Build Coastguard Worker 
1356*61046927SAndroid Build Coastguard Worker 
1357*61046927SAndroid Build Coastguard Worker /**
1358*61046927SAndroid Build Coastguard Worker  * Check if the viewport/scissor size has not yet been initialized.
1359*61046927SAndroid Build Coastguard Worker  * Initialize the size if the given width and height are non-zero.
1360*61046927SAndroid Build Coastguard Worker  */
1361*61046927SAndroid Build Coastguard Worker static void
check_init_viewport(struct gl_context * ctx,GLuint width,GLuint height)1362*61046927SAndroid Build Coastguard Worker check_init_viewport(struct gl_context *ctx, GLuint width, GLuint height)
1363*61046927SAndroid Build Coastguard Worker {
1364*61046927SAndroid Build Coastguard Worker    if (!ctx->ViewportInitialized && width > 0 && height > 0) {
1365*61046927SAndroid Build Coastguard Worker       unsigned i;
1366*61046927SAndroid Build Coastguard Worker 
1367*61046927SAndroid Build Coastguard Worker       /* Note: set flag here, before calling _mesa_set_viewport(), to prevent
1368*61046927SAndroid Build Coastguard Worker        * potential infinite recursion.
1369*61046927SAndroid Build Coastguard Worker        */
1370*61046927SAndroid Build Coastguard Worker       ctx->ViewportInitialized = GL_TRUE;
1371*61046927SAndroid Build Coastguard Worker 
1372*61046927SAndroid Build Coastguard Worker       /* Note: ctx->Const.MaxViewports may not have been set by the driver
1373*61046927SAndroid Build Coastguard Worker        * yet, so just initialize all of them.
1374*61046927SAndroid Build Coastguard Worker        */
1375*61046927SAndroid Build Coastguard Worker       for (i = 0; i < MAX_VIEWPORTS; i++) {
1376*61046927SAndroid Build Coastguard Worker          _mesa_set_viewport(ctx, i, 0, 0, width, height);
1377*61046927SAndroid Build Coastguard Worker          _mesa_set_scissor(ctx, i, 0, 0, width, height);
1378*61046927SAndroid Build Coastguard Worker       }
1379*61046927SAndroid Build Coastguard Worker    }
1380*61046927SAndroid Build Coastguard Worker }
1381*61046927SAndroid Build Coastguard Worker 
1382*61046927SAndroid Build Coastguard Worker 
1383*61046927SAndroid Build Coastguard Worker static void
handle_first_current(struct gl_context * ctx)1384*61046927SAndroid Build Coastguard Worker handle_first_current(struct gl_context *ctx)
1385*61046927SAndroid Build Coastguard Worker {
1386*61046927SAndroid Build Coastguard Worker    if (ctx->Version == 0 || !ctx->DrawBuffer) {
1387*61046927SAndroid Build Coastguard Worker       /* probably in the process of tearing down the context */
1388*61046927SAndroid Build Coastguard Worker       return;
1389*61046927SAndroid Build Coastguard Worker    }
1390*61046927SAndroid Build Coastguard Worker 
1391*61046927SAndroid Build Coastguard Worker    check_context_limits(ctx);
1392*61046927SAndroid Build Coastguard Worker 
1393*61046927SAndroid Build Coastguard Worker    _mesa_update_vertex_processing_mode(ctx);
1394*61046927SAndroid Build Coastguard Worker 
1395*61046927SAndroid Build Coastguard Worker    /* According to GL_MESA_configless_context the default value of
1396*61046927SAndroid Build Coastguard Worker     * glDrawBuffers depends on the config of the first surface it is bound to.
1397*61046927SAndroid Build Coastguard Worker     * For GLES it is always GL_BACK which has a magic interpretation.
1398*61046927SAndroid Build Coastguard Worker     */
1399*61046927SAndroid Build Coastguard Worker    if (!ctx->HasConfig && _mesa_is_desktop_gl(ctx)) {
1400*61046927SAndroid Build Coastguard Worker       if (ctx->DrawBuffer != _mesa_get_incomplete_framebuffer()) {
1401*61046927SAndroid Build Coastguard Worker          GLenum16 buffer;
1402*61046927SAndroid Build Coastguard Worker 
1403*61046927SAndroid Build Coastguard Worker          if (ctx->DrawBuffer->Visual.doubleBufferMode)
1404*61046927SAndroid Build Coastguard Worker             buffer = GL_BACK;
1405*61046927SAndroid Build Coastguard Worker          else
1406*61046927SAndroid Build Coastguard Worker             buffer = GL_FRONT;
1407*61046927SAndroid Build Coastguard Worker 
1408*61046927SAndroid Build Coastguard Worker          _mesa_drawbuffers(ctx, ctx->DrawBuffer, 1, &buffer,
1409*61046927SAndroid Build Coastguard Worker                            NULL /* destMask */);
1410*61046927SAndroid Build Coastguard Worker       }
1411*61046927SAndroid Build Coastguard Worker 
1412*61046927SAndroid Build Coastguard Worker       if (ctx->ReadBuffer != _mesa_get_incomplete_framebuffer()) {
1413*61046927SAndroid Build Coastguard Worker          gl_buffer_index bufferIndex;
1414*61046927SAndroid Build Coastguard Worker          GLenum buffer;
1415*61046927SAndroid Build Coastguard Worker 
1416*61046927SAndroid Build Coastguard Worker          if (ctx->ReadBuffer->Visual.doubleBufferMode) {
1417*61046927SAndroid Build Coastguard Worker             buffer = GL_BACK;
1418*61046927SAndroid Build Coastguard Worker             bufferIndex = BUFFER_BACK_LEFT;
1419*61046927SAndroid Build Coastguard Worker          }
1420*61046927SAndroid Build Coastguard Worker          else {
1421*61046927SAndroid Build Coastguard Worker             buffer = GL_FRONT;
1422*61046927SAndroid Build Coastguard Worker             bufferIndex = BUFFER_FRONT_LEFT;
1423*61046927SAndroid Build Coastguard Worker          }
1424*61046927SAndroid Build Coastguard Worker 
1425*61046927SAndroid Build Coastguard Worker          _mesa_readbuffer(ctx, ctx->ReadBuffer, buffer, bufferIndex);
1426*61046927SAndroid Build Coastguard Worker       }
1427*61046927SAndroid Build Coastguard Worker    }
1428*61046927SAndroid Build Coastguard Worker 
1429*61046927SAndroid Build Coastguard Worker    /* Determine if generic vertex attribute 0 aliases the conventional
1430*61046927SAndroid Build Coastguard Worker     * glVertex position.
1431*61046927SAndroid Build Coastguard Worker     */
1432*61046927SAndroid Build Coastguard Worker    {
1433*61046927SAndroid Build Coastguard Worker       const bool is_forward_compatible_context =
1434*61046927SAndroid Build Coastguard Worker          ctx->Const.ContextFlags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT;
1435*61046927SAndroid Build Coastguard Worker 
1436*61046927SAndroid Build Coastguard Worker       /* In OpenGL 3.1 attribute 0 becomes non-magic, just like in OpenGL ES
1437*61046927SAndroid Build Coastguard Worker        * 2.0.  Note that we cannot just check for API_OPENGL_COMPAT here because
1438*61046927SAndroid Build Coastguard Worker        * that will erroneously allow this usage in a 3.0 forward-compatible
1439*61046927SAndroid Build Coastguard Worker        * context too.
1440*61046927SAndroid Build Coastguard Worker        */
1441*61046927SAndroid Build Coastguard Worker       ctx->_AttribZeroAliasesVertex = (_mesa_is_gles1(ctx)
1442*61046927SAndroid Build Coastguard Worker                                        || (_mesa_is_desktop_gl_compat(ctx)
1443*61046927SAndroid Build Coastguard Worker                                            && !is_forward_compatible_context));
1444*61046927SAndroid Build Coastguard Worker    }
1445*61046927SAndroid Build Coastguard Worker 
1446*61046927SAndroid Build Coastguard Worker    /* We can use this to help debug user's problems.  Tell them to set
1447*61046927SAndroid Build Coastguard Worker     * the MESA_INFO env variable before running their app.  Then the
1448*61046927SAndroid Build Coastguard Worker     * first time each context is made current we'll print some useful
1449*61046927SAndroid Build Coastguard Worker     * information.
1450*61046927SAndroid Build Coastguard Worker     */
1451*61046927SAndroid Build Coastguard Worker    if (getenv("MESA_INFO")) {
1452*61046927SAndroid Build Coastguard Worker       _mesa_print_info(ctx);
1453*61046927SAndroid Build Coastguard Worker    }
1454*61046927SAndroid Build Coastguard Worker }
1455*61046927SAndroid Build Coastguard Worker 
1456*61046927SAndroid Build Coastguard Worker /**
1457*61046927SAndroid Build Coastguard Worker  * Bind the given context to the given drawBuffer and readBuffer and
1458*61046927SAndroid Build Coastguard Worker  * make it the current context for the calling thread.
1459*61046927SAndroid Build Coastguard Worker  * We'll render into the drawBuffer and read pixels from the
1460*61046927SAndroid Build Coastguard Worker  * readBuffer (i.e. glRead/CopyPixels, glCopyTexImage, etc).
1461*61046927SAndroid Build Coastguard Worker  *
1462*61046927SAndroid Build Coastguard Worker  * We check that the context's and framebuffer's visuals are compatible
1463*61046927SAndroid Build Coastguard Worker  * and return immediately if they're not.
1464*61046927SAndroid Build Coastguard Worker  *
1465*61046927SAndroid Build Coastguard Worker  * \param newCtx  the new GL context. If NULL then there will be no current GL
1466*61046927SAndroid Build Coastguard Worker  *                context.
1467*61046927SAndroid Build Coastguard Worker  * \param drawBuffer  the drawing framebuffer
1468*61046927SAndroid Build Coastguard Worker  * \param readBuffer  the reading framebuffer
1469*61046927SAndroid Build Coastguard Worker  */
1470*61046927SAndroid Build Coastguard Worker GLboolean
_mesa_make_current(struct gl_context * newCtx,struct gl_framebuffer * drawBuffer,struct gl_framebuffer * readBuffer)1471*61046927SAndroid Build Coastguard Worker _mesa_make_current( struct gl_context *newCtx,
1472*61046927SAndroid Build Coastguard Worker                     struct gl_framebuffer *drawBuffer,
1473*61046927SAndroid Build Coastguard Worker                     struct gl_framebuffer *readBuffer )
1474*61046927SAndroid Build Coastguard Worker {
1475*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(curCtx);
1476*61046927SAndroid Build Coastguard Worker 
1477*61046927SAndroid Build Coastguard Worker    if (MESA_VERBOSE & VERBOSE_API)
1478*61046927SAndroid Build Coastguard Worker       _mesa_debug(newCtx, "_mesa_make_current()\n");
1479*61046927SAndroid Build Coastguard Worker 
1480*61046927SAndroid Build Coastguard Worker    /* Check that the context's and framebuffer's visuals are compatible.
1481*61046927SAndroid Build Coastguard Worker     */
1482*61046927SAndroid Build Coastguard Worker    if (newCtx && drawBuffer && newCtx->WinSysDrawBuffer != drawBuffer) {
1483*61046927SAndroid Build Coastguard Worker       if (!check_compatible(newCtx, drawBuffer)) {
1484*61046927SAndroid Build Coastguard Worker          _mesa_warning(newCtx,
1485*61046927SAndroid Build Coastguard Worker               "MakeCurrent: incompatible visuals for context and drawbuffer");
1486*61046927SAndroid Build Coastguard Worker          return GL_FALSE;
1487*61046927SAndroid Build Coastguard Worker       }
1488*61046927SAndroid Build Coastguard Worker    }
1489*61046927SAndroid Build Coastguard Worker    if (newCtx && readBuffer && newCtx->WinSysReadBuffer != readBuffer) {
1490*61046927SAndroid Build Coastguard Worker       if (!check_compatible(newCtx, readBuffer)) {
1491*61046927SAndroid Build Coastguard Worker          _mesa_warning(newCtx,
1492*61046927SAndroid Build Coastguard Worker               "MakeCurrent: incompatible visuals for context and readbuffer");
1493*61046927SAndroid Build Coastguard Worker          return GL_FALSE;
1494*61046927SAndroid Build Coastguard Worker       }
1495*61046927SAndroid Build Coastguard Worker    }
1496*61046927SAndroid Build Coastguard Worker 
1497*61046927SAndroid Build Coastguard Worker    if (curCtx &&
1498*61046927SAndroid Build Coastguard Worker        /* make sure this context is valid for flushing */
1499*61046927SAndroid Build Coastguard Worker        curCtx != newCtx &&
1500*61046927SAndroid Build Coastguard Worker        curCtx->Const.ContextReleaseBehavior ==
1501*61046927SAndroid Build Coastguard Worker        GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH) {
1502*61046927SAndroid Build Coastguard Worker       FLUSH_VERTICES(curCtx, 0, 0);
1503*61046927SAndroid Build Coastguard Worker       if (curCtx->st){
1504*61046927SAndroid Build Coastguard Worker          st_glFlush(curCtx, 0);
1505*61046927SAndroid Build Coastguard Worker       }
1506*61046927SAndroid Build Coastguard Worker    }
1507*61046927SAndroid Build Coastguard Worker 
1508*61046927SAndroid Build Coastguard Worker    if (!newCtx) {
1509*61046927SAndroid Build Coastguard Worker       _glapi_set_dispatch(NULL);  /* none current */
1510*61046927SAndroid Build Coastguard Worker       /* We need old ctx to correctly release Draw/ReadBuffer
1511*61046927SAndroid Build Coastguard Worker        * and avoid a surface leak in st_renderbuffer_delete.
1512*61046927SAndroid Build Coastguard Worker        * Therefore, first drop buffers then set new ctx to NULL.
1513*61046927SAndroid Build Coastguard Worker        */
1514*61046927SAndroid Build Coastguard Worker       if (curCtx) {
1515*61046927SAndroid Build Coastguard Worker          _mesa_reference_framebuffer(&curCtx->WinSysDrawBuffer, NULL);
1516*61046927SAndroid Build Coastguard Worker          _mesa_reference_framebuffer(&curCtx->WinSysReadBuffer, NULL);
1517*61046927SAndroid Build Coastguard Worker       }
1518*61046927SAndroid Build Coastguard Worker       _glapi_set_context(NULL);
1519*61046927SAndroid Build Coastguard Worker       assert(_mesa_get_current_context() == NULL);
1520*61046927SAndroid Build Coastguard Worker    }
1521*61046927SAndroid Build Coastguard Worker    else {
1522*61046927SAndroid Build Coastguard Worker       _glapi_set_context((void *) newCtx);
1523*61046927SAndroid Build Coastguard Worker       assert(_mesa_get_current_context() == newCtx);
1524*61046927SAndroid Build Coastguard Worker       _glapi_set_dispatch(newCtx->GLApi);
1525*61046927SAndroid Build Coastguard Worker 
1526*61046927SAndroid Build Coastguard Worker       if (drawBuffer && readBuffer) {
1527*61046927SAndroid Build Coastguard Worker          assert(_mesa_is_winsys_fbo(drawBuffer));
1528*61046927SAndroid Build Coastguard Worker          assert(_mesa_is_winsys_fbo(readBuffer));
1529*61046927SAndroid Build Coastguard Worker          _mesa_reference_framebuffer(&newCtx->WinSysDrawBuffer, drawBuffer);
1530*61046927SAndroid Build Coastguard Worker          _mesa_reference_framebuffer(&newCtx->WinSysReadBuffer, readBuffer);
1531*61046927SAndroid Build Coastguard Worker 
1532*61046927SAndroid Build Coastguard Worker          /*
1533*61046927SAndroid Build Coastguard Worker           * Only set the context's Draw/ReadBuffer fields if they're NULL
1534*61046927SAndroid Build Coastguard Worker           * or not bound to a user-created FBO.
1535*61046927SAndroid Build Coastguard Worker           */
1536*61046927SAndroid Build Coastguard Worker          if (!newCtx->DrawBuffer || _mesa_is_winsys_fbo(newCtx->DrawBuffer)) {
1537*61046927SAndroid Build Coastguard Worker             _mesa_reference_framebuffer(&newCtx->DrawBuffer, drawBuffer);
1538*61046927SAndroid Build Coastguard Worker             /* Update the FBO's list of drawbuffers/renderbuffers.
1539*61046927SAndroid Build Coastguard Worker              * For winsys FBOs this comes from the GL state (which may have
1540*61046927SAndroid Build Coastguard Worker              * changed since the last time this FBO was bound).
1541*61046927SAndroid Build Coastguard Worker              */
1542*61046927SAndroid Build Coastguard Worker             _mesa_update_draw_buffers(newCtx);
1543*61046927SAndroid Build Coastguard Worker             _mesa_update_allow_draw_out_of_order(newCtx);
1544*61046927SAndroid Build Coastguard Worker             _mesa_update_valid_to_render_state(newCtx);
1545*61046927SAndroid Build Coastguard Worker          }
1546*61046927SAndroid Build Coastguard Worker          if (!newCtx->ReadBuffer || _mesa_is_winsys_fbo(newCtx->ReadBuffer)) {
1547*61046927SAndroid Build Coastguard Worker             _mesa_reference_framebuffer(&newCtx->ReadBuffer, readBuffer);
1548*61046927SAndroid Build Coastguard Worker             /* In _mesa_initialize_window_framebuffer, for single-buffered
1549*61046927SAndroid Build Coastguard Worker              * visuals, the ColorReadBuffer is set to be GL_FRONT, even with
1550*61046927SAndroid Build Coastguard Worker              * GLES contexts. When calling read_buffer, we verify we are reading
1551*61046927SAndroid Build Coastguard Worker              * from GL_BACK in is_legal_es3_readbuffer_enum.  But the default is
1552*61046927SAndroid Build Coastguard Worker              * incorrect, and certain dEQP tests check this.  So fix it here.
1553*61046927SAndroid Build Coastguard Worker              */
1554*61046927SAndroid Build Coastguard Worker             if (_mesa_is_gles(newCtx) &&
1555*61046927SAndroid Build Coastguard Worker                !newCtx->ReadBuffer->Visual.doubleBufferMode)
1556*61046927SAndroid Build Coastguard Worker                if (newCtx->ReadBuffer->ColorReadBuffer == GL_FRONT)
1557*61046927SAndroid Build Coastguard Worker                   newCtx->ReadBuffer->ColorReadBuffer = GL_BACK;
1558*61046927SAndroid Build Coastguard Worker          }
1559*61046927SAndroid Build Coastguard Worker 
1560*61046927SAndroid Build Coastguard Worker          /* XXX only set this flag if we're really changing the draw/read
1561*61046927SAndroid Build Coastguard Worker           * framebuffer bindings.
1562*61046927SAndroid Build Coastguard Worker           */
1563*61046927SAndroid Build Coastguard Worker          newCtx->NewState |= _NEW_BUFFERS;
1564*61046927SAndroid Build Coastguard Worker 
1565*61046927SAndroid Build Coastguard Worker          check_init_viewport(newCtx, drawBuffer->Width, drawBuffer->Height);
1566*61046927SAndroid Build Coastguard Worker       }
1567*61046927SAndroid Build Coastguard Worker 
1568*61046927SAndroid Build Coastguard Worker       if (newCtx->FirstTimeCurrent) {
1569*61046927SAndroid Build Coastguard Worker          handle_first_current(newCtx);
1570*61046927SAndroid Build Coastguard Worker          newCtx->FirstTimeCurrent = GL_FALSE;
1571*61046927SAndroid Build Coastguard Worker       }
1572*61046927SAndroid Build Coastguard Worker    }
1573*61046927SAndroid Build Coastguard Worker 
1574*61046927SAndroid Build Coastguard Worker    return GL_TRUE;
1575*61046927SAndroid Build Coastguard Worker }
1576*61046927SAndroid Build Coastguard Worker 
1577*61046927SAndroid Build Coastguard Worker 
1578*61046927SAndroid Build Coastguard Worker /**
1579*61046927SAndroid Build Coastguard Worker  * Make context 'ctx' share the display lists, textures and programs
1580*61046927SAndroid Build Coastguard Worker  * that are associated with 'ctxToShare'.
1581*61046927SAndroid Build Coastguard Worker  * Any display lists, textures or programs associated with 'ctx' will
1582*61046927SAndroid Build Coastguard Worker  * be deleted if nobody else is sharing them.
1583*61046927SAndroid Build Coastguard Worker  */
1584*61046927SAndroid Build Coastguard Worker GLboolean
_mesa_share_state(struct gl_context * ctx,struct gl_context * ctxToShare)1585*61046927SAndroid Build Coastguard Worker _mesa_share_state(struct gl_context *ctx, struct gl_context *ctxToShare)
1586*61046927SAndroid Build Coastguard Worker {
1587*61046927SAndroid Build Coastguard Worker    if (ctx && ctxToShare && ctx->Shared && ctxToShare->Shared) {
1588*61046927SAndroid Build Coastguard Worker       struct gl_shared_state *oldShared = NULL;
1589*61046927SAndroid Build Coastguard Worker 
1590*61046927SAndroid Build Coastguard Worker       /* save ref to old state to prevent it from being deleted immediately */
1591*61046927SAndroid Build Coastguard Worker       _mesa_reference_shared_state(ctx, &oldShared, ctx->Shared);
1592*61046927SAndroid Build Coastguard Worker 
1593*61046927SAndroid Build Coastguard Worker       /* update ctx's Shared pointer */
1594*61046927SAndroid Build Coastguard Worker       _mesa_reference_shared_state(ctx, &ctx->Shared, ctxToShare->Shared);
1595*61046927SAndroid Build Coastguard Worker 
1596*61046927SAndroid Build Coastguard Worker       update_default_objects(ctx);
1597*61046927SAndroid Build Coastguard Worker 
1598*61046927SAndroid Build Coastguard Worker       /* release the old shared state */
1599*61046927SAndroid Build Coastguard Worker       _mesa_reference_shared_state(ctx, &oldShared, NULL);
1600*61046927SAndroid Build Coastguard Worker 
1601*61046927SAndroid Build Coastguard Worker       return GL_TRUE;
1602*61046927SAndroid Build Coastguard Worker    }
1603*61046927SAndroid Build Coastguard Worker    else {
1604*61046927SAndroid Build Coastguard Worker       return GL_FALSE;
1605*61046927SAndroid Build Coastguard Worker    }
1606*61046927SAndroid Build Coastguard Worker }
1607*61046927SAndroid Build Coastguard Worker 
1608*61046927SAndroid Build Coastguard Worker 
1609*61046927SAndroid Build Coastguard Worker 
1610*61046927SAndroid Build Coastguard Worker /**
1611*61046927SAndroid Build Coastguard Worker  * \return pointer to the current GL context for this thread.
1612*61046927SAndroid Build Coastguard Worker  *
1613*61046927SAndroid Build Coastguard Worker  * Calls _glapi_get_context(). This isn't the fastest way to get the current
1614*61046927SAndroid Build Coastguard Worker  * context.  If you need speed, see the #GET_CURRENT_CONTEXT macro in
1615*61046927SAndroid Build Coastguard Worker  * context.h.
1616*61046927SAndroid Build Coastguard Worker  */
1617*61046927SAndroid Build Coastguard Worker struct gl_context *
_mesa_get_current_context(void)1618*61046927SAndroid Build Coastguard Worker _mesa_get_current_context( void )
1619*61046927SAndroid Build Coastguard Worker {
1620*61046927SAndroid Build Coastguard Worker    return (struct gl_context *) _glapi_get_context();
1621*61046927SAndroid Build Coastguard Worker }
1622*61046927SAndroid Build Coastguard Worker 
1623*61046927SAndroid Build Coastguard Worker /*@}*/
1624*61046927SAndroid Build Coastguard Worker 
1625*61046927SAndroid Build Coastguard Worker 
1626*61046927SAndroid Build Coastguard Worker /**********************************************************************/
1627*61046927SAndroid Build Coastguard Worker /** \name Miscellaneous functions                                     */
1628*61046927SAndroid Build Coastguard Worker /**********************************************************************/
1629*61046927SAndroid Build Coastguard Worker /*@{*/
1630*61046927SAndroid Build Coastguard Worker /**
1631*61046927SAndroid Build Coastguard Worker  * Flush commands.
1632*61046927SAndroid Build Coastguard Worker  */
1633*61046927SAndroid Build Coastguard Worker void
_mesa_flush(struct gl_context * ctx)1634*61046927SAndroid Build Coastguard Worker _mesa_flush(struct gl_context *ctx)
1635*61046927SAndroid Build Coastguard Worker {
1636*61046927SAndroid Build Coastguard Worker    bool async = !ctx->Shared->HasExternallySharedImages;
1637*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, 0, 0);
1638*61046927SAndroid Build Coastguard Worker 
1639*61046927SAndroid Build Coastguard Worker    st_glFlush(ctx, async ? PIPE_FLUSH_ASYNC : 0);
1640*61046927SAndroid Build Coastguard Worker }
1641*61046927SAndroid Build Coastguard Worker 
1642*61046927SAndroid Build Coastguard Worker 
1643*61046927SAndroid Build Coastguard Worker 
1644*61046927SAndroid Build Coastguard Worker /**
1645*61046927SAndroid Build Coastguard Worker  * Flush commands and wait for completion.
1646*61046927SAndroid Build Coastguard Worker  *
1647*61046927SAndroid Build Coastguard Worker  * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1648*61046927SAndroid Build Coastguard Worker  * dd_function_table::Finish driver callback, if not NULL.
1649*61046927SAndroid Build Coastguard Worker  */
1650*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_Finish(void)1651*61046927SAndroid Build Coastguard Worker _mesa_Finish(void)
1652*61046927SAndroid Build Coastguard Worker {
1653*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1654*61046927SAndroid Build Coastguard Worker    ASSERT_OUTSIDE_BEGIN_END(ctx);
1655*61046927SAndroid Build Coastguard Worker 
1656*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, 0, 0);
1657*61046927SAndroid Build Coastguard Worker 
1658*61046927SAndroid Build Coastguard Worker    st_glFinish(ctx);
1659*61046927SAndroid Build Coastguard Worker }
1660*61046927SAndroid Build Coastguard Worker 
1661*61046927SAndroid Build Coastguard Worker 
1662*61046927SAndroid Build Coastguard Worker /**
1663*61046927SAndroid Build Coastguard Worker  * Execute glFlush().
1664*61046927SAndroid Build Coastguard Worker  *
1665*61046927SAndroid Build Coastguard Worker  * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1666*61046927SAndroid Build Coastguard Worker  * dd_function_table::Flush driver callback, if not NULL.
1667*61046927SAndroid Build Coastguard Worker  */
1668*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_Flush(void)1669*61046927SAndroid Build Coastguard Worker _mesa_Flush(void)
1670*61046927SAndroid Build Coastguard Worker {
1671*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1672*61046927SAndroid Build Coastguard Worker    ASSERT_OUTSIDE_BEGIN_END(ctx);
1673*61046927SAndroid Build Coastguard Worker    _mesa_flush(ctx);
1674*61046927SAndroid Build Coastguard Worker }
1675*61046927SAndroid Build Coastguard Worker 
1676*61046927SAndroid Build Coastguard Worker 
1677*61046927SAndroid Build Coastguard Worker /*@}*/
1678