vulkan-renderer: Add query to populate shm formats

Remove the limited shm formats hardcoded list and add a query to
populate them according to the device.

Signed-off-by: Erico Nunes <nunes.erico@gmail.com>
This commit is contained in:
Erico Nunes 2025-08-19 13:56:28 +02:00 committed by Daniel Stone
parent 9341192f51
commit f42ccf2140
3 changed files with 58 additions and 5 deletions

View file

@ -217,3 +217,27 @@ vulkan_renderer_query_dmabuf_format(struct vulkan_renderer *vr, const struct pix
return true;
}
static const VkFormatFeatureFlags format_shm_tex_features =
VK_FORMAT_FEATURE_TRANSFER_SRC_BIT |
VK_FORMAT_FEATURE_TRANSFER_DST_BIT |
VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
bool
vulkan_renderer_query_shm_format(struct vulkan_renderer *vr, const struct pixel_format_info *format)
{
assert(vulkan_instance_has(vr, EXTENSION_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2));
VkFormatProperties2 format_props = {
.sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,
};
vkGetPhysicalDeviceFormatProperties2(vr->phys_dev, format->vulkan_format, &format_props);
if ((format_props.formatProperties.optimalTilingFeatures & format_shm_tex_features) != format_shm_tex_features)
return false;
return true;
}

View file

@ -245,4 +245,8 @@ bool
vulkan_renderer_query_dmabuf_format(struct vulkan_renderer *vr,
const struct pixel_format_info *format);
bool
vulkan_renderer_query_shm_format(struct vulkan_renderer *vr,
const struct pixel_format_info *format);
#endif /* VULKAN_RENDERER_INTERNAL_H */

View file

@ -4162,6 +4162,34 @@ open_drm_device_node(struct vulkan_renderer *vr)
return drm_fd;
}
static int
populate_supported_shm_formats(struct weston_compositor *ec)
{
struct vulkan_renderer *vr = get_renderer(ec);
for (unsigned int i = 0; i < pixel_format_get_info_count(); i++) {
const struct pixel_format_info *info = pixel_format_get_info_by_index(i);
/* libwayland registers XRGB8888 and ARGB8888 by default. */
if (info->format == WL_SHM_FORMAT_XRGB8888 ||
info->format == WL_SHM_FORMAT_ARGB8888)
continue;
if (info->hide_from_clients)
continue;
if (info->vulkan_format == VK_FORMAT_UNDEFINED)
continue;
if (!vulkan_renderer_query_shm_format(vr, info))
continue;
wl_display_add_shm_format(ec->wl_display, info->format);
}
return 0;
}
/*
* Add extension flags to the bitfield that 'flags_out' points to.
* 'table' stores extension names and flags to check for and 'avail'
@ -4404,11 +4432,6 @@ vulkan_renderer_display_create(struct weston_compositor *ec,
wl_list_init(&vr->dmabuf_formats);
wl_signal_init(&vr->destroy_signal);
// TODO: probe and register remaining shm formats
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_XRGB8888);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_ARGB8888);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_ABGR2101010);
vulkan_renderer_create_instance(vr);
vulkan_renderer_choose_physical_device(vr);
@ -4433,6 +4456,8 @@ vulkan_renderer_display_create(struct weston_compositor *ec,
yesno(vulkan_device_has(vr, ext->flag)));
}
populate_supported_shm_formats(ec);
vr->drm_fd = -1;
if (vulkan_device_has(vr, EXTENSION_EXT_PHYSICAL_DEVICE_DRM))
vr->drm_fd = open_drm_device_node(vr);