[Mesa-dev] [PATCH 3/6] Add support for swrast to the DRM EGL platform

Pekka Paalanen ppaalanen at gmail.com
Thu Jul 24 06:30:09 PDT 2014


On Thu, 24 Jul 2014 13:34:42 +0100
Emil Velikov <emil.l.velikov at gmail.com> wrote:

> On 24/07/14 07:23, Pekka Paalanen wrote:
> > On Thu, 24 Jul 2014 01:43:35 +0100
> > Emil Velikov <emil.l.velikov at gmail.com> wrote:
> > 
> >> From: Giovanni Campagna <gcampagna at src.gnome.org>
> >>
> >> Turn GBM into a swrast loader (providing putimage/getimage backed
> >> by a dumb KMS buffer). This allows to run KMS+DRM GL applications
> >> (such as weston or mutter-wayland) unmodified on cards that don't
> >> have any client side HW acceleration component but that can do
> >> modeset (examples include simpledrm and qxl)
> >>
> >> [Emil Velikov]
> >>  - Fix make check.
> >>  - Split dri_open_driver() from dri_load_driver().
> >>  - Don't try to bind the swrast extensions when using dri.
> >>  - Handle swrast->CreateNewScreen() failure.
> >>  - strdup the driver_name, as it's free'd at destruction.
> >>  - s/LIBGL_ALWAYS_SOFTWARE/GBM_ALWAYS_SOFTWARE/
> >>  - Move gbm_dri_bo_map/unmap to gbm_driiint.h.
> >>  - Correct swrast fallback logic.
> >>
> >> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
> >> ---
> >>  src/egl/drivers/dri2/platform_drm.c | 153 +++++++++++++++++++++++----
> >>  src/gbm/backends/dri/gbm_dri.c      | 203 +++++++++++++++++++++++++++++++-----
> >>  src/gbm/backends/dri/gbm_driint.h   |  57 +++++++++-
> >>  src/gbm/gbm-symbols-check           |   1 +
> >>  src/gbm/main/gbm.h                  |   3 +
> >>  5 files changed, 369 insertions(+), 48 deletions(-)
> >>
> > 
> >> diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
> >> index 347bc99..1aca506 100644
> >> --- a/src/gbm/backends/dri/gbm_dri.c
> >> +++ b/src/gbm/backends/dri/gbm_dri.c
> > 
> >> @@ -743,7 +886,7 @@ static struct gbm_device *
> >>  dri_device_create(int fd)
> >>  {
> >>     struct gbm_dri_device *dri;
> >> -   int ret;
> >> +   int ret, force_sw;
> >>  
> >>     dri = calloc(1, sizeof *dri);
> >>     if (!dri)
> >> @@ -763,7 +906,15 @@ dri_device_create(int fd)
> >>     dri->base.type = GBM_DRM_DRIVER_TYPE_DRI;
> >>     dri->base.base.name = "drm";
> >>  
> >> -   ret = dri_screen_create(dri);
> >> +   force_sw = getenv("GBM_ALWAYS_SOFTWARE") != NULL;
> >> +   if (!force_sw) {
> >> +      ret = dri_screen_create(dri);
> >> +      if (ret)
> >> +         ret = dri_screen_create_swrast(dri);
> >> +   } else {
> >> +      ret = dri_screen_create_swrast(dri);
> >> +   }
> >> +
> >>     if (ret)
> >>        goto err_dri;
> > 
> > Hi,
> > 
> > is GBM_ALWAYS_SOFTWARE a new env var?
> > Is it documented somewhere?
> None of the GBM env variables are. In a matter of fact there isn't even a
> single reference of gbm in the docs - env vars or otherwise. It's like gbm
> does not exist :'(
> 
> Will need to get a new document out there similar to egl.html.
> Any objections if we do that as a follow up patch ?

I would be happy to see any documentation at some point. :-)

> > How does it interact with EGL_SOFTWARE?
> > Does GBM_ALWAYS_SOFTWARE affect GBM's ability to import dmabufs
> > somehow, or only the surfaces that will be passed to EGL?
> > (Importing dmabufs to be passed directly to KMS for scanout.)
> > 
> Considering it's a variable that needs to be explicitly set, the behaviour
> depends on the current state of the software backend.
> 
> AFAICS current swrast/kms_swrast does not allow/use dmabufs.

Maybe that was a stupid question on my part, as I don't know
whether generic DRM API even has a way to import dmabufs at all.
Something like dumb buffer import...

> > I'm terribly confused with all the *SOFTWARE* variables, and it seems
> > I'm not alone as someone just recently filed a bunch of Weston bug
> > reports while trying to get software GL rendering with
> > LIBGL_ALWAYS_SOFTWARE on DRM/KMS.
> > 
> > 
> I have the sneaking suspicion that most people see LIBGL_ALWAYS_SOFTWARE as
> the magic variable that reads your mind and makes things work as you would
> imagine them. Would be great to move from that to read the documentation and
> amend propose improvements of it when needed.

Right. What about EGL_SOFTWARE? Why not use that on GBM platform too? A
quick grep implies that X11 and Wayland platforms use it (but only with
egl_gallium.so?)?

GBM_ALWAYS_SOFTWARE sounds like a platform-specific variable, but
should forcing software rendering be platform-specific?

Btw. how do you force software rendering if using egl_dri2 driver on
any platform? And not using libGL but, say, GLESv2? Uhh... :-)


Thanks,
pq


More information about the mesa-dev mailing list