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:
@@ -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);
|
||||
|
Reference in New Issue
Block a user