On 09/14/2012 11:09 AM, Marek Olšák wrote:
---
src/gallium/auxiliary/util/u_blitter.c | 136 ++++++++++++++++++++++++++++++++
src/gallium/auxiliary/util/u_blitter.h | 4 +
2 files changed, 140 insertions(+)
diff --git a/src/gallium/auxiliary/util/u_blitter.c
b/src/gallium/auxiliary/util/u_blitter.c
index 2d20d70..cab7484 100644
--- a/src/gallium/auxiliary/util/u_blitter.c
+++ b/src/gallium/auxiliary/util/u_blitter.c
@@ -1807,3 +1807,139 @@ void util_blitter_custom_color(struct blitter_context
*blitter,
blitter_restore_render_cond(ctx);
blitter_unset_running_flag(ctx);
}
+
Maybe put a comment on this function?
+static unsigned get_format_mask(enum pipe_format format)
+{
+ const struct util_format_description *desc =
util_format_description(format);
+
+ assert(desc);
+
+ if (util_format_has_depth(desc)) {
+ if (util_format_has_stencil(desc)) {
+ return PIPE_MASK_ZS;
+ } else {
+ return PIPE_MASK_Z;
+ }
+ } else {
+ if (util_format_has_stencil(desc)) {
+ return PIPE_MASK_S;
+ } else {
+ return PIPE_MASK_RGBA;
+ }
+ }
+}
+
Comment on this one too. Does the box have to be _totally_ inside the
resource (I think so).
+static boolean is_box_within_resource(struct pipe_resource *res,
'res' could be const.
+ const struct pipe_box *box,
+ unsigned level)
+{
+ unsigned width = 1, height = 1, depth = 1;
+
+ switch (res->target) {
+ case PIPE_BUFFER:
+ width = res->width0;
+ height = 1;
+ depth = 1;
+ break;
+ case PIPE_TEXTURE_1D:
+ width = u_minify(res->width0, level);
+ height = 1;
+ depth = 1;
+ break;
+ case PIPE_TEXTURE_2D:
+ case PIPE_TEXTURE_RECT:
+ width = u_minify(res->width0, level);
+ height = u_minify(res->height0, level);
+ depth = 1;
+ break;
+ case PIPE_TEXTURE_3D:
+ width = u_minify(res->width0, level);
+ height = u_minify(res->height0, level);
+ depth = u_minify(res->depth0, level);
+ break;
+ case PIPE_TEXTURE_CUBE:
+ width = u_minify(res->width0, level);
+ height = u_minify(res->height0, level);
+ depth = 6;
+ break;
+ case PIPE_TEXTURE_1D_ARRAY:
+ width = u_minify(res->width0, level);
+ height = 1;
+ depth = res->array_size;
+ break;
+ case PIPE_TEXTURE_2D_ARRAY:
+ width = u_minify(res->width0, level);
+ height = u_minify(res->height0, level);
+ depth = res->array_size;
+ break;
+ case PIPE_MAX_TEXTURE_TYPES:;
+ }
+
+ return box->x>= 0&&
+ box->x + box->width< width&&
+ box->y>= 0&&
+ box->y + box->height< height&&
+ box->z>= 0&&
+ box->z + box->depth< depth;
+}
+
+static unsigned get_sample_count(struct pipe_resource *res)
'res' could be const there.
+{
+ return res->nr_samples ? res->nr_samples : 1;
+}
+
+boolean util_try_blit_via_copy_region(struct pipe_context *ctx,
+ const struct pipe_blit_info *blit)
+{
+ unsigned mask = get_format_mask(blit->dst.format);
+
+ /* No format conversions. */
+ if (blit->src.resource->format != blit->src.format ||
+ blit->dst.resource->format != blit->dst.format ||
+ !util_is_format_compatible(
+ util_format_description(blit->src.resource->format),
+ util_format_description(blit->dst.resource->format))) {
+ return FALSE;
+ }
+
+ /* No masks, no filtering, no scissor. */
+ if ((blit->mask& mask) != mask ||
+ blit->filter != PIPE_TEX_FILTER_NEAREST ||
+ blit->scissor_enable) {
+ return FALSE;
+ }
+
+ /* No flipping. */
+ if (blit->src.box.width< 0 ||
+ blit->src.box.height< 0 ||
+ blit->src.box.depth< 0) {
+ return FALSE;
+ }
+
+ /* No scaling. */
+ if (blit->src.box.width != blit->dst.box.width ||
+ blit->src.box.height != blit->dst.box.height ||
+ blit->src.box.depth != blit->dst.box.depth) {
+ return FALSE;
+ }
+
+ /* No out-of-bounds access. */
+ if (!is_box_within_resource(blit->src.resource,&blit->src.box,
+ blit->src.level) ||
+ !is_box_within_resource(blit->dst.resource,&blit->dst.box,
+ blit->dst.level)) {
+ return FALSE;
+ }
+
+ /* Sample counts must match. */
+ if (get_sample_count(blit->src.resource) !=
+ get_sample_count(blit->dst.resource)) {
+ return FALSE;
+ }
+
+ ctx->resource_copy_region(ctx, blit->dst.resource, blit->dst.level,
+ blit->dst.box.x, blit->dst.box.y, blit->dst.box.z,
+ blit->src.resource, blit->src.level,
+&blit->src.box);
+ return TRUE;
+}
diff --git a/src/gallium/auxiliary/util/u_blitter.h
b/src/gallium/auxiliary/util/u_blitter.h
index 026e88b..51e1afd 100644
--- a/src/gallium/auxiliary/util/u_blitter.h
+++ b/src/gallium/auxiliary/util/u_blitter.h
@@ -142,6 +142,10 @@ void util_blitter_draw_rectangle(struct blitter_context
*blitter,
enum blitter_attrib_type type,
const union pipe_color_union *attrib);
+/* Other helpers. */
Maybe a better comment there?
+boolean util_try_blit_via_copy_region(struct pipe_context *ctx,
+ const struct pipe_blit_info *blit);
+
/*
* These states must be saved before any of the following functions are
called:
* - vertex buffers
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev