2003-07-17 13:43:59 +00:00
|
|
|
/**
|
|
|
|
* \file buffers.c
|
|
|
|
* Frame buffer management.
|
|
|
|
*/
|
|
|
|
|
2000-02-02 19:14:56 +00:00
|
|
|
/*
|
|
|
|
* Mesa 3-D graphics library
|
2005-02-26 17:16:12 +00:00
|
|
|
* Version: 6.3
|
2000-11-22 07:32:16 +00:00
|
|
|
*
|
2005-02-26 17:16:12 +00:00
|
|
|
* Copyright (C) 1999-2005 Brian Paul All Rights Reserved.
|
2000-11-22 07:32:16 +00:00
|
|
|
*
|
2000-02-02 19:14:56 +00:00
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
|
|
* to deal in the Software without restriction, including without limitation
|
|
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
* Software is furnished to do so, subject to the following conditions:
|
2000-11-22 07:32:16 +00:00
|
|
|
*
|
2000-02-02 19:14:56 +00:00
|
|
|
* The above copyright notice and this permission notice shall be included
|
|
|
|
* in all copies or substantial portions of the Software.
|
2000-11-22 07:32:16 +00:00
|
|
|
*
|
2000-02-02 19:14:56 +00:00
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include "glheader.h"
|
|
|
|
#include "buffers.h"
|
2001-01-24 00:04:58 +00:00
|
|
|
#include "colormac.h"
|
2000-02-02 19:14:56 +00:00
|
|
|
#include "context.h"
|
|
|
|
#include "enums.h"
|
2005-02-09 03:51:11 +00:00
|
|
|
#include "fbobject.h"
|
2000-02-02 19:14:56 +00:00
|
|
|
#include "state.h"
|
2005-05-04 20:11:35 +00:00
|
|
|
|
|
|
|
|
|
|
|
#define BAD_MASK ~0u
|
2000-02-02 19:14:56 +00:00
|
|
|
|
|
|
|
|
2003-07-17 13:43:59 +00:00
|
|
|
#if _HAVE_FULL_GL
|
2003-10-21 22:22:17 +00:00
|
|
|
void GLAPIENTRY
|
2000-02-02 19:14:56 +00:00
|
|
|
_mesa_ClearIndex( GLfloat c )
|
|
|
|
{
|
|
|
|
GET_CURRENT_CONTEXT(ctx);
|
2000-12-26 05:09:27 +00:00
|
|
|
ASSERT_OUTSIDE_BEGIN_END(ctx);
|
|
|
|
|
2001-01-24 00:04:58 +00:00
|
|
|
if (ctx->Color.ClearIndex == (GLuint) c)
|
2000-12-26 05:09:27 +00:00
|
|
|
return;
|
2001-03-12 00:48:37 +00:00
|
|
|
|
2000-12-26 05:09:27 +00:00
|
|
|
FLUSH_VERTICES(ctx, _NEW_COLOR);
|
2000-02-02 19:14:56 +00:00
|
|
|
ctx->Color.ClearIndex = (GLuint) c;
|
2000-10-30 13:31:59 +00:00
|
|
|
|
2001-01-24 00:04:58 +00:00
|
|
|
if (!ctx->Visual.rgbMode && ctx->Driver.ClearIndex) {
|
2000-02-02 19:14:56 +00:00
|
|
|
/* it's OK to call glClearIndex in RGBA mode but it should be a NOP */
|
|
|
|
(*ctx->Driver.ClearIndex)( ctx, ctx->Color.ClearIndex );
|
|
|
|
}
|
|
|
|
}
|
2003-07-17 13:43:59 +00:00
|
|
|
#endif
|
2000-02-02 19:14:56 +00:00
|
|
|
|
|
|
|
|
2003-07-17 13:43:59 +00:00
|
|
|
/**
|
|
|
|
* Specify the clear values for the color buffers.
|
|
|
|
*
|
|
|
|
* \param red red color component.
|
|
|
|
* \param green green color component.
|
|
|
|
* \param blue blue color component.
|
|
|
|
* \param alpha alpha component.
|
|
|
|
*
|
|
|
|
* \sa glClearColor().
|
|
|
|
*
|
|
|
|
* Clamps the parameters and updates gl_colorbuffer_attrib::ClearColor. On a
|
|
|
|
* change, flushes the vertices and notifies the driver via the
|
|
|
|
* dd_function_table::ClearColor callback.
|
|
|
|
*/
|
2003-10-21 22:22:17 +00:00
|
|
|
void GLAPIENTRY
|
2001-01-24 00:04:58 +00:00
|
|
|
_mesa_ClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha )
|
2000-02-02 19:14:56 +00:00
|
|
|
{
|
2002-10-04 19:10:06 +00:00
|
|
|
GLfloat tmp[4];
|
2000-02-02 19:14:56 +00:00
|
|
|
GET_CURRENT_CONTEXT(ctx);
|
2000-12-26 05:09:27 +00:00
|
|
|
ASSERT_OUTSIDE_BEGIN_END(ctx);
|
2000-02-02 19:14:56 +00:00
|
|
|
|
2002-10-04 19:10:06 +00:00
|
|
|
tmp[0] = CLAMP(red, 0.0F, 1.0F);
|
|
|
|
tmp[1] = CLAMP(green, 0.0F, 1.0F);
|
|
|
|
tmp[2] = CLAMP(blue, 0.0F, 1.0F);
|
|
|
|
tmp[3] = CLAMP(alpha, 0.0F, 1.0F);
|
2000-12-26 05:09:27 +00:00
|
|
|
|
|
|
|
if (TEST_EQ_4V(tmp, ctx->Color.ClearColor))
|
2002-10-04 19:10:06 +00:00
|
|
|
return; /* no change */
|
2000-12-26 05:09:27 +00:00
|
|
|
|
|
|
|
FLUSH_VERTICES(ctx, _NEW_COLOR);
|
2002-10-04 19:10:06 +00:00
|
|
|
COPY_4V(ctx->Color.ClearColor, tmp);
|
2001-01-24 00:04:58 +00:00
|
|
|
|
|
|
|
if (ctx->Visual.rgbMode && ctx->Driver.ClearColor) {
|
|
|
|
/* it's OK to call glClearColor in CI mode but it should be a NOP */
|
|
|
|
(*ctx->Driver.ClearColor)(ctx, ctx->Color.ClearColor);
|
2000-02-02 19:14:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-07-17 13:43:59 +00:00
|
|
|
/**
|
|
|
|
* Clear buffers.
|
|
|
|
*
|
|
|
|
* \param mask bit-mask indicating the buffers to be cleared.
|
|
|
|
*
|
|
|
|
* Flushes the vertices and verifies the parameter. If __GLcontextRec::NewState
|
|
|
|
* is set then calls _mesa_update_state() to update gl_frame_buffer::_Xmin,
|
|
|
|
* etc. If the rasterization mode is set to GL_RENDER then requests the driver
|
|
|
|
* to clear the buffers, via the dd_function_table::Clear callback.
|
|
|
|
*/
|
2003-10-21 22:22:17 +00:00
|
|
|
void GLAPIENTRY
|
2000-02-02 19:14:56 +00:00
|
|
|
_mesa_Clear( GLbitfield mask )
|
|
|
|
{
|
|
|
|
GET_CURRENT_CONTEXT(ctx);
|
2000-12-26 05:09:27 +00:00
|
|
|
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
|
2000-02-02 19:14:56 +00:00
|
|
|
|
|
|
|
if (MESA_VERBOSE & VERBOSE_API)
|
2002-06-15 02:38:15 +00:00
|
|
|
_mesa_debug(ctx, "glClear 0x%x\n", mask);
|
2000-02-02 19:14:56 +00:00
|
|
|
|
2002-02-15 16:25:16 +00:00
|
|
|
if (mask & ~(GL_COLOR_BUFFER_BIT |
|
|
|
|
GL_DEPTH_BUFFER_BIT |
|
|
|
|
GL_STENCIL_BUFFER_BIT |
|
|
|
|
GL_ACCUM_BUFFER_BIT)) {
|
|
|
|
/* invalid bit set */
|
2004-01-30 17:39:11 +00:00
|
|
|
_mesa_error( ctx, GL_INVALID_VALUE, "glClear(0x%x)", mask);
|
2002-02-15 16:25:16 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2000-02-02 19:14:56 +00:00
|
|
|
if (ctx->NewState) {
|
2001-03-03 20:33:27 +00:00
|
|
|
_mesa_update_state( ctx ); /* update _Xmin, etc */
|
2000-02-02 19:14:56 +00:00
|
|
|
}
|
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
if (ctx->RenderMode == GL_RENDER) {
|
2000-11-13 20:02:56 +00:00
|
|
|
const GLint x = ctx->DrawBuffer->_Xmin;
|
|
|
|
const GLint y = ctx->DrawBuffer->_Ymin;
|
|
|
|
const GLint height = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin;
|
|
|
|
const GLint width = ctx->DrawBuffer->_Xmax - ctx->DrawBuffer->_Xmin;
|
2005-05-04 20:11:35 +00:00
|
|
|
GLbitfield bufferMask;
|
2000-02-02 19:14:56 +00:00
|
|
|
|
|
|
|
/* don't clear depth buffer if depth writing disabled */
|
|
|
|
if (!ctx->Depth.Mask)
|
2002-07-09 01:22:50 +00:00
|
|
|
mask &= ~GL_DEPTH_BUFFER_BIT;
|
2000-02-02 19:14:56 +00:00
|
|
|
|
2003-04-29 13:16:37 +00:00
|
|
|
/* Build the bitmask to send to device driver's Clear function.
|
|
|
|
* Note that the GL_COLOR_BUFFER_BIT flag will expand to 0, 1, 2 or 4
|
2005-05-04 20:11:35 +00:00
|
|
|
* of the BUFFER_BIT_FRONT/BACK_LEFT/RIGHT flags, or one of the
|
|
|
|
* BUFFER_BIT_COLORn flags.
|
2003-04-29 13:16:37 +00:00
|
|
|
*/
|
2005-05-04 20:11:35 +00:00
|
|
|
bufferMask = 0;
|
|
|
|
if (mask & GL_COLOR_BUFFER_BIT) {
|
|
|
|
bufferMask |= ctx->DrawBuffer->_ColorDrawBufferMask[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((mask & GL_DEPTH_BUFFER_BIT)
|
|
|
|
&& ctx->DrawBuffer->Visual.haveDepthBuffer) {
|
|
|
|
bufferMask |= BUFFER_BIT_DEPTH;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((mask & GL_STENCIL_BUFFER_BIT)
|
|
|
|
&& ctx->DrawBuffer->Visual.haveStencilBuffer) {
|
|
|
|
bufferMask |= BUFFER_BIT_STENCIL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((mask & GL_ACCUM_BUFFER_BIT)
|
|
|
|
&& ctx->DrawBuffer->Visual.haveAccumBuffer) {
|
|
|
|
bufferMask |= BUFFER_BIT_ACCUM;
|
|
|
|
}
|
2000-02-02 19:14:56 +00:00
|
|
|
|
|
|
|
ASSERT(ctx->Driver.Clear);
|
2005-05-04 20:11:35 +00:00
|
|
|
ctx->Driver.Clear( ctx, bufferMask, (GLboolean) !ctx->Scissor.Enabled,
|
2001-01-29 20:47:39 +00:00
|
|
|
x, y, width, height );
|
2000-02-02 19:14:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-10-02 16:39:09 +00:00
|
|
|
|
|
|
|
/**
|
2005-05-04 20:11:35 +00:00
|
|
|
* Return bitmask of BUFFER_BIT_* flags indicating which color buffers are
|
|
|
|
* available to the rendering context.
|
|
|
|
* This depends on the framebuffer we're writing to. For window system
|
|
|
|
* framebuffers we look at the framebuffer's visual. But for user-
|
|
|
|
* create framebuffers we look at the number of supported color attachments.
|
2004-10-02 16:39:09 +00:00
|
|
|
*/
|
|
|
|
static GLuint
|
2005-05-04 20:11:35 +00:00
|
|
|
supported_buffer_bitmask(const GLcontext *ctx, GLuint framebufferID)
|
2004-10-02 16:39:09 +00:00
|
|
|
{
|
2005-05-04 20:11:35 +00:00
|
|
|
GLuint mask = 0x0;
|
2004-12-03 15:24:34 +00:00
|
|
|
GLint i;
|
2004-10-02 16:39:09 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
if (framebufferID > 0) {
|
|
|
|
/* A user-created renderbuffer */
|
|
|
|
ASSERT(ctx->Extensions.EXT_framebuffer_object);
|
|
|
|
for (i = 0; i < ctx->Const.MaxColorAttachments; i++) {
|
|
|
|
mask |= (BUFFER_BIT_COLOR0 << i);
|
2004-10-02 16:39:09 +00:00
|
|
|
}
|
|
|
|
}
|
2005-05-04 20:11:35 +00:00
|
|
|
else {
|
|
|
|
/* A window system renderbuffer */
|
|
|
|
mask = BUFFER_BIT_FRONT_LEFT; /* always have this */
|
|
|
|
if (ctx->Visual.stereoMode) {
|
|
|
|
mask |= BUFFER_BIT_FRONT_RIGHT;
|
|
|
|
if (ctx->Visual.doubleBufferMode) {
|
|
|
|
mask |= BUFFER_BIT_BACK_LEFT | BUFFER_BIT_BACK_RIGHT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (ctx->Visual.doubleBufferMode) {
|
|
|
|
mask |= BUFFER_BIT_BACK_LEFT;
|
|
|
|
}
|
2004-10-02 16:39:09 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
for (i = 0; i < ctx->Visual.numAuxBuffers; i++) {
|
|
|
|
mask |= (BUFFER_BIT_AUX0 << i);
|
|
|
|
}
|
2004-10-02 16:39:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return mask;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Helper routine used by glDrawBuffer and glDrawBuffersARB.
|
2005-05-04 20:11:35 +00:00
|
|
|
* Given a GLenum naming one or more color buffers (such as
|
|
|
|
* GL_FRONT_AND_BACK), return the corresponding bitmask of BUFFER_BIT_* flags.
|
2004-10-02 16:39:09 +00:00
|
|
|
*/
|
|
|
|
static GLuint
|
|
|
|
draw_buffer_enum_to_bitmask(GLenum buffer)
|
|
|
|
{
|
|
|
|
switch (buffer) {
|
|
|
|
case GL_NONE:
|
|
|
|
return 0;
|
2005-05-04 20:11:35 +00:00
|
|
|
case GL_FRONT:
|
|
|
|
return BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_FRONT_RIGHT;
|
|
|
|
case GL_BACK:
|
|
|
|
return BUFFER_BIT_BACK_LEFT | BUFFER_BIT_BACK_RIGHT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_RIGHT:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_FRONT_RIGHT | BUFFER_BIT_BACK_RIGHT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_FRONT_RIGHT:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_FRONT_RIGHT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_BACK_RIGHT:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_BACK_RIGHT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_BACK_LEFT:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_BACK_LEFT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_FRONT_AND_BACK:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT
|
|
|
|
| BUFFER_BIT_FRONT_RIGHT | BUFFER_BIT_BACK_RIGHT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_LEFT:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_FRONT_LEFT:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_FRONT_LEFT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_AUX0:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_AUX0;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_AUX1:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_AUX1;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_AUX2:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_AUX2;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_AUX3:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_AUX3;
|
|
|
|
case GL_COLOR_ATTACHMENT0_EXT:
|
|
|
|
return BUFFER_BIT_COLOR0;
|
|
|
|
case GL_COLOR_ATTACHMENT1_EXT:
|
|
|
|
return BUFFER_BIT_COLOR1;
|
|
|
|
case GL_COLOR_ATTACHMENT2_EXT:
|
|
|
|
return BUFFER_BIT_COLOR2;
|
|
|
|
case GL_COLOR_ATTACHMENT3_EXT:
|
|
|
|
return BUFFER_BIT_COLOR3;
|
2004-10-02 16:39:09 +00:00
|
|
|
default:
|
|
|
|
/* error */
|
2005-05-04 20:11:35 +00:00
|
|
|
return BAD_MASK;
|
2004-10-02 16:39:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Helper routine used by glReadBuffer.
|
|
|
|
* Given a GLenum naming (a) color buffer(s), return the corresponding
|
|
|
|
* bitmask of DD_* flags.
|
|
|
|
*/
|
|
|
|
static GLuint
|
|
|
|
read_buffer_enum_to_bitmask(GLenum buffer)
|
|
|
|
{
|
|
|
|
switch (buffer) {
|
|
|
|
case GL_FRONT:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_FRONT_LEFT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_BACK:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_BACK_LEFT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_RIGHT:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_FRONT_RIGHT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_FRONT_RIGHT:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_FRONT_RIGHT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_BACK_RIGHT:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_BACK_RIGHT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_BACK_LEFT:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_BACK_LEFT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_LEFT:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_FRONT_LEFT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_FRONT_LEFT:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_FRONT_LEFT;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_AUX0:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_AUX0;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_AUX1:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_AUX1;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_AUX2:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_AUX2;
|
2004-10-02 16:39:09 +00:00
|
|
|
case GL_AUX3:
|
2005-05-04 20:11:35 +00:00
|
|
|
return BUFFER_BIT_AUX3;
|
|
|
|
case GL_COLOR_ATTACHMENT0_EXT:
|
|
|
|
return BUFFER_BIT_COLOR0;
|
|
|
|
case GL_COLOR_ATTACHMENT1_EXT:
|
|
|
|
return BUFFER_BIT_COLOR1;
|
|
|
|
case GL_COLOR_ATTACHMENT2_EXT:
|
|
|
|
return BUFFER_BIT_COLOR2;
|
|
|
|
case GL_COLOR_ATTACHMENT3_EXT:
|
|
|
|
return BUFFER_BIT_COLOR3;
|
2004-10-02 16:39:09 +00:00
|
|
|
default:
|
|
|
|
/* error */
|
2005-05-04 20:11:35 +00:00
|
|
|
return BAD_MASK;
|
2004-10-02 16:39:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-07-17 13:43:59 +00:00
|
|
|
/**
|
|
|
|
* Specify which color buffers to draw into.
|
|
|
|
*
|
2005-05-04 20:11:35 +00:00
|
|
|
* \param buffer color buffer, such as GL_LEFT or GL_FRONT_AND_BACK.
|
2003-07-17 13:43:59 +00:00
|
|
|
*
|
|
|
|
* Flushes the vertices and verifies the parameter and updates the
|
|
|
|
* gl_colorbuffer_attrib::_DrawDestMask bitfield. Marks new color state in
|
|
|
|
* __GLcontextRec::NewState and notifies the driver via the
|
|
|
|
* dd_function_table::DrawBuffer callback.
|
|
|
|
*/
|
2003-10-21 22:22:17 +00:00
|
|
|
void GLAPIENTRY
|
2005-05-04 20:11:35 +00:00
|
|
|
_mesa_DrawBuffer(GLenum buffer)
|
2000-02-02 19:14:56 +00:00
|
|
|
{
|
2005-05-04 20:11:35 +00:00
|
|
|
GLuint bufferID;
|
|
|
|
GLuint destMask;
|
2000-02-02 19:14:56 +00:00
|
|
|
GET_CURRENT_CONTEXT(ctx);
|
2000-12-26 05:09:27 +00:00
|
|
|
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* too complex... */
|
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
if (MESA_VERBOSE & VERBOSE_API) {
|
|
|
|
_mesa_debug(ctx, "glDrawBuffer %s\n", _mesa_lookup_enum_by_nr(buffer));
|
|
|
|
}
|
2000-02-02 19:14:56 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
bufferID = ctx->DrawBuffer->Name;
|
|
|
|
|
|
|
|
if (buffer == GL_NONE) {
|
|
|
|
destMask = 0x0;
|
2004-10-02 16:39:09 +00:00
|
|
|
}
|
2005-02-09 03:51:11 +00:00
|
|
|
else {
|
2005-05-04 20:11:35 +00:00
|
|
|
const GLuint supportedMask = supported_buffer_bitmask(ctx, bufferID);
|
|
|
|
destMask = draw_buffer_enum_to_bitmask(buffer);
|
|
|
|
if (destMask == BAD_MASK) {
|
|
|
|
/* totally bogus buffer */
|
|
|
|
_mesa_error(ctx, GL_INVALID_ENUM, "glDrawBuffer(buffer)");
|
2005-02-09 03:51:11 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
destMask &= supportedMask;
|
2005-05-04 20:11:35 +00:00
|
|
|
if (destMask == 0x0) {
|
|
|
|
/* none of the named color buffers exist! */
|
|
|
|
_mesa_error(ctx, GL_INVALID_OPERATION, "glDrawBuffer(buffer)");
|
2005-02-09 03:51:11 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2000-02-02 19:14:56 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
/* if we get here, there's no error so set new state */
|
|
|
|
_mesa_drawbuffers(ctx, 1, &buffer, &destMask);
|
2000-02-02 19:14:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-10-02 16:39:09 +00:00
|
|
|
/**
|
|
|
|
* Called by glDrawBuffersARB; specifies the destination color buffers
|
|
|
|
* for N fragment program color outputs.
|
2005-05-04 20:11:35 +00:00
|
|
|
*
|
|
|
|
* XXX This function is called by _mesa_PopAttrib() and we need to do
|
|
|
|
* some more work to deal with the current framebuffer binding state!
|
2004-10-02 16:39:09 +00:00
|
|
|
*/
|
|
|
|
void GLAPIENTRY
|
|
|
|
_mesa_DrawBuffersARB(GLsizei n, const GLenum *buffers)
|
|
|
|
{
|
2005-05-04 20:11:35 +00:00
|
|
|
GLint output;
|
|
|
|
GLuint usedBufferMask, supportedMask;
|
|
|
|
GLuint bufferID;
|
|
|
|
GLuint destMask[MAX_DRAW_BUFFERS];
|
2004-10-02 16:39:09 +00:00
|
|
|
GET_CURRENT_CONTEXT(ctx);
|
|
|
|
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
|
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
if (!ctx->Extensions.ARB_draw_buffers) {
|
|
|
|
_mesa_error(ctx, GL_INVALID_OPERATION, "glDrawBuffersARB");
|
|
|
|
return;
|
|
|
|
}
|
2004-12-03 15:24:34 +00:00
|
|
|
if (n < 1 || n > (GLsizei) ctx->Const.MaxDrawBuffers) {
|
2005-05-04 20:11:35 +00:00
|
|
|
_mesa_error(ctx, GL_INVALID_VALUE, "glDrawBuffersARB(n)");
|
2004-10-02 16:39:09 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
bufferID = ctx->DrawBuffer->Name;
|
|
|
|
|
|
|
|
supportedMask = supported_buffer_bitmask(ctx, bufferID);
|
|
|
|
usedBufferMask = 0x0;
|
2005-02-09 03:51:11 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
/* complicated error checking... */
|
|
|
|
for (output = 0; output < n; output++) {
|
|
|
|
if (buffers[output] == GL_NONE) {
|
|
|
|
destMask[output] = 0x0;
|
2004-10-02 16:39:09 +00:00
|
|
|
}
|
2005-05-04 20:11:35 +00:00
|
|
|
else {
|
|
|
|
destMask[output] = draw_buffer_enum_to_bitmask(buffers[output]);
|
|
|
|
if (destMask[output] == BAD_MASK
|
|
|
|
|| _mesa_bitcount(destMask[output]) > 1) {
|
2005-02-09 03:51:11 +00:00
|
|
|
_mesa_error(ctx, GL_INVALID_ENUM, "glDrawBuffersARB(buffer)");
|
|
|
|
return;
|
|
|
|
}
|
2005-05-04 20:11:35 +00:00
|
|
|
destMask[output] &= supportedMask;
|
|
|
|
if (destMask[output] == 0) {
|
2005-02-09 03:51:11 +00:00
|
|
|
_mesa_error(ctx, GL_INVALID_OPERATION,
|
|
|
|
"glDrawBuffersARB(unsupported buffer)");
|
|
|
|
return;
|
|
|
|
}
|
2005-05-04 20:11:35 +00:00
|
|
|
if (destMask[output] & usedBufferMask) {
|
2005-02-09 03:51:11 +00:00
|
|
|
/* can't specify a dest buffer more than once! */
|
|
|
|
_mesa_error(ctx, GL_INVALID_OPERATION,
|
|
|
|
"glDrawBuffersARB(duplicated buffer)");
|
|
|
|
return;
|
|
|
|
}
|
2005-05-04 20:11:35 +00:00
|
|
|
|
2005-02-09 03:51:11 +00:00
|
|
|
/* update bitmask */
|
2005-05-04 20:11:35 +00:00
|
|
|
usedBufferMask |= destMask[output];
|
2005-02-09 03:51:11 +00:00
|
|
|
}
|
2005-05-04 20:11:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* OK, if we get here, there were no errors so set the new state */
|
|
|
|
_mesa_drawbuffers(ctx, n, buffers, destMask);
|
|
|
|
}
|
|
|
|
|
2004-10-02 16:39:09 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
/**
|
|
|
|
* Set color output state. Traditionally, there was only one color
|
|
|
|
* output, but fragment programs can now have several distinct color
|
|
|
|
* outputs (see GL_ARB_draw_buffers). This function sets the state
|
|
|
|
* for one such color output.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
set_color_output(GLcontext *ctx, GLuint output, GLenum buffer, GLuint destMask)
|
|
|
|
{
|
|
|
|
struct gl_framebuffer *fb = ctx->DrawBuffer;
|
|
|
|
|
|
|
|
ASSERT(output < ctx->Const.MaxDrawBuffers);
|
|
|
|
|
|
|
|
fb->ColorDrawBuffer[output] = buffer;
|
|
|
|
fb->_ColorDrawBufferMask[output] = destMask;
|
|
|
|
|
|
|
|
if (fb->Name == 0) {
|
|
|
|
/* Set traditional state var */
|
|
|
|
ctx->Color.DrawBuffer[output] = buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* not really needed, will be set later */
|
|
|
|
fb->_NumColorDrawBuffers[output] = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Helper routine used by _mesa_DrawBuffer, _mesa_DrawBuffersARB and
|
|
|
|
* _mesa_PopAttrib to set drawbuffer state.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
_mesa_drawbuffers(GLcontext *ctx, GLsizei n, const GLenum *buffers,
|
|
|
|
const GLuint *destMask)
|
|
|
|
{
|
|
|
|
GLuint mask[MAX_DRAW_BUFFERS];
|
|
|
|
GLint output;
|
|
|
|
|
|
|
|
if (!destMask) {
|
|
|
|
/* compute destMask values now */
|
|
|
|
const GLuint bufferID = ctx->DrawBuffer->Name;
|
|
|
|
const GLuint supportedMask = supported_buffer_bitmask(ctx, bufferID);
|
|
|
|
for (output = 0; output < n; output++) {
|
|
|
|
mask[output] = draw_buffer_enum_to_bitmask(buffers[output]);
|
|
|
|
ASSERT(mask[output] != BAD_MASK);
|
|
|
|
mask[output] &= supportedMask;
|
2005-02-09 03:51:11 +00:00
|
|
|
}
|
2005-05-04 20:11:35 +00:00
|
|
|
destMask = mask;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (output = 0; output < n; output++) {
|
|
|
|
set_color_output(ctx, output, buffers[output], destMask[output]);
|
|
|
|
}
|
2005-02-09 03:51:11 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
/* set remaining color outputs to NONE */
|
|
|
|
for (output = n; output < ctx->Const.MaxDrawBuffers; output++) {
|
|
|
|
set_color_output(ctx, output, GL_NONE, 0x0);
|
2005-02-09 03:51:11 +00:00
|
|
|
}
|
2004-10-02 16:39:09 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
ctx->NewState |= _NEW_COLOR;
|
|
|
|
|
2004-10-02 16:39:09 +00:00
|
|
|
/*
|
|
|
|
* Call device driver function.
|
|
|
|
*/
|
|
|
|
if (ctx->Driver.DrawBuffers)
|
2005-05-04 20:11:35 +00:00
|
|
|
ctx->Driver.DrawBuffers(ctx, n, buffers);
|
|
|
|
else if (ctx->Driver.DrawBuffer)
|
|
|
|
ctx->Driver.DrawBuffer(ctx, buffers[0]);
|
2004-10-02 16:39:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
|
2003-07-17 13:43:59 +00:00
|
|
|
/**
|
|
|
|
* Set the color buffer source for reading pixels.
|
|
|
|
*
|
|
|
|
* \param mode color buffer.
|
|
|
|
*
|
|
|
|
* \sa glReadBuffer().
|
|
|
|
*
|
|
|
|
*/
|
2003-10-21 22:22:17 +00:00
|
|
|
void GLAPIENTRY
|
2005-05-04 20:11:35 +00:00
|
|
|
_mesa_ReadBuffer(GLenum buffer)
|
2000-02-02 19:14:56 +00:00
|
|
|
{
|
2005-05-04 20:11:35 +00:00
|
|
|
struct gl_framebuffer *fb;
|
|
|
|
GLuint srcMask, supportedMask;
|
|
|
|
GLuint bufferID;
|
2000-02-02 19:14:56 +00:00
|
|
|
GET_CURRENT_CONTEXT(ctx);
|
2000-12-26 05:09:27 +00:00
|
|
|
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
|
2000-02-02 19:14:56 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
fb = ctx->ReadBuffer;
|
|
|
|
bufferID = fb->Name;
|
|
|
|
|
2000-02-02 19:14:56 +00:00
|
|
|
if (MESA_VERBOSE & VERBOSE_API)
|
2005-05-04 20:11:35 +00:00
|
|
|
_mesa_debug(ctx, "glReadBuffer %s\n", _mesa_lookup_enum_by_nr(buffer));
|
2000-02-02 19:14:56 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
if (bufferID > 0 && buffer == GL_NONE) {
|
|
|
|
/* legal! */
|
|
|
|
srcMask = 0x0;
|
2000-02-02 19:14:56 +00:00
|
|
|
}
|
2005-02-09 03:51:11 +00:00
|
|
|
else {
|
2005-05-04 20:11:35 +00:00
|
|
|
/* general case */
|
|
|
|
srcMask = read_buffer_enum_to_bitmask(buffer);
|
|
|
|
if (srcMask == BAD_MASK) {
|
|
|
|
_mesa_error(ctx, GL_INVALID_ENUM, "glReadBuffer(buffer)");
|
2005-02-09 03:51:11 +00:00
|
|
|
return;
|
|
|
|
}
|
2005-05-04 20:11:35 +00:00
|
|
|
supportedMask = supported_buffer_bitmask(ctx, bufferID);
|
2005-02-09 03:51:11 +00:00
|
|
|
if ((srcMask & supportedMask) == 0) {
|
2005-05-04 20:11:35 +00:00
|
|
|
_mesa_error(ctx, GL_INVALID_OPERATION, "glReadBuffer(buffer)");
|
2005-02-09 03:51:11 +00:00
|
|
|
return;
|
|
|
|
}
|
2004-10-02 16:39:09 +00:00
|
|
|
}
|
2002-07-09 01:22:50 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
if (bufferID == 0) {
|
|
|
|
ctx->Pixel.ReadBuffer = buffer;
|
|
|
|
}
|
|
|
|
fb->ColorReadBuffer = buffer;
|
|
|
|
fb->_ColorReadBufferMask = srcMask;
|
|
|
|
|
|
|
|
ctx->NewState |= _NEW_PIXEL;
|
|
|
|
|
2002-07-09 01:22:50 +00:00
|
|
|
/*
|
|
|
|
* Call device driver function.
|
|
|
|
*/
|
|
|
|
if (ctx->Driver.ReadBuffer)
|
2005-05-04 20:11:35 +00:00
|
|
|
(*ctx->Driver.ReadBuffer)(ctx, buffer);
|
2000-02-02 19:14:56 +00:00
|
|
|
}
|
|
|
|
|
2004-10-02 16:39:09 +00:00
|
|
|
|
2003-07-17 13:43:59 +00:00
|
|
|
#if _HAVE_FULL_GL
|
2000-02-02 19:14:56 +00:00
|
|
|
|
2003-06-04 17:18:09 +00:00
|
|
|
/**
|
2003-07-17 13:43:59 +00:00
|
|
|
* GL_MESA_resize_buffers extension.
|
|
|
|
*
|
2002-03-16 00:53:15 +00:00
|
|
|
* When this function is called, we'll ask the window system how large
|
2003-06-04 17:18:09 +00:00
|
|
|
* the current window is. If it's a new size, we'll call the driver's
|
|
|
|
* ResizeBuffers function. The driver will then resize its color buffers
|
|
|
|
* as needed, and maybe call the swrast's routine for reallocating
|
|
|
|
* swrast-managed depth/stencil/accum/etc buffers.
|
|
|
|
* \note This function may be called from within Mesa or called by the
|
|
|
|
* user directly (see the GL_MESA_resize_buffers extension).
|
2000-02-02 19:14:56 +00:00
|
|
|
*/
|
2003-10-21 22:22:17 +00:00
|
|
|
void GLAPIENTRY
|
2000-02-02 19:14:56 +00:00
|
|
|
_mesa_ResizeBuffersMESA( void )
|
|
|
|
{
|
2004-06-11 22:44:55 +00:00
|
|
|
GET_CURRENT_CONTEXT(ctx);
|
2000-02-02 19:14:56 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx );
|
|
|
|
|
2000-02-02 19:14:56 +00:00
|
|
|
if (MESA_VERBOSE & VERBOSE_API)
|
2002-06-15 02:38:15 +00:00
|
|
|
_mesa_debug(ctx, "glResizeBuffersMESA\n");
|
2000-02-02 19:14:56 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
if (ctx->DrawBuffer && ctx->DrawBuffer->Name == 0) {
|
|
|
|
GLuint newWidth, newHeight;
|
|
|
|
GLframebuffer *buffer = ctx->DrawBuffer;
|
2002-03-16 00:53:15 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
/* ask device driver for size of output buffer */
|
|
|
|
ctx->Driver.GetBufferSize( buffer, &newWidth, &newHeight );
|
2002-03-16 00:53:15 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
/* see if size of device driver's color buffer (window) has changed */
|
|
|
|
if (buffer->Width != newWidth || buffer->Height != newHeight) {
|
|
|
|
if (ctx->Driver.ResizeBuffers)
|
|
|
|
ctx->Driver.ResizeBuffers(ctx, buffer, newWidth, newHeight );
|
2002-03-16 00:53:15 +00:00
|
|
|
}
|
2005-05-04 20:11:35 +00:00
|
|
|
}
|
2002-03-16 00:53:15 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
if (ctx->ReadBuffer && ctx->ReadBuffer != ctx->DrawBuffer
|
|
|
|
&& ctx->ReadBuffer->Name == 0) {
|
|
|
|
GLuint newWidth, newHeight;
|
|
|
|
GLframebuffer *buffer = ctx->ReadBuffer;
|
2000-02-02 19:14:56 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
/* ask device driver for size of read buffer */
|
|
|
|
ctx->Driver.GetBufferSize( buffer, &newWidth, &newHeight );
|
2000-02-02 19:14:56 +00:00
|
|
|
|
2005-05-04 20:11:35 +00:00
|
|
|
/* see if size of device driver's color buffer (window) has changed */
|
|
|
|
if (buffer->Width != newWidth || buffer->Height != newHeight) {
|
|
|
|
if (ctx->Driver.ResizeBuffers)
|
|
|
|
ctx->Driver.ResizeBuffers(ctx, buffer, newWidth, newHeight );
|
2002-03-16 00:53:15 +00:00
|
|
|
}
|
|
|
|
}
|
2005-05-04 20:11:35 +00:00
|
|
|
|
|
|
|
ctx->NewState |= _NEW_BUFFERS; /* to update scissor / window bounds */
|
2000-02-02 19:14:56 +00:00
|
|
|
}
|
2001-05-29 15:23:48 +00:00
|
|
|
|
2004-10-02 16:39:09 +00:00
|
|
|
|
2003-07-17 13:43:59 +00:00
|
|
|
/*
|
|
|
|
* XXX move somewhere else someday?
|
|
|
|
*/
|
2003-10-21 22:22:17 +00:00
|
|
|
void GLAPIENTRY
|
2003-07-17 13:43:59 +00:00
|
|
|
_mesa_SampleCoverageARB(GLclampf value, GLboolean invert)
|
|
|
|
{
|
2004-06-11 22:44:55 +00:00
|
|
|
GET_CURRENT_CONTEXT(ctx);
|
2001-05-29 15:23:48 +00:00
|
|
|
|
2003-07-17 13:43:59 +00:00
|
|
|
if (!ctx->Extensions.ARB_multisample) {
|
|
|
|
_mesa_error(ctx, GL_INVALID_OPERATION, "glSampleCoverageARB");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx );
|
|
|
|
ctx->Multisample.SampleCoverageValue = (GLfloat) CLAMP(value, 0.0, 1.0);
|
|
|
|
ctx->Multisample.SampleCoverageInvert = invert;
|
|
|
|
ctx->NewState |= _NEW_MULTISAMPLE;
|
|
|
|
}
|
|
|
|
|
2005-07-01 01:08:29 +00:00
|
|
|
#endif /* _HAVE_FULL_GL */
|
|
|
|
|
2003-07-17 13:43:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Define the scissor box.
|
|
|
|
*
|
|
|
|
* \param x, y coordinates of the scissor box lower-left corner.
|
|
|
|
* \param width width of the scissor box.
|
|
|
|
* \param height height of the scissor box.
|
|
|
|
*
|
|
|
|
* \sa glScissor().
|
|
|
|
*
|
|
|
|
* Verifies the parameters and updates __GLcontextRec::Scissor. On a
|
|
|
|
* change flushes the vertices and notifies the driver via
|
|
|
|
* the dd_function_table::Scissor callback.
|
|
|
|
*/
|
2003-10-21 22:22:17 +00:00
|
|
|
void GLAPIENTRY
|
2001-06-18 17:26:08 +00:00
|
|
|
_mesa_Scissor( GLint x, GLint y, GLsizei width, GLsizei height )
|
|
|
|
{
|
|
|
|
GET_CURRENT_CONTEXT(ctx);
|
|
|
|
ASSERT_OUTSIDE_BEGIN_END(ctx);
|
|
|
|
|
|
|
|
if (width < 0 || height < 0) {
|
|
|
|
_mesa_error( ctx, GL_INVALID_VALUE, "glScissor" );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (MESA_VERBOSE & VERBOSE_API)
|
2002-06-15 02:38:15 +00:00
|
|
|
_mesa_debug(ctx, "glScissor %d %d %d %d\n", x, y, width, height);
|
2001-06-18 17:26:08 +00:00
|
|
|
|
|
|
|
if (x == ctx->Scissor.X &&
|
|
|
|
y == ctx->Scissor.Y &&
|
|
|
|
width == ctx->Scissor.Width &&
|
|
|
|
height == ctx->Scissor.Height)
|
|
|
|
return;
|
|
|
|
|
|
|
|
FLUSH_VERTICES(ctx, _NEW_SCISSOR);
|
|
|
|
ctx->Scissor.X = x;
|
|
|
|
ctx->Scissor.Y = y;
|
|
|
|
ctx->Scissor.Width = width;
|
|
|
|
ctx->Scissor.Height = height;
|
|
|
|
|
|
|
|
if (ctx->Driver.Scissor)
|
|
|
|
ctx->Driver.Scissor( ctx, x, y, width, height );
|
|
|
|
}
|
|
|
|
|
2004-10-02 16:39:09 +00:00
|
|
|
|
|
|
|
|
2003-07-17 13:43:59 +00:00
|
|
|
/**********************************************************************/
|
|
|
|
/** \name Initialization */
|
|
|
|
/*@{*/
|
|
|
|
|
|
|
|
/**
|
2005-02-26 17:16:12 +00:00
|
|
|
* Initialize the context's scissor state.
|
|
|
|
* \param ctx the GL context.
|
2003-07-17 13:43:59 +00:00
|
|
|
*/
|
2005-02-26 17:16:12 +00:00
|
|
|
void
|
|
|
|
_mesa_init_scissor(GLcontext *ctx)
|
2003-07-17 13:43:59 +00:00
|
|
|
{
|
|
|
|
/* Scissor group */
|
|
|
|
ctx->Scissor.Enabled = GL_FALSE;
|
|
|
|
ctx->Scissor.X = 0;
|
|
|
|
ctx->Scissor.Y = 0;
|
|
|
|
ctx->Scissor.Width = 0;
|
|
|
|
ctx->Scissor.Height = 0;
|
2005-02-26 17:16:12 +00:00
|
|
|
}
|
|
|
|
|
2003-07-17 13:43:59 +00:00
|
|
|
|
2005-02-26 17:16:12 +00:00
|
|
|
/**
|
|
|
|
* Initialize the context's multisample state.
|
|
|
|
* \param ctx the GL context.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
_mesa_init_multisample(GLcontext *ctx)
|
|
|
|
{
|
2003-07-17 13:43:59 +00:00
|
|
|
ctx->Multisample.Enabled = GL_FALSE;
|
|
|
|
ctx->Multisample.SampleAlphaToCoverage = GL_FALSE;
|
|
|
|
ctx->Multisample.SampleAlphaToOne = GL_FALSE;
|
|
|
|
ctx->Multisample.SampleCoverage = GL_FALSE;
|
|
|
|
ctx->Multisample.SampleCoverageValue = 1.0;
|
|
|
|
ctx->Multisample.SampleCoverageInvert = GL_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*@}*/
|