Mesa (master): llvmpipe: clean up deferred zstencil clears

Keith Whitwell keithw at kemper.freedesktop.org
Tue Sep 7 13:03:39 UTC 2010


Module: Mesa
Branch: master
Commit: c512ba88a7e33f14b86feb9c0aaf1ebed5f50629
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c512ba88a7e33f14b86feb9c0aaf1ebed5f50629

Author: Keith Whitwell <keithw at vmware.com>
Date:   Fri Aug 27 17:30:07 2010 +0100

llvmpipe: clean up deferred zstencil clears

---

 src/gallium/drivers/llvmpipe/lp_rast.c          |    5 +-
 src/gallium/drivers/llvmpipe/lp_rast.h          |   15 ++--
 src/gallium/drivers/llvmpipe/lp_scene.c         |    1 -
 src/gallium/drivers/llvmpipe/lp_scene.h         |    1 -
 src/gallium/drivers/llvmpipe/lp_setup.c         |   95 +++++++----------------
 src/gallium/drivers/llvmpipe/lp_setup_context.h |    3 +-
 6 files changed, 41 insertions(+), 79 deletions(-)

diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c
index ce6896d..d8dc24e 100644
--- a/src/gallium/drivers/llvmpipe/lp_rast.c
+++ b/src/gallium/drivers/llvmpipe/lp_rast.c
@@ -255,9 +255,8 @@ lp_rast_clear_zstencil(struct lp_rasterizer_task *task,
                        const union lp_rast_cmd_arg arg)
 {
    struct lp_rasterizer *rast = task->rast;
-   const struct lp_rast_clearzs *clearzs = arg.clear_zstencil;
-   unsigned clear_value = clearzs->clearzs_value;
-   unsigned clear_mask = clearzs->clearzs_mask;
+   unsigned clear_value = arg.clear_zstencil.value;
+   unsigned clear_mask = arg.clear_zstencil.mask;
    const unsigned height = TILE_SIZE / TILE_VECTOR_HEIGHT;
    const unsigned width = TILE_SIZE * TILE_VECTOR_HEIGHT;
    const unsigned block_size = rast->zsbuf.blocksize;
diff --git a/src/gallium/drivers/llvmpipe/lp_rast.h b/src/gallium/drivers/llvmpipe/lp_rast.h
index 9d3deb4..d6e53f3 100644
--- a/src/gallium/drivers/llvmpipe/lp_rast.h
+++ b/src/gallium/drivers/llvmpipe/lp_rast.h
@@ -88,10 +88,6 @@ struct lp_rast_shader_inputs {
    const struct lp_rast_state *state;
 };
 
-struct lp_rast_clearzs {
-   unsigned clearzs_value;
-   unsigned clearzs_mask;
-};
 
 struct lp_rast_plane {
    /* one-pixel sized trivial accept offsets for each plane */
@@ -151,7 +147,10 @@ union lp_rast_cmd_arg {
    } triangle;
    const struct lp_rast_state *set_state;
    uint8_t clear_color[4];
-   const struct lp_rast_clearzs *clear_zstencil;
+   struct {
+      unsigned value;
+      unsigned mask;
+   } clear_zstencil;
    struct lp_fence *fence;
    struct llvmpipe_query *query_obj;
 };
@@ -195,13 +194,15 @@ lp_rast_arg_fence( struct lp_fence *fence )
 
 
 static INLINE union lp_rast_cmd_arg
-lp_rast_arg_clearzs( const struct lp_rast_clearzs *clearzs )
+lp_rast_arg_clearzs( unsigned value, unsigned mask )
 {
    union lp_rast_cmd_arg arg;
-   arg.clear_zstencil = clearzs;
+   arg.clear_zstencil.value = value;
+   arg.clear_zstencil.mask = mask;
    return arg;
 }
 
+
 static INLINE union lp_rast_cmd_arg
 lp_rast_arg_null( void )
 {
diff --git a/src/gallium/drivers/llvmpipe/lp_scene.c b/src/gallium/drivers/llvmpipe/lp_scene.c
index 15a09b7..51389c2 100644
--- a/src/gallium/drivers/llvmpipe/lp_scene.c
+++ b/src/gallium/drivers/llvmpipe/lp_scene.c
@@ -206,7 +206,6 @@ lp_scene_reset(struct lp_scene *scene )
 
    scene->scene_size = 0;
 
-   scene->has_color_clear = FALSE;
    scene->has_depthstencil_clear = FALSE;
 }
 
diff --git a/src/gallium/drivers/llvmpipe/lp_scene.h b/src/gallium/drivers/llvmpipe/lp_scene.h
index fa1b311..e933a84 100644
--- a/src/gallium/drivers/llvmpipe/lp_scene.h
+++ b/src/gallium/drivers/llvmpipe/lp_scene.h
@@ -125,7 +125,6 @@ struct lp_scene {
     */
    unsigned scene_size;
 
-   boolean has_color_clear;
    boolean has_depthstencil_clear;
 
    /**
diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
index ae6d678..3bef620 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup.c
@@ -135,8 +135,7 @@ static void reset_context( struct lp_setup_context *setup )
 
    /* Reset some state:
     */
-   setup->clear.flags = 0;
-   setup->clear.clearzs.clearzs_mask = 0;
+   memset(&setup->clear, 0, sizeof setup->clear);
 
    /* Have an explicit "start-binning" call and get rid of this
     * pointer twiddling?
@@ -195,7 +194,6 @@ begin_binning( struct lp_setup_context *setup )
          lp_scene_bin_everywhere( scene, 
 				  lp_rast_clear_color, 
 				  setup->clear.color );
-         scene->has_color_clear = TRUE;
       }
    }
 
@@ -205,7 +203,9 @@ begin_binning( struct lp_setup_context *setup )
             scene->has_depthstencil_clear = TRUE;
          lp_scene_bin_everywhere( scene,
                                   lp_rast_clear_zstencil,
-                                  lp_rast_arg_clearzs(&setup->clear.clearzs) );
+                                  lp_rast_arg_clearzs(
+                                     setup->clear.zsmask,
+                                     setup->clear.zsvalue));
       }
    }
 
@@ -341,67 +341,26 @@ lp_setup_clear( struct lp_setup_context *setup,
                 unsigned flags )
 {
    struct lp_scene *scene = lp_setup_get_current_scene(setup);
+   uint32_t zsmask = 0;
+   uint32_t zsvalue = 0;
+   uint8_t clear_color[4];
    unsigned i;
-   boolean full_zs_clear = TRUE;
-   uint32_t mask = 0;
 
    LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state);
 
-
    if (flags & PIPE_CLEAR_COLOR) {
-      for (i = 0; i < 4; ++i)
-         setup->clear.color.clear_color[i] = float_to_ubyte(color[i]);
+      for (i = 0; i < 4; i++)
+         clear_color[i] = float_to_ubyte(color[i]);
    }
 
    if (flags & PIPE_CLEAR_DEPTHSTENCIL) {
-      if (setup->fb.zsbuf &&
-          ((flags & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) &&
-           util_format_is_depth_and_stencil(setup->fb.zsbuf->format))
-         full_zs_clear = FALSE;
-
-      if (full_zs_clear) {
-         setup->clear.clearzs.clearzs_value =
-            util_pack_z_stencil(setup->fb.zsbuf->format,
-                                depth,
-                                stencil);
-         setup->clear.clearzs.clearzs_mask = 0xffffffff;
-      }
-      else {
-         /* hmm */
-         uint32_t tmpval;
-         if (flags & PIPE_CLEAR_DEPTH) {
-            tmpval = util_pack_z(setup->fb.zsbuf->format,
-                                 depth);
-            switch (setup->fb.zsbuf->format) {
-            case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
-               mask = 0xffffff;
-               break;
-            case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
-               mask = 0xffffff00;
-               break;
-            default:
-               assert(0);
-            }
-         }
-         else {
-            switch (setup->fb.zsbuf->format) {
-            case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
-               mask = 0xff000000;
-               tmpval = stencil << 24;
-               break;
-            case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
-               mask = 0xff;
-               tmpval = stencil;
-               break;
-            default:
-               assert(0);
-               tmpval = 0;
-            }
-         }
-         setup->clear.clearzs.clearzs_mask |= mask;
-         setup->clear.clearzs.clearzs_value =
-            (setup->clear.clearzs.clearzs_value & ~mask) | (tmpval & mask);
-      }
+      zsvalue = util_pack_z_stencil(setup->fb.zsbuf->format,
+                                    depth,
+                                    stencil);
+
+      zsmask = util_pack_uint_z_stencil(setup->fb.zsbuf->format,
+                                        0xffffffff,
+                                        0xff);
    }
 
    if (setup->state == SETUP_ACTIVE) {
@@ -415,21 +374,13 @@ lp_setup_clear( struct lp_setup_context *setup,
          lp_scene_bin_everywhere( scene, 
                                   lp_rast_clear_color,
                                   setup->clear.color );
-         scene->has_color_clear = TRUE;
       }
 
       if (flags & PIPE_CLEAR_DEPTHSTENCIL) {
-         if (full_zs_clear)
-            scene->has_depthstencil_clear = TRUE;
-         else
-            setup->clear.clearzs.clearzs_mask = mask;
          lp_scene_bin_everywhere( scene,
                                   lp_rast_clear_zstencil,
-                                  lp_rast_arg_clearzs(&setup->clear.clearzs) );
-
-
+                                  lp_rast_arg_clearzs(zsmask, zsvalue) );
       }
