From: Dave Airlie <airl...@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 <airl...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev