xref: /third_party/mesa3d/src/mesa/main/context.h (revision bf215546)
1/*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25
26/**
27 * \file context.h
28 * Mesa context and visual-related functions.
29 *
30 * There are three large Mesa data types/classes which are meant to be
31 * used by device drivers:
32 * - struct gl_context: this contains the Mesa rendering state
33 * - struct gl_config:  this describes the color buffer (RGB vs. ci), whether
34 *   or not there's a depth buffer, stencil buffer, etc.
35 * - struct gl_framebuffer:  contains pointers to the depth buffer, stencil
36 *   buffer, accum buffer and alpha buffers.
37 *
38 * These types should be encapsulated by corresponding device driver
39 * data types.  See xmesa.h and xmesaP.h for an example.
40 *
41 * In OOP terms, struct gl_context, struct gl_config, and struct gl_framebuffer
42 * are base classes which the device driver must derive from.
43 *
44 * The following functions create and destroy these data types.
45 */
46
47
48#ifndef CONTEXT_H
49#define CONTEXT_H
50
51
52#include "errors.h"
53
54#include "extensions.h"
55#include "mtypes.h"
56#include "vbo/vbo.h"
57
58
59#ifdef __cplusplus
60extern "C" {
61#endif
62
63
64struct _glapi_table;
65
66
67/** \name Context-related functions */
68/*@{*/
69
70extern void
71_mesa_initialize(const char *extensions_override);
72
73extern GLboolean
74_mesa_initialize_context( struct gl_context *ctx,
75                          gl_api api,
76                          bool no_error,
77                          const struct gl_config *visual,
78                          struct gl_context *share_list,
79                          const struct dd_function_table *driverFunctions);
80
81extern struct _glapi_table *
82_mesa_alloc_dispatch_table(bool glthread);
83
84extern void
85_mesa_initialize_exec_table(struct gl_context *ctx);
86
87extern void
88_mesa_initialize_dispatch_tables(struct gl_context *ctx);
89
90extern struct _glapi_table *
91_mesa_new_nop_table(unsigned numEntries, bool glthread);
92
93extern void
94_mesa_free_context_data(struct gl_context *ctx, bool destroy_debug_output);
95
96extern void
97_mesa_copy_context(const struct gl_context *src, struct gl_context *dst, GLuint mask);
98
99extern GLboolean
100_mesa_make_current( struct gl_context *ctx, struct gl_framebuffer *drawBuffer,
101                    struct gl_framebuffer *readBuffer );
102
103extern GLboolean
104_mesa_share_state(struct gl_context *ctx, struct gl_context *ctxToShare);
105
106extern struct gl_context *
107_mesa_get_current_context(void);
108
109/*@}*/
110
111extern void
112_mesa_init_constants(struct gl_constants *consts, gl_api api);
113
114extern struct _glapi_table *
115_mesa_get_dispatch(struct gl_context *ctx);
116
117extern void
118_mesa_set_context_lost_dispatch(struct gl_context *ctx);
119
120
121
122/** \name Miscellaneous */
123/*@{*/
124
125extern void
126_mesa_flush(struct gl_context *ctx);
127
128/*@}*/
129
130
131/**
132 * Are we currently between glBegin and glEnd?
133 * During execution, not display list compilation.
134 */
135static inline GLboolean
136_mesa_inside_begin_end(const struct gl_context *ctx)
137{
138   return ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END;
139}
140
141
142/**
143 * Are we currently between glBegin and glEnd in a display list?
144 */
145static inline GLboolean
146_mesa_inside_dlist_begin_end(const struct gl_context *ctx)
147{
148   return ctx->Driver.CurrentSavePrimitive <= PRIM_MAX;
149}
150
151
152
153/**
154 * \name Macros for flushing buffered rendering commands before state changes,
155 * checking if inside glBegin/glEnd, etc.
156 */
157/*@{*/
158
159/**
160 * Flush vertices.
161 *
162 * \param ctx GL context.
163 * \param newstate new state.
164 *
165 * Checks if dd_function_table::NeedFlush is marked to flush stored vertices,
166 * and calls dd_function_table::FlushVertices if so. Marks
167 * __struct gl_contextRec::NewState with \p newstate.
168 */
169#define FLUSH_VERTICES(ctx, newstate, pop_attrib_mask)          \
170do {								\
171   if (MESA_VERBOSE & VERBOSE_STATE)				\
172      _mesa_debug(ctx, "FLUSH_VERTICES in %s\n", __func__);	\
173   if (ctx->Driver.NeedFlush & FLUSH_STORED_VERTICES)		\
174      vbo_exec_FlushVertices(ctx, FLUSH_STORED_VERTICES);	\
175   ctx->NewState |= newstate;					\
176   ctx->PopAttribState |= pop_attrib_mask;                      \
177} while (0)
178
179/**
180 * Flush current state.
181 *
182 * \param ctx GL context.
183 * \param newstate new state.
184 *
185 * Checks if dd_function_table::NeedFlush is marked to flush current state,
186 * and calls dd_function_table::FlushVertices if so. Marks
187 * __struct gl_contextRec::NewState with \p newstate.
188 */
189#define FLUSH_CURRENT(ctx, newstate)				\
190do {								\
191   if (MESA_VERBOSE & VERBOSE_STATE)				\
192      _mesa_debug(ctx, "FLUSH_CURRENT in %s\n", __func__);	\
193   if (ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT)		\
194      vbo_exec_FlushVertices(ctx, FLUSH_UPDATE_CURRENT);	\
195   ctx->NewState |= newstate;					\
196} while (0)
197
198/**
199 * Flush vertices.
200 *
201 * \param ctx GL context.
202 *
203 * Checks if dd_function_table::NeedFlush is marked to flush stored vertices
204 * or current state and calls dd_function_table::FlushVertices if so.
205 */
206#define FLUSH_FOR_DRAW(ctx)                                     \
207do {                                                            \
208   if (MESA_VERBOSE & VERBOSE_STATE)                            \
209      _mesa_debug(ctx, "FLUSH_FOR_DRAW in %s\n", __func__);     \
210   if (ctx->Driver.NeedFlush) {                                 \
211      if (ctx->_AllowDrawOutOfOrder) {                          \
212          if (ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT)     \
213             vbo_exec_FlushVertices(ctx, FLUSH_UPDATE_CURRENT); \
214      } else {                                                  \
215         vbo_exec_FlushVertices(ctx, ctx->Driver.NeedFlush);    \
216      }                                                         \
217   }                                                            \
218} while (0)
219
220/**
221 * Macro to assert that the API call was made outside the
222 * glBegin()/glEnd() pair, with return value.
223 *
224 * \param ctx GL context.
225 * \param retval value to return in case the assertion fails.
226 */
227#define ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval)		\
228do {									\
229   if (_mesa_inside_begin_end(ctx)) {					\
230      _mesa_error(ctx, GL_INVALID_OPERATION, "Inside glBegin/glEnd");	\
231      return retval;							\
232   }									\
233} while (0)
234
235/**
236 * Macro to assert that the API call was made outside the
237 * glBegin()/glEnd() pair.
238 *
239 * \param ctx GL context.
240 */
241#define ASSERT_OUTSIDE_BEGIN_END(ctx)					\
242do {									\
243   if (_mesa_inside_begin_end(ctx)) {					\
244      _mesa_error(ctx, GL_INVALID_OPERATION, "Inside glBegin/glEnd");	\
245      return;								\
246   }									\
247} while (0)
248
249/*@}*/
250
251
252/**
253 * Checks if the context is for Desktop GL (Compatibility or Core)
254 */
255static inline bool
256_mesa_is_desktop_gl(const struct gl_context *ctx)
257{
258   return ctx->API == API_OPENGL_COMPAT || ctx->API == API_OPENGL_CORE;
259}
260
261
262/**
263 * Checks if the context is for any GLES version
264 */
265static inline bool
266_mesa_is_gles(const struct gl_context *ctx)
267{
268   return ctx->API == API_OPENGLES || ctx->API == API_OPENGLES2;
269}
270
271
272/**
273 * Checks if the context is for GLES 3.0 or later
274 */
275static inline bool
276_mesa_is_gles3(const struct gl_context *ctx)
277{
278   return ctx->API == API_OPENGLES2 && ctx->Version >= 30;
279}
280
281
282/**
283 * Checks if the context is for GLES 3.1 or later
284 */
285static inline bool
286_mesa_is_gles31(const struct gl_context *ctx)
287{
288   return ctx->API == API_OPENGLES2 && ctx->Version >= 31;
289}
290
291
292/**
293 * Checks if the context is for GLES 3.2 or later
294 */
295static inline bool
296_mesa_is_gles32(const struct gl_context *ctx)
297{
298   return ctx->API == API_OPENGLES2 && ctx->Version >= 32;
299}
300
301
302static inline bool
303_mesa_is_no_error_enabled(const struct gl_context *ctx)
304{
305   return ctx->Const.ContextFlags & GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR;
306}
307
308
309static inline bool
310_mesa_has_integer_textures(const struct gl_context *ctx)
311{
312   return _mesa_has_EXT_texture_integer(ctx) || _mesa_is_gles3(ctx);
313}
314
315static inline bool
316_mesa_has_half_float_textures(const struct gl_context *ctx)
317{
318   return _mesa_has_ARB_texture_float(ctx) ||
319          _mesa_has_OES_texture_half_float(ctx);
320}
321
322static inline bool
323_mesa_has_float_textures(const struct gl_context *ctx)
324{
325   return _mesa_has_ARB_texture_float(ctx) ||
326          _mesa_has_OES_texture_float(ctx) || _mesa_is_gles3(ctx);
327 }
328
329static inline bool
330_mesa_has_texture_rgb10_a2ui(const struct gl_context *ctx)
331{
332   return _mesa_has_ARB_texture_rgb10_a2ui(ctx) || _mesa_is_gles3(ctx);
333}
334
335static inline bool
336_mesa_has_float_depth_buffer(const struct gl_context *ctx)
337{
338   return _mesa_has_ARB_depth_buffer_float(ctx) || _mesa_is_gles3(ctx);
339}
340
341static inline bool
342_mesa_has_packed_float(const struct gl_context *ctx)
343{
344   return _mesa_has_EXT_packed_float(ctx) || _mesa_is_gles3(ctx);
345}
346
347static inline bool
348_mesa_has_rg_textures(const struct gl_context *ctx)
349{
350   return _mesa_has_ARB_texture_rg(ctx) || _mesa_has_EXT_texture_rg(ctx) ||
351          _mesa_is_gles3(ctx);
352}
353
354static inline bool
355_mesa_has_texture_shared_exponent(const struct gl_context *ctx)
356{
357   return _mesa_has_EXT_texture_shared_exponent(ctx) || _mesa_is_gles3(ctx);
358}
359
360static inline bool
361_mesa_has_texture_type_2_10_10_10_REV(const struct gl_context *ctx)
362{
363   return _mesa_is_desktop_gl(ctx) ||
364          _mesa_has_EXT_texture_type_2_10_10_10_REV(ctx);
365}
366
367/**
368 * Checks if the context supports geometry shaders.
369 */
370static inline bool
371_mesa_has_geometry_shaders(const struct gl_context *ctx)
372{
373   return _mesa_has_OES_geometry_shader(ctx) ||
374          (_mesa_is_desktop_gl(ctx) && ctx->Version >= 32);
375}
376
377
378/**
379 * Checks if the context supports compute shaders.
380 */
381static inline bool
382_mesa_has_compute_shaders(const struct gl_context *ctx)
383{
384   return _mesa_has_ARB_compute_shader(ctx) ||
385      (ctx->API == API_OPENGLES2 && ctx->Version >= 31);
386}
387
388/**
389 * Checks if the context supports tessellation.
390 */
391static inline bool
392_mesa_has_tessellation(const struct gl_context *ctx)
393{
394   /* _mesa_has_EXT_tessellation_shader(ctx) is redundant with the OES
395    * check, so don't bother calling it.
396    */
397   return _mesa_has_OES_tessellation_shader(ctx) ||
398          _mesa_has_ARB_tessellation_shader(ctx);
399}
400
401static inline bool
402_mesa_has_texture_cube_map_array(const struct gl_context *ctx)
403{
404   return _mesa_has_ARB_texture_cube_map_array(ctx) ||
405          _mesa_has_OES_texture_cube_map_array(ctx);
406}
407
408static inline bool
409_mesa_has_texture_view(const struct gl_context *ctx)
410{
411   return _mesa_has_ARB_texture_view(ctx) ||
412          _mesa_has_OES_texture_view(ctx);
413}
414
415static inline bool
416_mesa_hw_select_enabled(const struct gl_context *ctx)
417{
418   return ctx->RenderMode == GL_SELECT &&
419      ctx->Const.HardwareAcceleratedSelect;
420}
421
422#ifdef __cplusplus
423}
424#endif
425
426
427#endif /* CONTEXT_H */
428