mesa: added META_FOG and optimize some meta_begin/end() code
authorBrian Paul <brianp@vmware.com>
Wed, 12 Aug 2009 00:54:57 +0000 (18:54 -0600)
committerBrian Paul <brianp@vmware.com>
Wed, 12 Aug 2009 02:34:21 +0000 (20:34 -0600)
src/mesa/drivers/common/meta.c
src/mesa/drivers/common/meta.h

index 56ad8f809b9b82f5a31b60f99dd800f8ff9eefbb..9638e9bc7cfc9bfbe11730aff8653ebe10102f7b 100644 (file)
@@ -78,6 +78,9 @@ struct save_state
    /** META_DEPTH_TEST */
    struct gl_depthbuffer_attrib Depth;
 
+   /** META_FOG */
+   GLboolean Fog;
+
    /** META_PIXELSTORE */
    /* XXX / TO-DO */
 
@@ -128,7 +131,6 @@ struct save_state
 
    /** Miscellaneous (always disabled) */
    GLboolean Lighting;
-   GLboolean Fog;
 };
 
 
@@ -171,7 +173,6 @@ struct copypix_state
 };
 
 
-
 /**
  * All per-context meta state.
  */
@@ -279,6 +280,12 @@ _mesa_meta_begin(GLcontext *ctx, GLbitfield state)
          _mesa_Disable(GL_DEPTH_TEST);
    }
 
+   if (state & META_FOG) {
+      save->Fog = ctx->Fog.Enabled;
+      if (ctx->Fog.Enabled)
+         _mesa_set_enable(ctx, GL_FOG, GL_FALSE);
+   }
+
    if (state & META_RASTERIZATION) {
       save->FrontPolygonMode = ctx->Polygon.FrontMode;
       save->BackPolygonMode = ctx->Polygon.BackMode;
@@ -335,16 +342,19 @@ _mesa_meta_begin(GLcontext *ctx, GLbitfield state)
       for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
          save->TexEnabled[u] = ctx->Texture.Unit[u].Enabled;
          save->TexGenEnabled[u] = ctx->Texture.Unit[u].TexGenEnabled;
-         _mesa_ActiveTextureARB(GL_TEXTURE0 + u);
-         _mesa_set_enable(ctx, GL_TEXTURE_1D, GL_FALSE);
-         _mesa_set_enable(ctx, GL_TEXTURE_2D, GL_FALSE);
-         _mesa_set_enable(ctx, GL_TEXTURE_3D, GL_FALSE);
-         _mesa_set_enable(ctx, GL_TEXTURE_CUBE_MAP, GL_FALSE);
-         _mesa_set_enable(ctx, GL_TEXTURE_RECTANGLE, GL_FALSE);
-         _mesa_set_enable(ctx, GL_TEXTURE_GEN_S, GL_FALSE);
-         _mesa_set_enable(ctx, GL_TEXTURE_GEN_T, GL_FALSE);
-         _mesa_set_enable(ctx, GL_TEXTURE_GEN_R, GL_FALSE);
-         _mesa_set_enable(ctx, GL_TEXTURE_GEN_Q, GL_FALSE);
+         if (ctx->Texture.Unit[u].Enabled ||
+             ctx->Texture.Unit[u].TexGenEnabled) {
+            _mesa_ActiveTextureARB(GL_TEXTURE0 + u);
+            _mesa_set_enable(ctx, GL_TEXTURE_1D, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_2D, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_3D, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_CUBE_MAP, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_RECTANGLE, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_GEN_S, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_GEN_T, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_GEN_R, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_GEN_Q, GL_FALSE);
+         }
       }
 
       /* save current texture objects for unit[0] only */
@@ -357,10 +367,6 @@ _mesa_meta_begin(GLcontext *ctx, GLbitfield state)
       _mesa_ActiveTextureARB(GL_TEXTURE0);
       _mesa_ClientActiveTextureARB(GL_TEXTURE0);
       _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
-      _mesa_set_enable(ctx, GL_TEXTURE_GEN_S, GL_FALSE);
-      _mesa_set_enable(ctx, GL_TEXTURE_GEN_T, GL_FALSE);
-      _mesa_set_enable(ctx, GL_TEXTURE_GEN_R, GL_FALSE);
-      _mesa_set_enable(ctx, GL_TEXTURE_GEN_Q, GL_FALSE);
    }
 
    if (state & META_TRANSFORM) {
@@ -418,10 +424,6 @@ _mesa_meta_begin(GLcontext *ctx, GLbitfield state)
       save->Lighting = ctx->Light.Enabled;
       if (ctx->Light.Enabled)
          _mesa_set_enable(ctx, GL_LIGHTING, GL_FALSE);
-
-      save->Fog = ctx->Fog.Enabled;
-      if (ctx->Fog.Enabled)
-         _mesa_set_enable(ctx, GL_FOG, GL_FALSE);
    }
 }
 
@@ -460,6 +462,10 @@ _mesa_meta_end(GLcontext *ctx)
       _mesa_DepthMask(save->Depth.Mask);
    }
 
+   if (state & META_FOG) {
+      _mesa_set_enable(ctx, GL_FOG, save->Fog);
+   }
+
    if (state & META_RASTERIZATION) {
       _mesa_PolygonMode(GL_FRONT, save->FrontPolygonMode);
       _mesa_PolygonMode(GL_BACK, save->BackPolygonMode);
@@ -895,6 +901,7 @@ _mesa_meta_copy_pixels(GLcontext *ctx, GLint srcX, GLint srcY,
 
    if (type != GL_COLOR ||
        ctx->_ImageTransferState ||
+       ctx->Fog.Enabled ||
        width > ctx->Const.MaxTextureRectSize ||
        height > ctx->Const.MaxTextureRectSize) {
       /* XXX avoid this fallback */
index b66d20c34422ac965d47bc0844b22ec0cdf480a5..88cab8e3882609835b6c91ed63412e8aaca999d7 100644 (file)
 #define META_BLEND           0x2  /**< includes logicop */
 #define META_COLOR_MASK      0x4
 #define META_DEPTH_TEST      0x8
-#define META_RASTERIZATION  0x10
-#define META_SCISSOR        0x20
-#define META_SHADER         0x40
-#define META_STENCIL_TEST   0x80
-#define META_TRANSFORM     0x100 /**< modelview, projection */
-#define META_TEXTURE       0x200
-#define META_VERTEX        0x400
-#define META_VIEWPORT      0x800
+#define META_FOG            0x10
+#define META_RASTERIZATION  0x20
+#define META_SCISSOR        0x40
+#define META_SHADER         0x80
+#define META_STENCIL_TEST  0x100
+#define META_TRANSFORM     0x200 /**< modelview, projection */
+#define META_TEXTURE       0x400
+#define META_VERTEX        0x800
+#define META_VIEWPORT     0x1000
 #define META_ALL            ~0x0
 /*@}*/