OSDN Git Service

minigbm: i915: Fix handling of format modifiers
[android-x86/external-minigbm.git] / i915.c
diff --git a/i915.c b/i915.c
index 87bb438..adf2739 100644 (file)
--- a/i915.c
+++ b/i915.c
@@ -25,8 +25,9 @@ static const uint32_t render_target_formats[] = { DRM_FORMAT_ARGB1555, DRM_FORMA
                                                  DRM_FORMAT_XBGR8888, DRM_FORMAT_XRGB1555,
                                                  DRM_FORMAT_XRGB8888 };
 
-static const uint32_t tileable_texture_source_formats[] = { DRM_FORMAT_GR88, DRM_FORMAT_R8,
-                                                           DRM_FORMAT_UYVY, DRM_FORMAT_YUYV };
+static const uint32_t tileable_texture_source_formats[] = { DRM_FORMAT_GR88, DRM_FORMAT_NV12,
+                                                           DRM_FORMAT_R8, DRM_FORMAT_UYVY,
+                                                           DRM_FORMAT_YUYV };
 
 static const uint32_t texture_source_formats[] = { DRM_FORMAT_YVU420, DRM_FORMAT_YVU420_ANDROID };
 
@@ -58,17 +59,22 @@ static int i915_add_kms_item(struct driver *drv, const struct kms_item *item)
         */
        for (i = 0; i < drv->backend->combos.size; i++) {
                combo = &drv->backend->combos.data[i];
-               if (combo->format == item->format) {
-                       if ((combo->metadata.tiling == I915_TILING_Y &&
-                            item->modifier == I915_FORMAT_MOD_Y_TILED) ||
-                           (combo->metadata.tiling == I915_TILING_X &&
-                            item->modifier == I915_FORMAT_MOD_X_TILED)) {
-                               combo->metadata.modifier = item->modifier;
-                               combo->usage |= item->usage;
-                       } else if (combo->metadata.tiling != I915_TILING_Y) {
-                               combo->usage |= item->usage;
-                       }
+               if (combo->format != item->format)
+                       continue;
+
+               if (item->modifier == DRM_FORMAT_MOD_NONE &&
+                   combo->metadata.tiling == I915_TILING_X) {
+                       /*
+                        * FIXME: drv_query_kms() does not report the available modifiers
+                        * yet, but we know that all hardware can scanout from X-tiled
+                        * buffers, so let's add this to our combinations, except for
+                        * cursor, which must not be tiled.
+                        */
+                       combo->usage |= item->usage & ~BO_USE_CURSOR;
                }
+
+               if (combo->metadata.modifier == item->modifier)
+                       combo->usage |= item->usage;
        }
 
        return 0;
@@ -118,6 +124,7 @@ static int i915_add_combinations(struct driver *drv)
 
        metadata.tiling = I915_TILING_X;
        metadata.priority = 2;
+       metadata.modifier = I915_FORMAT_MOD_X_TILED;
 
        ret = drv_add_combinations(drv, render_target_formats, ARRAY_SIZE(render_target_formats),
                                   &metadata, render_flags);
@@ -132,6 +139,7 @@ static int i915_add_combinations(struct driver *drv)
 
        metadata.tiling = I915_TILING_Y;
        metadata.priority = 3;
+       metadata.modifier = I915_FORMAT_MOD_Y_TILED;
 
        ret = drv_add_combinations(drv, render_target_formats, ARRAY_SIZE(render_target_formats),
                                   &metadata, render_flags);
@@ -348,6 +356,7 @@ static int i915_bo_import(struct bo *bo, struct drv_import_fd_data *data)
 
        ret = drmIoctl(bo->drv->fd, DRM_IOCTL_I915_GEM_GET_TILING, &gem_get_tiling);
        if (ret) {
+               drv_gem_bo_destroy(bo);
                fprintf(stderr, "drv: DRM_IOCTL_I915_GEM_GET_TILING failed.");
                return ret;
        }
@@ -425,7 +434,7 @@ static int i915_bo_unmap(struct bo *bo, struct map_info *data)
        return munmap(data->addr, data->length);
 }
 
-static uint32_t i915_resolve_format(uint32_t format)
+static uint32_t i915_resolve_format(uint32_t format, uint64_t usage)
 {
        switch (format) {
        case DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED: