context.h revision 2ab18d63cb71d988265eeab431e4363081978144
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 * 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 78178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul_mesa_initialize_visual( GLvisual *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 94b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul_mesa_destroy_visual( GLvisual *vis ); 95b371e0da2b51da7d941de557b62434aaaca5be02Brian Paul 966dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/ 97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 98178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paul 99a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul/** \name Context-related functions */ 1006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/ 1016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 102178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern GLcontext * 103be3602da412ae56b5ee019fc47cc282eb3d66fadBrian Paul_mesa_create_context( const GLvisual *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, 110be3602da412ae56b5ee019fc47cc282eb3d66fadBrian Paul const GLvisual *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, 1172ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg const GLvisual *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, 1252ab18d63cb71d988265eeab431e4363081978144Kristian Høgsberg const GLvisual *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 1316fd15dd80666ccb1e9b99cedd306e32cc7cee989Brian Paul_mesa_initialize_context_extra(GLcontext *ctx); 1326fd15dd80666ccb1e9b99cedd306e32cc7cee989Brian Paul 1336fd15dd80666ccb1e9b99cedd306e32cc7cee989Brian Paulextern void 134b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul_mesa_free_context_data( GLcontext *ctx ); 1354d053ddae8cc48dd29a75e67290cd09ed995f5c3Brian Paul 136178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern void 137b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul_mesa_destroy_context( GLcontext *ctx ); 1384d053ddae8cc48dd29a75e67290cd09ed995f5c3Brian Paul 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 140178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern void 141b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul_mesa_copy_context(const GLcontext *src, GLcontext *dst, GLuint mask); 1420498682406d23226b5bc8973e02c7b3a9e0bdeaaBrian Paul 1430498682406d23226b5bc8973e02c7b3a9e0bdeaaBrian Paul 1443f856c6b6b7fa95ef97a8712876de88d7d57932eBrian Paulextern void 1453f856c6b6b7fa95ef97a8712876de88d7d57932eBrian Paul_mesa_check_init_viewport(GLcontext *ctx, GLuint width, GLuint height); 1463f856c6b6b7fa95ef97a8712876de88d7d57932eBrian Paul 14729c6c8eb18ace95b9af6dcf34e02c2b8db0ffda8José Fonsecaextern GLboolean 148e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul_mesa_make_current( GLcontext *ctx, GLframebuffer *drawBuffer, 149e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLframebuffer *readBuffer ); 1500003778847df6adb792f453df83808fefa560f18Brian Paul 151635ee2df37898fe408be565d189c2fb4dc5f61b1Brian Paulextern GLboolean 152635ee2df37898fe408be565d189c2fb4dc5f61b1Brian Paul_mesa_share_state(GLcontext *ctx, GLcontext *ctxToShare); 1533f02f90f943a996d88abc20f74503afbb56a4c98Brian Paul 154178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern GLcontext * 155b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul_mesa_get_current_context(void); 156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/ 1580498682406d23226b5bc8973e02c7b3a9e0bdeaaBrian Paul 1590498682406d23226b5bc8973e02c7b3a9e0bdeaaBrian Paul 1609a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paulextern void 1619a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul_mesa_notifySwapBuffers(__GLcontext *gc); 1629a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul 1639a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul 164fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulextern struct _glapi_table * 165fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_get_dispatch(GLcontext *ctx); 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 168b6e8256899a9a93c665c34e10efcc918f2fcc095Keith Whitwellvoid 169b6e8256899a9a93c665c34e10efcc918f2fcc095Keith Whitwell_mesa_set_mvp_with_dp4( GLcontext *ctx, 170b6e8256899a9a93c665c34e10efcc918f2fcc095Keith Whitwell GLboolean flag ); 171b6e8256899a9a93c665c34e10efcc918f2fcc095Keith Whitwell 172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 17356c4226fcc54158eb7fe54eeb13539a979ec155cBrian Paulextern GLboolean 17456c4226fcc54158eb7fe54eeb13539a979ec155cBrian Paul_mesa_valid_to_render(GLcontext *ctx, const char *where); 17556c4226fcc54158eb7fe54eeb13539a979ec155cBrian Paul 17656c4226fcc54158eb7fe54eeb13539a979ec155cBrian Paul 17756c4226fcc54158eb7fe54eeb13539a979ec155cBrian Paul 1786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name Miscellaneous */ 1796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/ 180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 181178a1c5a25b84bab1d5aae9e14694b531feea3caBrian Paulextern void 1824e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul_mesa_record_error( GLcontext *ctx, GLenum error ); 183d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul 1844837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paul 1854837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paulextern void 1864837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paul_mesa_finish(GLcontext *ctx); 1874837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paul 1884837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paulextern void 1894837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paul_mesa_flush(GLcontext *ctx); 1904837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paul 1914837e01bcd3d011a38d75cc9f1eff629c3de6fd6Brian Paul 192c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettextern void GLAPIENTRY 193fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul_mesa_Finish( void ); 194fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul 195c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettextern void GLAPIENTRY 196fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul_mesa_Flush( void ); 197fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul 1986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/ 199fa9df40e8a40824942ea8c6ec17c06c28bea1102Brian Paul 20006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul 201a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul/** 202a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * \name Macros for flushing buffered rendering commands before state changes, 203a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul * checking if inside glBegin/glEnd, etc. 204a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul */ 20506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/*@{*/ 20606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul 20706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/** 20806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Flush vertices. 20906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * 21006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context. 21106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param newstate new state. 21206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * 21306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Checks if dd_function_table::NeedFlush is marked to flush stored vertices, 21406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * and calls dd_function_table::FlushVertices if so. Marks 21506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * __GLcontextRec::NewState with \p newstate. 21606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */ 21706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define FLUSH_VERTICES(ctx, newstate) \ 21806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo { \ 21906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul if (MESA_VERBOSE & VERBOSE_STATE) \ 220b65bc4f87b356cf6228151cd2f341432e80dc6b8Brian Paul _mesa_debug(ctx, "FLUSH_VERTICES in %s\n", MESA_FUNCTION);\ 22106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul if (ctx->Driver.NeedFlush & FLUSH_STORED_VERTICES) \ 22206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul ctx->Driver.FlushVertices(ctx, FLUSH_STORED_VERTICES); \ 22306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul ctx->NewState |= newstate; \ 22406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0) 22506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul 22606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/** 22706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Flush current state. 22806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * 22906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context. 23006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param newstate new state. 23106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * 23206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Checks if dd_function_table::NeedFlush is marked to flush current state, 23306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * and calls dd_function_table::FlushVertices if so. Marks 23406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * __GLcontextRec::NewState with \p newstate. 23506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */ 23606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define FLUSH_CURRENT(ctx, newstate) \ 23706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo { \ 23806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul if (MESA_VERBOSE & VERBOSE_STATE) \ 239b65bc4f87b356cf6228151cd2f341432e80dc6b8Brian Paul _mesa_debug(ctx, "FLUSH_CURRENT in %s\n", MESA_FUNCTION); \ 24006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul if (ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT) \ 24106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul ctx->Driver.FlushVertices(ctx, FLUSH_UPDATE_CURRENT); \ 24206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul ctx->NewState |= newstate; \ 24306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0) 24406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul 24506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/** 24606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Macro to assert that the API call was made outside the 24706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * glBegin()/glEnd() pair, with return value. 24806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * 24906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context. 25006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param retval value to return value in case the assertion fails. 25106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */ 25206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval) \ 25306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo { \ 25406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) { \ 255a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "Inside glBegin/glEnd"); \ 25606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul return retval; \ 25706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul } \ 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. 26306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * 26406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context. 26506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */ 26606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define ASSERT_OUTSIDE_BEGIN_END(ctx) \ 26706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo { \ 26806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) { \ 269a623e008c651235769c7c50fc55f6e3782e4aacaBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "Inside glBegin/glEnd"); \ 27006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul return; \ 27106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul } \ 27206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0) 27306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul 27406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/** 27506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Macro to assert that the API call was made outside the 27606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * glBegin()/glEnd() pair and flush the vertices. 27706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * 27806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context. 27906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */ 28006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx) \ 28106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo { \ 28206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); \ 28306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul FLUSH_VERTICES(ctx, 0); \ 28406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0) 28506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul 28606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/** 28706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * Macro to assert that the API call was made outside the 28806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * glBegin()/glEnd() pair and flush the vertices, with return value. 28906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * 29006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param ctx GL context. 29106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul * \param retval value to return value in case the assertion fails. 29206588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul */ 29306588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul#define ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, retval) \ 29406588db3fa2c8292db57b3537bb3ad8811d82f46Brian Pauldo { \ 29506588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval); \ 29606588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul FLUSH_VERTICES(ctx, 0); \ 29706588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul} while (0) 29806588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul 29906588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul/*@}*/ 30006588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul 30106588db3fa2c8292db57b3537bb3ad8811d82f46Brian Paul 30229b4076f9acff96a867760fc885f5eaeb7586977Brian Paul 30329b4076f9acff96a867760fc885f5eaeb7586977Brian Paul/** 30429b4076f9acff96a867760fc885f5eaeb7586977Brian Paul * Is the secondary color needed? 30529b4076f9acff96a867760fc885f5eaeb7586977Brian Paul */ 30629b4076f9acff96a867760fc885f5eaeb7586977Brian Paul#define NEED_SECONDARY_COLOR(CTX) \ 30729b4076f9acff96a867760fc885f5eaeb7586977Brian Paul (((CTX)->Light.Enabled && \ 30829b4076f9acff96a867760fc885f5eaeb7586977Brian Paul (CTX)->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) \ 309853bda3e7c4dfa7d8cc462729f6a3dce89e44963Brian Paul || (CTX)->Fog.ColorSumEnabled \ 310441bab8f171b0678303ff46fc79f236c349aafdbBrian || ((CTX)->VertexProgram._Current && \ 311ca8d91610f547b9c66f703e07356f6347a121516Xiang, Haihao ((CTX)->VertexProgram._Current != (CTX)->VertexProgram._TnlProgram) && \ 312441bab8f171b0678303ff46fc79f236c349aafdbBrian ((CTX)->VertexProgram._Current->Base.InputsRead & VERT_BIT_COLOR1)) \ 313441bab8f171b0678303ff46fc79f236c349aafdbBrian || ((CTX)->FragmentProgram._Current && \ 314ca8d91610f547b9c66f703e07356f6347a121516Xiang, Haihao ((CTX)->FragmentProgram._Current != (CTX)->FragmentProgram._TexEnvProgram) && \ 315441bab8f171b0678303ff46fc79f236c349aafdbBrian ((CTX)->FragmentProgram._Current->Base.InputsRead & FRAG_BIT_COL1)) \ 316853bda3e7c4dfa7d8cc462729f6a3dce89e44963Brian Paul ) 31729b4076f9acff96a867760fc885f5eaeb7586977Brian Paul 31829b4076f9acff96a867760fc885f5eaeb7586977Brian Paul 319abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul/** 320abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul * Is RGBA LogicOp enabled? 321abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul */ 322abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul#define RGBA_LOGICOP_ENABLED(CTX) \ 323abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul ((CTX)->Color.ColorLogicOpEnabled || \ 324abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul ((CTX)->Color.BlendEnabled && (CTX)->Color.BlendEquationRGB == GL_LOGIC_OP)) 325abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul 326abc73d9cba655479af493fabd13a488e5f7951ebBrian Paul 3274e2de9531e4869edf12536c2cb37d3145ee4065cBrian Paul#endif /* CONTEXT_H */ 328