[Mesa-dev] [PATCH 7/8] drisw/glx: implement getImageShm

Dave Airlie airlied at gmail.com
Tue May 29 03:09:01 UTC 2018


From: Marc-André Lureau <marcandre.lureau at gmail.com>

---
 src/glx/drisw_glx.c | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
index 641917361b8..3ff6a9617fc 100644
--- a/src/glx/drisw_glx.c
+++ b/src/glx/drisw_glx.c
@@ -313,6 +313,32 @@ swrastGetImage(__DRIdrawable * read,
    swrastGetImage2(read, x, y, w, h, 0, data, loaderPrivate);
 }
 
+static void
+swrastGetImageShm(__DRIdrawable * read,
+                  int x, int y, int w, int h,
+                  int shmid, void *loaderPrivate)
+{
+   struct drisw_drawable *prp = loaderPrivate;
+   __GLXDRIdrawable *pread = &(prp->base);
+   Display *dpy = pread->psc->dpy;
+   Drawable readable;
+   XImage *ximage;
+
+   if (!prp->ximage || shmid != prp->shminfo.shmid) {
+      if (!XCreateDrawable(prp, shmid, dpy))
+         return;
+   }
+   readable = pread->xDrawable;
+
+   ximage = prp->ximage;
+   ximage->data = prp->shminfo.shmaddr; /* no offset */
+   ximage->width = w;
+   ximage->height = h;
+   ximage->bytes_per_line = bytes_per_line(w * ximage->bits_per_pixel, 32);
+
+   XShmGetImage(dpy, readable, ximage, x, y, ~0L);
+}
+
 static __DRIswrastLoaderExtension swrastLoaderExtension = {
    .base = {__DRI_SWRAST_LOADER, 4 },
 
@@ -322,6 +348,7 @@ static __DRIswrastLoaderExtension swrastLoaderExtension = {
    .putImage2           = swrastPutImage2,
    .getImage2           = swrastGetImage2,
    .putImageShm         = swrastPutImageShm,
+   .getImageShm         = swrastGetImageShm,
 };
 
 static const __DRIextension *loader_extensions[] = {
@@ -802,8 +829,10 @@ driswCreateScreen(int screen, struct glx_display *priv)
    if (extensions == NULL)
       goto handle_error;
 
-   if (!check_xshm(psc->base.dpy))
+   if (!check_xshm(psc->base.dpy)) {
       swrastLoaderExtension.putImageShm = NULL;
+      swrastLoaderExtension.getImageShm = NULL;
+   }
 
    for (i = 0; extensions[i]; i++) {
       if (strcmp(extensions[i]->name, __DRI_CORE) == 0)
-- 
2.17.0



More information about the mesa-dev mailing list