msm: Add P010 support
7180 can produce P010 frames, but they can't be
scanned out. 7280 can produce and scan out.
BUG=b:183020822
TEST=v4l2_stateful_decoder -f vp9_2_test_file.ivf -o P010
Cq-Depend: chromium:3100276
Change-Id: I79cc60f26268cccd683a45609384b62a752ae44c
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3100277
Tested-by: Fritz Koenig <frkoenig@chromium.org>
Auto-Submit: Fritz Koenig <frkoenig@chromium.org>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Commit-Queue: Fritz Koenig <frkoenig@chromium.org>
diff --git a/msm.c b/msm.c
index a4c56d9..694fd58 100644
--- a/msm.c
+++ b/msm.c
@@ -41,7 +41,8 @@
DRM_FORMAT_XRGB8888 };
static const uint32_t texture_source_formats[] = { DRM_FORMAT_NV12, DRM_FORMAT_R8,
- DRM_FORMAT_YVU420, DRM_FORMAT_YVU420_ANDROID };
+ DRM_FORMAT_YVU420, DRM_FORMAT_YVU420_ANDROID,
+ DRM_FORMAT_P010 };
/*
* Each macrotile consists of m x n (mostly 4 x 4) tiles.
@@ -94,10 +95,15 @@
/* NV12 format requires extra padding with platform
* specific alignments for venus driver
*/
- if (bo->meta.format == DRM_FORMAT_NV12) {
+ if (bo->meta.format == DRM_FORMAT_NV12 || bo->meta.format == DRM_FORMAT_P010) {
uint32_t y_stride, uv_stride, y_scanline, uv_scanline, y_plane, uv_plane, size,
extra_padding;
+ // P010 has the same layout as NV12. The difference is that each
+ // pixel in P010 takes 2 bytes, while in NV12 each pixel takes 1 byte.
+ if (bo->meta.format == DRM_FORMAT_P010)
+ width *= 2;
+
y_stride = ALIGN(width, VENUS_STRIDE_ALIGN);
uv_stride = ALIGN(width, VENUS_STRIDE_ALIGN);
y_scanline = ALIGN(height, VENUS_SCANLINE_ALIGN * 2);
@@ -264,6 +270,11 @@
/* Android CTS tests require this. */
drv_add_combination(drv, DRM_FORMAT_BGR888, &LINEAR_METADATA, BO_USE_SW_MASK);
+#ifdef SC_7280
+ drv_modify_combination(drv, DRM_FORMAT_P010, &LINEAR_METADATA,
+ BO_USE_SCANOUT | BO_USE_HW_VIDEO_ENCODER);
+#endif
+
drv_modify_linear_combinations(drv);
if (should_avoid_ubwc() || !drv->compression)