mesa: Move RasterDiscard to toplevel of gl_context.
authorPaul Berry <stereotype441@gmail.com>
Wed, 21 Dec 2011 00:18:39 +0000 (16:18 -0800)
committerPaul Berry <stereotype441@gmail.com>
Wed, 21 Dec 2011 21:33:31 +0000 (13:33 -0800)
Previously we were storing the RasterDiscard flag (for
GL_RASTERIZER_DISCARD) in gl_context::TransformFeedback.  This was
confusing, because we use the _NEW_TRANSFORM flag (not
_NEW_TRANSFORM_FEEDBACK) to track state updates to it, and because
rasterizer discard has effects even when transform feedback is not in
use.

This patch makes RasterDiscard a toplevel element in gl_context rather
than a subfield of gl_context::TransformFeedback.

Note: We can't put RasterDiscard inside gl_context::Transform, since
all items inside gl_context::Transform need to be pieces of state that
are saved and restored using PushAttrib and PopAttrib.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Marek Olšák <maraeo@gmail.com>
src/mesa/drivers/dri/i965/brw_gs.c
src/mesa/main/accum.c
src/mesa/main/clear.c
src/mesa/main/drawpix.c
src/mesa/main/enable.c
src/mesa/main/get.c
src/mesa/main/mtypes.h
src/mesa/state_tracker/st_atom_rasterizer.c

index ee3f94ca613e7b1cdfda47f6f293c6add0127c9e..2495ad5fe0b4d2ad9b116ed3ff88524948da5c75 100644 (file)
@@ -210,7 +210,7 @@ static void populate_key( struct brw_context *brw,
       }
       /* On Gen6, GS is also used for rasterizer discard. */
       /* _NEW_TRANSFORM_FEEDBACK */
-      if (ctx->TransformFeedback.RasterDiscard) {
+      if (ctx->RasterDiscard) {
          key->need_gs_prog = true;
          key->rasterizer_discard = true;
       }
index eb06bbb6e89445f5eba48e53a49d0cf00d72fed4..a8c30c22399f98968eb3c268ddb846ce50ebfd85 100644 (file)
@@ -100,7 +100,7 @@ _mesa_Accum( GLenum op, GLfloat value )
       return;
    }
 
-   if (ctx->TransformFeedback.RasterDiscard)
+   if (ctx->RasterDiscard)
       return;
 
    if (ctx->RenderMode == GL_RENDER) {
index 2e27c951bbbfb2d315e787ae117dc97f5ce0329b..bd5c012245a7efc4add0b15157709ddcfbb59b05 100644 (file)
@@ -200,7 +200,7 @@ _mesa_Clear( GLbitfield mask )
        ctx->DrawBuffer->_Ymin >= ctx->DrawBuffer->_Ymax)
       return;
 
-   if (ctx->TransformFeedback.RasterDiscard)
+   if (ctx->RasterDiscard)
       return;
 
    if (ctx->RenderMode == GL_RENDER) {
@@ -338,7 +338,7 @@ _mesa_ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
                      drawbuffer);
          return;
       }
-      else if (!ctx->TransformFeedback.RasterDiscard) {
+      else if (!ctx->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()
@@ -362,7 +362,7 @@ _mesa_ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
                         drawbuffer);
             return;
          }
-         else if (mask && !ctx->TransformFeedback.RasterDiscard) {
+         else if (mask && !ctx->RasterDiscard) {
             union gl_color_union clearSave;
 
             /* save color */
@@ -432,7 +432,7 @@ _mesa_ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
                         drawbuffer);
             return;
          }
-         else if (mask && !ctx->TransformFeedback.RasterDiscard) {
+         else if (mask && !ctx->RasterDiscard) {
             union gl_color_union clearSave;
 
             /* save color */
@@ -513,7 +513,7 @@ _mesa_ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
                      drawbuffer);
          return;
       }
-      else if (!ctx->TransformFeedback.RasterDiscard) {
+      else if (!ctx->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()
@@ -538,7 +538,7 @@ _mesa_ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
                         drawbuffer);
             return;
          }
