3
* Mesa context/visual/framebuffer management functions.
8
* Mesa 3-D graphics library
11
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
13
* Permission is hereby granted, free of charge, to any person obtaining a
14
* copy of this software and associated documentation files (the "Software"),
15
* to deal in the Software without restriction, including without limitation
16
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
17
* and/or sell copies of the Software, and to permit persons to whom the
18
* Software is furnished to do so, subject to the following conditions:
20
* The above copyright notice and this permission notice shall be included
21
* in all copies or substantial portions of the Software.
23
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
27
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
28
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33
* \mainpage Mesa Main Module
35
* \section MainIntroduction Introduction
37
* The Mesa Main module consists of all the files in the main/ directory.
38
* Among the features of this module are:
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>
47
* Other modules are responsible for API dispatch, vertex transformation,
48
* point/line/triangle setup, rasterization, vertex array caching,
49
* vertex/fragment programs/shaders, etc.
52
* \section AboutDoxygen About Doxygen
54
* If you're viewing this information as Doxygen-generated HTML you'll
55
* see the documentation index at the top of this page.
57
* The first line lists the Mesa source code modules.
58
* The second line lists the indexes available for viewing the documentation
61
* Selecting the <b>Main page</b> link will display a summary of the module
64
* Selecting <b>Data Structures</b> will list all C structures.
66
* Selecting the <b>File List</b> link will list all the source files in
68
* Selecting a filename will show a list of all functions defined in that file.
70
* Selecting the <b>Data Fields</b> link will display a list of all
71
* documented structure members.
73
* Selecting the <b>Globals</b> link will display a list
74
* of all functions, structures, global variables and macros in the module.
86
#include "bufferobj.h"
94
#include "extensions.h"
98
#include "framebuffer.h"
100
#include "glthread.h"
101
#include "glapioffsets.h"
102
#include "histogram.h"
105
#include "atifragshader.h"
113
#if FEATURE_NV_vertex_program || FEATURE_NV_fragment_program
116
#include "queryobj.h"
118
#include "simple_list.h"
121
#include "texcompress.h"
122
#include "teximage.h"
124
#include "texstate.h"
130
#include "math/m_translate.h"
131
#include "math/m_matrix.h"
132
#include "math/m_xform.h"
133
#include "math/mathmod.h"
135
#include "shader_api.h"
138
#include "sparc/sparc.h"
142
int MESA_VERBOSE = 0;
145
#ifndef MESA_DEBUG_FLAGS
146
int MESA_DEBUG_FLAGS = 0;
150
/* ubyte -> float conversion */
151
GLfloat _mesa_ubyte_to_float_color_tab[256];
154
free_shared_state( GLcontext *ctx, struct gl_shared_state *ss );
158
* Swap buffers notification callback.
160
* \param gc GL context.
162
* Called by window system just before swapping buffers.
163
* We have to finish any pending rendering.
166
_mesa_notifySwapBuffers(__GLcontext *gc)
168
FLUSH_VERTICES( gc, 0 );
172
/**********************************************************************/
173
/** \name GL Visual allocation/destruction */
174
/**********************************************************************/
178
* Allocates a GLvisual structure and initializes it via
179
* _mesa_initialize_visual().
181
* \param rgbFlag GL_TRUE for RGB(A) mode, GL_FALSE for Color Index mode.
182
* \param dbFlag double buffering
183
* \param stereoFlag stereo buffer
184
* \param depthBits requested bits per depth buffer value. Any value in [0, 32]
185
* is acceptable but the actual depth type will be GLushort or GLuint as
187
* \param stencilBits requested minimum bits per stencil buffer value
188
* \param accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits number of bits per color component in accum buffer.
189
* \param indexBits number of bits per pixel if \p rgbFlag is GL_FALSE
190
* \param redBits number of bits per color component in frame buffer for RGB(A)
191
* mode. We always use 8 in core Mesa though.
192
* \param greenBits same as above.
193
* \param blueBits same as above.
194
* \param alphaBits same as above.
195
* \param numSamples not really used.
197
* \return pointer to new GLvisual or NULL if requested parameters can't be
200
* \note Need to add params for level and numAuxBuffers (at least)
203
_mesa_create_visual( GLboolean rgbFlag,
205
GLboolean stereoFlag,
214
GLint accumGreenBits,
216
GLint accumAlphaBits,
219
GLvisual *vis = (GLvisual *) _mesa_calloc(sizeof(GLvisual));
221
if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
222
redBits, greenBits, blueBits, alphaBits,
223
indexBits, depthBits, stencilBits,
224
accumRedBits, accumGreenBits,
225
accumBlueBits, accumAlphaBits,
235
* Makes some sanity checks and fills in the fields of the
236
* GLvisual object with the given parameters. If the caller needs
237
* to set additional fields, he should just probably init the whole GLvisual
239
* \return GL_TRUE on success, or GL_FALSE on failure.
241
* \sa _mesa_create_visual() above for the parameter description.
244
_mesa_initialize_visual( GLvisual *vis,
247
GLboolean stereoFlag,
256
GLint accumGreenBits,
258
GLint accumAlphaBits,
263
if (depthBits < 0 || depthBits > 32) {
266
if (stencilBits < 0 || stencilBits > STENCIL_BITS) {
269
assert(accumRedBits >= 0);
270
assert(accumGreenBits >= 0);
271
assert(accumBlueBits >= 0);
272
assert(accumAlphaBits >= 0);
274
vis->rgbMode = rgbFlag;
275
vis->doubleBufferMode = dbFlag;
276
vis->stereoMode = stereoFlag;
278
vis->redBits = redBits;
279
vis->greenBits = greenBits;
280
vis->blueBits = blueBits;
281
vis->alphaBits = alphaBits;
282
vis->rgbBits = redBits + greenBits + blueBits;
284
vis->indexBits = indexBits;
285
vis->depthBits = depthBits;
286
vis->stencilBits = stencilBits;
288
vis->accumRedBits = accumRedBits;
289
vis->accumGreenBits = accumGreenBits;
290
vis->accumBlueBits = accumBlueBits;
291
vis->accumAlphaBits = accumAlphaBits;
293
vis->haveAccumBuffer = accumRedBits > 0;
294
vis->haveDepthBuffer = depthBits > 0;
295
vis->haveStencilBuffer = stencilBits > 0;
297
vis->numAuxBuffers = 0;
300
vis->sampleBuffers = numSamples > 0 ? 1 : 0;
301
vis->samples = numSamples;
308
* Destroy a visual and free its memory.
312
* Frees the visual structure.
315
_mesa_destroy_visual( GLvisual *vis )
323
/**********************************************************************/
324
/** \name Context allocation, initialization, destroying
326
* The purpose of the most initialization functions here is to provide the
327
* default state values according to the OpenGL specification.
329
/**********************************************************************/
333
* One-time initialization mutex lock.
335
* \sa Used by one_time_init().
337
_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
340
* Calls all the various one-time-init functions in Mesa.
342
* While holding a global mutex lock, calls several initialization functions,
343
* and sets the glapi callbacks if the \c MESA_DEBUG environment variable is
349
one_time_init( GLcontext *ctx )
351
static GLboolean alreadyCalled = GL_FALSE;
353
_glthread_LOCK_MUTEX(OneTimeLock);
354
if (!alreadyCalled) {
357
/* do some implementation tests */
358
assert( sizeof(GLbyte) == 1 );
359
assert( sizeof(GLubyte) == 1 );
360
assert( sizeof(GLshort) == 2 );
361
assert( sizeof(GLushort) == 2 );
362
assert( sizeof(GLint) == 4 );
363
assert( sizeof(GLuint) == 4 );
365
_mesa_init_sqrt_table();
370
for (i = 0; i < 256; i++) {
371
_mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
376
_mesa_init_sparc_glapi_relocs();
378
if (_mesa_getenv("MESA_DEBUG")) {
379
_glapi_noop_enable_warnings(GL_TRUE);
380
_glapi_set_warning_func( (_glapi_warning_func) _mesa_warning );
383
_glapi_noop_enable_warnings(GL_FALSE);
386
#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
387
_mesa_debug(ctx, "Mesa %s DEBUG build %s %s\n",
388
MESA_VERSION_STRING, __DATE__, __TIME__);
391
alreadyCalled = GL_TRUE;
393
_glthread_UNLOCK_MUTEX(OneTimeLock);
398
* Allocate and initialize a shared context state structure.
399
* Initializes the display list, texture objects and vertex programs hash
400
* tables, allocates the texture objects. If it runs out of memory, frees
401
* everything already allocated before returning NULL.
403
* \return pointer to a gl_shared_state structure on success, or NULL on
407
alloc_shared_state( GLcontext *ctx )
409
struct gl_shared_state *ss = CALLOC_STRUCT(gl_shared_state);
415
_glthread_INIT_MUTEX(ss->Mutex);
417
ss->DisplayList = _mesa_NewHashTable();
418
ss->TexObjects = _mesa_NewHashTable();
419
#if FEATURE_NV_vertex_program || FEATURE_NV_fragment_program
420
ss->Programs = _mesa_NewHashTable();
423
#if FEATURE_ARB_vertex_program
424
ss->DefaultVertexProgram = ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0);
425
if (!ss->DefaultVertexProgram)
428
#if FEATURE_ARB_fragment_program
429
ss->DefaultFragmentProgram = ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0);
430
if (!ss->DefaultFragmentProgram)
433
#if FEATURE_ATI_fragment_shader
434
ss->ATIShaders = _mesa_NewHashTable();
435
ss->DefaultFragmentShader = _mesa_new_ati_fragment_shader(ctx, 0);
436
if (!ss->DefaultFragmentShader)
440
#if FEATURE_ARB_vertex_buffer_object || FEATURE_ARB_pixel_buffer_object
441
ss->BufferObjects = _mesa_NewHashTable();
444
ss->ArrayObjects = _mesa_NewHashTable();
446
#if FEATURE_ARB_shader_objects
447
ss->ShaderObjects = _mesa_NewHashTable();
450
ss->Default1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);
454
ss->Default2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);
458
ss->Default3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);
462
ss->DefaultCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);
463
if (!ss->DefaultCubeMap)
466
ss->DefaultRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);
467
if (!ss->DefaultRect)
471
assert(ss->Default1D->RefCount == 1);
473
_glthread_INIT_MUTEX(ss->TexMutex);
474
ss->TextureStateStamp = 0;
476
#if FEATURE_EXT_framebuffer_object
477
ss->FrameBuffers = _mesa_NewHashTable();
478
if (!ss->FrameBuffers)
480
ss->RenderBuffers = _mesa_NewHashTable();
481
if (!ss->RenderBuffers)
488
/* Ran out of memory at some point. Free everything and return NULL */
490
_mesa_DeleteHashTable(ss->DisplayList);
492
_mesa_DeleteHashTable(ss->TexObjects);
493
#if FEATURE_NV_vertex_program
495
_mesa_DeleteHashTable(ss->Programs);
497
#if FEATURE_ARB_vertex_program
498
if (ss->DefaultVertexProgram)
499
ctx->Driver.DeleteProgram(ctx, ss->DefaultVertexProgram);
501
#if FEATURE_ARB_fragment_program
502
if (ss->DefaultFragmentProgram)
503
ctx->Driver.DeleteProgram(ctx, ss->DefaultFragmentProgram);
505
#if FEATURE_ATI_fragment_shader
506
if (ss->DefaultFragmentShader)
507
_mesa_delete_ati_fragment_shader(ctx, ss->DefaultFragmentShader);
509
#if FEATURE_ARB_vertex_buffer_object || FEATURE_ARB_pixel_buffer_object
510
if (ss->BufferObjects)
511
_mesa_DeleteHashTable(ss->BufferObjects);
514
if (ss->ArrayObjects)
515
_mesa_DeleteHashTable (ss->ArrayObjects);
517
#if FEATURE_ARB_shader_objects
518
if (ss->ShaderObjects)
519
_mesa_DeleteHashTable (ss->ShaderObjects);
522
#if FEATURE_EXT_framebuffer_object
523
if (ss->FrameBuffers)
524
_mesa_DeleteHashTable(ss->FrameBuffers);
525
if (ss->RenderBuffers)
526
_mesa_DeleteHashTable(ss->RenderBuffers);
530
(*ctx->Driver.DeleteTexture)(ctx, ss->Default1D);
532
(*ctx->Driver.DeleteTexture)(ctx, ss->Default2D);
534
(*ctx->Driver.DeleteTexture)(ctx, ss->Default3D);
535
if (ss->DefaultCubeMap)
536
(*ctx->Driver.DeleteTexture)(ctx, ss->DefaultCubeMap);
538
(*ctx->Driver.DeleteTexture)(ctx, ss->DefaultRect);
546
* Callback for deleting a display list. Called by _mesa_HashDeleteAll().
549
delete_displaylist_cb(GLuint id, void *data, void *userData)
551
struct mesa_display_list *list = (struct mesa_display_list *) data;
552
GLcontext *ctx = (GLcontext *) userData;
553
_mesa_delete_list(ctx, list);
557
* Callback for deleting a texture object. Called by _mesa_HashDeleteAll().
560
delete_texture_cb(GLuint id, void *data, void *userData)
562
struct gl_texture_object *texObj = (struct gl_texture_object *) data;
563
GLcontext *ctx = (GLcontext *) userData;
564
ctx->Driver.DeleteTexture(ctx, texObj);
568
* Callback for deleting a program object. Called by _mesa_HashDeleteAll().
571
delete_program_cb(GLuint id, void *data, void *userData)
573
struct gl_program *prog = (struct gl_program *) data;
574
GLcontext *ctx = (GLcontext *) userData;
575
ctx->Driver.DeleteProgram(ctx, prog);
579
* Callback for deleting an ATI fragment shader object.
580
* Called by _mesa_HashDeleteAll().
583
delete_fragshader_cb(GLuint id, void *data, void *userData)
585
struct ati_fragment_shader *shader = (struct ati_fragment_shader *) data;
586
GLcontext *ctx = (GLcontext *) userData;
587
_mesa_delete_ati_fragment_shader(ctx, shader);
591
* Callback for deleting a buffer object. Called by _mesa_HashDeleteAll().
594
delete_bufferobj_cb(GLuint id, void *data, void *userData)
596
struct gl_buffer_object *bufObj = (struct gl_buffer_object *) data;
597
GLcontext *ctx = (GLcontext *) userData;
598
ctx->Driver.DeleteBuffer(ctx, bufObj);
602
* Callback for deleting an array object. Called by _mesa_HashDeleteAll().
605
delete_arrayobj_cb(GLuint id, void *data, void *userData)
607
struct gl_array_object *arrayObj = (struct gl_array_object *) data;
608
GLcontext *ctx = (GLcontext *) userData;
609
_mesa_delete_array_object(ctx, arrayObj);
613
* Callback for deleting shader and shader programs objects.
614
* Called by _mesa_HashDeleteAll().
617
delete_shader_cb(GLuint id, void *data, void *userData)
619
GLcontext *ctx = (GLcontext *) userData;
620
struct gl_shader *sh = (struct gl_shader *) data;
621
if (sh->Type == GL_FRAGMENT_SHADER || sh->Type == GL_VERTEX_SHADER) {
622
_mesa_free_shader(ctx, sh);
625
struct gl_shader_program *shProg = (struct gl_shader_program *) data;
626
ASSERT(shProg->Type == GL_SHADER_PROGRAM_MESA);
627
_mesa_free_shader_program(ctx, shProg);
632
* Callback for deleting a framebuffer object. Called by _mesa_HashDeleteAll()
635
delete_framebuffer_cb(GLuint id, void *data, void *userData)
637
struct gl_framebuffer *fb = (struct gl_framebuffer *) data;
638
/* The fact that the framebuffer is in the hashtable means its refcount
639
* is one, but we're removing from the hashtable now. So clear refcount.
641
/*assert(fb->RefCount == 1);*/
644
/* NOTE: Delete should always be defined but there are two reports
645
* of it being NULL (bugs 13507, 14293). Work-around for now.
652
* Callback for deleting a renderbuffer object. Called by _mesa_HashDeleteAll()
655
delete_renderbuffer_cb(GLuint id, void *data, void *userData)
657
struct gl_renderbuffer *rb = (struct gl_renderbuffer *) data;
658
rb->RefCount = 0; /* see comment for FBOs above */
665
* Deallocate a shared state object and all children structures.
667
* \param ctx GL context.
668
* \param ss shared state pointer.
670
* Frees the display lists, the texture objects (calling the driver texture
671
* deletion callback to free its private data) and the vertex programs, as well
672
* as their hash tables.
674
* \sa alloc_shared_state().
677
free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
682
_mesa_HashDeleteAll(ss->DisplayList, delete_displaylist_cb, ctx);
683
_mesa_DeleteHashTable(ss->DisplayList);
685
#if defined(FEATURE_NV_vertex_program) || defined(FEATURE_NV_fragment_program)
686
_mesa_HashDeleteAll(ss->Programs, delete_program_cb, ctx);
687
_mesa_DeleteHashTable(ss->Programs);
689
#if FEATURE_ARB_vertex_program
690
ctx->Driver.DeleteProgram(ctx, ss->DefaultVertexProgram);
692
#if FEATURE_ARB_fragment_program
693
ctx->Driver.DeleteProgram(ctx, ss->DefaultFragmentProgram);
696
#if FEATURE_ATI_fragment_shader
697
_mesa_HashDeleteAll(ss->ATIShaders, delete_fragshader_cb, ctx);
698
_mesa_DeleteHashTable(ss->ATIShaders);
699
_mesa_delete_ati_fragment_shader(ctx, ss->DefaultFragmentShader);
702
#if FEATURE_ARB_vertex_buffer_object || FEATURE_ARB_pixel_buffer_object
703
_mesa_HashDeleteAll(ss->BufferObjects, delete_bufferobj_cb, ctx);
704
_mesa_DeleteHashTable(ss->BufferObjects);
707
_mesa_HashDeleteAll(ss->ArrayObjects, delete_arrayobj_cb, ctx);
708
_mesa_DeleteHashTable(ss->ArrayObjects);
710
#if FEATURE_ARB_shader_objects
711
_mesa_HashDeleteAll(ss->ShaderObjects, delete_shader_cb, ctx);
712
_mesa_DeleteHashTable(ss->ShaderObjects);
715
#if FEATURE_EXT_framebuffer_object
716
_mesa_HashDeleteAll(ss->FrameBuffers, delete_framebuffer_cb, ctx);
717
_mesa_DeleteHashTable(ss->FrameBuffers);
718
_mesa_HashDeleteAll(ss->RenderBuffers, delete_renderbuffer_cb, ctx);
719
_mesa_DeleteHashTable(ss->RenderBuffers);
723
* Free texture objects (after FBOs since some textures might have
724
* been bound to FBOs).
726
ASSERT(ctx->Driver.DeleteTexture);
727
/* the default textures */
728
ctx->Driver.DeleteTexture(ctx, ss->Default1D);
729
ctx->Driver.DeleteTexture(ctx, ss->Default2D);
730
ctx->Driver.DeleteTexture(ctx, ss->Default3D);
731
ctx->Driver.DeleteTexture(ctx, ss->DefaultCubeMap);
732
ctx->Driver.DeleteTexture(ctx, ss->DefaultRect);
733
/* all other textures */
734
_mesa_HashDeleteAll(ss->TexObjects, delete_texture_cb, ctx);
735
_mesa_DeleteHashTable(ss->TexObjects);
737
_glthread_DESTROY_MUTEX(ss->Mutex);
744
* Initialize fields of gl_current_attrib (aka ctx->Current.*)
747
_mesa_init_current(GLcontext *ctx)
751
/* Init all to (0,0,0,1) */
752
for (i = 0; i < VERT_ATTRIB_MAX; i++) {
753
ASSIGN_4V( ctx->Current.Attrib[i], 0.0, 0.0, 0.0, 1.0 );
756
/* redo special cases: */
757
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 1.0, 0.0, 0.0, 0.0 );
758
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 );
759
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
760
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 1.0 );
761
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR_INDEX], 1.0, 0.0, 0.0, 1.0 );
762
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG], 1.0, 0.0, 0.0, 1.0 );
767
* Init vertex/fragment program native limits from logical limits.
770
init_natives(struct gl_program_constants *prog)
772
prog->MaxNativeInstructions = prog->MaxInstructions;
773
prog->MaxNativeAluInstructions = prog->MaxAluInstructions;
774
prog->MaxNativeTexInstructions = prog->MaxTexInstructions;
775
prog->MaxNativeTexIndirections = prog->MaxTexIndirections;
776
prog->MaxNativeAttribs = prog->MaxAttribs;
777
prog->MaxNativeTemps = prog->MaxTemps;
778
prog->MaxNativeAddressRegs = prog->MaxAddressRegs;
779
prog->MaxNativeParameters = prog->MaxParameters;
784
* Initialize fields of gl_constants (aka ctx->Const.*).
785
* Use defaults from config.h. The device drivers will often override
786
* some of these values (such as number of texture units).
789
_mesa_init_constants(GLcontext *ctx)
793
assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
794
assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
796
assert(MAX_TEXTURE_UNITS >= MAX_TEXTURE_COORD_UNITS);
797
assert(MAX_TEXTURE_UNITS >= MAX_TEXTURE_IMAGE_UNITS);
799
/* Constants, may be overriden (usually only reduced) by device drivers */
800
ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
801
ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
802
ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
803
ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
804
ctx->Const.MaxTextureCoordUnits = MAX_TEXTURE_COORD_UNITS;
805
ctx->Const.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
806
ctx->Const.MaxTextureUnits = MIN2(ctx->Const.MaxTextureCoordUnits,
807
ctx->Const.MaxTextureImageUnits);
808
ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
809
ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
810
ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
811
ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
812
ctx->Const.MinPointSize = MIN_POINT_SIZE;
813
ctx->Const.MaxPointSize = MAX_POINT_SIZE;
814
ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
815
ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
816
ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
817
ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
818
ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
819
ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
820
ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
821
ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
822
ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
823
ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
824
ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
825
ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
826
ctx->Const.MaxLights = MAX_LIGHTS;
827
ctx->Const.MaxShininess = 128.0;
828
ctx->Const.MaxSpotExponent = 128.0;
829
ctx->Const.MaxViewportWidth = MAX_WIDTH;
830
ctx->Const.MaxViewportHeight = MAX_HEIGHT;
831
#if FEATURE_ARB_vertex_program
832
ctx->Const.VertexProgram.MaxInstructions = MAX_NV_VERTEX_PROGRAM_INSTRUCTIONS;
833
ctx->Const.VertexProgram.MaxAluInstructions = 0;
834
ctx->Const.VertexProgram.MaxTexInstructions = 0;
835
ctx->Const.VertexProgram.MaxTexIndirections = 0;
836
ctx->Const.VertexProgram.MaxAttribs = MAX_NV_VERTEX_PROGRAM_INPUTS;
837
ctx->Const.VertexProgram.MaxTemps = MAX_PROGRAM_TEMPS;
838
ctx->Const.VertexProgram.MaxParameters = MAX_NV_VERTEX_PROGRAM_PARAMS;
839
ctx->Const.VertexProgram.MaxLocalParams = MAX_PROGRAM_LOCAL_PARAMS;
840
ctx->Const.VertexProgram.MaxEnvParams = MAX_PROGRAM_ENV_PARAMS;
841
ctx->Const.VertexProgram.MaxAddressRegs = MAX_VERTEX_PROGRAM_ADDRESS_REGS;
842
ctx->Const.VertexProgram.MaxUniformComponents = 4 * MAX_UNIFORMS;
843
init_natives(&ctx->Const.VertexProgram);
846
#if FEATURE_ARB_fragment_program
847
ctx->Const.FragmentProgram.MaxInstructions = MAX_NV_FRAGMENT_PROGRAM_INSTRUCTIONS;
848
ctx->Const.FragmentProgram.MaxAluInstructions = MAX_FRAGMENT_PROGRAM_ALU_INSTRUCTIONS;
849
ctx->Const.FragmentProgram.MaxTexInstructions = MAX_FRAGMENT_PROGRAM_TEX_INSTRUCTIONS;
850
ctx->Const.FragmentProgram.MaxTexIndirections = MAX_FRAGMENT_PROGRAM_TEX_INDIRECTIONS;
851
ctx->Const.FragmentProgram.MaxAttribs = MAX_NV_FRAGMENT_PROGRAM_INPUTS;
852
ctx->Const.FragmentProgram.MaxTemps = MAX_PROGRAM_TEMPS;
853
ctx->Const.FragmentProgram.MaxParameters = MAX_NV_FRAGMENT_PROGRAM_PARAMS;
854
ctx->Const.FragmentProgram.MaxLocalParams = MAX_PROGRAM_LOCAL_PARAMS;
855
ctx->Const.FragmentProgram.MaxEnvParams = MAX_PROGRAM_ENV_PARAMS;
856
ctx->Const.FragmentProgram.MaxAddressRegs = MAX_FRAGMENT_PROGRAM_ADDRESS_REGS;
857
ctx->Const.FragmentProgram.MaxUniformComponents = 4 * MAX_UNIFORMS;
858
init_natives(&ctx->Const.FragmentProgram);
860
ctx->Const.MaxProgramMatrices = MAX_PROGRAM_MATRICES;
861
ctx->Const.MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH;
863
/* CheckArrayBounds is overriden by drivers/x11 for X server */
864
ctx->Const.CheckArrayBounds = GL_FALSE;
866
/* GL_ARB_draw_buffers */
867
ctx->Const.MaxDrawBuffers = MAX_DRAW_BUFFERS;
869
/* GL_OES_read_format */
870
ctx->Const.ColorReadFormat = GL_RGBA;
871
ctx->Const.ColorReadType = GL_UNSIGNED_BYTE;
873
#if FEATURE_EXT_framebuffer_object
874
ctx->Const.MaxColorAttachments = MAX_COLOR_ATTACHMENTS;
875
ctx->Const.MaxRenderbufferSize = MAX_WIDTH;
878
#if FEATURE_ARB_vertex_shader
879
ctx->Const.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS;
880
ctx->Const.MaxVarying = MAX_VARYING;
884
ASSERT(ctx->Const.MaxTextureUnits == MIN2(ctx->Const.MaxTextureImageUnits,
885
ctx->Const.MaxTextureCoordUnits));
886
ASSERT(ctx->Const.FragmentProgram.MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS);
887
ASSERT(ctx->Const.VertexProgram.MaxLocalParams <= MAX_PROGRAM_LOCAL_PARAMS);
889
ASSERT(MAX_NV_FRAGMENT_PROGRAM_TEMPS <= MAX_PROGRAM_TEMPS);
890
ASSERT(MAX_NV_VERTEX_PROGRAM_TEMPS <= MAX_PROGRAM_TEMPS);
891
ASSERT(MAX_NV_VERTEX_PROGRAM_INPUTS <= VERT_ATTRIB_MAX);
892
ASSERT(MAX_NV_VERTEX_PROGRAM_OUTPUTS <= VERT_RESULT_MAX);
897
* Do some sanity checks on the limits/constants for the given context.
898
* Only called the first time a context is bound.
901
check_context_limits(GLcontext *ctx)
903
/* Many context limits/constants are limited by the size of
906
assert(ctx->Const.MaxTextureImageUnits <= MAX_TEXTURE_IMAGE_UNITS);
907
assert(ctx->Const.MaxTextureCoordUnits <= MAX_TEXTURE_COORD_UNITS);
908
assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_IMAGE_UNITS);
909
assert(ctx->Const.MaxTextureUnits <= MAX_TEXTURE_COORD_UNITS);
911
assert(ctx->Const.MaxViewportWidth <= MAX_WIDTH);
912
assert(ctx->Const.MaxViewportHeight <= MAX_WIDTH);
914
/* make sure largest texture image is <= MAX_WIDTH in size */
915
assert((1 << (ctx->Const.MaxTextureLevels -1 )) <= MAX_WIDTH);
916
assert((1 << (ctx->Const.MaxCubeTextureLevels -1 )) <= MAX_WIDTH);
917
assert((1 << (ctx->Const.Max3DTextureLevels -1 )) <= MAX_WIDTH);
919
assert(ctx->Const.MaxDrawBuffers <= MAX_DRAW_BUFFERS);
921
/* XXX probably add more tests */
926
* Initialize the attribute groups in a GL context.
928
* \param ctx GL context.
930
* Initializes all the attributes, calling the respective <tt>init*</tt>
931
* functions for the more complex data structures.
934
init_attrib_groups(GLcontext *ctx)
939
_mesa_init_constants( ctx );
942
_mesa_init_extensions( ctx );
944
/* Attribute Groups */
945
_mesa_init_accum( ctx );
946
_mesa_init_attrib( ctx );
947
_mesa_init_buffer_objects( ctx );
948
_mesa_init_color( ctx );
949
_mesa_init_colortables( ctx );
950
_mesa_init_current( ctx );
951
_mesa_init_depth( ctx );
952
_mesa_init_debug( ctx );
953
_mesa_init_display_list( ctx );
954
_mesa_init_eval( ctx );
955
_mesa_init_feedback( ctx );
956
_mesa_init_fog( ctx );
957
_mesa_init_histogram( ctx );
958
_mesa_init_hint( ctx );
959
_mesa_init_line( ctx );
960
_mesa_init_lighting( ctx );
961
_mesa_init_matrix( ctx );
962
_mesa_init_multisample( ctx );
963
_mesa_init_pixel( ctx );
964
_mesa_init_point( ctx );
965
_mesa_init_polygon( ctx );
966
_mesa_init_program( ctx );
967
_mesa_init_query( ctx );
968
_mesa_init_rastpos( ctx );
969
_mesa_init_scissor( ctx );
970
_mesa_init_shader_state( ctx );
971
_mesa_init_stencil( ctx );
972
_mesa_init_transform( ctx );
973
_mesa_init_varray( ctx );
974
_mesa_init_viewport( ctx );
976
if (!_mesa_init_texture( ctx ))
979
_mesa_init_texture_s3tc( ctx );
980
_mesa_init_texture_fxt1( ctx );
983
ctx->NewState = _NEW_ALL;
984
ctx->ErrorValue = (GLenum) GL_NO_ERROR;
991
* This is the default function we plug into all dispatch table slots
992
* This helps prevents a segfault when someone calls a GL function without
993
* first checking if the extension's supported.
998
_mesa_problem(NULL, "User called no-op dispatch function (an unsupported extension function?)");
1004
* Allocate and initialize a new dispatch table.
1006
static struct _glapi_table *
1007
alloc_dispatch_table(void)
1009
/* Find the larger of Mesa's dispatch table and libGL's dispatch table.
1010
* In practice, this'll be the same for stand-alone Mesa. But for DRI
1011
* Mesa we do this to accomodate different versions of libGL and various
1014
GLint numEntries = MAX2(_glapi_get_dispatch_table_size(),
1015
sizeof(struct _glapi_table) / sizeof(_glapi_proc));
1016
struct _glapi_table *table =
1017
(struct _glapi_table *) _mesa_malloc(numEntries * sizeof(_glapi_proc));
1019
_glapi_proc *entry = (_glapi_proc *) table;
1021
for (i = 0; i < numEntries; i++) {
1022
entry[i] = (_glapi_proc) generic_nop;
1030
* Initialize a GLcontext struct (rendering context).
1032
* This includes allocating all the other structs and arrays which hang off of
1033
* the context by pointers.
1034
* Note that the driver needs to pass in its dd_function_table here since
1035
* we need to at least call driverFunctions->NewTextureObject to create the
1036
* default texture objects.
1038
* Called by _mesa_create_context().
1040
* Performs the imports and exports callback tables initialization, and
1041
* miscellaneous one-time initializations. If no shared context is supplied one
1042
* is allocated, and increase its reference count. Setups the GL API dispatch
1043
* tables. Initialize the TNL module. Sets the maximum Z buffer depth.
1044
* Finally queries the \c MESA_DEBUG and \c MESA_VERBOSE environment variables
1047
* \param ctx the context to initialize
1048
* \param visual describes the visual attributes for this context
1049
* \param share_list points to context to share textures, display lists,
1051
* \param driverFunctions table of device driver functions for this context
1053
* \param driverContext pointer to driver-specific context data
1056
_mesa_initialize_context(GLcontext *ctx,
1057
const GLvisual *visual,
1058
GLcontext *share_list,
1059
const struct dd_function_table *driverFunctions,
1060
void *driverContext)
1062
ASSERT(driverContext);
1063
assert(driverFunctions->NewTextureObject);
1064
assert(driverFunctions->FreeTexImageData);
1066
/* misc one-time initializations */
1069
ctx->Visual = *visual;
1070
ctx->DrawBuffer = NULL;
1071
ctx->ReadBuffer = NULL;
1072
ctx->WinSysDrawBuffer = NULL;
1073
ctx->WinSysReadBuffer = NULL;
1075
/* Plug in driver functions and context pointer here.
1076
* This is important because when we call alloc_shared_state() below
1077
* we'll call ctx->Driver.NewTextureObject() to create the default
1080
ctx->Driver = *driverFunctions;
1081
ctx->DriverCtx = driverContext;
1084
/* share state with another context */
1085
ctx->Shared = share_list->Shared;
1088
/* allocate new, unshared state */
1089
if (!alloc_shared_state( ctx )) {
1093
_glthread_LOCK_MUTEX(ctx->Shared->Mutex);
1094
ctx->Shared->RefCount++;
1095
_glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1097
if (!init_attrib_groups( ctx )) {
1098
free_shared_state(ctx, ctx->Shared);
1102
/* setup the API dispatch tables */
1103
ctx->Exec = alloc_dispatch_table();
1104
ctx->Save = alloc_dispatch_table();
1105
if (!ctx->Exec || !ctx->Save) {
1106
free_shared_state(ctx, ctx->Shared);
1108
_mesa_free(ctx->Exec);
1110
_mesa_init_exec_table(ctx->Exec);
1111
ctx->CurrentDispatch = ctx->Exec;
1113
_mesa_init_dlist_table(ctx->Save);
1114
_mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt );
1115
/* Neutral tnl module stuff */
1116
_mesa_init_exec_vtxfmt( ctx );
1117
ctx->TnlModule.Current = NULL;
1118
ctx->TnlModule.SwapCount = 0;
1121
ctx->FragmentProgram._MaintainTexEnvProgram
1122
= (_mesa_getenv("MESA_TEX_PROG") != NULL);
1123
ctx->FragmentProgram._UseTexEnvProgram = ctx->FragmentProgram._MaintainTexEnvProgram;
1125
ctx->VertexProgram._MaintainTnlProgram
1126
= (_mesa_getenv("MESA_TNL_PROG") != NULL);
1127
if (ctx->VertexProgram._MaintainTnlProgram) {
1128
/* this is required... */
1129
ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
1132
ctx->FirstTimeCurrent = GL_TRUE;
1139
* Allocate and initialize a GLcontext structure.
1140
* Note that the driver needs to pass in its dd_function_table here since
1141
* we need to at least call driverFunctions->NewTextureObject to initialize
1142
* the rendering context.
1144
* \param visual a GLvisual pointer (we copy the struct contents)
1145
* \param share_list another context to share display lists with or NULL
1146
* \param driverFunctions points to the dd_function_table into which the
1147
* driver has plugged in all its special functions.
1148
* \param driverCtx points to the device driver's private context state
1150
* \return pointer to a new __GLcontextRec or NULL if error.
1153
_mesa_create_context(const GLvisual *visual,
1154
GLcontext *share_list,
1155
const struct dd_function_table *driverFunctions,
1156
void *driverContext)
1161
ASSERT(driverContext);
1163
ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
1167
if (_mesa_initialize_context(ctx, visual, share_list,
1168
driverFunctions, driverContext)) {
1179
* Free the data associated with the given context.
1181
* But doesn't free the GLcontext struct itself.
1183
* \sa _mesa_initialize_context() and init_attrib_groups().
1186
_mesa_free_context_data( GLcontext *ctx )
1188
if (!_mesa_get_current_context()){
1189
/* No current context, but we may need one in order to delete
1190
* texture objs, etc. So temporarily bind the context now.
1192
_mesa_make_current(ctx, NULL, NULL);
1195
/* unreference WinSysDraw/Read buffers */
1196
_mesa_unreference_framebuffer(&ctx->WinSysDrawBuffer);
1197
_mesa_unreference_framebuffer(&ctx->WinSysReadBuffer);
1198
_mesa_unreference_framebuffer(&ctx->DrawBuffer);
1199
_mesa_unreference_framebuffer(&ctx->ReadBuffer);
1201
_mesa_free_attrib_data(ctx);
1202
_mesa_free_lighting_data( ctx );
1203
_mesa_free_eval_data( ctx );
1204
_mesa_free_texture_data( ctx );
1205
_mesa_free_matrix_data( ctx );
1206
_mesa_free_viewport_data( ctx );
1207
_mesa_free_colortables_data( ctx );
1208
_mesa_free_program_data(ctx);
1209
_mesa_free_shader_state(ctx);
1210
_mesa_free_query_data(ctx);
1212
#if FEATURE_ARB_vertex_buffer_object
1213
_mesa_delete_buffer_object(ctx, ctx->Array.NullBufferObj);
1215
_mesa_delete_array_object(ctx, ctx->Array.DefaultArrayObj);
1217
/* free dispatch tables */
1218
_mesa_free(ctx->Exec);
1219
_mesa_free(ctx->Save);
1221
/* Shared context state (display lists, textures, etc) */
1222
_glthread_LOCK_MUTEX(ctx->Shared->Mutex);
1223
ctx->Shared->RefCount--;
1224
assert(ctx->Shared->RefCount >= 0);
1225
_glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
1226
if (ctx->Shared->RefCount == 0) {
1227
/* free shared state */
1228
free_shared_state( ctx, ctx->Shared );
1231
if (ctx->Extensions.String)
1232
_mesa_free((void *) ctx->Extensions.String);
1234
/* unbind the context if it's currently bound */
1235
if (ctx == _mesa_get_current_context()) {
1236
_mesa_make_current(NULL, NULL, NULL);
1242
* Destroy a GLcontext structure.
1244
* \param ctx GL context.
1246
* Calls _mesa_free_context_data() and frees the GLcontext structure itself.
1249
_mesa_destroy_context( GLcontext *ctx )
1252
_mesa_free_context_data(ctx);
1253
_mesa_free( (void *) ctx );
1260
* Copy attribute groups from one context to another.
1262
* \param src source context
1263
* \param dst destination context
1264
* \param mask bitwise OR of GL_*_BIT flags
1266
* According to the bits specified in \p mask, copies the corresponding
1267
* attributes from \p src into \p dst. For many of the attributes a simple \c
1268
* memcpy is not enough due to the existence of internal pointers in their data
1272
_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
1274
if (mask & GL_ACCUM_BUFFER_BIT) {
1276
dst->Accum = src->Accum;
1278
if (mask & GL_COLOR_BUFFER_BIT) {
1280
dst->Color = src->Color;
1282
if (mask & GL_CURRENT_BIT) {
1284
dst->Current = src->Current;
1286
if (mask & GL_DEPTH_BUFFER_BIT) {
1288
dst->Depth = src->Depth;
1290
if (mask & GL_ENABLE_BIT) {
1293
if (mask & GL_EVAL_BIT) {
1295
dst->Eval = src->Eval;
1297
if (mask & GL_FOG_BIT) {
1299
dst->Fog = src->Fog;
1301
if (mask & GL_HINT_BIT) {
1303
dst->Hint = src->Hint;
1305
if (mask & GL_LIGHTING_BIT) {
1307
/* begin with memcpy */
1308
dst->Light = src->Light;
1309
/* fixup linked lists to prevent pointer insanity */
1310
make_empty_list( &(dst->Light.EnabledList) );
1311
for (i = 0; i < MAX_LIGHTS; i++) {
1312
if (dst->Light.Light[i].Enabled) {
1313
insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
1317
if (mask & GL_LINE_BIT) {
1319
dst->Line = src->Line;
1321
if (mask & GL_LIST_BIT) {
1323
dst->List = src->List;
1325
if (mask & GL_PIXEL_MODE_BIT) {
1327
dst->Pixel = src->Pixel;
1329
if (mask & GL_POINT_BIT) {
1331
dst->Point = src->Point;
1333
if (mask & GL_POLYGON_BIT) {
1335
dst->Polygon = src->Polygon;
1337
if (mask & GL_POLYGON_STIPPLE_BIT) {
1338
/* Use loop instead of MEMCPY due to problem with Portland Group's
1339
* C compiler. Reported by John Stone.
1342
for (i = 0; i < 32; i++) {
1343
dst->PolygonStipple[i] = src->PolygonStipple[i];
1346
if (mask & GL_SCISSOR_BIT) {
1348
dst->Scissor = src->Scissor;
1350
if (mask & GL_STENCIL_BUFFER_BIT) {
1352
dst->Stencil = src->Stencil;
1354
if (mask & GL_TEXTURE_BIT) {
1355
/* Cannot memcpy because of pointers */
1356
_mesa_copy_texture_state(src, dst);
1358
if (mask & GL_TRANSFORM_BIT) {
1360
dst->Transform = src->Transform;
1362
if (mask & GL_VIEWPORT_BIT) {
1363
/* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
1364
dst->Viewport.X = src->Viewport.X;
1365
dst->Viewport.Y = src->Viewport.Y;
1366
dst->Viewport.Width = src->Viewport.Width;
1367
dst->Viewport.Height = src->Viewport.Height;
1368
dst->Viewport.Near = src->Viewport.Near;
1369
dst->Viewport.Far = src->Viewport.Far;
1370
_math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
1373
/* XXX FIXME: Call callbacks?
1375
dst->NewState = _NEW_ALL;
1381
* Check if the given context can render into the given framebuffer
1382
* by checking visual attributes.
1384
* XXX this may go away someday because we're moving toward more freedom
1385
* in binding contexts to drawables with different visual attributes.
1386
* The GL_EXT_f_b_o extension is prompting some of that.
1388
* \return GL_TRUE if compatible, GL_FALSE otherwise.
1391
check_compatible(const GLcontext *ctx, const GLframebuffer *buffer)
1393
const GLvisual *ctxvis = &ctx->Visual;
1394
const GLvisual *bufvis = &buffer->Visual;
1396
if (ctxvis == bufvis)
1399
if (ctxvis->rgbMode != bufvis->rgbMode)
1402
/* disabling this fixes the fgl_glxgears pbuffer demo */
1403
if (ctxvis->doubleBufferMode && !bufvis->doubleBufferMode)
1406
if (ctxvis->stereoMode && !bufvis->stereoMode)
1408
if (ctxvis->haveAccumBuffer && !bufvis->haveAccumBuffer)
1410
if (ctxvis->haveDepthBuffer && !bufvis->haveDepthBuffer)
1412
if (ctxvis->haveStencilBuffer && !bufvis->haveStencilBuffer)
1414
if (ctxvis->redMask && ctxvis->redMask != bufvis->redMask)
1416
if (ctxvis->greenMask && ctxvis->greenMask != bufvis->greenMask)
1418
if (ctxvis->blueMask && ctxvis->blueMask != bufvis->blueMask)
1421
/* disabled (see bug 11161) */
1422
if (ctxvis->depthBits && ctxvis->depthBits != bufvis->depthBits)
1425
if (ctxvis->stencilBits && ctxvis->stencilBits != bufvis->stencilBits)
1433
* Do one-time initialization for the given framebuffer. Specifically,
1434
* ask the driver for the window's current size and update the framebuffer
1436
* Really, the device driver should totally take care of this.
1439
initialize_framebuffer_size(GLcontext *ctx, GLframebuffer *fb)
1441
GLuint width, height;
1442
if (ctx->Driver.GetBufferSize) {
1443
ctx->Driver.GetBufferSize(fb, &width, &height);
1444
if (ctx->Driver.ResizeBuffers)
1445
ctx->Driver.ResizeBuffers(ctx, fb, width, height);
1446
fb->Initialized = GL_TRUE;
1452
* Bind the given context to the given drawBuffer and readBuffer and
1453
* make it the current context for the calling thread.
1454
* We'll render into the drawBuffer and read pixels from the
1455
* readBuffer (i.e. glRead/CopyPixels, glCopyTexImage, etc).
1457
* We check that the context's and framebuffer's visuals are compatible
1458
* and return immediately if they're not.
1460
* \param newCtx the new GL context. If NULL then there will be no current GL
1462
* \param drawBuffer the drawing framebuffer
1463
* \param readBuffer the reading framebuffer
1466
_mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
1467
GLframebuffer *readBuffer )
1469
if (MESA_VERBOSE & VERBOSE_API)
1470
_mesa_debug(newCtx, "_mesa_make_current()\n");
1472
/* Check that the context's and framebuffer's visuals are compatible.
1474
if (newCtx && drawBuffer && newCtx->WinSysDrawBuffer != drawBuffer) {
1475
if (!check_compatible(newCtx, drawBuffer)) {
1476
_mesa_warning(newCtx,
1477
"MakeCurrent: incompatible visuals for context and drawbuffer");
1481
if (newCtx && readBuffer && newCtx->WinSysReadBuffer != readBuffer) {
1482
if (!check_compatible(newCtx, readBuffer)) {
1483
_mesa_warning(newCtx,
1484
"MakeCurrent: incompatible visuals for context and readbuffer");
1489
/* We used to call _glapi_check_multithread() here. Now do it in drivers */
1490
_glapi_set_context((void *) newCtx);
1491
ASSERT(_mesa_get_current_context() == newCtx);
1494
_glapi_set_dispatch(NULL); /* none current */
1497
_glapi_set_dispatch(newCtx->CurrentDispatch);
1499
if (drawBuffer && readBuffer) {
1500
/* TODO: check if newCtx and buffer's visual match??? */
1502
ASSERT(drawBuffer->Name == 0);
1503
ASSERT(readBuffer->Name == 0);
1504
_mesa_reference_framebuffer(&newCtx->WinSysDrawBuffer, drawBuffer);
1505
_mesa_reference_framebuffer(&newCtx->WinSysReadBuffer, readBuffer);
1508
* Only set the context's Draw/ReadBuffer fields if they're NULL
1509
* or not bound to a user-created FBO.
1511
if (!newCtx->DrawBuffer || newCtx->DrawBuffer->Name == 0) {
1512
_mesa_reference_framebuffer(&newCtx->DrawBuffer, drawBuffer);
1514
if (!newCtx->ReadBuffer || newCtx->ReadBuffer->Name == 0) {
1515
_mesa_reference_framebuffer(&newCtx->ReadBuffer, readBuffer);
1518
newCtx->NewState |= _NEW_BUFFERS;
1521
/* We want to get rid of these lines: */
1524
if (!drawBuffer->Initialized) {
1525
initialize_framebuffer_size(newCtx, drawBuffer);
1527
if (readBuffer != drawBuffer && !readBuffer->Initialized) {
1528
initialize_framebuffer_size(newCtx, readBuffer);
1531
_mesa_resizebuffers(newCtx);
1535
/* We want the drawBuffer and readBuffer to be initialized by
1537
* This generally means the Width and Height match the actual
1538
* window size and the renderbuffers (both hardware and software
1539
* based) are allocated to match. The later can generally be
1540
* done with a call to _mesa_resize_framebuffer().
1542
* It's theoretically possible for a buffer to have zero width
1543
* or height, but for now, assert check that the driver did what's
1546
ASSERT(drawBuffer->Width > 0);
1547
ASSERT(drawBuffer->Height > 0);
1550
if (newCtx->FirstTimeCurrent) {
1551
/* set initial viewport and scissor size now */
1552
_mesa_set_viewport(newCtx, 0, 0,
1553
drawBuffer->Width, drawBuffer->Height);
1554
_mesa_set_scissor(newCtx, 0, 0,
1555
drawBuffer->Width, drawBuffer->Height );
1556
check_context_limits(newCtx);
1560
/* We can use this to help debug user's problems. Tell them to set
1561
* the MESA_INFO env variable before running their app. Then the
1562
* first time each context is made current we'll print some useful
1565
if (newCtx->FirstTimeCurrent) {
1566
if (_mesa_getenv("MESA_INFO")) {
1569
newCtx->FirstTimeCurrent = GL_FALSE;
1576
* Make context 'ctx' share the display lists, textures and programs
1577
* that are associated with 'ctxToShare'.
1578
* Any display lists, textures or programs associated with 'ctx' will
1579
* be deleted if nobody else is sharing them.
1582
_mesa_share_state(GLcontext *ctx, GLcontext *ctxToShare)
1584
if (ctx && ctxToShare && ctx->Shared && ctxToShare->Shared) {
1585
ctx->Shared->RefCount--;
1586
if (ctx->Shared->RefCount == 0) {
1587
free_shared_state(ctx, ctx->Shared);
1589
ctx->Shared = ctxToShare->Shared;
1590
ctx->Shared->RefCount++;
1601
* \return pointer to the current GL context for this thread.
1603
* Calls _glapi_get_context(). This isn't the fastest way to get the current
1604
* context. If you need speed, see the #GET_CURRENT_CONTEXT macro in
1608
_mesa_get_current_context( void )
1610
return (GLcontext *) _glapi_get_context();
1615
* Get context's current API dispatch table.
1617
* It'll either be the immediate-mode execute dispatcher or the display list
1618
* compile dispatcher.
1620
* \param ctx GL context.
1622
* \return pointer to dispatch_table.
1624
* Simply returns __GLcontextRec::CurrentDispatch.
1626
struct _glapi_table *
1627
_mesa_get_dispatch(GLcontext *ctx)
1629
return ctx->CurrentDispatch;
1635
/**********************************************************************/
1636
/** \name Miscellaneous functions */
1637
/**********************************************************************/
1643
* \param ctx GL context.
1644
* \param error error code.
1646
* Records the given error code and call the driver's dd_function_table::Error
1647
* function if defined.
1650
* This is called via _mesa_error().
1653
_mesa_record_error(GLcontext *ctx, GLenum error)
1658
if (ctx->ErrorValue == GL_NO_ERROR) {
1659
ctx->ErrorValue = error;
1662
/* Call device driver's error handler, if any. This is used on the Mac. */
1663
if (ctx->Driver.Error) {
1664
ctx->Driver.Error(ctx);
1670
* Execute glFinish().
1672
* Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1673
* dd_function_table::Finish driver callback, if not NULL.
1678
GET_CURRENT_CONTEXT(ctx);
1679
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1680
if (ctx->Driver.Finish) {
1681
ctx->Driver.Finish(ctx);
1687
* Execute glFlush().
1689
* Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the
1690
* dd_function_table::Flush driver callback, if not NULL.
1695
GET_CURRENT_CONTEXT(ctx);
1696
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1697
if (ctx->Driver.Flush) {
1698
ctx->Driver.Flush(ctx);