OSDN Git Service

minigbm: quick and dirty implementation of gbm_bo_map/gbm_bo_unmap
authorGurchetan Singh <gurchetansingh@chromium.org>
Wed, 5 Oct 2016 22:16:22 +0000 (15:16 -0700)
committerchrome-bot <chrome-bot@chromium.org>
Fri, 7 Oct 2016 06:32:58 +0000 (23:32 -0700)
We want to add gbm_bo_map/gbm_bo_unmap entry points so certain tests
and Chrome can use driver specific map logic.  This is based on the
upstream entry points in Mesa, with the addition of a plane parameter.

Currently, we just map the entire buffer and don't attempt to do partial
mappings or use the map flags.  We should do this in the future...

BUG=chromium:653284
TEST=minigbm builds

Change-Id: I0423c10c55bab8fac6d6d7c6a699ab71b43aa61b
Reviewed-on: https://chromium-review.googlesource.com/393927
Commit-Ready: Gurchetan Singh <gurchetansingh@chromium.org>
Tested-by: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
gbm.c
gbm.h

diff --git a/gbm.c b/gbm.c
index c5acc00..394aea0 100644 (file)
--- a/gbm.c
+++ b/gbm.c
@@ -195,6 +195,32 @@ gbm_bo_import(struct gbm_device *gbm, uint32_t type,
        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)
 {
diff --git a/gbm.h b/gbm.h
index 8ec9349..cc36b72 100644 (file)
--- a/gbm.h
+++ b/gbm.h
@@ -275,6 +275,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, size_t plane);
+
+void
+gbm_bo_unmap(struct gbm_bo *bo, void *map_data);
+
 uint32_t
 gbm_bo_get_width(struct gbm_bo *bo);