blob: a27aaf021cd893a97866fa214666aca2ebe4377e [file] [log] [blame]
jtgafb833d1999-08-19 00:55:39 +00001/*
2 * Mesa 3-D graphics library
Brian Paule9b34882008-12-31 11:54:02 -07003 * Version: 7.3
jtgafb833d1999-08-19 00:55:39 +00004 *
Brian145d7622007-08-16 10:05:00 +01005 * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
Brian Paule9b34882008-12-31 11:54:02 -07006 * Copyright (C) 2008 VMware, Inc. All Rights Reserved.
jtgafb833d1999-08-19 00:55:39 +00007 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 */
25
Brian Paule9b34882008-12-31 11:54:02 -070026/**
27 * \file context.c
28 * Mesa context/visual/framebuffer management functions.
29 * \author Brian Paul
30 */
jtgafb833d1999-08-19 00:55:39 +000031
Keith Whitwell6dc85572003-07-17 13:43:59 +000032/**
Brian Paul253204f2004-09-10 00:45:12 +000033 * \mainpage Mesa Main Module
Keith Whitwell6dc85572003-07-17 13:43:59 +000034 *
Brian Paul253204f2004-09-10 00:45:12 +000035 * \section MainIntroduction Introduction
Keith Whitwell6dc85572003-07-17 13:43:59 +000036 *
Brian Paul253204f2004-09-10 00:45:12 +000037 * The Mesa Main module consists of all the files in the main/ directory.
38 * Among the features of this module are:
39 * <UL>
40 * <LI> Structures to represent most GL state </LI>
41 * <LI> State set/get functions </LI>
42 * <LI> Display lists </LI>
43 * <LI> Texture unit, object and image handling </LI>
44 * <LI> Matrix and attribute stacks </LI>
45 * </UL>
Keith Whitwell6dc85572003-07-17 13:43:59 +000046 *
Brian Paul253204f2004-09-10 00:45:12 +000047 * Other modules are responsible for API dispatch, vertex transformation,
48 * point/line/triangle setup, rasterization, vertex array caching,
49 * vertex/fragment programs/shaders, etc.
Keith Whitwell6dc85572003-07-17 13:43:59 +000050 *
51 *
52 * \section AboutDoxygen About Doxygen
53 *
54 * If you're viewing this information as Doxygen-generated HTML you'll
55 * see the documentation index at the top of this page.
56 *
57 * The first line lists the Mesa source code modules.
58 * The second line lists the indexes available for viewing the documentation
59 * for each module.
60 *
61 * Selecting the <b>Main page</b> link will display a summary of the module
62 * (this page).
63 *
Jose Fonseca1a5709d2003-09-17 17:14:11 +000064 * Selecting <b>Data Structures</b> will list all C structures.
Keith Whitwell6dc85572003-07-17 13:43:59 +000065 *
66 * Selecting the <b>File List</b> link will list all the source files in
67 * the module.
68 * Selecting a filename will show a list of all functions defined in that file.
69 *
Jose Fonseca1a5709d2003-09-17 17:14:11 +000070 * Selecting the <b>Data Fields</b> link will display a list of all
Keith Whitwell6dc85572003-07-17 13:43:59 +000071 * documented structure members.
72 *
Jose Fonseca1a5709d2003-09-17 17:14:11 +000073 * Selecting the <b>Globals</b> link will display a list
Keith Whitwell6dc85572003-07-17 13:43:59 +000074 * of all functions, structures, global variables and macros in the module.
75 *
76 */
77
78
Brian Paulfbd8f211999-11-11 01:22:25 +000079#include "glheader.h"
Brian Paulf2c02322009-02-22 15:43:29 -070080#include "mfeatures.h"
Brian Paul3c634522002-10-24 23:57:19 +000081#include "imports.h"
Keith Whitwell34a61c62008-09-21 19:29:15 -070082#if FEATURE_accum
Keith Whitwell6dc85572003-07-17 13:43:59 +000083#include "accum.h"
Keith Whitwell34a61c62008-09-21 19:29:15 -070084#endif
Brian Paulc9e56712008-06-09 14:49:04 -060085#include "api_exec.h"
Brian Paulc04bb512006-07-11 21:56:43 +000086#include "arrayobj.h"
Keith Whitwell34a61c62008-09-21 19:29:15 -070087#if FEATURE_attrib_stack
Keith Whitwell6dc85572003-07-17 13:43:59 +000088#include "attrib.h"
Keith Whitwell34a61c62008-09-21 19:29:15 -070089#endif
Keith Whitwell6dc85572003-07-17 13:43:59 +000090#include "blend.h"
Brian Paulb1394fa2000-09-26 20:53:53 +000091#include "buffers.h"
Brian Paul148a2842003-09-17 03:40:11 +000092#include "bufferobj.h"
Keith Whitwell34a61c62008-09-21 19:29:15 -070093#if FEATURE_colortable
Brian Paul4bdcfe52000-04-17 17:57:04 +000094#include "colortab.h"
Keith Whitwell34a61c62008-09-21 19:29:15 -070095#endif
jtgafb833d1999-08-19 00:55:39 +000096#include "context.h"
Brian Paul7979c602009-03-04 16:43:07 -070097#include "cpuinfo.h"
Keith Whitwell6dc85572003-07-17 13:43:59 +000098#include "debug.h"
99#include "depth.h"
Keith Whitwell34a61c62008-09-21 19:29:15 -0700100#if FEATURE_dlist
jtgafb833d1999-08-19 00:55:39 +0000101#include "dlist.h"
Keith Whitwell34a61c62008-09-21 19:29:15 -0700102#endif
103#if FEATURE_evaluators
jtgafb833d1999-08-19 00:55:39 +0000104#include "eval.h"
Keith Whitwell34a61c62008-09-21 19:29:15 -0700105#endif
jtgafb833d1999-08-19 00:55:39 +0000106#include "enums.h"
Brian Paul585a68c1999-09-11 11:31:34 +0000107#include "extensions.h"
Brian Paule4b23562005-05-04 20:11:35 +0000108#include "fbobject.h"
Keith Whitwell34a61c62008-09-21 19:29:15 -0700109#if FEATURE_feedback
Keith Whitwell6dc85572003-07-17 13:43:59 +0000110#include "feedback.h"
Keith Whitwell34a61c62008-09-21 19:29:15 -0700111#endif
jtgafb833d1999-08-19 00:55:39 +0000112#include "fog.h"
Briane6a93812007-02-26 11:37:37 -0700113#include "framebuffer.h"
Brian Paulb7a43041999-11-30 20:34:51 +0000114#include "get.h"
Keith Whitwell34a61c62008-09-21 19:29:15 -0700115#if FEATURE_histogram
Keith Whitwell6dc85572003-07-17 13:43:59 +0000116#include "histogram.h"
Keith Whitwell34a61c62008-09-21 19:29:15 -0700117#endif
Keith Whitwell6dc85572003-07-17 13:43:59 +0000118#include "hint.h"
jtgafb833d1999-08-19 00:55:39 +0000119#include "hash.h"
120#include "light.h"
Keith Whitwell6dc85572003-07-17 13:43:59 +0000121#include "lines.h"
jtgafb833d1999-08-19 00:55:39 +0000122#include "macros.h"
Keith Whitwell6dc85572003-07-17 13:43:59 +0000123#include "matrix.h"
Brian Paulc132e2b2008-06-09 15:09:21 -0600124#include "multisample.h"
Keith Whitwell6dc85572003-07-17 13:43:59 +0000125#include "pixel.h"
Brian Paul533c1db2008-06-09 14:25:23 -0600126#include "pixelstore.h"
Keith Whitwell6dc85572003-07-17 13:43:59 +0000127#include "points.h"
128#include "polygon.h"
Brian Paul4e3ae762008-06-13 13:56:53 -0600129#if FEATURE_ARB_occlusion_query
Brian74afcab2007-04-21 12:42:54 -0600130#include "queryobj.h"
Brian Paul4e3ae762008-06-13 13:56:53 -0600131#endif
Keith Whitwell34a61c62008-09-21 19:29:15 -0700132#if FEATURE_drawpix
Keith Whitwell6dc85572003-07-17 13:43:59 +0000133#include "rastpos.h"
Keith Whitwell34a61c62008-09-21 19:29:15 -0700134#endif
Brian Paul55e341c2008-06-09 14:55:24 -0600135#include "scissor.h"
jtgafb833d1999-08-19 00:55:39 +0000136#include "simple_list.h"
Brian Paulfa9df402000-02-02 19:16:46 +0000137#include "state.h"
Keith Whitwell6dc85572003-07-17 13:43:59 +0000138#include "stencil.h"
Brian Paul8f04c122004-04-27 13:39:20 +0000139#include "texcompress.h"
jtgafb833d1999-08-19 00:55:39 +0000140#include "teximage.h"
141#include "texobj.h"
Brian Paul85d81602002-06-17 23:36:31 +0000142#include "texstate.h"
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000143#include "mtypes.h"
jtgafb833d1999-08-19 00:55:39 +0000144#include "varray.h"
Brian Paul363344f2005-09-13 14:48:28 +0000145#include "version.h"
Brian Paul2c378512009-03-07 12:33:11 -0700146#include "viewport.h"
Gareth Hughesd4eb6652001-03-12 01:32:20 +0000147#include "vtxfmt.h"
Brianc223c6b2007-07-04 13:15:20 -0600148#include "glapi/glthread.h"
Brian Paul2dbc5152008-06-13 16:45:15 -0600149#include "glapi/glapioffsets.h"
150#include "glapi/glapitable.h"
Brianc223c6b2007-07-04 13:15:20 -0600151#include "shader/program.h"
Brianc223c6b2007-07-04 13:15:20 -0600152#include "shader/shader_api.h"
Brian Paulb51d73d2008-06-20 08:07:38 -0600153#if FEATURE_ATI_fragment_shader
Brianc223c6b2007-07-04 13:15:20 -0600154#include "shader/atifragshader.h"
Brian Paulb51d73d2008-06-20 08:07:38 -0600155#endif
Keith Whitwell6dc85572003-07-17 13:43:59 +0000156#if _HAVE_FULL_GL
Keith Whitwell23caf202000-11-16 21:05:34 +0000157#include "math/m_matrix.h"
Brian Paulddc82ee2005-02-05 19:56:45 +0000158#endif
jtgafb833d1999-08-19 00:55:39 +0000159
davem69775355a2001-06-05 23:54:00 +0000160#ifdef USE_SPARC_ASM
Ian Romanicke16f6e32004-06-26 00:02:51 +0000161#include "sparc/sparc.h"
davem69775355a2001-06-05 23:54:00 +0000162#endif
jtgafb833d1999-08-19 00:55:39 +0000163
Keith Whitwell23caf202000-11-16 21:05:34 +0000164#ifndef MESA_VERBOSE
Keith Whitwell306d3fc2002-04-09 16:56:50 +0000165int MESA_VERBOSE = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +0000166#endif
167
168#ifndef MESA_DEBUG_FLAGS
Keith Whitwell306d3fc2002-04-09 16:56:50 +0000169int MESA_DEBUG_FLAGS = 0;
Keith Whitwell23caf202000-11-16 21:05:34 +0000170#endif
Brian Paulb1394fa2000-09-26 20:53:53 +0000171
Brian Paul86b84272001-12-14 02:50:01 +0000172
Brian Paul27558a12003-03-01 01:50:20 +0000173/* ubyte -> float conversion */
174GLfloat _mesa_ubyte_to_float_color_tab[256];
175
Brian Paul9a33a112002-06-13 04:28:29 +0000176
Brian Paul86b84272001-12-14 02:50:01 +0000177
Keith Whitwell6dc85572003-07-17 13:43:59 +0000178/**
179 * Swap buffers notification callback.
180 *
181 * \param gc GL context.
182 *
183 * Called by window system just before swapping buffers.
Brian Paul9a33a112002-06-13 04:28:29 +0000184 * We have to finish any pending rendering.
185 */
186void
Brian96b06ac2007-10-19 10:12:00 -0600187_mesa_notifySwapBuffers(__GLcontext *ctx)
Brian Paul9a33a112002-06-13 04:28:29 +0000188{
Brian Paule8cd8be2009-02-12 08:58:12 -0700189 FLUSH_VERTICES( ctx, 0 );
Brian96b06ac2007-10-19 10:12:00 -0600190 if (ctx->Driver.Flush) {
191 ctx->Driver.Flush(ctx);
192 }
Brian Paul9a33a112002-06-13 04:28:29 +0000193}
194
Brian Paulb1394fa2000-09-26 20:53:53 +0000195
jtgafb833d1999-08-19 00:55:39 +0000196/**********************************************************************/
Keith Whitwell6dc85572003-07-17 13:43:59 +0000197/** \name GL Visual allocation/destruction */
Brian Paul4d053dd2000-01-14 04:45:47 +0000198/**********************************************************************/
Keith Whitwell6dc85572003-07-17 13:43:59 +0000199/*@{*/
Brian Paul4d053dd2000-01-14 04:45:47 +0000200
Keith Whitwell6dc85572003-07-17 13:43:59 +0000201/**
Brian Paul894844a2004-03-21 17:05:03 +0000202 * Allocates a GLvisual structure and initializes it via
203 * _mesa_initialize_visual().
Keith Whitwell6dc85572003-07-17 13:43:59 +0000204 *
205 * \param rgbFlag GL_TRUE for RGB(A) mode, GL_FALSE for Color Index mode.
206 * \param dbFlag double buffering
207 * \param stereoFlag stereo buffer
208 * \param depthBits requested bits per depth buffer value. Any value in [0, 32]
209 * is acceptable but the actual depth type will be GLushort or GLuint as
210 * needed.
211 * \param stencilBits requested minimum bits per stencil buffer value
212 * \param accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits number of bits per color component in accum buffer.
213 * \param indexBits number of bits per pixel if \p rgbFlag is GL_FALSE
214 * \param redBits number of bits per color component in frame buffer for RGB(A)
215 * mode. We always use 8 in core Mesa though.
216 * \param greenBits same as above.
217 * \param blueBits same as above.
218 * \param alphaBits same as above.
219 * \param numSamples not really used.
220 *
221 * \return pointer to new GLvisual or NULL if requested parameters can't be
222 * met.
223 *
Brian Paul894844a2004-03-21 17:05:03 +0000224 * \note Need to add params for level and numAuxBuffers (at least)
Brian Paul4d053dd2000-01-14 04:45:47 +0000225 */
Brian Paulb371e0d2000-03-31 01:05:51 +0000226GLvisual *
227_mesa_create_visual( GLboolean rgbFlag,
Brian Paulb371e0d2000-03-31 01:05:51 +0000228 GLboolean dbFlag,
229 GLboolean stereoFlag,
230 GLint redBits,
231 GLint greenBits,
232 GLint blueBits,
233 GLint alphaBits,
234 GLint indexBits,
235 GLint depthBits,
236 GLint stencilBits,
237 GLint accumRedBits,
238 GLint accumGreenBits,
239 GLint accumBlueBits,
240 GLint accumAlphaBits,
241 GLint numSamples )
Brian Paul4d053dd2000-01-14 04:45:47 +0000242{
Brian Paulc7e164f2006-06-30 15:44:30 +0000243 GLvisual *vis = (GLvisual *) _mesa_calloc(sizeof(GLvisual));
Brian Paul178a1c52000-04-22 01:05:00 +0000244 if (vis) {
Brian Paule70c6232000-05-04 13:53:55 +0000245 if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000246 redBits, greenBits, blueBits, alphaBits,
247 indexBits, depthBits, stencilBits,
248 accumRedBits, accumGreenBits,
249 accumBlueBits, accumAlphaBits,
Brian Paulb1394fa2000-09-26 20:53:53 +0000250 numSamples)) {
Brian Paulc7e164f2006-06-30 15:44:30 +0000251 _mesa_free(vis);
Brian Paul178a1c52000-04-22 01:05:00 +0000252 return NULL;
253 }
254 }
255 return vis;
256}
257
Keith Whitwell6dc85572003-07-17 13:43:59 +0000258/**
Brian Paul894844a2004-03-21 17:05:03 +0000259 * Makes some sanity checks and fills in the fields of the
Brian Paule4b23562005-05-04 20:11:35 +0000260 * GLvisual object with the given parameters. If the caller needs
261 * to set additional fields, he should just probably init the whole GLvisual
262 * object himself.
Keith Whitwell6dc85572003-07-17 13:43:59 +0000263 * \return GL_TRUE on success, or GL_FALSE on failure.
264 *
265 * \sa _mesa_create_visual() above for the parameter description.
Brian Paul178a1c52000-04-22 01:05:00 +0000266 */
267GLboolean
268_mesa_initialize_visual( GLvisual *vis,
269 GLboolean rgbFlag,
Brian Paul178a1c52000-04-22 01:05:00 +0000270 GLboolean dbFlag,
271 GLboolean stereoFlag,
272 GLint redBits,
273 GLint greenBits,
274 GLint blueBits,
275 GLint alphaBits,
276 GLint indexBits,
277 GLint depthBits,
278 GLint stencilBits,
279 GLint accumRedBits,
280 GLint accumGreenBits,
281 GLint accumBlueBits,
282 GLint accumAlphaBits,
283 GLint numSamples )
284{
285 assert(vis);
Brian Paul4d053dd2000-01-14 04:45:47 +0000286
Brian Pauled30dfa2000-03-03 17:47:39 +0000287 if (depthBits < 0 || depthBits > 32) {
Brian Paul178a1c52000-04-22 01:05:00 +0000288 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000289 }
Brian Paule4b23562005-05-04 20:11:35 +0000290 if (stencilBits < 0 || stencilBits > STENCIL_BITS) {
Brian Paul178a1c52000-04-22 01:05:00 +0000291 return GL_FALSE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000292 }
Brian Paul978ef2b2005-09-21 03:35:08 +0000293 assert(accumRedBits >= 0);
294 assert(accumGreenBits >= 0);
295 assert(accumBlueBits >= 0);
296 assert(accumAlphaBits >= 0);
Brian Paul4d053dd2000-01-14 04:45:47 +0000297
Brian Paulb6bcae52001-01-23 23:39:36 +0000298 vis->rgbMode = rgbFlag;
299 vis->doubleBufferMode = dbFlag;
300 vis->stereoMode = stereoFlag;
Brian Paul153f1542002-10-29 15:04:35 +0000301
Brian Paulb6bcae52001-01-23 23:39:36 +0000302 vis->redBits = redBits;
303 vis->greenBits = greenBits;
304 vis->blueBits = blueBits;
305 vis->alphaBits = alphaBits;
Brian Paule4b23562005-05-04 20:11:35 +0000306 vis->rgbBits = redBits + greenBits + blueBits;
Brian Paul4d053dd2000-01-14 04:45:47 +0000307
Brian Paulb6bcae52001-01-23 23:39:36 +0000308 vis->indexBits = indexBits;
309 vis->depthBits = depthBits;
Brian Paule4b23562005-05-04 20:11:35 +0000310 vis->stencilBits = stencilBits;
311
312 vis->accumRedBits = accumRedBits;
313 vis->accumGreenBits = accumGreenBits;
314 vis->accumBlueBits = accumBlueBits;
315 vis->accumAlphaBits = accumAlphaBits;
Brian Pauled30dfa2000-03-03 17:47:39 +0000316
Brian Paul153f1542002-10-29 15:04:35 +0000317 vis->haveAccumBuffer = accumRedBits > 0;
318 vis->haveDepthBuffer = depthBits > 0;
319 vis->haveStencilBuffer = stencilBits > 0;
320
321 vis->numAuxBuffers = 0;
322 vis->level = 0;
323 vis->pixmapMode = 0;
Brian Paule4b23562005-05-04 20:11:35 +0000324 vis->sampleBuffers = numSamples > 0 ? 1 : 0;
Brian Paul894844a2004-03-21 17:05:03 +0000325 vis->samples = numSamples;
Brian Paul153f1542002-10-29 15:04:35 +0000326
Brian Paul178a1c52000-04-22 01:05:00 +0000327 return GL_TRUE;
Brian Paul4d053dd2000-01-14 04:45:47 +0000328}
329
Brian Paul894844a2004-03-21 17:05:03 +0000330
Keith Whitwell6dc85572003-07-17 13:43:59 +0000331/**
Brian Paul894844a2004-03-21 17:05:03 +0000332 * Destroy a visual and free its memory.
Keith Whitwell6dc85572003-07-17 13:43:59 +0000333 *
334 * \param vis visual.
335 *
336 * Frees the visual structure.
337 */
Brian Paulb371e0d2000-03-31 01:05:51 +0000338void
339_mesa_destroy_visual( GLvisual *vis )
340{
Brian Paulc7e164f2006-06-30 15:44:30 +0000341 _mesa_free(vis);
Brian Paulb371e0d2000-03-31 01:05:51 +0000342}
343
Keith Whitwell6dc85572003-07-17 13:43:59 +0000344/*@}*/
345
Brian Paulb371e0d2000-03-31 01:05:51 +0000346
Brian Paul4d053dd2000-01-14 04:45:47 +0000347/**********************************************************************/
Keith Whitwell6dc85572003-07-17 13:43:59 +0000348/** \name Context allocation, initialization, destroying
349 *
350 * The purpose of the most initialization functions here is to provide the
351 * default state values according to the OpenGL specification.
352 */
jtgafb833d1999-08-19 00:55:39 +0000353/**********************************************************************/
Keith Whitwell6dc85572003-07-17 13:43:59 +0000354/*@{*/
jtgafb833d1999-08-19 00:55:39 +0000355
Brian Paul4c4268d2009-02-28 10:58:57 -0700356
357/**
358 * This is lame. gdb only seems to recognize enum types that are
359 * actually used somewhere. We want to be able to print/use enum
360 * values such as TEXTURE_2D_INDEX in gdb. But we don't actually use
361 * the gl_texture_index type anywhere. Thus, this lame function.
362 */
363static void
364dummy_enum_func(void)
365{
366 gl_buffer_index bi;
367 gl_colortable_index ci;
368 gl_face_index fi;
369 gl_frag_attrib fa;
370 gl_frag_result fr;
371 gl_texture_index ti;
372 gl_vert_attrib va;
373 gl_vert_result vr;
374
375 (void) bi;
376 (void) ci;
377 (void) fi;
378 (void) fa;
379 (void) fr;
380 (void) ti;
381 (void) va;
382 (void) vr;
383}
384
385
Keith Whitwell6dc85572003-07-17 13:43:59 +0000386/**
387 * One-time initialization mutex lock.
388 *
389 * \sa Used by one_time_init().
390 */
Brian Paul9560f052000-01-31 23:11:39 +0000391_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
392
Keith Whitwell6dc85572003-07-17 13:43:59 +0000393/**
394 * Calls all the various one-time-init functions in Mesa.
395 *
396 * While holding a global mutex lock, calls several initialization functions,
397 * and sets the glapi callbacks if the \c MESA_DEBUG environment variable is
398 * defined.
399 *
Brian Paula764b7e2006-02-26 17:16:37 +0000400 * \sa _math_init().
jtgafb833d1999-08-19 00:55:39 +0000401 */
Brian Paul178a1c52000-04-22 01:05:00 +0000402static void
Brian Paul4753d602002-06-15 02:38:15 +0000403one_time_init( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000404{
405 static GLboolean alreadyCalled = GL_FALSE;
Brian Paula6c423d2004-08-25 15:59:48 +0000406 (void) ctx;
Brian Paul9560f052000-01-31 23:11:39 +0000407 _glthread_LOCK_MUTEX(OneTimeLock);
jtgafb833d1999-08-19 00:55:39 +0000408 if (!alreadyCalled) {
Brian Paul27558a12003-03-01 01:50:20 +0000409 GLuint i;
410
Brian Paul4d053dd2000-01-14 04:45:47 +0000411 /* do some implementation tests */
412 assert( sizeof(GLbyte) == 1 );
Brian Paul4d053dd2000-01-14 04:45:47 +0000413 assert( sizeof(GLubyte) == 1 );
Brian Paul894844a2004-03-21 17:05:03 +0000414 assert( sizeof(GLshort) == 2 );
415 assert( sizeof(GLushort) == 2 );
416 assert( sizeof(GLint) == 4 );
417 assert( sizeof(GLuint) == 4 );
Brian Paul4d053dd2000-01-14 04:45:47 +0000418
Brian Paul7979c602009-03-04 16:43:07 -0700419 _mesa_get_cpu_features();
420
Brian33c37392007-04-04 22:18:53 -0600421 _mesa_init_sqrt_table();
422
Brian Paul27558a12003-03-01 01:50:20 +0000423 for (i = 0; i < 256; i++) {
424 _mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
425 }
Brian Paul68ee4bc2000-01-28 19:02:22 +0000426
Brian Paul3c634522002-10-24 23:57:19 +0000427 if (_mesa_getenv("MESA_DEBUG")) {
Brian Paul68ee4bc2000-01-28 19:02:22 +0000428 _glapi_noop_enable_warnings(GL_TRUE);
Brian Paul4e9676f2002-06-29 19:48:15 +0000429 _glapi_set_warning_func( (_glapi_warning_func) _mesa_warning );
Brian Paul68ee4bc2000-01-28 19:02:22 +0000430 }
431 else {
432 _glapi_noop_enable_warnings(GL_FALSE);
433 }
434
jtgafb833d1999-08-19 00:55:39 +0000435#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
Brian Paul363344f2005-09-13 14:48:28 +0000436 _mesa_debug(ctx, "Mesa %s DEBUG build %s %s\n",
437 MESA_VERSION_STRING, __DATE__, __TIME__);
jtgafb833d1999-08-19 00:55:39 +0000438#endif
Brian Paul68ee4bc2000-01-28 19:02:22 +0000439
440 alreadyCalled = GL_TRUE;
441 }
Brian Paul9560f052000-01-31 23:11:39 +0000442 _glthread_UNLOCK_MUTEX(OneTimeLock);
Brian Paul4c4268d2009-02-28 10:58:57 -0700443
444 dummy_enum_func();
jtgafb833d1999-08-19 00:55:39 +0000445}
446
Brian Paul894844a2004-03-21 17:05:03 +0000447
Keith Whitwell6dc85572003-07-17 13:43:59 +0000448/**
jtgafb833d1999-08-19 00:55:39 +0000449 * Allocate and initialize a shared context state structure.
Keith Whitwell6dc85572003-07-17 13:43:59 +0000450 * Initializes the display list, texture objects and vertex programs hash
451 * tables, allocates the texture objects. If it runs out of memory, frees
452 * everything already allocated before returning NULL.
Brian Paul894844a2004-03-21 17:05:03 +0000453 *
454 * \return pointer to a gl_shared_state structure on success, or NULL on
455 * failure.
jtgafb833d1999-08-19 00:55:39 +0000456 */
Brian Paula3f13702003-04-01 16:41:50 +0000457static GLboolean
458alloc_shared_state( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +0000459{
Brian Paul4d24b632009-02-21 13:59:29 -0700460 GLuint i;
Brian Paula3f13702003-04-01 16:41:50 +0000461 struct gl_shared_state *ss = CALLOC_STRUCT(gl_shared_state);
jtgafb833d1999-08-19 00:55:39 +0000462 if (!ss)
Brian Paula3f13702003-04-01 16:41:50 +0000463 return GL_FALSE;
464
465 ctx->Shared = ss;
jtgafb833d1999-08-19 00:55:39 +0000466
Brian Paule4b684c2000-09-12 21:07:40 +0000467 _glthread_INIT_MUTEX(ss->Mutex);
jtgafb833d1999-08-19 00:55:39 +0000468
Brian Paule4b684c2000-09-12 21:07:40 +0000469 ss->DisplayList = _mesa_NewHashTable();
Brian Paulbb797902000-01-24 16:19:54 +0000470 ss->TexObjects = _mesa_NewHashTable();
Brian Paul610d5992003-01-14 04:55:45 +0000471 ss->Programs = _mesa_NewHashTable();
jtgafb833d1999-08-19 00:55:39 +0000472
Brian Paul451f3102003-04-17 01:48:19 +0000473#if FEATURE_ARB_vertex_program
Briandf43fb62008-05-06 23:08:51 -0600474 ss->DefaultVertexProgram = (struct gl_vertex_program *)
475 ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0);
Brian Paul451f3102003-04-17 01:48:19 +0000476 if (!ss->DefaultVertexProgram)
477 goto cleanup;
478#endif
479#if FEATURE_ARB_fragment_program
Briandf43fb62008-05-06 23:08:51 -0600480 ss->DefaultFragmentProgram = (struct gl_fragment_program *)
481 ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0);
Brian Paul451f3102003-04-17 01:48:19 +0000482 if (!ss->DefaultFragmentProgram)
483 goto cleanup;
484#endif
Dave Airlie7f752fe2004-12-19 03:06:59 +0000485#if FEATURE_ATI_fragment_shader
Brian Paul63d68302005-11-19 16:43:04 +0000486 ss->ATIShaders = _mesa_NewHashTable();
487 ss->DefaultFragmentShader = _mesa_new_ati_fragment_shader(ctx, 0);
Dave Airlie7f752fe2004-12-19 03:06:59 +0000488 if (!ss->DefaultFragmentShader)
489 goto cleanup;
490#endif
Brian Paul451f3102003-04-17 01:48:19 +0000491
Tilman Sauerbeck17b50632006-07-11 19:03:21 +0000492#if FEATURE_ARB_vertex_buffer_object || FEATURE_ARB_pixel_buffer_object
Brian Paulddc82ee2005-02-05 19:56:45 +0000493 ss->BufferObjects = _mesa_NewHashTable();
Tilman Sauerbeck17b50632006-07-11 19:03:21 +0000494#endif
495
Ian Romanickee34e6e2006-06-12 16:26:29 +0000496 ss->ArrayObjects = _mesa_NewHashTable();
Brian Paulddc82ee2005-02-05 19:56:45 +0000497
Michal Krol365582d2006-08-01 20:07:31 +0000498#if FEATURE_ARB_shader_objects
Briana90046f2006-12-15 10:07:26 -0700499 ss->ShaderObjects = _mesa_NewHashTable();
Michal Krol365582d2006-08-01 20:07:31 +0000500#endif
Ian Romanick0207b472003-09-09 00:10:12 +0000501
Brian Paul4d24b632009-02-21 13:59:29 -0700502 /* Create default texture objects */
503 for (i = 0; i < NUM_TEXTURE_TARGETS; i++) {
Brian Pauld059d032009-02-21 15:15:20 -0700504 /* NOTE: the order of these enums matches the TEXTURE_x_INDEX values */
Brian Paul4d24b632009-02-21 13:59:29 -0700505 static const GLenum targets[NUM_TEXTURE_TARGETS] = {
Brian Pauld059d032009-02-21 15:15:20 -0700506 GL_TEXTURE_2D_ARRAY_EXT,
Brian Paul4d24b632009-02-21 13:59:29 -0700507 GL_TEXTURE_1D_ARRAY_EXT,
Brian Pauld059d032009-02-21 15:15:20 -0700508 GL_TEXTURE_CUBE_MAP,
509 GL_TEXTURE_3D,
510 GL_TEXTURE_RECTANGLE_NV,
511 GL_TEXTURE_2D,
512 GL_TEXTURE_1D
Brian Paul4d24b632009-02-21 13:59:29 -0700513 };
514 ss->DefaultTex[i] = ctx->Driver.NewTextureObject(ctx, 0, targets[i]);
515 if (!ss->DefaultTex[i])
516 goto cleanup;
517 }
Ian Romanickbb372f12007-05-16 15:34:22 -0700518
Brian9e01b912007-08-13 11:29:46 +0100519 /* sanity check */
Brian Paul4d24b632009-02-21 13:59:29 -0700520 assert(ss->DefaultTex[TEXTURE_1D_INDEX]->RefCount == 1);
Brian Paula3f13702003-04-01 16:41:50 +0000521
Keith Whitwell5ac93f82006-11-01 14:21:57 +0000522 _glthread_INIT_MUTEX(ss->TexMutex);
523 ss->TextureStateStamp = 0;
524
Brian Paulddc82ee2005-02-05 19:56:45 +0000525#if FEATURE_EXT_framebuffer_object
526 ss->FrameBuffers = _mesa_NewHashTable();
527 if (!ss->FrameBuffers)
528 goto cleanup;
529 ss->RenderBuffers = _mesa_NewHashTable();
530 if (!ss->RenderBuffers)
531 goto cleanup;
532#endif
533
Brian Paula3f13702003-04-01 16:41:50 +0000534 return GL_TRUE;
535
Brian9e01b912007-08-13 11:29:46 +0100536cleanup:
Brian Paula3f13702003-04-01 16:41:50 +0000537 /* Ran out of memory at some point. Free everything and return NULL */
538 if (ss->DisplayList)
539 _mesa_DeleteHashTable(ss->DisplayList);
540 if (ss->TexObjects)
541 _mesa_DeleteHashTable(ss->TexObjects);
Brian Paula3f13702003-04-01 16:41:50 +0000542 if (ss->Programs)
543 _mesa_DeleteHashTable(ss->Programs);
Brian Paul451f3102003-04-17 01:48:19 +0000544#if FEATURE_ARB_vertex_program
Briandf43fb62008-05-06 23:08:51 -0600545 _mesa_reference_vertprog(ctx, &ss->DefaultVertexProgram, NULL);
Brian Paul451f3102003-04-17 01:48:19 +0000546#endif
547#if FEATURE_ARB_fragment_program
Briandf43fb62008-05-06 23:08:51 -0600548 _mesa_reference_fragprog(ctx, &ss->DefaultFragmentProgram, NULL);
Brian Paul451f3102003-04-17 01:48:19 +0000549#endif
Dave Airlie7f752fe2004-12-19 03:06:59 +0000550#if FEATURE_ATI_fragment_shader
551 if (ss->DefaultFragmentShader)
Brian Paul63d68302005-11-19 16:43:04 +0000552 _mesa_delete_ati_fragment_shader(ctx, ss->DefaultFragmentShader);
Dave Airlie7f752fe2004-12-19 03:06:59 +0000553#endif
Tilman Sauerbeck17b50632006-07-11 19:03:21 +0000554#if FEATURE_ARB_vertex_buffer_object || FEATURE_ARB_pixel_buffer_object
Ian Romanick0207b472003-09-09 00:10:12 +0000555 if (ss->BufferObjects)
556 _mesa_DeleteHashTable(ss->BufferObjects);
Brian Paulddc82ee2005-02-05 19:56:45 +0000557#endif
558
Tilman Sauerbeckc0eb7772006-07-11 19:36:27 +0000559 if (ss->ArrayObjects)
560 _mesa_DeleteHashTable (ss->ArrayObjects);
561
Michal Krol365582d2006-08-01 20:07:31 +0000562#if FEATURE_ARB_shader_objects
Brian0bf5dbe2006-12-19 18:02:41 -0700563 if (ss->ShaderObjects)
Briana90046f2006-12-15 10:07:26 -0700564 _mesa_DeleteHashTable (ss->ShaderObjects);
Michal Krol365582d2006-08-01 20:07:31 +0000565#endif
Ian Romanick0207b472003-09-09 00:10:12 +0000566
Brian Paulddc82ee2005-02-05 19:56:45 +0000567#if FEATURE_EXT_framebuffer_object
568 if (ss->FrameBuffers)
569 _mesa_DeleteHashTable(ss->FrameBuffers);
570 if (ss->RenderBuffers)
571 _mesa_DeleteHashTable(ss->RenderBuffers);
572#endif
573
Brian Paul4d24b632009-02-21 13:59:29 -0700574 for (i = 0; i < NUM_TEXTURE_TARGETS; i++) {
575 if (ss->DefaultTex[i])
576 ctx->Driver.DeleteTexture(ctx, ss->DefaultTex[i]);
577 }
Briana5c84de2008-01-01 10:20:21 -0700578
579 _mesa_free(ss);
580
Brian Paula3f13702003-04-01 16:41:50 +0000581 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000582}
583
Brian Paulc7e164f2006-06-30 15:44:30 +0000584
Keith Whitwell6dc85572003-07-17 13:43:59 +0000585/**
Brian Paulc7e164f2006-06-30 15:44:30 +0000586 * Callback for deleting a display list. Called by _mesa_HashDeleteAll().
587 */
588static void
589delete_displaylist_cb(GLuint id, void *data, void *userData)
590{
Keith Whitwell34a61c62008-09-21 19:29:15 -0700591#if FEATURE_dlist
Brian446abc22009-01-31 11:57:22 -0700592 struct gl_display_list *list = (struct gl_display_list *) data;
Brian Paulc7e164f2006-06-30 15:44:30 +0000593 GLcontext *ctx = (GLcontext *) userData;
594 _mesa_delete_list(ctx, list);
Keith Whitwell34a61c62008-09-21 19:29:15 -0700595#endif
Brian Paulc7e164f2006-06-30 15:44:30 +0000596}
597
598/**
599 * Callback for deleting a texture object. Called by _mesa_HashDeleteAll().
600 */
601static void
602delete_texture_cb(GLuint id, void *data, void *userData)
603{
604 struct gl_texture_object *texObj = (struct gl_texture_object *) data;
605 GLcontext *ctx = (GLcontext *) userData;
606 ctx->Driver.DeleteTexture(ctx, texObj);
607}
608
609/**
610 * Callback for deleting a program object. Called by _mesa_HashDeleteAll().
611 */
612static void
613delete_program_cb(GLuint id, void *data, void *userData)
614{
Brian Paul122629f2006-07-20 16:49:57 +0000615 struct gl_program *prog = (struct gl_program *) data;
Brian Paulc7e164f2006-06-30 15:44:30 +0000616 GLcontext *ctx = (GLcontext *) userData;
Brian Paulfbfe2a52008-05-19 08:43:36 -0600617 ASSERT(prog->RefCount == 1); /* should only be referenced by hash table */
618 prog->RefCount = 0; /* now going away */
Brian Paulc7e164f2006-06-30 15:44:30 +0000619 ctx->Driver.DeleteProgram(ctx, prog);
620}
621
Brian Paule961a5d2008-06-12 16:55:28 -0600622#if FEATURE_ATI_fragment_shader
Brian Paulc7e164f2006-06-30 15:44:30 +0000623/**
624 * Callback for deleting an ATI fragment shader object.
625 * Called by _mesa_HashDeleteAll().
626 */
627static void
628delete_fragshader_cb(GLuint id, void *data, void *userData)
629{
630 struct ati_fragment_shader *shader = (struct ati_fragment_shader *) data;
631 GLcontext *ctx = (GLcontext *) userData;
632 _mesa_delete_ati_fragment_shader(ctx, shader);
633}
Brian Paule961a5d2008-06-12 16:55:28 -0600634#endif
Brian Paulc7e164f2006-06-30 15:44:30 +0000635
636/**
637 * Callback for deleting a buffer object. Called by _mesa_HashDeleteAll().
638 */
639static void
640delete_bufferobj_cb(GLuint id, void *data, void *userData)
641{
642 struct gl_buffer_object *bufObj = (struct gl_buffer_object *) data;
643 GLcontext *ctx = (GLcontext *) userData;
644 ctx->Driver.DeleteBuffer(ctx, bufObj);
645}
646
Brian Paulc04bb512006-07-11 21:56:43 +0000647/**
648 * Callback for deleting an array object. Called by _mesa_HashDeleteAll().
649 */
650static void
651delete_arrayobj_cb(GLuint id, void *data, void *userData)
652{
653 struct gl_array_object *arrayObj = (struct gl_array_object *) data;
654 GLcontext *ctx = (GLcontext *) userData;
655 _mesa_delete_array_object(ctx, arrayObj);
656}
657
Brian Paul4d4373b2006-11-18 17:44:28 +0000658/**
Xiang, Haihao63d8a842008-03-31 17:02:47 +0800659 * Callback for freeing shader program data. Call it before delete_shader_cb
660 * to avoid memory access error.
661 */
662static void
663free_shader_program_data_cb(GLuint id, void *data, void *userData)
664{
665 GLcontext *ctx = (GLcontext *) userData;
666 struct gl_shader_program *shProg = (struct gl_shader_program *) data;
667
668 if (shProg->Type == GL_SHADER_PROGRAM_MESA) {
669 _mesa_free_shader_program_data(ctx, shProg);
670 }
671}
672
673/**
Brian9e4bae92006-12-20 09:27:42 -0700674 * Callback for deleting shader and shader programs objects.
675 * Called by _mesa_HashDeleteAll().
Brian Paul4d4373b2006-11-18 17:44:28 +0000676 */
677static void
Brian9e4bae92006-12-20 09:27:42 -0700678delete_shader_cb(GLuint id, void *data, void *userData)
Brian Paul4d4373b2006-11-18 17:44:28 +0000679{
Brian9e4bae92006-12-20 09:27:42 -0700680 GLcontext *ctx = (GLcontext *) userData;
681 struct gl_shader *sh = (struct gl_shader *) data;
Xiang, Haihaoaef47c42008-03-31 16:27:47 +0800682 if (sh->Type == GL_FRAGMENT_SHADER || sh->Type == GL_VERTEX_SHADER) {
683 _mesa_free_shader(ctx, sh);
684 }
685 else {
686 struct gl_shader_program *shProg = (struct gl_shader_program *) data;
687 ASSERT(shProg->Type == GL_SHADER_PROGRAM_MESA);
688 _mesa_free_shader_program(ctx, shProg);
689 }
Brian Paul4d4373b2006-11-18 17:44:28 +0000690}
691
Brian393a6252007-08-13 17:37:30 +0100692/**
693 * Callback for deleting a framebuffer object. Called by _mesa_HashDeleteAll()
694 */
695static void
696delete_framebuffer_cb(GLuint id, void *data, void *userData)
697{
698 struct gl_framebuffer *fb = (struct gl_framebuffer *) data;
Briandc732172007-08-14 11:56:59 +0100699 /* The fact that the framebuffer is in the hashtable means its refcount
700 * is one, but we're removing from the hashtable now. So clear refcount.
701 */
702 /*assert(fb->RefCount == 1);*/
703 fb->RefCount = 0;
Brian2f7c8042008-01-30 08:08:23 -0700704
705 /* NOTE: Delete should always be defined but there are two reports
706 * of it being NULL (bugs 13507, 14293). Work-around for now.
707 */
708 if (fb->Delete)
709 fb->Delete(fb);
Brian393a6252007-08-13 17:37:30 +0100710}
711
712/**
713 * Callback for deleting a renderbuffer object. Called by _mesa_HashDeleteAll()
714 */
715static void
716delete_renderbuffer_cb(GLuint id, void *data, void *userData)
717{
718 struct gl_renderbuffer *rb = (struct gl_renderbuffer *) data;
Briandc732172007-08-14 11:56:59 +0100719 rb->RefCount = 0; /* see comment for FBOs above */
Brian Paul61b3ce82008-08-03 11:13:12 -0600720 if (rb->Delete)
721 rb->Delete(rb);
Brian393a6252007-08-13 17:37:30 +0100722}
723
724
Brian Paulc7e164f2006-06-30 15:44:30 +0000725/**
726 * Deallocate a shared state object and all children structures.
Keith Whitwell6dc85572003-07-17 13:43:59 +0000727 *
728 * \param ctx GL context.
729 * \param ss shared state pointer.
730 *
731 * Frees the display lists, the texture objects (calling the driver texture
732 * deletion callback to free its private data) and the vertex programs, as well
733 * as their hash tables.
734 *
735 * \sa alloc_shared_state().
jtgafb833d1999-08-19 00:55:39 +0000736 */
Brian Paul178a1c52000-04-22 01:05:00 +0000737static void
738free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
jtgafb833d1999-08-19 00:55:39 +0000739{
Brian Paul4d24b632009-02-21 13:59:29 -0700740 GLuint i;
741
Brian Paulc7e164f2006-06-30 15:44:30 +0000742 /*
743 * Free display lists
744 */
745 _mesa_HashDeleteAll(ss->DisplayList, delete_displaylist_cb, ctx);
Brian Paulbb797902000-01-24 16:19:54 +0000746 _mesa_DeleteHashTable(ss->DisplayList);
jtgafb833d1999-08-19 00:55:39 +0000747
Brian Paulfbfe2a52008-05-19 08:43:36 -0600748#if FEATURE_ARB_shader_objects
749 _mesa_HashWalk(ss->ShaderObjects, free_shader_program_data_cb, ctx);
750 _mesa_HashDeleteAll(ss->ShaderObjects, delete_shader_cb, ctx);
751 _mesa_DeleteHashTable(ss->ShaderObjects);
752#endif
753
Brian Paulc7e164f2006-06-30 15:44:30 +0000754 _mesa_HashDeleteAll(ss->Programs, delete_program_cb, ctx);
Brian Paul610d5992003-01-14 04:55:45 +0000755 _mesa_DeleteHashTable(ss->Programs);
Brian Paul85f553d2008-06-20 10:47:38 -0600756
Brian Paul21841f02004-08-14 14:28:11 +0000757#if FEATURE_ARB_vertex_program
Briandf43fb62008-05-06 23:08:51 -0600758 _mesa_reference_vertprog(ctx, &ss->DefaultVertexProgram, NULL);
Brian Paul21841f02004-08-14 14:28:11 +0000759#endif
760#if FEATURE_ARB_fragment_program
Briandf43fb62008-05-06 23:08:51 -0600761 _mesa_reference_fragprog(ctx, &ss->DefaultFragmentProgram, NULL);
Brian Paul21841f02004-08-14 14:28:11 +0000762#endif
Brian Paul1096eae2006-01-16 16:35:13 +0000763
Dave Airlie7f752fe2004-12-19 03:06:59 +0000764#if FEATURE_ATI_fragment_shader
Brian Paulc7e164f2006-06-30 15:44:30 +0000765 _mesa_HashDeleteAll(ss->ATIShaders, delete_fragshader_cb, ctx);
Brian Paul1096eae2006-01-16 16:35:13 +0000766 _mesa_DeleteHashTable(ss->ATIShaders);
767 _mesa_delete_ati_fragment_shader(ctx, ss->DefaultFragmentShader);
Dave Airlie7f752fe2004-12-19 03:06:59 +0000768#endif
Brian Paul30f51ae2001-12-18 04:06:44 +0000769
Tilman Sauerbeck17b50632006-07-11 19:03:21 +0000770#if FEATURE_ARB_vertex_buffer_object || FEATURE_ARB_pixel_buffer_object
Brian Paulc7e164f2006-06-30 15:44:30 +0000771 _mesa_HashDeleteAll(ss->BufferObjects, delete_bufferobj_cb, ctx);
Ian Romanick0207b472003-09-09 00:10:12 +0000772 _mesa_DeleteHashTable(ss->BufferObjects);
Brian Paulddc82ee2005-02-05 19:56:45 +0000773#endif
774
Brian Paulc04bb512006-07-11 21:56:43 +0000775 _mesa_HashDeleteAll(ss->ArrayObjects, delete_arrayobj_cb, ctx);
Tilman Sauerbeckc0eb7772006-07-11 19:36:27 +0000776 _mesa_DeleteHashTable(ss->ArrayObjects);
777
Brian Paulddc82ee2005-02-05 19:56:45 +0000778#if FEATURE_EXT_framebuffer_object
Brian393a6252007-08-13 17:37:30 +0100779 _mesa_HashDeleteAll(ss->FrameBuffers, delete_framebuffer_cb, ctx);
Brian Paulddc82ee2005-02-05 19:56:45 +0000780 _mesa_DeleteHashTable(ss->FrameBuffers);
Brian393a6252007-08-13 17:37:30 +0100781 _mesa_HashDeleteAll(ss->RenderBuffers, delete_renderbuffer_cb, ctx);
Brian Paulddc82ee2005-02-05 19:56:45 +0000782 _mesa_DeleteHashTable(ss->RenderBuffers);
783#endif
Michal Krol9b3752c2005-01-13 14:08:47 +0000784
Briandc732172007-08-14 11:56:59 +0100785 /*
786 * Free texture objects (after FBOs since some textures might have
787 * been bound to FBOs).
788 */
789 ASSERT(ctx->Driver.DeleteTexture);
790 /* the default textures */
Brian Paul4d24b632009-02-21 13:59:29 -0700791 for (i = 0; i < NUM_TEXTURE_TARGETS; i++) {
792 ctx->Driver.DeleteTexture(ctx, ss->DefaultTex[i]);
793 }
Briandc732172007-08-14 11:56:59 +0100794 /* all other textures */
795 _mesa_HashDeleteAll(ss->TexObjects, delete_texture_cb, ctx);
796 _mesa_DeleteHashTable(ss->TexObjects);
797
Keith Whitwelle15fd852002-12-12 13:03:15 +0000798 _glthread_DESTROY_MUTEX(ss->Mutex);
799
Brian Paulc7e164f2006-06-30 15:44:30 +0000800 _mesa_free(ss);
jtgafb833d1999-08-19 00:55:39 +0000801}
802
803
Brian Paul4d859f72004-01-23 18:57:05 +0000804/**
805 * Initialize fields of gl_current_attrib (aka ctx->Current.*)
806 */
807static void
Briand881a9c2006-12-20 09:31:07 -0700808_mesa_init_current(GLcontext *ctx)
jtgafb833d1999-08-19 00:55:39 +0000809{
Brian Paul88bf0382004-02-13 15:30:08 +0000810 GLuint i;
jtgafb833d1999-08-19 00:55:39 +0000811
Brian Paul94b30dc2006-04-25 00:53:25 +0000812 /* Init all to (0,0,0,1) */
Keith Whitwell6dc85572003-07-17 13:43:59 +0000813 for (i = 0; i < VERT_ATTRIB_MAX; i++) {
814 ASSIGN_4V( ctx->Current.Attrib[i], 0.0, 0.0, 0.0, 1.0 );
jtgafb833d1999-08-19 00:55:39 +0000815 }
Brian Paul94b30dc2006-04-25 00:53:25 +0000816
817 /* redo special cases: */
Markus Amsler507da2472008-03-09 17:51:11 -0600818 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 1.0, 0.0, 0.0, 0.0 );
Keith Whitwell6dc85572003-07-17 13:43:59 +0000819 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 );
820 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
Brian Paul88bf0382004-02-13 15:30:08 +0000821 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 1.0 );
Keith Whitwellfd275602006-10-30 20:16:35 +0000822 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR_INDEX], 1.0, 0.0, 0.0, 1.0 );
823 ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG], 1.0, 0.0, 0.0, 1.0 );
jtgafb833d1999-08-19 00:55:39 +0000824}
825
826
Brian Paul4d859f72004-01-23 18:57:05 +0000827/**
Brian Paulf51cca72008-09-25 19:22:29 -0600828 * Init vertex/fragment program limits.
829 * Important: drivers should override these with actual limits.
Brian Paul05051032005-11-01 04:36:33 +0000830 */
831static void
Brian Paulf51cca72008-09-25 19:22:29 -0600832init_program_limits(GLenum type, struct gl_program_constants *prog)
Brian Paul05051032005-11-01 04:36:33 +0000833{
Brian Paulf51cca72008-09-25 19:22:29 -0600834 prog->MaxInstructions = MAX_PROGRAM_INSTRUCTIONS;
835 prog->MaxAluInstructions = MAX_PROGRAM_INSTRUCTIONS;
836 prog->MaxTexInstructions = MAX_PROGRAM_INSTRUCTIONS;
837 prog->MaxTexIndirections = MAX_PROGRAM_INSTRUCTIONS;
838 prog->MaxTemps = MAX_PROGRAM_TEMPS;
839 prog->MaxEnvParams = MAX_PROGRAM_ENV_PARAMS;
840 prog->MaxLocalParams = MAX_PROGRAM_LOCAL_PARAMS;
841 prog->MaxUniformComponents = 4 * MAX_UNIFORMS;
842
843 if (type == GL_VERTEX_PROGRAM_ARB) {
844 prog->MaxParameters = MAX_NV_VERTEX_PROGRAM_PARAMS;
845 prog->MaxAttribs = MAX_NV_VERTEX_PROGRAM_INPUTS;
846 prog->MaxAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS;
847 }
848 else {
849 prog->MaxParameters = MAX_NV_FRAGMENT_PROGRAM_PARAMS;
850 prog->MaxAttribs = MAX_NV_FRAGMENT_PROGRAM_INPUTS;
851 prog->MaxAddressRegs = MAX_FRAGMENT_PROGRAM_ADDRESS_REGS;
852 }
853
854 /* copy the above limits to init native limits */
Brian Paul05051032005-11-01 04:36:33 +0000855 prog->MaxNativeInstructions = prog->MaxInstructions;
856 prog->MaxNativeAluInstructions = prog->MaxAluInstructions;
857 prog->MaxNativeTexInstructions = prog->MaxTexInstructions;
858 prog->MaxNativeTexIndirections = prog->MaxTexIndirections;
859 prog->MaxNativeAttribs = prog->MaxAttribs;
860 prog->MaxNativeTemps = prog->MaxTemps;
861 prog->MaxNativeAddressRegs = prog->MaxAddressRegs;
862 prog->MaxNativeParameters = prog->MaxParameters;
863}
864
865
866/**
Brian Paul4d859f72004-01-23 18:57:05 +0000867 * Initialize fields of gl_constants (aka ctx->Const.*).
868 * Use defaults from config.h. The device drivers will often override
869 * some of these values (such as number of texture units).
870 */
Keith Whitwell6dc85572003-07-17 13:43:59 +0000871static void
Briand881a9c2006-12-20 09:31:07 -0700872_mesa_init_constants(GLcontext *ctx)
jtgafb833d1999-08-19 00:55:39 +0000873{
Brian Paul4d053dd2000-01-14 04:45:47 +0000874 assert(ctx);
jtgafb833d1999-08-19 00:55:39 +0000875
Brian Paulcd1cefa2001-06-13 14:56:14 +0000876 assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
877 assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
878
Brian Paul65591072009-02-13 07:44:02 -0700879 /* Max texture size should be <= max viewport size (render to texture) */
880 assert((1 << (MAX_TEXTURE_LEVELS - 1)) <= MAX_WIDTH);
881
Brian Paul53f82c52004-10-02 16:39:09 +0000882 /* Constants, may be overriden (usually only reduced) by device drivers */
Brian Paul4d053dd2000-01-14 04:45:47 +0000883 ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
Brian Paulcd1cefa2001-06-13 14:56:14 +0000884 ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
885 ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
Brian Paul8afe7de2002-06-15 03:03:06 +0000886 ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
Ian Romanickbb372f12007-05-16 15:34:22 -0700887 ctx->Const.MaxArrayTextureLayers = MAX_ARRAY_TEXTURE_LAYERS;
Brian Paul610d5992003-01-14 04:55:45 +0000888 ctx->Const.MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;
889 ctx->Const.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
Brian Paulda238ee2006-04-13 19:21:58 +0000890 ctx->Const.MaxTextureUnits = MIN2(ctx->Const.MaxTextureCoordUnits,
891 ctx->Const.MaxTextureImageUnits);
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000892 ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
Brian Paul87c964d2001-11-06 15:53:00 +0000893 ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
Brian Paul4d053dd2000-01-14 04:45:47 +0000894 ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
Brian Paul539cce52000-02-03 19:40:07 +0000895 ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
896 ctx->Const.MinPointSize = MIN_POINT_SIZE;
897 ctx->Const.MaxPointSize = MAX_POINT_SIZE;
898 ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
899 ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000900 ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
Brian Paul539cce52000-02-03 19:40:07 +0000901 ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
902 ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
903 ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
904 ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
Brian Paulfde5e2c2001-09-15 18:02:49 +0000905 ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000906 ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
Brian Paul82b02f02000-05-07 20:37:40 +0000907 ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
908 ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
Brian Paula8644322000-11-27 18:22:13 +0000909 ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
910 ctx->Const.MaxLights = MAX_LIGHTS;
Ian Romanick882caa12003-05-30 21:37:14 +0000911 ctx->Const.MaxShininess = 128.0;
Brian Paul53f82c52004-10-02 16:39:09 +0000912 ctx->Const.MaxSpotExponent = 128.0;
913 ctx->Const.MaxViewportWidth = MAX_WIDTH;
914 ctx->Const.MaxViewportHeight = MAX_HEIGHT;
Brian Pauld0492cf2003-04-11 01:20:06 +0000915#if FEATURE_ARB_vertex_program
Brian Paulf51cca72008-09-25 19:22:29 -0600916 init_program_limits(GL_VERTEX_PROGRAM_ARB, &ctx->Const.VertexProgram);
Brian Pauld0492cf2003-04-11 01:20:06 +0000917#endif
918#if FEATURE_ARB_fragment_program
Brian Paulf51cca72008-09-25 19:22:29 -0600919 init_program_limits(GL_FRAGMENT_PROGRAM_ARB, &ctx->Const.FragmentProgram);
Brian Pauld0492cf2003-04-11 01:20:06 +0000920#endif
Brian Pauledd67742003-04-18 18:02:43 +0000921 ctx->Const.MaxProgramMatrices = MAX_PROGRAM_MATRICES;
922 ctx->Const.MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH;
Brian Pauld0492cf2003-04-11 01:20:06 +0000923
George Sapountzis507167d2006-12-06 06:54:13 +0200924 /* CheckArrayBounds is overriden by drivers/x11 for X server */
Brian Paula2b9bad2003-11-10 19:08:37 +0000925 ctx->Const.CheckArrayBounds = GL_FALSE;
Brian Paula2b9bad2003-11-10 19:08:37 +0000926
Brian Paul05051032005-11-01 04:36:33 +0000927 /* GL_ARB_draw_buffers */
Brian Paul53f82c52004-10-02 16:39:09 +0000928 ctx->Const.MaxDrawBuffers = MAX_DRAW_BUFFERS;
929
Brian Paul3deaa012005-02-07 05:08:24 +0000930 /* GL_OES_read_format */
Ian Romanick33899b72004-10-16 01:16:54 +0000931 ctx->Const.ColorReadFormat = GL_RGBA;
932 ctx->Const.ColorReadType = GL_UNSIGNED_BYTE;
933
Brian Paul3deaa012005-02-07 05:08:24 +0000934#if FEATURE_EXT_framebuffer_object
935 ctx->Const.MaxColorAttachments = MAX_COLOR_ATTACHMENTS;
936 ctx->Const.MaxRenderbufferSize = MAX_WIDTH;
937#endif
938
Brian Paul90fcf6c2006-11-01 00:12:41 +0000939#if FEATURE_ARB_vertex_shader
940 ctx->Const.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS;
Briana90046f2006-12-15 10:07:26 -0700941 ctx->Const.MaxVarying = MAX_VARYING;
Brian Paul90fcf6c2006-11-01 00:12:41 +0000942#endif
943
Brian Paul8fb88552009-01-20 15:29:08 -0700944 /* GL_ARB_framebuffer_object */
945 ctx->Const.MaxSamples = 0;
946
Brian Paul53f82c52004-10-02 16:39:09 +0000947 /* sanity checks */
Brian Paulda238ee2006-04-13 19:21:58 +0000948 ASSERT(ctx->Const.MaxTextureUnits == MIN2(ctx->Const.MaxTextureImageUnits,
949 ctx->Const.MaxTextureCoordUnits));
Brian Paul05051032005-11-01 04:36:33 +0000950 ASSERT(ctx->Const.FragmentProgram.MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS);
951 ASSERT(ctx->Const.VertexProgram.MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS);
Briana90046f2006-12-15 10:07:26 -0700952
953 ASSERT(MAX_NV_FRAGMENT_PROGRAM_TEMPS <= MAX_PROGRAM_TEMPS);
954 ASSERT(MAX_NV_VERTEX_PROGRAM_TEMPS <= MAX_PROGRAM_TEMPS);
955 ASSERT(MAX_NV_VERTEX_PROGRAM_INPUTS <= VERT_ATTRIB_MAX);
956 ASSERT(MAX_NV_VERTEX_PROGRAM_OUTPUTS <= VERT_RESULT_MAX);
Keith Whitwell6dc85572003-07-17 13:43:59 +0000957}
jtgafb833d1999-08-19 00:55:39 +0000958
Brian Paul4d859f72004-01-23 18:57:05 +0000959
Keith Whitwell6dc85572003-07-17 13:43:59 +0000960/**
Brian Paul5e2e96b2006-05-15 15:26:04 +0000961 * Do some sanity checks on the limits/constants for the given context.
962 * Only called the first time a context is bound.
963 */
964static void
965check_context_limits(GLcontext *ctx)
966{
967 /* Many context limits/constants are limited by the size of
968 * internal arrays.
969 */
970 assert(ctx->Const.MaxTextureImageUnits <= MAX_TEXTURE_IMAGE_UNITS);
971 assert(ctx->Const.MaxTextureCoordUnits <= MAX_TEXTURE_COORD_UNITS);
972 assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_IMAGE_UNITS);
973 assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_COORD_UNITS);
974
Brian Paule9b34882008-12-31 11:54:02 -0700975 /* number of coord units cannot be greater than number of image units */
976 assert(ctx->Const.MaxTextureCoordUnits <= ctx->Const.MaxTextureImageUnits);
977
Brian Paul65591072009-02-13 07:44:02 -0700978 assert(ctx->Const.MaxTextureLevels <= MAX_TEXTURE_LEVELS);
979 assert(ctx->Const.Max3DTextureLevels <= MAX_3D_TEXTURE_LEVELS);
980 assert(ctx->Const.MaxCubeTextureLevels <= MAX_CUBE_TEXTURE_LEVELS);
981 assert(ctx->Const.MaxTextureRectSize <= MAX_TEXTURE_RECT_SIZE);
Brian Paul5e2e96b2006-05-15 15:26:04 +0000982
983 /* make sure largest texture image is <= MAX_WIDTH in size */
Brian Paul65591072009-02-13 07:44:02 -0700984 assert((1 << (ctx->Const.MaxTextureLevels - 1)) <= MAX_WIDTH);
985 assert((1 << (ctx->Const.MaxCubeTextureLevels - 1)) <= MAX_WIDTH);
986 assert((1 << (ctx->Const.Max3DTextureLevels - 1)) <= MAX_WIDTH);
987
988 assert(ctx->Const.MaxViewportWidth <= MAX_WIDTH);
989 assert(ctx->Const.MaxViewportHeight <= MAX_WIDTH);
Brian Paul5e2e96b2006-05-15 15:26:04 +0000990
991 assert(ctx->Const.MaxDrawBuffers <= MAX_DRAW_BUFFERS);
992
993 /* XXX probably add more tests */
994}
995
996
997/**
Keith Whitwell6dc85572003-07-17 13:43:59 +0000998 * Initialize the attribute groups in a GL context.
999 *
1000 * \param ctx GL context.
1001 *
1002 * Initializes all the attributes, calling the respective <tt>init*</tt>
1003 * functions for the more complex data structures.
1004 */
1005static GLboolean
Briand881a9c2006-12-20 09:31:07 -07001006init_attrib_groups(GLcontext *ctx)
Keith Whitwell6dc85572003-07-17 13:43:59 +00001007{
1008 assert(ctx);
Brian Paul4d053dd2000-01-14 04:45:47 +00001009
Keith Whitwell6dc85572003-07-17 13:43:59 +00001010 /* Constants */
1011 _mesa_init_constants( ctx );
Brian Paul0771d152000-04-07 00:19:41 +00001012
Brian Paul4d053dd2000-01-14 04:45:47 +00001013 /* Extensions */
Brian Paulde4f4602003-07-03 02:15:06 +00001014 _mesa_init_extensions( ctx );
jtgafb833d1999-08-19 00:55:39 +00001015
Keith Whitwell6dc85572003-07-17 13:43:59 +00001016 /* Attribute Groups */
Keith Whitwell34a61c62008-09-21 19:29:15 -07001017#if FEATURE_accum
Keith Whitwell6dc85572003-07-17 13:43:59 +00001018 _mesa_init_accum( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001019#endif
1020#if FEATURE_attrib_stack
Keith Whitwell6dc85572003-07-17 13:43:59 +00001021 _mesa_init_attrib( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001022#endif
Brian Paul148a2842003-09-17 03:40:11 +00001023 _mesa_init_buffer_objects( ctx );
Keith Whitwell6dc85572003-07-17 13:43:59 +00001024 _mesa_init_color( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001025#if FEATURE_colortable
Brian Paul05944c02003-07-22 03:51:46 +00001026 _mesa_init_colortables( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001027#endif
Keith Whitwell6dc85572003-07-17 13:43:59 +00001028 _mesa_init_current( ctx );
1029 _mesa_init_depth( ctx );
1030 _mesa_init_debug( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001031#if FEATURE_dlist
Keith Whitwell6dc85572003-07-17 13:43:59 +00001032 _mesa_init_display_list( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001033#endif
1034#if FEATURE_evaluators
Keith Whitwell6dc85572003-07-17 13:43:59 +00001035 _mesa_init_eval( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001036#endif
Brian Paul3dc65912008-07-03 15:40:38 -06001037 _mesa_init_fbobjects( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001038#if FEATURE_feedback
Keith Whitwell6dc85572003-07-17 13:43:59 +00001039 _mesa_init_feedback( ctx );
Brian Paulc1156162008-06-20 14:29:49 -06001040#else
1041 ctx->RenderMode = GL_RENDER;
Keith Whitwell34a61c62008-09-21 19:29:15 -07001042#endif
Keith Whitwell6dc85572003-07-17 13:43:59 +00001043 _mesa_init_fog( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001044#if FEATURE_histogram
Keith Whitwell6dc85572003-07-17 13:43:59 +00001045 _mesa_init_histogram( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001046#endif
Keith Whitwell6dc85572003-07-17 13:43:59 +00001047 _mesa_init_hint( ctx );
1048 _mesa_init_line( ctx );
1049 _mesa_init_lighting( ctx );
1050 _mesa_init_matrix( ctx );
Brian Paul67742382005-02-26 17:16:12 +00001051 _mesa_init_multisample( ctx );
Keith Whitwell6dc85572003-07-17 13:43:59 +00001052 _mesa_init_pixel( ctx );
Brian Paul533c1db2008-06-09 14:25:23 -06001053 _mesa_init_pixelstore( ctx );
Keith Whitwell6dc85572003-07-17 13:43:59 +00001054 _mesa_init_point( ctx );
1055 _mesa_init_polygon( ctx );
Brian Paul05944c02003-07-22 03:51:46 +00001056 _mesa_init_program( ctx );
Brian Paul4e3ae762008-06-13 13:56:53 -06001057#if FEATURE_ARB_occlusion_query
Brian Paul4fb99502005-09-02 13:42:49 +00001058 _mesa_init_query( ctx );
Brian Paul4e3ae762008-06-13 13:56:53 -06001059#endif
Keith Whitwell34a61c62008-09-21 19:29:15 -07001060#if FEATURE_drawpix
Brian Paulddc82ee2005-02-05 19:56:45 +00001061 _mesa_init_rastpos( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001062#endif
Brian Paul67742382005-02-26 17:16:12 +00001063 _mesa_init_scissor( ctx );
Brian0bf5dbe2006-12-19 18:02:41 -07001064 _mesa_init_shader_state( ctx );
Keith Whitwell6dc85572003-07-17 13:43:59 +00001065 _mesa_init_stencil( ctx );
1066 _mesa_init_transform( ctx );
1067 _mesa_init_varray( ctx );
1068 _mesa_init_viewport( ctx );
jtgafb833d1999-08-19 00:55:39 +00001069
Keith Whitwell6dc85572003-07-17 13:43:59 +00001070 if (!_mesa_init_texture( ctx ))
1071 return GL_FALSE;
Brian Paulb17a7222003-06-13 02:37:27 +00001072
Keith Whitwell34a61c62008-09-21 19:29:15 -07001073#if FEATURE_texture_s3tc
Brian Paul8f04c122004-04-27 13:39:20 +00001074 _mesa_init_texture_s3tc( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001075#endif
1076#if FEATURE_texture_fxt1
Brian Paul8f04c122004-04-27 13:39:20 +00001077 _mesa_init_texture_fxt1( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001078#endif
Brian Paul8f04c122004-04-27 13:39:20 +00001079
Brian Paul4d053dd2000-01-14 04:45:47 +00001080 /* Miscellaneous */
Keith Whitwella96308c2000-10-30 13:31:59 +00001081 ctx->NewState = _NEW_ALL;
Brian Paul4d053dd2000-01-14 04:45:47 +00001082 ctx->ErrorValue = (GLenum) GL_NO_ERROR;
Keith Whitwell568e96b2008-10-14 14:15:26 +01001083 ctx->varying_vp_inputs = ~0;
Brian Paul4d053dd2000-01-14 04:45:47 +00001084
Brian Paula3f13702003-04-01 16:41:50 +00001085 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001086}
1087
1088
Brian Paulf44898c2003-07-18 15:44:57 +00001089/**
Brian4b654d42007-08-23 08:53:43 +01001090 * Update default objects in a GL context with respect to shared state.
1091 *
1092 * \param ctx GL context.
1093 *
1094 * Removes references to old default objects, (texture objects, program
1095 * objects, etc.) and changes to reference those from the current shared
1096 * state.
1097 */
1098static GLboolean
1099update_default_objects(GLcontext *ctx)
1100{
1101 assert(ctx);
1102
1103 _mesa_update_default_objects_program(ctx);
1104 _mesa_update_default_objects_texture(ctx);
1105 _mesa_update_default_objects_buffer_objects(ctx);
1106
1107 return GL_TRUE;
1108}
1109
1110
1111/**
Brian Paul21f69782004-11-27 05:05:32 +00001112 * This is the default function we plug into all dispatch table slots
1113 * This helps prevents a segfault when someone calls a GL function without
1114 * first checking if the extension's supported.
1115 */
1116static int
1117generic_nop(void)
1118{
Briancf239ce2007-06-11 10:57:01 -06001119 _mesa_warning(NULL, "User called no-op dispatch function (an unsupported extension function?)");
Brian Paul21f69782004-11-27 05:05:32 +00001120 return 0;
1121}
1122
1123
1124/**
1125 * Allocate and initialize a new dispatch table.
1126 */
1127static struct _glapi_table *
1128alloc_dispatch_table(void)
1129{
1130 /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1131 * In practice, this'll be the same for stand-alone Mesa. But for DRI
1132 * Mesa we do this to accomodate different versions of libGL and various
1133 * DRI drivers.
1134 */
1135 GLint numEntries = MAX2(_glapi_get_dispatch_table_size(),
1136 sizeof(struct _glapi_table) / sizeof(_glapi_proc));
1137 struct _glapi_table *table =
1138 (struct _glapi_table *) _mesa_malloc(numEntries * sizeof(_glapi_proc));
1139 if (table) {
1140 _glapi_proc *entry = (_glapi_proc *) table;
Brian Paula760ccf2004-12-03 15:24:34 +00001141 GLint i;
Brian Paul21f69782004-11-27 05:05:32 +00001142 for (i = 0; i < numEntries; i++) {
1143 entry[i] = (_glapi_proc) generic_nop;
1144 }
1145 }
1146 return table;
1147}
1148
1149
1150/**
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001151 * Initialize a GLcontext struct (rendering context).
Keith Whitwell6dc85572003-07-17 13:43:59 +00001152 *
1153 * This includes allocating all the other structs and arrays which hang off of
1154 * the context by pointers.
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001155 * Note that the driver needs to pass in its dd_function_table here since
1156 * we need to at least call driverFunctions->NewTextureObject to create the
1157 * default texture objects.
Keith Whitwell6dc85572003-07-17 13:43:59 +00001158 *
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001159 * Called by _mesa_create_context().
Keith Whitwell6dc85572003-07-17 13:43:59 +00001160 *
1161 * Performs the imports and exports callback tables initialization, and
1162 * miscellaneous one-time initializations. If no shared context is supplied one
1163 * is allocated, and increase its reference count. Setups the GL API dispatch
1164 * tables. Initialize the TNL module. Sets the maximum Z buffer depth.
1165 * Finally queries the \c MESA_DEBUG and \c MESA_VERBOSE environment variables
1166 * for debug flags.
1167 *
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001168 * \param ctx the context to initialize
1169 * \param visual describes the visual attributes for this context
1170 * \param share_list points to context to share textures, display lists,
1171 * etc with, or NULL
1172 * \param driverFunctions table of device driver functions for this context
1173 * to use
1174 * \param driverContext pointer to driver-specific context data
jtgafb833d1999-08-19 00:55:39 +00001175 */
Brian Paul178a1c52000-04-22 01:05:00 +00001176GLboolean
Briand881a9c2006-12-20 09:31:07 -07001177_mesa_initialize_context(GLcontext *ctx,
1178 const GLvisual *visual,
1179 GLcontext *share_list,
1180 const struct dd_function_table *driverFunctions,
1181 void *driverContext)
jtgafb833d1999-08-19 00:55:39 +00001182{
Brian7cafaff2007-11-01 14:51:37 -06001183 /*ASSERT(driverContext);*/
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001184 assert(driverFunctions->NewTextureObject);
Keith Whitwell3e62d3a2005-03-22 14:27:10 +00001185 assert(driverFunctions->FreeTexImageData);
jtgafb833d1999-08-19 00:55:39 +00001186
Brian Paul4753d602002-06-15 02:38:15 +00001187 /* misc one-time initializations */
1188 one_time_init(ctx);
Brian Paul9a33a112002-06-13 04:28:29 +00001189
Brian Paulb1394fa2000-09-26 20:53:53 +00001190 ctx->Visual = *visual;
Brian Paul3f02f901999-11-24 18:48:30 +00001191 ctx->DrawBuffer = NULL;
1192 ctx->ReadBuffer = NULL;
Brian Paule4b23562005-05-04 20:11:35 +00001193 ctx->WinSysDrawBuffer = NULL;
1194 ctx->WinSysReadBuffer = NULL;
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00001195
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001196 /* Plug in driver functions and context pointer here.
1197 * This is important because when we call alloc_shared_state() below
1198 * we'll call ctx->Driver.NewTextureObject() to create the default
1199 * textures.
Brian Paula3f13702003-04-01 16:41:50 +00001200 */
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001201 ctx->Driver = *driverFunctions;
1202 ctx->DriverCtx = driverContext;
Brian Paula3f13702003-04-01 16:41:50 +00001203
jtgafb833d1999-08-19 00:55:39 +00001204 if (share_list) {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001205 /* share state with another context */
jtgafb833d1999-08-19 00:55:39 +00001206 ctx->Shared = share_list->Shared;
1207 }
1208 else {
Brian Paul5a2f32b2001-04-25 18:21:05 +00001209 /* allocate new, unshared state */
Brian Paula3f13702003-04-01 16:41:50 +00001210 if (!alloc_shared_state( ctx )) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001211 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001212 }
1213 }
Brian Paul9560f052000-01-31 23:11:39 +00001214 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001215 ctx->Shared->RefCount++;
Brian Paul9560f052000-01-31 23:11:39 +00001216 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
jtgafb833d1999-08-19 00:55:39 +00001217
Keith Whitwell6dc85572003-07-17 13:43:59 +00001218 if (!init_attrib_groups( ctx )) {
jtgafb833d1999-08-19 00:55:39 +00001219 free_shared_state(ctx, ctx->Shared);
Brian Paul4d053dd2000-01-14 04:45:47 +00001220 return GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +00001221 }
jtgafb833d1999-08-19 00:55:39 +00001222
Brian Paul21f69782004-11-27 05:05:32 +00001223 /* setup the API dispatch tables */
1224 ctx->Exec = alloc_dispatch_table();
1225 ctx->Save = alloc_dispatch_table();
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001226 if (!ctx->Exec || !ctx->Save) {
1227 free_shared_state(ctx, ctx->Shared);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001228 if (ctx->Exec)
Brian Paul21f69782004-11-27 05:05:32 +00001229 _mesa_free(ctx->Exec);
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001230 }
Brian Paulcd4d4f52008-06-17 16:56:32 -06001231#if FEATURE_dispatch
Brian Paul21f69782004-11-27 05:05:32 +00001232 _mesa_init_exec_table(ctx->Exec);
Brian Paulcd4d4f52008-06-17 16:56:32 -06001233#endif
Brian Paul3ab6bbe2000-02-12 17:26:15 +00001234 ctx->CurrentDispatch = ctx->Exec;
Keith Whitwell34a61c62008-09-21 19:29:15 -07001235#if FEATURE_dlist
Brian Paul21f69782004-11-27 05:05:32 +00001236 _mesa_init_dlist_table(ctx->Save);
Keith Whitwellae0eaf92003-11-24 15:23:18 +00001237 _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001238#endif
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001239 /* Neutral tnl module stuff */
Keith Whitwell6dc85572003-07-17 13:43:59 +00001240 _mesa_init_exec_vtxfmt( ctx );
Gareth Hughesd8aa0262001-03-11 18:49:11 +00001241 ctx->TnlModule.Current = NULL;
1242 ctx->TnlModule.SwapCount = 0;
Brian Paulb6bcae52001-01-23 23:39:36 +00001243
Brian3e45db62007-03-27 09:51:52 -06001244 ctx->FragmentProgram._MaintainTexEnvProgram
1245 = (_mesa_getenv("MESA_TEX_PROG") != NULL);
Brian3e45db62007-03-27 09:51:52 -06001246
Briana90046f2006-12-15 10:07:26 -07001247 ctx->VertexProgram._MaintainTnlProgram
1248 = (_mesa_getenv("MESA_TNL_PROG") != NULL);
Brian3e45db62007-03-27 09:51:52 -06001249 if (ctx->VertexProgram._MaintainTnlProgram) {
Briana90046f2006-12-15 10:07:26 -07001250 /* this is required... */
1251 ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
Brian3e45db62007-03-27 09:51:52 -06001252 }
Keith Whitwell47b29f52005-05-04 11:44:44 +00001253
Brian Paul6fd15dd2008-08-19 18:14:15 -06001254#ifdef FEATURE_extra_context_init
1255 _mesa_initialize_context_extra(ctx);
1256#endif
1257
Brian Paula96f8892005-09-13 01:19:29 +00001258 ctx->FirstTimeCurrent = GL_TRUE;
1259
Brian Paul4d053dd2000-01-14 04:45:47 +00001260 return GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +00001261}
1262
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001263
Brian Paulde4f4602003-07-03 02:15:06 +00001264/**
Brian Paul4d053dd2000-01-14 04:45:47 +00001265 * Allocate and initialize a GLcontext structure.
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001266 * Note that the driver needs to pass in its dd_function_table here since
1267 * we need to at least call driverFunctions->NewTextureObject to initialize
1268 * the rendering context.
Keith Whitwell6dc85572003-07-17 13:43:59 +00001269 *
1270 * \param visual a GLvisual pointer (we copy the struct contents)
1271 * \param share_list another context to share display lists with or NULL
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001272 * \param driverFunctions points to the dd_function_table into which the
1273 * driver has plugged in all its special functions.
1274 * \param driverCtx points to the device driver's private context state
Keith Whitwell6dc85572003-07-17 13:43:59 +00001275 *
1276 * \return pointer to a new __GLcontextRec or NULL if error.
Brian Paul4d053dd2000-01-14 04:45:47 +00001277 */
Brian Paul178a1c52000-04-22 01:05:00 +00001278GLcontext *
Briand881a9c2006-12-20 09:31:07 -07001279_mesa_create_context(const GLvisual *visual,
1280 GLcontext *share_list,
1281 const struct dd_function_table *driverFunctions,
1282 void *driverContext)
Brian Paul4d053dd2000-01-14 04:45:47 +00001283{
Brian Paul4753d602002-06-15 02:38:15 +00001284 GLcontext *ctx;
1285
1286 ASSERT(visual);
Brian7cafaff2007-11-01 14:51:37 -06001287 /*ASSERT(driverContext);*/
Brian Paul4753d602002-06-15 02:38:15 +00001288
Brian Paul3c634522002-10-24 23:57:19 +00001289 ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
Brian Paul4753d602002-06-15 02:38:15 +00001290 if (!ctx)
Brian Paul4d053dd2000-01-14 04:45:47 +00001291 return NULL;
Brian Paul4753d602002-06-15 02:38:15 +00001292
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001293 if (_mesa_initialize_context(ctx, visual, share_list,
1294 driverFunctions, driverContext)) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001295 return ctx;
1296 }
1297 else {
Brian Paul3c634522002-10-24 23:57:19 +00001298 _mesa_free(ctx);
Brian Paul4d053dd2000-01-14 04:45:47 +00001299 return NULL;
1300 }
1301}
1302
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001303
Keith Whitwell6dc85572003-07-17 13:43:59 +00001304/**
Brian Paul4d053dd2000-01-14 04:45:47 +00001305 * Free the data associated with the given context.
Keith Whitwell6dc85572003-07-17 13:43:59 +00001306 *
1307 * But doesn't free the GLcontext struct itself.
1308 *
1309 * \sa _mesa_initialize_context() and init_attrib_groups().
Brian Paul4d053dd2000-01-14 04:45:47 +00001310 */
Brian Paul178a1c52000-04-22 01:05:00 +00001311void
Brian Paulb1394fa2000-09-26 20:53:53 +00001312_mesa_free_context_data( GLcontext *ctx )
Brian Paul4d053dd2000-01-14 04:45:47 +00001313{
José Fonseca8bbb6b32009-03-06 14:02:42 +00001314 GLint RefCount;
1315
Briandc732172007-08-14 11:56:59 +01001316 if (!_mesa_get_current_context()){
1317 /* No current context, but we may need one in order to delete
1318 * texture objs, etc. So temporarily bind the context now.
1319 */
1320 _mesa_make_current(ctx, NULL, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001321 }
Briandc732172007-08-14 11:56:59 +01001322
1323 /* unreference WinSysDraw/Read buffers */
Brian Pauld5229442009-02-09 08:30:55 -07001324 _mesa_reference_framebuffer(&ctx->WinSysDrawBuffer, NULL);
1325 _mesa_reference_framebuffer(&ctx->WinSysReadBuffer, NULL);
1326 _mesa_reference_framebuffer(&ctx->DrawBuffer, NULL);
1327 _mesa_reference_framebuffer(&ctx->ReadBuffer, NULL);
Brian Paul4d053dd2000-01-14 04:45:47 +00001328
Briandf43fb62008-05-06 23:08:51 -06001329 _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current, NULL);
1330 _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current, NULL);
1331 _mesa_reference_vertprog(ctx, &ctx->VertexProgram._TnlProgram, NULL);
1332
1333 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current, NULL);
1334 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, NULL);
1335 _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._TexEnvProgram, NULL);
1336
Alan Hourihane13e7e4b2008-09-19 14:55:49 +01001337#if FEATURE_attrib_stack
Brian145d7622007-08-16 10:05:00 +01001338 _mesa_free_attrib_data(ctx);
Alan Hourihane13e7e4b2008-09-19 14:55:49 +01001339#endif
Keith Whitwell6dc85572003-07-17 13:43:59 +00001340 _mesa_free_lighting_data( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001341#if FEATURE_evaluators
Keith Whitwell6dc85572003-07-17 13:43:59 +00001342 _mesa_free_eval_data( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001343#endif
Keith Whitwell6dc85572003-07-17 13:43:59 +00001344 _mesa_free_texture_data( ctx );
1345 _mesa_free_matrix_data( ctx );
1346 _mesa_free_viewport_data( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001347#if FEATURE_colortable
Brian Paul05944c02003-07-22 03:51:46 +00001348 _mesa_free_colortables_data( ctx );
Keith Whitwell34a61c62008-09-21 19:29:15 -07001349#endif
Brian Paul21841f02004-08-14 14:28:11 +00001350 _mesa_free_program_data(ctx);
Brian935f93f2007-03-24 16:20:02 -06001351 _mesa_free_shader_state(ctx);
Brian Paul4e3ae762008-06-13 13:56:53 -06001352#if FEATURE_ARB_occlusion_query
Brian Paul4fb99502005-09-02 13:42:49 +00001353 _mesa_free_query_data(ctx);
Brian Paul4e3ae762008-06-13 13:56:53 -06001354#endif
Brian Paul21841f02004-08-14 14:28:11 +00001355
1356#if FEATURE_ARB_vertex_buffer_object
1357 _mesa_delete_buffer_object(ctx, ctx->Array.NullBufferObj);
Brian Paul8dfc5b92002-10-16 17:57:51 +00001358#endif
Brian Paulc04bb512006-07-11 21:56:43 +00001359 _mesa_delete_array_object(ctx, ctx->Array.DefaultArrayObj);
Brian Paulfd284452001-07-19 15:54:34 +00001360
Brian Paul65a66f52004-11-27 22:47:59 +00001361 /* free dispatch tables */
1362 _mesa_free(ctx->Exec);
1363 _mesa_free(ctx->Save);
1364
Brian Paul30f51ae2001-12-18 04:06:44 +00001365 /* Shared context state (display lists, textures, etc) */
Brian Paul9560f052000-01-31 23:11:39 +00001366 _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
José Fonseca8bbb6b32009-03-06 14:02:42 +00001367 RefCount = --ctx->Shared->RefCount;
Brian Paul9560f052000-01-31 23:11:39 +00001368 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
José Fonseca8bbb6b32009-03-06 14:02:42 +00001369 assert(RefCount >= 0);
1370 if (RefCount == 0) {
Brian Paul4d053dd2000-01-14 04:45:47 +00001371 /* free shared state */
1372 free_shared_state( ctx, ctx->Shared );
1373 }
1374
Brian Paul702ca202003-07-18 15:22:16 +00001375 if (ctx->Extensions.String)
Brian Paulc7e164f2006-06-30 15:44:30 +00001376 _mesa_free((void *) ctx->Extensions.String);
Briandc732172007-08-14 11:56:59 +01001377
1378 /* unbind the context if it's currently bound */
1379 if (ctx == _mesa_get_current_context()) {
1380 _mesa_make_current(NULL, NULL, NULL);
1381 }
Brian Paul4d053dd2000-01-14 04:45:47 +00001382}
1383
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001384
Keith Whitwell6dc85572003-07-17 13:43:59 +00001385/**
Brian Paul4d053dd2000-01-14 04:45:47 +00001386 * Destroy a GLcontext structure.
Keith Whitwell6dc85572003-07-17 13:43:59 +00001387 *
1388 * \param ctx GL context.
1389 *
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001390 * Calls _mesa_free_context_data() and frees the GLcontext structure itself.
jtgafb833d1999-08-19 00:55:39 +00001391 */
Brian Paul178a1c52000-04-22 01:05:00 +00001392void
Brian Paulb1394fa2000-09-26 20:53:53 +00001393_mesa_destroy_context( GLcontext *ctx )
jtgafb833d1999-08-19 00:55:39 +00001394{
1395 if (ctx) {
Brian Paulb1394fa2000-09-26 20:53:53 +00001396 _mesa_free_context_data(ctx);
Brian Paulc7e164f2006-06-30 15:44:30 +00001397 _mesa_free( (void *) ctx );
jtgafb833d1999-08-19 00:55:39 +00001398 }
1399}
1400
Brian Pauld3fd7ba2004-01-20 02:49:27 +00001401
Keith Whitwell6dc85572003-07-17 13:43:59 +00001402#if _HAVE_FULL_GL
1403/**
jtgafb833d1999-08-19 00:55:39 +00001404 * Copy attribute groups from one context to another.
Keith Whitwell6dc85572003-07-17 13:43:59 +00001405 *
1406 * \param src source context
1407 * \param dst destination context
1408 * \param mask bitwise OR of GL_*_BIT flags
1409 *
1410 * According to the bits specified in \p mask, copies the corresponding
Jose Fonseca375457b2004-09-09 22:23:24 +00001411 * attributes from \p src into \p dst. For many of the attributes a simple \c
Keith Whitwell6dc85572003-07-17 13:43:59 +00001412 * memcpy is not enough due to the existence of internal pointers in their data
1413 * structures.
jtgafb833d1999-08-19 00:55:39 +00001414 */
Brian Paul178a1c52000-04-22 01:05:00 +00001415void
Brian Paulb1394fa2000-09-26 20:53:53 +00001416_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
jtgafb833d1999-08-19 00:55:39 +00001417{
1418 if (mask & GL_ACCUM_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001419 /* OK to memcpy */
1420 dst->Accum = src->Accum;
jtgafb833d1999-08-19 00:55:39 +00001421 }
1422 if (mask & GL_COLOR_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001423 /* OK to memcpy */
1424 dst->Color = src->Color;
jtgafb833d1999-08-19 00:55:39 +00001425 }
1426 if (mask & GL_CURRENT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001427 /* OK to memcpy */
1428 dst->Current = src->Current;
jtgafb833d1999-08-19 00:55:39 +00001429 }
1430 if (mask & GL_DEPTH_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001431 /* OK to memcpy */
1432 dst->Depth = src->Depth;
jtgafb833d1999-08-19 00:55:39 +00001433 }
1434 if (mask & GL_ENABLE_BIT) {
1435 /* no op */
1436 }
1437 if (mask & GL_EVAL_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001438 /* OK to memcpy */
1439 dst->Eval = src->Eval;
jtgafb833d1999-08-19 00:55:39 +00001440 }
1441 if (mask & GL_FOG_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001442 /* OK to memcpy */
1443 dst->Fog = src->Fog;
jtgafb833d1999-08-19 00:55:39 +00001444 }
1445 if (mask & GL_HINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001446 /* OK to memcpy */
1447 dst->Hint = src->Hint;
jtgafb833d1999-08-19 00:55:39 +00001448 }
1449 if (mask & GL_LIGHTING_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001450 GLuint i;
1451 /* begin with memcpy */
Brian Paul2aabdc72006-02-24 18:19:11 +00001452 dst->Light = src->Light;
Brian Paul85d81602002-06-17 23:36:31 +00001453 /* fixup linked lists to prevent pointer insanity */
1454 make_empty_list( &(dst->Light.EnabledList) );
1455 for (i = 0; i < MAX_LIGHTS; i++) {
1456 if (dst->Light.Light[i].Enabled) {
1457 insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
1458 }
1459 }
jtgafb833d1999-08-19 00:55:39 +00001460 }
1461 if (mask & GL_LINE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001462 /* OK to memcpy */
1463 dst->Line = src->Line;
jtgafb833d1999-08-19 00:55:39 +00001464 }
1465 if (mask & GL_LIST_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001466 /* OK to memcpy */
1467 dst->List = src->List;
jtgafb833d1999-08-19 00:55:39 +00001468 }
1469 if (mask & GL_PIXEL_MODE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001470 /* OK to memcpy */
1471 dst->Pixel = src->Pixel;
jtgafb833d1999-08-19 00:55:39 +00001472 }
1473 if (mask & GL_POINT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001474 /* OK to memcpy */
1475 dst->Point = src->Point;
jtgafb833d1999-08-19 00:55:39 +00001476 }
1477 if (mask & GL_POLYGON_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001478 /* OK to memcpy */
1479 dst->Polygon = src->Polygon;
jtgafb833d1999-08-19 00:55:39 +00001480 }
1481 if (mask & GL_POLYGON_STIPPLE_BIT) {
1482 /* Use loop instead of MEMCPY due to problem with Portland Group's
1483 * C compiler. Reported by John Stone.
1484 */
Brian Paul85d81602002-06-17 23:36:31 +00001485 GLuint i;
1486 for (i = 0; i < 32; i++) {
jtgafb833d1999-08-19 00:55:39 +00001487 dst->PolygonStipple[i] = src->PolygonStipple[i];
1488 }
1489 }
1490 if (mask & GL_SCISSOR_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001491 /* OK to memcpy */
1492 dst->Scissor = src->Scissor;
jtgafb833d1999-08-19 00:55:39 +00001493 }
1494 if (mask & GL_STENCIL_BUFFER_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001495 /* OK to memcpy */
1496 dst->Stencil = src->Stencil;
jtgafb833d1999-08-19 00:55:39 +00001497 }
1498 if (mask & GL_TEXTURE_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001499 /* Cannot memcpy because of pointers */
1500 _mesa_copy_texture_state(src, dst);
jtgafb833d1999-08-19 00:55:39 +00001501 }
1502 if (mask & GL_TRANSFORM_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001503 /* OK to memcpy */
1504 dst->Transform = src->Transform;
jtgafb833d1999-08-19 00:55:39 +00001505 }
1506 if (mask & GL_VIEWPORT_BIT) {
Brian Paul85d81602002-06-17 23:36:31 +00001507 /* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
1508 dst->Viewport.X = src->Viewport.X;
1509 dst->Viewport.Y = src->Viewport.Y;
1510 dst->Viewport.Width = src->Viewport.Width;
1511 dst->Viewport.Height = src->Viewport.Height;
1512 dst->Viewport.Near = src->Viewport.Near;
1513 dst->Viewport.Far = src->Viewport.Far;
1514 _math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
jtgafb833d1999-08-19 00:55:39 +00001515 }
Brian Paul85d81602002-06-17 23:36:31 +00001516
Keith Whitwella96308c2000-10-30 13:31:59 +00001517 /* XXX FIXME: Call callbacks?
1518 */
1519 dst->NewState = _NEW_ALL;
jtgafb833d1999-08-19 00:55:39 +00001520}
Keith Whitwell23caf202000-11-16 21:05:34 +00001521#endif
Keith Whitwell23caf202000-11-16 21:05:34 +00001522
1523
Brian Paulb1d53d92003-06-11 18:48:19 +00001524/**
1525 * Check if the given context can render into the given framebuffer
1526 * by checking visual attributes.
Brian Paulca007cb2006-03-07 03:01:26 +00001527 *
Brianee170f22007-06-08 14:12:27 -06001528 * Most of these tests could go away because Mesa is now pretty flexible
1529 * in terms of mixing rendering contexts with framebuffers. As long
1530 * as RGB vs. CI mode agree, we're probably good.
Brian Paulca007cb2006-03-07 03:01:26 +00001531 *
Brian Paulb1d53d92003-06-11 18:48:19 +00001532 * \return GL_TRUE if compatible, GL_FALSE otherwise.
1533 */
1534static GLboolean
1535check_compatible(const GLcontext *ctx, const GLframebuffer *buffer)
1536{
1537 const GLvisual *ctxvis = &ctx->Visual;
1538 const GLvisual *bufvis = &buffer->Visual;
1539
1540 if (ctxvis == bufvis)
1541 return GL_TRUE;
1542
1543 if (ctxvis->rgbMode != bufvis->rgbMode)
1544 return GL_FALSE;
Brian Pauld75963d2006-03-07 02:57:04 +00001545#if 0
1546 /* disabling this fixes the fgl_glxgears pbuffer demo */
Brian Paulb1d53d92003-06-11 18:48:19 +00001547 if (ctxvis->doubleBufferMode && !bufvis->doubleBufferMode)
1548 return GL_FALSE;
Brian Pauld75963d2006-03-07 02:57:04 +00001549#endif
Brian Paulb1d53d92003-06-11 18:48:19 +00001550 if (ctxvis->stereoMode && !bufvis->stereoMode)
1551 return GL_FALSE;
1552 if (ctxvis->haveAccumBuffer && !bufvis->haveAccumBuffer)
1553 return GL_FALSE;
1554 if (ctxvis->haveDepthBuffer && !bufvis->haveDepthBuffer)
1555 return GL_FALSE;
1556 if (ctxvis->haveStencilBuffer && !bufvis->haveStencilBuffer)
1557 return GL_FALSE;
1558 if (ctxvis->redMask && ctxvis->redMask != bufvis->redMask)
1559 return GL_FALSE;
1560 if (ctxvis->greenMask && ctxvis->greenMask != bufvis->greenMask)
1561 return GL_FALSE;
1562 if (ctxvis->blueMask && ctxvis->blueMask != bufvis->blueMask)
1563 return GL_FALSE;
Brianee170f22007-06-08 14:12:27 -06001564#if 0
1565 /* disabled (see bug 11161) */
Brian Paulb1d53d92003-06-11 18:48:19 +00001566 if (ctxvis->depthBits && ctxvis->depthBits != bufvis->depthBits)
1567 return GL_FALSE;
Brianee170f22007-06-08 14:12:27 -06001568#endif
Brian Paulb1d53d92003-06-11 18:48:19 +00001569 if (ctxvis->stencilBits && ctxvis->stencilBits != bufvis->stencilBits)
1570 return GL_FALSE;
1571
1572 return GL_TRUE;
1573}
1574
1575
Keith Whitwell6dc85572003-07-17 13:43:59 +00001576/**
Brian Paula702bbf2005-09-14 03:11:36 +00001577 * Do one-time initialization for the given framebuffer. Specifically,
1578 * ask the driver for the window's current size and update the framebuffer
1579 * object to match.
1580 * Really, the device driver should totally take care of this.
1581 */
1582static void
1583initialize_framebuffer_size(GLcontext *ctx, GLframebuffer *fb)
1584{
1585 GLuint width, height;
Brian Paul55e42e52006-10-17 17:43:47 +00001586 if (ctx->Driver.GetBufferSize) {
1587 ctx->Driver.GetBufferSize(fb, &width, &height);
1588 if (ctx->Driver.ResizeBuffers)
1589 ctx->Driver.ResizeBuffers(ctx, fb, width, height);
1590 fb->Initialized = GL_TRUE;
1591 }
Brian Paula702bbf2005-09-14 03:11:36 +00001592}
1593
1594
1595/**
1596 * Bind the given context to the given drawBuffer and readBuffer and
1597 * make it the current context for the calling thread.
1598 * We'll render into the drawBuffer and read pixels from the
1599 * readBuffer (i.e. glRead/CopyPixels, glCopyTexImage, etc).
Keith Whitwell6dc85572003-07-17 13:43:59 +00001600 *
Brian Paula702bbf2005-09-14 03:11:36 +00001601 * We check that the context's and framebuffer's visuals are compatible
1602 * and return immediately if they're not.
Keith Whitwell6dc85572003-07-17 13:43:59 +00001603 *
Brian Paula702bbf2005-09-14 03:11:36 +00001604 * \param newCtx the new GL context. If NULL then there will be no current GL
1605 * context.
1606 * \param drawBuffer the drawing framebuffer
1607 * \param readBuffer the reading framebuffer
Brian Paul00037781999-12-17 14:52:35 +00001608 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001609void
Brian Paule4b23562005-05-04 20:11:35 +00001610_mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
1611 GLframebuffer *readBuffer )
Brian Paul00037781999-12-17 14:52:35 +00001612{
Keith Whitwell5c728372005-05-12 10:22:29 +00001613 if (MESA_VERBOSE & VERBOSE_API)
Brian Paule4b23562005-05-04 20:11:35 +00001614 _mesa_debug(newCtx, "_mesa_make_current()\n");
Brian Paul00037781999-12-17 14:52:35 +00001615
Brian Paulbe3602d2001-02-28 00:27:48 +00001616 /* Check that the context's and framebuffer's visuals are compatible.
Brian Paulbe3602d2001-02-28 00:27:48 +00001617 */
Brian Paulf1038f82006-03-20 15:20:57 +00001618 if (newCtx && drawBuffer && newCtx->WinSysDrawBuffer != drawBuffer) {
Brian Pauld75963d2006-03-07 02:57:04 +00001619 if (!check_compatible(newCtx, drawBuffer)) {
1620 _mesa_warning(newCtx,
1621 "MakeCurrent: incompatible visuals for context and drawbuffer");
Brian Paulb1d53d92003-06-11 18:48:19 +00001622 return;
Brian Pauld75963d2006-03-07 02:57:04 +00001623 }
Brian Paulb1d53d92003-06-11 18:48:19 +00001624 }
Brian Paulf1038f82006-03-20 15:20:57 +00001625 if (newCtx && readBuffer && newCtx->WinSysReadBuffer != readBuffer) {
Brian Pauld75963d2006-03-07 02:57:04 +00001626 if (!check_compatible(newCtx, readBuffer)) {
1627 _mesa_warning(newCtx,
1628 "MakeCurrent: incompatible visuals for context and readbuffer");
Brian Paulb1d53d92003-06-11 18:48:19 +00001629 return;
Brian Pauld75963d2006-03-07 02:57:04 +00001630 }
Brian Paulbe3602d2001-02-28 00:27:48 +00001631 }
1632
Brian Paulc6c0f942006-03-16 18:05:25 +00001633 /* We used to call _glapi_check_multithread() here. Now do it in drivers */
Brian Paulf9b97d92000-01-28 20:17:42 +00001634 _glapi_set_context((void *) newCtx);
Brian Paulb1394fa2000-09-26 20:53:53 +00001635 ASSERT(_mesa_get_current_context() == newCtx);
Keith Whitwell23caf202000-11-16 21:05:34 +00001636
Keith Whitwell23caf202000-11-16 21:05:34 +00001637 if (!newCtx) {
Brian Paul00037781999-12-17 14:52:35 +00001638 _glapi_set_dispatch(NULL); /* none current */
1639 }
Keith Whitwell23caf202000-11-16 21:05:34 +00001640 else {
1641 _glapi_set_dispatch(newCtx->CurrentDispatch);
Brian Paul00037781999-12-17 14:52:35 +00001642
Keith Whitwell23caf202000-11-16 21:05:34 +00001643 if (drawBuffer && readBuffer) {
1644 /* TODO: check if newCtx and buffer's visual match??? */
Brian Paule4b23562005-05-04 20:11:35 +00001645
Brian Paule4b23562005-05-04 20:11:35 +00001646 ASSERT(drawBuffer->Name == 0);
1647 ASSERT(readBuffer->Name == 0);
Briana510bc32007-03-06 10:07:59 -07001648 _mesa_reference_framebuffer(&newCtx->WinSysDrawBuffer, drawBuffer);
1649 _mesa_reference_framebuffer(&newCtx->WinSysReadBuffer, readBuffer);
Brian Paulf1038f82006-03-20 15:20:57 +00001650
1651 /*
1652 * Only set the context's Draw/ReadBuffer fields if they're NULL
1653 * or not bound to a user-created FBO.
1654 */
Brian Paule4b23562005-05-04 20:11:35 +00001655 if (!newCtx->DrawBuffer || newCtx->DrawBuffer->Name == 0) {
Keith Whitwell0397b2b2008-09-11 16:05:15 +01001656 /* KW: merge conflict here, revisit.
1657 */
1658 /* fix up the fb fields - these will end up wrong otherwise
1659 * if the DRIdrawable changes, and everything relies on them.
1660 * This is a bit messy (same as needed in _mesa_BindFramebufferEXT)
1661 */
José Fonseca53174af2008-05-31 18:14:09 +09001662 unsigned int i;
Roland Scheideggercbfe29c2007-07-16 18:21:36 +02001663 GLenum buffers[MAX_DRAW_BUFFERS];
Alan Hourihanee97bedb2008-05-01 14:54:56 +01001664
Roland Scheideggercbfe29c2007-07-16 18:21:36 +02001665 _mesa_reference_framebuffer(&newCtx->DrawBuffer, drawBuffer);
Alan Hourihanee97bedb2008-05-01 14:54:56 +01001666
Roland Scheideggercbfe29c2007-07-16 18:21:36 +02001667 for(i = 0; i < newCtx->Const.MaxDrawBuffers; i++) {
1668 buffers[i] = newCtx->Color.DrawBuffer[i];
1669 }
Alan Hourihanee97bedb2008-05-01 14:54:56 +01001670
Roland Scheideggercbfe29c2007-07-16 18:21:36 +02001671 _mesa_drawbuffers(newCtx, newCtx->Const.MaxDrawBuffers, buffers, NULL);
Brian Paulf1038f82006-03-20 15:20:57 +00001672 }
1673 if (!newCtx->ReadBuffer || newCtx->ReadBuffer->Name == 0) {
Briana510bc32007-03-06 10:07:59 -07001674 _mesa_reference_framebuffer(&newCtx->ReadBuffer, readBuffer);
Brian Paule4b23562005-05-04 20:11:35 +00001675 }
Brian Paulbb5c84f2005-07-01 01:22:25 +00001676
Brian32d86eb2007-08-16 18:52:48 +01001677 /* XXX only set this flag if we're really changing the draw/read
1678 * framebuffer bindings.
1679 */
Keith Whitwell23caf202000-11-16 21:05:34 +00001680 newCtx->NewState |= _NEW_BUFFERS;
Brian Paul10d7f542002-06-17 23:38:14 +00001681
Brian Paul4d4add02006-10-15 19:26:43 +00001682#if 1
1683 /* We want to get rid of these lines: */
1684
Keith Whitwell6dc85572003-07-17 13:43:59 +00001685#if _HAVE_FULL_GL
Brian Paul65a66f52004-11-27 22:47:59 +00001686 if (!drawBuffer->Initialized) {
Brian Paula702bbf2005-09-14 03:11:36 +00001687 initialize_framebuffer_size(newCtx, drawBuffer);
Brian Paul10d7f542002-06-17 23:38:14 +00001688 }
Brian Paul65a66f52004-11-27 22:47:59 +00001689 if (readBuffer != drawBuffer && !readBuffer->Initialized) {
Brian Paula702bbf2005-09-14 03:11:36 +00001690 initialize_framebuffer_size(newCtx, readBuffer);
Brian Paul10d7f542002-06-17 23:38:14 +00001691 }
Keith Whitwellf9bfdb12006-09-22 11:36:30 +00001692
1693 _mesa_resizebuffers(newCtx);
Keith Whitwell6dc85572003-07-17 13:43:59 +00001694#endif
Brian Paul4d4add02006-10-15 19:26:43 +00001695
1696#else
1697 /* We want the drawBuffer and readBuffer to be initialized by
1698 * the driver.
1699 * This generally means the Width and Height match the actual
1700 * window size and the renderbuffers (both hardware and software
1701 * based) are allocated to match. The later can generally be
1702 * done with a call to _mesa_resize_framebuffer().
1703 *
1704 * It's theoretically possible for a buffer to have zero width
1705 * or height, but for now, assert check that the driver did what's
1706 * expected of it.
1707 */
1708 ASSERT(drawBuffer->Width > 0);
1709 ASSERT(drawBuffer->Height > 0);
1710#endif
1711
Brian Paul65a66f52004-11-27 22:47:59 +00001712 if (newCtx->FirstTimeCurrent) {
1713 /* set initial viewport and scissor size now */
Brian Paula702bbf2005-09-14 03:11:36 +00001714 _mesa_set_viewport(newCtx, 0, 0,
1715 drawBuffer->Width, drawBuffer->Height);
Brian Pauldb79d2a2006-03-29 18:41:19 +00001716 _mesa_set_scissor(newCtx, 0, 0,
1717 drawBuffer->Width, drawBuffer->Height );
Brian Paul5e2e96b2006-05-15 15:26:04 +00001718 check_context_limits(newCtx);
Brian Paul65a66f52004-11-27 22:47:59 +00001719 }
Brian Paul00037781999-12-17 14:52:35 +00001720 }
Keith Whitwell23caf202000-11-16 21:05:34 +00001721
Keith Whitwell23caf202000-11-16 21:05:34 +00001722 /* We can use this to help debug user's problems. Tell them to set
1723 * the MESA_INFO env variable before running their app. Then the
1724 * first time each context is made current we'll print some useful
1725 * information.
1726 */
1727 if (newCtx->FirstTimeCurrent) {
Brian Paul3c634522002-10-24 23:57:19 +00001728 if (_mesa_getenv("MESA_INFO")) {
Keith Whitwell6dc85572003-07-17 13:43:59 +00001729 _mesa_print_info();
Keith Whitwell23caf202000-11-16 21:05:34 +00001730 }
1731 newCtx->FirstTimeCurrent = GL_FALSE;
1732 }
Brian Paul00037781999-12-17 14:52:35 +00001733 }
1734}
1735
Brian Paul635ee2d2005-04-15 17:25:07 +00001736
1737/**
1738 * Make context 'ctx' share the display lists, textures and programs
1739 * that are associated with 'ctxToShare'.
1740 * Any display lists, textures or programs associated with 'ctx' will
1741 * be deleted if nobody else is sharing them.
1742 */
1743GLboolean
1744_mesa_share_state(GLcontext *ctx, GLcontext *ctxToShare)
1745{
1746 if (ctx && ctxToShare && ctx->Shared && ctxToShare->Shared) {
Brian4b654d42007-08-23 08:53:43 +01001747 struct gl_shared_state *oldSharedState = ctx->Shared;
1748
Brian Paul635ee2d2005-04-15 17:25:07 +00001749 ctx->Shared = ctxToShare->Shared;
1750 ctx->Shared->RefCount++;
Brian4b654d42007-08-23 08:53:43 +01001751
1752 update_default_objects(ctx);
1753
1754 oldSharedState->RefCount--;
1755 if (oldSharedState->RefCount == 0) {
1756 free_shared_state(ctx, oldSharedState);
1757 }
1758
Brian Paul635ee2d2005-04-15 17:25:07 +00001759 return GL_TRUE;
1760 }
1761 else {
1762 return GL_FALSE;
1763 }
1764}
1765
1766
1767
Keith Whitwell6dc85572003-07-17 13:43:59 +00001768/**
Briand881a9c2006-12-20 09:31:07 -07001769 * \return pointer to the current GL context for this thread.
Keith Whitwell6dc85572003-07-17 13:43:59 +00001770 *
1771 * Calls _glapi_get_context(). This isn't the fastest way to get the current
Briand881a9c2006-12-20 09:31:07 -07001772 * context. If you need speed, see the #GET_CURRENT_CONTEXT macro in
1773 * context.h.
Brian Paul00037781999-12-17 14:52:35 +00001774 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001775GLcontext *
1776_mesa_get_current_context( void )
Brian Paul00037781999-12-17 14:52:35 +00001777{
Brian Paulf9b97d92000-01-28 20:17:42 +00001778 return (GLcontext *) _glapi_get_context();
Brian Paul00037781999-12-17 14:52:35 +00001779}
1780
Briand881a9c2006-12-20 09:31:07 -07001781
Keith Whitwell6dc85572003-07-17 13:43:59 +00001782/**
1783 * Get context's current API dispatch table.
1784 *
1785 * It'll either be the immediate-mode execute dispatcher or the display list
1786 * compile dispatcher.
1787 *
1788 * \param ctx GL context.
1789 *
1790 * \return pointer to dispatch_table.
1791 *
1792 * Simply returns __GLcontextRec::CurrentDispatch.
Brian Paulfbd8f211999-11-11 01:22:25 +00001793 */
1794struct _glapi_table *
1795_mesa_get_dispatch(GLcontext *ctx)
1796{
1797 return ctx->CurrentDispatch;
1798}
1799
Keith Whitwell6dc85572003-07-17 13:43:59 +00001800/*@}*/
Brian Paulfbd8f211999-11-11 01:22:25 +00001801
1802
jtgafb833d1999-08-19 00:55:39 +00001803/**********************************************************************/
Keith Whitwell6dc85572003-07-17 13:43:59 +00001804/** \name Miscellaneous functions */
jtgafb833d1999-08-19 00:55:39 +00001805/**********************************************************************/
Keith Whitwell6dc85572003-07-17 13:43:59 +00001806/*@{*/
jtgafb833d1999-08-19 00:55:39 +00001807
Keith Whitwell6dc85572003-07-17 13:43:59 +00001808/**
1809 * Record an error.
1810 *
1811 * \param ctx GL context.
1812 * \param error error code.
1813 *
1814 * Records the given error code and call the driver's dd_function_table::Error
1815 * function if defined.
1816 *
1817 * \sa
Brian Paul4e9676f2002-06-29 19:48:15 +00001818 * This is called via _mesa_error().
jtgafb833d1999-08-19 00:55:39 +00001819 */
Brian Paulb1394fa2000-09-26 20:53:53 +00001820void
Briand881a9c2006-12-20 09:31:07 -07001821_mesa_record_error(GLcontext *ctx, GLenum error)
jtgafb833d1999-08-19 00:55:39 +00001822{
Brian Paul18a285a2002-03-16 00:53:15 +00001823 if (!ctx)
1824 return;
1825
Brian Paul7eb06032000-07-14 04:13:40 +00001826 if (ctx->ErrorValue == GL_NO_ERROR) {
jtgafb833d1999-08-19 00:55:39 +00001827 ctx->ErrorValue = error;
1828 }
1829
1830 /* Call device driver's error handler, if any. This is used on the Mac. */
1831 if (ctx->Driver.Error) {
Briand881a9c2006-12-20 09:31:07 -07001832 ctx->Driver.Error(ctx);
jtgafb833d1999-08-19 00:55:39 +00001833 }
1834}
1835
Briand881a9c2006-12-20 09:31:07 -07001836
Keith Whitwell6dc85572003-07-17 13:43:59 +00001837/**
1838 * Execute glFinish().
1839 *
1840 * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1841 * dd_function_table::Finish driver callback, if not NULL.
1842 */
Kendall Bennettc40d1dd2003-10-21 22:22:17 +00001843void GLAPIENTRY
Briand881a9c2006-12-20 09:31:07 -07001844_mesa_Finish(void)
jtgafb833d1999-08-19 00:55:39 +00001845{
Brian Paulfa9df402000-02-02 19:16:46 +00001846 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00001847 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00001848 if (ctx->Driver.Finish) {
Briand881a9c2006-12-20 09:31:07 -07001849 ctx->Driver.Finish(ctx);
jtgafb833d1999-08-19 00:55:39 +00001850 }
1851}
1852
Briand881a9c2006-12-20 09:31:07 -07001853
Keith Whitwell6dc85572003-07-17 13:43:59 +00001854/**
1855 * Execute glFlush().
1856 *
1857 * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1858 * dd_function_table::Flush driver callback, if not NULL.
1859 */
Kendall Bennettc40d1dd2003-10-21 22:22:17 +00001860void GLAPIENTRY
Briand881a9c2006-12-20 09:31:07 -07001861_mesa_Flush(void)
jtgafb833d1999-08-19 00:55:39 +00001862{
Brian Paulfa9df402000-02-02 19:16:46 +00001863 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00001864 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
Brian Paulfa9df402000-02-02 19:16:46 +00001865 if (ctx->Driver.Flush) {
Briand881a9c2006-12-20 09:31:07 -07001866 ctx->Driver.Flush(ctx);
jtgafb833d1999-08-19 00:55:39 +00001867 }
jtgafb833d1999-08-19 00:55:39 +00001868}
Brian Paul48c6a6e2000-09-08 21:28:04 +00001869
1870
Keith Whitwell6dc85572003-07-17 13:43:59 +00001871/*@}*/