1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  6.5.1
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file context.h
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa context and visual-related functions.
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * There are three large Mesa data types/classes which are meant to be
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * used by device drivers:
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - struct gl_context: this contains the Mesa rendering state
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - struct gl_config:  this describes the color buffer (RGB vs. ci), whether
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   or not there's a depth buffer, stencil buffer, etc.
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - struct gl_framebuffer:  contains pointers to the depth buffer, stencil
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   buffer, accum buffer and alpha buffers.
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * These types should be encapsulated by corresponding device driver
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * data types.  See xmesa.h and xmesaP.h for an example.
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In OOP terms, struct gl_context, struct gl_config, and struct gl_framebuffer
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * are base classes which the device driver must derive from.
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The following functions create and destroy these data types.
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef CONTEXT_H
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CONTEXT_H
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h"
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h"
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" {
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct _glapi_table;
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** \name Visual-related functions */
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@{*/
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern struct gl_config *
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_create_visual( GLboolean dbFlag,
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLboolean stereoFlag,
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint redBits,
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint greenBits,
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint blueBits,
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint alphaBits,
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint depthBits,
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint stencilBits,
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint accumRedBits,
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint accumGreenBits,
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint accumBlueBits,
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint accumAlphaBits,
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLint numSamples );
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern GLboolean
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_initialize_visual( struct gl_config *v,
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLboolean dbFlag,
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLboolean stereoFlag,
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint redBits,
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint greenBits,
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint blueBits,
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint alphaBits,
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint depthBits,
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint stencilBits,
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint accumRedBits,
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint accumGreenBits,
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint accumBlueBits,
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint accumAlphaBits,
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLint numSamples );
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_destroy_visual( struct gl_config *vis );
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** \name Context-related functions */
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@{*/
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern GLboolean
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_initialize_context( struct gl_context *ctx,
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          gl_api api,
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          const struct gl_config *visual,
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          struct gl_context *share_list,
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          const struct dd_function_table *driverFunctions,
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          void *driverContext );
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern struct gl_context *
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_create_context(gl_api api,
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const struct gl_config *visual,
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     struct gl_context *share_list,
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const struct dd_function_table *driverFunctions,
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     void *driverContext);
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_free_context_data( struct gl_context *ctx );
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_destroy_context( struct gl_context *ctx );
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_copy_context(const struct gl_context *src, struct gl_context *dst, GLuint mask);
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_check_init_viewport(struct gl_context *ctx, GLuint width, GLuint height);
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern GLboolean
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_make_current( struct gl_context *ctx, struct gl_framebuffer *drawBuffer,
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    struct gl_framebuffer *readBuffer );
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern GLboolean
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_share_state(struct gl_context *ctx, struct gl_context *ctxToShare);
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern struct gl_context *
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_get_current_context(void);
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_init_get_hash(struct gl_context *ctx);
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_notifySwapBuffers(struct gl_context *gc);
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern struct _glapi_table *
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_get_dispatch(struct gl_context *ctx);
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_set_mvp_with_dp4( struct gl_context *ctx,
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLboolean flag );
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern GLboolean
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_valid_to_render(struct gl_context *ctx, const char *where);
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** \name Miscellaneous */
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@{*/
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_record_error( struct gl_context *ctx, GLenum error );
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_finish(struct gl_context *ctx);
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_flush(struct gl_context *ctx);
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void GLAPIENTRY
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_Finish( void );
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void GLAPIENTRY
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_Flush( void );
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \name Macros for flushing buffered rendering commands before state changes,
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * checking if inside glBegin/glEnd, etc.
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@{*/
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flush vertices.
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param newstate new state.
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Checks if dd_function_table::NeedFlush is marked to flush stored vertices,
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and calls dd_function_table::FlushVertices if so. Marks
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __struct gl_contextRec::NewState with \p newstate.
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FLUSH_VERTICES(ctx, newstate)				\
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {								\
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_STATE)				\
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "FLUSH_VERTICES in %s\n", MESA_FUNCTION);\
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Driver.NeedFlush & FLUSH_STORED_VERTICES)		\
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.FlushVertices(ctx, FLUSH_STORED_VERTICES);	\
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->NewState |= newstate;					\
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flush current state.
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param newstate new state.
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Checks if dd_function_table::NeedFlush is marked to flush current state,
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and calls dd_function_table::FlushVertices if so. Marks
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __struct gl_contextRec::NewState with \p newstate.
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FLUSH_CURRENT(ctx, newstate)				\
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {								\
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_STATE)				\
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "FLUSH_CURRENT in %s\n", MESA_FUNCTION);	\
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT)		\
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.FlushVertices(ctx, FLUSH_UPDATE_CURRENT);	\
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->NewState |= newstate;					\
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Macro to assert that the API call was made outside the
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glBegin()/glEnd() pair, with return value.
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param retval value to return in case the assertion fails.
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval)		\
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {									\
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) {	\
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "Inside glBegin/glEnd");	\
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return retval;							\
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }									\
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Macro to assert that the API call was made outside the
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glBegin()/glEnd() pair.
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASSERT_OUTSIDE_BEGIN_END(ctx)					\
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {									\
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) {	\
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "Inside glBegin/glEnd");	\
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;								\
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }									\
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Macro to assert that the API call was made outside the
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glBegin()/glEnd() pair and flush the vertices.
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx)				\
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {									\
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);					\
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FLUSH_VERTICES(ctx, 0);						\
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Macro to assert that the API call was made outside the
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glBegin()/glEnd() pair and flush the vertices, with return value.
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param retval value to return in case the assertion fails.
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, retval)	\
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {									\
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval);			\
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FLUSH_VERTICES(ctx, 0);						\
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Checks if the context is for Desktop GL (Compatibility or Core)
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLboolean
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_desktop_gl(const struct gl_context *ctx)
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ctx->API == API_OPENGL || ctx->API == API_OPENGL_CORE;
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Checks if the context is for any GLES version
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLboolean
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_gles(const struct gl_context *ctx)
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ctx->API == API_OPENGLES || ctx->API == API_OPENGLES2;
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Checks if the context is for GLES 3.x
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLboolean
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_gles3(const struct gl_context *ctx)
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ctx->API == API_OPENGLES2 && ctx->Version >= 30;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* CONTEXT_H */
329