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;