Reland "minigbm: i915: remove KMS query"
This reverts commit b0787a9fdb40b580c473d79d0e55070a1fd4844a.
Reason for revert: I want to avoid a potentially broken build due to the revert. My local build is taking too long.
BUG=b:149959202
Exempt-From-Owner-Approval: reland change.
Original change's description:
> Revert "minigbm: i915: remove KMS query"
>
> This reverts commit 0254a661f1511cea63d1b993d3d2b1457e371e36.
>
> Reason for revert: speculative revert to address octopus breakages
>
> BUG=b:149959202
> Exempt-From-Owner-Approval: revert change.
>
>
> Original change's description:
> > minigbm: i915: remove KMS query
> >
> > This simplifies the code. We just have to make sure:
> >
> > - the scanout flag goes to X-tiled.
> >
> > BUG=b:145747132
> > TEST=compile and run on Nami
> >
> > Cq-Depend: chromium:1998011
> > Change-Id: Ic2a1c367017c28abc3a9307bea53c577bc33e31e
> > Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/1976275
> > Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
> > Tested-by: Gurchetan Singh <gurchetansingh@chromium.org>
> > Commit-Queue: Gurchetan Singh <gurchetansingh@chromium.org>
> > Auto-Submit: Gurchetan Singh <gurchetansingh@chromium.org>
>
> Bug: b:145747132
> Change-Id: If6aa7e3623461b8f837dec581934ed86d4c4a573
> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/2073173
> Tested-by: Ilja H. Friedel <ihf@chromium.org>
> Reviewed-by: Jao-ke Chin-Lee <jchinlee@google.com>
> Commit-Queue: Jao-ke Chin-Lee <jchinlee@google.com>
Bug: b:149959202, b:145747132
Change-Id: I529f24309ee33bc6b500c65fd83a7f282dafef05
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/2073478
Reviewed-by: Ilja H. Friedel <ihf@chromium.org>
Reviewed-by: Jao-ke Chin-Lee <jchinlee@google.com>
Commit-Queue: Ilja H. Friedel <ihf@chromium.org>
Tested-by: Ilja H. Friedel <ihf@chromium.org>
diff --git a/i915.c b/i915.c
index 27ff209..d0c9db1 100644
--- a/i915.c
+++ b/i915.c
@@ -23,14 +23,16 @@
#define I915_CACHELINE_SIZE 64
#define I915_CACHELINE_MASK (I915_CACHELINE_SIZE - 1)
-static const uint32_t render_target_formats[] = { DRM_FORMAT_ABGR16161616F, DRM_FORMAT_ABGR2101010,
- DRM_FORMAT_ABGR8888, DRM_FORMAT_ARGB2101010,
- DRM_FORMAT_ARGB8888, DRM_FORMAT_RGB565,
- DRM_FORMAT_XBGR2101010, DRM_FORMAT_XBGR8888,
- DRM_FORMAT_XRGB2101010, DRM_FORMAT_XRGB8888 };
+static const uint32_t scanout_render_formats[] = { DRM_FORMAT_ABGR2101010, DRM_FORMAT_ABGR8888,
+ DRM_FORMAT_ARGB2101010, DRM_FORMAT_ARGB8888,
+ DRM_FORMAT_RGB565, DRM_FORMAT_XBGR2101010,
+ DRM_FORMAT_XBGR8888, DRM_FORMAT_XRGB2101010,
+ DRM_FORMAT_XRGB8888 };
-static const uint32_t texture_source_formats[] = { DRM_FORMAT_R8, DRM_FORMAT_NV12, DRM_FORMAT_P010,
- DRM_FORMAT_YVU420, DRM_FORMAT_YVU420_ANDROID };
+static const uint32_t render_formats[] = { DRM_FORMAT_ABGR16161616F };
+
+static const uint32_t texture_only_formats[] = { DRM_FORMAT_R8, DRM_FORMAT_NV12, DRM_FORMAT_P010,
+ DRM_FORMAT_YVU420, DRM_FORMAT_YVU420_ANDROID };
struct i915_device {
uint32_t gen;
@@ -49,109 +51,49 @@
return 4;
}
-/*
- * We allow allocation of ARGB formats for SCANOUT if the corresponding XRGB
- * formats supports it. It's up to the caller (chrome ozone) to ultimately not
- * scan out ARGB if the display controller only supports XRGB, but we'll allow
- * the allocation of the bo here.
- */
-static bool format_compatible(const struct combination *combo, uint32_t format)
+static uint64_t unset_flags(uint64_t current_flags, uint64_t mask)
{
- if (combo->format == format)
- return true;
-
- switch (format) {
- case DRM_FORMAT_XRGB8888:
- return combo->format == DRM_FORMAT_ARGB8888;
- case DRM_FORMAT_XBGR8888:
- return combo->format == DRM_FORMAT_ABGR8888;
- case DRM_FORMAT_RGBX8888:
- return combo->format == DRM_FORMAT_RGBA8888;
- case DRM_FORMAT_BGRX8888:
- return combo->format == DRM_FORMAT_BGRA8888;
- case DRM_FORMAT_XRGB2101010:
- return combo->format == DRM_FORMAT_ARGB2101010;
- case DRM_FORMAT_XBGR2101010:
- return combo->format == DRM_FORMAT_ABGR2101010;
- default:
- return false;
- }
-}
-
-static int i915_add_kms_item(struct driver *drv, const struct kms_item *item)
-{
- uint32_t i;
- struct combination *combo;
-
- /*
- * Older hardware can't scanout Y-tiled formats. Newer devices can, and
- * report this functionality via format modifiers.
- */
- for (i = 0; i < drv_array_size(drv->combos); i++) {
- combo = (struct combination *)drv_array_at_idx(drv->combos, i);
- if (!format_compatible(combo, item->format))
- continue;
-
- if (item->modifier == DRM_FORMAT_MOD_LINEAR &&
- 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->use_flags |= item->use_flags & ~BO_USE_CURSOR;
- }
-
- /* If we can scanout NV12, we support all tiling modes. */
- if (item->format == DRM_FORMAT_NV12)
- combo->use_flags |= item->use_flags;
-
- if (combo->metadata.modifier == item->modifier)
- combo->use_flags |= item->use_flags;
- }
-
- return 0;
+ uint64_t value = current_flags & ~mask;
+ return value;
}
static int i915_add_combinations(struct driver *drv)
{
- int ret;
- uint32_t i;
- struct drv_array *kms_items;
struct format_metadata metadata;
- uint64_t render_use_flags, texture_use_flags;
+ uint64_t render, scanout_and_render, texture_only;
- render_use_flags = BO_USE_RENDER_MASK;
- texture_use_flags = BO_USE_TEXTURE_MASK;
+ scanout_and_render = BO_USE_RENDER_MASK | BO_USE_SCANOUT;
+ render = BO_USE_RENDER_MASK;
+ texture_only = BO_USE_TEXTURE_MASK;
+ uint64_t linear_mask = BO_USE_RENDERSCRIPT | BO_USE_LINEAR | BO_USE_PROTECTED |
+ BO_USE_SW_READ_OFTEN | BO_USE_SW_WRITE_OFTEN;
metadata.tiling = I915_TILING_NONE;
metadata.priority = 1;
metadata.modifier = DRM_FORMAT_MOD_LINEAR;
- drv_add_combinations(drv, render_target_formats, ARRAY_SIZE(render_target_formats),
- &metadata, render_use_flags);
+ drv_add_combinations(drv, scanout_render_formats, ARRAY_SIZE(scanout_render_formats),
+ &metadata, scanout_and_render);
- drv_add_combinations(drv, texture_source_formats, ARRAY_SIZE(texture_source_formats),
- &metadata, texture_use_flags);
+ drv_add_combinations(drv, render_formats, ARRAY_SIZE(render_formats), &metadata, render);
+ drv_add_combinations(drv, texture_only_formats, ARRAY_SIZE(texture_only_formats), &metadata,
+ texture_only);
+
+ drv_modify_linear_combinations(drv);
/*
* Chrome uses DMA-buf mmap to write to YV12 buffers, which are then accessed by the
* Video Encoder Accelerator (VEA). It could also support NV12 potentially in the future.
*/
drv_modify_combination(drv, DRM_FORMAT_YVU420, &metadata, BO_USE_HW_VIDEO_ENCODER);
+ /* IPU3 camera ISP supports only NV12 output. */
drv_modify_combination(drv, DRM_FORMAT_NV12, &metadata,
- BO_USE_HW_VIDEO_ENCODER | BO_USE_HW_VIDEO_DECODER);
+ BO_USE_HW_VIDEO_ENCODER | BO_USE_HW_VIDEO_DECODER |
+ BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE | BO_USE_SCANOUT);
/* Android CTS tests require this. */
drv_add_combination(drv, DRM_FORMAT_BGR888, &metadata, BO_USE_SW_MASK);
- drv_modify_combination(drv, DRM_FORMAT_XRGB8888, &metadata, BO_USE_CURSOR | BO_USE_SCANOUT);
- drv_modify_combination(drv, DRM_FORMAT_ARGB8888, &metadata, BO_USE_CURSOR | BO_USE_SCANOUT);
-
- /* IPU3 camera ISP supports only NV12 output. */
- drv_modify_combination(drv, DRM_FORMAT_NV12, &metadata,
- BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE);
/*
* R8 format is used for Android's HAL_PIXEL_FORMAT_BLOB and is used for JPEG snapshots
* from camera.
@@ -159,51 +101,37 @@
drv_modify_combination(drv, DRM_FORMAT_R8, &metadata,
BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE);
- render_use_flags &= ~BO_USE_RENDERSCRIPT;
- render_use_flags &= ~BO_USE_SW_WRITE_OFTEN;
- render_use_flags &= ~BO_USE_SW_READ_OFTEN;
- render_use_flags &= ~BO_USE_LINEAR;
- render_use_flags &= ~BO_USE_PROTECTED;
-
- texture_use_flags &= ~BO_USE_RENDERSCRIPT;
- texture_use_flags &= ~BO_USE_SW_WRITE_OFTEN;
- texture_use_flags &= ~BO_USE_SW_READ_OFTEN;
- texture_use_flags &= ~BO_USE_LINEAR;
- texture_use_flags &= ~BO_USE_PROTECTED;
+ render = unset_flags(render, linear_mask);
+ scanout_and_render = unset_flags(scanout_and_render, linear_mask);
metadata.tiling = I915_TILING_X;
metadata.priority = 2;
metadata.modifier = I915_FORMAT_MOD_X_TILED;
- drv_add_combinations(drv, render_target_formats, ARRAY_SIZE(render_target_formats),
- &metadata, render_use_flags);
+ drv_add_combinations(drv, render_formats, ARRAY_SIZE(render_formats), &metadata, render);
+ drv_add_combinations(drv, scanout_render_formats, ARRAY_SIZE(scanout_render_formats),
+ &metadata, scanout_and_render);
metadata.tiling = I915_TILING_Y;
metadata.priority = 3;
metadata.modifier = I915_FORMAT_MOD_Y_TILED;
- drv_add_combinations(drv, render_target_formats, ARRAY_SIZE(render_target_formats),
- &metadata, render_use_flags);
-
- /* Support y-tiled NV12 and P010 for libva */
+ scanout_and_render = unset_flags(scanout_and_render, BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY);
+/* Support y-tiled NV12 and P010 for libva */
+#ifdef I915_SCANOUT_Y_TILED
+ drv_add_combination(drv, DRM_FORMAT_NV12, &metadata,
+ BO_USE_TEXTURE | BO_USE_HW_VIDEO_DECODER | BO_USE_SCANOUT);
+#else
drv_add_combination(drv, DRM_FORMAT_NV12, &metadata,
BO_USE_TEXTURE | BO_USE_HW_VIDEO_DECODER);
+#endif
+ scanout_and_render = unset_flags(scanout_and_render, BO_USE_SCANOUT);
drv_add_combination(drv, DRM_FORMAT_P010, &metadata,
BO_USE_TEXTURE | BO_USE_HW_VIDEO_DECODER);
- kms_items = drv_query_kms(drv);
- if (!kms_items)
- return 0;
-
- for (i = 0; i < drv_array_size(kms_items); i++) {
- ret = i915_add_kms_item(drv, (struct kms_item *)drv_array_at_idx(kms_items, i));
- if (ret) {
- drv_array_destroy(kms_items);
- return ret;
- }
- }
-
- drv_array_destroy(kms_items);
+ drv_add_combinations(drv, render_formats, ARRAY_SIZE(render_formats), &metadata, render);
+ drv_add_combinations(drv, scanout_render_formats, ARRAY_SIZE(scanout_render_formats),
+ &metadata, scanout_and_render);
return 0;
}