-
    }
    else {
       /* Put ourselves into the 'pre-clear' state, specifically to try
@@ -440,6 +391,18 @@ lp_setup_clear( struct lp_setup_context *setup,
       set_scene_state( setup, SETUP_CLEARED );
 
       setup->clear.flags |= flags;
+
+      if (flags & PIPE_CLEAR_DEPTHSTENCIL) {
+         setup->clear.zsmask |= zsmask;
+         setup->clear.zsvalue =
+            (setup->clear.zsvalue & ~zsmask) | (zsvalue & zsmask);
+      }
+
+      if (flags & PIPE_CLEAR_COLOR) {
+         memcpy(setup->clear.color.clear_color,
+                clear_color,
+                sizeof clear_color);
+      }
    }
 }
 
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_context.h b/src/gallium/drivers/llvmpipe/lp_setup_context.h
index 91b5d4d..fa4e5e9 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_context.h
+++ b/src/gallium/drivers/llvmpipe/lp_setup_context.h
@@ -108,7 +108,8 @@ struct lp_setup_context
    struct {
       unsigned flags;
       union lp_rast_cmd_arg color;    /**< lp_rast_clear_color() cmd */
-      struct lp_rast_clearzs clearzs; /**< lp_rast_clear_zstencil() cmd */
+      unsigned zsmask;
+      unsigned zsvalue;               /**< lp_rast_clear_zstencil() cmd */
    } clear;
 
    enum setup_state {




More information about the mesa-commit mailing list