gallium: move loading of drirc to pipe-loader
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 28 Jun 2017 15:50:19 +0000 (17:50 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 2 Aug 2017 07:50:57 +0000 (09:50 +0200)
v2: rebase compile fix: addition of mesa_no_error

Reviewed-by: Marek Olšák <marek.olsak@amd.com> (v1)
src/gallium/auxiliary/pipe-loader/pipe_loader.c
src/gallium/auxiliary/pipe-loader/pipe_loader.h
src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
src/gallium/auxiliary/pipe-loader/pipe_loader_priv.h
src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c
src/gallium/state_trackers/dri/dri2.c
src/gallium/state_trackers/dri/dri_context.c
src/gallium/state_trackers/dri/dri_screen.c
src/gallium/state_trackers/dri/dri_screen.h
src/gallium/state_trackers/dri/drisw.c

index bb65be15289176d325bf1b85e40447df4cfc5cb0..95e6b42cf714429c1004c1f527a6432f3e7df14f 100644 (file)
@@ -31,6 +31,7 @@
 #include "util/u_memory.h"
 #include "util/u_string.h"
 #include "util/u_dl.h"
+#include "util/xmlconfig.h"
 #include "util/xmlpool.h"
 
 #ifdef _MSC_VER
@@ -71,6 +72,16 @@ pipe_loader_release(struct pipe_loader_device **devs, int ndev)
       devs[i]->ops->release(&devs[i]);
 }
 
+void
+pipe_loader_base_release(struct pipe_loader_device **dev)
+{
+   driDestroyOptionCache(&(*dev)->option_cache);
+   driDestroyOptionInfo(&(*dev)->option_info);
+
+   FREE(*dev);
+   *dev = NULL;
+}
+
 const struct drm_conf_ret *
 pipe_loader_configuration(struct pipe_loader_device *dev,
                           enum drm_conf conf)
@@ -78,6 +89,24 @@ pipe_loader_configuration(struct pipe_loader_device *dev,
    return dev->ops->configuration(dev, conf);
 }
 
+void
+pipe_loader_load_options(struct pipe_loader_device *dev)
+{
+   if (dev->option_info.info)
+      return;
+
+   const char *xml_options = gallium_driinfo_xml;
+   const struct drm_conf_ret *xml_options_conf =
+      pipe_loader_configuration(dev, DRM_CONF_XML_OPTIONS);
+
+   if (xml_options_conf)
+      xml_options = xml_options_conf->val.val_pointer;
+
+   driParseOptionInfo(&dev->option_info, xml_options);
+   driParseConfigFiles(&dev->option_cache, &dev->option_info, 0,
+                       dev->driver_name);
+}
+
 struct pipe_screen *
 pipe_loader_create_screen(struct pipe_loader_device *dev,
                           struct pipe_screen_config *config)
index d24480dfd91e450c1dcff3595b561eb5b2509c06..a4502ae25861d69629fddf646ea6f09d5ed65abb 100644 (file)
@@ -35,6 +35,7 @@
 
 #include "pipe/p_compiler.h"
 #include "state_tracker/drm_driver.h"
+#include "util/xmlconfig.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -65,6 +66,9 @@ struct pipe_loader_device {
 
    char *driver_name;
    const struct pipe_loader_ops *ops;
+
+   driOptionCache option_cache;
+   driOptionCache option_info;
 };
 
 /**
@@ -99,6 +103,16 @@ const struct drm_conf_ret *
 pipe_loader_configuration(struct pipe_loader_device *dev,
                           enum drm_conf conf);
 
+/**
+ * Ensure that dev->option_cache is initialized appropriately for the driver.
+ *
+ * This function can be called multiple times.
+ *
+ * \param dev Device for which options should be loaded.
+ */
+void
+pipe_loader_load_options(struct pipe_loader_device *dev);
+
 /**
  * Release resources allocated for a list of devices.
  *
index 385d814522380df2153db9b3836fb2b332b0b9d2..193c8ddff2fb7921d89aefa85860e4d1b6cf3e13 100644 (file)
@@ -264,8 +264,7 @@ pipe_loader_drm_release(struct pipe_loader_device **dev)
 
    close(ddev->fd);
    FREE(ddev->base.driver_name);
-   FREE(ddev);
-   *dev = NULL;
+   pipe_loader_base_release(dev);
 }
 
 static const struct drm_conf_ret *
index 7708455d949e8cfcb8d0464ba9f3287507428f73..37219fb89413ef1339e6c06c6d57094ff1013e5f 100644 (file)
@@ -47,4 +47,15 @@ struct util_dl_library *
 pipe_loader_find_module(struct pipe_loader_device *dev,
                         const char *library_paths);
 
+/**
+ * Free the base device structure.
+ *
+ * Implementations of pipe_loader_ops::release must call this.
+ *
+ * (*dev)->driver_name must be freed by the caller if it was allocated on the
+ * heap.
+ */
+void
+pipe_loader_base_release(struct pipe_loader_device **dev);
+
 #endif /* PIPE_LOADER_PRIV_H */
