OSDN Git Service

minigbm: cros_gralloc: fix rendernode query
[android-x86/external-minigbm.git] / i915.c
diff --git a/i915.c b/i915.c
index 4293fec..769e6a3 100644 (file)
--- a/i915.c
+++ b/i915.c
 #include "helpers.h"
 #include "util.h"
 
+static struct supported_combination combos[18] = {
+       {DRM_FORMAT_ARGB1555, DRM_FORMAT_MOD_NONE,
+               BO_USE_RENDERING | BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY},
+       {DRM_FORMAT_ABGR8888, DRM_FORMAT_MOD_NONE,
+               BO_USE_RENDERING | BO_USE_SW_READ_OFTEN | BO_USE_SW_WRITE_OFTEN},
+       {DRM_FORMAT_ABGR8888, DRM_FORMAT_MOD_NONE,
+               BO_USE_RENDERING | BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY},
+       {DRM_FORMAT_ARGB8888, DRM_FORMAT_MOD_NONE,
+               BO_USE_CURSOR | BO_USE_LINEAR | BO_USE_SW_READ_OFTEN | BO_USE_SW_WRITE_OFTEN},
+       {DRM_FORMAT_ARGB8888, DRM_FORMAT_MOD_NONE,
+               BO_USE_RENDERING | BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY},
+       {DRM_FORMAT_GR88, DRM_FORMAT_MOD_NONE,
+               BO_USE_LINEAR | BO_USE_SW_READ_OFTEN | BO_USE_SW_WRITE_OFTEN},
+       {DRM_FORMAT_R8, DRM_FORMAT_MOD_NONE,
+               BO_USE_LINEAR | BO_USE_SW_READ_OFTEN | BO_USE_SW_WRITE_OFTEN},
+       {DRM_FORMAT_RGB565, DRM_FORMAT_MOD_NONE,
+               BO_USE_RENDERING | BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY},
+       {DRM_FORMAT_UYVY, DRM_FORMAT_MOD_NONE,
+               BO_USE_LINEAR | BO_USE_SW_READ_OFTEN | BO_USE_SW_WRITE_OFTEN},
+       {DRM_FORMAT_UYVY, DRM_FORMAT_MOD_NONE,
+               BO_USE_RENDERING | BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY},
+       {DRM_FORMAT_XBGR8888, DRM_FORMAT_MOD_NONE,
+               BO_USE_RENDERING | BO_USE_SW_READ_OFTEN | BO_USE_SW_WRITE_OFTEN},
+       {DRM_FORMAT_XBGR8888, DRM_FORMAT_MOD_NONE,
+               BO_USE_RENDERING | BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY},
+       {DRM_FORMAT_XRGB1555, DRM_FORMAT_MOD_NONE,
+               BO_USE_RENDERING | BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY},
+       {DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_NONE,
+               BO_USE_CURSOR | BO_USE_LINEAR | BO_USE_SW_READ_OFTEN | BO_USE_SW_WRITE_OFTEN},
+       {DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_NONE,
+               BO_USE_RENDERING | BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY},
+       {DRM_FORMAT_YUYV, DRM_FORMAT_MOD_NONE,
+               BO_USE_LINEAR | BO_USE_SW_READ_OFTEN | BO_USE_SW_WRITE_OFTEN},
+       {DRM_FORMAT_YUYV, DRM_FORMAT_MOD_NONE,
+               BO_USE_RENDERING | BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY},
+       {DRM_FORMAT_YVU420, DRM_FORMAT_MOD_NONE,
+               BO_USE_RENDERING | BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY},
+};
+
 struct i915_device
 {
        int gen;
 };
 
