From 17b27725fe5dd61ed461a45fb320464b45f045d8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marc-Andr=C3=A9=20Lureau?= Date: Mon, 15 Jun 2015 15:09:58 +0200 Subject: [PATCH 1/1] drisw: use getImageShm() if available Reviewed-by: Dave Airlie Reviewed-by: Adam Jackson --- src/gallium/state_trackers/dri/drisw.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/dri/drisw.c b/src/gallium/state_trackers/dri/drisw.c index 40cbca54940..e24fcba3869 100644 --- a/src/gallium/state_trackers/dri/drisw.c +++ b/src/gallium/state_trackers/dri/drisw.c @@ -117,6 +117,26 @@ get_image2(__DRIdrawable *dPriv, int x, int y, int width, int height, int stride data, dPriv->loaderPrivate); } +static inline bool +get_image_shm(__DRIdrawable *dPriv, int x, int y, int width, int height, + struct pipe_resource *res) +{ + __DRIscreen *sPriv = dPriv->driScreenPriv; + const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader; + struct winsys_handle whandle; + + whandle.type = WINSYS_HANDLE_TYPE_SHMID; + + if (loader->base.version < 4 || !loader->getImageShm) + return FALSE; + + if (!res->screen->resource_get_handle(res->screen, NULL, res, &whandle, PIPE_HANDLE_USAGE_WRITE)) + return FALSE; + + loader->getImageShm(dPriv, x, y, width, height, whandle.handle, dPriv->loaderPrivate); + return TRUE; +} + static void drisw_update_drawable_info(struct dri_drawable *drawable) { @@ -364,7 +384,8 @@ drisw_update_tex_buffer(struct dri_drawable *drawable, x, y, w, h, &transfer); /* Copy the Drawable content to the mapped texture buffer */ - get_image(dPriv, x, y, w, h, map); + if (!get_image_shm(dPriv, x, y, w, h, res)) + get_image(dPriv, x, y, w, h, map); /* The pipe transfer has a pitch rounded up to the nearest 64 pixels. get_image() has a pitch rounded up to 4 bytes. */ -- 2.30.2