index 3c8e0c2d523709080114f148a9aeabb75ba19320..696ba2c5338cb4466a12f8c075477d53b822d1a1 100644 (file)
@@ -282,8 +282,7 @@ pipe_loader_sw_release(struct pipe_loader_device **dev)
       close(sdev->fd);
 #endif
 
-   FREE(sdev);
-   *dev = NULL;
+   pipe_loader_base_release(dev);
 }
 
 static const struct drm_conf_ret *
index ab85cc2452e02a17b49bd15fd30307090fa0afed..0f71adc7689b8a0dffcc70999eece4ea6eb7b206 100644 (file)
@@ -1941,10 +1941,10 @@ dri2GalliumConfigQueryb(__DRIscreen *sPriv, const char *var,
 {
    struct dri_screen *screen = dri_screen(sPriv);
 
-   if (!driCheckOption(&screen->optionCache, var, DRI_BOOL))
+   if (!driCheckOption(&screen->dev->option_cache, var, DRI_BOOL))
       return dri2ConfigQueryExtension.configQueryb(sPriv, var, val);
 
-   *val = driQueryOptionb(&screen->optionCache, var);
+   *val = driQueryOptionb(&screen->dev->option_cache, var);
 
    return 0;
 }
@@ -1957,11 +1957,11 @@ dri2GalliumConfigQueryi(__DRIscreen *sPriv, const char *var, int *val)
 {
    struct dri_screen *screen = dri_screen(sPriv);
 
-   if (!driCheckOption(&screen->optionCache, var, DRI_INT) &&
-       !driCheckOption(&screen->optionCache, var, DRI_ENUM))
+   if (!driCheckOption(&screen->dev->option_cache, var, DRI_INT) &&
+       !driCheckOption(&screen->dev->option_cache, var, DRI_ENUM))
       return dri2ConfigQueryExtension.configQueryi(sPriv, var, val);
 
-    *val = driQueryOptioni(&screen->optionCache, var);
+    *val = driQueryOptioni(&screen->dev->option_cache, var);
 
     return 0;
 }
@@ -1974,10 +1974,10 @@ dri2GalliumConfigQueryf(__DRIscreen *sPriv, const char *var, float *val)
 {
    struct dri_screen *screen = dri_screen(sPriv);
 
-   if (!driCheckOption(&screen->optionCache, var, DRI_FLOAT))
+   if (!driCheckOption(&screen->dev->option_cache, var, DRI_FLOAT))
       return dri2ConfigQueryExtension.configQueryf(sPriv, var, val);
 
-    *val = driQueryOptionf(&screen->optionCache, var);
+    *val = driQueryOptionf(&screen->dev->option_cache, var);
 
     return 0;
 }
@@ -2059,7 +2059,7 @@ dri2_init_screen(__DRIscreen * sPriv)
       struct pipe_screen_config config = {};
 
       config.flags =
-         dri_init_options_get_screen_flags(screen, screen->dev->driver_name);
+         dri_init_options_get_screen_flags(screen);
 
       pscreen = pipe_loader_create_screen(screen->dev, &config);
    }
@@ -2154,7 +2154,7 @@ dri_kms_init_screen(__DRIscreen * sPriv)
 
    struct pipe_screen_config config = {};
 
-   config.flags = dri_init_options_get_screen_flags(screen, "swrast");
+   config.flags = dri_init_options_get_screen_flags(screen);
 
    if (pipe_loader_sw_probe_kms(&screen->dev, fd))
       pscreen = pipe_loader_create_screen(screen->dev, &config);
index 8c3797e42858456ab1c3b5092e4b04104bfeb406..8b9323faa4f0e7e9087b2f2483775dafcb6d3908 100644 (file)
@@ -37,6 +37,7 @@
 #include "state_tracker/drm_driver.h"
 
 #include "pipe/p_context.h"
+#include "pipe-loader/pipe_loader.h"
 #include "state_tracker/st_context.h"
 
 GLboolean
