diff options
author | Brian Paul <[email protected]> | 2009-08-10 15:44:05 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2009-08-10 15:44:05 -0600 |
commit | edb991b7bcb1ed6c3ad352750c6613672039a901 (patch) | |
tree | 6bb4005e9948aa85f3f18b1b7a6580db7013e100 /src/mesa | |
parent | 2ad10c966c87b2efc956bcc58aaedc60f0a5c6a4 (diff) |
mesa: save/restore texture matrix in meta code
Also, save/restore viewport and texture state in _mesa_meta_copy_pixels()
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/common/meta.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index a7eba2e75ca..56ad8f809b9 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -105,6 +105,7 @@ struct save_state GLenum MatrixMode; GLfloat ModelviewMatrix[16]; GLfloat ProjectionMatrix[16]; + GLfloat TextureMatrix[16]; GLbitfield ClipPlanesEnabled; /** META_TEXTURE */ @@ -363,12 +364,19 @@ _mesa_meta_begin(GLcontext *ctx, GLbitfield state) } if (state & META_TRANSFORM) { + GLuint activeTexture = ctx->Texture.CurrentUnit; _mesa_memcpy(save->ModelviewMatrix, ctx->ModelviewMatrixStack.Top->m, 16 * sizeof(GLfloat)); _mesa_memcpy(save->ProjectionMatrix, ctx->ProjectionMatrixStack.Top->m, 16 * sizeof(GLfloat)); + _mesa_memcpy(save->TextureMatrix, ctx->TextureMatrixStack[0].Top->m, + 16 * sizeof(GLfloat)); save->MatrixMode = ctx->Transform.MatrixMode; /* set 1:1 vertex:pixel coordinate transform */ + _mesa_ActiveTextureARB(GL_TEXTURE0); + _mesa_MatrixMode(GL_TEXTURE); + _mesa_LoadIdentity(); + _mesa_ActiveTextureARB(GL_TEXTURE0 + activeTexture); _mesa_MatrixMode(GL_MODELVIEW); _mesa_LoadIdentity(); _mesa_MatrixMode(GL_PROJECTION); @@ -569,11 +577,20 @@ _mesa_meta_end(GLcontext *ctx) } if (state & META_TRANSFORM) { + GLuint activeTexture = ctx->Texture.CurrentUnit; + _mesa_ActiveTextureARB(GL_TEXTURE0); + _mesa_MatrixMode(GL_TEXTURE); + _mesa_LoadMatrixf(save->TextureMatrix); + _mesa_ActiveTextureARB(GL_TEXTURE0 + activeTexture); + _mesa_MatrixMode(GL_MODELVIEW); _mesa_LoadMatrixf(save->ModelviewMatrix); + _mesa_MatrixMode(GL_PROJECTION); _mesa_LoadMatrixf(save->ProjectionMatrix); + _mesa_MatrixMode(save->MatrixMode); + save->ClipPlanesEnabled = ctx->Transform.ClipPlanesEnabled; if (save->ClipPlanesEnabled) { GLuint i; @@ -890,8 +907,10 @@ _mesa_meta_copy_pixels(GLcontext *ctx, GLint srcX, GLint srcY, */ _mesa_meta_begin(ctx, (META_RASTERIZATION | META_SHADER | + META_TEXTURE | META_TRANSFORM | - META_VERTEX)); + META_VERTEX | + META_VIEWPORT)); if (copypix->TexObj == 0) { /* one-time setup */ |