107 lines
4.2 KiB
Diff
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
|
|
|