@@ -124,7 +125,7 @@ dri_create_context(gl_api api, const struct gl_config * visual,
    ctx->cPriv = cPriv;
    ctx->sPriv = sPriv;
 
-   if (driQueryOptionb(&screen->optionCache, "mesa_no_error"))
+   if (driQueryOptionb(&screen->dev->option_cache, "mesa_no_error"))
       attribs.flags |= ST_CONTEXT_FLAG_NO_ERROR;
 
    attribs.options = screen->options;
@@ -167,7 +168,7 @@ dri_create_context(gl_api api, const struct gl_config * visual,
 
    /* Do this last. */
    if (ctx->st->start_thread &&
-         driQueryOptionb(&screen->optionCache, "mesa_glthread")) {
+         driQueryOptionb(&screen->dev->option_cache, "mesa_glthread")) {
 
       if (backgroundCallable && backgroundCallable->base.version >= 2 &&
             backgroundCallable->isThreadSafe) {
index 79d7282b5115bcd67b4c58e2a6b3ff5650dc8d8e..1fa0347d644c16b26ae2cdcf4538bea9d38505d0 100644 (file)
@@ -59,7 +59,7 @@ static void
 dri_fill_st_options(struct dri_screen *screen)
 {
    struct st_config_options *options = &screen->options;
-   const struct driOptionCache *optionCache = &screen->optionCache;
+   const struct driOptionCache *optionCache = &screen->dev->option_cache;
 
    options->disable_blend_func_extended =
       driQueryOptionb(optionCache, "disable_blend_func_extended");
@@ -156,7 +156,7 @@ dri_fill_in_modes(struct dri_screen *screen)
       GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
    };
 
-   if (driQueryOptionb(&screen->optionCache, "always_have_depth_buffer")) {
+   if (driQueryOptionb(&screen->dev->option_cache, "always_have_depth_buffer")) {
       /* all visuals will have a depth buffer */
       depth_buffer_factor = 0;
    }
@@ -416,28 +416,6 @@ dri_get_param(struct st_manager *smapi,
    }
 }
 
-static void
-dri_destroy_option_cache(struct dri_screen * screen)
-{
-   int i;
-
-   if (screen->optionCache.info) {
-      for (i = 0; i < (1 << screen->optionCache.tableSize); ++i) {
-         free(screen->optionCache.info[i].name);
-         free(screen->optionCache.info[i].ranges);
-      }
-      free(screen->optionCache.info);
-   }
-
-   free(screen->optionCache.values);
-
-   /* Default values are copied to screen->optionCache->values in
-    * initOptionCache. The info field, however, is a pointer copy, so don't free
-    * that twice.
-    */
-   free(screen->optionCacheDefaults.values);
-}
-
 void
 dri_destroy_screen_helper(struct dri_screen * screen)
 {
@@ -450,7 +428,6 @@ dri_destroy_screen_helper(struct dri_screen * screen)
    if (screen->base.screen)
       screen->base.screen->destroy(screen->base.screen);
 
-   dri_destroy_option_cache(screen);
    mtx_destroy(&screen->opencl_func_mutex);
 }
 
@@ -474,7 +451,7 @@ dri_postprocessing_init(struct dri_screen *screen)
    unsigned i;
 
    for (i = 0; i < PP_FILTERS; i++) {
-      screen->pp_enabled[i] = driQueryOptioni(&screen->optionCache,
+      screen->pp_enabled[i] = driQueryOptioni(&screen->dev->option_cache,
                                               pp_filters[i].name);
    }
 }
@@ -499,19 +476,15 @@ dri_set_background_context(struct st_context_iface *st,
 }
 
 unsigned
-dri_init_options_get_screen_flags(struct dri_screen *screen,
-                                  const char* driver_name)
+dri_init_options_get_screen_flags(struct dri_screen *screen)
 {
    unsigned flags = 0;
 
-   driParseOptionInfo(&screen->optionCacheDefaults, gallium_config_options.xml);
-   driParseConfigFiles(&screen->optionCache,
-                       &screen->optionCacheDefaults,
-                       screen->sPriv->myNum,
-                       driver_name);
+   pipe_loader_load_options(screen->dev);
+
    dri_fill_st_options(screen);
 
-   if (driQueryOptionb(&screen->optionCache,
+   if (driQueryOptionb(&screen->dev->option_cache,
                        "glsl_correct_derivatives_after_discard"))
       flags |= PIPE_SCREEN_ENABLE_CORRECT_TGSI_DERIVATIVES_AFTER_KILL;
 
index 383e762393e4c804b4440498b8eadc3ba9bc761e..b8b27c30222a49401fc84aae464dff039b31fded 100644 (file)
@@ -33,7 +33,6 @@
 #define DRI_SCREEN_H
 
 #include "dri_util.h"
-#include "util/xmlconfig.h"
 
 #include "pipe/p_compiler.h"
 #include "pipe/p_context.h"
@@ -61,12 +60,6 @@ struct dri_screen
    boolean throttling_enabled;
    int default_throttle_frames;
 
-   /** Configuration cache with default values for all contexts */
-   driOptionCache optionCacheDefaults;
-
-   /** The screen's effective configuration options */
-   driOptionCache optionCache;
-
    struct st_config_options options;
 
    /* Which postprocessing filters are enabled. */
@@ -138,8 +131,7 @@ dri_fill_st_visual(struct st_visual *stvis, struct dri_screen *screen,
                    const struct gl_config *mode);
 
 unsigned
-dri_init_options_get_screen_flags(struct dri_screen *screen,
-                                  const char* driver_name);
+dri_init_options_get_screen_flags(struct dri_screen *screen);
 
 const __DRIconfig **
 dri_init_screen_helper(struct dri_screen *screen,
index 10d1c8d1e4de74b65e9c0b271fa3de560d532075..d064bb0d4a347c6610cef4969ee6552334a86164 100644 (file)
@@ -402,7 +402,7 @@ drisw_init_screen(__DRIscreen * sPriv)
 
    struct pipe_screen_config config;
 
-   config.flags = dri_init_options_get_screen_flags(screen, "swrast");
+   config.flags = dri_init_options_get_screen_flags(screen);
 
    if (pipe_loader_sw_probe_dri(&screen->dev, &drisw_lf))
       pscreen = pipe_loader_create_screen(screen->dev, &config);