iris: Enable HIZ_CCS sampling
[mesa.git] / src / gallium / drivers / iris / iris_resource.c
index 554ebb7961b5ba4e9be6b7fe0202f312fc976583..ecf63f49ade3e5f49366adbefa36069dae17edcd 100644 (file)
@@ -478,7 +478,8 @@ iris_resource_configure_aux(struct iris_screen *screen,
    } else if (has_mcs) {
       res->aux.possible_usages |= 1 << ISL_AUX_USAGE_MCS;
    } else if (has_hiz) {
-      res->aux.possible_usages |= 1 << ISL_AUX_USAGE_HIZ;
+      res->aux.possible_usages |=
+         1 << (has_ccs ? ISL_AUX_USAGE_HIZ_CCS : ISL_AUX_USAGE_HIZ);
    } else if (has_ccs) {
       if (want_ccs_e_for_format(devinfo, res->surf.format))
          res->aux.possible_usages |= 1 << ISL_AUX_USAGE_CCS_E;
@@ -497,6 +498,12 @@ iris_resource_configure_aux(struct iris_screen *screen,
    if (!devinfo->has_sample_with_hiz || res->surf.samples > 1)
       res->aux.sampler_usages &= ~(1 << ISL_AUX_USAGE_HIZ);
 
+   /* We don't always support sampling with HIZ_CCS. But when we do, treat it
+    * as CCS_E.*/
+   res->aux.sampler_usages &= ~(1 << ISL_AUX_USAGE_HIZ_CCS);
+   if (isl_surf_supports_hiz_ccs_wt(devinfo, &res->surf, res->aux.usage))
+      res->aux.sampler_usages |= 1 << ISL_AUX_USAGE_CCS_E;
+
    enum isl_aux_state initial_state;
    *aux_size_B = 0;
    *alloc_flags = 0;
@@ -507,6 +514,7 @@ iris_resource_configure_aux(struct iris_screen *screen,
       /* Having no aux buffer is only okay if there's no modifier with aux. */
       return !res->mod_info || res->mod_info->aux_usage == ISL_AUX_USAGE_NONE;
    case ISL_AUX_USAGE_HIZ:
+   case ISL_AUX_USAGE_HIZ_CCS:
       initial_state = ISL_AUX_STATE_AUX_INVALID;
       break;
    case ISL_AUX_USAGE_MCS:
@@ -571,7 +579,7 @@ iris_resource_configure_aux(struct iris_screen *screen,
    size += iris_get_aux_clear_color_state_size(screen);
    *aux_size_B = size;
 
-   if (res->aux.usage == ISL_AUX_USAGE_HIZ) {
+   if (isl_aux_usage_has_hiz(res->aux.usage)) {
       for (unsigned level = 0; level < res->surf.levels; ++level) {
          uint32_t width = u_minify(res->surf.phys_level0_sa.width, level);
          uint32_t height = u_minify(res->surf.phys_level0_sa.height, level);