Mesa (main): driconfig: Add support for device specific config

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Aug 3 00:25:18 UTC 2021


Module: Mesa
Branch: main
Commit: 6edf0d8e9022e0072c0ed5c3ce78fdca528c4cb4
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6edf0d8e9022e0072c0ed5c3ce78fdca528c4cb4

Author: Rob Clark <robdclark at chromium.org>
Date:   Wed Jul 28 18:17:42 2021 -0700

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 <robdclark at chromium.org>
Reviewed-by: Emil Velikov <emil.l.velikov at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12135>

---

 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.
 <!DOCTYPE driconf [
    <!ELEMENT driconf      (device+)>
    <!ELEMENT device       (application | engine)+>
-   <!ATTLIST device       driver CDATA #IMPLIED>
+   <!ATTLIST device       driver CDATA #IMPLIED
+                          device CDATA #IMPLIED>
    <!ELEMENT application  (option+)>
    <!ATTLIST application  name CDATA #REQUIRED
                           executable CDATA #IMPLIED
diff --git a/src/util/driconf_static.py b/src/util/driconf_static.py
index 72eac1eaaa2..cd03d17508f 100644
--- a/src/util/driconf_static.py
+++ b/src/util/driconf_static.py
@@ -68,6 +68,7 @@ class Device(object):
     def __init__(self, xml):
         self.cname = cname('device')
         self.driver = xml.attrib.get('driver', None)
+        self.device = xml.attrib.get('device', None)
         self.applications = []
         self.engines = []
 
@@ -133,6 +134,7 @@ struct driconf_engine {
 
 struct driconf_device {
     const char *driver;
+    const char *device;
     unsigned num_engines;
     const struct driconf_engine *engines;
     unsigned num_applications;
@@ -196,6 +198,9 @@ static const struct driconf_application ${device.cname}_applications[] = {
 static const struct driconf_device ${device.cname} = {
 %    if device.driver:
     .driver = "${device.driver}",
+%    endif
+%    if device.device:
+    .device = "${device.device}",
 %    endif
     .num_engines = ${len(device.engines)},
 %    if len(device.engines) > 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,



More information about the mesa-commit mailing list