Blame SOURCES/0007-modesetting-Indirect-the-glamor-API-through-LoaderSy.patch

55d6a0
From 94612044171975466f605d5f01769d1c2b9acc5d Mon Sep 17 00:00:00 2001
55d6a0
From: Adam Jackson <ajax@redhat.com>
55d6a0
Date: Tue, 8 Oct 2019 13:11:09 -0400
55d6a0
Subject: [PATCH xserver 07/11] modesetting: Indirect the glamor API through
55d6a0
 LoaderSymbol
55d6a0
55d6a0
Prerequisite for building all of xserver with -z now.
55d6a0
55d6a0
Gitlab: https://gitlab.freedesktop.org/xorg/xserver/issues/692
55d6a0
(cherry picked from commit dd63f717fe8636315343f421f4f2ee299258f079)
55d6a0
---
55d6a0
 hw/xfree86/drivers/modesetting/dri2.c         | 10 ++--
55d6a0
 hw/xfree86/drivers/modesetting/driver.c       | 49 ++++++++++++++-----
55d6a0
 hw/xfree86/drivers/modesetting/driver.h       | 24 +++++++++
55d6a0
 .../drivers/modesetting/drmmode_display.c     | 17 ++++---
55d6a0
 hw/xfree86/drivers/modesetting/pageflip.c     |  4 +-
55d6a0
 hw/xfree86/drivers/modesetting/present.c      |  4 +-
55d6a0
 6 files changed, 82 insertions(+), 26 deletions(-)
55d6a0
55d6a0
diff --git a/hw/xfree86/drivers/modesetting/dri2.c b/hw/xfree86/drivers/modesetting/dri2.c
55d6a0
index d89904b53..724d9d34c 100644
55d6a0
--- a/hw/xfree86/drivers/modesetting/dri2.c
55d6a0
+++ b/hw/xfree86/drivers/modesetting/dri2.c
55d6a0
@@ -123,6 +123,7 @@ ms_dri2_create_buffer2(ScreenPtr screen, DrawablePtr drawable,
55d6a0
                        unsigned int attachment, unsigned int format)
