context.h revision 31aca27c08d6a385c595d34fe4ee06390bf5b0e8
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
3a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * Version:  6.5.1
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
5a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
26a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul/**
27a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * \file context.h
28a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * Mesa context and visual-related functions.
29a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul *
30a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * There are three large Mesa data types/classes which are meant to be
31a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * used by device drivers:
32a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * - GLcontext: this contains the Mesa rendering state
33d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * - struct gl_config:  this describes the color buffer (RGB vs. ci), whether or not
34a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul *   there's a depth buffer, stencil buffer, etc.
3531aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg * - struct gl_framebuffer:  contains pointers to the depth buffer, stencil buffer,
36a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul *   accum buffer and alpha buffers.
37a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul *
38a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * These types should be encapsulated by corresponding device driver
39a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * data types.  See xmesa.h and xmesaP.h for an example.
40a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul *
4131aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg * In OOP terms, GLcontext, struct gl_config, and struct gl_framebuffer are base classes
42a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * which the device driver must derive from.
43a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul *
44a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * The following functions create and destroy these data types.
45a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul */
46a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul
47a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul
48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifndef CONTEXT_H
49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CONTEXT_H
50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
51afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
52ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#include "imports.h"
535e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
54afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
55afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5627a8432e35669920fa8e985819ba3ef8b258127dBrian Paulstruct _glapi_table;
5727a8432e35669920fa8e985819ba3ef8b258127dBrian Paul
5827a8432e35669920fa8e985819ba3ef8b258127dBrian Paul
59a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul/** \name Visual-related functions */
606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
62d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsbergextern struct gl_config *
63fcf438e9e03f6e75bca4a49ad372fe7c4b1abbf8Ian Romanick_mesa_create_visual( GLboolean dbFlag,
64b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLboolean stereoFlag,
65b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint redBits,
66b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint greenBits,
67b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint blueBits,
68b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint alphaBits,
69b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint depthBits,
70b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint stencilBits,
71b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint accumRedBits,
72b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint accumGreenBits,
73b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint accumBlueBits,
74b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint accumAlphaBits,
75b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint numSamples );
76b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul
77178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern GLboolean
78d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg_mesa_initialize_visual( struct gl_config *v,
79178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLboolean dbFlag,
80178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLboolean stereoFlag,
81178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint redBits,
82178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint greenBits,
83178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint blueBits,
84178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint alphaBits,
85178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint depthBits,
86178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint stencilBits,
87178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint accumRedBits,
88178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint accumGreenBits,
89178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint accumBlueBits,
90178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint accumAlphaBits,
91178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint numSamples );
92178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul
93b371e0da2b51da7d941de557b62434aaaca5be02Brian Paulextern void
94d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg_mesa_destroy_visual( struct gl_config *vis );
95b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul
966dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
98178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul
99a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul/** \name Context-related functions */
1006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
1016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
102178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern GLcontext *
103d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg_mesa_create_context( const struct gl_config *visual,
104b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                      GLcontext *share_list,
105d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                      const struct dd_function_table *driverFunctions,
106d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                      void *driverContext );
107178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul
108178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern GLboolean
109178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul_mesa_initialize_context( GLcontext *ctx,
110d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg                          const struct gl_config *visual,
111178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                          GLcontext *share_list,
112d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                          const struct dd_function_table *driverFunctions,
113d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                          void *driverContext );
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1152ab18d63cb71d988265eeab431e4363081978144Kristian Høgsbergextern GLcontext *
1162ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg_mesa_create_context_for_api(gl_api api,
117d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg			     const struct gl_config *visual,
1182ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg			     GLcontext *share_list,
1192ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg			     const struct dd_function_table *driverFunctions,
1202ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg			     void *driverContext);
1212ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg
1222ab18d63cb71d988265eeab431e4363081978144Kristian Høgsbergextern GLboolean
1232ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg_mesa_initialize_context_for_api(GLcontext *ctx,
1242ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg				 gl_api api,
125d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg				 const struct gl_config *visual,
1262ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg				 GLcontext *share_list,
1272ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg				 const struct dd_function_table *driverFunctions,
1282ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg				 void *driverContext);
1292ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg
130178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern void
131b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul_mesa_free_context_data( GLcontext *ctx );
1324d053ddae8cc48dd29a75e67290cd09ed995f5c3Brian Paul
133178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern void
134b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul_mesa_destroy_context( GLcontext *ctx );
1354d053ddae8cc48dd29a75e67290cd09ed995f5c3Brian Paul
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
137178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern void
138b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul_mesa_copy_context(const GLcontext *src, GLcontext *dst, GLuint mask);
1390498682406d23226b5bc8973e02c7b3a9e0bdeaaBrian Paul
1400498682406d23226b5bc8973e02c7b3a9e0bdeaaBrian Paul
1413f856c6b6b7fa95ef97a8712876de88d7d57932eBrian Paulextern void
1423f856c6b6b7fa95ef97a8712876de88d7d57932eBrian Paul_mesa_check_init_viewport(GLcontext *ctx, GLuint width, GLuint height);
1433f856c6b6b7fa95ef97a8712876de88d7d57932eBrian Paul
14429c6c8eb18ace95b9af6dcf34e02c2b8db0ffda8José Fonsecaextern GLboolean
14531aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg_mesa_make_current( GLcontext *ctx, struct gl_framebuffer *drawBuffer,
14631aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg                    struct gl_framebuffer *readBuffer );
1470003778847df6adb792f453df83808fefa560f18Brian Paul
148635ee2df37898fe408be565d189c2fb4dc5f61b1Brian Paulextern GLboolean
149635ee2df37898fe408be565d189c2fb4dc5f61b1Brian Paul_mesa_share_state(GLcontext *ctx, GLcontext *ctxToShare);
1503f02f90f943a996d88abc20f74503afbb56a4c98Brian Paul
151178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern GLcontext *
152b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul_mesa_get_current_context(void);
153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
1550498682406d23226b5bc8973e02c7b3a9e0bdeaaBrian Paul
156199b0894b501607bf8d599ef5efc08cd6c08c79dKristian Høgsbergextern void
157199b0894b501607bf8d599ef5efc08cd6c08c79dKristian Høgsberg_mesa_init_get_hash(GLcontext *ctx);
1580498682406d23226b5bc8973e02c7b3a9e0bdeaaBrian Paul
1599a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paulextern void
160e3c1c5377c7fcd17085bfb22fbc1cf30646751baKristian Høgsberg_mesa_notifySwapBuffers(GLcontext *gc);
1619a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul
1629a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul
163fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulextern struct _glapi_table *
164fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_get_dispatch(GLcontext *ctx);
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
167b6e8256899a9a93c665c34e10efcc918f2fcc095Keith Whitwellvoid
168b6e8256899a9a93c665c34e10efcc918f2fcc095Keith Whitwell_mesa_set_mvp_with_dp4( GLcontext *ctx,
169b6e8256899a9a93c665c34e10efcc918f2fcc095Keith Whitwell                        GLboolean flag );
170b6e8256899a9a93c665c34e10efcc918f2fcc095Keith Whitwell
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
17256c4226fcc54158eb7fe54eeb13539a979ec155cBrian Paulextern GLboolean
17356c4226fcc54158eb7fe54eeb13539a979ec155cBrian Paul_mesa_valid_to_render(GLcontext *ctx, const char *where);
17456c4226fcc54158eb7fe54eeb13539a979ec155cBrian Paul
17556c4226fcc54158eb7fe54eeb13539a979ec155cBrian Paul
17656c4226fcc54158eb7fe54eeb13539a979ec155cBrian Paul
1776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name Miscellaneous */
1786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
180178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern void
1814e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul_mesa_record_error( GLcontext *ctx, GLenum error );
182d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul
1834837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paul
1844837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paulextern void
1854837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paul_mesa_finish(GLcontext *ctx);
1864837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paul
1874837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paulextern void
1884837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paul_mesa_flush(GLcontext *ctx);
1894837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paul
1904837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paul
191c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettextern void GLAPIENTRY
192fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul_mesa_Finish( void );
193fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul
194c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettextern void GLAPIENTRY
195fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul_mesa_Flush( void );
196fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul
1976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
198fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul
19906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
200a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul/**
201a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * \name Macros for flushing buffered rendering commands before state changes,
202a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * checking if inside glBegin/glEnd, etc.
203a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul */
20406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/*@{*/
20506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
20606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/**
20706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Flush vertices.
20806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
20906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context.
21006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param newstate new state.
21106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
21206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Checks if dd_function_table::NeedFlush is marked to flush stored vertices,
21306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * and calls dd_function_table::FlushVertices if so. Marks
21406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * __GLcontextRec::NewState with \p newstate.
21506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */
21606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define FLUSH_VERTICES(ctx, newstate)				\
21706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo {								\
21806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   if (MESA_VERBOSE & VERBOSE_STATE)				\
219b65bc4f87b356cf6228151cd2f341432e80dc6b8Brian Paul      _mesa_debug(ctx, "FLUSH_VERTICES in %s\n", MESA_FUNCTION);\
22006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   if (ctx->Driver.NeedFlush & FLUSH_STORED_VERTICES)		\
22106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul      ctx->Driver.FlushVertices(ctx, FLUSH_STORED_VERTICES);	\
22206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   ctx->NewState |= newstate;					\
22306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0)
22406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
22506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/**
22606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Flush current state.
22706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
22806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context.
22906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param newstate new state.
23006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
23106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Checks if dd_function_table::NeedFlush is marked to flush current state,
23206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * and calls dd_function_table::FlushVertices if so. Marks
23306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * __GLcontextRec::NewState with \p newstate.
23406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */
23506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define FLUSH_CURRENT(ctx, newstate)				\
23606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo {								\
23706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   if (MESA_VERBOSE & VERBOSE_STATE)				\
238b65bc4f87b356cf6228151cd2f341432e80dc6b8Brian Paul      _mesa_debug(ctx, "FLUSH_CURRENT in %s\n", MESA_FUNCTION);	\
23906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   if (ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT)		\
24006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul      ctx->Driver.FlushVertices(ctx, FLUSH_UPDATE_CURRENT);	\
24106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   ctx->NewState |= newstate;					\
24206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0)
24306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
24406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/**
24506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Macro to assert that the API call was made outside the
24606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * glBegin()/glEnd() pair, with return value.
24706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
24806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context.
24906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param retval value to return value in case the assertion fails.
25006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */
25106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval)		\
25206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo {									\
25306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) {	\
254a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "Inside glBegin/glEnd");	\
25506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul      return retval;							\
25606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   }									\
25706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0)
25806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
25906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/**
26006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Macro to assert that the API call was made outside the
26106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * glBegin()/glEnd() pair.
26206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
26306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context.
26406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */
26506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define ASSERT_OUTSIDE_BEGIN_END(ctx)					\
26606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo {									\
26706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) {	\
268a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "Inside glBegin/glEnd");	\
26906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul      return;								\
27006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   }									\
27106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0)
27206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
27306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/**
27406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Macro to assert that the API call was made outside the
27506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * glBegin()/glEnd() pair and flush the vertices.
27606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
27706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context.
27806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */
27906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx)				\
28006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo {									\
28106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);					\
28206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   FLUSH_VERTICES(ctx, 0);						\
28306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0)
28406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
28506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/**
28606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Macro to assert that the API call was made outside the
28706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * glBegin()/glEnd() pair and flush the vertices, with return value.
28806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
28906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context.
29006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param retval value to return value in case the assertion fails.
29106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */
29206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, retval)	\
29306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo {									\
29406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval);			\
29506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   FLUSH_VERTICES(ctx, 0);						\
29606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0)
29706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
29806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/*@}*/
29906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
30006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
30129b4076f9acff96a867760fc885f5eaeb7586977Brian Paul
30229b4076f9acff96a867760fc885f5eaeb7586977Brian Paul/**
30329b4076f9acff96a867760fc885f5eaeb7586977Brian Paul * Is the secondary color needed?
30429b4076f9acff96a867760fc885f5eaeb7586977Brian Paul */
30529b4076f9acff96a867760fc885f5eaeb7586977Brian Paul#define NEED_SECONDARY_COLOR(CTX)					\
30629b4076f9acff96a867760fc885f5eaeb7586977Brian Paul   (((CTX)->Light.Enabled &&						\
30729b4076f9acff96a867760fc885f5eaeb7586977Brian Paul     (CTX)->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)	\
308853bda3e7c4dfa7d8cc462729f6a3dce89e44963Brian Paul    || (CTX)->Fog.ColorSumEnabled					\
309441bab8f171b0678303ff46fc79f236c349aafdbBrian    || ((CTX)->VertexProgram._Current &&				\
310ca8d91610f547b9c66f703e07356f6347a121516Xiang, Haihao        ((CTX)->VertexProgram._Current != (CTX)->VertexProgram._TnlProgram) &&    \
311441bab8f171b0678303ff46fc79f236c349aafdbBrian        ((CTX)->VertexProgram._Current->Base.InputsRead & VERT_BIT_COLOR1)) \
312441bab8f171b0678303ff46fc79f236c349aafdbBrian    || ((CTX)->FragmentProgram._Current &&				\
313ca8d91610f547b9c66f703e07356f6347a121516Xiang, Haihao        ((CTX)->FragmentProgram._Current != (CTX)->FragmentProgram._TexEnvProgram) &&  \
314441bab8f171b0678303ff46fc79f236c349aafdbBrian        ((CTX)->FragmentProgram._Current->Base.InputsRead & FRAG_BIT_COL1)) \
315853bda3e7c4dfa7d8cc462729f6a3dce89e44963Brian Paul   )
31629b4076f9acff96a867760fc885f5eaeb7586977Brian Paul
31729b4076f9acff96a867760fc885f5eaeb7586977Brian Paul
318abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul/**
319abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul * Is RGBA LogicOp enabled?
320abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul */
321abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul#define RGBA_LOGICOP_ENABLED(CTX) \
322abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul  ((CTX)->Color.ColorLogicOpEnabled || \
323abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul   ((CTX)->Color.BlendEnabled && (CTX)->Color.BlendEquationRGB == GL_LOGIC_OP))
324abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul
325abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul
3264e2de9531e4869edf12536c2cb37d3145ee4065cBrian Paul#endif /* CONTEXT_H */
327