X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fcontext.h;h=46444d2c427a6c3b8a6bed62345693411ab0871d;hb=1a092fcf3bd673074d5b0b6794858c3f050aa969;hp=2687dc596a9993f64c90ed9ff854012349e038c9;hpb=b65bc4f87b356cf6228151cd2f341432e80dc6b8;p=mesa.git diff --git a/src/mesa/main/context.h b/src/mesa/main/context.h index 2687dc596a9..46444d2c427 100644 --- a/src/mesa/main/context.h +++ b/src/mesa/main/context.h @@ -1,29 +1,7 @@ -/** - * \file context.h - * Mesa context/visual/framebuffer management functions. - * - * There are three Mesa data types which are meant to be used by device - * drivers: - * - GLcontext: this contains the Mesa rendering state - * - GLvisual: this describes the color buffer (RGB vs. ci), whether or not - * there's a depth buffer, stencil buffer, etc. - * - GLframebuffer: contains pointers to the depth buffer, stencil buffer, - * accum buffer and alpha buffers. - * - * These types should be encapsulated by corresponding device driver - * data types. See xmesa.h and xmesaP.h for an example. - * - * In OOP terms, GLcontext, GLvisual, and GLframebuffer are base classes - * which the device driver must derive from. - * - * The following functions create and destroy these data types. - */ - /* * Mesa 3-D graphics library - * Version: 4.1 * - * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -38,9 +16,32 @@ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + + +/** + * \file context.h + * Mesa context and visual-related functions. + * + * There are three large Mesa data types/classes which are meant to be + * used by device drivers: + * - struct gl_context: this contains the Mesa rendering state + * - struct gl_config: this describes the color buffer (RGB vs. ci), whether + * or not there's a depth buffer, stencil buffer, etc. + * - struct gl_framebuffer: contains pointers to the depth buffer, stencil + * buffer, accum buffer and alpha buffers. + * + * These types should be encapsulated by corresponding device driver + * data types. See xmesa.h and xmesaP.h for an example. + * + * In OOP terms, struct gl_context, struct gl_config, and struct gl_framebuffer + * are base classes which the device driver must derive from. + * + * The following functions create and destroy these data types. */ @@ -48,24 +49,30 @@ #define CONTEXT_H -#include "glapi.h" #include "imports.h" +#include "extensions.h" #include "mtypes.h" +#include "vbo/vbo.h" -/**********************************************************************/ -/** \name Create/destroy a GLvisual. */ +#ifdef __cplusplus +extern "C" { +#endif + + +struct _glapi_table; + + +/** \name Visual-related functions */ /*@{*/ -extern GLvisual * -_mesa_create_visual( GLboolean rgbFlag, - GLboolean dbFlag, +extern struct gl_config * +_mesa_create_visual( GLboolean dbFlag, GLboolean stereoFlag, GLint redBits, GLint greenBits, GLint blueBits, GLint alphaBits, - GLint indexBits, GLint depthBits, GLint stencilBits, GLint accumRedBits, @@ -75,15 +82,13 @@ _mesa_create_visual( GLboolean rgbFlag, GLint numSamples ); extern GLboolean -_mesa_initialize_visual( GLvisual *v, - GLboolean rgbFlag, +_mesa_initialize_visual( struct gl_config *v, GLboolean dbFlag, GLboolean stereoFlag, GLint redBits, GLint greenBits, GLint blueBits, GLint alphaBits, - GLint indexBits, GLint depthBits, GLint stencilBits, GLint accumRedBits, @@ -93,163 +98,85 @@ _mesa_initialize_visual( GLvisual *v, GLint numSamples ); extern void -_mesa_destroy_visual( GLvisual *vis ); +_mesa_destroy_visual( struct gl_config *vis ); /*@}*/ -/**********************************************************************/ -/** \name Create/destroy a GLframebuffer. */ +/** \name Context-related functions */ /*@{*/ - -extern GLframebuffer * -_mesa_create_framebuffer( const GLvisual *visual, - GLboolean softwareDepth, - GLboolean softwareStencil, - GLboolean softwareAccum, - GLboolean softwareAlpha ); - -extern void -_mesa_initialize_framebuffer( GLframebuffer *fb, - const GLvisual *visual, - GLboolean softwareDepth, - GLboolean softwareStencil, - GLboolean softwareAccum, - GLboolean softwareAlpha ); - -extern void -_mesa_free_framebuffer_data( GLframebuffer *buffer ); - -extern void -_mesa_destroy_framebuffer( GLframebuffer *buffer ); - -/*@}*/ - - -/**********************************************************************/ -/** \name Create/destroy a GLcontext. */ -/*@{*/ - -extern GLcontext * -_mesa_create_context( const GLvisual *visual, - GLcontext *share_list, - void *driver_ctx, - GLboolean direct ); extern GLboolean -_mesa_initialize_context( GLcontext *ctx, - const GLvisual *visual, - GLcontext *share_list, - void *driver_ctx, - GLboolean direct ); +_mesa_initialize_context( struct gl_context *ctx, + gl_api api, + const struct gl_config *visual, + struct gl_context *share_list, + const struct dd_function_table *driverFunctions); + +extern struct gl_context * +_mesa_create_context(gl_api api, + const struct gl_config *visual, + struct gl_context *share_list, + const struct dd_function_table *driverFunctions); extern void -_mesa_free_context_data( GLcontext *ctx ); +_mesa_free_context_data( struct gl_context *ctx ); extern void -_mesa_destroy_context( GLcontext *ctx ); +_mesa_destroy_context( struct gl_context *ctx ); extern void -_mesa_copy_context(const GLcontext *src, GLcontext *dst, GLuint mask); +_mesa_copy_context(const struct gl_context *src, struct gl_context *dst, GLuint mask); extern void -_mesa_make_current( GLcontext *ctx, GLframebuffer *buffer ); - - -extern void -_mesa_make_current2( GLcontext *ctx, GLframebuffer *drawBuffer, - GLframebuffer *readBuffer ); - - -extern GLcontext * -_mesa_get_current_context(void); - -/*@}*/ - - -/** - * Macro for declaration and fetching the current context. - * - * \param C local variable which will hold the current context. - * - * It should be used in the variable declaration area of a function: - * \code - * ... - * { - * GET_CURRENT_CONTEXT(ctx); - * ... - * \endcode - */ -#ifdef THREADS - -#define GET_CURRENT_CONTEXT(C) GLcontext *C = (GLcontext *) (_glapi_Context ? _glapi_Context : _glapi_get_context()) - -#else - -#define GET_CURRENT_CONTEXT(C) GLcontext *C = (GLcontext *) _glapi_Context - -#endif - - - -/**********************************************************************/ -/** \name OpenGL SI-style export functions. */ -/*@{*/ - -extern GLboolean -_mesa_destroyContext(__GLcontext *gc); - -extern GLboolean -_mesa_loseCurrent(__GLcontext *gc); +_mesa_check_init_viewport(struct gl_context *ctx, GLuint width, GLuint height); extern GLboolean -_mesa_makeCurrent(__GLcontext *gc); +_mesa_make_current( struct gl_context *ctx, struct gl_framebuffer *drawBuffer, + struct gl_framebuffer *readBuffer ); extern GLboolean -_mesa_shareContext(__GLcontext *gc, __GLcontext *gcShare); +_mesa_share_state(struct gl_context *ctx, struct gl_context *ctxToShare); -extern GLboolean -_mesa_copyContext(__GLcontext *dst, const __GLcontext *src, GLuint mask); - -extern GLboolean -_mesa_forceCurrent(__GLcontext *gc); +extern struct gl_context * +_mesa_get_current_context(void); -extern GLboolean -_mesa_notifyResize(__GLcontext *gc); +/*@}*/ extern void -_mesa_notifyDestroy(__GLcontext *gc); +_mesa_init_constants(struct gl_constants *consts, gl_api api); extern void -_mesa_notifySwapBuffers(__GLcontext *gc); - -extern struct __GLdispatchStateRec * -_mesa_dispatchExec(__GLcontext *gc); +_mesa_init_get_hash(struct gl_context *ctx); extern void -_mesa_beginDispatchOverride(__GLcontext *gc); +_mesa_notifySwapBuffers(struct gl_context *gc); -extern void -_mesa_endDispatchOverride(__GLcontext *gc); -/*@}*/ +extern struct _glapi_table * +_mesa_get_dispatch(struct gl_context *ctx); -extern struct _glapi_table * -_mesa_get_dispatch(GLcontext *ctx); +extern GLboolean +_mesa_valid_to_render(struct gl_context *ctx, const char *where); -/**********************************************************************/ /** \name Miscellaneous */ /*@{*/ extern void -_mesa_record_error( GLcontext *ctx, GLenum error ); +_mesa_record_error( struct gl_context *ctx, GLenum error ); +extern void +_mesa_finish(struct gl_context *ctx); + +extern void +_mesa_flush(struct gl_context *ctx); + extern void GLAPIENTRY _mesa_Finish( void ); @@ -259,12 +186,34 @@ _mesa_Flush( void ); /*@}*/ +/** + * Are we currently between glBegin and glEnd? + * During execution, not display list compilation. + */ +static inline GLboolean +_mesa_inside_begin_end(const struct gl_context *ctx) +{ + return ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END; +} + + +/** + * Are we currently between glBegin and glEnd in a display list? + */ +static inline GLboolean +_mesa_inside_dlist_begin_end(const struct gl_context *ctx) +{ + return ctx->Driver.CurrentSavePrimitive <= PRIM_MAX; +} -/**********************************************************************/ -/** \name Macros for contexts/flushing. */ -/*@{*/ +/** + * \name Macros for flushing buffered rendering commands before state changes, + * checking if inside glBegin/glEnd, etc. + */ +/*@{*/ + /** * Flush vertices. * @@ -273,14 +222,14 @@ _mesa_Flush( void ); * * Checks if dd_function_table::NeedFlush is marked to flush stored vertices, * and calls dd_function_table::FlushVertices if so. Marks - * __GLcontextRec::NewState with \p newstate. + * __struct gl_contextRec::NewState with \p newstate. */ #define FLUSH_VERTICES(ctx, newstate) \ do { \ if (MESA_VERBOSE & VERBOSE_STATE) \ _mesa_debug(ctx, "FLUSH_VERTICES in %s\n", MESA_FUNCTION);\ if (ctx->Driver.NeedFlush & FLUSH_STORED_VERTICES) \ - ctx->Driver.FlushVertices(ctx, FLUSH_STORED_VERTICES); \ + vbo_exec_FlushVertices(ctx, FLUSH_STORED_VERTICES); \ ctx->NewState |= newstate; \ } while (0) @@ -292,14 +241,14 @@ do { \ * * Checks if dd_function_table::NeedFlush is marked to flush current state, * and calls dd_function_table::FlushVertices if so. Marks - * __GLcontextRec::NewState with \p newstate. + * __struct gl_contextRec::NewState with \p newstate. */ #define FLUSH_CURRENT(ctx, newstate) \ do { \ if (MESA_VERBOSE & VERBOSE_STATE) \ _mesa_debug(ctx, "FLUSH_CURRENT in %s\n", MESA_FUNCTION); \ if (ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT) \ - ctx->Driver.FlushVertices(ctx, FLUSH_UPDATE_CURRENT); \ + vbo_exec_FlushVertices(ctx, FLUSH_UPDATE_CURRENT); \ ctx->NewState |= newstate; \ } while (0) @@ -308,12 +257,12 @@ do { \ * glBegin()/glEnd() pair, with return value. * * \param ctx GL context. - * \param retval value to return value in case the assertion fails. + * \param retval value to return in case the assertion fails. */ #define ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval) \ do { \ - if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) { \ - _mesa_error( ctx, GL_INVALID_OPERATION, "begin/end" ); \ + if (_mesa_inside_begin_end(ctx)) { \ + _mesa_error(ctx, GL_INVALID_OPERATION, "Inside glBegin/glEnd"); \ return retval; \ } \ } while (0) @@ -326,65 +275,100 @@ do { \ */ #define ASSERT_OUTSIDE_BEGIN_END(ctx) \ do { \ - if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) { \ - _mesa_error( ctx, GL_INVALID_OPERATION, "begin/end" ); \ + if (_mesa_inside_begin_end(ctx)) { \ + _mesa_error(ctx, GL_INVALID_OPERATION, "Inside glBegin/glEnd"); \ return; \ } \ } while (0) +/*@}*/ + + /** - * Macro to assert that the API call was made outside the - * glBegin()/glEnd() pair and flush the vertices. - * - * \param ctx GL context. + * Checks if the context is for Desktop GL (Compatibility or Core) */ -#define ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx) \ -do { \ - ASSERT_OUTSIDE_BEGIN_END(ctx); \ - FLUSH_VERTICES(ctx, 0); \ -} while (0) +static inline bool +_mesa_is_desktop_gl(const struct gl_context *ctx) +{ + return ctx->API == API_OPENGL_COMPAT || ctx->API == API_OPENGL_CORE; +} + /** - * Macro to assert that the API call was made outside the - * glBegin()/glEnd() pair and flush the vertices, with return value. - * - * \param ctx GL context. - * \param retval value to return value in case the assertion fails. + * Checks if the context is for any GLES version */ -#define ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, retval) \ -do { \ - ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval); \ - FLUSH_VERTICES(ctx, 0); \ -} while (0) - +static inline bool +_mesa_is_gles(const struct gl_context *ctx) +{ + return ctx->API == API_OPENGLES || ctx->API == API_OPENGLES2; +} -/*@}*/ +/** + * Checks if the context is for GLES 3.0 or later + */ +static inline bool +_mesa_is_gles3(const struct gl_context *ctx) +{ + return ctx->API == API_OPENGLES2 && ctx->Version >= 30; +} /** - * Macros to help evaluate current state conditions + * Checks if the context is for GLES 3.1 or later */ +static inline bool +_mesa_is_gles31(const struct gl_context *ctx) +{ + return ctx->API == API_OPENGLES2 && ctx->Version >= 31; +} -/*@{*/ /** - * Is the secondary color needed? + * Checks if the context supports geometry shaders. */ -#define NEED_SECONDARY_COLOR(CTX) \ - (((CTX)->Light.Enabled && \ - (CTX)->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) \ - || (CTX)->Fog.ColorSumEnabled) +static inline bool +_mesa_has_geometry_shaders(const struct gl_context *ctx) +{ + return _mesa_has_OES_geometry_shader(ctx) || + (_mesa_is_desktop_gl(ctx) && ctx->Version >= 32); +} /** - * Is two-sided lighting in effect? + * Checks if the context supports compute shaders. */ -#define NEED_TWO_SIDED_LIGHTING(CTX) \ - (ctx->Light.Enabled && ctx->Light.Model.TwoSide) +static inline bool +_mesa_has_compute_shaders(const struct gl_context *ctx) +{ + return (ctx->API == API_OPENGL_CORE && ctx->Extensions.ARB_compute_shader) || + (ctx->API == API_OPENGLES2 && ctx->Version >= 31); +} +/** + * Checks if the context supports shader subroutines. + */ +static inline bool +_mesa_has_shader_subroutine(const struct gl_context *ctx) +{ + return ctx->API == API_OPENGL_CORE && + (ctx->Version >= 40 || ctx->Extensions.ARB_shader_subroutine); +} -/*@}*/ +/** + * Checks if the context supports tessellation. + */ +static inline GLboolean +_mesa_has_tessellation(const struct gl_context *ctx) +{ + return ctx->API == API_OPENGL_CORE && + ctx->Extensions.ARB_tessellation_shader; +} +#ifdef __cplusplus +} #endif + + +#endif /* CONTEXT_H */