[Mesa-dev] [PATCH 03/16] gallium/util: add tight_format_check param to util_can_blit_via_copy_region()

Marek Olšák maraeo at gmail.com
Wed Jun 29 09:33:15 UTC 2016


For 1-3:

Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Wed, Jun 29, 2016 at 1:52 AM, Brian Paul <brianp at vmware.com> wrote:
> The VMware driver will use this for implementing GL_ARB_copy_image.
> ---
>  src/gallium/auxiliary/util/u_surface.c | 38 +++++++++++++++++++++++++---------
>  src/gallium/auxiliary/util/u_surface.h |  3 ++-
>  2 files changed, 30 insertions(+), 11 deletions(-)
>
> diff --git a/src/gallium/auxiliary/util/u_surface.c b/src/gallium/auxiliary/util/u_surface.c
> index e2229bc..e0234f8 100644
> --- a/src/gallium/auxiliary/util/u_surface.c
> +++ b/src/gallium/auxiliary/util/u_surface.c
> @@ -687,19 +687,37 @@ get_sample_count(const struct pipe_resource *res)
>  }
>
>
> +/**
> + * Check if a blit() command can be implemented with a resource_copy_region().
> + * If tight_format_check is true, only allow the resource_copy_region() if
> + * the blit src/dst formats are identical, ignoring the resource formats.
> + * Otherwise, check for format casting and compatibility.
> + */
>  boolean
> -util_can_blit_via_copy_region(const struct pipe_blit_info *blit)
> +util_can_blit_via_copy_region(const struct pipe_blit_info *blit,
> +                              boolean tight_format_check)
>  {
> -   unsigned mask = util_format_get_mask(blit->dst.format);
> +   const struct util_format_description *src_desc, *dst_desc;
>
> -   /* 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;
> +   src_desc = util_format_description(blit->src.resource->format);
> +   dst_desc = util_format_description(blit->dst.resource->format);
> +
> +   if (tight_format_check) {
> +      /* no format conversions allowed */
> +      if (blit->src.format != blit->dst.format) {
> +         return FALSE;
> +      }
>     }
> +   else {
> +      /* do loose format compatibility checking */
> +      if (blit->src.resource->format != blit->src.format ||
> +          blit->dst.resource->format != blit->dst.format ||
> +          !util_is_format_compatible(src_desc, dst_desc)) {
> +         return FALSE;
> +      }
> +   }
> +
> +   unsigned mask = util_format_get_mask(blit->dst.format);
>
>     /* No masks, no filtering, no scissor, no blending */
>     if ((blit->mask & mask) != mask ||
> @@ -752,7 +770,7 @@ boolean
>  util_try_blit_via_copy_region(struct pipe_context *ctx,
>                                const struct pipe_blit_info *blit)
>  {
> -   if (util_can_blit_via_copy_region(blit)) {
> +   if (util_can_blit_via_copy_region(blit, FALSE)) {
>        ctx->resource_copy_region(ctx, blit->dst.resource, blit->dst.level,
>                                  blit->dst.box.x, blit->dst.box.y,
>                                  blit->dst.box.z,
> diff --git a/src/gallium/auxiliary/util/u_surface.h b/src/gallium/auxiliary/util/u_surface.h
> index bda2e1e..64a685b 100644
> --- a/src/gallium/auxiliary/util/u_surface.h
> +++ b/src/gallium/auxiliary/util/u_surface.h
> @@ -99,7 +99,8 @@ util_clear_depth_stencil(struct pipe_context *pipe,
>                           unsigned width, unsigned height);
>
>  boolean
> -util_can_blit_via_copy_region(const struct pipe_blit_info *blit);
> +util_can_blit_via_copy_region(const struct pipe_blit_info *blit,
> +                              boolean tight_format_check);
>
>  extern boolean
>  util_try_blit_via_copy_region(struct pipe_context *ctx,
> --
> 1.9.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list