diff options
author | Hans de Goede <hdegoede@redhat.com> | 2016-08-23 12:18:56 +0200 |
---|---|---|
committer | Hans de Goede <hdegoede@redhat.com> | 2016-09-13 10:26:21 +0200 |
commit | a74d553cb97d545148bd2f81b7bd021cca94e076 (patch) | |
tree | 3ee6acc9ddcafce773fc18e0c2185d0a9285d3f1 /glamor | |
parent | 527c6baa294d17c5eca1d87ac941844872e90dac (diff) |
glamor: Add glamor_shareable_fd_from_pixmap()
Add glamor_shareable_fd_from_pixmap function to get dma-buf fds suitable
for sharing across GPUs (not using GPU specific tiling).
This is necessary for the modesetting driver to correctly implement
the DRI2 SharePixmapBacking callback.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'glamor')
-rw-r--r-- | glamor/glamor.c | 20 | ||||
-rw-r--r-- | glamor/glamor.h | 20 |
2 files changed, 40 insertions, 0 deletions
diff --git a/glamor/glamor.c b/glamor/glamor.c index 5ba440c83..903f6bdf6 100644 --- a/glamor/glamor.c +++ b/glamor/glamor.c @@ -821,6 +821,26 @@ glamor_fd_from_pixmap(ScreenPtr screen, return -1; } +_X_EXPORT int +glamor_shareable_fd_from_pixmap(ScreenPtr screen, + PixmapPtr pixmap, CARD16 *stride, CARD32 *size) +{ + unsigned orig_usage_hint = pixmap->usage_hint; + int ret; + + /* + * The actual difference between a sharable and non sharable buffer + * is decided 4 call levels deep in glamor_make_pixmap_exportable() + * based on pixmap->usage_hint == CREATE_PIXMAP_USAGE_SHARED + * 2 of those calls are also exported API, so we cannot just add a flag. + */ + pixmap->usage_hint = CREATE_PIXMAP_USAGE_SHARED; + ret = glamor_fd_from_pixmap(screen, pixmap, stride, size); + pixmap->usage_hint = orig_usage_hint; + + return ret; +} + int glamor_name_from_pixmap(PixmapPtr pixmap, CARD16 *stride, CARD32 *size) { diff --git a/glamor/glamor.h b/glamor/glamor.h index e27033a84..bdd2374cf 100644 --- a/glamor/glamor.h +++ b/glamor/glamor.h @@ -181,6 +181,26 @@ extern _X_EXPORT int glamor_fd_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, CARD16 *stride, CARD32 *size); +/* @glamor_shareable_fd_from_pixmap: Get a dma-buf fd suitable for sharing + * with other GPUs from a pixmap. + * + * @screen: Current screen pointer. + * @pixmap: The pixmap from which we want the fd. + * @stride, @size: Pointers to fill the stride and size of the + * buffer associated to the fd. + * + * The returned fd will point to a buffer which is suitable for sharing + * across GPUs (not using GPU specific tiling). + * The pixmap and the buffer associated by the fd will share the same + * content. + * The pixmap's stride may be modified by this function. + * Returns the fd on success, -1 on error. + * */ +extern _X_EXPORT int glamor_shareable_fd_from_pixmap(ScreenPtr screen, + PixmapPtr pixmap, + CARD16 *stride, + CARD32 *size); + /** * @glamor_name_from_pixmap: Gets a gem name from a pixmap. * |