util: pass a struct to driParseConfigFiles()

It would be easier to add more functionalities like shader hashes etc.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41657>
This commit is contained in:
Samuel Pitoiset 2026-05-18 18:28:28 +02:00 committed by Marge Bot
parent 180d8cb544
commit 54b71e9e77
29 changed files with 171 additions and 110 deletions

View file

@ -329,9 +329,14 @@ radv_init_dri_options(struct radv_instance *instance)
struct radv_drirc *drirc = &instance->drirc;
driParseOptionInfo(&drirc->available_options, radv_dri_options, ARRAY_SIZE(radv_dri_options));
driParseConfigFiles(&drirc->options, &drirc->available_options, 0, "radv", 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);
driParseConfigFiles(&drirc->options, &drirc->available_options,
&(driConfigFileParseParams){
.driverName = "radv",
.applicationName = instance->vk.app_info.app_name,
.applicationVersion = instance->vk.app_info.app_version,
.engineName = instance->vk.app_info.engine_name,
.engineVersion = instance->vk.app_info.engine_version,
});
radv_init_dri_debug_options(instance);
radv_init_dri_performance_options(instance);

View file

@ -107,10 +107,14 @@ hk_init_dri_options(struct hk_instance *instance)
{
driParseOptionInfo(&instance->available_dri_options, hk_dri_options,
ARRAY_SIZE(hk_dri_options));
driParseConfigFiles(
&instance->dri_options, &instance->available_dri_options, 0, "hk", 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);
driParseConfigFiles(&instance->dri_options, &instance->available_dri_options,
&(driConfigFileParseParams) {
.driverName = "hk",
.applicationName = instance->vk.app_info.app_name,
.applicationVersion = instance->vk.app_info.app_version,
.engineName = instance->vk.app_info.engine_name,
.engineVersion = instance->vk.app_info.engine_version,
});
instance->force_vk_vendor =
driQueryOptioni(&instance->dri_options, "force_vk_vendor");

View file

@ -598,9 +598,14 @@ v3dv_init_dri_options(struct v3dv_instance *instance)
{
driParseOptionInfo(&instance->available_dri_options, v3dv_dri_options,
ARRAY_SIZE(v3dv_dri_options));
driParseConfigFiles(&instance->dri_options, &instance->available_dri_options, 0, "v3dv", 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);
driParseConfigFiles(&instance->dri_options, &instance->available_dri_options,
&(driConfigFileParseParams) {
.driverName = "v3dv",
.applicationName = instance->vk.app_info.app_name,
.applicationVersion = instance->vk.app_info.app_version,
.engineName = instance->vk.app_info.engine_name,
.engineVersion = instance->vk.app_info.engine_version,
});
}
VKAPI_ATTR VkResult VKAPI_CALL

View file

@ -1869,11 +1869,18 @@ static const driOptionDescription tu_dri_options[] = {
static void
tu_init_dri_options(struct tu_instance *instance)
{
driConfigFileParseParams params = {
.driverName = "turnip",
.applicationName = instance->vk.app_info.app_name,
.applicationVersion = instance->vk.app_info.app_version,
.engineName = instance->vk.app_info.engine_name,
.engineVersion = instance->vk.app_info.engine_version,
};
driParseOptionInfo(&instance->available_dri_options, tu_dri_options,
ARRAY_SIZE(tu_dri_options));
driParseConfigFiles(&instance->dri_options, &instance->available_dri_options, 0, "turnip", 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);
driParseConfigFiles(&instance->dri_options, &instance->available_dri_options,
&params);
instance->force_vk_vendor =
driQueryOptioni(&instance->dri_options, "force_vk_vendor");

View file

@ -137,8 +137,10 @@ void
pipe_loader_config_options(struct pipe_loader_device *dev)
{
if (!dev->option_cache.info) {
driParseConfigFiles(&dev->option_cache, &dev->option_info, 0,
dev->driver_name, NULL, NULL, NULL, 0, NULL, 0);
driParseConfigFiles(&dev->option_cache, &dev->option_info,
&(driConfigFileParseParams) {
.driverName = dev->driver_name,
});
}
}

View file

@ -2429,8 +2429,8 @@ agx_screen_create(int fd, struct renderonly *ro,
screen = &agx_screen->pscreen;
/* parse driconf configuration now for device specific overrides */
driParseConfigFiles(config->options, config->options_info, 0, "asahi", NULL,
NULL, NULL, 0, NULL, 0);
driParseConfigFiles(config->options, config->options_info,
&(driConfigFileParseParams) { .driverName = "asahi" });
agx_screen->dev.fd = fd;
agx_screen->dev.ro = ro;

View file

@ -572,8 +572,8 @@ crocus_screen_create(int fd, const struct pipe_screen_config *config)
screen->aperture_bytes = get_aperture_size(fd);
screen->aperture_threshold = screen->aperture_bytes * 3 / 4;
driParseConfigFiles(config->options, config->options_info, 0, "crocus",
NULL, NULL, NULL, 0, NULL, 0);
driParseConfigFiles(config->options, config->options_info,
&(driConfigFileParseParams) { .driverName = "crocus" });
bool bo_reuse = false;
int bo_reuse_mode = driQueryOptioni(config->options, "bo_reuse");

View file

@ -1024,8 +1024,11 @@ fd_screen_create(int fd,
screen->has_syncobj = fd_has_syncobj(screen->dev);
/* parse driconf configuration now for device specific overrides: */
driParseConfigFiles(config->options, config->options_info, 0, "msm",
NULL, fd_dev_name(screen->dev_id), NULL, 0, NULL, 0);
driParseConfigFiles(config->options, config->options_info,
&(driConfigFileParseParams) {
.driverName = "msm",
.deviceName = fd_dev_name(screen->dev_id),
});
screen->driconf.conservative_lrz =
!driQueryOptionb(config->options, "disable_conservative_lrz");

View file

@ -665,8 +665,8 @@ iris_screen_create(int fd, const struct pipe_screen_config *config)
if (!screen)
return NULL;
driParseConfigFiles(config->options, config->options_info, 0, "iris",
NULL, NULL, NULL, 0, NULL, 0);
driParseConfigFiles(config->options, config->options_info,
&(driConfigFileParseParams) { .driverName = "iris" });
bool bo_reuse = false;
int bo_reuse_mode = driQueryOptioni(config->options, "bo_reuse");

View file

@ -581,8 +581,8 @@ lima_screen_create(int fd, const struct pipe_screen_config *config,
lima_plb_pp_stream_cache_size = MAX2(128 * 1024 * lima_ctx_num_plb,
lima_plb_pp_stream_cache_size);
driParseConfigFiles(config->options, config->options_info, 0,
"lima", NULL, NULL, NULL, 0, NULL, 0);
driParseConfigFiles(config->options, config->options_info,
&(driConfigFileParseParams) { .driverName = "lima" });
if (!lima_screen_query_info(screen))
goto err_out0;

View file

@ -1025,8 +1025,8 @@ panfrost_create_screen(int fd, const struct pipe_screen_config *config,
struct panfrost_device *dev = pan_device(&screen->base);
driParseConfigFiles(config->options, config->options_info, 0,
"panfrost", NULL, NULL, NULL, 0, NULL, 0);
driParseConfigFiles(config->options, config->options_info,
&(driConfigFileParseParams) { .driverName = "panfrost" });
/* Debug must be set first for pandecode to work correctly */
dev->debug =

View file

@ -657,8 +657,8 @@ struct pipe_screen* r300_screen_create(struct radeon_winsys *rws,
r300_init_debug(r300screen);
r300_parse_chipset(r300screen->info.pci_id, &r300screen->caps);
driParseConfigFiles(config->options, config->options_info, 0, "r300", NULL,
NULL, NULL, 0, NULL, 0);
driParseConfigFiles(config->options, config->options_info,
&(driConfigFileParseParams) { .driverName = "r300" });
#define OPT_BOOL(name, dflt, description) \
r300screen->options.name = driQueryOptionb(config->options, "r300_" #name);

View file

@ -276,8 +276,8 @@ struct pipe_screen *radeonsi_screen_create(int fd, const struct pipe_screen_conf
ac_init_llvm_once();
#endif
driParseConfigFiles(config->options, config->options_info, 0, "radeonsi",
NULL, NULL, NULL, 0, NULL, 0);
driParseConfigFiles(config->options, config->options_info,
&(driConfigFileParseParams) { .driverName = "radeonsi" });
#ifdef HAVE_AMDGPU_VIRTIO
if (strcmp(version->name, "virtio_gpu") == 0) {

View file

@ -803,8 +803,8 @@ v3d_screen_create(int fd, const struct pipe_screen_config *config,
if (!screen->perfcnt)
goto fail;
driParseConfigFiles(config->options, config->options_info, 0, "v3d",
NULL, NULL, NULL, 0, NULL, 0);
driParseConfigFiles(config->options, config->options_info,
&(driConfigFileParseParams) { .driverName = "v3d" });
/* We have to driCheckOption for the simulator mode to not assertion
* fail on not having our XML config.

View file

@ -990,8 +990,8 @@ virgl_create_screen(struct virgl_winsys *vws, const struct pipe_screen_config *c
virgl_debug = debug_get_option_virgl_debug();
if (config && config->options) {
driParseConfigFiles(config->options, config->options_info, 0, "virtio_gpu",
NULL, NULL, NULL, 0, NULL, 0);
driParseConfigFiles(config->options, config->options_info,
&(driConfigFileParseParams) { .driverName = "virtio_gpu" });
screen->tweak_gles_emulate_bgra =
driQueryOptionb(config->options, VIRGL_GLES_EMULATE_BGRA);

View file

@ -3412,8 +3412,8 @@ zink_internal_create_screen(const struct pipe_screen_config *config, int64_t dev
}
if (config) {
driParseConfigFiles(config->options, config->options_info, 0, "zink",
NULL, NULL, NULL, 0, NULL, 0);
driParseConfigFiles(config->options, config->options_info,
&(driConfigFileParseParams) { .driverName = "zink" });
screen->driconf.dual_color_blend_by_location = driQueryOptionb(config->options, "dual_color_blend_by_location");
//screen->driconf.inline_uniforms = driQueryOptionb(config->options, "radeonsi_inline_uniforms");
screen->driconf.emulate_point_smooth = driQueryOptionb(config->options, "zink_emulate_point_smooth");

View file

@ -119,8 +119,11 @@ driCreateNewScreen3(int scrn, int fd,
/* Option parsing before ->InitScreen(), as some options apply there. */
driParseOptionInfo(&screen->optionInfo,
__dri2ConfigOptions, ARRAY_SIZE(__dri2ConfigOptions));
driParseConfigFiles(&screen->optionCache, &screen->optionInfo, screen->myNum,
"dri2", NULL, NULL, NULL, 0, NULL, 0);
driParseConfigFiles(&screen->optionCache, &screen->optionInfo,
&(driConfigFileParseParams) {
.screenNum = screen->myNum,
.driverName = "dri2",
});
(void) mtx_init(&screen->opencl_func_mutex, mtx_plain);

View file

@ -122,8 +122,10 @@ init_options()
{
const char *driver_name = stw_dev->stw_winsys->get_name ? stw_dev->stw_winsys->get_name() : NULL;
driParseOptionInfo(&stw_dev->option_info, gallium_driconf, ARRAY_SIZE(gallium_driconf));
driParseConfigFiles(&stw_dev->option_cache, &stw_dev->option_info, 0,
driver_name ? driver_name : "", NULL, NULL, NULL, 0, NULL, 0);
driParseConfigFiles(&stw_dev->option_cache, &stw_dev->option_info,
&(driConfigFileParseParams) {
.driverName = driver_name ? driver_name : "",
});
u_driconf_fill_st_options(&stw_dev->st_options, &stw_dev->option_cache);

View file

@ -346,16 +346,14 @@ static void pvr_init_dri_options(struct pvr_instance *instance)
driParseOptionInfo(&instance->available_dri_options,
pvr_dri_options,
ARRAY_SIZE(pvr_dri_options));
driParseConfigFiles(&instance->dri_options,
&instance->available_dri_options,
0,
"pvr",
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);
driParseConfigFiles(&instance->dri_options, &instance->available_dri_options,
&(driConfigFileParseParams) {
.driverName = "pvr",
.applicationName = instance->vk.app_info.app_name,
.applicationVersion = instance->vk.app_info.app_version,
.engineName = instance->vk.app_info.engine_name,
.engineVersion = instance->vk.app_info.engine_version,
});
instance->force_vk_vendor =
driQueryOptioni(&instance->dri_options, "force_vk_vendor");

View file

@ -209,12 +209,14 @@ anv_init_dri_options(struct anv_instance *instance)
{
driParseOptionInfo(&instance->available_dri_options, anv_dri_options,
ARRAY_SIZE(anv_dri_options));
driParseConfigFiles(&instance->dri_options,
&instance->available_dri_options, 0, "anv", 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);
driParseConfigFiles(&instance->dri_options, &instance->available_dri_options,
&(driConfigFileParseParams) {
.driverName = "anv",
.applicationName = instance->vk.app_info.app_name,
.applicationVersion = instance->vk.app_info.app_version,
.engineName = instance->vk.app_info.engine_name,
.engineVersion = instance->vk.app_info.engine_version,
});
instance->assume_full_subgroups =
driQueryOptioni(&instance->dri_options, "anv_assume_full_subgroups");

View file

@ -1930,12 +1930,14 @@ anv_init_dri_options(struct anv_instance *instance)
{
driParseOptionInfo(&instance->available_dri_options, anv_dri_options,
ARRAY_SIZE(anv_dri_options));
driParseConfigFiles(&instance->dri_options,
&instance->available_dri_options, 0, "anv", 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);
driParseConfigFiles(&instance->dri_options, &instance->available_dri_options,
&(driConfigFileParseParams) {
.driverName = "anv",
.applicationName = instance->vk.app_info.app_name,
.applicationVersion = instance->vk.app_info.app_version,
.engineName = instance->vk.app_info.engine_name,
.engineVersion = instance->vk.app_info.engine_version,
});
instance->assume_full_subgroups =
driQueryOptioni(&instance->dri_options, "anv_assume_full_subgroups");

View file

@ -343,8 +343,11 @@ static char *loader_get_dri_config_driver(int fd)
driParseOptionInfo(&defaultInitOptions, __driConfigOptionsLoader,
ARRAY_SIZE(__driConfigOptionsLoader));
driParseConfigFiles(&userInitOptions, &defaultInitOptions, 0,
"loader", kernel_driver, NULL, NULL, 0, NULL, 0);
driParseConfigFiles(&userInitOptions, &defaultInitOptions,
&(driConfigFileParseParams) {
.driverName = "loader",
.kernelDriverName = kernel_driver,
});
if (driCheckOption(&userInitOptions, "dri_driver", DRI_STRING)) {
char *opt = driQueryOptionstr(&userInitOptions, "dri_driver");
/* not an empty string */
@ -366,8 +369,10 @@ static char *loader_get_dri_config_device_id(void)
driParseOptionInfo(&defaultInitOptions, __driConfigOptionsLoader,
ARRAY_SIZE(__driConfigOptionsLoader));
driParseConfigFiles(&userInitOptions, &defaultInitOptions, 0,
"loader", NULL, NULL, NULL, 0, NULL, 0);
driParseConfigFiles(&userInitOptions, &defaultInitOptions,
&(driConfigFileParseParams) {
.driverName = "loader",
});
if (driCheckOption(&userInitOptions, "device_id", DRI_STRING)) {
char *opt = driQueryOptionstr(&userInitOptions, "device_id");
if (*opt)

View file

@ -1776,9 +1776,14 @@ dzn_init_dri_config(struct dzn_instance *instance)
{
driParseOptionInfo(&instance->available_dri_options, dzn_dri_options,
ARRAY_SIZE(dzn_dri_options));
driParseConfigFiles(&instance->dri_options, &instance->available_dri_options, 0, "dzn", 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);
driParseConfigFiles(&instance->dri_options, &instance->available_dri_options,
&(driConfigFileParseParams) {
.driverName = "dzn",
.applicationName = instance->vk.app_info.app_name,
.applicationVersion = instance->vk.app_info.app_version,
.engineName = instance->vk.app_info.engine_name,
.engineVersion = instance->vk.app_info.engine_version,
});
}
static VkResult

View file

@ -119,9 +119,14 @@ static void
nvk_init_dri_options(struct nvk_instance *instance)
{
driParseOptionInfo(&instance->available_dri_options, nvk_dri_options, ARRAY_SIZE(nvk_dri_options));
driParseConfigFiles(&instance->dri_options, &instance->available_dri_options, 0, "nvk", 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);
driParseConfigFiles(&instance->dri_options, &instance->available_dri_options,
&(driConfigFileParseParams) {
.driverName = "nvk",
.applicationName = instance->vk.app_info.app_name,
.applicationVersion = instance->vk.app_info.app_version,
.engineName = instance->vk.app_info.engine_name,
.engineVersion = instance->vk.app_info.engine_version,
});
instance->force_vk_vendor =
driQueryOptioni(&instance->dri_options, "force_vk_vendor");

View file

@ -215,9 +215,14 @@ 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);
driParseConfigFiles(&instance->dri_options, &instance->available_dri_options,
&(driConfigFileParseParams) {
.driverName = "panvk",
.applicationName = instance->vk.app_info.app_name,
.applicationVersion = instance->vk.app_info.app_version,
.engineName = instance->vk.app_info.engine_name,
.engineVersion = instance->vk.app_info.engine_version,
});
instance->force_vk_vendor =
driQueryOptioni(&instance->dri_options, "force_vk_vendor");

View file

@ -170,10 +170,8 @@ TEST_F(xmlconfig_test, copy_cache)
* "mesa_test_option" so the test shouldn't end up with something from the
* user's homedir/environment that would override us.
*/
driParseConfigFiles(&cache, &options,
0, "driver", "drm", NULL,
NULL, 0,
NULL, 0);
driConfigFileParseParams params = { .driverName = "driver", .kernelDriverName = "drm" };
driParseConfigFiles(&cache, &options, &params);
/* Can we inspect the cache? */
EXPECT_EQ(driCheckOption(&cache, "mesa_b_option", DRI_BOOL), true);
@ -206,10 +204,15 @@ xmlconfig_test::drirc_init(const char *driver, const char *drm,
/* This should parse the "user" drirc files under ./tests/drirc_test/,
* based on the setting of $HOME by meson.build.
*/
driParseConfigFiles(&cache, &options,
0, driver, drm, NULL,
app, appver,
engine, enginever);
driConfigFileParseParams params = {
.driverName = driver,
.kernelDriverName = drm,
.applicationName = app,
.applicationVersion = (uint32_t)appver,
.engineName = engine,
.engineVersion = (uint32_t)enginever,
};
driParseConfigFiles(&cache, &options, &params);
return cache;
}

View file

@ -1230,11 +1230,7 @@ driInjectExecName(const char *exec)
void
driParseConfigFiles(driOptionCache *cache, const driOptionCache *info,
int screenNum, const char *driverName,
const char *kernelDriverName,
const char *deviceName,
const char *applicationName, uint32_t applicationVersion,
const char *engineName, uint32_t engineVersion)
const driConfigFileParseParams *params)
{
initOptionCache(cache, info);
struct OptConfData userData = {0};
@ -1245,14 +1241,14 @@ driParseConfigFiles(driOptionCache *cache, const driOptionCache *info,
execname = util_get_process_name();
userData.cache = cache;
userData.screenNum = screenNum;
userData.driverName = driverName;
userData.kernelDriverName = kernelDriverName;
userData.deviceName = deviceName;
userData.applicationName = applicationName ? applicationName : "";
userData.applicationVersion = applicationVersion;
userData.engineName = engineName ? engineName : "";
userData.engineVersion = engineVersion;
userData.screenNum = params->screenNum;
userData.driverName = params->driverName;
userData.kernelDriverName = params->kernelDriverName;
userData.deviceName = params->deviceName;
userData.applicationName = params->applicationName ? params->applicationName : "";
userData.applicationVersion = params->applicationVersion;
userData.engineName = params->engineName ? params->engineName : "";
userData.engineVersion = params->engineVersion;
userData.execName = execname;
#if WITH_XMLCONFIG

View file

@ -128,16 +128,23 @@ driGetOptionsXml(const driOptionDescription *configOptions, unsigned numOptions)
void driParseOptionInfo(driOptionCache *info,
const driOptionDescription *configOptions,
unsigned numOptions);
typedef struct {
int screenNum;
const char *driverName;
const char *kernelDriverName;
const char *deviceName;
const char *applicationName;
uint32_t applicationVersion;
const char *engineName;
uint32_t engineVersion;
} driConfigFileParseParams;
/** \brief Initialize option cache from info and parse configuration files
*
* To be called in <driver>CreateContext. screenNum, driverName,
* kernelDriverName, applicationName and engineName select device sections. */
* To be called in <driver>CreateContext. Fields in driConfigFileParseParams
* select which device/application/engine sections apply. */
void driParseConfigFiles(driOptionCache *cache, const driOptionCache *info,
int screenNum, const char *driverName,
const char *kernelDriverName,
const char *deviceName,
const char *applicationName, uint32_t applicationVersion,
const char *engineName, uint32_t engineVersion);
const driConfigFileParseParams *params);
/** \brief Destroy option info
*
* To be called in <driver>DestroyScreen */

View file

@ -366,12 +366,14 @@ vn_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
driParseOptionInfo(&instance->available_dri_options, vn_dri_options,
ARRAY_SIZE(vn_dri_options));
driParseConfigFiles(&instance->dri_options,
&instance->available_dri_options, 0, "venus", NULL,
NULL, instance->base.vk.app_info.app_name,
instance->base.vk.app_info.app_version,
instance->base.vk.app_info.engine_name,
instance->base.vk.app_info.engine_version);
driParseConfigFiles(&instance->dri_options, &instance->available_dri_options,
&(driConfigFileParseParams) {
.driverName = "venus",
.applicationName = instance->base.vk.app_info.app_name,
.applicationVersion = instance->base.vk.app_info.app_version,
.engineName = instance->base.vk.app_info.engine_name,
.engineVersion = instance->base.vk.app_info.engine_version,
});
instance->renderer->info.has_implicit_fencing =
driQueryOptionb(&instance->dri_options, "venus_implicit_fencing");