diff options
author | Rob Herring <robh@kernel.org> | 2016-05-03 21:02:47 -0500 |
---|---|---|
committer | Emil Velikov <emil.l.velikov@gmail.com> | 2016-05-23 12:07:46 +0100 |
commit | 8aeb6d768b4285f600d09f38d0b406adf46c251d (patch) | |
tree | c4ad438adb7e6862da2b8dbc77a3963a9188f073 /src/gbm/main | |
parent | 1f4869a2089c6172feff382e177d74ac68c241a7 (diff) |
gbm: Add map/unmap functions
This adds map and unmap functions to GBM utilizing the DRIimage extension
mapImage/unmapImage functions or existing internal mapping for dumb
buffers. Unlike prior attempts, this version provides a region to map and
usage flags for the mapping. The operation follows the same semantics as
the gallium transfer_map() function.
This was tested with GBM based gralloc on Android.
Signed-off-by: Rob Herring <robh@kernel.org>
[Emil Velikov: drop no longer relevant hunk from commit message.]
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to 'src/gbm/main')
-rw-r--r-- | src/gbm/main/gbm.c | 53 | ||||
-rw-r--r-- | src/gbm/main/gbm.h | 35 | ||||
-rw-r--r-- | src/gbm/main/gbmint.h | 6 |
3 files changed, 94 insertions, 0 deletions
diff --git a/src/gbm/main/gbm.c b/src/gbm/main/gbm.c index c046b1ad7c8..b0cab5129a1 100644 --- a/src/gbm/main/gbm.c +++ b/src/gbm/main/gbm.c @@ -386,6 +386,59 @@ gbm_bo_import(struct gbm_device *gbm, } /** + * Map a region of a gbm buffer object for cpu access + * + * This function maps a region of a gbm bo for cpu read and/or write + * access. + * + * \param bo The buffer object + * \param x The X (top left origin) starting position of the mapped region for + * the buffer + * \param y The Y (top left origin) starting position of the mapped region for + * the buffer + * \param width The width of the mapped region for the buffer + * \param height The height of the mapped region for the buffer + * \param flags The union of the GBM_BO_TRANSFER_* flags for this buffer + * \param stride Ptr for returned stride in bytes of the mapped region + * \param map_data Returned opaque ptr for the mapped region + * + * \return Address of the mapped buffer that should be unmapped with + * gbm_bo_unmap() when no longer needed. On error, %NULL is returned + * and errno is set. + * + * \sa enum gbm_bo_transfer_flags for the list of flags + */ +GBM_EXPORT void * +gbm_bo_map(struct gbm_bo *bo, + uint32_t x, uint32_t y, + uint32_t width, uint32_t height, + uint32_t flags, uint32_t *stride, void **map_data) +{ + if (!bo || width == 0 || height == 0 || !stride || !map_data) { + errno = EINVAL; + return NULL; + } + + return bo->gbm->bo_map(bo, x, y, width, height, + flags, stride, map_data); +} + +/** + * Unmap a previously mapped region of a gbm buffer object + * + * This function unmaps a region of a gbm bo for cpu read and/or write + * access. + * + * \param bo The buffer object + * \param map_data opaque ptr returned from prior gbm_bo_map + */ +GBM_EXPORT void +gbm_bo_unmap(struct gbm_bo *bo, void *map_data) +{ + bo->gbm->bo_unmap(bo, map_data); +} + +/** * Allocate a surface object * * \param gbm The gbm device returned from gbm_create_device() diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h index 63d9a9edfd6..8a2f2a6a8cc 100644 --- a/src/gbm/main/gbm.h +++ b/src/gbm/main/gbm.h @@ -253,6 +253,41 @@ struct gbm_bo * gbm_bo_import(struct gbm_device *gbm, uint32_t type, void *buffer, uint32_t usage); +/** + * Flags to indicate the type of mapping for the buffer - these are + * passed into gbm_bo_map(). The caller must set the union of all the + * flags that are appropriate. + * + * These flags are independent of the GBM_BO_USE_* creation flags. However, + * mapping the buffer may require copying to/from a staging buffer. + * + * See also: pipe_transfer_usage + */ +enum gbm_bo_transfer_flags { + /** + * Buffer contents read back (or accessed directly) at transfer + * create time. + */ + GBM_BO_TRANSFER_READ = (1 << 0), + /** + * Buffer contents will be written back at unmap time + * (or modified as a result of being accessed directly). + */ + GBM_BO_TRANSFER_WRITE = (1 << 1), + /** + * Read/modify/write + */ + GBM_BO_TRANSFER_READ_WRITE = (GBM_BO_TRANSFER_READ | GBM_BO_TRANSFER_WRITE), +}; + +void * +gbm_bo_map(struct gbm_bo *bo, + uint32_t x, uint32_t y, uint32_t width, uint32_t height, + uint32_t flags, uint32_t *stride, void **map_data); + +void +gbm_bo_unmap(struct gbm_bo *bo, void *map_data); + uint32_t gbm_bo_get_width(struct gbm_bo *bo); diff --git a/src/gbm/main/gbmint.h b/src/gbm/main/gbmint.h index 155eb12b06b..914e2c1749a 100644 --- a/src/gbm/main/gbmint.h +++ b/src/gbm/main/gbmint.h @@ -68,6 +68,12 @@ struct gbm_device { uint32_t usage); struct gbm_bo *(*bo_import)(struct gbm_device *gbm, uint32_t type, void *buffer, uint32_t usage); + void *(*bo_map)(struct gbm_bo *bo, + uint32_t x, uint32_t y, + uint32_t width, uint32_t height, + uint32_t flags, uint32_t *stride, + void **map_data); + void (*bo_unmap)(struct gbm_bo *bo, void *map_data); int (*bo_write)(struct gbm_bo *bo, const void *buf, size_t data); int (*bo_get_fd)(struct gbm_bo *bo); void (*bo_destroy)(struct gbm_bo *bo); |