55d6a0
 {
55d6a0
     ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
55d6a0
+    modesettingPtr ms = modesettingPTR(scrn);
55d6a0
     DRI2Buffer2Ptr buffer;
55d6a0
     PixmapPtr pixmap;
55d6a0
     CARD32 size;
55d6a0
@@ -200,7 +201,7 @@ ms_dri2_create_buffer2(ScreenPtr screen, DrawablePtr drawable,
55d6a0
      */
55d6a0
     buffer->flags = 0;
55d6a0
 
55d6a0
-    buffer->name = glamor_name_from_pixmap(pixmap, &pitch, &size);
55d6a0
+    buffer->name = ms->glamor.name_from_pixmap(pixmap, &pitch, &size);
55d6a0
     buffer->pitch = pitch;
55d6a0
     if (buffer->name == -1) {
55d6a0
         xf86DrvMsg(scrn->scrnIndex, X_ERROR,
55d6a0
@@ -509,11 +510,12 @@ update_front(DrawablePtr draw, DRI2BufferPtr front)
55d6a0
     ScreenPtr screen = draw->pScreen;
55d6a0
     PixmapPtr pixmap = get_drawable_pixmap(draw);
55d6a0
     ms_dri2_buffer_private_ptr priv = front->driverPrivate;
55d6a0
+    modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(screen));
55d6a0
     CARD32 size;
55d6a0
     CARD16 pitch;
55d6a0
     int name;
55d6a0
 
55d6a0
-    name = glamor_name_from_pixmap(pixmap, &pitch, &size);
55d6a0
+    name = ms->glamor.name_from_pixmap(pixmap, &pitch, &size);
55d6a0
     if (name < 0)
55d6a0
         return FALSE;
55d6a0
 
55d6a0
@@ -617,7 +619,7 @@ ms_dri2_exchange_buffers(DrawablePtr draw, DRI2BufferPtr front,
55d6a0
     *front_pix = *back_pix;
55d6a0
     *back_pix = tmp_pix;
55d6a0
 
55d6a0
-    glamor_egl_exchange_buffers(front_priv->pixmap, back_priv->pixmap);
55d6a0
+    ms->glamor.egl_exchange_buffers(front_priv->pixmap, back_priv->pixmap);
55d6a0
 
55d6a0
     /* Post damage on the front buffer so that listeners, such
55d6a0
      * as DisplayLink know take a copy and shove it over the USB.
55d6a0
@@ -1036,7 +1038,7 @@ ms_dri2_screen_init(ScreenPtr screen)
55d6a0
     DRI2InfoRec info;
55d6a0
     const char *driver_names[2] = { NULL, NULL };
55d6a0
 
55d6a0
-    if (!glamor_supports_pixmap_import_export(screen)) {
55d6a0
+    if (!ms->glamor.supports_pixmap_import_export(screen)) {
55d6a0
         xf86DrvMsg(scrn->scrnIndex, X_WARNING,
55d6a0
                    "DRI2: glamor lacks support for pixmap import/export\n");
55d6a0
     }
55d6a0
diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
55d6a0
index a385e7ee2..4f4db67b7 100644
55d6a0
--- a/hw/xfree86/drivers/modesetting/driver.c
55d6a0
+++ b/hw/xfree86/drivers/modesetting/driver.c
55d6a0
@@ -615,7 +615,7 @@ redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty, int *timeout)
55d6a0
          * the shared pixmap, but not all).
55d6a0
          */
55d6a0
         if (ms->drmmode.glamor)
55d6a0
-            glamor_finish(screen);
55d6a0
+            ms->glamor.finish(screen);
55d6a0
 #endif
55d6a0
         /* Ensure the slave processes the damage immediately */
55d6a0
         if (timeout)
55d6a0
@@ -743,6 +743,26 @@ FreeRec(ScrnInfoPtr pScrn)
55d6a0
 
55d6a0
 }
55d6a0
 
55d6a0
+static void
55d6a0
+bind_glamor_api(void *mod, modesettingPtr ms)
55d6a0
+{
55d6a0
+    ms->glamor.back_pixmap_from_fd = LoaderSymbolFromModule(mod, "glamor_back_pixmap_from_fd");
55d6a0
+    ms->glamor.block_handler = LoaderSymbolFromModule(mod, "glamor_block_handler");
55d6a0
+    ms->glamor.egl_create_textured_pixmap = LoaderSymbolFromModule(mod, "glamor_egl_create_textured_pixmap");
55d6a0
+    ms->glamor.egl_create_textured_pixmap_from_gbm_bo = LoaderSymbolFromModule(mod, "glamor_egl_create_textured_pixmap_from_gbm_bo");
55d6a0
+    ms->glamor.egl_exchange_buffers = LoaderSymbolFromModule(mod, "glamor_egl_exchange_buffers");
55d6a0
+    ms->glamor.egl_get_gbm_device = LoaderSymbolFromModule(mod, "glamor_egl_get_gbm_device");
55d6a0
+    ms->glamor.egl_init = LoaderSymbolFromModule(mod, "glamor_egl_init");
55d6a0
+    ms->glamor.finish = LoaderSymbolFromModule(mod, "glamor_finish");
55d6a0
+    ms->glamor.gbm_bo_from_pixmap = LoaderSymbolFromModule(mod, "glamor_gbm_bo_from_pixmap");
55d6a0
+    ms->glamor.init = LoaderSymbolFromModule(mod, "glamor_init");
55d6a0
+    ms->glamor.name_from_pixmap = LoaderSymbolFromModule(mod, "glamor_name_from_pixmap");
55d6a0
+    ms->glamor.set_drawable_modifiers_func = LoaderSymbolFromModule(mod, "glamor_set_drawable_modifiers_func");
55d6a0
+    ms->glamor.shareable_fd_from_pixmap = LoaderSymbolFromModule(mod, "glamor_shareable_fd_from_pixmap");
55d6a0
+    ms->glamor.supports_pixmap_import_export = LoaderSymbolFromModule(mod, "glamor_supports_pixmap_import_export");
55d6a0
+    ms->glamor.xv_init = LoaderSymbolFromModule(mod, "glamor_xv_init");
55d6a0
+}
55d6a0
+
55d6a0
 static void
55d6a0
 try_enable_glamor(ScrnInfoPtr pScrn)
55d6a0
 {
55d6a0
@@ -751,6 +771,7 @@ try_enable_glamor(ScrnInfoPtr pScrn)
55d6a0
                                                        OPTION_ACCEL_METHOD);
55d6a0
     Bool do_glamor = (!accel_method_str ||
55d6a0
                       strcmp(accel_method_str, "glamor") == 0);
55d6a0
+    void *mod;
55d6a0
 
55d6a0
     ms->drmmode.glamor = FALSE;
55d6a0
 
55d6a0
@@ -765,8 +786,10 @@ try_enable_glamor(ScrnInfoPtr pScrn)
55d6a0
         return;
55d6a0
     }
55d6a0
 
55d6a0
-    if (xf86LoadSubModule(pScrn, GLAMOR_EGL_MODULE_NAME)) {
55d6a0
-        if (glamor_egl_init(pScrn, ms->fd)) {
55d6a0
+    mod = xf86LoadSubModule(pScrn, GLAMOR_EGL_MODULE_NAME);
55d6a0
+    if (mod) {
55d6a0
+        bind_glamor_api(mod, ms);
55d6a0
+        if (ms->glamor.egl_init(pScrn, ms->fd)) {
55d6a0
             xf86DrvMsg(pScrn->scrnIndex, X_INFO, "glamor initialized\n");
55d6a0
             ms->drmmode.glamor = TRUE;
55d6a0
         } else {
55d6a0
@@ -1424,11 +1447,12 @@ static Bool
55d6a0
 msSharePixmapBacking(PixmapPtr ppix, ScreenPtr screen, void **handle)
55d6a0
 {
55d6a0
 #ifdef GLAMOR_HAS_GBM
55d6a0
+    modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(screen));
55d6a0
     int ret;
55d6a0
     CARD16 stride;
55d6a0
     CARD32 size;
55d6a0
-    ret = glamor_shareable_fd_from_pixmap(ppix->drawable.pScreen, ppix,
55d6a0
-                                          &stride, &size);
55d6a0
+    ret = ms->glamor.shareable_fd_from_pixmap(ppix->drawable.pScreen, ppix,
55d6a0
+                                              &stride, &size);
55d6a0
     if (ret == -1)
55d6a0
         return FALSE;
55d6a0
 
55d6a0
@@ -1453,11 +1477,12 @@ msSetSharedPixmapBacking(PixmapPtr ppix, void *fd_handle)
55d6a0
            return drmmode_SetSlaveBO(ppix, &ms->drmmode, ihandle, 0, 0);
55d6a0
 
55d6a0
     if (ms->drmmode.reverse_prime_offload_mode) {
55d6a0
-        ret = glamor_back_pixmap_from_fd(ppix, ihandle,
55d6a0
-                                         ppix->drawable.width,
55d6a0
-                                         ppix->drawable.height,
55d6a0
-                                         ppix->devKind, ppix->drawable.depth,
55d6a0
-                                         ppix->drawable.bitsPerPixel);
55d6a0
+        ret = ms->glamor.back_pixmap_from_fd(ppix, ihandle,
55d6a0
+                                             ppix->drawable.width,
55d6a0
+                                             ppix->drawable.height,
55d6a0
+                                             ppix->devKind,
55d6a0
+                                             ppix->drawable.depth,
55d6a0
+                                             ppix->drawable.bitsPerPixel);
55d6a0
     } else {
55d6a0
         int size = ppix->devKind * ppix->drawable.height;
55d6a0
         ret = drmmode_SetSlaveBO(ppix, &ms->drmmode, ihandle, ppix->devKind, size);
55d6a0
@@ -1574,7 +1599,7 @@ ScreenInit(ScreenPtr pScreen, int argc, char **argv)
55d6a0
 
55d6a0
 #ifdef GLAMOR_HAS_GBM
55d6a0
     if (ms->drmmode.glamor)
55d6a0
-        ms->drmmode.gbm = glamor_egl_get_gbm_device(pScreen);
55d6a0
+        ms->drmmode.gbm = ms->glamor.egl_get_gbm_device(pScreen);
55d6a0
 #endif
55d6a0
 
55d6a0
     /* HW dependent - FIXME */
55d6a0
@@ -1718,7 +1743,7 @@ ScreenInit(ScreenPtr pScreen, int argc, char **argv)
55d6a0
     if (ms->drmmode.glamor) {
55d6a0
         XF86VideoAdaptorPtr     glamor_adaptor;
55d6a0
 
55d6a0
-        glamor_adaptor = glamor_xv_init(pScreen, 16);
55d6a0
+        glamor_adaptor = ms->glamor.xv_init(pScreen, 16);
55d6a0
         if (glamor_adaptor != NULL)
55d6a0
             xf86XVScreenInit(pScreen, &glamor_adaptor, 1);
55d6a0
         else
55d6a0
diff --git a/hw/xfree86/drivers/modesetting/driver.h b/hw/xfree86/drivers/modesetting/driver.h
55d6a0
index 394a20fc1..5e4d2509a 100644
55d6a0
--- a/hw/xfree86/drivers/modesetting/driver.h
55d6a0
+++ b/hw/xfree86/drivers/modesetting/driver.h
55d6a0
@@ -132,6 +132,30 @@ typedef struct _modesettingRec {
55d6a0
         void (*UpdatePacked)(ScreenPtr, shadowBufPtr);
55d6a0
     } shadow;
55d6a0
 
55d6a0
+    /* glamor API */
55d6a0
+    struct {
55d6a0
+        Bool (*back_pixmap_from_fd)(PixmapPtr, int, CARD16, CARD16, CARD16,
55d6a0
+                                    CARD8, CARD8);
55d6a0
+        void (*block_handler)(ScreenPtr);
55d6a0
+        Bool (*egl_create_textured_pixmap)(PixmapPtr, int, int);
55d6a0
+        Bool (*egl_create_textured_pixmap_from_gbm_bo)(PixmapPtr,
55d6a0
+                                                       struct gbm_bo *,
55d6a0
+                                                       Bool);
55d6a0
+        void (*egl_exchange_buffers)(PixmapPtr, PixmapPtr);
55d6a0
+        struct gbm_device *(*egl_get_gbm_device)(ScreenPtr);
55d6a0
+        Bool (*egl_init)(ScrnInfoPtr, int);
55d6a0
+        void (*finish)(ScreenPtr);
55d6a0
+        struct gbm_bo *(*gbm_bo_from_pixmap)(ScreenPtr, PixmapPtr);
55d6a0
+        Bool (*init)(ScreenPtr, unsigned int);
55d6a0
+        int (*name_from_pixmap)(PixmapPtr, CARD16 *, CARD32 *);
55d6a0
+        void (*set_drawable_modifiers_func)(ScreenPtr,
55d6a0
+                                            GetDrawableModifiersFuncPtr);
55d6a0
+        int (*shareable_fd_from_pixmap)(ScreenPtr, PixmapPtr, CARD16 *,
55d6a0
+                                        CARD32 *);
55d6a0
+        Bool (*supports_pixmap_import_export)(ScreenPtr);
55d6a0
+        XF86VideoAdaptorPtr (*xv_init)(ScreenPtr, int);
55d6a0
+    } glamor;
55d6a0
+
55d6a0
 } modesettingRec, *modesettingPtr;
55d6a0
 
55d6a0
 #define modesettingPTR(p) ((modesettingPtr)((p)->driverPrivate))
55d6a0
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
55d6a0
index 6f5f8caf6..28609db7c 100644
55d6a0
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
55d6a0
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
55d6a0
@@ -770,7 +770,7 @@ drmmode_crtc_set_mode(xf86CrtcPtr crtc, Bool test_only)
55d6a0
 #ifdef GLAMOR_HAS_GBM
55d6a0
     /* Make sure any pending drawing will be visible in a new scanout buffer */
55d6a0
     if (drmmode->glamor)
55d6a0
-        glamor_finish(screen);
55d6a0
+        ms->glamor.finish(screen);
55d6a0
 #endif
55d6a0
 
55d6a0
     if (ms->atomic_modeset) {
55d6a0
@@ -1385,6 +1385,7 @@ create_pixmap_for_fbcon(drmmode_ptr drmmode, ScrnInfoPtr pScrn, int fbcon_id)
55d6a0
     PixmapPtr pixmap = drmmode->fbcon_pixmap;
55d6a0
     drmModeFBPtr fbcon;
55d6a0
     ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
55d6a0
+    modesettingPtr ms = modesettingPTR(pScrn);
55d6a0
     Bool ret;
55d6a0
 
55d6a0
     if (pixmap)
55d6a0
@@ -1405,7 +1406,8 @@ create_pixmap_for_fbcon(drmmode_ptr drmmode, ScrnInfoPtr pScrn, int fbcon_id)
55d6a0
     if (!pixmap)
55d6a0
         goto out_free_fb;
55d6a0
 
55d6a0
-    ret = glamor_egl_create_textured_pixmap(pixmap, fbcon->handle, fbcon->pitch);
55d6a0
+    ret = ms->glamor.egl_create_textured_pixmap(pixmap, fbcon->handle,
55d6a0
+                                                fbcon->pitch);
55d6a0
     if (!ret) {
55d6a0
       FreePixmap(pixmap);
55d6a0
       pixmap = NULL;
55d6a0
@@ -1424,6 +1426,7 @@ drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
55d6a0
 #ifdef GLAMOR_HAS_GBM
55d6a0
     xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
55d6a0
     ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
55d6a0
+    modesettingPtr ms = modesettingPTR(pScrn);
55d6a0
     PixmapPtr src, dst;
55d6a0
     int fbcon_id = 0;
55d6a0
     GCPtr gc;
55d6a0
@@ -3108,12 +3111,13 @@ drmmode_set_pixmap_bo(drmmode_ptr drmmode, PixmapPtr pixmap, drmmode_bo *bo)
55d6a0
 {
55d6a0
 #ifdef GLAMOR_HAS_GBM
55d6a0
     ScrnInfoPtr scrn = drmmode->scrn;
55d6a0
+    modesettingPtr ms = modesettingPTR(scrn);
55d6a0
 
55d6a0
     if (!drmmode->glamor)
55d6a0
         return TRUE;
55d6a0
 
55d6a0
-    if (!glamor_egl_create_textured_pixmap_from_gbm_bo(pixmap, bo->gbm,
55d6a0
-                                                       bo->used_modifiers)) {
55d6a0
+    if (!ms->glamor.egl_create_textured_pixmap_from_gbm_bo(pixmap, bo->gbm,
55d6a0
+                                                           bo->used_modifiers)) {
55d6a0
         xf86DrvMsg(scrn->scrnIndex, X_ERROR, "Failed to create pixmap\n");
55d6a0
         return FALSE;
55d6a0
     }
55d6a0
@@ -3436,13 +3440,14 @@ drmmode_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
55d6a0
 {
55d6a0
 #ifdef GLAMOR_HAS_GBM
55d6a0
     ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
55d6a0
+    modesettingPtr ms = modesettingPTR(pScrn);
55d6a0
 
55d6a0
     if (drmmode->glamor) {
55d6a0
-        if (!glamor_init(pScreen, GLAMOR_USE_EGL_SCREEN)) {
55d6a0
+        if (!ms->glamor.init(pScreen, GLAMOR_USE_EGL_SCREEN)) {
55d6a0
             return FALSE;
55d6a0
         }
55d6a0
 #ifdef GBM_BO_WITH_MODIFIERS
55d6a0
-        glamor_set_drawable_modifiers_func(pScreen, get_drawable_modifiers);
55d6a0
+        ms->glamor.set_drawable_modifiers_func(pScreen, get_drawable_modifiers);
55d6a0
 #endif
55d6a0
     }
55d6a0
 #endif
55d6a0
diff --git a/hw/xfree86/drivers/modesetting/pageflip.c b/hw/xfree86/drivers/modesetting/pageflip.c
55d6a0
index 1d54816e2..841fa917c 100644
55d6a0
--- a/hw/xfree86/drivers/modesetting/pageflip.c
55d6a0
+++ b/hw/xfree86/drivers/modesetting/pageflip.c
55d6a0
@@ -243,9 +243,9 @@ ms_do_pageflip(ScreenPtr screen,
55d6a0
     uint32_t flags;
55d6a0
     int i;
55d6a0
     struct ms_flipdata *flipdata;
55d6a0
-    glamor_block_handler(screen);
55d6a0
+    ms->glamor.block_handler(screen);
55d6a0
 
55d6a0
-    new_front_bo.gbm = glamor_gbm_bo_from_pixmap(screen, new_front);
55d6a0
+    new_front_bo.gbm = ms->glamor.gbm_bo_from_pixmap(screen, new_front);
55d6a0
     new_front_bo.dumb = NULL;
55d6a0
 
55d6a0
     if (!new_front_bo.gbm) {
55d6a0
diff --git a/hw/xfree86/drivers/modesetting/present.c b/hw/xfree86/drivers/modesetting/present.c
55d6a0
index 186309a29..c700cf116 100644
55d6a0
--- a/hw/xfree86/drivers/modesetting/present.c
55d6a0
+++ b/hw/xfree86/drivers/modesetting/present.c
55d6a0
@@ -166,7 +166,7 @@ ms_present_flush(WindowPtr window)
55d6a0
     modesettingPtr ms = modesettingPTR(scrn);
55d6a0
 
55d6a0
     if (ms->drmmode.glamor)
55d6a0
-        glamor_block_handler(screen);
55d6a0
+        ms->glamor.block_handler(screen);
55d6a0
 #endif
55d6a0
 }
55d6a0
 
55d6a0
@@ -262,7 +262,7 @@ ms_present_check_unflip(RRCrtcPtr crtc,
55d6a0
 
55d6a0
 #ifdef GBM_BO_WITH_MODIFIERS
55d6a0
     /* Check if buffer format/modifier is supported by all active CRTCs */
55d6a0
-    gbm = glamor_gbm_bo_from_pixmap(screen, pixmap);
55d6a0
+    gbm = ms->glamor.gbm_bo_from_pixmap(screen, pixmap);
55d6a0
     if (gbm) {
55d6a0
         uint32_t format;
55d6a0
         uint64_t modifier;
55d6a0
-- 
55d6a0
2.33.1
55d6a0