mesa: fix some potential state-restore issues in pop_texture_group()

Call the _mesa_set_enable() functions instead of driver functions, etc.

Also, add missing code for 1D/2D texture arrays.
(cherry picked from commit aac19609bf)
This commit is contained in:
Brian Paul
2009-05-21 10:05:04 -06:00
committed by Ian Romanick
parent ad0514b24d
commit 19ca5ee1db

View File

@@ -1,6 +1,6 @@
/*
* Mesa 3-D graphics library
* Version: 7.3
* Version: 7.6
*
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
* Copyright (C) 2009 VMware, Inc. All Rights Reserved.
@@ -541,6 +541,7 @@ end:
static void
pop_enable_group(GLcontext *ctx, const struct gl_enable_attrib *enable)
{
const GLuint curTexUnitSave = ctx->Texture.CurrentUnit;
GLuint i;
#define TEST_AND_UPDATE(VALUE, NEWVALUE, ENUM) \
@@ -685,59 +686,51 @@ pop_enable_group(GLcontext *ctx, const struct gl_enable_attrib *enable)
/* texture unit enables */
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
if (ctx->Texture.Unit[i].Enabled != enable->Texture[i]) {
ctx->Texture.Unit[i].Enabled = enable->Texture[i];
if (ctx->Driver.Enable) {
if (ctx->Driver.ActiveTexture) {
(*ctx->Driver.ActiveTexture)(ctx, i);
}
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_1D,
(GLboolean) (enable->Texture[i] & TEXTURE_1D_BIT) );
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_2D,
(GLboolean) (enable->Texture[i] & TEXTURE_2D_BIT) );
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_3D,
(GLboolean) (enable->Texture[i] & TEXTURE_3D_BIT) );
if (ctx->Extensions.ARB_texture_cube_map)
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_CUBE_MAP_ARB,
(GLboolean) (enable->Texture[i] & TEXTURE_CUBE_BIT) );
if (ctx->Extensions.NV_texture_rectangle)
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_RECTANGLE_NV,
(GLboolean) (enable->Texture[i] & TEXTURE_RECT_BIT) );
const GLbitfield enabled = enable->Texture[i];
const GLbitfield genEnabled = enable->TexGen[i];
if (ctx->Texture.Unit[i].Enabled != enabled) {
_mesa_ActiveTextureARB(GL_TEXTURE0 + i);
_mesa_set_enable(ctx, GL_TEXTURE_1D,
(enabled & TEXTURE_1D_BIT) ? GL_TRUE : GL_FALSE);
_mesa_set_enable(ctx, GL_TEXTURE_2D,
(enabled & TEXTURE_2D_BIT) ? GL_TRUE : GL_FALSE);
_mesa_set_enable(ctx, GL_TEXTURE_3D,
(enabled & TEXTURE_3D_BIT) ? GL_TRUE : GL_FALSE);
if (ctx->Extensions.NV_texture_rectangle) {
_mesa_set_enable(ctx, GL_TEXTURE_RECTANGLE_ARB,
(enabled & TEXTURE_RECT_BIT) ? GL_TRUE : GL_FALSE);
}
if (ctx->Extensions.ARB_texture_cube_map) {
_mesa_set_enable(ctx, GL_TEXTURE_CUBE_MAP,
(enabled & TEXTURE_CUBE_BIT) ? GL_TRUE : GL_FALSE);
}
if (ctx->Extensions.MESA_texture_array) {
_mesa_set_enable(ctx, GL_TEXTURE_1D_ARRAY_EXT,
(enabled & TEXTURE_1D_ARRAY_BIT) ? GL_TRUE : GL_FALSE);
_mesa_set_enable(ctx, GL_TEXTURE_2D_ARRAY_EXT,
(enabled & TEXTURE_2D_ARRAY_BIT) ? GL_TRUE : GL_FALSE);
}
}
if (ctx->Texture.Unit[i].TexGenEnabled != enable->TexGen[i]) {
ctx->Texture.Unit[i].TexGenEnabled = enable->TexGen[i];
if (ctx->Driver.Enable) {
if (ctx->Driver.ActiveTexture) {
(*ctx->Driver.ActiveTexture)(ctx, i);
}
if (enable->TexGen[i] & S_BIT)
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_S, GL_TRUE);
else
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_S, GL_FALSE);
if (enable->TexGen[i] & T_BIT)
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_T, GL_TRUE);
else
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_T, GL_FALSE);
if (enable->TexGen[i] & R_BIT)
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_R, GL_TRUE);
else
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_R, GL_FALSE);
if (enable->TexGen[i] & Q_BIT)
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_Q, GL_TRUE);
else
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_Q, GL_FALSE);
}
if (ctx->Texture.Unit[i].TexGenEnabled != genEnabled) {
_mesa_ActiveTextureARB(GL_TEXTURE0 + i);
_mesa_set_enable(ctx, GL_TEXTURE_GEN_S,
(genEnabled & S_BIT) ? GL_TRUE : GL_FALSE);
_mesa_set_enable(ctx, GL_TEXTURE_GEN_T,
(genEnabled & T_BIT) ? GL_TRUE : GL_FALSE);
_mesa_set_enable(ctx, GL_TEXTURE_GEN_R,
(genEnabled & R_BIT) ? GL_TRUE : GL_FALSE);
_mesa_set_enable(ctx, GL_TEXTURE_GEN_Q,
(genEnabled & Q_BIT) ? GL_TRUE : GL_FALSE);
}
/* GL_SGI_texture_color_table */
ctx->Texture.Unit[i].ColorTableEnabled = enable->TextureColorTable[i];
}
if (ctx->Driver.ActiveTexture) {
(*ctx->Driver.ActiveTexture)(ctx, ctx->Texture.CurrentUnit);
}
_mesa_ActiveTextureARB(GL_TEXTURE0 + curTexUnitSave);
}
@@ -770,6 +763,13 @@ pop_texture_group(GLcontext *ctx, struct texture_state *texstate)
_mesa_set_enable(ctx, GL_TEXTURE_RECTANGLE_NV,
(unit->Enabled & TEXTURE_RECT_BIT) ? GL_TRUE : GL_FALSE);
}
if (ctx->Extensions.MESA_texture_array) {
_mesa_set_enable(ctx, GL_TEXTURE_1D_ARRAY_EXT,
(unit->Enabled & TEXTURE_1D_ARRAY_BIT) ? GL_TRUE : GL_FALSE);
_mesa_set_enable(ctx, GL_TEXTURE_2D_ARRAY_EXT,
(unit->Enabled & TEXTURE_2D_ARRAY_BIT) ? GL_TRUE : GL_FALSE);
}
if (ctx->Extensions.SGI_texture_color_table) {
_mesa_set_enable(ctx, GL_TEXTURE_COLOR_TABLE_SGI,
unit->ColorTableEnabled);