Module: Mesa
Branch: main
Commit: 9bde89591e6cd531ed99d2952c6c10a7141d648f
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9bde89591e6cd531ed99d2952c6c10a7141d648f

Author: Ryan Neph <ryann...@google.com>
Date:   Wed Nov  8 12:20:48 2023 -0800

venus: add VN_PERF=no_tiled_wsi_image

Force DRM_FORMAT_MOD_LINEAR for wsi image creation, even for winsys that
supports non-linear modifiers.

Signed-off-by: Ryan Neph <ryann...@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26240>

---

 src/virtio/vulkan/vn_android.c         |  1 -
 src/virtio/vulkan/vn_common.c          |  1 +
 src/virtio/vulkan/vn_common.h          |  2 ++
 src/virtio/vulkan/vn_physical_device.c | 23 +++++++++++++++++++++++
 src/virtio/vulkan/vn_wsi.c             | 23 ++++++++++++++++++++---
 5 files changed, 46 insertions(+), 4 deletions(-)

diff --git a/src/virtio/vulkan/vn_android.c b/src/virtio/vulkan/vn_android.c
index ff945c63014..25cba04a0a0 100644
--- a/src/virtio/vulkan/vn_android.c
+++ b/src/virtio/vulkan/vn_android.c
@@ -16,7 +16,6 @@
 #include <vndk/hardware_buffer.h>
 #include <vulkan/vk_icd.h>
 
-#include "drm-uapi/drm_fourcc.h"
 #include "util/os_file.h"
 #include "vk_android.h"
 
diff --git a/src/virtio/vulkan/vn_common.c b/src/virtio/vulkan/vn_common.c
index 72101e71f3b..bae8a0cd2d5 100644
--- a/src/virtio/vulkan/vn_common.c
+++ b/src/virtio/vulkan/vn_common.c
@@ -50,6 +50,7 @@ static const struct debug_control vn_perf_options[] = {
    { "no_timeline_sem_feedback", VN_PERF_NO_TIMELINE_SEM_FEEDBACK },
    { "no_query_feedback", VN_PERF_NO_QUERY_FEEDBACK },
    { "no_async_mem_alloc", VN_PERF_NO_ASYNC_MEM_ALLOC },
+   { "no_tiled_wsi_image", VN_PERF_NO_TILED_WSI_IMAGE },
    { NULL, 0 },
    /* clang-format on */
 };
diff --git a/src/virtio/vulkan/vn_common.h b/src/virtio/vulkan/vn_common.h
index 8fe02f25e35..cc1ac3c415b 100644
--- a/src/virtio/vulkan/vn_common.h
+++ b/src/virtio/vulkan/vn_common.h
@@ -23,6 +23,7 @@
 #include <vulkan/vulkan.h>
 
 #include "c11/threads.h"
+#include "drm-uapi/drm_fourcc.h"
 #include "util/bitscan.h"
 #include "util/bitset.h"
 #include "util/compiler.h"
@@ -120,6 +121,7 @@ enum vn_perf {
    VN_PERF_NO_TIMELINE_SEM_FEEDBACK = 1ull << 7,
    VN_PERF_NO_QUERY_FEEDBACK = 1ull << 8,
    VN_PERF_NO_ASYNC_MEM_ALLOC = 1ull << 9,
+   VN_PERF_NO_TILED_WSI_IMAGE = 1ull << 10,
 };
 
 typedef uint64_t vn_object_id;
diff --git a/src/virtio/vulkan/vn_physical_device.c 
b/src/virtio/vulkan/vn_physical_device.c
index 6d554b995ec..ecd776724f9 100644
--- a/src/virtio/vulkan/vn_physical_device.c
+++ b/src/virtio/vulkan/vn_physical_device.c
@@ -2023,6 +2023,29 @@ vn_GetPhysicalDeviceImageFormatProperties2(
    const VkExternalMemoryHandleTypeFlags supported_handle_types =
       physical_dev->external_memory.supported_handle_types;
 
+   /* force common wsi into choosing DRM_FORMAT_MOD_LINEAR or else fall back
+    * to the legacy path, for which Venus also forces LINEAR for wsi images.
+    */
+   if (VN_PERF(NO_TILED_WSI_IMAGE)) {
+      const struct wsi_image_create_info *wsi_info = vk_find_struct_const(
+         pImageFormatInfo->pNext, WSI_IMAGE_CREATE_INFO_MESA);
+      const VkPhysicalDeviceImageDrmFormatModifierInfoEXT *modifier_info =
+         vk_find_struct_const(
+            pImageFormatInfo->pNext,
+            PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT);
+
+      if (wsi_info && modifier_info &&
+          modifier_info->drmFormatModifier != DRM_FORMAT_MOD_LINEAR) {
+         if (VN_DEBUG(WSI)) {
+            vn_log(physical_dev->instance,
+                   "rejecting non-linear wsi image format modifier %" PRIu64,
+                   modifier_info->drmFormatModifier);
+         }
+         return vn_error(physical_dev->instance,
+                         VK_ERROR_FORMAT_NOT_SUPPORTED);
+      }
+   }
+
    const VkPhysicalDeviceExternalImageFormatInfo *external_info =
       vk_find_struct_const(pImageFormatInfo->pNext,
                            PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO);
diff --git a/src/virtio/vulkan/vn_wsi.c b/src/virtio/vulkan/vn_wsi.c
index 8f61abec7d4..66ba7de8b69 100644
--- a/src/virtio/vulkan/vn_wsi.c
+++ b/src/virtio/vulkan/vn_wsi.c
@@ -10,7 +10,6 @@
 
 #include "vn_wsi.h"
 
-#include "drm-uapi/drm_fourcc.h"
 #include "vk_enum_to_str.h"
 #include "wsi_common_entrypoints.h"
 
@@ -133,8 +132,26 @@ vn_wsi_create_image(struct vn_device *dev,
       local_create_info.tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
       create_info = &local_create_info;
 
-      if (VN_DEBUG(WSI))
-         vn_log(dev->instance, "forcing scanout image linear");
+      if (VN_DEBUG(WSI)) {
+         vn_log(
+            dev->instance,
+            "forcing scanout image linear (no explicit modifier support)");
+      }
+   } else {
+      if (VN_PERF(NO_TILED_WSI_IMAGE)) {
+         const VkImageDrmFormatModifierListCreateInfoEXT *modifier_info =
+            vk_find_struct_const(
+               create_info->pNext,
+               IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT);
+         assert(modifier_info);
+         assert(modifier_info->drmFormatModifierCount == 1 &&
+                modifier_info->pDrmFormatModifiers[0] ==
+                   DRM_FORMAT_MOD_LINEAR);
+         if (VN_DEBUG(WSI)) {
+            vn_log(dev->instance,
+                   "forcing scanout image linear (given no_tiled_wsi_image)");
+         }
+      }
    }
 
    struct vn_image *img;

Reply via email to