[PATCH v2 xf86-video-dummy] Add glamor acceleration which enables native OpenGL support (v2)

Antoine Martin antoine at nagafix.co.uk
Thu Sep 21 11:42:59 UTC 2017


On 06/08/17 09:46, Yu, Qiang wrote:
> How do you run the xserver?
https://xpra.org/trac/wiki/Xdummy

> And do you have this file
> /dev/dri/renderD128
Yes.

> and right permission to access?
Yes.

As per ajax's reply, I've revised my reasonable-but-invalid expectations.
I'm primarily interested in 3D acceleration for client applications
running on an Xorg server with the dummy driver, whereas this patch set
accelerates the 2D rendering within the X server itself.

Please do keep me CCed on these patch sets, they will get tested - just
not necessarily in a timely manner..

Cheers
Antoine

> 
> Regards,
> Qiang
> ________________________________________
> From: Antoine Martin <antoine at nagafix.co.uk>
> Sent: Saturday, August 5, 2017 8:54:11 PM
> To: xorg-devel at lists.x.org; Yu, Qiang
> Subject: Re: [PATCH v2 xf86-video-dummy] Add glamor acceleration which enables native OpenGL support (v2)
> 
> On 09/03/17 09:26, Qiang Yu wrote:
>> v2:
>>   Update configure.ac for auto enable glamor support and print
>>   corresponding error message when necessary.
>>
>> Enable glamor acceleration in xorg.conf by:
>> Section "Device"
>>   ...
>>   Driver "dummy"
>>   Option "Render" "/dev/dri/renderD128"
>>   ...
>> EndSection
> With an nvidia driver, I get:
> [119367.649] (II) Loading /usr/lib64/xorg/modules/libglamoregl.so
> [119367.649] (II) Module glamoregl: vendor="X.Org Foundation"
> [119367.649]    compiled for 1.19.3, module version = 1.0.0
> [119367.649]    ABI class: X.Org ANSI C Emulation, version 0.4
> [119367.649] (II) glamor: OpenGL accelerated X.org driver based.
> [119367.654] (II) glamor: EGL version 1.4 (DRI2):
> [119367.654] EGL_MESA_drm_image required.
> [119367.654] (EE) DUMMY(0): glamor initialization failed
> 
> And with modesetting or intel drivers:
> [   738.822] (II) glamor: OpenGL accelerated X.org driver based.
> [   738.827] (II) glamor: EGL version 1.4 (DRI2):
> [   738.836] (II) DUMMY(0): glamor initialized
> [   738.836] (--) Depth 24 pixmap format is 32 bpp
> [   738.957] (II) DUMMY(0): Using 3904 scanlines of offscreen memory
> [   738.957] (==) DUMMY(0): Backing store enabled
> [   738.957] (==) DUMMY(0): Silken mouse enabled
> [   738.957] (==) RandR enabled
> [   738.959] (II) SELinux: Disabled by boolean
> [   738.960] (II) AIGLX: Screen 0 is not DRI2 capable
> [   738.960] (EE) AIGLX: reverting to software rendering
> 
> And in both cases, glxinfo reports that my dummy screen uses software
> rendering. (Accelerated: no, Gallium 0.4 on llvmpipe..)
> 
> What am I doing wrong?
> 
> Cheers
> Antoine
> 
> 
>>
>> GPU is chosen by the Render option which specifies the render
>> node of the GPU DRM device.
>>
>> We could use the dumb buffer instead of gbm buffer as the
>> screen front buffer. But dumb buffer requires open
>> /dev/dri/cardx which has the limitation of only one instance
>> of OpenGL enabled xserver can start.
>>
>> With gbm buffer, we can use /dev/dri/renderDx which has no
>> limitation on the number of OpenGL enabled xserver and even
>> won't conflict with a "real" xserver using radeon/amdgpu DDX.
>>
>> Due to using renderDx, only DRI3 OpenGL is supported.
>>
>> DGA is disabled when glamor is enabled, we can enable it with
>> new gbm_bo_map/unmap API, but consider a more effiction way
>> is just using DRI3BufferFromPixmap for the root window pixmap.
>>
>> Signed-off-by: Qiang Yu <Qiang.Yu at amd.com>
>> ---
>>  configure.ac       |  38 ++++++++++++++
>>  src/Makefile.am    |   7 ++-
>>  src/dummy.h        |   9 ++++
>>  src/dummy_dga.c    |   3 ++
>>  src/dummy_driver.c | 143 ++++++++++++++++++++++++++++++++++++++++++++++++-----
>>  5 files changed, 188 insertions(+), 12 deletions(-)
>>
>> diff --git a/configure.ac b/configure.ac
>> index 4eb7fae..39d2157 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -68,6 +68,44 @@ AM_CONDITIONAL([DGA], [test "x$DGA" = xyes])
>>  # Obtain compiler/linker options for the driver dependencies
>>  PKG_CHECK_MODULES(XORG, [xorg-server >= 1.4.99.901] xproto fontsproto $REQUIRED_MODULES)
>>
>> +# Check glamor support
>> +AC_ARG_ENABLE(glamor,
>> +           AS_HELP_STRING([--disable-glamor],
>> +                          [Disable glamor, a new GL-based acceleration [default=auto]]),
>> +           [GLAMOR="$enableval"],
>> +           [GLAMOR=auto])
>> +
>> +SAVE_CPPFLAGS="$CPPFLAGS"
>> +CPPFLAGS="$CPPFLAGS $XORG_CFLAGS"
>> +if test "x$GLAMOR" != "xno"; then
>> +     AC_CHECK_HEADERS([glamor.h], [HAS_GLAMOR=yes], [HAS_GLAMOR=no], [#include "xorg-server.h"])
>> +     PKG_CHECK_MODULES(GBM, [gbm], [], [HAS_GLAMOR=no])
>> +fi
>> +CPPFLAGS="$SAVE_CPPFLAGS"
>> +
>> +case "$GLAMOR,$HAS_GLAMOR" in
>> +     yes,yes | auto,yes)
>> +             GLAMOR=yes
>> +             ;;
>> +     yes,no)
>> +             AC_MSG_ERROR([GLAMOR requested, but glamor and/or gbm not found.])
>> +             ;;
>> +     no,*)
>> +             ;;
>> +     *)
>> +             AC_MSG_NOTICE([GLAMOR disabled because glamor and/or gbm not found.])
>> +             GLAMOR=no
>> +             ;;
>> +esac
>> +
>> +AC_MSG_CHECKING([whether to include GLAMOR support])
>> +AC_MSG_RESULT([$GLAMOR])
>> +
>> +if test "x$GLAMOR" != "xno"; then
>> +        AC_DEFINE(USE_GLAMOR, 1, [Enable glamor acceleration])
>> +fi
>> +AM_CONDITIONAL(GLAMOR, test x$GLAMOR != xno)
>> +
>>  # Checks for libraries.
>>
>>
>> diff --git a/src/Makefile.am b/src/Makefile.am
>> index da1dd9a..9faa9c4 100644
>> --- a/src/Makefile.am
>> +++ b/src/Makefile.am
>> @@ -25,7 +25,7 @@
>>  # _ladir passes a dummy rpath to libtool so the thing will actually link
>>  # TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc.
>>
>> -AM_CFLAGS = $(XORG_CFLAGS) $(PCIACCESS_CFLAGS)
>> +AM_CFLAGS = $(XORG_CFLAGS)
>>
>>  dummy_drv_la_LTLIBRARIES = dummy_drv.la
>>  dummy_drv_la_LDFLAGS = -module -avoid-version
>> @@ -38,6 +38,11 @@ dummy_drv_la_SOURCES = \
>>           dummy_driver.c \
>>           dummy.h
>>
>> +if GLAMOR
>> +AM_CFLAGS += $(GBM_CFLAGS)
>> +dummy_drv_la_LIBADD += $(GBM_LIBS)
>> +endif
>> +
>>  if DGA
>>  dummy_drv_la_SOURCES +=      \
>>           dummy_dga.c
>> diff --git a/src/dummy.h b/src/dummy.h
>> index c3fdd6e..1eecdec 100644
>> --- a/src/dummy.h
>> +++ b/src/dummy.h
>> @@ -42,6 +42,9 @@ typedef struct _color
>>      int blue;
>>  } dummy_colors;
>>
>> +struct gbm_device;
>> +struct gbm_bo;
>> +
>>  typedef struct dummyRec
>>  {
>>      DGAModePtr               DGAModes;
>> @@ -72,6 +75,12 @@ typedef struct dummyRec
>>      pointer* FBBase;
>>      Bool        (*CreateWindow)() ;     /* wrapped CreateWindow */
>>      Bool prop;
>> +
>> +    /* DRI support */
>> +    int fd;
>> +    CreateScreenResourcesProcPtr createScreenResources;
>> +    struct gbm_device *gbm;
>> +    struct gbm_bo *front_bo;
>>  } DUMMYRec, *DUMMYPtr;
>>
>>  /* The privates of the DUMMY driver */
>> diff --git a/src/dummy_dga.c b/src/dummy_dga.c
>> index d16d09f..8335874 100644
>> --- a/src/dummy_dga.c
>> +++ b/src/dummy_dga.c
>> @@ -165,6 +165,9 @@ DUMMY_OpenFramebuffer(
>>  ){
>>      DUMMYPtr pDUMMY = DUMMYPTR(pScrn);
>>
>> +    if (pDUMMY->FBBase == NULL)
>> +     return FALSE;
>> +
>>      *name = NULL;            /* no special device */
>>      *mem = (unsigned char*)pDUMMY->FBBase;
>>      *size = pScrn->videoRam * 1024;
>> diff --git a/src/dummy_driver.c b/src/dummy_driver.c
>> index 2656602..76bf422 100644
>> --- a/src/dummy_driver.c
>> +++ b/src/dummy_driver.c
>> @@ -49,6 +49,15 @@
>>  #include <X11/extensions/xf86dgaproto.h>
>>  #endif
>>
>> +#ifdef USE_GLAMOR
>> +#define GLAMOR_FOR_XORG
>> +#include <glamor.h>
>> +#include <gbm.h>
>> +#endif
>> +
>> +#include <unistd.h>
>> +#include <fcntl.h>
>> +
>>  /* Mandatory functions */
>>  static const OptionInfoRec * DUMMYAvailableOptions(int chipid, int busid);
>>  static void     DUMMYIdentify(int flags);
>> @@ -115,11 +124,13 @@ static SymTabRec DUMMYChipsets[] = {
>>  };
>>
>>  typedef enum {
>> -    OPTION_SW_CURSOR
>> +    OPTION_SW_CURSOR,
>> +    OPTION_RENDER,
>>  } DUMMYOpts;
>>
>>  static const OptionInfoRec DUMMYOptions[] = {
>>      { OPTION_SW_CURSOR,      "SWcursor",     OPTV_BOOLEAN,   {0}, FALSE },
>> +    { OPTION_RENDER, "Render",       OPTV_STRING,    {0}, FALSE },
>>      { -1,                  NULL,           OPTV_NONE,        {0}, FALSE }
>>  };
>>
>> @@ -189,15 +200,21 @@ DUMMYGetRec(ScrnInfoPtr pScrn)
>>
>>      if (pScrn->driverPrivate == NULL)
>>       return FALSE;
>> -        return TRUE;
>> +    return TRUE;
>>  }
>>
>>  static void
>>  DUMMYFreeRec(ScrnInfoPtr pScrn)
>>  {
>> -    if (pScrn->driverPrivate == NULL)
>> +    DUMMYPtr dPtr = DUMMYPTR(pScrn);
>> +
>> +    if (!dPtr)
>>       return;
>> -    free(pScrn->driverPrivate);
>> +
>> +    if (dPtr->fd >= 0)
>> +     close(dPtr->fd);
>> +
>> +    free(dPtr);
>>      pScrn->driverPrivate = NULL;
>>  }
>>
>> @@ -266,10 +283,50 @@ DUMMYProbe(DriverPtr drv, int flags)
>>      return foundScreen;
>>  }
>>
>> +static void
>> +try_enable_glamor(ScrnInfoPtr pScrn)
>> +{
>> +#ifdef USE_GLAMOR
>> +    Bool enabled = FALSE;
>> +    const char *render;
>> +    DUMMYPtr dPtr = DUMMYPTR(pScrn);
>> +    uint64_t value = 0;
>> +    int ret;
>> +
>> +    render = xf86GetOptValString(dPtr->Options, OPTION_RENDER);
>> +    if (!render)
>> +     return;
>> +
>> +    dPtr->fd = open(render, O_RDWR);
>> +    if (dPtr->fd < 0) {
>> +     xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Open render %s fail\n", render);
>> +     return;
>> +    }
>> +
>> +    if (xf86LoadSubModule(pScrn, GLAMOR_EGL_MODULE_NAME)) {
>> +        if (glamor_egl_init(pScrn, dPtr->fd)) {
>> +            xf86DrvMsg(pScrn->scrnIndex, X_INFO, "glamor initialized\n");
>> +            enabled = TRUE;
>> +     } else {
>> +            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
>> +                       "glamor initialization failed\n");
>> +     }
>> +    } else {
>> +        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
>> +                   "Failed to load glamor module.\n");
>> +    }
>> +
>> +    if (!enabled) {
>> +     close(dPtr->fd);
>> +     dPtr->fd = -1;
>> +    }
>> +#endif
>> +}
>> +
>>  # define RETURN \
>>      { DUMMYFreeRec(pScrn);\
>> -                         return FALSE;\
>> -                                          }
>> +     return FALSE;\
>> +    }
>>
>>  /* Mandatory */
>>  Bool
>> @@ -290,6 +347,7 @@ DUMMYPreInit(ScrnInfoPtr pScrn, int flags)
>>      }
>>
>>      dPtr = DUMMYPTR(pScrn);
>> +    dPtr->fd = -1;
>>
>>      pScrn->chipset = (char *)xf86TokenToString(DUMMYChipsets,
>>                                              DUMMY_CHIP);
>> @@ -450,6 +508,8 @@ DUMMYPreInit(ScrnInfoPtr pScrn, int flags)
>>      pScrn->memPhysBase = 0;
>>      pScrn->fbOffset = 0;
>>
>> +    try_enable_glamor(pScrn);
>> +
>>      return TRUE;
>>  }
>>  #undef RETURN
>> @@ -500,6 +560,31 @@ DUMMYLoadPalette(
>>
>>  }
>>
>> +#ifdef USE_GLAMOR
>> +static Bool
>> +DUMMYCreateScreenResources(ScreenPtr pScreen)
>> +{
>> +    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
>> +    DUMMYPtr dPtr = DUMMYPTR(pScrn);
>> +    PixmapPtr pixmap;
>> +    Bool ret;
>> +    void *pixels = NULL;
>> +
>> +    pScreen->CreateScreenResources = dPtr->createScreenResources;
>> +    ret = pScreen->CreateScreenResources(pScreen);
>> +    pScreen->CreateScreenResources = DUMMYCreateScreenResources;
>> +
>> +    pixmap = pScreen->GetScreenPixmap(pScreen);
>> +    if (!glamor_egl_create_textured_pixmap_from_gbm_bo(pixmap, dPtr->front_bo)) {
>> +     xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
>> +                "glamor_egl_create_textured_pixmap() failed\n");
>> +     return FALSE;
>> +    }
>> +
>> +    glamor_set_screen_pixmap(pixmap, NULL);
>> +}
>> +#endif
>> +
>>  static ScrnInfoPtr DUMMYScrn; /* static-globalize it */
>>
>>  /* Mandatory */
>> @@ -519,8 +604,7 @@ DUMMYScreenInit(SCREEN_INIT_ARGS_DECL)
>>      dPtr = DUMMYPTR(pScrn);
>>      DUMMYScrn = pScrn;
>>
>> -
>> -    if (!(dPtr->FBBase = malloc(pScrn->videoRam * 1024)))
>> +    if (dPtr->fd < 0 && !(dPtr->FBBase = malloc(pScrn->videoRam * 1024)))
>>       return FALSE;
>>
>>      /*
>> @@ -566,6 +650,35 @@ DUMMYScreenInit(SCREEN_INIT_ARGS_DECL)
>>      /* must be after RGB ordering fixed */
>>      fbPictureInit(pScreen, 0, 0);
>>
>> +#ifdef USE_GLAMOR
>> +    if (dPtr->fd >= 0) {
>> +     dPtr->gbm = glamor_egl_get_gbm_device(pScreen);
>> +     if (!dPtr->gbm) {
>> +         xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
>> +                    "Failed to get gbm device.\n");
>> +         return FALSE;
>> +     }
>> +     dPtr->front_bo = gbm_bo_create(dPtr->gbm,
>> +                                    pScrn->virtualX, pScrn->virtualY,
>> +                                    GBM_FORMAT_ARGB8888,
>> +                                    GBM_BO_USE_RENDERING);
>> +     if (!dPtr->front_bo) {
>> +         xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
>> +                    "Failed to create front buffer.\n");
>> +         return FALSE;
>> +     }
>> +
>> +        if (!glamor_init(pScreen, GLAMOR_USE_EGL_SCREEN)) {
>> +            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
>> +                       "Failed to initialize glamor at ScreenInit() time.\n");
>> +            return FALSE;
>> +        }
>> +
>> +     dPtr->createScreenResources = pScreen->CreateScreenResources;
>> +     pScreen->CreateScreenResources = DUMMYCreateScreenResources;
>> +    }
>> +#endif
>> +
>>      xf86SetBlackWhitePixels(pScreen);
>>
>>  #ifdef USE_DGA
>> @@ -659,9 +772,17 @@ DUMMYCloseScreen(CLOSE_SCREEN_ARGS_DECL)
>>      ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
>>      DUMMYPtr dPtr = DUMMYPTR(pScrn);
>>
>> -    if(pScrn->vtSema){
>> -     free(dPtr->FBBase);
>> -    }
>> +#ifdef USE_GLAMOR
>> +    if (dPtr->fd >= 0) {
>> +     if (dPtr->front_bo) {
>> +         gbm_bo_destroy(dPtr->front_bo);
>> +         dPtr->front_bo = NULL;
>> +     }
>> +    } else
>> +#endif
>> +     if(pScrn->vtSema) {
>> +         free(dPtr->FBBase);
>> +     }
>>
>>      if (dPtr->CursorInfo)
>>       xf86DestroyCursorInfoRec(dPtr->CursorInfo);
>>
> 



More information about the xorg-devel mailing list