OSDN Git Service

Convert external/minigbm to Android.bp am: 9521a60253 am: 5a5d91c739
[android-x86/external-minigbm.git] / gbm.c
diff --git a/gbm.c b/gbm.c
index f76e4ca..c12c269 100644 (file)
--- a/gbm.c
+++ b/gbm.c
@@ -10,6 +10,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/mman.h>
 #include <xf86drm.h>
 
 #include "drv.h"
@@ -223,22 +224,33 @@ PUBLIC struct gbm_bo *gbm_bo_import(struct gbm_device *gbm, uint32_t type, void
 }
 
 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)
+                       uint32_t transfer_flags, uint32_t *stride, void **map_data, size_t plane)
 {
+       void *addr;
+       off_t offset;
+       uint32_t map_flags;
+       struct rectangle rect = { .x = x, .y = y, .width = width, .height = height };
        if (!bo || width == 0 || height == 0 || !stride || !map_data)
                return NULL;
 
-       *stride = gbm_bo_get_plane_stride(bo, plane);
-       uint32_t drv_flags = flags & GBM_BO_TRANSFER_READ ? BO_TRANSFER_READ : BO_TRANSFER_NONE;
-       drv_flags |= flags & GBM_BO_TRANSFER_WRITE ? BO_TRANSFER_WRITE : BO_TRANSFER_NONE;
-       return drv_bo_map(bo->bo, x, y, width, height, drv_flags, (struct map_info **)map_data,
-                         plane);
+       map_flags = (transfer_flags & GBM_BO_TRANSFER_READ) ? BO_MAP_READ : BO_MAP_NONE;
+       map_flags |= (transfer_flags & GBM_BO_TRANSFER_WRITE) ? BO_MAP_WRITE : BO_MAP_NONE;
+
+       addr = drv_bo_map(bo->bo, &rect, map_flags, (struct mapping **)map_data, plane);
+       if (addr == MAP_FAILED)
+               return MAP_FAILED;
+
+       *stride = ((struct mapping *)*map_data)->vma->map_strides[plane];
+
+       offset = *stride * rect.y;
+       offset += drv_stride_from_format(bo->gbm_format, rect.x, plane);
+       return (void *)((uint8_t *)addr + offset);
 }
 
 PUBLIC void gbm_bo_unmap(struct gbm_bo *bo, void *map_data)
 {
        assert(bo);
-       drv_bo_flush(bo->bo, map_data);
+       drv_bo_flush_or_unmap(bo->bo, map_data);
 }
 
 PUBLIC uint32_t gbm_bo_get_width(struct gbm_bo *bo)