iris: Use single-aspect formats more in iris_blit
authorNanley Chery <nanley.g.chery@intel.com>
Mon, 4 Jan 2021 19:40:52 +0000 (11:40 -0800)
committerMarge Bot <eric+marge@anholt.net>
Thu, 7 Jan 2021 23:00:32 +0000 (23:00 +0000)
In order to handle blitting the stencil aspect of a depth-stencil
resource, use aspect-specific pipe formats in the aspect_mask loop.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8340>

src/gallium/drivers/iris/iris_blit.c

index d9d74d3..b3a345b 100644 (file)
@@ -346,6 +346,18 @@ iris_resource_for_aspect(struct pipe_resource *p_res, unsigned pipe_mask)
    }
 }
 
+static enum pipe_format
+pipe_format_for_aspect(enum pipe_format format, unsigned pipe_mask)
+{
+   if (pipe_mask == PIPE_MASK_S) {
+      return util_format_stencil_only(format);
+   } else if (pipe_mask == PIPE_MASK_Z) {
+      return util_format_get_depth_only(format);
+   } else {
+      return format;
+   }
+}
+
 /**
  * The pipe->blit() driver hook.
  *
@@ -464,14 +476,18 @@ iris_blit(struct pipe_context *ctx, const struct pipe_blit_info *info)
       struct iris_resource *dst_res =
          iris_resource_for_aspect(info->dst.resource, aspect);
 
+      enum pipe_format src_pfmt =
+         pipe_format_for_aspect(info->src.format, aspect);
+      enum pipe_format dst_pfmt =
+         pipe_format_for_aspect(info->dst.format, aspect);
+
       if (iris_resource_unfinished_aux_import(src_res))
          iris_resource_finish_aux_import(ctx->screen, src_res);
       if (iris_resource_unfinished_aux_import(dst_res))
          iris_resource_finish_aux_import(ctx->screen, dst_res);
 
       struct iris_format_info src_fmt =
-         iris_format_for_usage(devinfo, info->src.format,
-                               ISL_SURF_USAGE_TEXTURE_BIT);
+         iris_format_for_usage(devinfo, src_pfmt, ISL_SURF_USAGE_TEXTURE_BIT);
       enum isl_aux_usage src_aux_usage =
          iris_resource_texture_aux_usage(ice, src_res, src_fmt.fmt);
 
@@ -482,7 +498,7 @@ iris_blit(struct pipe_context *ctx, const struct pipe_blit_info *info)
                                    IRIS_DOMAIN_OTHER_READ);
 
       struct iris_format_info dst_fmt =
-         iris_format_for_usage(devinfo, info->dst.format,
+         iris_format_for_usage(devinfo, dst_pfmt,
                                ISL_SURF_USAGE_RENDER_TARGET_BIT);
       enum isl_aux_usage dst_aux_usage =
          iris_resource_blorp_write_aux_usage(ice, dst_res, dst_fmt.fmt);