diff options
author | Marc-André Lureau <[email protected]> | 2015-06-15 15:09:58 +0200 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2018-05-30 09:11:54 +1000 |
commit | 17b27725fe5dd61ed461a45fb320464b45f045d8 (patch) | |
tree | d71f2df64846d8bf81c84d990d6ab83cab9506e8 | |
parent | 9feaf333716f08111ac8a921940e3a0e3666df0e (diff) |
drisw: use getImageShm() if available
Reviewed-by: Dave Airlie <[email protected]>
Reviewed-by: Adam Jackson <[email protected]>
-rw-r--r-- | src/gallium/state_trackers/dri/drisw.c | 23 |
1 files changed, 22 insertions, 1 deletions
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. */ |