summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolai Hähnle <nicolai.haehnle@amd.com>2017-06-28 17:50:19 +0200
committerNicolai Hähnle <nicolai.haehnle@amd.com>2017-07-13 13:27:46 +0200
commit82163029b3aeae8429a3fdfadfd370f72ac50b2f (patch)
tree8d70e1c548112ce87de1ad2ff0ec0c006e312778
parent5c10f0e8e36acb8b07680396d9a58feb6fbd41fe (diff)
gallium: move loading of drirc to pipe-loader
-rw-r--r--src/gallium/auxiliary/pipe-loader/pipe_loader.c29
-rw-r--r--src/gallium/auxiliary/pipe-loader/pipe_loader.h14
-rw-r--r--src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c3
-rw-r--r--src/gallium/auxiliary/pipe-loader/pipe_loader_priv.h11
-rw-r--r--src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c3
-rw-r--r--src/gallium/state_trackers/dri/dri2.c18
-rw-r--r--src/gallium/state_trackers/dri/dri_context.c3
-rw-r--r--src/gallium/state_trackers/dri/dri_screen.c41
-rw-r--r--src/gallium/state_trackers/dri/dri_screen.h10
-rw-r--r--src/gallium/state_trackers/dri/drisw.c2
10 files changed, 76 insertions, 58 deletions
diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader.c b/src/gallium/auxiliary/pipe-loader/pipe_loader.c
index bb65be1528..95e6b42cf7 100644
--- a/src/gallium/auxiliary/pipe-loader/pipe_loader.c
+++ b/src/gallium/auxiliary/pipe-loader/pipe_loader.c
@@ -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)
diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader.h b/src/gallium/auxiliary/pipe-loader/pipe_loader.h
index d24480dfd9..a4502ae258 100644
--- a/src/gallium/auxiliary/pipe-loader/pipe_loader.h
+++ b/src/gallium/auxiliary/pipe-loader/pipe_loader.h
@@ -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;
};
/**
@@ -100,6 +104,16 @@ 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.
*
* Should be called when the specified devices are no longer in use to
diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
index 385d814522..193c8ddff2 100644
--- a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
+++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
@@ -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 *
diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_priv.h b/src/gallium/auxiliary/pipe-loader/pipe_loader_priv.h
index 7708455d94..37219fb894 100644
--- a/src/gallium/auxiliary/pipe-loader/pipe_loader_priv.h
+++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_priv.h
@@ -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 */
diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c b/src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c
index 3c8e0c2d52..696ba2c533 100644
--- a/src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c
+++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c
@@ -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 *
diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c
index 2dceb1d482..6f2b634f6d 100644
--- a/src/gallium/state_trackers/dri/dri2.c
+++ b/src/gallium/state_trackers/dri/dri2.c
@@ -1920,10 +1920,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;
}
@@ -1936,11 +1936,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;
}
@@ -1953,10 +1953,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;
}
@@ -2036,7 +2036,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);
}
@@ -2131,7 +2131,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);
diff --git a/src/gallium/state_trackers/dri/dri_context.c b/src/gallium/state_trackers/dri/dri_context.c
index ec555e44d7..a3e5020f04 100644
--- a/src/gallium/state_trackers/dri/dri_context.c
+++ b/src/gallium/state_trackers/dri/dri_context.c
@@ -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
@@ -160,7 +161,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) {
diff --git a/src/gallium/state_trackers/dri/dri_screen.c b/src/gallium/state_trackers/dri/dri_screen.c
index 2117dbb29a..c13009105a 100644
--- a/src/gallium/state_trackers/dri/dri_screen.c
+++ b/src/gallium/state_trackers/dri/dri_screen.c
@@ -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");
@@ -118,7 +118,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;
}
@@ -349,28 +349,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)
{
@@ -380,7 +358,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);
}
@@ -404,7 +381,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);
}
}
@@ -429,19 +406,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;
diff --git a/src/gallium/state_trackers/dri/dri_screen.h b/src/gallium/state_trackers/dri/dri_screen.h
index 383e762393..b8b27c3022 100644
--- a/src/gallium/state_trackers/dri/dri_screen.h
+++ b/src/gallium/state_trackers/dri/dri_screen.h
@@ -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,
diff --git a/src/gallium/state_trackers/dri/drisw.c b/src/gallium/state_trackers/dri/drisw.c
index 2e3ab9687c..f89857c876 100644
--- a/src/gallium/state_trackers/dri/drisw.c
+++ b/src/gallium/state_trackers/dri/drisw.c
@@ -401,7 +401,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);