From 6edf0d8e9022e0072c0ed5c3ce78fdca528c4cb4 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Wed, 28 Jul 2021 18:17:42 -0700 Subject: [PATCH] driconfig: Add support for device specific config Add support for driconf overrides on a per-device level, for cases where we don't want to override behavior for all devices supported by a particular driver. Signed-off-by: Rob Clark Reviewed-by: Emil Velikov Part-of: --- src/amd/vulkan/radv_device.c | 2 +- src/gallium/auxiliary/pipe-loader/pipe_loader.c | 2 +- src/gallium/drivers/crocus/crocus_screen.c | 2 +- src/gallium/drivers/iris/iris_screen.c | 2 +- src/gallium/drivers/radeonsi/si_pipe.c | 2 +- src/gallium/drivers/v3d/v3d_screen.c | 2 +- src/gallium/drivers/virgl/virgl_screen.c | 2 +- src/gallium/drivers/zink/zink_screen.c | 2 +- src/gallium/targets/d3dadapter9/drm.c | 2 +- src/intel/vulkan/anv_device.c | 2 +- src/loader/loader.c | 4 ++-- src/mesa/drivers/dri/common/dri_util.c | 2 +- src/mesa/drivers/dri/i915/intel_context.c | 2 +- src/mesa/drivers/dri/i965/brw_screen.c | 2 +- src/mesa/drivers/dri/r200/r200_context.c | 2 +- src/mesa/drivers/dri/radeon/radeon_context.c | 2 +- src/util/00-mesa-defaults.conf | 3 ++- src/util/driconf_static.py | 5 +++++ src/util/tests/xmlconfig.cpp | 4 ++-- src/util/xmlconfig.c | 10 +++++++++- src/util/xmlconfig.h | 1 + src/virtio/vulkan/vn_instance.c | 2 +- 22 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 29f1c30b6a4..729952682c2 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -874,7 +874,7 @@ radv_init_dri_options(struct radv_instance *instance) { driParseOptionInfo(&instance->available_dri_options, radv_dri_options, ARRAY_SIZE(radv_dri_options)); - driParseConfigFiles(&instance->dri_options, &instance->available_dri_options, 0, "radv", NULL, + driParseConfigFiles(&instance->dri_options, &instance->available_dri_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); diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader.c b/src/gallium/auxiliary/pipe-loader/pipe_loader.c index d044db40b46..6d5204d629f 100644 --- a/src/gallium/auxiliary/pipe-loader/pipe_loader.c +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader.c @@ -133,7 +133,7 @@ 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, 0, NULL, 0); + dev->driver_name, NULL, NULL, NULL, 0, NULL, 0); } } diff --git a/src/gallium/drivers/crocus/crocus_screen.c b/src/gallium/drivers/crocus/crocus_screen.c index 7ed222801b1..7a741e98f35 100644 --- a/src/gallium/drivers/crocus/crocus_screen.c +++ b/src/gallium/drivers/crocus/crocus_screen.c @@ -766,7 +766,7 @@ crocus_screen_create(int fd, const struct pipe_screen_config *config) screen->no_hw = true; driParseConfigFiles(config->options, config->options_info, 0, "crocus", - NULL, NULL, 0, NULL, 0); + NULL, NULL, NULL, 0, NULL, 0); bool bo_reuse = false; int bo_reuse_mode = driQueryOptioni(config->options, "bo_reuse"); diff --git a/src/gallium/drivers/iris/iris_screen.c b/src/gallium/drivers/iris/iris_screen.c index d9b667d13d2..fe8ceb51940 100644 --- a/src/gallium/drivers/iris/iris_screen.c +++ b/src/gallium/drivers/iris/iris_screen.c @@ -812,7 +812,7 @@ iris_screen_create(int fd, const struct pipe_screen_config *config) return NULL; driParseConfigFiles(config->options, config->options_info, 0, "iris", - NULL, NULL, 0, NULL, 0); + NULL, NULL, NULL, 0, NULL, 0); bool bo_reuse = false; int bo_reuse_mode = driQueryOptioni(config->options, "bo_reuse"); diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index ded49817f7e..0ca0ce8209e 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -1400,7 +1400,7 @@ struct pipe_screen *radeonsi_screen_create(int fd, const struct pipe_screen_conf struct radeon_winsys *rw = NULL; driParseConfigFiles(config->options, config->options_info, 0, "radeonsi", - NULL, NULL, 0, NULL, 0); + NULL, NULL, NULL, 0, NULL, 0); switch (version->version_major) { case 2: diff --git a/src/gallium/drivers/v3d/v3d_screen.c b/src/gallium/drivers/v3d/v3d_screen.c index fef538f8ec7..dee8a983671 100644 --- a/src/gallium/drivers/v3d/v3d_screen.c +++ b/src/gallium/drivers/v3d/v3d_screen.c @@ -794,7 +794,7 @@ v3d_screen_create(int fd, const struct pipe_screen_config *config, goto fail; driParseConfigFiles(config->options, config->options_info, 0, "v3d", - NULL, NULL, 0, NULL, 0); + NULL, NULL, NULL, 0, NULL, 0); /* We have to driCheckOption for the simulator mode to not assertion * fail on not having our XML config. diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c index a089a52d7f6..b58f5228333 100644 --- a/src/gallium/drivers/virgl/virgl_screen.c +++ b/src/gallium/drivers/virgl/virgl_screen.c @@ -943,7 +943,7 @@ virgl_create_screen(struct virgl_winsys *vws, const struct pipe_screen_config *c if (config && config->options) { driParseConfigFiles(config->options, config->options_info, 0, "virtio_gpu", - NULL, NULL, 0, NULL, 0); + NULL, NULL, NULL, 0, NULL, 0); screen->tweak_gles_emulate_bgra = driQueryOptionb(config->options, VIRGL_GLES_EMULATE_BGRA); diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 256f53f56ea..f077dca1d91 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -1904,7 +1904,7 @@ zink_internal_create_screen(const struct pipe_screen_config *config) #if WITH_XMLCONFIG if (config) { driParseConfigFiles(config->options, config->options_info, 0, "zink", - NULL, NULL, 0, NULL, 0); + NULL, NULL, NULL, 0, NULL, 0); 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"); } diff --git a/src/gallium/targets/d3dadapter9/drm.c b/src/gallium/targets/d3dadapter9/drm.c index 1e0b89043d9..ced9d5bac2d 100644 --- a/src/gallium/targets/d3dadapter9/drm.c +++ b/src/gallium/targets/d3dadapter9/drm.c @@ -257,7 +257,7 @@ drm_create_adapter( int fd, driParseOptionInfo(&defaultInitOptions, __driConfigOptionsNine, ARRAY_SIZE(__driConfigOptionsNine)); driParseConfigFiles(&userInitOptions, &defaultInitOptions, 0, - "nine", NULL, NULL, 0, NULL, 0); + "nine", NULL, NULL, NULL, 0, NULL, 0); if (driCheckOption(&userInitOptions, "throttle_value", DRI_INT)) { throttling_value_user = driQueryOptioni(&userInitOptions, "throttle_value"); if (throttling_value_user == -1) diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 25c3ed87977..665e73fc2f9 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -1036,7 +1036,7 @@ 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, + &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, diff --git a/src/loader/loader.c b/src/loader/loader.c index 08eeb61504b..58727155075 100644 --- a/src/loader/loader.c +++ b/src/loader/loader.c @@ -195,7 +195,7 @@ static char *loader_get_dri_config_driver(int fd) driParseOptionInfo(&defaultInitOptions, __driConfigOptionsLoader, ARRAY_SIZE(__driConfigOptionsLoader)); driParseConfigFiles(&userInitOptions, &defaultInitOptions, 0, - "loader", kernel_driver, NULL, 0, NULL, 0); + "loader", kernel_driver, NULL, NULL, 0, NULL, 0); if (driCheckOption(&userInitOptions, "dri_driver", DRI_STRING)) { char *opt = driQueryOptionstr(&userInitOptions, "dri_driver"); /* not an empty string */ @@ -218,7 +218,7 @@ static char *loader_get_dri_config_device_id(void) driParseOptionInfo(&defaultInitOptions, __driConfigOptionsLoader, ARRAY_SIZE(__driConfigOptionsLoader)); driParseConfigFiles(&userInitOptions, &defaultInitOptions, 0, - "loader", NULL, NULL, 0, NULL, 0); + "loader", NULL, NULL, NULL, 0, NULL, 0); if (driCheckOption(&userInitOptions, "device_id", DRI_STRING)) prime = strdup(driQueryOptionstr(&userInitOptions, "device_id")); driDestroyOptionCache(&userInitOptions); diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c index e2a11240dea..f379cef06f1 100644 --- a/src/mesa/drivers/dri/common/dri_util.c +++ b/src/mesa/drivers/dri/common/dri_util.c @@ -155,7 +155,7 @@ driCreateNewScreen2(int scrn, int fd, driParseOptionInfo(&psp->optionInfo, __dri2ConfigOptions, ARRAY_SIZE(__dri2ConfigOptions)); driParseConfigFiles(&psp->optionCache, &psp->optionInfo, psp->myNum, - "dri2", NULL, NULL, 0, NULL, 0); + "dri2", NULL, NULL, NULL, 0, NULL, 0); *driver_configs = psp->driver->InitScreen(psp); if (*driver_configs == NULL) { diff --git a/src/mesa/drivers/dri/i915/intel_context.c b/src/mesa/drivers/dri/i915/intel_context.c index d75a77b55f9..186887f615a 100644 --- a/src/mesa/drivers/dri/i915/intel_context.c +++ b/src/mesa/drivers/dri/i915/intel_context.c @@ -447,7 +447,7 @@ intelInitContext(struct intel_context *intel, 0, sizeof(ctx->TextureFormatSupported)); driParseConfigFiles(&intel->optionCache, &intelScreen->optionCache, - sPriv->myNum, "i915", NULL, NULL, 0, NULL, 0); + sPriv->myNum, "i915", NULL, NULL, NULL, 0, NULL, 0); intel->maxBatchSize = 4096; /* Estimate the size of the mappable aperture into the GTT. There's an diff --git a/src/mesa/drivers/dri/i965/brw_screen.c b/src/mesa/drivers/dri/i965/brw_screen.c index 4c5bc64a4a5..227d31d59c3 100644 --- a/src/mesa/drivers/dri/i965/brw_screen.c +++ b/src/mesa/drivers/dri/i965/brw_screen.c @@ -2543,7 +2543,7 @@ __DRIconfig **brw_init_screen(__DRIscreen *dri_screen) driParseOptionInfo(&options, brw_driconf, ARRAY_SIZE(brw_driconf)); driParseConfigFiles(&screen->optionCache, &options, dri_screen->myNum, - "i965", NULL, NULL, 0, NULL, 0); + "i965", NULL, NULL, NULL, 0, NULL, 0); driDestroyOptionCache(&options); screen->driScrnPriv = dri_screen; diff --git a/src/mesa/drivers/dri/r200/r200_context.c b/src/mesa/drivers/dri/r200/r200_context.c index e804451a76a..d7264deca29 100644 --- a/src/mesa/drivers/dri/r200/r200_context.c +++ b/src/mesa/drivers/dri/r200/r200_context.c @@ -217,7 +217,7 @@ GLboolean r200CreateContext( gl_api api, * the default textures. */ driParseConfigFiles (&rmesa->radeon.optionCache, &screen->optionCache, - screen->driScreen->myNum, "r200", NULL, NULL, 0, NULL, 0); + screen->driScreen->myNum, "r200", NULL, NULL, NULL, 0, NULL, 0); rmesa->radeon.initialMaxAnisotropy = driQueryOptionf(&rmesa->radeon.optionCache, "def_max_anisotropy"); diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c b/src/mesa/drivers/dri/radeon/radeon_context.c index 497a566cd24..5c56ca99f12 100644 --- a/src/mesa/drivers/dri/radeon/radeon_context.c +++ b/src/mesa/drivers/dri/radeon/radeon_context.c @@ -183,7 +183,7 @@ r100CreateContext( gl_api api, * the default textures. */ driParseConfigFiles (&rmesa->radeon.optionCache, &screen->optionCache, - screen->driScreen->myNum, "radeon", NULL, NULL, 0, NULL, 0); + screen->driScreen->myNum, "radeon", NULL, NULL, NULL, 0, NULL, 0); rmesa->radeon.initialMaxAnisotropy = driQueryOptionf(&rmesa->radeon.optionCache, "def_max_anisotropy"); diff --git a/src/util/00-mesa-defaults.conf b/src/util/00-mesa-defaults.conf index 0a2e2ae272a..632361ae857 100644 --- a/src/util/00-mesa-defaults.conf +++ b/src/util/00-mesa-defaults.conf @@ -31,7 +31,8 @@ TODO: document the other workarounds. - + 0: diff --git a/src/util/tests/xmlconfig.cpp b/src/util/tests/xmlconfig.cpp index b59c8497d59..da6bab6fc1f 100644 --- a/src/util/tests/xmlconfig.cpp +++ b/src/util/tests/xmlconfig.cpp @@ -143,7 +143,7 @@ TEST_F(xmlconfig_test, copy_cache) * user's homedir/environment that would override us. */ driParseConfigFiles(&cache, &options, - 0, "driver", "drm", + 0, "driver", "drm", NULL, NULL, 0, NULL, 0); @@ -184,7 +184,7 @@ xmlconfig_test::drirc_init(const char *driver, const char *drm, * based on the setting of $HOME by meson.build. */ driParseConfigFiles(&cache, &options, - 0, driver, drm, + 0, driver, drm, NULL, app, appver, engine, enginever); diff --git a/src/util/xmlconfig.c b/src/util/xmlconfig.c index 62b5e0d925f..1f1ec14bd33 100644 --- a/src/util/xmlconfig.c +++ b/src/util/xmlconfig.c @@ -595,6 +595,7 @@ struct OptConfData { int screenNum; const char *driverName, *execName; const char *kernelDriverName; + const char *deviceName; const char *engineName; const char *applicationName; uint32_t engineVersion; @@ -648,11 +649,12 @@ static void parseDeviceAttr(struct OptConfData *data, const char **attr) { uint32_t i; - const char *driver = NULL, *screen = NULL, *kernel = NULL; + const char *driver = NULL, *screen = NULL, *kernel = NULL, *device = NULL; for (i = 0; attr[i]; i += 2) { if (!strcmp(attr[i], "driver")) driver = attr[i+1]; else if (!strcmp(attr[i], "screen")) screen = attr[i+1]; else if (!strcmp(attr[i], "kernel_driver")) kernel = attr[i+1]; + else if (!strcmp(attr[i], "device")) device = attr[i+1]; else XML_WARNING("unknown device attribute: %s.", attr[i]); } if (driver && strcmp(driver, data->driverName)) @@ -660,6 +662,9 @@ parseDeviceAttr(struct OptConfData *data, const char **attr) else if (kernel && (!data->kernelDriverName || strcmp(kernel, data->kernelDriverName))) data->ignoringDevice = data->inDevice; + else if (device && (!data->deviceName || + strcmp(device, data->deviceName))) + data->ignoringDevice = data->inDevice; else if (screen) { driOptionValue screenNum; if (!parseValue(&screenNum, DRI_INT, screen)) @@ -1059,6 +1064,7 @@ parseStaticConfig(struct OptConfData *data) const struct driconf_device *d = driconf[i]; const char *devattr[] = { "driver", d->driver, + "device", d->device, NULL }; @@ -1149,6 +1155,7 @@ 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) { @@ -1159,6 +1166,7 @@ driParseConfigFiles(driOptionCache *cache, const driOptionCache *info, userData.screenNum = screenNum; userData.driverName = driverName; userData.kernelDriverName = kernelDriverName; + userData.deviceName = deviceName; userData.applicationName = applicationName ? applicationName : ""; userData.applicationVersion = applicationVersion; userData.engineName = engineName ? engineName : ""; diff --git a/src/util/xmlconfig.h b/src/util/xmlconfig.h index d4fc2bac09a..302775aecf8 100644 --- a/src/util/xmlconfig.h +++ b/src/util/xmlconfig.h @@ -139,6 +139,7 @@ void driParseOptionInfo(driOptionCache *info, 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); /** \brief Destroy option info diff --git a/src/virtio/vulkan/vn_instance.c b/src/virtio/vulkan/vn_instance.c index bf32060476a..4f3bda48fdf 100644 --- a/src/virtio/vulkan/vn_instance.c +++ b/src/virtio/vulkan/vn_instance.c @@ -726,7 +726,7 @@ 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, + &instance->available_dri_options, 0, "venus", NULL, NULL, instance->base.base.app_info.app_name, instance->base.base.app_info.app_version, instance->base.base.app_info.engine_name,