[Mesa-dev] [PATCH 00/16]: Allow Gallium drivers to support driver-specific drirc options

Nicolai Hähnle nhaehnle at gmail.com
Fri Jun 30 12:45:41 UTC 2017


From: Nicolai Hähnle <nicolai.haehnle at amd.com>

Hi all,

This is a big change to the drirc/xmlconfig framework, mostly on the
Gallium side.

The non-Gallium changes are:
- xmlconfig is moved to src/util to better reflect how it is used going
  forward
- some glx/dri glue code


Problem Statement
-----------------
We want to allow Gallium drivers to define and use their own drirc
configuration options. This allows us to provide some more opportunities
for performance tuning.

This involves making the xmlconfig functions available to the Gallium
drivers, but also allowing them to specify their own option definitions.

There are two related types of XML in the drirc/xmlconfig framework:
- the driconf XML is stored in the drirc file and contains settings
- the driinfo XML describes available options and default values;
  it is used inside the driver during drirc parsing, and is also
  exported and used by the DriConf GUI (via the xdriinfo app)

(The DriConf GUI tool has issues, but the fundamental principle of how it
interacts with Mesa is sound, so this series doesn't change that.)


Additional Goals
----------------
1. Allow non-OpenGL state trackers to define their own config options.
   In particular, Nine should be easy to hook up after this series.
2. The full driinfo XML for the driver and all supported state trackers
   should be provided by glXGetDriverConfig (and hence xdriinfo).
3. Ensure consistent initialization of driver options in radeonsi. Since
   radeonsi has only a single pipe_screen per process and device, this
   means that the config must be loaded e.g. when some video state tracker
   initializes before OpenGL.
4. Make adding new options painless both for the state tracker and for the
   driver.
5. Parse the drirc XML only once per process in the normal case.
6. Store only one copy of the driinfo XML per driver.


Solution
--------
1. The driinfo XML is optionally specified by the pipe driver, by means
   of the drm_driver_descriptor, via a DRM_CONF_XML_OPTIONS query.
   If the pipe driver doesn't specify it, the pipe loader provides the
   default.
2. Parse the drirc XML in the pipe_loader and make the result available to
   both the driver and the state tracker.
3. Add a tool that merges DRI_CONF_xxx macro definition groups at build time,
   so that we don't have redundant definitions of state-tracker options.
4. Define a v2 of the DRI_ConfigOptions extension that allows us to forward
   the driver-specific driinfo XML.

Patches 1-5 are the non-Gallium parts.

Patches 6-14 prepare the pipe loader and related infrastructure.

Patches 15-16 setup the custom driinfo XML for radeonsi and add a first
driver-specific config option.

I iterated over the design a couple of times and am now fairly happy with
it. One thing that's bound to be messy is the build system changes.
The Android.mk and SCons changes are basically best guesses. If anybody
wants to try the series, especially for build failures, please do. You can
get it here: https://cgit.freedesktop.org/~nh/mesa/log/?h=driconf

Please review!
Thanks,
Nicolai
--
 configure.ac                                       |   2 +-
 include/GL/internal/dri_interface.h                |  20 +-
 src/gallium/Automake.inc                           |   2 +
 src/gallium/auxiliary/pipe-loader/Makefile.am      |   1 +
 src/gallium/auxiliary/pipe-loader/Makefile.sources |   3 +-
 .../auxiliary/pipe-loader/driinfo_gallium.h        |  34 ++++
 src/gallium/auxiliary/pipe-loader/pipe_loader.c    |  61 +++++-
 src/gallium/auxiliary/pipe-loader/pipe_loader.h    |  37 +++-
 .../auxiliary/pipe-loader/pipe_loader_drm.c        | 130 ++++++------
 .../auxiliary/pipe-loader/pipe_loader_priv.h       |  17 +-
 src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c |   5 +-
 src/gallium/auxiliary/target-helpers/drm_helper.h  | 106 +++++++---
 .../auxiliary/target-helpers/drm_helper_public.h   |  34 ++--
 src/gallium/auxiliary/vl/vl_winsys_dri.c           |   2 +-
 src/gallium/auxiliary/vl/vl_winsys_dri3.c          |   2 +-
 src/gallium/auxiliary/vl/vl_winsys_drm.c           |   2 +-
 src/gallium/drivers/r300/r300_public.h             |   4 +-
 src/gallium/drivers/r300/r300_screen.c             |   3 +-
 src/gallium/drivers/r600/r600_pipe.c               |   5 +-
 src/gallium/drivers/r600/r600_public.h             |   4 +-
 src/gallium/drivers/radeonsi/Makefile.am           |  13 ++
 src/gallium/drivers/radeonsi/Makefile.sources      |   4 +
 src/gallium/drivers/radeonsi/driinfo_radeonsi.h    |   4 +
 src/gallium/drivers/radeonsi/si_pipe.c             |   8 +-
 src/gallium/drivers/radeonsi/si_public.h           |   2 +-
 src/gallium/include/pipe/p_screen.h                |  10 +
 src/gallium/include/state_tracker/drm_driver.h     |   6 +-
 src/gallium/state_trackers/clover/core/device.cpp  |   2 +-
 src/gallium/state_trackers/dri/Makefile.am         |   2 +-
 src/gallium/state_trackers/dri/dri2.c              |  28 +--
 src/gallium/state_trackers/dri/dri_context.c       |   3 +-
 src/gallium/state_trackers/dri/dri_screen.c        |  83 +-------
 src/gallium/state_trackers/dri/dri_screen.h        |  10 +-
 src/gallium/state_trackers/dri/drisw.c             |   6 +-
 src/gallium/state_trackers/xa/xa_tracker.c         |   2 +-
 src/gallium/targets/d3dadapter9/Makefile.am        |   1 -
 src/gallium/targets/d3dadapter9/drm.c              |   8 +-
 src/gallium/targets/pipe-loader/Makefile.am        |   1 +
 src/gallium/targets/pipe-loader/pipe_i915.c        |   2 +-
 src/gallium/targets/pipe-loader/pipe_msm.c         |   2 +-
 src/gallium/targets/pipe-loader/pipe_nouveau.c     |   2 +-
 src/gallium/targets/pipe-loader/pipe_r300.c        |   2 +-
 src/gallium/targets/pipe-loader/pipe_r600.c        |   2 +-
 src/gallium/targets/pipe-loader/pipe_radeonsi.c    |  11 +-
 src/gallium/targets/pipe-loader/pipe_vmwgfx.c      |   2 +-
 src/gallium/tests/trivial/compute.c                |   2 +-
 src/gallium/tests/trivial/quad-tex.c               |   2 +-
 src/gallium/tests/trivial/tri.c                    |   2 +-
 src/gallium/winsys/amdgpu/drm/amdgpu_public.h      |   5 +-
 src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c      |   4 +-
 src/gallium/winsys/radeon/drm/radeon_drm_public.h  |   5 +-
 src/gallium/winsys/radeon/drm/radeon_drm_winsys.c  |   4 +-
 src/glx/dri_glx.c                                  | 113 +++++++++--
 src/loader/Makefile.am                             |   4 +-
 src/loader/loader.c                                |   4 +-
 src/mesa/drivers/SConscript                        |   1 -
 src/mesa/drivers/dri/Makefile.am                   |   2 +-
 src/mesa/drivers/dri/common/Android.mk             |  48 +----
 src/mesa/drivers/dri/common/Makefile.am            |  12 +-
 src/mesa/drivers/dri/common/Makefile.sources       |   4 -
 src/mesa/drivers/dri/common/SConscript             |   7 +-
 src/mesa/drivers/dri/common/dri_util.c             |   2 +-
 src/mesa/drivers/dri/common/dri_util.h             |   2 +-
 src/mesa/drivers/dri/i915/Makefile.am              |   2 +-
 src/mesa/drivers/dri/i915/intel_screen.c           |   2 +-
 src/mesa/drivers/dri/i915/intel_screen.h           |   2 +-
 src/mesa/drivers/dri/i965/Makefile.am              |   2 +-
 src/mesa/drivers/dri/i965/intel_screen.c           |   2 +-
 src/mesa/drivers/dri/i965/intel_screen.h           |   2 +-
 src/mesa/drivers/dri/r200/Makefile.am              |   2 +-
 src/mesa/drivers/dri/r200/r200_context.c           |   2 +-
 src/mesa/drivers/dri/r200/r200_state_init.c        |   2 +-
 src/mesa/drivers/dri/r200/r200_tex.c               |   2 +-
 src/mesa/drivers/dri/radeon/Makefile.am            |   2 +-
 .../drivers/dri/radeon/radeon_common_context.c     |   2 +-
 src/mesa/drivers/dri/radeon/radeon_context.c       |   2 +-
 src/mesa/drivers/dri/radeon/radeon_screen.c        |   2 +-
 src/mesa/drivers/dri/radeon/radeon_screen.h        |   2 +-
 src/mesa/drivers/dri/radeon/radeon_state_init.c    |   2 +-
 src/mesa/drivers/dri/radeon/radeon_tex.c           |   2 +-
 src/mesa/drivers/dri/radeon/radeon_texture.c       |   2 +-
 src/mesa/drivers/dri/swrast/Makefile.am            |   2 +-
 src/util/Android.mk                                |  47 ++++-
 src/util/Makefile.am                               |  20 +-
 src/util/Makefile.sources                          |   4 +
 src/util/SConscript                                |  16 +-
 src/{mesa/drivers/dri/common => util}/drirc        |   0
 src/util/merge_driinfo.py                          | 222 +++++++++++++++++++++
 src/{mesa/drivers/dri/common => util}/xmlconfig.c  |  10 +-
 src/{mesa/drivers/dri/common => util}/xmlconfig.h  |   0
 src/{mesa/drivers/dri/common => util}/xmlpool.h    |   0
 .../drivers/dri/common => util}/xmlpool/.gitignore |   0
 .../dri/common => util}/xmlpool/Makefile.am        |   0
 .../drivers/dri/common => util}/xmlpool/SConscript |   0
 .../drivers/dri/common => util}/xmlpool/ca.po      |   0
 .../drivers/dri/common => util}/xmlpool/de.po      |   0
 .../drivers/dri/common => util}/xmlpool/es.po      |   0
 .../drivers/dri/common => util}/xmlpool/fr.po      |   0
 .../dri/common => util}/xmlpool/gen_xmlpool.py     |   0
 .../drivers/dri/common => util}/xmlpool/nl.po      |   0
 .../drivers/dri/common => util}/xmlpool/sv.po      |   0
 .../dri/common => util}/xmlpool/t_options.h        |   9 +
 102 files changed, 907 insertions(+), 372 deletions(-)
 create mode 100644 src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
 create mode 100644 src/gallium/drivers/radeonsi/driinfo_radeonsi.h
 rename src/{mesa/drivers/dri/common => util}/drirc (100%)
 create mode 100644 src/util/merge_driinfo.py
 rename src/{mesa/drivers/dri/common => util}/xmlconfig.c (99%)
 rename src/{mesa/drivers/dri/common => util}/xmlconfig.h (100%)
 rename src/{mesa/drivers/dri/common => util}/xmlpool.h (100%)
 rename src/{mesa/drivers/dri/common => util}/xmlpool/.gitignore (100%)
 rename src/{mesa/drivers/dri/common => util}/xmlpool/Makefile.am (100%)
 rename src/{mesa/drivers/dri/common => util}/xmlpool/SConscript (100%)
 rename src/{mesa/drivers/dri/common => util}/xmlpool/ca.po (100%)
 rename src/{mesa/drivers/dri/common => util}/xmlpool/de.po (100%)
 rename src/{mesa/drivers/dri/common => util}/xmlpool/es.po (100%)
 rename src/{mesa/drivers/dri/common => util}/xmlpool/fr.po (100%)
 rename src/{mesa/drivers/dri/common => util}/xmlpool/gen_xmlpool.py (100%)
 rename src/{mesa/drivers/dri/common => util}/xmlpool/nl.po (100%)
 rename src/{mesa/drivers/dri/common => util}/xmlpool/sv.po (100%)
 rename src/{mesa/drivers/dri/common => util}/xmlpool/t_options.h (98%)

-- 
2.9.3


More information about the mesa-dev mailing list