anv/image: Implement the wsi "extension"
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 16 Nov 2017 06:11:46 +0000 (22:11 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 4 Dec 2017 18:04:19 +0000 (10:04 -0800)
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Chad Versace <chadversary@chromium.org>
src/intel/vulkan/anv_device.c
src/intel/vulkan/anv_image.c

index fc5554e..258668f 100644 (file)
@@ -1653,8 +1653,17 @@ VkResult anv_AllocateMemory(
    if (pdevice->memory.heaps[mem->type->heapIndex].supports_48bit_addresses)
       mem->bo->flags |= EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
 
-   if (pdevice->has_exec_async)
+   const struct wsi_memory_allocate_info *wsi_info =
+      vk_find_struct_const(pAllocateInfo->pNext, WSI_MEMORY_ALLOCATE_INFO_MESA);
+   if (wsi_info && wsi_info->implicit_sync) {
+      /* We need to set the WRITE flag on window system buffers so that GEM
+       * will know we're writing to them and synchronize uses on other rings
+       * (eg if the display server uses the blitter ring).
+       */
+      mem->bo->flags |= EXEC_OBJECT_WRITE;
+   } else if (pdevice->has_exec_async) {
       mem->bo->flags |= EXEC_OBJECT_ASYNC;
+   }
 
    *pMem = anv_device_memory_to_handle(mem);
 
index 5c63d67..4d13e05 100644 (file)
@@ -92,7 +92,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)
+choose_isl_tiling_flags(const struct anv_image_create_info *anv_info,
+                        const struct isl_drm_modifier_info *isl_mod_info)
 {
    const VkImageCreateInfo *base_info = anv_info->vk_info;
    isl_tiling_flags_t flags = 0;
@@ -111,6 +112,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 (isl_mod_info)
+      flags &= 1 << isl_mod_info->tiling;
+
    assert(flags);
 
    return flags;
@@ -493,6 +497,19 @@ 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,
@@ -501,11 +518,17 @@ anv_image_create(VkDevice _device,
 {
    ANV_FROM_HANDLE(anv_device, device, _device);
    const VkImageCreateInfo *pCreateInfo = create_info->vk_info;
+   const struct isl_drm_modifier_info *isl_mod_info = NULL;
    struct anv_image *image = NULL;
    VkResult r;
 
    assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO);
 
+   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);
    anv_assert(pCreateInfo->samples > 0);
@@ -528,14 +551,15 @@ anv_image_create(VkDevice _device,
    image->samples = pCreateInfo->samples;
    image->usage = pCreateInfo->usage;
    image->tiling = pCreateInfo->tiling;
-   image->drm_format_mod = DRM_FORMAT_MOD_INVALID;
    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;
 
    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);
+      choose_isl_tiling_flags(create_info, isl_mod_info);
 
    image->n_planes = format->n_planes;