return bo;
}
+PUBLIC 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,
+ size_t plane)
+{
+ if (!bo || width == 0 || height == 0 || !stride || !map_data)
+ return NULL;
+
+ assert(x == 0);
+ assert(y == 0);
+ assert(width == gbm_bo_get_width(bo));
+ assert(height == gbm_bo_get_height(bo));
+
+ *map_data = drv_bo_map(bo->bo);
+ *stride = gbm_bo_get_plane_stride(bo, plane);
+ return *map_data;
+}
+
+PUBLIC void
+gbm_bo_unmap(struct gbm_bo *bo, void *map_data)
+{
+ assert(bo);
+ assert(map_data);
+ drv_bo_unmap(bo->bo);
+}
+
PUBLIC uint32_t
gbm_bo_get_width(struct gbm_bo *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, size_t plane);
+
+void
+gbm_bo_unmap(struct gbm_bo *bo, void *map_data);
+
uint32_t
gbm_bo_get_width(struct gbm_bo *bo);