intel: Support HIZ_CCS in isl_surf_get_ccs_surf
authorNanley Chery <nanley.g.chery@intel.com>
Mon, 19 Aug 2019 16:17:26 +0000 (09:17 -0700)
committerNanley Chery <nanley.g.chery@intel.com>
Mon, 28 Oct 2019 17:47:05 +0000 (10:47 -0700)
Add an extra aux parameter which will be filled out with CCS if the
first two isl_surf parameters fit the requirements for HiZ_CCS.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/gallium/drivers/iris/iris_resource.c
src/intel/isl/isl.c
src/intel/isl/isl.h
src/intel/vulkan/anv_image.c
src/mesa/drivers/dri/i965/intel_mipmap_tree.c
src/mesa/drivers/dri/i965/intel_screen.c

index d7a6973ef547a310259ed1b8591e2b51cd57e8c3..9bd9835e71b1af74bc933f9068b4d21f7578fe1a 100644 (file)
@@ -461,7 +461,7 @@ iris_resource_configure_aux(struct iris_screen *screen,
       else
          initial_state = ISL_AUX_STATE_PASS_THROUGH;
       *alloc_flags |= BO_ALLOC_ZEROED;
-      ok = isl_surf_get_ccs_surf(isl_dev, &res->surf, &res->aux.surf, 0);
+      ok = isl_surf_get_ccs_surf(isl_dev, &res->surf, &res->aux.surf, NULL, 0);
       break;
    }
 
