OSDN Git Service

minigbm: cros_gralloc: support GRALLOC_MODULE_API_VERSION_0_3
[android-x86/external-minigbm.git] / rockchip.c
index 4d10581..66f1ea0 100644 (file)
 #include "helpers.h"
 #include "util.h"
 
-static const uint32_t supported_formats[] = { DRM_FORMAT_ABGR8888, DRM_FORMAT_ARGB8888,
-                                             DRM_FORMAT_NV12,     DRM_FORMAT_RGB565,
-                                             DRM_FORMAT_XBGR8888, DRM_FORMAT_XRGB8888,
-                                             DRM_FORMAT_YVU420,   DRM_FORMAT_YVU420_ANDROID };
+static const uint32_t render_target_formats[] = { DRM_FORMAT_ABGR8888, DRM_FORMAT_ARGB8888,
+                                                 DRM_FORMAT_RGB565, DRM_FORMAT_XBGR8888,
+                                                 DRM_FORMAT_XRGB8888 };
+
+static const uint32_t texture_source_formats[] = { DRM_FORMAT_R8, DRM_FORMAT_NV12,
+                                                  DRM_FORMAT_YVU420, DRM_FORMAT_YVU420_ANDROID };
 
 static int afbc_bo_from_format(struct bo *bo, uint32_t width, uint32_t height, uint32_t format)
 {
@@ -70,7 +72,7 @@ static int afbc_bo_from_format(struct bo *bo, uint32_t width, uint32_t height, u
 static int rockchip_add_kms_item(struct driver *drv, const struct kms_item *item)
 {
        int ret;
-       uint32_t i;
+       uint32_t i, j;
        uint64_t flags;
        struct combination *combo;
        struct format_metadata metadata;
@@ -84,6 +86,11 @@ static int rockchip_add_kms_item(struct driver *drv, const struct kms_item *item
                                metadata.tiling = 0;
                                metadata.priority = 2;
 
+                               for (j = 0; j < ARRAY_SIZE(texture_source_formats); j++) {
+                                       if (item->format == texture_source_formats[j])
+                                               flags &= ~BO_USE_RENDERING;
+                               }
+
                                ret = drv_add_combination(drv, item[i].format, &metadata, flags);
                                if (ret)
                                        return ret;
@@ -107,8 +114,13 @@ static int rockchip_init(struct driver *drv)
        metadata.priority = 1;
        metadata.modifier = DRM_FORMAT_MOD_NONE;
 
-       ret = drv_add_combinations(drv, supported_formats, ARRAY_SIZE(supported_formats), &metadata,
-                                  BO_COMMON_USE_MASK);
+       ret = drv_add_combinations(drv, render_target_formats, ARRAY_SIZE(render_target_formats),
+                                  &metadata, BO_USE_RENDER_MASK);
+       if (ret)
+               return ret;
+
+       ret = drv_add_combinations(drv, texture_source_formats, ARRAY_SIZE(texture_source_formats),
+                                  &metadata, BO_USE_TEXTURE_MASK);
        if (ret)
                return ret;
 
@@ -193,8 +205,7 @@ static int rockchip_bo_create_with_modifiers(struct bo *bo, uint32_t width, uint
        ret = drmIoctl(bo->drv->fd, DRM_IOCTL_ROCKCHIP_GEM_CREATE, &gem_create);
 
        if (ret) {
-               fprintf(stderr, "drv: DRM_IOCTL_ROCKCHIP_GEM_CREATE failed "
-                               "(size=%llu)\n",
+               fprintf(stderr, "drv: DRM_IOCTL_ROCKCHIP_GEM_CREATE failed (size=%llu)\n",
                        gem_create.size);
                return ret;
        }
@@ -214,7 +225,7 @@ static int rockchip_bo_create(struct bo *bo, uint32_t width, uint32_t height, ui
                                                 ARRAY_SIZE(modifiers));
 }
 
-static void *rockchip_bo_map(struct bo *bo, struct map_info *data, size_t plane)
+static void *rockchip_bo_map(struct bo *bo, struct map_info *data, size_t plane, int prot)
 {
        int ret;
        struct drm_rockchip_gem_map_off gem_map;
@@ -235,11 +246,10 @@ static void *rockchip_bo_map(struct bo *bo, struct map_info *data, size_t plane)
 
        data->length = bo->total_size;
 
-       return mmap(0, bo->total_size, PROT_READ | PROT_WRITE, MAP_SHARED, bo->drv->fd,
-                   gem_map.offset);
+       return mmap(0, bo->total_size, prot, MAP_SHARED, bo->drv->fd, gem_map.offset);
 }
 
-static uint32_t rockchip_resolve_format(uint32_t format)
+static uint32_t rockchip_resolve_format(uint32_t format, uint64_t usage)
 {
        switch (format) {
        case DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED: