gallium/util: add tight_format_check param to util_can_blit_via_copy_region()
authorBrian Paul <brianp@vmware.com>
Thu, 23 Jun 2016 14:11:25 +0000 (08:11 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 30 Jun 2016 20:32:06 +0000 (14:32 -0600)
The VMware driver will use this for implementing GL_ARB_copy_image.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Reviewed-by: Charmaine Lee <charmainel@vmware.com>
src/gallium/auxiliary/util/u_surface.c
src/gallium/auxiliary/util/u_surface.h

index e2229bc7d13e612967f2d51377b28e7b1a5f3164..e0234f8d15ed8c9fcf30f4a9532faf6e24396177 100644 (file)
@@ -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,
index bda2e1e9243c1e91d3e55153525da0f9650ca372..64a685b82642a0f7f3e3fdade942e2a5eab1a23c 100644 (file)
@@ -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,