summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2009-08-10 15:44:05 -0600
committerBrian Paul <brianp@vmware.com>2009-08-10 15:44:05 -0600
commitedb991b7bcb1ed6c3ad352750c6613672039a901 (patch)
tree6bb4005e9948aa85f3f18b1b7a6580db7013e100
parent2ad10c966c87b2efc956bcc58aaedc60f0a5c6a4 (diff)
mesa: save/restore texture matrix in meta code
Also, save/restore viewport and texture state in _mesa_meta_copy_pixels()
-rw-r--r--src/mesa/drivers/common/meta.c21
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 */