-
 static int get_gen(int device_id)
 {
        const uint16_t gen3_ids[] = {0x2582, 0x2592, 0x2772, 0x27A2, 0x27AE,
@@ -60,7 +98,8 @@ static int i915_init(struct driver *drv)
 
        drv->priv = i915_drv;
 
-       return 0;
+       drv_insert_combinations(drv, combos, ARRAY_SIZE(combos));
+       return drv_add_kms_flags(drv);
 }
 
 static void i915_close(struct driver *drv)
@@ -75,26 +114,26 @@ static void i915_align_dimensions(struct driver *drv, uint32_t tiling_mode,
        struct i915_device *i915_drv = (struct i915_device *)drv->priv;
        uint32_t width_alignment = 4, height_alignment = 4;
 
-       switch(tiling_mode) {
-               default:
-               case I915_TILING_NONE:
-                       width_alignment = 64 / bpp;
-                       break;
+       switch (tiling_mode) {
+       default:
+       case I915_TILING_NONE:
+               width_alignment = 64 / bpp;
+               break;
 
-               case I915_TILING_X:
+       case I915_TILING_X:
+               width_alignment = 512 / bpp;
+               height_alignment = 8;
+               break;
+
+       case I915_TILING_Y:
+               if (i915_drv->gen == 3) {
                        width_alignment = 512 / bpp;
                        height_alignment = 8;
-                       break;
-
-               case I915_TILING_Y:
-                       if (i915_drv->gen == 3) {
-                               width_alignment = 512 / bpp;
-                               height_alignment = 8;
-                       } else  {
-                               width_alignment = 128 / bpp;
-                               height_alignment = 32;
-                       }
-                       break;
+               } else  {
+                       width_alignment = 128 / bpp;
+                       height_alignment = 32;
+               }
+               break;
        }
 
        if (i915_drv->gen > 3) {
@@ -123,43 +162,40 @@ static int i915_bo_create(struct bo *bo, uint32_t width, uint32_t height,
                          uint32_t format, uint32_t flags)
 {
        struct driver *drv = bo->drv;
-       int bpp = drv_stride_from_format(format, 1);
+       int bpp = drv_stride_from_format(format, 1, 0);
        struct drm_i915_gem_create gem_create;
        struct drm_i915_gem_set_tiling gem_set_tiling;
        uint32_t tiling_mode = I915_TILING_NONE;
-       size_t size;
+       size_t plane;
        int ret;
 
-       if (flags & (DRV_BO_USE_CURSOR | DRV_BO_USE_LINEAR |
-                    DRV_BO_USE_SW_READ_OFTEN | DRV_BO_USE_SW_WRITE_OFTEN))
+       if (flags & (BO_USE_CURSOR | BO_USE_LINEAR |
+                    BO_USE_SW_READ_OFTEN | BO_USE_SW_WRITE_OFTEN))
                tiling_mode = I915_TILING_NONE;
-       else if (flags & DRV_BO_USE_SCANOUT)
+       else if (flags & BO_USE_SCANOUT)
                tiling_mode = I915_TILING_X;
-       else if (flags & (DRV_BO_USE_RENDERING | DRV_BO_USE_HW_TEXTURE |
-                         DRV_BO_USE_HW_RENDER | DRV_BO_USE_SW_READ_RARELY |
-                         DRV_BO_USE_HW_2D | DRV_BO_USE_SW_WRITE_RARELY))
+       else
                tiling_mode = I915_TILING_Y;
 
        i915_align_dimensions(drv, tiling_mode, &width, &height, bpp);
 
-       bo->strides[0] = width * bpp;
+       drv_bo_from_format(bo, width, height, format);
 
        if (!i915_verify_dimensions(drv, bo->strides[0], height))
                return EINVAL;
 
        memset(&gem_create, 0, sizeof(gem_create));
-       size = width * height * bpp;
-       gem_create.size = size;
+       gem_create.size = bo->total_size;
 
        ret = drmIoctl(drv->fd, DRM_IOCTL_I915_GEM_CREATE, &gem_create);
        if (ret) {
                fprintf(stderr, "drv: DRM_IOCTL_I915_GEM_CREATE failed "
-                               "(size=%zu)\n", size);
+                               "(size=%llu)\n", gem_create.size);
                return ret;
        }
-       bo->handles[0].u32 = gem_create.handle;
-       bo->sizes[0] = size;
-       bo->offsets[0] = 0;
+
+       for (plane = 0; plane < bo->num_planes; plane++)
+               bo->handles[plane].u32 = gem_create.handle;
 
        memset(&gem_set_tiling, 0, sizeof(gem_set_tiling));
        do {
@@ -186,7 +222,7 @@ static int i915_bo_create(struct bo *bo, uint32_t width, uint32_t height,
        return 0;
 }
 
-static void *i915_bo_map(struct bo *bo)
+static void *i915_bo_map(struct bo *bo, struct map_info *data, size_t plane)
 {
        int ret;
        struct drm_i915_gem_mmap_gtt gem_map;
@@ -200,28 +236,26 @@ static void *i915_bo_map(struct bo *bo)
                return MAP_FAILED;
        }
 
-       return mmap(0, bo->sizes[0], PROT_READ | PROT_WRITE, MAP_SHARED,
+       data->length = bo->total_size;
+
+       return mmap(0, bo->total_size, PROT_READ | PROT_WRITE, MAP_SHARED,
                    bo->drv->fd, gem_map.offset);
 }
 
-drv_format_t i915_resolve_format(drv_format_t format)
+static uint32_t i915_resolve_format(uint32_t format)
 {
        switch (format) {
-               case DRV_FORMAT_FLEX_IMPLEMENTATION_DEFINED:
-                       /*HACK: See b/28671744 */
-                       return DRV_FORMAT_XBGR8888;
-               case DRV_FORMAT_FLEX_YCbCr_420_888:
-                       /*
-                        * TODO(gurchetansingh) Implement YV12 with no tiling
-                        * on Intel. See b/29335168
-                        */
-                       return DRV_FORMAT_YVU420;
-               default:
-                       return format;
+       case DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED:
+               /*HACK: See b/28671744 */
+               return DRM_FORMAT_XBGR8888;
+       case DRM_FORMAT_FLEX_YCbCr_420_888:
+               return DRM_FORMAT_YVU420;
+       default:
+               return format;
        }
 }
 
-const struct backend backend_i915 =
+struct backend backend_i915 =
 {
        .name = "i915",
        .init = i915_init,
@@ -230,60 +264,6 @@ const struct backend backend_i915 =
        .bo_destroy = drv_gem_bo_destroy,
        .bo_map = i915_bo_map,
        .resolve_format = i915_resolve_format,
-       .format_list = {
-               {DRV_FORMAT_XRGB8888, DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR |
-                                     DRV_BO_USE_RENDERING | DRV_BO_USE_HW_TEXTURE |
-                                     DRV_BO_USE_HW_RENDER | DRV_BO_USE_HW_2D |
-                                     DRV_BO_USE_SW_READ_RARELY | DRV_BO_USE_SW_WRITE_RARELY},
-               {DRV_FORMAT_XRGB8888, DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR |
-                                     DRV_BO_USE_LINEAR | DRV_BO_USE_SW_READ_OFTEN |
-                                     DRV_BO_USE_SW_WRITE_OFTEN},
-               {DRV_FORMAT_ARGB8888, DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR |
-                                     DRV_BO_USE_RENDERING | DRV_BO_USE_HW_TEXTURE |
-                                     DRV_BO_USE_HW_RENDER | DRV_BO_USE_HW_2D |
-                                     DRV_BO_USE_SW_READ_RARELY | DRV_BO_USE_SW_WRITE_RARELY},
-               {DRV_FORMAT_ARGB8888, DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR |
-                                     DRV_BO_USE_LINEAR | DRV_BO_USE_SW_READ_OFTEN |
-                                     DRV_BO_USE_SW_WRITE_OFTEN},
-               {DRV_FORMAT_XBGR8888, DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR |
-                                     DRV_BO_USE_RENDERING | DRV_BO_USE_HW_TEXTURE |
-                                     DRV_BO_USE_HW_RENDER | DRV_BO_USE_HW_2D |
-                                     DRV_BO_USE_SW_READ_RARELY | DRV_BO_USE_SW_WRITE_RARELY},
-               {DRV_FORMAT_ABGR8888, DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR |
-                                     DRV_BO_USE_RENDERING | DRV_BO_USE_HW_TEXTURE |
-                                     DRV_BO_USE_HW_RENDER | DRV_BO_USE_HW_2D |
-                                     DRV_BO_USE_SW_READ_RARELY | DRV_BO_USE_SW_WRITE_RARELY},
-               {DRV_FORMAT_XRGB1555, DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR |
-                                     DRV_BO_USE_RENDERING | DRV_BO_USE_HW_TEXTURE |
-                                     DRV_BO_USE_HW_RENDER | DRV_BO_USE_HW_2D |
-                                     DRV_BO_USE_SW_READ_RARELY | DRV_BO_USE_SW_WRITE_RARELY},
-               {DRV_FORMAT_ARGB1555, DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR |
-                                     DRV_BO_USE_RENDERING | DRV_BO_USE_HW_TEXTURE |
-                                     DRV_BO_USE_HW_RENDER | DRV_BO_USE_HW_2D |
-                                     DRV_BO_USE_SW_READ_RARELY | DRV_BO_USE_SW_WRITE_RARELY},
-               {DRV_FORMAT_RGB565,   DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR |
-                                     DRV_BO_USE_RENDERING | DRV_BO_USE_HW_TEXTURE |
-                                     DRV_BO_USE_HW_RENDER | DRV_BO_USE_HW_2D |
-                                     DRV_BO_USE_SW_READ_RARELY | DRV_BO_USE_SW_WRITE_RARELY},
-               {DRV_FORMAT_UYVY,     DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR |
-                                     DRV_BO_USE_RENDERING | DRV_BO_USE_HW_TEXTURE |
-                                     DRV_BO_USE_HW_RENDER | DRV_BO_USE_HW_2D |
-                                     DRV_BO_USE_SW_READ_RARELY | DRV_BO_USE_SW_WRITE_RARELY},
-               {DRV_FORMAT_UYVY,     DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR |
-                                     DRV_BO_USE_LINEAR | DRV_BO_USE_SW_READ_OFTEN |
-                                     DRV_BO_USE_SW_WRITE_OFTEN},
-               {DRV_FORMAT_YUYV,     DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR |
-                                     DRV_BO_USE_RENDERING | DRV_BO_USE_HW_TEXTURE |
-                                     DRV_BO_USE_HW_RENDER | DRV_BO_USE_HW_2D |
-                                     DRV_BO_USE_SW_READ_RARELY | DRV_BO_USE_SW_WRITE_RARELY},
-               {DRV_FORMAT_YUYV,     DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR |
-                                     DRV_BO_USE_LINEAR | DRV_BO_USE_SW_READ_OFTEN |
-                                     DRV_BO_USE_SW_WRITE_OFTEN},
-               {DRV_FORMAT_R8,       DRV_BO_USE_SCANOUT | DRV_BO_USE_LINEAR |
-                                     DRV_BO_USE_SW_READ_OFTEN | DRV_BO_USE_SW_WRITE_OFTEN},
-               {DRV_FORMAT_GR88,     DRV_BO_USE_SCANOUT | DRV_BO_USE_LINEAR |
-                                     DRV_BO_USE_SW_READ_OFTEN | DRV_BO_USE_SW_WRITE_OFTEN},
-       }
 };
 
 #endif