context.h revision b6e8256899a9a93c665c34e10efcc918f2fcc095
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
33a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * - GLvisual:  this describes the color buffer (RGB vs. ci), whether or not
34a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul *   there's a depth buffer, stencil buffer, etc.
35a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * - GLframebuffer:  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 *
41a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * In OOP terms, GLcontext, GLvisual, and GLframebuffer 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
62b371e0da2b51da7d941de557b62434aaaca5be02Brian Paulextern GLvisual *
63b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul_mesa_create_visual( GLboolean rgbFlag,
64b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLboolean dbFlag,
65b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLboolean stereoFlag,
66b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint redBits,
67b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint greenBits,
68b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint blueBits,
69b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint alphaBits,
70b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint indexBits,
71b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint depthBits,
72b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint stencilBits,
73b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint accumRedBits,
74b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint accumGreenBits,
75b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint accumBlueBits,
76b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint accumAlphaBits,
77b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul                     GLint numSamples );
78b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul
79178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern GLboolean
80178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul_mesa_initialize_visual( GLvisual *v,
81178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLboolean rgbFlag,
82178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLboolean dbFlag,
83178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLboolean stereoFlag,
84178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint redBits,
85178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint greenBits,
86178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint blueBits,
87178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint alphaBits,
88178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint indexBits,
89178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint depthBits,
90178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint stencilBits,
91178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint accumRedBits,
92178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint accumGreenBits,
93178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint accumBlueBits,
94178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint accumAlphaBits,
95178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                         GLint numSamples );
96178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul
97b371e0da2b51da7d941de557b62434aaaca5be02Brian Paulextern void
98b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul_mesa_destroy_visual( GLvisual *vis );
99b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul
1006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
102178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul
103a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul/** \name Context-related functions */
1046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
1056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
106178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern GLcontext *
107be3602da412ae56b5ee019fc47cc282eb3d66fadBrian Paul_mesa_create_context( const GLvisual *visual,
108b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                      GLcontext *share_list,
109d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                      const struct dd_function_table *driverFunctions,
110d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                      void *driverContext );
111178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul
112178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern GLboolean
113178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul_mesa_initialize_context( GLcontext *ctx,
114be3602da412ae56b5ee019fc47cc282eb3d66fadBrian Paul                          const GLvisual *visual,
115178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul                          GLcontext *share_list,
116d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                          const struct dd_function_table *driverFunctions,
117d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                          void *driverContext );
118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
119178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern void
1206fd15dd80666ccb1e9b99cedd306e32cc7cee989Brian Paul_mesa_initialize_context_extra(GLcontext *ctx);
1216fd15dd80666ccb1e9b99cedd306e32cc7cee989Brian Paul
1226fd15dd80666ccb1e9b99cedd306e32cc7cee989Brian Paulextern void
123b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul_mesa_free_context_data( GLcontext *ctx );
1244d053ddae8cc48dd29a75e67290cd09ed995f5c3Brian Paul
125178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern void
126b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul_mesa_destroy_context( GLcontext *ctx );
1274d053ddae8cc48dd29a75e67290cd09ed995f5c3Brian Paul
128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
129178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern void
130b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul_mesa_copy_context(const GLcontext *src, GLcontext *dst, GLuint mask);
1310498682406d23226b5bc8973e02c7b3a9e0bdeaaBrian Paul
1320498682406d23226b5bc8973e02c7b3a9e0bdeaaBrian Paul
133178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern void
134e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul_mesa_make_current( GLcontext *ctx, GLframebuffer *drawBuffer,
135e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                    GLframebuffer *readBuffer );
1360003778847df6adb792f453df83808fefa560f18Brian Paul
137635ee2df37898fe408be565d189c2fb4dc5f61b1Brian Paulextern GLboolean
138635ee2df37898fe408be565d189c2fb4dc5f61b1Brian Paul_mesa_share_state(GLcontext *ctx, GLcontext *ctxToShare);
1393f02f90f943a996d88abc20f74503afbb56a4c98Brian Paul
140178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern GLcontext *
141b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul_mesa_get_current_context(void);
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
1440498682406d23226b5bc8973e02c7b3a9e0bdeaaBrian Paul
1450498682406d23226b5bc8973e02c7b3a9e0bdeaaBrian Paul
1469a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paulextern void
1479a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul_mesa_notifySwapBuffers(__GLcontext *gc);
1489a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul
1499a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul
150fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulextern struct _glapi_table *
151fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_get_dispatch(GLcontext *ctx);
152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
154b6e8256899a9a93c665c34e10efcc918f2fcc095Keith Whitwellvoid
155b6e8256899a9a93c665c34e10efcc918f2fcc095Keith Whitwell_mesa_set_mvp_with_dp4( GLcontext *ctx,
156b6e8256899a9a93c665c34e10efcc918f2fcc095Keith Whitwell                        GLboolean flag );
157b6e8256899a9a93c665c34e10efcc918f2fcc095Keith Whitwell
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name Miscellaneous */
1606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
162178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern void
1634e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul_mesa_record_error( GLcontext *ctx, GLenum error );
164d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul
165c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettextern void GLAPIENTRY
166fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul_mesa_Finish( void );
167fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul
168c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettextern void GLAPIENTRY
169fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul_mesa_Flush( void );
170fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul
1716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
172fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul
17306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
17406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
175a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul/**
176a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * \name Macros for flushing buffered rendering commands before state changes,
177a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * checking if inside glBegin/glEnd, etc.
178a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul */
17906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/*@{*/
18006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
18106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/**
18206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Flush vertices.
18306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
18406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context.
18506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param newstate new state.
18606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
18706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Checks if dd_function_table::NeedFlush is marked to flush stored vertices,
18806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * and calls dd_function_table::FlushVertices if so. Marks
18906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * __GLcontextRec::NewState with \p newstate.
19006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */
19106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define FLUSH_VERTICES(ctx, newstate)				\
19206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo {								\
19306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   if (MESA_VERBOSE & VERBOSE_STATE)				\
194b65bc4f87b356cf6228151cd2f341432e80dc6b8Brian Paul      _mesa_debug(ctx, "FLUSH_VERTICES in %s\n", MESA_FUNCTION);\
19506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   if (ctx->Driver.NeedFlush & FLUSH_STORED_VERTICES)		\
19606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul      ctx->Driver.FlushVertices(ctx, FLUSH_STORED_VERTICES);	\
19706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   ctx->NewState |= newstate;					\
19806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0)
19906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
20006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/**
20106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Flush current state.
20206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
20306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context.
20406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param newstate new state.
20506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
20606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Checks if dd_function_table::NeedFlush is marked to flush current state,
20706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * and calls dd_function_table::FlushVertices if so. Marks
20806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * __GLcontextRec::NewState with \p newstate.
20906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */
21006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define FLUSH_CURRENT(ctx, newstate)				\
21106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo {								\
21206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   if (MESA_VERBOSE & VERBOSE_STATE)				\
213b65bc4f87b356cf6228151cd2f341432e80dc6b8Brian Paul      _mesa_debug(ctx, "FLUSH_CURRENT in %s\n", MESA_FUNCTION);	\
21406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   if (ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT)		\
21506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul      ctx->Driver.FlushVertices(ctx, FLUSH_UPDATE_CURRENT);	\
21606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   ctx->NewState |= newstate;					\
21706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0)
21806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
21906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/**
22006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Macro to assert that the API call was made outside the
22106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * glBegin()/glEnd() pair, with return value.
22206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
22306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context.
22406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param retval value to return value in case the assertion fails.
22506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */
22606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval)		\
22706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo {									\
22806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) {	\
229a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "Inside glBegin/glEnd");	\
23006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul      return retval;							\
23106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   }									\
23206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0)
23306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
23406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/**
23506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Macro to assert that the API call was made outside the
23606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * glBegin()/glEnd() pair.
23706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
23806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context.
23906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */
24006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define ASSERT_OUTSIDE_BEGIN_END(ctx)					\
24106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo {									\
24206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) {	\
243a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "Inside glBegin/glEnd");	\
24406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul      return;								\
24506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   }									\
24606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0)
24706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
24806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/**
24906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Macro to assert that the API call was made outside the
25006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * glBegin()/glEnd() pair and flush the vertices.
25106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
25206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context.
25306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */
25406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx)				\
25506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo {									\
25606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);					\
25706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   FLUSH_VERTICES(ctx, 0);						\
25806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0)
25906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
26006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/**
26106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Macro to assert that the API call was made outside the
26206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * glBegin()/glEnd() pair and flush the vertices, with return value.
26306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul *
26406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context.
26506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param retval value to return value in case the assertion fails.
26606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */
26706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, retval)	\
26806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo {									\
26906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval);			\
27006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul   FLUSH_VERTICES(ctx, 0);						\
27106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0)
27206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
27306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/*@}*/
27406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
27506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul
27629b4076f9acff96a867760fc885f5eaeb7586977Brian Paul
27729b4076f9acff96a867760fc885f5eaeb7586977Brian Paul/**
27829b4076f9acff96a867760fc885f5eaeb7586977Brian Paul * Is the secondary color needed?
27929b4076f9acff96a867760fc885f5eaeb7586977Brian Paul */
28029b4076f9acff96a867760fc885f5eaeb7586977Brian Paul#define NEED_SECONDARY_COLOR(CTX)					\
28129b4076f9acff96a867760fc885f5eaeb7586977Brian Paul   (((CTX)->Light.Enabled &&						\
28229b4076f9acff96a867760fc885f5eaeb7586977Brian Paul     (CTX)->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)	\
283853bda3e7c4dfa7d8cc462729f6a3dce89e44963Brian Paul    || (CTX)->Fog.ColorSumEnabled					\
284441bab8f171b0678303ff46fc79f236c349aafdbBrian    || ((CTX)->VertexProgram._Current &&				\
285ca8d91610f547b9c66f703e07356f6347a121516Xiang, Haihao        ((CTX)->VertexProgram._Current != (CTX)->VertexProgram._TnlProgram) &&    \
286441bab8f171b0678303ff46fc79f236c349aafdbBrian        ((CTX)->VertexProgram._Current->Base.InputsRead & VERT_BIT_COLOR1)) \
287441bab8f171b0678303ff46fc79f236c349aafdbBrian    || ((CTX)->FragmentProgram._Current &&				\
288ca8d91610f547b9c66f703e07356f6347a121516Xiang, Haihao        ((CTX)->FragmentProgram._Current != (CTX)->FragmentProgram._TexEnvProgram) &&  \
289441bab8f171b0678303ff46fc79f236c349aafdbBrian        ((CTX)->FragmentProgram._Current->Base.InputsRead & FRAG_BIT_COL1)) \
290853bda3e7c4dfa7d8cc462729f6a3dce89e44963Brian Paul   )
29129b4076f9acff96a867760fc885f5eaeb7586977Brian Paul
29229b4076f9acff96a867760fc885f5eaeb7586977Brian Paul
293abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul/**
294abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul * Is RGBA LogicOp enabled?
295abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul */
296abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul#define RGBA_LOGICOP_ENABLED(CTX) \
297abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul  ((CTX)->Color.ColorLogicOpEnabled || \
298abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul   ((CTX)->Color.BlendEnabled && (CTX)->Color.BlendEquationRGB == GL_LOGIC_OP))
299abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul
300abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul
3014e2de9531e4869edf12536c2cb37d3145ee4065cBrian Paul#endif /* CONTEXT_H */
302