From: Marc-André Lureau Date: Mon, 15 Jun 2015 13:07:34 +0000 (+0200) Subject: drisw/glx: implement getImageShm X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=commitdiff_plain;h=33ce3aa512fa9c8313003f61516588e1ae3e5f8f;hp=17b27725fe5dd61ed461a45fb320464b45f045d8 drisw/glx: implement getImageShm Reviewed-by: Dave Airlie Reviewed-by: Adam Jackson --- 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)