anv: Add WSI support for the I915_FORMAT_MOD_Y_TILED_CCS
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 13 Feb 2018 22:26:05 +0000 (14:26 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 6 Apr 2018 04:17:02 +0000 (21:17 -0700)
v2 (Jason Ekstrand):
 - Return the correct enum values from anv_layout_to_fast_clear_type

v3 (Jason Ekstrand):
 - Always return ANV_FAST_CLEAR_NONE and leave doing the right thing for
   the patch which adds a modifier which supports fast-clears.

Reviewed-by: Daniel Stone <daniels@collabora.com>
Tested-by: Daniel Stone <daniels@collabora.com>
Acked-by: Nanley Chery <nanley.g.chery@intel.com>
src/intel/vulkan/anv_formats.c
src/intel/vulkan/anv_image.c

index 085706402c1706cbb71f2344e76c410364d19c56..3b821f10bdb086db089c73aa73446be029646f06 100644 (file)
@@ -671,9 +671,18 @@ get_wsi_format_modifier_properties_list(const struct anv_physical_device *physic
       DRM_FORMAT_MOD_LINEAR,
       I915_FORMAT_MOD_X_TILED,
       I915_FORMAT_MOD_Y_TILED,
+      I915_FORMAT_MOD_Y_TILED_CCS,
    };
 
    for (uint32_t i = 0; i < ARRAY_SIZE(modifiers); i++) {
+      const struct isl_drm_modifier_info *mod_info =
+         isl_drm_modifier_get_info(modifiers[i]);
+
+      if (mod_info->aux_usage == ISL_AUX_USAGE_CCS_E &&
+          !isl_format_supports_ccs_e(&physical_device->info,
+                                     anv_format->planes[0].isl_format))
+         continue;
+
       vk_outarray_append(&out, mod_props) {
          mod_props->modifier = modifiers[i];
          if (isl_drm_modifier_has_aux(modifiers[i]))
index a941559eb3abb181e23b5fc76a95cc97a504f1aa..42496b6414c457c74f93730710090f02e92fdce7 100644 (file)
@@ -519,6 +519,7 @@ score_drm_format_mod(uint64_t modifier)
    case DRM_FORMAT_MOD_LINEAR: return 1;
    case I915_FORMAT_MOD_X_TILED: return 2;
    case I915_FORMAT_MOD_Y_TILED: return 3;
+   case I915_FORMAT_MOD_Y_TILED_CCS: return 4;
    default: unreachable("bad DRM format modifier");
    }
 }
@@ -750,8 +751,14 @@ void anv_GetImageSubresourceLayout(
     VkSubresourceLayout*                        layout)
 {
    ANV_FROM_HANDLE(anv_image, image, _image);
-   const struct anv_surface *surface =
-      get_surface(image, subresource->aspectMask);
+
+   const struct anv_surface *surface;
+   if (subresource->aspectMask == VK_IMAGE_ASPECT_PLANE_1_BIT_KHR &&
+       image->drm_format_mod != DRM_FORMAT_MOD_INVALID &&
+       isl_drm_modifier_has_aux(image->drm_format_mod))
+      surface = &image->planes[0].aux_surface;
+   else
+      surface = get_surface(image, subresource->aspectMask);
 
    assert(__builtin_popcount(subresource->aspectMask) == 1);
 
@@ -866,25 +873,20 @@ anv_layout_to_aux_usage(const struct gen_device_info * const devinfo,
       }
 
 
-   case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
+   case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR: {
       assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
 
-      /* On SKL+, the render buffer can be decompressed by the presentation
-       * engine. Support for this feature has not yet landed in the wider
-       * ecosystem. TODO: Update this code when support lands.
-       *
-       * From the BDW PRM, Vol 7, Render Target Resolve:
-       *
-       *    If the MCS is enabled on a non-multisampled render target, the
-       *    render target must be resolved before being used for other
-       *    purposes (display, texture, CPU lock) The clear value from
-       *    SURFACE_STATE is written into pixels in the render target
-       *    indicated as clear in the MCS.
-       *
-       * Pre-SKL, the render buffer must be resolved before being used for
-       * presentation. We can infer that the auxiliary buffer is not used.
+      /* When handing the image off to the presentation engine, we need to
+       * ensure that things are properly resolved.  For images with no
+       * modifier, we assume that they follow the old rules and always need
+       * a full resolve because the PE doesn't understand any form of
+       * compression.  For images with modifiers, we use the aux usage from
+       * the modifier.
        */
-      return ISL_AUX_USAGE_NONE;
+      const struct isl_drm_modifier_info *mod_info =
+         isl_drm_modifier_get_info(image->drm_format_mod);
+      return mod_info ? mod_info->aux_usage : ISL_AUX_USAGE_NONE;
+   }
 
 
    /* Rendering Layouts */
@@ -966,8 +968,18 @@ anv_layout_to_fast_clear_type(const struct gen_device_info * const devinfo,
    case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
       return ANV_FAST_CLEAR_ANY;
 
-   case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
+   case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR: {
+      assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
+#ifndef NDEBUG
+      /* We do not yet support any modifiers which support clear color so we
+       * just always return NONE.  One day, this will change.
+       */
+      const struct isl_drm_modifier_info *mod_info =
+         isl_drm_modifier_get_info(image->drm_format_mod);
+      assert(!mod_info || !mod_info->supports_clear_color);
+#endif
       return ANV_FAST_CLEAR_NONE;
+   }
 
    default:
       /* If the image has MCS or CCS_E enabled all the time then we can use