index 909da464dd275b9da825b64288b13c08d2ee2db5..954c7102b80410ab8dde5739670a4efaac84629e 100644 (file)
@@ -1829,13 +1829,28 @@ isl_surf_get_mcs_surf(const struct isl_device *dev,
 bool
 isl_surf_get_ccs_surf(const struct isl_device *dev,
                       const struct isl_surf *surf,
-                      struct isl_surf *ccs_surf,
+                      struct isl_surf *aux_surf,
+                      struct isl_surf *extra_aux_surf,
                       uint32_t row_pitch_B)
 {
-   if (surf->samples > 1)
+   assert(aux_surf);
+
+   /* An uninitialized surface is needed to get a CCS surface. */
+   if (aux_surf->size_B > 0 &&
+       (extra_aux_surf == NULL || extra_aux_surf->size_B > 0)) {
+      return false;
+   }
+
+   /* A surface can't have two CCS surfaces. */
+   if (aux_surf->usage & ISL_SURF_USAGE_CCS_BIT)
+      return false;
+
+   /* Only multisampled depth buffers with HiZ can have CCS. */
+   if (surf->samples > 1 && !(aux_surf->usage & ISL_SURF_USAGE_HIZ_BIT))
       return false;
 
-   assert(surf->msaa_layout == ISL_MSAA_LAYOUT_NONE);
+   assert(surf->msaa_layout == ISL_MSAA_LAYOUT_NONE ||
+          surf->msaa_layout == ISL_MSAA_LAYOUT_INTERLEAVED);
 
    /* CCS support does not exist prior to Gen7 */
    if (ISL_DEV_GEN(dev) <= 6)
@@ -1845,8 +1860,20 @@ isl_surf_get_ccs_surf(const struct isl_device *dev,
       return false;
 
    /* Callers don't yet support this configuration. */
-   if (isl_surf_usage_is_depth_or_stencil(surf->usage))
+   if (isl_surf_usage_is_stencil(surf->usage))
+      return false;
+
+   /* [TGL+] CCS can only be added to a non-D16-formatted depth buffer if it
+    * has HiZ. If not for GEN:BUG:1406512483 "deprecate compression enable
+    * states", D16 would be supported. Supporting D16 requires being able to
+    * specify that the control surface is present and simultaneously disabling
+    * compression. The above bug makes it so that it's not possible to specify
+    * this configuration.
+    */
+   if (isl_surf_usage_is_depth(surf->usage) && (aux_surf->size_B == 0 ||
+       ISL_DEV_GEN(dev) < 12 || surf->format == ISL_FORMAT_R16_UNORM)) {
       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
@@ -1966,6 +1993,8 @@ isl_surf_get_ccs_surf(const struct isl_device *dev,
       /* On Gen12, the CCS is a scaled-down version of the main surface. We
        * model this as the CCS compressing a 2D-view of the entire surface.
        */
+      struct isl_surf *ccs_surf =
+         aux_surf->size_B > 0 ? extra_aux_surf : aux_surf;
       const bool ok =
          isl_surf_init(dev, ccs_surf,
                        .dim = ISL_SURF_DIM_2D,
@@ -1982,7 +2011,7 @@ isl_surf_get_ccs_surf(const struct isl_device *dev,
       assert(!ok || ccs_surf->size_B == surf->size_B / 256);
       return ok;
    } else {
-      return isl_surf_init(dev, ccs_surf,
+      return isl_surf_init(dev, aux_surf,
                            .dim = surf->dim,
                            .format = ccs_format,
                            .width = surf->logical_level0_px.width,
index 2a840f48f72aac68dc0c129fe6e2854f01721e0a..d50f86f6892a645b6271b22b5e6e2bef0d883349 100644 (file)
@@ -1872,7 +1872,8 @@ isl_surf_get_mcs_surf(const struct isl_device *dev,
 bool
 isl_surf_get_ccs_surf(const struct isl_device *dev,
                       const struct isl_surf *surf,
-                      struct isl_surf *ccs_surf,
+                      struct isl_surf *aux_surf,
+                      struct isl_surf *extra_aux_surf,
                       uint32_t row_pitch_B /**< Ignored if 0 */);
 
 #define isl_surf_fill_state(dev, state, ...) \
index dc4d9724baa22f79914e652321d37dbb0668dd1b..c34cf209e75d1dbf4f2fc400ce411e805b38f417 100644 (file)
@@ -451,7 +451,8 @@ make_surface(const struct anv_device *dev,
          assert(image->planes[plane].aux_surface.isl.size_B == 0);
          ok = isl_surf_get_ccs_surf(&dev->isl_dev,
                                     &image->planes[plane].surface.isl,
-                                    &image->planes[plane].aux_surface.isl, 0);
+                                    &image->planes[plane].aux_surface.isl,
+                                    NULL, 0);
          if (ok) {
 
             /* Disable CCS when it is not useful (i.e., when you can't render
index f135125b58cc8f992830a509164056972b5a65e0..2fa9f7dfb814d11c75268cfd90dba7c3cfbabcda 100644 (file)
@@ -712,7 +712,7 @@ create_ccs_buf_for_image(struct brw_context *brw,
                          struct intel_mipmap_tree *mt,
                          enum isl_aux_state initial_state)
 {
-   struct isl_surf temp_ccs_surf;
+   struct isl_surf temp_ccs_surf = {0,};
 
    /* CCS is only supported for very simple miptrees */
    assert(image->aux_offset != 0 && image->aux_pitch != 0);
@@ -727,7 +727,7 @@ create_ccs_buf_for_image(struct brw_context *brw,
    /* We shouldn't already have a CCS */
    assert(!mt->aux_buf);
 
-   if (!isl_surf_get_ccs_surf(&brw->isl_dev, &mt->surf, &temp_ccs_surf,
+   if (!isl_surf_get_ccs_surf(&brw->isl_dev, &mt->surf, &temp_ccs_surf, NULL,
                               image->aux_pitch))
       return false;
 
@@ -1576,7 +1576,7 @@ intel_miptree_alloc_aux(struct brw_context *brw,
    /* Get the aux buf allocation parameters for this miptree. */
    enum isl_aux_state initial_state;
    uint8_t memset_value;
-   struct isl_surf aux_surf;
+   struct isl_surf aux_surf = {0,};
    bool aux_surf_ok = false;
 
    switch (mt->aux_usage) {
@@ -1624,7 +1624,7 @@ intel_miptree_alloc_aux(struct brw_context *brw,
       initial_state = ISL_AUX_STATE_PASS_THROUGH;
       memset_value = 0;
       aux_surf_ok =
-         isl_surf_get_ccs_surf(&brw->isl_dev, &mt->surf, &aux_surf, 0);
+         isl_surf_get_ccs_surf(&brw->isl_dev, &mt->surf, &aux_surf, NULL, 0);
       break;
 
    default:
index 45779b06195da9053f947f223801deb2a17a2b85..6040161d8f969ee34a9399ee4c9cb54d3658943b 100644 (file)
@@ -764,9 +764,9 @@ intel_create_image_common(__DRIscreen *dri_screen,
       return NULL;
    }
 
-   struct isl_surf aux_surf;
+   struct isl_surf aux_surf = {0,};
    if (mod_info->aux_usage == ISL_AUX_USAGE_CCS_E) {
-      ok = isl_surf_get_ccs_surf(&screen->isl_dev, &surf, &aux_surf, 0);
+      ok = isl_surf_get_ccs_surf(&screen->isl_dev, &surf, &aux_surf, NULL, 0);
       if (!ok) {
          free(image);
          return NULL;
@@ -1185,8 +1185,8 @@ intel_create_image_from_fds_common(__DRIscreen *dri_screen,
          return NULL;
       }
 
-      struct isl_surf aux_surf;
-      ok = isl_surf_get_ccs_surf(&screen->isl_dev, &surf, &aux_surf,
+      struct isl_surf aux_surf = {0,};
+      ok = isl_surf_get_ccs_surf(&screen->isl_dev, &surf, &aux_surf, NULL,
                                  image->aux_pitch);
       if (!ok) {
          brw_bo_unreference(image->bo);