[Mesa-dev] [PATCH 09/23] gallium/u_blitter: add helper for blitting via resource_copy_region

Brian Paul brianp at vmware.com
Fri Sep 21 09:29:59 PDT 2012


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



More information about the mesa-dev mailing list