Mesa (master): util: new util_fill_box helper

Roland Scheidegger sroland at kemper.freedesktop.org
Wed Jun 12 22:45:09 UTC 2013


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

Author: Roland Scheidegger <sroland at vmware.com>
Date:   Thu Jun 13 00:40:34 2013 +0200

util: new util_fill_box helper

Use new util_fill_box helper for util_clear_render_target.
(Also fix off-by-one map error.)

v2: handle non-zero z correctly in new helper

Reviewed-by: Jose Fonseca <jfonseca at vmware.com>

---

 src/gallium/auxiliary/util/u_surface.c |   40 +++++++++++++++++------
 src/gallium/auxiliary/util/u_surface.h |    7 ++++
 src/gallium/drivers/llvmpipe/lp_rast.c |   54 +++++++++++++++-----------------
 3 files changed, 62 insertions(+), 39 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_surface.c b/src/gallium/auxiliary/util/u_surface.c
index 77d04ba..17591f1 100644
--- a/src/gallium/auxiliary/util/u_surface.c
+++ b/src/gallium/auxiliary/util/u_surface.c
@@ -214,6 +214,30 @@ util_fill_rect(ubyte * dst,
 }
 
 
+void
+util_fill_box(ubyte * dst,
+              enum pipe_format format,
+              unsigned stride,
+              unsigned layer_stride,
+              unsigned x,
+              unsigned y,
+              unsigned z,
+              unsigned width,
+              unsigned height,
+              unsigned depth,
+              union util_color *uc)
+{
+   unsigned layer;
+   dst += z * layer_stride;
+   for (layer = z; layer < depth; layer++) {
+      util_fill_rect(dst, format,
+                     stride,
+                     x, y, width, height, uc);
+      dst += layer_stride;
+   }
+}
+
+
 /**
  * Fallback function for pipe->resource_copy_region().
  * Note: (X,Y)=(0,0) is always the upper-left corner.
@@ -319,7 +343,7 @@ util_clear_render_target(struct pipe_context *pipe,
    struct pipe_transfer *dst_trans;
    ubyte *dst_map;
    union util_color uc;
-   unsigned max_layer, layer;
+   unsigned max_layer;
 
    assert(dst->texture);
    if (!dst->texture)
@@ -349,7 +373,7 @@ util_clear_render_target(struct pipe_context *pipe,
                                      dst->u.tex.level,
                                      PIPE_TRANSFER_WRITE,
                                      dstx, dsty, dst->u.tex.first_layer,
-                                     width, height, max_layer, &dst_trans);
+                                     width, height, max_layer + 1, &dst_trans);
    }
 
    assert(dst_map);
@@ -376,12 +400,9 @@ util_clear_render_target(struct pipe_context *pipe,
          util_pack_color(color->f, dst->format, &uc);
       }
 
-      for (layer = 0; layer <= max_layer; layer++) {
-         util_fill_rect(dst_map, dst->format,
-                        dst_trans->stride,
-                        0, 0, width, height, &uc);
-         dst_map += dst_trans->layer_stride;
-      }
+      util_fill_box(dst_map, dst->format,
+                    dst_trans->stride, dst_trans->layer_stride,
+                    0, 0, 0, width, height, max_layer + 1, &uc);
 
       pipe->transfer_unmap(pipe, dst_trans);
    }
@@ -430,8 +451,7 @@ util_clear_depth_stencil(struct pipe_context *pipe,
 
    if (dst_map) {
       unsigned dst_stride = dst_trans->stride;
-      uint64_t zstencil = util_pack64_z_stencil(format,
-                                                depth, stencil);
+      uint64_t zstencil = util_pack64_z_stencil(format, depth, stencil);
       ubyte *dst_layer = dst_map;
       unsigned i, j;
       assert(dst_trans->stride > 0);
diff --git a/src/gallium/auxiliary/util/u_surface.h b/src/gallium/auxiliary/util/u_surface.h
index d6184ac..bfd8f40 100644
--- a/src/gallium/auxiliary/util/u_surface.h
+++ b/src/gallium/auxiliary/util/u_surface.h
@@ -65,6 +65,13 @@ util_fill_rect(ubyte * dst, enum pipe_format format,
                unsigned dst_stride, unsigned dst_x, unsigned dst_y,
                unsigned width, unsigned height, union util_color *uc);
 
+extern void
+util_fill_box(ubyte * dst, enum pipe_format format,
+              unsigned stride, unsigned layer_stride,
+              unsigned x, unsigned y, unsigned z,
+              unsigned width, unsigned height, unsigned depth,
+              union util_color *uc);
+
 
 extern void
 util_resource_copy_region(struct pipe_context *pipe,
diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c
index dcd66ab..79d4c58 100644
--- a/src/gallium/drivers/llvmpipe/lp_rast.c
+++ b/src/gallium/drivers/llvmpipe/lp_rast.c
@@ -135,8 +135,6 @@ lp_rast_clear_color(struct lp_rasterizer_task *task,
 
          for (i = 0; i < scene->fb.nr_cbufs; i++) {
             enum pipe_format format = scene->fb.cbufs[i]->format;
-            unsigned layer;
-            uint8_t *map_layer = scene->cbufs[i].map;
 
             if (util_format_is_pure_sint(format)) {
                util_format_write_4i(format, arg.clear_color.i, 0, &uc, 0, 0, 0, 1, 1);
@@ -146,17 +144,17 @@ lp_rast_clear_color(struct lp_rasterizer_task *task,
                util_format_write_4ui(format, arg.clear_color.ui, 0, &uc, 0, 0, 0, 1, 1);
             }
 
-            for (layer = 0; layer <= scene->fb_max_layer; layer++) {
-               util_fill_rect(map_layer,
-                              scene->fb.cbufs[i]->format,
-                              scene->cbufs[i].stride,
-                              task->x,
-                              task->y,
-                              task->width,
-                              task->height,
-                              &uc);
-               map_layer += scene->cbufs[i].layer_stride;
-            }
+            util_fill_box(scene->cbufs[i].map,
+                          format,
+                          scene->cbufs[i].stride,
+                          scene->cbufs[i].layer_stride,
+                          task->x,
+                          task->y,
+                          0,
+                          task->width,
+                          task->height,
+                          scene->fb_max_layer + 1,
+                          &uc);
          }
       }
       else {
@@ -173,22 +171,20 @@ lp_rast_clear_color(struct lp_rasterizer_task *task,
                     clear_color[3]);
 
          for (i = 0; i < scene->fb.nr_cbufs; i++) {
-            unsigned layer;
-            uint8_t *map_layer = scene->cbufs[i].map;
-
-            for (layer = 0; layer <= scene->fb_max_layer; layer++) {
-               util_pack_color(arg.clear_color.f,
-                               scene->fb.cbufs[i]->format, &uc);
-               util_fill_rect(map_layer,
-                              scene->fb.cbufs[i]->format,
-                              scene->cbufs[i].stride,
-                              task->x,
-                              task->y,
-                              task->width,
-                              task->height,
-                              &uc);
-               map_layer += scene->cbufs[i].layer_stride;
-            }
+            util_pack_color(arg.clear_color.f,
+                            scene->fb.cbufs[i]->format, &uc);
+
+            util_fill_box(scene->cbufs[i].map,
+                          scene->fb.cbufs[i]->format,
+                          scene->cbufs[i].stride,
+                          scene->cbufs[i].layer_stride,
+                          task->x,
+                          task->y,
+                          0,
+                          task->width,
+                          task->height,
+                          scene->fb_max_layer + 1,
+                          &uc);
          }
       }
    }




More information about the mesa-commit mailing list