From e794f8bf8bdb7cd0820251b46a9387ea5a7316da Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicolai=20H=C3=A4hnle?= Date: Wed, 28 Jun 2017 17:50:19 +0200 Subject: [PATCH] gallium: move loading of drirc to pipe-loader MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit v2: rebase compile fix: addition of mesa_no_error Reviewed-by: Marek Olšák (v1) --- .../auxiliary/pipe-loader/pipe_loader.c | 29 +++++++++++++ .../auxiliary/pipe-loader/pipe_loader.h | 14 +++++++ .../auxiliary/pipe-loader/pipe_loader_drm.c | 3 +- .../auxiliary/pipe-loader/pipe_loader_priv.h | 11 +++++ .../auxiliary/pipe-loader/pipe_loader_sw.c | 3 +- src/gallium/state_trackers/dri/dri2.c | 18 ++++---- src/gallium/state_trackers/dri/dri_context.c | 5 ++- src/gallium/state_trackers/dri/dri_screen.c | 41 ++++--------------- src/gallium/state_trackers/dri/dri_screen.h | 10 +---- src/gallium/state_trackers/dri/drisw.c | 2 +- 10 files changed, 77 insertions(+), 59 deletions(-) diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader.c b/src/gallium/auxiliary/pipe-loader/pipe_loader.c index bb65be15289..95e6b42cf71 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 d24480dfd91..a4502ae2586 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; }; /** @@ -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. * diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c index 385d8145223..193c8ddff2f 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 7708455d949..37219fb8941 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 3c8e0c2d523..696ba2c5338 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 ab85cc2452e..0f71adc7689 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -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); diff --git a/src/gallium/state_trackers/dri/dri_context.c b/src/gallium/state_trackers/dri/dri_context.c index 8c3797e4285..8b9323faa4f 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 @@ -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) { diff --git a/src/gallium/state_trackers/dri/dri_screen.c b/src/gallium/state_trackers/dri/dri_screen.c index 79d7282b511..1fa0347d644 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"); @@ -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; diff --git a/src/gallium/state_trackers/dri/dri_screen.h b/src/gallium/state_trackers/dri/dri_screen.h index 383e762393e..b8b27c30222 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 10d1c8d1e4d..d064bb0d4a3 100644 --- a/src/gallium/state_trackers/dri/drisw.c +++ b/src/gallium/state_trackers/dri/drisw.c @@ -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); -- 2.30.2