mesa/0002-zink-use-device-select-layer-settings-to-disable-dev.patch
2026-05-19 20:03:52 -04:00

107 lines
4.2 KiB
Diff

From 30c754624ab73b180c66658701814ec5e3d12a31 Mon Sep 17 00:00:00 2001
From: Dave Airlie <airlied@redhat.com>
Date: Wed, 5 Nov 2025 11:02:26 +1000
Subject: [PATCH 2/2] zink: use device select layer settings to disable device
selection
In the case where we have a device that we want to choose after
probing, there is no point in asking the device select layer to do
any reordering at all.
This helps avoid a deadlock inside compositors where we don't need
device selection anyways.
---
src/gallium/drivers/zink/zink_instance.py | 18 ++++++++++++++++++
src/gallium/drivers/zink/zink_screen.c | 9 ++++++++-
2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/src/gallium/drivers/zink/zink_instance.py b/src/gallium/drivers/zink/zink_instance.py
index 1ab36bee2ca..c0e813be164 100644
--- a/src/gallium/drivers/zink/zink_instance.py
+++ b/src/gallium/drivers/zink/zink_instance.py
@@ -37,6 +37,7 @@ import platform
# - nonstandard: Disables validation (cross-checking with vk.xml) if True.
EXTENSIONS = [
Extension("VK_EXT_debug_utils"),
+ Extension("VK_EXT_layer_settings"),
Extension("VK_KHR_get_physical_device_properties2"),
Extension("VK_KHR_external_memory_capabilities"),
Extension("VK_KHR_external_semaphore_capabilities"),
@@ -62,8 +63,10 @@ LAYERS = [
conditions=["zink_debug & ZINK_DEBUG_VALIDATION"]),
Layer("VK_LAYER_LUNARG_standard_validation",
conditions=["zink_debug & ZINK_DEBUG_VALIDATION", "!have_layer_KHRONOS_validation"]),
+ Layer("VK_LAYER_MESA_device_select")
]
+
REPLACEMENTS = {
"VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES2_EXTENSION_NAME" : "VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME"
}
@@ -87,6 +90,7 @@ struct zink_screen;
struct zink_instance_info {
uint32_t loader_version;
+ bool no_device_select;
%for ext in extensions:
bool have_${ext.name_with_vendor()};
@@ -261,6 +265,20 @@ zink_create_instance(struct zink_screen *screen, struct zink_instance_info *inst
ici.ppEnabledLayerNames = layers;
ici.enabledLayerCount = num_layers;
+ VkLayerSettingEXT ds_layer = {0};
+ VkLayerSettingsCreateInfoEXT lsci = {0};
+ uint32_t no_device_select_value = instance_info->no_device_select;
+ if (have_EXT_layer_settings && have_layer_MESA_device_select) {
+ ds_layer.pLayerName = "MESA_device_select";
+ ds_layer.pSettingName = "no_device_select";
+ ds_layer.type = VK_LAYER_SETTING_TYPE_BOOL32_EXT;
+ ds_layer.valueCount = 1;
+ ds_layer.pValues = &no_device_select_value;
+ lsci.sType = VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT;
+ lsci.settingCount = 1;
+ lsci.pSettings = &ds_layer;
+ ici.pNext = &lsci;
+ }
GET_PROC_ADDR_INSTANCE_LOCAL(screen, NULL, CreateInstance);
assert(vk_CreateInstance);
diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c
index 7ec86d0090a..34eee2ba113 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -1576,6 +1576,12 @@ zink_destroy_screen(struct pipe_screen *pscreen)
glsl_type_singleton_decref();
}
+static bool
+zink_picks_device(int dev_major, uint64_t adapter_luid)
+{
+ return (dev_major > 0 && dev_major < 255) || adapter_luid;
+}
+
static int
zink_get_display_device(const struct zink_screen *screen, uint32_t pdev_count,
const VkPhysicalDevice *pdevs, int64_t dev_major,
@@ -1647,7 +1653,7 @@ choose_pdev(struct zink_screen *screen, int64_t dev_major, int64_t dev_minor, ui
bool cpu = debug_get_bool_option("LIBGL_ALWAYS_SOFTWARE", false) ||
debug_get_bool_option("D3D_ALWAYS_SOFTWARE", false);
- if (cpu || (dev_major > 0 && dev_major < 255) || adapter_luid) {
+ if (cpu || zink_picks_device(dev_major, adapter_luid)) {
uint32_t pdev_count;
int idx;
VkPhysicalDevice *pdevs;
@@ -3309,6 +3315,7 @@ zink_internal_create_screen(const struct pipe_screen_config *config, int64_t dev
simple_mtx_lock(&instance_lock);
if (++instance_refcount == 1) {
instance_info.loader_version = zink_get_loader_version(screen);
+ instance_info.no_device_select = zink_picks_device(dev_major, adapter_luid);
instance = zink_create_instance(screen, &instance_info);
}
if (!instance) {
--
2.51.1