anv/image: Separate modifiers from legacy scanout
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 25 Jan 2018 03:47:14 +0000 (19:47 -0800)
committerDaniel Stone <daniels@collabora.com>
Wed, 21 Feb 2018 22:37:10 +0000 (22:37 +0000)
For a bit there, we had a bug in i965 where it ignored the tiling of the
modifier and used the one from the BO instead.  At one point, we though
this was best fixed by setting a tiling from Vulkan.  However, we've
decided that i965 was just doing the wrong thing and have fixed it as of
50485723523d2948a44570ba110f02f726f86a54.

The old assumptions also affected the solution we used for legacy
scanout in Vulkan.  Instead of treating it specially, we just treated it
like a modifier like we do in GL.  This commit goes back to making it
it's own thing so that it's clear in the driver when we're using
modifiers and when we're using legacy paths.

v2 (Jason Ekstrand):
 - Rename legacy_scanout to needs_set_tiling

Reviewed-by: Daniel Stone <daniels@collabora.com>
src/intel/vulkan/anv_device.c
src/intel/vulkan/anv_image.c
src/intel/vulkan/anv_private.h

index 00b0b6533335721f7e43b813aa25ad1ec806e41a..a83b7a39f6af5ee5e2ec66284b4d92b1ea56d3ff 100644 (file)
@@ -1835,21 +1835,10 @@ VkResult anv_AllocateMemory(
       if (dedicated_info && dedicated_info->image != VK_NULL_HANDLE) {
          ANV_FROM_HANDLE(anv_image, image, dedicated_info->image);
 
-         /* For images using modifiers, we require a dedicated allocation
-          * and we set the BO tiling to match the tiling of the underlying
-          * modifier.  This is a bit unfortunate as this is completely
-          * pointless for Vulkan.  However, GL needs to be able to map things
-          * so it needs the tiling to be set.  The only way to do this in a
-          * non-racy way is to set the tiling in the creator of the BO so that
-          * makes it our job.
-          *
-          * One of these days, once the GL driver learns to not map things
-          * through the GTT in random places, we can drop this and start
-          * allowing multiple modified images in the same BO.
+         /* Some legacy (non-modifiers) consumers need the tiling to be set on
+          * the BO.  In this case, we have a dedicated allocation.
           */
-         if (image->drm_format_mod != DRM_FORMAT_MOD_INVALID) {
-            assert(isl_drm_modifier_get_info(image->drm_format_mod)->tiling ==
-                   image->planes[0].surface.isl.tiling);
+         if (image->needs_set_tiling) {
             const uint32_t i915_tiling =
                isl_tiling_to_i915_tiling(image->planes[0].surface.isl.tiling);
             int ret = anv_gem_set_tiling(device, mem->bo->gem_handle,
@@ -2217,8 +2206,9 @@ void anv_GetImageMemoryRequirements2KHR(
       switch (ext->sType) {
       case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR: {
          VkMemoryDedicatedRequirementsKHR *requirements = (void *)ext;
-         if (image->drm_format_mod != DRM_FORMAT_MOD_INVALID) {
-            /* Require a dedicated allocation for images with modifiers.
+         if (image->needs_set_tiling) {
+            /* If we need to set the tiling for external consumers, we need a
+             * dedicated allocation.
              *
              * See also anv_AllocateMemory.
              */
index a297cc47320d614cbd092b2c72bc509907bdca5c..c3d1810cee80ea670a500012f4c5cb24cfe8c4cc 100644 (file)
@@ -93,7 +93,8 @@ choose_isl_surf_usage(VkImageCreateFlags vk_create_flags,
 
 static isl_tiling_flags_t
 choose_isl_tiling_flags(const struct anv_image_create_info *anv_info,
-                        const struct isl_drm_modifier_info *isl_mod_info)
+                        const struct isl_drm_modifier_info *isl_mod_info,
+                        bool legacy_scanout)
 {
    const VkImageCreateInfo *base_info = anv_info->vk_info;
    isl_tiling_flags_t flags = 0;
@@ -112,6 +113,9 @@ choose_isl_tiling_flags(const struct anv_image_create_info *anv_info,
    if (anv_info->isl_tiling_flags)
       flags &= anv_info->isl_tiling_flags;
 
+   if (legacy_scanout)
+      flags &= ISL_TILING_LINEAR_BIT | ISL_TILING_X_BIT;
+
    if (isl_mod_info)
       flags &= 1 << isl_mod_info->tiling;
 
@@ -504,19 +508,6 @@ make_surface(const struct anv_device *dev,
    return VK_SUCCESS;
 }
 
-static const struct isl_drm_modifier_info *
-get_legacy_scanout_drm_format_mod(VkImageTiling tiling)
-{
-   switch (tiling) {
-   case VK_IMAGE_TILING_OPTIMAL:
-      return isl_drm_modifier_get_info(I915_FORMAT_MOD_X_TILED);
-   case VK_IMAGE_TILING_LINEAR:
-      return isl_drm_modifier_get_info(DRM_FORMAT_MOD_LINEAR);
-   default:
-      unreachable("bad VkImageTiling");
-   }
-}
-
 VkResult
 anv_image_create(VkDevice _device,
                  const struct anv_image_create_info *create_info,
@@ -533,8 +524,6 @@ anv_image_create(VkDevice _device,
 
    const struct wsi_image_create_info *wsi_info =
       vk_find_struct_const(pCreateInfo->pNext, WSI_IMAGE_CREATE_INFO_MESA);
-   if (wsi_info && wsi_info->scanout)
-      isl_mod_info = get_legacy_scanout_drm_format_mod(pCreateInfo->tiling);
 
    anv_assert(pCreateInfo->mipLevels > 0);
    anv_assert(pCreateInfo->arrayLayers > 0);
@@ -559,14 +548,14 @@ anv_image_create(VkDevice _device,
    image->usage = pCreateInfo->usage;
    image->tiling = pCreateInfo->tiling;
    image->disjoint = pCreateInfo->flags & VK_IMAGE_CREATE_DISJOINT_BIT_KHR;
-   image->drm_format_mod = isl_mod_info ? isl_mod_info->modifier :
-                                          DRM_FORMAT_MOD_INVALID;
+   image->needs_set_tiling = wsi_info && wsi_info->scanout;
 
    const struct anv_format *format = anv_get_format(image->vk_format);
    assert(format != NULL);
 
    const isl_tiling_flags_t isl_tiling_flags =
-      choose_isl_tiling_flags(create_info, isl_mod_info);
+      choose_isl_tiling_flags(create_info, isl_mod_info,
+                              image->needs_set_tiling);
 
    image->n_planes = format->n_planes;
 
index 37e63f56aa0a8f9eda2e2c2a3f1a4b0449b79874..3d5259794bc6e5a8bc9e8c1a1b465a0cd3b89ecb 100644 (file)
@@ -2403,10 +2403,14 @@ struct anv_image {
    VkImageUsageFlags usage; /**< Superset of VkImageCreateInfo::usage. */
    VkImageTiling tiling; /** VkImageCreateInfo::tiling */
 
-   /**
-    * DRM format modifier for this image or DRM_FORMAT_MOD_INVALID.
+   /** True if this is needs to be bound to an appropriately tiled BO.
+    *
+    * When not using modifiers, consumers such as X11, Wayland, and KMS need
+    * the tiling passed via I915_GEM_SET_TILING.  When exporting these buffers
+    * we require a dedicated allocation so that we can know to allocate a
+    * tiled buffer.
     */
-   uint64_t drm_format_mod;
+   bool needs_set_tiling;
 
    VkDeviceSize size;
    uint32_t alignment;