From: Dave Airlie <airl...@redhat.com> This adds a clear color type and introduces setting it to GL_FLOAT in the appropriate places.
Signed-off-by: Dave Airlie <airl...@redhat.com> --- src/mesa/main/blend.c | 1 + src/mesa/main/clear.c | 39 ++++++++++++++++++++++++++++++--------- src/mesa/main/mtypes.h | 2 +- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/mesa/main/blend.c b/src/mesa/main/blend.c index e1a6577..7b0ebd7 100644 --- a/src/mesa/main/blend.c +++ b/src/mesa/main/blend.c @@ -797,6 +797,7 @@ void _mesa_init_color( struct gl_context * ctx ) ctx->Color.ClearIndex = 0; ASSIGN_4V( ctx->Color.ClearColor.f, 0, 0, 0, 0 ); ASSIGN_4V( ctx->Color.ClearColorUnclamped.f, 0, 0, 0, 0 ); + ctx->Color._ClearColorType = GL_FLOAT; 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 ecf2907..3754756 100644 --- a/src/mesa/main/clear.c +++ b/src/mesa/main/clear.c @@ -89,6 +89,7 @@ _mesa_ClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) FLUSH_VERTICES(ctx, _NEW_COLOR); COPY_4V(ctx->Color.ClearColorUnclamped.f, tmp); + ctx->Color._ClearColorType = GL_FLOAT; 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); @@ -99,7 +100,7 @@ _mesa_ClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) /* we pass the clamped color, since all drivers that need this don't * support GL_ARB_color_buffer_float */ - (*ctx->Driver.ClearColor)(ctx, GL_FLOAT, ctx->Color.ClearColor); + (*ctx->Driver.ClearColor)(ctx, ctx->Color._ClearColorType, ctx->Color.ClearColor); } } @@ -127,10 +128,11 @@ _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. */ + ctx->Color._ClearColorType = GL_FLOAT; COPY_4V(ctx->Color.ClearColor.f, tmp); if (ctx->Driver.ClearColor) { - ctx->Driver.ClearColor(ctx, GL_FLOAT, ctx->Color.ClearColor); + ctx->Driver.ClearColor(ctx, ctx->Color._ClearColorType, ctx->Color.ClearColor); } } @@ -158,10 +160,11 @@ _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. */ + ctx->Color._ClearColorType = GL_FLOAT; COPY_4V(ctx->Color.ClearColor.f, tmp); if (ctx->Driver.ClearColor) { - ctx->Driver.ClearColor(ctx, GL_FLOAT, ctx->Color.ClearColor); + ctx->Driver.ClearColor(ctx, ctx->Color._ClearColorType, ctx->Color.ClearColor); } } @@ -369,18 +372,24 @@ _mesa_ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value) * need a new ctx->Driver.ClearBuffer() hook.... */ union gl_clear_color clearSave; + GLenum clearColorTypeSave; + /* save color */ + clearColorTypeSave = ctx->Color._ClearColorType; COPY_4V(clearSave.cl, ctx->Color.ClearColor.cl); /* set color */ + ctx->Color._ClearColorType = GL_FLOAT; COPY_4V_CAST(ctx->Color.ClearColor.cl, value, GLclampf); if (ctx->Driver.ClearColor) - ctx->Driver.ClearColor(ctx, GL_FLOAT, ctx->Color.ClearColor); + ctx->Driver.ClearColor(ctx, ctx->Color._ClearColorType, + ctx->Color.ClearColor); /* clear buffer(s) */ ctx->Driver.Clear(ctx, mask); /* restore color */ + ctx->Color._ClearColorType = clearColorTypeSave; COPY_4V(ctx->Color.ClearColor.cl, clearSave.cl); if (ctx->Driver.ClearColor) - ctx->Driver.ClearColor(ctx, GL_FLOAT, clearSave); + ctx->Driver.ClearColor(ctx, clearColorTypeSave, clearSave); } } break; @@ -423,18 +432,24 @@ _mesa_ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value) * need a new ctx->Driver.ClearBuffer() hook.... */ union gl_clear_color clearSave; + GLenum clearColorTypeSave; + /* save color */ + clearColorTypeSave = ctx->Color._ClearColorType; COPY_4V(clearSave.cl, ctx->Color.ClearColor.cl); /* set color */ + ctx->Color._ClearColorType = GL_FLOAT; COPY_4V_CAST(ctx->Color.ClearColor.cl, value, GLclampf); if (ctx->Driver.ClearColor) - ctx->Driver.ClearColor(ctx, GL_FLOAT, ctx->Color.ClearColor); + ctx->Driver.ClearColor(ctx, ctx->Color._ClearColorType, + ctx->Color.ClearColor); /* clear buffer(s) */ ctx->Driver.Clear(ctx, mask); /* restore color */ + ctx->Color._ClearColorType = clearColorTypeSave; COPY_4V(ctx->Color.ClearColor.cl, clearSave.cl); if (ctx->Driver.ClearColor) - ctx->Driver.ClearColor(ctx, GL_FLOAT, clearSave); + ctx->Driver.ClearColor(ctx, clearColorTypeSave, clearSave); } } break; @@ -496,18 +511,24 @@ _mesa_ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value) } else if (mask) { union gl_clear_color clearSave; + GLenum clearColorTypeSave; + /* save color */ + clearColorTypeSave = ctx->Color._ClearColorType; COPY_4V(clearSave.cl, ctx->Color.ClearColor.cl); /* set color */ + ctx->Color._ClearColorType = GL_FLOAT; COPY_4V_CAST(ctx->Color.ClearColor.cl, value, GLclampf); if (ctx->Driver.ClearColor) - ctx->Driver.ClearColor(ctx, GL_FLOAT, ctx->Color.ClearColor); + ctx->Driver.ClearColor(ctx, ctx->Color._ClearColorType, + ctx->Color.ClearColor); /* clear buffer(s) */ ctx->Driver.Clear(ctx, mask); /* restore color */ + ctx->Color._ClearColorType = clearColorTypeSave; COPY_4V(ctx->Color.ClearColor.cl, clearSave.cl); if (ctx->Driver.ClearColor) - ctx->Driver.ClearColor(ctx, GL_FLOAT, clearSave); + ctx->Driver.ClearColor(ctx, clearColorTypeSave, clearSave); } } break; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 04f1436..29d6add 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -732,7 +732,7 @@ struct gl_colorbuffer_attrib GLuint ClearIndex; /**< Index to use for glClear */ union gl_clear_color ClearColorUnclamped; /**< Color to use for glClear*/ union gl_clear_color ClearColor; /**< Color to use for glClear*/ - + GLenum _ClearColorType; /**< Type of Color passed, GL_FLOAT, GL_INT, GL_UNSIGNED_INT */ GLuint IndexMask; /**< Color index write mask */ GLubyte ColorMask[MAX_DRAW_BUFFERS][4];/**< Each flag is 0xff or 0x0 */ -- 1.7.6 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev