2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 * glClearColor, glClearIndex, glClear() functions.
34 _mesa_ClearIndex( GLfloat c
)
36 GET_CURRENT_CONTEXT(ctx
);
37 ASSERT_OUTSIDE_BEGIN_END(ctx
);
39 if (ctx
->Color
.ClearIndex
== (GLuint
) c
)
42 FLUSH_VERTICES(ctx
, _NEW_COLOR
);
43 ctx
->Color
.ClearIndex
= (GLuint
) c
;
49 * Specify the clear values for the color buffers.
51 * \param red red color component.
52 * \param green green color component.
53 * \param blue blue color component.
54 * \param alpha alpha component.
58 * Clamps the parameters and updates gl_colorbuffer_attrib::ClearColor. On a
59 * change, flushes the vertices and notifies the driver via the
60 * dd_function_table::ClearColor callback.
63 _mesa_ClearColor( GLclampf red
, GLclampf green
, GLclampf blue
, GLclampf alpha
)
66 GET_CURRENT_CONTEXT(ctx
);
67 ASSERT_OUTSIDE_BEGIN_END(ctx
);
74 if (TEST_EQ_4V(tmp
, ctx
->Color
.ClearColor
.f
))
75 return; /* no change */
77 FLUSH_VERTICES(ctx
, _NEW_COLOR
);
78 COPY_4V(ctx
->Color
.ClearColor
.f
, tmp
);
80 if (ctx
->Driver
.ClearColor
) {
81 /* it's OK to call glClearColor in CI mode but it should be a NOP */
82 /* we pass the clamped color, since all drivers that need this don't
83 * support GL_ARB_color_buffer_float
85 (*ctx
->Driver
.ClearColor
)(ctx
, ctx
->Color
.ClearColor
);
91 * GL_EXT_texture_integer
94 _mesa_ClearColorIiEXT(GLint r
, GLint g
, GLint b
, GLint a
)
97 GET_CURRENT_CONTEXT(ctx
);
98 ASSERT_OUTSIDE_BEGIN_END(ctx
);
105 if (TEST_EQ_4V(tmp
, ctx
->Color
.ClearColor
.i
))
106 return; /* no change */
108 FLUSH_VERTICES(ctx
, _NEW_COLOR
);
109 COPY_4V(ctx
->Color
.ClearColor
.i
, tmp
);
111 /* these should be NOP calls for drivers supporting EXT_texture_integer */
112 if (ctx
->Driver
.ClearColor
) {
113 ctx
->Driver
.ClearColor(ctx
, ctx
->Color
.ClearColor
);
119 * GL_EXT_texture_integer
122 _mesa_ClearColorIuiEXT(GLuint r
, GLuint g
, GLuint b
, GLuint a
)
125 GET_CURRENT_CONTEXT(ctx
);
126 ASSERT_OUTSIDE_BEGIN_END(ctx
);
133 if (TEST_EQ_4V(tmp
, ctx
->Color
.ClearColor
.ui
))
134 return; /* no change */
136 FLUSH_VERTICES(ctx
, _NEW_COLOR
);
137 COPY_4V(ctx
->Color
.ClearColor
.ui
, tmp
);
139 /* these should be NOP calls for drivers supporting EXT_texture_integer */
140 if (ctx
->Driver
.ClearColor
) {
141 ctx
->Driver
.ClearColor(ctx
, ctx
->Color
.ClearColor
);
149 * \param mask bit-mask indicating the buffers to be cleared.
151 * Flushes the vertices and verifies the parameter. If __struct gl_contextRec::NewState
152 * is set then calls _mesa_update_state() to update gl_frame_buffer::_Xmin,
153 * etc. If the rasterization mode is set to GL_RENDER then requests the driver
154 * to clear the buffers, via the dd_function_table::Clear callback.
157 _mesa_Clear( GLbitfield mask
)
159 GET_CURRENT_CONTEXT(ctx
);
160 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
162 FLUSH_CURRENT(ctx
, 0);
164 if (MESA_VERBOSE
& VERBOSE_API
)
165 _mesa_debug(ctx
, "glClear 0x%x\n", mask
);
167 if (mask
& ~(GL_COLOR_BUFFER_BIT
|
168 GL_DEPTH_BUFFER_BIT
|
169 GL_STENCIL_BUFFER_BIT
|
170 GL_ACCUM_BUFFER_BIT
)) {
171 /* invalid bit set */
172 _mesa_error( ctx
, GL_INVALID_VALUE
, "glClear(0x%x)", mask
);
177 _mesa_update_state( ctx
); /* update _Xmin, etc */
180 if (ctx
->DrawBuffer
->Width
== 0 || ctx
->DrawBuffer
->Height
== 0 ||
181 ctx
->DrawBuffer
->_Xmin
>= ctx
->DrawBuffer
->_Xmax
||
182 ctx
->DrawBuffer
->_Ymin
>= ctx
->DrawBuffer
->_Ymax
)
185 if (ctx
->RasterDiscard
)
188 if (ctx
->RenderMode
== GL_RENDER
) {
189 GLbitfield bufferMask
;
191 /* don't clear depth buffer if depth writing disabled */
192 if (!ctx
->Depth
.Mask
)
193 mask
&= ~GL_DEPTH_BUFFER_BIT
;
195 /* Build the bitmask to send to device driver's Clear function.
196 * Note that the GL_COLOR_BUFFER_BIT flag will expand to 0, 1, 2 or 4
197 * of the BUFFER_BIT_FRONT/BACK_LEFT/RIGHT flags, or one of the
198 * BUFFER_BIT_COLORn flags.
201 if (mask
& GL_COLOR_BUFFER_BIT
) {
202 bufferMask
|= (1 << ctx
->DrawBuffer
->_ColorDrawBufferIndex
);
205 if ((mask
& GL_DEPTH_BUFFER_BIT
)
206 && ctx
->DrawBuffer
->Visual
.haveDepthBuffer
) {
207 bufferMask
|= BUFFER_BIT_DEPTH
;
210 if ((mask
& GL_STENCIL_BUFFER_BIT
)
211 && ctx
->DrawBuffer
->Visual
.haveStencilBuffer
) {
212 bufferMask
|= BUFFER_BIT_STENCIL
;
215 if ((mask
& GL_ACCUM_BUFFER_BIT
)
216 && ctx
->DrawBuffer
->Visual
.haveAccumBuffer
) {
217 bufferMask
|= BUFFER_BIT_ACCUM
;
220 ASSERT(ctx
->Driver
.Clear
);
221 ctx
->Driver
.Clear(ctx
, bufferMask
);