[Mesa-dev] [PATCH 02/23] st/dri: Allow separate dri-targets

Emil Velikov emil.l.velikov at gmail.com
Tue Jun 17 11:38:18 PDT 2014


With this commit we add a couple of DEFINES making the ST code
conditional, in a way that we can use it to gradually convert
the dri-targets from separate libraries into a single one.

Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
---
 src/gallium/state_trackers/dri/common/dri_screen.c | 17 +++++++++++++-
 src/gallium/state_trackers/dri/common/dri_screen.h |  3 +++
 src/gallium/state_trackers/dri/drm/Makefile.am     |  6 +++++
 src/gallium/state_trackers/dri/drm/SConscript      |  2 ++
 src/gallium/state_trackers/dri/drm/dri2.c          | 26 +++++++++++++++++++++-
 src/gallium/state_trackers/dri/sw/Makefile.am      |  3 +++
 src/gallium/state_trackers/dri/sw/SConscript       |  1 +
 7 files changed, 56 insertions(+), 2 deletions(-)

diff --git a/src/gallium/state_trackers/dri/common/dri_screen.c b/src/gallium/state_trackers/dri/common/dri_screen.c
index 7a6dcb2..dceb628 100644
--- a/src/gallium/state_trackers/dri/common/dri_screen.c
+++ b/src/gallium/state_trackers/dri/common/dri_screen.c
@@ -37,6 +37,7 @@
 #include "util/u_inlines.h"
 #include "pipe/p_screen.h"
 #include "pipe/p_format.h"
+#include "pipe-loader/pipe_loader.h"
 #include "state_tracker/st_gl_api.h" /* for st_gl_api_create */
 #include "state_tracker/drm_driver.h"
 
@@ -387,6 +388,12 @@ dri_destroy_screen(__DRIscreen * sPriv)
 
    dri_destroy_screen_helper(screen);
 
+#if !SPLIT_TARGETS
+#if !GALLIUM_STATIC_TARGETS
+   pipe_loader_release(&screen->dev, 1);
+#endif // !GALLIUM_STATIC_TARGETS
+#endif // !SPLIT_TARGETS
+
    free(screen);
    sPriv->driverPrivate = NULL;
    sPriv->extensions = NULL;
