iris: Fill out res->aux.possible_usages
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 7 Dec 2018 19:02:50 +0000 (11:02 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:12 +0000 (10:26 -0800)
src/gallium/drivers/iris/iris_resource.c

index 5dbc4f7de6cc6fef66276b5e314d68e315b3a44c..39cec6b65657e01537b20f10559fc7e043a71423 100644 (file)
@@ -232,9 +232,53 @@ iris_alloc_resource(struct pipe_screen *pscreen,
    res->base.screen = pscreen;
    pipe_reference_init(&res->base.reference, 1);
 
+   res->aux.possible_usages = 1 << ISL_AUX_USAGE_NONE;
+
    return res;
 }
 
+static bool
+supports_mcs(const struct isl_surf *surf)
+{
+   /* MCS compression only applies to multisampled resources. */
+   if (surf->samples <= 1)
+      return false;
+
+   /* See isl_surf_get_mcs_surf for details. */
+   if (surf->samples == 16 && surf->logical_level0_px.width > 8192)
+      return false;
+
+   /* Depth and stencil buffers use the IMS (interleaved) layout. */
+   if (isl_surf_usage_is_depth_or_stencil(surf->usage))
+      return false;
+
+   return true;
+}
+
+static bool
+supports_ccs(const struct gen_device_info *devinfo,
+             const struct isl_surf *surf)
+{
+   /* Gen9+ only supports CCS for Y-tiled buffers. */
+   if (surf->tiling != ISL_TILING_Y0)
+      return false;
+
+   /* CCS only supports singlesampled resources. */
+   if (surf->samples > 1)
+      return false;
+
+   /* The PRM doesn't say this explicitly, but fast-clears don't appear to
+    * work for 3D textures until Gen9 where the layout of 3D textures changes
+    * to match 2D array textures.
+    */
+   if (devinfo->gen < 9 && surf->dim != ISL_SURF_DIM_2D)
+      return false;
+
+   /* Note: still need to check the format! */
+
+   return true;
+}
+
 static struct pipe_resource *
 iris_resource_create_for_buffer(struct pipe_screen *pscreen,
                                 const struct pipe_resource *templ)
@@ -282,21 +326,21 @@ 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;
 
+   const struct util_format_description *format_desc =
+      util_format_description(templ->format);
    const bool has_depth = util_format_has_depth(format_desc);
+   const struct isl_drm_modifier_info *mod_info = NULL;
    uint64_t modifier =
       select_best_modifier(devinfo, modifiers, modifiers_count);
 
    isl_tiling_flags_t tiling_flags = ISL_TILING_ANY_MASK;
 
    if (modifier != DRM_FORMAT_MOD_INVALID) {
-      const struct isl_drm_modifier_info *mod_info =
-         isl_drm_modifier_get_info(modifier);
+      mod_info = isl_drm_modifier_get_info(modifier);
 
       tiling_flags = 1 << mod_info->tiling;
    } else {
@@ -364,8 +408,25 @@ iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
                     .tiling_flags = tiling_flags);
    assert(isl_surf_created_successfully);
 
-   const char *name = "miptree";
+   if (mod_info) {
+      res->aux.possible_usages |= 1 << mod_info->aux_usage;
+   } else if (has_depth) {
+      res->aux.possible_usages |= 1 << ISL_AUX_USAGE_HIZ;
+   } else if (supports_mcs(&res->surf)) {
+      res->aux.possible_usages |= 1 << ISL_AUX_USAGE_MCS;
+   } else if (supports_ccs(devinfo, &res->surf)) {
+      if (isl_format_supports_ccs_e(devinfo, res->surf.format))
+         res->aux.possible_usages |= 1 << ISL_AUX_USAGE_CCS_E;
+      else if (isl_format_supports_ccs_d(devinfo, res->surf.format))
+         res->aux.possible_usages |= 1 << ISL_AUX_USAGE_CCS_D;
+   }
+
+   // XXX: we don't actually do aux yet
+   res->aux.possible_usages = 1 << ISL_AUX_USAGE_NONE;
 
+   res->aux.usage = util_last_bit(res->aux.possible_usages) - 1;
+
+   const char *name = "miptree";
    enum iris_memory_zone memzone = IRIS_MEMZONE_OTHER;
 
    /* These are for u_upload_mgr buffers only */