For 1-3: Reviewed-by: Marek Olšák <marek.ol...@amd.com>
Marek On Wed, Jun 29, 2016 at 1:52 AM, Brian Paul <bri...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev