iris: clear stencil
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 30 Jul 2018 22:08:02 +0000 (15:08 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:08 +0000 (10:26 -0800)
src/gallium/drivers/iris/iris_clear.c
src/gallium/drivers/iris/iris_resource.c
src/gallium/drivers/iris/iris_resource.h

index 91a161b88c6ffeef701967e0407e6ba9a7a65a9a..2ee70855bf8984ec8acbea5d915d3edd081f4184 100644 (file)
 #include "iris_screen.h"
 #include "intel/compiler/brw_compiler.h"
 
+static void
+split_depth_stencil_resources(struct pipe_resource *res,
+                              struct pipe_resource **out_z,
+                              struct pipe_resource **out_s)
+{
+   const struct util_format_description *desc =
+      util_format_description(res->format);
+
+   if (util_format_has_depth(desc)) {
+      *out_z = res;
+      *out_s = iris_resource_get_separate_stencil(res);
+   } else {
+      assert(util_format_has_stencil(desc));
+      *out_z = NULL;
+      *out_s = res;
+   }
+}
+
 /**
  * The pipe->clear() driver hook.
  *
@@ -60,21 +78,31 @@ iris_clear(struct pipe_context *ctx,
 
    if (buffers & PIPE_CLEAR_DEPTHSTENCIL) {
       struct pipe_surface *psurf = cso_fb->zsbuf;
+      struct pipe_resource *z_res;
+      struct pipe_resource *stencil_res;
       struct blorp_surf z_surf;
+      struct blorp_surf stencil_surf;
       const unsigned num_layers =
          psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1;
 
-      iris_blorp_surf_for_resource(&z_surf, psurf->texture,
-                                   ISL_AUX_USAGE_NONE, true);
+      split_depth_stencil_resources(psurf->texture, &z_res, &stencil_res);
 
-      blorp_clear_depth_stencil(&blorp_batch, &z_surf, NULL /* XXX */,
+      if (z_res) {
+         iris_blorp_surf_for_resource(&z_surf, z_res,
+                                      ISL_AUX_USAGE_NONE, true);
+      }
+
+      if (stencil_res) {
+         iris_blorp_surf_for_resource(&stencil_surf, stencil_res,
+                                      ISL_AUX_USAGE_NONE, true);
+      }
+
+      blorp_clear_depth_stencil(&blorp_batch, &z_surf, &stencil_surf,
                                 psurf->u.tex.level, psurf->u.tex.first_layer,
                                 num_layers, 0, 0, psurf->width, psurf->height,
-                                (buffers & PIPE_CLEAR_DEPTH) != 0,
-                                depth, 0 /* XXX */, stencil);
-
-      if (buffers & PIPE_CLEAR_STENCIL)
-         fprintf(stderr, "XXX: stencil clears not implemented\n");
+                                (buffers & PIPE_CLEAR_DEPTH) != 0, depth,
+                                (buffers & PIPE_CLEAR_STENCIL) ? 0xff : 0,
+                                stencil);
    }
 
    if (buffers & PIPE_CLEAR_COLOR) {
index 4930def9098af6a33ca3de33872948dde2a1aecb..3417cef893c1aae72ca840228022944c54861252 100644 (file)
@@ -161,6 +161,15 @@ pipe_bind_to_isl_usage(unsigned bindings)
    return usage;
 }
 
+struct pipe_resource *
+iris_resource_get_separate_stencil(struct pipe_resource *p_res)
+{
+   /* For packed depth-stencil, we treat depth as the primary resource
+    * and store S8 as the "second plane" resource.
+    */
+   return p_res->next;
+}
+
 static void
 iris_resource_destroy(struct pipe_screen *screen,
                       struct pipe_resource *resource)
@@ -195,15 +204,17 @@ iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
    struct iris_screen *screen = (struct iris_screen *)pscreen;
    struct gen_device_info *devinfo = &screen->devinfo;
    struct iris_resource *res = iris_alloc_resource(pscreen, templ);
+   const struct util_format_description *format_desc =
+      util_format_description(templ->format);
+
    if (!res)
       return NULL;
 
-   bool depth_or_stencil = util_format_is_depth_or_stencil(templ->format);
-
+   const bool has_depth = util_format_has_depth(format_desc);
    uint64_t modifier = DRM_FORMAT_MOD_INVALID;
 
    if (modifiers_count == 0 || !modifiers) {
-      if (depth_or_stencil) {
+      if (has_depth) {
          modifier = I915_FORMAT_MOD_Y_TILED;
       } else if (templ->bind & PIPE_BIND_DISPLAY_TARGET) {
          /* Display is X-tiled for historical reasons. */
@@ -230,14 +241,21 @@ iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
    const struct isl_drm_modifier_info *mod_info =
       isl_drm_modifier_get_info(modifier);
 
+   enum isl_tiling tiling = templ->format == PIPE_FORMAT_S8_UINT ?
+      ISL_TILING_W : mod_info->tiling;
+
    isl_surf_usage_flags_t usage = pipe_bind_to_isl_usage(templ->bind);
 
    if (templ->target == PIPE_TEXTURE_CUBE ||
        templ->target == PIPE_TEXTURE_CUBE_ARRAY)
       usage |= ISL_SURF_USAGE_CUBE_BIT;
 
-   if (depth_or_stencil && templ->usage != PIPE_USAGE_STAGING)
-      usage |= ISL_SURF_USAGE_DEPTH_BIT;
+   if (templ->usage != PIPE_USAGE_STAGING) {
+      if (templ->format == PIPE_FORMAT_S8_UINT)
+         usage |= ISL_SURF_USAGE_STENCIL_BIT;
+      else if (has_depth)
+         usage |= ISL_SURF_USAGE_DEPTH_BIT;
+   }
 
    enum pipe_format pfmt = templ->format;
 
@@ -265,7 +283,7 @@ iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
                     .min_alignment_B = 0,
                     .row_pitch_B = 0,
                     .usage = usage,
-                    .tiling_flags = 1 << mod_info->tiling);
+                    .tiling_flags = 1 << tiling);
    assert(isl_surf_created_successfully);
 
    enum iris_memory_zone memzone = IRIS_MEMZONE_OTHER;
index cf333cf0a24a7664bf7d3d6dfd238e662c578162..4679036fcd5f355a1bf86f20bf637d40ef21594f 100644 (file)
@@ -87,6 +87,8 @@ iris_resource_bo(struct pipe_resource *p_res)
 
 enum isl_format iris_isl_format_for_pipe_format(enum pipe_format pf);
 
+struct pipe_resource *iris_resource_get_separate_stencil(struct pipe_resource *);
+
 void iris_init_screen_resource_functions(struct pipe_screen *pscreen);
 
 #endif