@@ -428,9 +435,17 @@ dri_init_screen_helper(struct dri_screen *screen,
    driParseOptionInfo(&screen->optionCacheDefaults, gallium_config_options.xml);
 
    driParseConfigFiles(&screen->optionCache,
-		       &screen->optionCacheDefaults,
+                       &screen->optionCacheDefaults,
                        screen->sPriv->myNum,
+#if SPLIT_TARGETS
                        driver_descriptor.name);
+#else
+#if GALLIUM_STATIC_TARGETS
+                       dd_driver_name());
+#else
+                       screen->dev->driver_name);
+#endif // GALLIUM_STATIC_TARGETS
+#endif // SPLIT_TARGETS
 
    /* Handle force_s3tc_enable. */
    if (!util_format_s3tc_enabled &&
diff --git a/src/gallium/state_trackers/dri/common/dri_screen.h b/src/gallium/state_trackers/dri/common/dri_screen.h
index 7c8e582..2d07f51 100644
--- a/src/gallium/state_trackers/dri/common/dri_screen.h
+++ b/src/gallium/state_trackers/dri/common/dri_screen.h
@@ -43,6 +43,7 @@
 
 struct dri_context;
 struct dri_drawable;
+struct pipe_loader_device;
 
 struct dri_screen
 {
@@ -70,6 +71,8 @@ struct dri_screen
    /* drm */
    int fd;
 
+   struct pipe_loader_device *dev;
+
    /* gallium */
    boolean d_depth_bits_last;
    boolean sd_depth_bits_last;
diff --git a/src/gallium/state_trackers/dri/drm/Makefile.am b/src/gallium/state_trackers/dri/drm/Makefile.am
index f41f45d..a348f65 100644
--- a/src/gallium/state_trackers/dri/drm/Makefile.am
+++ b/src/gallium/state_trackers/dri/drm/Makefile.am
@@ -24,6 +24,8 @@ include Makefile.sources
 include $(top_srcdir)/src/gallium/Automake.inc
 
 AM_CPPFLAGS = \
+	$(GALLIUM_PIPE_LOADER_DEFINES) \
+	-DPIPE_SEARCH_DIR=\"$(libdir)/gallium-pipe\" \
 	-I$(top_srcdir)/include \
 	-I$(top_srcdir)/src/mapi \
 	-I$(top_srcdir)/src/mesa \
@@ -36,4 +38,8 @@ AM_CPPFLAGS = \
 
 noinst_LTLIBRARIES = libdridrm.la
 
+libdridrm_la_CPPFLAGS = \
+	$(AM_CPPFLAGS) \
+	-DSPLIT_TARGETS=1
+
 libdridrm_la_SOURCES = $(C_SOURCES)
diff --git a/src/gallium/state_trackers/dri/drm/SConscript b/src/gallium/state_trackers/dri/drm/SConscript
index 07eaa0a..258f7ee 100644
--- a/src/gallium/state_trackers/dri/drm/SConscript
+++ b/src/gallium/state_trackers/dri/drm/SConscript
@@ -15,6 +15,8 @@ env.Append(CPPPATH = [
     xmlpool_options.dir.dir, # Dir to generated xmlpool/options.h
 ])
 
+env.Append(CPPDEFINES = [('SPLIT_TARGETS', '1')])
+
 st_dri = env.ConvenienceLibrary(
     target = 'st_dri',
     source = env.ParseSourceList('Makefile.sources', 'C_SOURCES')
diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
index 7dccc5e..03fdf69 100644
--- a/src/gallium/state_trackers/dri/drm/dri2.c
+++ b/src/gallium/state_trackers/dri/drm/dri2.c
@@ -36,6 +36,7 @@
 #include "state_tracker/drm_driver.h"
 #include "state_tracker/st_texture.h"
 #include "state_tracker/st_context.h"
+#include "pipe-loader/pipe_loader.h"
 #include "main/texobj.h"
 
 #include "dri_screen.h"
@@ -1075,7 +1076,7 @@ dri2_init_screen(__DRIscreen * sPriv)
 {
    const __DRIconfig **configs;
    struct dri_screen *screen;
-   struct pipe_screen *pscreen;
+   struct pipe_screen *pscreen = NULL;
    const struct drm_conf_ret *throttle_ret = NULL;
    const struct drm_conf_ret *dmabuf_ret = NULL;
 
@@ -1088,12 +1089,29 @@ dri2_init_screen(__DRIscreen * sPriv)
 
    sPriv->driverPrivate = (void *)screen;
 
+#if SPLIT_TARGETS
    pscreen = driver_descriptor.create_screen(screen->fd);
    if (driver_descriptor.configuration) {
       throttle_ret = driver_descriptor.configuration(DRM_CONF_THROTTLE);
       dmabuf_ret = driver_descriptor.configuration(DRM_CONF_SHARE_FD);
    }
 
+#else
+#if GALLIUM_STATIC_TARGETS
+   pscreen = dd_create_screen(screen->fd);
+
+   throttle_ret = dd_configuration(DRM_CONF_THROTTLE);
+   dmabuf_ret = dd_configuration(DRM_CONF_SHARE_FD);
+#else
+   if (pipe_loader_drm_probe_fd(&screen->dev, screen->fd, true)) {
+      pscreen = pipe_loader_create_screen(screen->dev, PIPE_SEARCH_DIR);
+
+      throttle_ret = pipe_loader_configuration(screen->dev, DRM_CONF_THROTTLE);
+      dmabuf_ret = pipe_loader_configuration(screen->dev, DRM_CONF_SHARE_FD);
+   }
+#endif // GALLIUM_STATIC_TARGETS
+#endif // SPLIT_TARGETS
+
    if (throttle_ret && throttle_ret->val.val_int != -1) {
       screen->throttling_enabled = TRUE;
       screen->default_throttle_frames = throttle_ret->val.val_int;
@@ -1126,6 +1144,12 @@ dri2_init_screen(__DRIscreen * sPriv)
    return configs;
 fail:
    dri_destroy_screen_helper(screen);
+#if !SPLIT_TARGETS
+#if !GALLIUM_STATIC_TARGETS
+   if (screen->dev)
+      pipe_loader_release(&screen->dev, 1);
+#endif // !GALLIUM_STATIC_TARGETS
+#endif // !SPLIT_TARGETS
    FREE(screen);
    return NULL;
 }
diff --git a/src/gallium/state_trackers/dri/sw/Makefile.am b/src/gallium/state_trackers/dri/sw/Makefile.am
index 555ea17..0cebd6d 100644
--- a/src/gallium/state_trackers/dri/sw/Makefile.am
+++ b/src/gallium/state_trackers/dri/sw/Makefile.am
@@ -24,6 +24,9 @@ include Makefile.sources
 include $(top_srcdir)/src/gallium/Automake.inc
 
 AM_CPPFLAGS = \
+	$(GALLIUM_PIPE_LOADER_DEFINES) \
+	-DPIPE_SEARCH_DIR=\"$(libdir)/gallium-pipe\" \
+	-DSPLIT_TARGETS=1 \
 	-I$(top_srcdir)/src/mapi \
 	-I$(top_srcdir)/src/mesa \
 	-I$(top_srcdir)/src/gallium/state_trackers/dri/common \
diff --git a/src/gallium/state_trackers/dri/sw/SConscript b/src/gallium/state_trackers/dri/sw/SConscript
index 6d482a5..5a71b22 100644
--- a/src/gallium/state_trackers/dri/sw/SConscript
+++ b/src/gallium/state_trackers/dri/sw/SConscript
@@ -14,6 +14,7 @@ env.Append(CPPPATH = [
 ])
 
 env.Append(CPPDEFINES = [('__NOT_HAVE_DRM_H', '1')])
+env.Append(CPPDEFINES = [('SPLIT_TARGETS', '1')])
 
 st_drisw = env.ConvenienceLibrary(
     target = 'st_drisw',
-- 
2.0.0



More information about the mesa-dev mailing list