From aa8fec638f5e2731e88b9463c67aac7c34bae800 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Wed, 5 Mar 2025 16:01:08 +0100 Subject: [PATCH] panvk: add basic driconf infrastructure This hooks up some driconfs for WSI, as well as the force_vk_vendor DRIconf. Nothing panvk specific for now. Reviewed-by: Benjamin Lee Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/vulkan/panvk_instance.c | 32 +++++++++++++++++++++ src/panfrost/vulkan/panvk_instance.h | 5 ++++ src/panfrost/vulkan/panvk_physical_device.c | 3 +- src/panfrost/vulkan/panvk_wsi.c | 3 +- 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/panfrost/vulkan/panvk_instance.c b/src/panfrost/vulkan/panvk_instance.c index 100342d7cd8..888b1620783 100644 --- a/src/panfrost/vulkan/panvk_instance.c +++ b/src/panfrost/vulkan/panvk_instance.c @@ -10,6 +10,7 @@ */ #include "util/build_id.h" +#include "util/driconf.h" #include "util/mesa-sha1.h" #include "vk_alloc.h" @@ -146,6 +147,35 @@ panvk_kmod_free(const struct pan_kmod_allocator *allocator, void *data) return vk_free(vkalloc, data); } +static const driOptionDescription panvk_dri_options[] = { + DRI_CONF_SECTION_PERFORMANCE + DRI_CONF_ADAPTIVE_SYNC(true) + DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0) + DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(false) + DRI_CONF_VK_X11_ENSURE_MIN_IMAGE_COUNT(false) + DRI_CONF_VK_KHR_PRESENT_WAIT(false) + DRI_CONF_VK_XWAYLAND_WAIT_READY(false) + DRI_CONF_SECTION_END + + DRI_CONF_SECTION_DEBUG + DRI_CONF_FORCE_VK_VENDOR() + DRI_CONF_VK_WSI_FORCE_SWAPCHAIN_TO_CURRENT_EXTENT(false) + DRI_CONF_VK_X11_IGNORE_SUBOPTIMAL(false) + DRI_CONF_SECTION_END +}; + +static void +panvk_init_dri_options(struct panvk_instance *instance) +{ + driParseOptionInfo(&instance->available_dri_options, panvk_dri_options, ARRAY_SIZE(panvk_dri_options)); + driParseConfigFiles(&instance->dri_options, &instance->available_dri_options, 0, "panvk", NULL, NULL, + instance->vk.app_info.app_name, instance->vk.app_info.app_version, + instance->vk.app_info.engine_name, instance->vk.app_info.engine_version); + + instance->force_vk_vendor = + driQueryOptioni(&instance->dri_options, "force_vk_vendor"); +} + VKAPI_ATTR VkResult VKAPI_CALL panvk_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, @@ -188,6 +218,8 @@ panvk_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, return panvk_error(NULL, result); } + panvk_init_dri_options(instance); + instance->kmod.allocator = (struct pan_kmod_allocator){ .zalloc = panvk_kmod_zalloc, .free = panvk_kmod_free, diff --git a/src/panfrost/vulkan/panvk_instance.h b/src/panfrost/vulkan/panvk_instance.h index b72166ac11e..1af956abf9f 100644 --- a/src/panfrost/vulkan/panvk_instance.h +++ b/src/panfrost/vulkan/panvk_instance.h @@ -9,6 +9,7 @@ #include #include "vk_instance.h" +#include "util/xmlconfig.h" #include "lib/kmod/pan_kmod.h" @@ -41,7 +42,11 @@ struct panvk_instance { enum panvk_debug_flags debug_flags; + struct driOptionCache dri_options; + struct driOptionCache available_dri_options; + uint8_t driver_build_sha[20]; + uint32_t force_vk_vendor; struct { struct pan_kmod_allocator allocator; diff --git a/src/panfrost/vulkan/panvk_physical_device.c b/src/panfrost/vulkan/panvk_physical_device.c index 4aeef693007..1bbcd55721e 100644 --- a/src/panfrost/vulkan/panvk_physical_device.c +++ b/src/panfrost/vulkan/panvk_physical_device.c @@ -508,7 +508,8 @@ get_device_properties(const struct panvk_instance *instance, *properties = (struct vk_properties){ .apiVersion = get_api_version(arch), .driverVersion = vk_get_driver_version(), - .vendorID = ARM_VENDOR_ID, + .vendorID = instance->force_vk_vendor ? instance->force_vk_vendor : + ARM_VENDOR_ID, /* Collect arch_major, arch_minor, arch_rev and product_major, * as done by the Arm driver. diff --git a/src/panfrost/vulkan/panvk_wsi.c b/src/panfrost/vulkan/panvk_wsi.c index c041b5b2107..a3f1073bdb3 100644 --- a/src/panfrost/vulkan/panvk_wsi.c +++ b/src/panfrost/vulkan/panvk_wsi.c @@ -50,7 +50,8 @@ panvk_wsi_init(struct panvk_physical_device *physical_device) result = wsi_device_init(&physical_device->wsi_device, panvk_physical_device_to_handle(physical_device), - panvk_wsi_proc_addr, &instance->vk.alloc, -1, NULL, + panvk_wsi_proc_addr, &instance->vk.alloc, -1, + &instance->dri_options, &(struct wsi_device_options){.sw_device = false}); if (result != VK_SUCCESS) return result;