[Mesa-dev] [PATCH 08/11] dri, i965: Add an extension for sharing the drm bufmgr

Ander Conselvan de Oliveira conselvan2 at gmail.com
Tue Apr 8 13:28:45 PDT 2014


From: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>

If the fd used by the DRI driver is going to be shared with something
else, like gbm, this lets the loader pass the bufmgr struct so it is
shared too.
---
 include/GL/internal/dri_interface.h      | 11 +++++++++++
 src/egl/drivers/dri2/egl_dri2.h          |  3 ++-
 src/mesa/drivers/dri/common/dri_util.c   |  2 ++
 src/mesa/drivers/dri/common/dri_util.h   |  1 +
 src/mesa/drivers/dri/i965/intel_screen.c |  9 +++++++--
 5 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
index d028d05..6c2312a 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -1424,4 +1424,15 @@ struct __DRIimageDriverExtensionRec {
    __DRIgetAPIMaskFunc                  getAPIMask;
 };
 
+/**
+ * Allows the DRI screen to share a low-level (drm) bufmgr with gbm.
+ */
+#define __DRI_SHARED_BUFMGR "DRI_SHARED_BUFMGR"
+#define __DRI_SHARED_BUFMGR_VERSION 1
+
+typedef struct __DRIsharedBufmgrExtensionRec {
+   __DRIextension base;
+   void *bufmgr;
+} __DRIsharedBufmgrExtension;
+
 #endif
diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
index 990b246..7c19f5e 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -175,7 +175,8 @@ struct dri2_egl_display
 
    __DRIdri2LoaderExtension    dri2_loader_extension;
    __DRIswrastLoaderExtension  swrast_loader_extension;
-   const __DRIextension     *extensions[5];
+   __DRIsharedBufmgrExtension  shared_bufmgr_extension;
+   const __DRIextension     *extensions[6];
    const __DRIextension    **driver_extensions;
 
 #ifdef HAVE_X11_PLATFORM
diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
index aed73c7..3046d60 100644
--- a/src/mesa/drivers/dri/common/dri_util.c
+++ b/src/mesa/drivers/dri/common/dri_util.c
@@ -81,6 +81,8 @@ setupLoaderExtensions(__DRIscreen *psp,
 	    psp->swrast_loader = (__DRIswrastLoaderExtension *) extensions[i];
         if (strcmp(extensions[i]->name, __DRI_IMAGE_LOADER) == 0)
            psp->image.loader = (__DRIimageLoaderExtension *) extensions[i];
+	if (strcmp(extensions[i]->name, __DRI_SHARED_BUFMGR) == 0)
+	    psp->dri2.bufmgr = (__DRIsharedBufmgrExtension *) extensions[i];
     }
 }
 
diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h
index a37a0bb..49c380c 100644
--- a/src/mesa/drivers/dri/common/dri_util.h
+++ b/src/mesa/drivers/dri/common/dri_util.h
@@ -177,6 +177,7 @@ struct __DRIscreenRec {
 	__DRIdri2LoaderExtension *loader;
 	__DRIimageLookupExtension *image;
 	__DRIuseInvalidateExtension *useInvalidate;
+	__DRIsharedBufmgrExtension *bufmgr;
     } dri2;
 
     struct {
diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
index 8cb1260..8ffbf17 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -952,8 +952,10 @@ static void
 intelDestroyScreen(__DRIscreen * sPriv)
 {
    struct intel_screen *intelScreen = sPriv->driverPrivate;
+   __DRIscreen *spriv = intelScreen->driScrnPriv;
 
-   dri_bufmgr_destroy(intelScreen->bufmgr);
+   if (!spriv->dri2.bufmgr)
+      dri_bufmgr_destroy(intelScreen->bufmgr);
    driDestroyOptionInfo(&intelScreen->optionCache);
 
    ralloc_free(intelScreen);
@@ -1074,7 +1076,10 @@ intel_init_bufmgr(struct intel_screen *intelScreen)
 
    intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL;
 
-   intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ);
+   if (spriv->dri2.bufmgr)
+      intelScreen->bufmgr = spriv->dri2.bufmgr->bufmgr;
+   else
+      intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ);
    if (intelScreen->bufmgr == NULL) {
       fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n",
 	      __func__, __LINE__);
-- 
1.8.3.2



More information about the mesa-dev mailing list