-         else if (mask && !ctx->TransformFeedback.RasterDiscard) {
+         else if (mask && !ctx->RasterDiscard) {
             union gl_color_union clearSave;
 
             /* save color */
@@ -615,7 +615,7 @@ _mesa_ClearBufferfi(GLenum buffer, GLint drawbuffer,
       return;
    }
 
-   if (ctx->TransformFeedback.RasterDiscard)
+   if (ctx->RasterDiscard)
       return;
 
    if (ctx->NewState) {
index c9e714b210a7d1d026d73beddc26eb2270ac9056..9f5b0b36eb7b1368573ed957c0100c007b090aa1 100644 (file)
@@ -98,7 +98,7 @@ _mesa_DrawPixels( GLsizei width, GLsizei height,
       goto end;      /* the error code was recorded */
    }
 
-   if (ctx->TransformFeedback.RasterDiscard) {
+   if (ctx->RasterDiscard) {
       goto end;
    }
 
@@ -210,7 +210,7 @@ _mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height,
       goto end;
    }
 
-   if (ctx->TransformFeedback.RasterDiscard) {
+   if (ctx->RasterDiscard) {
       goto end;
    }
 
@@ -268,7 +268,7 @@ _mesa_Bitmap( GLsizei width, GLsizei height,
       return;
    }
 
-   if (ctx->TransformFeedback.RasterDiscard)
+   if (ctx->RasterDiscard)
       return;
 
    if (ctx->RenderMode == GL_RENDER) {
index 6461ac1b3c9f524260cc9062fa77884929f9e2d3..749ae98f5ecc1e217452a88a13c8baedb185a60a 100644 (file)
@@ -889,9 +889,9 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
 #if FEATURE_EXT_transform_feedback
       case GL_RASTERIZER_DISCARD:
         CHECK_EXTENSION(EXT_transform_feedback, cap);
-         if (ctx->TransformFeedback.RasterDiscard != state) {
+         if (ctx->RasterDiscard != state) {
             FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
-            ctx->TransformFeedback.RasterDiscard = state;
+            ctx->RasterDiscard = state;
          }
          break;
 #endif
@@ -1403,7 +1403,7 @@ _mesa_IsEnabled( GLenum cap )
 #if FEATURE_EXT_transform_feedback
       case GL_RASTERIZER_DISCARD:
         CHECK_EXTENSION(EXT_transform_feedback);
-         return ctx->TransformFeedback.RasterDiscard;
+         return ctx->RasterDiscard;
 #endif
 
       /* GL_NV_primitive_restart */
index 4df6afe360fe1469ec0cdf19e5c8822f2e568291..0c9d6b391d4faa0999c6522f65017c8b7e837d77 100644 (file)
@@ -1204,7 +1204,7 @@ static const struct value_desc values[] = {
    /* GL_EXT_transform_feedback */
    { GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, LOC_CUSTOM, TYPE_INT, 0,
      extra_EXT_transform_feedback },
-   { GL_RASTERIZER_DISCARD, CONTEXT_BOOL(TransformFeedback.RasterDiscard),
+   { GL_RASTERIZER_DISCARD, CONTEXT_BOOL(RasterDiscard),
      extra_EXT_transform_feedback },
    { GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS,
      CONTEXT_INT(Const.MaxTransformFeedbackInterleavedComponents),
index 93bf04ec097a6a99b692821e74cffed550130721..ff97ea91af2fe83cdaabb8b24a32ad0935f58a4c 100644 (file)
@@ -2386,8 +2386,6 @@ struct gl_transform_feedback
 {
    GLenum Mode;       /**< GL_POINTS, GL_LINES or GL_TRIANGLES */
 
-   GLboolean RasterDiscard;  /**< GL_RASTERIZER_DISCARD */
-
    /** The general binding point (GL_TRANSFORM_FEEDBACK_BUFFER) */
    struct gl_buffer_object *CurrentBuffer;
 
@@ -3407,6 +3405,8 @@ struct gl_context
     */
    GLboolean mvp_with_dp4;
 
+   GLboolean RasterDiscard;  /**< GL_RASTERIZER_DISCARD */
+
    /**
     * \name Hooks for module contexts.  
     *
index 4aa0b4e2aa6620e5b04a0d14f3917969e2fadff4..7ebc8728166a0587862e2bd3eeccc932c486aa4e 100644 (file)
@@ -259,7 +259,7 @@ static void update_raster_state( struct st_context *st )
    raster->gl_rasterization_rules = 1;
 
    /* _NEW_TRANSFORM */
-   raster->rasterizer_discard = ctx->TransformFeedback.RasterDiscard;
+   raster->rasterizer_discard = ctx->RasterDiscard;
 
    cso_set_rasterizer(st->cso_context, raster);
 }