mesa: Respect GL_RASTERIZER_DISCARD for various meta-type operations.
authorEric Anholt <eric@anholt.net>
Fri, 30 Sep 2011 06:13:44 +0000 (23:13 -0700)
committerEric Anholt <eric@anholt.net>
Sun, 2 Oct 2011 05:16:07 +0000 (22:16 -0700)
From the EXT_transform_feedback spec:

    Primitives can be optionally discarded before rasterization by calling
    Enable and Disable with RASTERIZER_DISCARD_EXT. When enabled, primitives
    are discared right before the rasterization stage, but after the optional
    transform feedback stage. When disabled, primitives are passed through to
    the rasterization stage to be processed normally. RASTERIZER_DISCARD_EXT
    applies to the DrawPixels, CopyPixels, Bitmap, Clear and Accum commands as
    well.

And the GL 3.2 spec says it applies to ClearBuffer* as well.

Reviewed-by: Brian Paul <brianp@vmware.com>
src/mesa/main/accum.c
src/mesa/main/clear.c
src/mesa/main/drawpix.c

index 6a83930a13dca0494f522e0ebaa02c5751ac67da..d7ed3a849beb497c2bf5636d319a0ca3d74d1107 100644 (file)
@@ -97,6 +97,9 @@ _mesa_Accum( GLenum op, GLfloat value )
       return;
    }
 
+   if (ctx->TransformFeedback.RasterDiscard)
+      return;
+
    if (ctx->RenderMode == GL_RENDER) {
       ctx->Driver.Accum(ctx, op, value);
    }
index 301fe694cda7be229950fc2e024beb2980f7858e..c35675fb4d1650d7ff22e7afef80946a42b24774 100644 (file)
@@ -200,6 +200,9 @@ _mesa_Clear( GLbitfield mask )
        ctx->DrawBuffer->_Ymin >= ctx->DrawBuffer->_Ymax)
       return;
 
+   if (ctx->TransformFeedback.RasterDiscard)
+      return;
+
    if (ctx->RenderMode == GL_RENDER) {
       GLbitfield bufferMask;
 
@@ -328,7 +331,7 @@ _mesa_ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
                      drawbuffer);
          return;
       }
-      else {
+      else if (!ctx->TransformFeedback.RasterDiscard) {
          /* Save current stencil clear value, set to 'value', do the
           * stencil clear and restore the clear value.
           * XXX in the future we may have a new ctx->Driver.ClearBuffer()
@@ -352,7 +355,7 @@ _mesa_ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
                         drawbuffer);
             return;
          }
-         else if (mask) {
+         else if (mask && !ctx->TransformFeedback.RasterDiscard) {
             union gl_color_union clearSave;
 
             /* save color */
@@ -403,7 +406,7 @@ _mesa_ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
                         drawbuffer);
             return;
          }
-         else if (mask) {
+         else if (mask && !ctx->TransformFeedback.RasterDiscard) {
             union gl_color_union clearSave;
 
             /* save color */
@@ -452,7 +455,7 @@ _mesa_ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
                      drawbuffer);
          return;
       }
-      else {
+      else if (!ctx->TransformFeedback.RasterDiscard) {
          /* Save current depth clear value, set to 'value', do the
           * depth clear and restore the clear value.
           * XXX in the future we may have a new ctx->Driver.ClearBuffer()
@@ -477,7 +480,7 @@ _mesa_ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
                         drawbuffer);
             return;
          }
-         else if (mask) {
+         else if (mask && !ctx->TransformFeedback.RasterDiscard) {
             union gl_color_union clearSave;
 
             /* save color */
@@ -528,6 +531,9 @@ _mesa_ClearBufferfi(GLenum buffer, GLint drawbuffer,
       return;
    }
 
+   if (ctx->TransformFeedback.RasterDiscard)
+      return;
+
    if (ctx->NewState) {
       _mesa_update_state( ctx );
    }
index b7e2c36e1922a33713c8a4932669d60a3d3caf0f..412cc15af4e85d2f1b1215b1278f3f6858b05d18 100644 (file)
@@ -80,6 +80,10 @@ _mesa_DrawPixels( GLsizei width, GLsizei height,
       goto end;      /* the error code was recorded */
    }
 
+   if (ctx->TransformFeedback.RasterDiscard) {
+      goto end;
+   }
+
    if (!ctx->Current.RasterPosValid) {
       goto end;  /* no-op, not an error */
    }
@@ -188,6 +192,10 @@ _mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height,
       goto end;
    }
 
+   if (ctx->TransformFeedback.RasterDiscard) {
+      goto end;
+   }
+
    if (!ctx->Current.RasterPosValid || width == 0 || height == 0) {
       goto end; /* no-op, not an error */
    }
@@ -242,6 +250,9 @@ _mesa_Bitmap( GLsizei width, GLsizei height,
       return;
    }
 
+   if (ctx->TransformFeedback.RasterDiscard)
+      return;
+
    if (ctx->RenderMode == GL_RENDER) {
       /* Truncate, to satisfy conformance tests (matches SGI's OpenGL). */
       if (width > 0 && height > 0) {