From a0b8ee614df13c2dab1cbf6e7d8376acb8e339d9 Mon Sep 17 00:00:00 2001 From: Jose Maria Casanova Crespo Date: Tue, 11 Nov 2025 13:45:31 +0100 Subject: [PATCH] v3dv: only apply simulator stride alignment for from_wsi images This adds from_wsi field to v3dv_image, so we can apply simulator stride alignment only to WSI images. Handling VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA at v3dv_GetPhysicalDeviceFormatProperties2 also removes debug warnings like: MESA: debug: v3dv_GetPhysicalDeviceImageFormatProperties2: ignored VkStructureType Unknown VkStructureType value.(1000001002) Fixes: 562bb8b62b3 ("v3dv: align width to 256 when using simulator") Reviewed-by: Iago Toral Quiroga Part-of: --- src/broadcom/vulkan/v3dv_formats.c | 5 ++++- src/broadcom/vulkan/v3dv_image.c | 7 +++++-- src/broadcom/vulkan/v3dv_private.h | 4 ++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_formats.c b/src/broadcom/vulkan/v3dv_formats.c index 6c0589a9020..0234d4fa918 100644 --- a/src/broadcom/vulkan/v3dv_formats.c +++ b/src/broadcom/vulkan/v3dv_formats.c @@ -678,7 +678,7 @@ v3dv_GetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice, /* Extract input structs */ vk_foreach_struct_const(s, base_info->pNext) { - switch (s->sType) { + switch ((unsigned)s->sType) { case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: external_info = (const void *) s; break; @@ -698,6 +698,9 @@ v3dv_GetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice, assert("Unknown DRM format modifier"); } break; + case VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA: + /* Do nothing, v3dv_image_init will handle it */; + break; default: vk_debug_ignored_stype(s->sType); break; diff --git a/src/broadcom/vulkan/v3dv_image.c b/src/broadcom/vulkan/v3dv_image.c index 21cfbe0e5d9..7b777bc78ea 100644 --- a/src/broadcom/vulkan/v3dv_image.c +++ b/src/broadcom/vulkan/v3dv_image.c @@ -246,8 +246,7 @@ v3d_setup_plane_slices(struct v3dv_device *device, struct v3dv_image *image, /* Ensure stride alignment matches the one required by the GPU that * drives the display. */ - if (!image->tiled && - image->vk.image_type == VK_IMAGE_TYPE_2D) { + if (image->from_wsi) { slice->stride = align(slice->stride, v3d_simulator_get_raster_stride_align(device->pdevice->render_fd)); @@ -437,6 +436,10 @@ v3dv_image_init(struct v3dv_device *device, modifier = eci.drmFormatModifier; } + const struct wsi_image_create_info *wsi_info = + vk_find_struct_const(pCreateInfo->pNext, WSI_IMAGE_CREATE_INFO_MESA); + image->from_wsi = wsi_info != NULL; + if (tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) { mod_info = vk_find_struct_const(pCreateInfo->pNext, diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index f8bfb2c528b..78c019ad12b 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -746,6 +746,10 @@ struct v3dv_image { * This holds a tiled copy of the image we can use for that purpose. */ struct v3dv_image *shadow; + + /* Image is a WSI image. + */ + bool from_wsi; }; VkResult