[Mesa-dev] [PATCH 1/5] mesa: introduce a clear color union + add a type to the dd interface.
Dave Airlie
airlied at gmail.com
Mon Sep 12 05:17:27 PDT 2011
From: Dave Airlie <airlied at redhat.com>
This introduces a new gl_clear_color union and moves the current
ClearColor and ClearColorUnclamped to use it, along with changing the
ClearColor API to device driver to include a new field for clear color type.
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
src/mesa/drivers/common/meta.c | 10 ++--
src/mesa/drivers/dri/intel/intel_blit.c | 2 +-
src/mesa/drivers/dri/nouveau/nouveau_driver.c | 2 +-
src/mesa/drivers/dri/nouveau/nv20_context.c | 2 +-
src/mesa/drivers/dri/r200/r200_state.c | 11 ++--
src/mesa/drivers/dri/radeon/radeon_state.c | 11 ++--
src/mesa/drivers/windows/gdi/wmesa.c | 9 ++--
src/mesa/drivers/x11/xm_dd.c | 33 +++++++------
src/mesa/main/attrib.c | 8 ++--
src/mesa/main/blend.c | 4 +-
src/mesa/main/clear.c | 62 ++++++++++++------------
src/mesa/main/dd.h | 3 +-
src/mesa/main/get.c | 4 +-
src/mesa/main/mtypes.h | 8 ++-
src/mesa/state_tracker/st_cb_clear.c | 6 +-
src/mesa/swrast/s_clear.c | 42 ++++++++--------
16 files changed, 114 insertions(+), 103 deletions(-)
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
index 2ebcd35..f34d88f 100644
--- a/src/mesa/drivers/common/meta.c
+++ b/src/mesa/drivers/common/meta.c
@@ -1569,10 +1569,10 @@ _mesa_meta_Clear(struct gl_context *ctx, GLbitfield buffers)
/* vertex colors */
for (i = 0; i < 4; i++) {
- verts[i].r = ctx->Color.ClearColorUnclamped[0];
- verts[i].g = ctx->Color.ClearColorUnclamped[1];
- verts[i].b = ctx->Color.ClearColorUnclamped[2];
- verts[i].a = ctx->Color.ClearColorUnclamped[3];
+ verts[i].r = ctx->Color.ClearColorUnclamped.f[0];
+ verts[i].g = ctx->Color.ClearColorUnclamped.f[1];
+ verts[i].b = ctx->Color.ClearColorUnclamped.f[2];
+ verts[i].a = ctx->Color.ClearColorUnclamped.f[3];
}
/* upload new vertex data */
@@ -1679,7 +1679,7 @@ _mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers)
_mesa_UseProgramObjectARB(clear->ShaderProg);
_mesa_Uniform4fvARB(clear->ColorLocation, 1,
- ctx->Color.ClearColorUnclamped);
+ ctx->Color.ClearColorUnclamped.f);
_mesa_BindVertexArray(clear->ArrayObj);
_mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, clear->VBO);
diff --git a/src/mesa/drivers/dri/intel/intel_blit.c b/src/mesa/drivers/dri/intel/intel_blit.c
index b18dd29..c5c02d2 100644
--- a/src/mesa/drivers/dri/intel/intel_blit.c
+++ b/src/mesa/drivers/dri/intel/intel_blit.c
@@ -320,7 +320,7 @@ intelClearWithBlit(struct gl_context *ctx, GLbitfield mask)
clear_val = clear_depth_value;
} else {
uint8_t clear[4];
- GLclampf *color = ctx->Color.ClearColor;
+ GLclampf *color = ctx->Color.ClearColor.cl;
CLAMPED_FLOAT_TO_UBYTE(clear[0], color[0]);
CLAMPED_FLOAT_TO_UBYTE(clear[1], color[1]);
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_driver.c b/src/mesa/drivers/dri/nouveau/nouveau_driver.c
index 8b6aa82..38647cc 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_driver.c
+++ b/src/mesa/drivers/dri/nouveau/nouveau_driver.c
@@ -100,7 +100,7 @@ nouveau_clear(struct gl_context *ctx, GLbitfield buffers)
if (buf & BUFFER_BITS_COLOR) {
mask = pack_rgba_i(s->format, ctx->Color.ColorMask[0]);
- value = pack_rgba_f(s->format, ctx->Color.ClearColor);
+ value = pack_rgba_f(s->format, ctx->Color.ClearColor.f);
if (mask)
context_drv(ctx)->surface_fill(
diff --git a/src/mesa/drivers/dri/nouveau/nv20_context.c b/src/mesa/drivers/dri/nouveau/nv20_context.c
index 2766851..b796bce 100644
--- a/src/mesa/drivers/dri/nouveau/nv20_context.c
+++ b/src/mesa/drivers/dri/nouveau/nv20_context.c
@@ -59,7 +59,7 @@ nv20_clear(struct gl_context *ctx, GLbitfield buffers)
clear |= NV20_3D_CLEAR_BUFFERS_COLOR_A;
BEGIN_RING(chan, kelvin, NV20_3D_CLEAR_VALUE, 1);
- OUT_RING(chan, pack_rgba_f(s->format, ctx->Color.ClearColor));
+ OUT_RING(chan, pack_rgba_f(s->format, ctx->Color.ClearColor.f));
buffers &= ~BUFFER_BITS_COLOR;
}
diff --git a/src/mesa/drivers/dri/r200/r200_state.c b/src/mesa/drivers/dri/r200/r200_state.c
index 0a1e0b4..a6e5e0b 100644
--- a/src/mesa/drivers/dri/r200/r200_state.c
+++ b/src/mesa/drivers/dri/r200/r200_state.c
@@ -1724,7 +1724,8 @@ void r200UpdateViewportOffset( struct gl_context *ctx )
* Miscellaneous
*/
-static void r200ClearColor( struct gl_context *ctx, const GLfloat c[4] )
+static void r200ClearColor( struct gl_context *ctx, GLenum clear_color_type,
+ const union gl_clear_color c )
{
r200ContextPtr rmesa = R200_CONTEXT(ctx);
GLubyte color[4];
@@ -1733,10 +1734,10 @@ static void r200ClearColor( struct gl_context *ctx, const GLfloat c[4] )
rrb = radeon_get_colorbuffer(&rmesa->radeon);
if (!rrb)
return;
- CLAMPED_FLOAT_TO_UBYTE(color[0], c[0]);
- CLAMPED_FLOAT_TO_UBYTE(color[1], c[1]);
- CLAMPED_FLOAT_TO_UBYTE(color[2], c[2]);
- CLAMPED_FLOAT_TO_UBYTE(color[3], c[3]);
+ CLAMPED_FLOAT_TO_UBYTE(color[0], c.f[0]);
+ CLAMPED_FLOAT_TO_UBYTE(color[1], c.f[1]);
+ CLAMPED_FLOAT_TO_UBYTE(color[2], c.f[2]);
+ CLAMPED_FLOAT_TO_UBYTE(color[3], c.f[3]);
rmesa->radeon.state.color.clear = radeonPackColor( rrb->cpp,
color[0], color[1],
color[2], color[3] );
diff --git a/src/mesa/drivers/dri/radeon/radeon_state.c b/src/mesa/drivers/dri/radeon/radeon_state.c
index a93e618..f81dafb 100644
--- a/src/mesa/drivers/dri/radeon/radeon_state.c
+++ b/src/mesa/drivers/dri/radeon/radeon_state.c
@@ -1508,7 +1508,8 @@ void radeonUpdateViewportOffset( struct gl_context *ctx )
* Miscellaneous
*/
-static void radeonClearColor( struct gl_context *ctx, const GLfloat color[4] )
+static void radeonClearColor( struct gl_context *ctx, GLenum clear_color_type,
+ const union gl_clear_color color )
{
r100ContextPtr rmesa = R100_CONTEXT(ctx);
GLubyte c[4];
@@ -1518,10 +1519,10 @@ static void radeonClearColor( struct gl_context *ctx, const GLfloat color[4] )
if (!rrb)
return;
- CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);
- CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);
- CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);
- CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);
+ CLAMPED_FLOAT_TO_UBYTE(c[0], color.f[0]);
+ CLAMPED_FLOAT_TO_UBYTE(c[1], color.f[1]);
+ CLAMPED_FLOAT_TO_UBYTE(c[2], color.f[2]);
+ CLAMPED_FLOAT_TO_UBYTE(c[3], color.f[3]);
rmesa->radeon.state.color.clear = radeonPackColor( rrb->cpp,
c[0], c[1], c[2], c[3] );
}
diff --git a/src/mesa/drivers/windows/gdi/wmesa.c b/src/mesa/drivers/windows/gdi/wmesa.c
index 35a150d..2008d6e 100644
--- a/src/mesa/drivers/windows/gdi/wmesa.c
+++ b/src/mesa/drivers/windows/gdi/wmesa.c
@@ -249,14 +249,15 @@ static void wmesa_flush(struct gl_context *ctx)
/*
* Set the color used to clear the color buffer.
*/
-static void clear_color(struct gl_context *ctx, const GLfloat color[4])
+static void clear_color(struct gl_context *ctx, GLenum clear_color_type,
+ const union gl_clear_color color )
{
WMesaContext pwc = wmesa_context(ctx);
GLubyte col[3];
- CLAMPED_FLOAT_TO_UBYTE(col[0], color[0]);
- CLAMPED_FLOAT_TO_UBYTE(col[1], color[1]);
- CLAMPED_FLOAT_TO_UBYTE(col[2], color[2]);
+ CLAMPED_FLOAT_TO_UBYTE(col[0], color.cl[0]);
+ CLAMPED_FLOAT_TO_UBYTE(col[1], color.cl[1]);
+ CLAMPED_FLOAT_TO_UBYTE(col[2], color.cl[2]);
pwc->clearColorRef = RGB(col[0], col[1], col[2]);
DeleteObject(pwc->clearPen);
DeleteObject(pwc->clearBrush);
diff --git a/src/mesa/drivers/x11/xm_dd.c b/src/mesa/drivers/x11/xm_dd.c
index 81d000b..05a5ace 100644
--- a/src/mesa/drivers/x11/xm_dd.c
+++ b/src/mesa/drivers/x11/xm_dd.c
@@ -104,16 +104,17 @@ finish_or_flush( struct gl_context *ctx )
static void
-clear_color( struct gl_context *ctx, const GLfloat color[4] )
+clear_color( struct gl_context *ctx, GLenum clear_color_type,
+ const union gl_clear_color color )
{
if (ctx->DrawBuffer->Name == 0) {
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer);
- CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[0], color[0]);
- CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[1], color[1]);
- CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[2], color[2]);
- CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[3], color[3]);
+ CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[0], color.cl[0]);
+ CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[1], color.cl[1]);
+ CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[2], color.cl[2]);
+ CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[3], color.cl[3]);
xmesa->clearpixel = xmesa_color_to_pixel( ctx,
xmesa->clearcolor[0],
xmesa->clearcolor[1],
@@ -770,15 +771,16 @@ enable( struct gl_context *ctx, GLenum pname, GLboolean state )
static void
-clear_color_HPCR_ximage( struct gl_context *ctx, const GLfloat color[4] )
+clear_color_HPCR_ximage( struct gl_context *ctx, GLenum clear_color_type,
+ const union gl_clear_color color )
{
int i;
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
- CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[0], color[0]);
- CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[1], color[1]);
- CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[2], color[2]);
- CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[3], color[3]);
+ CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[0], color.cl[0]);
+ CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[1], color.cl[1]);
+ CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[2], color.cl[2]);
+ CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[3], color.cl[3]);
if (color[0] == 0.0 && color[1] == 0.0 && color[2] == 0.0) {
/* black is black */
@@ -804,15 +806,16 @@ clear_color_HPCR_ximage( struct gl_context *ctx, const GLfloat color[4] )
static void
-clear_color_HPCR_pixmap( struct gl_context *ctx, const GLfloat color[4] )
+clear_color_HPCR_pixmap( struct gl_context *ctx, GLenum clear_color_type,
+ const union gl_clear_color color )
{
int i;
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
- CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[0], color[0]);
- CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[1], color[1]);
- CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[2], color[2]);
- CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[3], color[3]);
+ CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[0], color.cl[0]);
+ CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[1], color.cl[1]);
+ CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[2], color.cl[2]);
+ CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[3], color.cl[3]);
if (color[0] == 0.0 && color[1] == 0.0 && color[2] == 0.0) {
/* black is black */
diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c
index 5731004..0a7f7de 100644
--- a/src/mesa/main/attrib.c
+++ b/src/mesa/main/attrib.c
@@ -884,10 +884,10 @@ _mesa_PopAttrib(void)
color = (const struct gl_colorbuffer_attrib *) attr->data;
_mesa_ClearIndex((GLfloat) color->ClearIndex);
- _mesa_ClearColor(color->ClearColorUnclamped[0],
- color->ClearColorUnclamped[1],
- color->ClearColorUnclamped[2],
- color->ClearColorUnclamped[3]);
+ _mesa_ClearColor(color->ClearColorUnclamped.f[0],
+ color->ClearColorUnclamped.f[1],
+ color->ClearColorUnclamped.f[2],
+ color->ClearColorUnclamped.f[3]);
_mesa_IndexMask(color->IndexMask);
if (!ctx->Extensions.EXT_draw_buffers2) {
_mesa_ColorMask((GLboolean) (color->ColorMask[0][0] != 0),
diff --git a/src/mesa/main/blend.c b/src/mesa/main/blend.c
index 1856f00..e1a6577 100644
--- a/src/mesa/main/blend.c
+++ b/src/mesa/main/blend.c
@@ -795,8 +795,8 @@ void _mesa_init_color( struct gl_context * ctx )
ctx->Color.IndexMask = ~0u;
memset(ctx->Color.ColorMask, 0xff, sizeof(ctx->Color.ColorMask));
ctx->Color.ClearIndex = 0;
- ASSIGN_4V( ctx->Color.ClearColor, 0, 0, 0, 0 );
- ASSIGN_4V( ctx->Color.ClearColorUnclamped, 0, 0, 0, 0 );
+ ASSIGN_4V( ctx->Color.ClearColor.f, 0, 0, 0, 0 );
+ ASSIGN_4V( ctx->Color.ClearColorUnclamped.f, 0, 0, 0, 0 );
ctx->Color.AlphaEnabled = GL_FALSE;
ctx->Color.AlphaFunc = GL_ALWAYS;
ctx->Color.AlphaRef = 0;
diff --git a/src/mesa/main/clear.c b/src/mesa/main/clear.c
index fa95e45..ecf2907 100644
--- a/src/mesa/main/clear.c
+++ b/src/mesa/main/clear.c
@@ -83,23 +83,23 @@ _mesa_ClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha )
tmp[2] = blue;
tmp[3] = alpha;
- if (TEST_EQ_4V(tmp, ctx->Color.ClearColorUnclamped))
+ if (TEST_EQ_4V(tmp, ctx->Color.ClearColorUnclamped.f))
return; /* no change */
FLUSH_VERTICES(ctx, _NEW_COLOR);
- COPY_4V(ctx->Color.ClearColorUnclamped, tmp);
+ COPY_4V(ctx->Color.ClearColorUnclamped.f, tmp);
- ctx->Color.ClearColor[0] = CLAMP(tmp[0], 0.0F, 1.0F);
- ctx->Color.ClearColor[1] = CLAMP(tmp[1], 0.0F, 1.0F);
- ctx->Color.ClearColor[2] = CLAMP(tmp[2], 0.0F, 1.0F);
- ctx->Color.ClearColor[3] = CLAMP(tmp[3], 0.0F, 1.0F);
+ ctx->Color.ClearColor.cl[0] = CLAMP(tmp[0], 0.0F, 1.0F);
+ ctx->Color.ClearColor.cl[1] = CLAMP(tmp[1], 0.0F, 1.0F);
+ ctx->Color.ClearColor.cl[2] = CLAMP(tmp[2], 0.0F, 1.0F);
+ ctx->Color.ClearColor.cl[3] = CLAMP(tmp[3], 0.0F, 1.0F);
if (ctx->Driver.ClearColor) {
/* it's OK to call glClearColor in CI mode but it should be a NOP */
/* we pass the clamped color, since all drivers that need this don't
* support GL_ARB_color_buffer_float
*/
- (*ctx->Driver.ClearColor)(ctx, ctx->Color.ClearColor);
+ (*ctx->Driver.ClearColor)(ctx, GL_FLOAT, ctx->Color.ClearColor);
}
}
@@ -119,7 +119,7 @@ _mesa_ClearColorIiEXT(GLint r, GLint g, GLint b, GLint a)
tmp[2] = (GLfloat) b;
tmp[3] = (GLfloat) a;
- if (TEST_EQ_4V(tmp, ctx->Color.ClearColor))
+ if (TEST_EQ_4V(tmp, ctx->Color.ClearColor.f))
return; /* no change */
FLUSH_VERTICES(ctx, _NEW_COLOR);
@@ -127,10 +127,10 @@ _mesa_ClearColorIiEXT(GLint r, GLint g, GLint b, GLint a)
/* XXX we should eventually have a float/int/uint union for
* the ctx->Color.ClearColor state.
*/
- COPY_4V(ctx->Color.ClearColor, tmp);
+ COPY_4V(ctx->Color.ClearColor.f, tmp);
if (ctx->Driver.ClearColor) {
- ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
+ ctx->Driver.ClearColor(ctx, GL_FLOAT, ctx->Color.ClearColor);
}
}
@@ -150,7 +150,7 @@ _mesa_ClearColorIuiEXT(GLuint r, GLuint g, GLuint b, GLuint a)
tmp[2] = (GLfloat) b;
tmp[3] = (GLfloat) a;
- if (TEST_EQ_4V(tmp, ctx->Color.ClearColor))
+ if (TEST_EQ_4V(tmp, ctx->Color.ClearColor.f))
return; /* no change */
FLUSH_VERTICES(ctx, _NEW_COLOR);
@@ -158,10 +158,10 @@ _mesa_ClearColorIuiEXT(GLuint r, GLuint g, GLuint b, GLuint a)
/* XXX we should eventually have a float/int/uint union for
* the ctx->Color.ClearColor state.
*/
- COPY_4V(ctx->Color.ClearColor, tmp);
+ COPY_4V(ctx->Color.ClearColor.f, tmp);
if (ctx->Driver.ClearColor) {
- ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
+ ctx->Driver.ClearColor(ctx, GL_FLOAT, ctx->Color.ClearColor);
}
}
@@ -368,19 +368,19 @@ _mesa_ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
* floating point state var. This will not always work. We'll
* need a new ctx->Driver.ClearBuffer() hook....
*/
- GLclampf clearSave[4];
+ union gl_clear_color clearSave;
/* save color */
- COPY_4V(clearSave, ctx->Color.ClearColor);
+ COPY_4V(clearSave.cl, ctx->Color.ClearColor.cl);
/* set color */
- COPY_4V_CAST(ctx->Color.ClearColor, value, GLclampf);
+ COPY_4V_CAST(ctx->Color.ClearColor.cl, value, GLclampf);
if (ctx->Driver.ClearColor)
- ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
+ ctx->Driver.ClearColor(ctx, GL_FLOAT, ctx->Color.ClearColor);
/* clear buffer(s) */
ctx->Driver.Clear(ctx, mask);
/* restore color */
- COPY_4V(ctx->Color.ClearColor, clearSave);
+ COPY_4V(ctx->Color.ClearColor.cl, clearSave.cl);
if (ctx->Driver.ClearColor)
- ctx->Driver.ClearColor(ctx, clearSave);
+ ctx->Driver.ClearColor(ctx, GL_FLOAT, clearSave);
}
}
break;
@@ -422,19 +422,19 @@ _mesa_ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
* floating point state var. This will not always work. We'll
* need a new ctx->Driver.ClearBuffer() hook....
*/
- GLclampf clearSave[4];
+ union gl_clear_color clearSave;
/* save color */
- COPY_4V(clearSave, ctx->Color.ClearColor);
+ COPY_4V(clearSave.cl, ctx->Color.ClearColor.cl);
/* set color */
- COPY_4V_CAST(ctx->Color.ClearColor, value, GLclampf);
+ COPY_4V_CAST(ctx->Color.ClearColor.cl, value, GLclampf);
if (ctx->Driver.ClearColor)
- ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
+ ctx->Driver.ClearColor(ctx, GL_FLOAT, ctx->Color.ClearColor);
/* clear buffer(s) */
ctx->Driver.Clear(ctx, mask);
/* restore color */
- COPY_4V(ctx->Color.ClearColor, clearSave);
+ COPY_4V(ctx->Color.ClearColor.cl, clearSave.cl);
if (ctx->Driver.ClearColor)
- ctx->Driver.ClearColor(ctx, clearSave);
+ ctx->Driver.ClearColor(ctx, GL_FLOAT, clearSave);
}
}
break;
@@ -495,19 +495,19 @@ _mesa_ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
return;
}
else if (mask) {
- GLclampf clearSave[4];
+ union gl_clear_color clearSave;
/* save color */
- COPY_4V(clearSave, ctx->Color.ClearColor);
+ COPY_4V(clearSave.cl, ctx->Color.ClearColor.cl);
/* set color */
- COPY_4V_CAST(ctx->Color.ClearColor, value, GLclampf);
+ COPY_4V_CAST(ctx->Color.ClearColor.cl, value, GLclampf);
if (ctx->Driver.ClearColor)
- ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
+ ctx->Driver.ClearColor(ctx, GL_FLOAT, ctx->Color.ClearColor);
/* clear buffer(s) */
ctx->Driver.Clear(ctx, mask);
/* restore color */
- COPY_4V(ctx->Color.ClearColor, clearSave);
+ COPY_4V(ctx->Color.ClearColor.cl, clearSave.cl);
if (ctx->Driver.ClearColor)
- ctx->Driver.ClearColor(ctx, clearSave);
+ ctx->Driver.ClearColor(ctx, GL_FLOAT, clearSave);
}
}
break;
diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
index b77e4f0..e480e58 100644
--- a/src/mesa/main/dd.h
+++ b/src/mesa/main/dd.h
@@ -589,7 +589,8 @@ struct dd_function_table {
GLenum sfactorRGB, GLenum dfactorRGB,
GLenum sfactorA, GLenum dfactorA);
/** Specify clear values for the color buffers */
- void (*ClearColor)(struct gl_context *ctx, const GLfloat color[4]);
+ void (*ClearColor)(struct gl_context *ctx, GLenum clear_color_type,
+ const union gl_clear_color color);
/** Specify the clear value for the depth buffer */
void (*ClearDepth)(struct gl_context *ctx, GLclampd d);
/** Specify the clear value for the stencil buffer */
diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index 069254b..41b1a82 100644
--- a/src/mesa/main/get.c
+++ b/src/mesa/main/get.c
@@ -1674,9 +1674,9 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
break;
case GL_COLOR_CLEAR_VALUE:
if(ctx->Color._ClampFragmentColor)
- COPY_4FV(v->value_float_4, ctx->Color.ClearColor);
+ COPY_4FV(v->value_float_4, ctx->Color.ClearColor.cl);
else
- COPY_4FV(v->value_float_4, ctx->Color.ClearColorUnclamped);
+ COPY_4FV(v->value_float_4, ctx->Color.ClearColorUnclamped.f);
break;
case GL_BLEND_COLOR_EXT:
if(ctx->Color._ClampFragmentColor)
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index ae500b4..04f1436 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -719,6 +719,10 @@ struct gl_accum_attrib
GLfloat ClearColor[4]; /**< Accumulation buffer clear color */
};
+union gl_clear_color {
+ GLfloat f[4];
+ GLclampf cl[4];
+};
/**
* Color buffer attribute group (GL_COLOR_BUFFER_BIT).
@@ -726,8 +730,8 @@ struct gl_accum_attrib
struct gl_colorbuffer_attrib
{
GLuint ClearIndex; /**< Index to use for glClear */
- GLfloat ClearColorUnclamped[4]; /**< Color to use for glClear*/
- GLclampf ClearColor[4]; /**< Color to use for glClear */
+ union gl_clear_color ClearColorUnclamped; /**< Color to use for glClear*/
+ union gl_clear_color ClearColor; /**< Color to use for glClear*/
GLuint IndexMask; /**< Color index write mask */
GLubyte ColorMask[MAX_DRAW_BUFFERS][4];/**< Each flag is 0xff or 0x0 */
diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c
index 117000b..211e1bf 100644
--- a/src/mesa/state_tracker/st_cb_clear.c
+++ b/src/mesa/state_tracker/st_cb_clear.c
@@ -323,7 +323,7 @@ clear_with_quad(struct gl_context *ctx,
set_vertex_shader(st);
if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
- st_translate_color(ctx->Color.ClearColorUnclamped,
+ st_translate_color(ctx->Color.ClearColorUnclamped.f,
ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
clearColor);
}
@@ -582,12 +582,12 @@ st_Clear(struct gl_context *ctx, GLbitfield mask)
clear_buffers |= PIPE_CLEAR_DEPTHSTENCIL;
if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
- st_translate_color(ctx->Color.ClearColor,
+ st_translate_color(ctx->Color.ClearColor.cl,
ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
clearColor);
}
- st->pipe->clear(st->pipe, clear_buffers, ctx->Color.ClearColorUnclamped,
+ st->pipe->clear(st->pipe, clear_buffers, ctx->Color.ClearColorUnclamped.f,
ctx->Depth.Clear, ctx->Stencil.Clear);
}
if (mask & BUFFER_BIT_ACCUM)
diff --git a/src/mesa/swrast/s_clear.c b/src/mesa/swrast/s_clear.c
index 9e9b531..9c69652 100644
--- a/src/mesa/swrast/s_clear.c
+++ b/src/mesa/swrast/s_clear.c
@@ -60,20 +60,20 @@ clear_rgba_buffer_with_masking(struct gl_context *ctx, struct gl_renderbuffer *r
span.array->ChanType = rb->DataType;
if (span.array->ChanType == GL_UNSIGNED_BYTE) {
GLubyte clearColor[4];
- UNCLAMPED_FLOAT_TO_UBYTE(clearColor[RCOMP], ctx->Color.ClearColor[0]);
- UNCLAMPED_FLOAT_TO_UBYTE(clearColor[GCOMP], ctx->Color.ClearColor[1]);
- UNCLAMPED_FLOAT_TO_UBYTE(clearColor[BCOMP], ctx->Color.ClearColor[2]);
- UNCLAMPED_FLOAT_TO_UBYTE(clearColor[ACOMP], ctx->Color.ClearColor[3]);
+ UNCLAMPED_FLOAT_TO_UBYTE(clearColor[RCOMP], ctx->Color.ClearColor.cl[0]);
+ UNCLAMPED_FLOAT_TO_UBYTE(clearColor[GCOMP], ctx->Color.ClearColor.cl[1]);
+ UNCLAMPED_FLOAT_TO_UBYTE(clearColor[BCOMP], ctx->Color.ClearColor.cl[2]);
+ UNCLAMPED_FLOAT_TO_UBYTE(clearColor[ACOMP], ctx->Color.ClearColor.cl[3]);
for (i = 0; i < width; i++) {
COPY_4UBV(span.array->rgba[i], clearColor);
}
}
else if (span.array->ChanType == GL_UNSIGNED_SHORT) {
GLushort clearColor[4];
- UNCLAMPED_FLOAT_TO_USHORT(clearColor[RCOMP], ctx->Color.ClearColor[0]);
- UNCLAMPED_FLOAT_TO_USHORT(clearColor[GCOMP], ctx->Color.ClearColor[1]);
- UNCLAMPED_FLOAT_TO_USHORT(clearColor[BCOMP], ctx->Color.ClearColor[2]);
- UNCLAMPED_FLOAT_TO_USHORT(clearColor[ACOMP], ctx->Color.ClearColor[3]);
+ UNCLAMPED_FLOAT_TO_USHORT(clearColor[RCOMP], ctx->Color.ClearColor.cl[0]);
+ UNCLAMPED_FLOAT_TO_USHORT(clearColor[GCOMP], ctx->Color.ClearColor.cl[1]);
+ UNCLAMPED_FLOAT_TO_USHORT(clearColor[BCOMP], ctx->Color.ClearColor.cl[2]);
+ UNCLAMPED_FLOAT_TO_USHORT(clearColor[ACOMP], ctx->Color.ClearColor.cl[3]);
for (i = 0; i < width; i++) {
COPY_4V_CAST(span.array->rgba[i], clearColor, GLchan);
}
@@ -81,10 +81,10 @@ clear_rgba_buffer_with_masking(struct gl_context *ctx, struct gl_renderbuffer *r
else {
ASSERT(span.array->ChanType == GL_FLOAT);
for (i = 0; i < width; i++) {
- CLAMPED_FLOAT_TO_CHAN(span.array->rgba[i][0], ctx->Color.ClearColor[0]);
- CLAMPED_FLOAT_TO_CHAN(span.array->rgba[i][1], ctx->Color.ClearColor[1]);
- CLAMPED_FLOAT_TO_CHAN(span.array->rgba[i][2], ctx->Color.ClearColor[2]);
- CLAMPED_FLOAT_TO_CHAN(span.array->rgba[i][3], ctx->Color.ClearColor[3]);
+ CLAMPED_FLOAT_TO_CHAN(span.array->rgba[i][0], ctx->Color.ClearColor.cl[0]);
+ CLAMPED_FLOAT_TO_CHAN(span.array->rgba[i][1], ctx->Color.ClearColor.cl[1]);
+ CLAMPED_FLOAT_TO_CHAN(span.array->rgba[i][2], ctx->Color.ClearColor.cl[2]);
+ CLAMPED_FLOAT_TO_CHAN(span.array->rgba[i][3], ctx->Color.ClearColor.cl[3]);
}
}
@@ -126,21 +126,21 @@ clear_rgba_buffer(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint buf
switch (rb->DataType) {
case GL_UNSIGNED_BYTE:
- UNCLAMPED_FLOAT_TO_UBYTE(clear8[0], ctx->Color.ClearColor[0]);
- UNCLAMPED_FLOAT_TO_UBYTE(clear8[1], ctx->Color.ClearColor[1]);
- UNCLAMPED_FLOAT_TO_UBYTE(clear8[2], ctx->Color.ClearColor[2]);
- UNCLAMPED_FLOAT_TO_UBYTE(clear8[3], ctx->Color.ClearColor[3]);
+ UNCLAMPED_FLOAT_TO_UBYTE(clear8[0], ctx->Color.ClearColor.cl[0]);
+ UNCLAMPED_FLOAT_TO_UBYTE(clear8[1], ctx->Color.ClearColor.cl[1]);
+ UNCLAMPED_FLOAT_TO_UBYTE(clear8[2], ctx->Color.ClearColor.cl[2]);
+ UNCLAMPED_FLOAT_TO_UBYTE(clear8[3], ctx->Color.ClearColor.cl[3]);
clearVal = clear8;
break;
case GL_UNSIGNED_SHORT:
- UNCLAMPED_FLOAT_TO_USHORT(clear16[0], ctx->Color.ClearColor[0]);
- UNCLAMPED_FLOAT_TO_USHORT(clear16[1], ctx->Color.ClearColor[1]);
- UNCLAMPED_FLOAT_TO_USHORT(clear16[2], ctx->Color.ClearColor[2]);
- UNCLAMPED_FLOAT_TO_USHORT(clear16[3], ctx->Color.ClearColor[3]);
+ UNCLAMPED_FLOAT_TO_USHORT(clear16[0], ctx->Color.ClearColor.cl[0]);
+ UNCLAMPED_FLOAT_TO_USHORT(clear16[1], ctx->Color.ClearColor.cl[1]);
+ UNCLAMPED_FLOAT_TO_USHORT(clear16[2], ctx->Color.ClearColor.cl[2]);
+ UNCLAMPED_FLOAT_TO_USHORT(clear16[3], ctx->Color.ClearColor.cl[3]);
clearVal = clear16;
break;
case GL_FLOAT:
- clearVal = ctx->Color.ClearColor;
+ clearVal = ctx->Color.ClearColor.cl;
break;
default:
_mesa_problem(ctx, "Bad rb DataType in clear_color_buffer");
--
1.7.6
More information about the mesa-dev
mailing list