From 3cb5bbacc5c8a79105c868875222696f6b9d8296 Mon Sep 17 00:00:00 2001 From: "Kristian H. Kristensen" Date: Wed, 4 Apr 2018 16:10:42 -0700 Subject: [PATCH] Reland "i915: Add GBM_BO_USE_HW_VIDEO_DECODER use flag" This is a reland of 1bd7b04a3ae68c0314bdee06c559093de9e5a304 We've landed CL:1070995 which fixes the missing modifier that caused tiling corruption on pre-KBL Intel devices and CL:1072638 which makes the failing vda unittests use SCANOUT_VDA_WRITE as they were supposed to. Original change's description: > i915: Add GBM_BO_USE_HW_VIDEO_DECODER use flag > > This flag is used to indicate that the platform video decoder will be > writing into this buffer and that it should be allocated > accordingly. On Intel, this means that we have to allocate y-tiled > NV12 for libva to be able to decode to the buffer. > > We force gralloc NV12 allocations to be linear for now, since ARC++ > doesn't properly pass modifiers to ChromeOS. > > BUG=822346 > TEST=test_that graphics_Gbm > > Change-Id: I840c30d22355d26816df718b49717407e2e4620f > Reviewed-on: https://chromium-review.googlesource.com/996648 > Commit-Ready: ChromeOS CL Exonerator Bot > Tested-by: Kristian H. Kristensen > Reviewed-by: Kristian H. Kristensen Bug: 822346 Change-Id: Icf0921dc91ac422da26371bffea34b26550b8234 Reviewed-on: https://chromium-review.googlesource.com/1073877 Commit-Ready: Kristian H. Kristensen Tested-by: Kristian H. Kristensen Reviewed-by: Kristian H. Kristensen --- cros_gralloc/cros_gralloc_driver.cc | 12 +++++++++++- drv.h | 2 ++ gbm.h | 4 ++++ gbm_helpers.c | 2 ++ i915.c | 9 +++++++++ 5 files changed, 28 insertions(+), 1 deletion(-) diff --git a/cros_gralloc/cros_gralloc_driver.cc b/cros_gralloc/cros_gralloc_driver.cc index a68023e..31282bc 100644 --- a/cros_gralloc/cros_gralloc_driver.cc +++ b/cros_gralloc/cros_gralloc_driver.cc @@ -91,13 +91,23 @@ int32_t cros_gralloc_driver::allocate(const struct cros_gralloc_buffer_descripto size_t num_planes; uint32_t resolved_format; uint32_t bytes_per_pixel; + uint64_t use_flags; struct bo *bo; struct cros_gralloc_handle *hnd; resolved_format = drv_resolve_format(drv_, descriptor->drm_format, descriptor->use_flags); + use_flags = descriptor->use_flags; + /* + * TODO(b/79682290): ARC++ assumes NV12 is always linear and doesn't + * send modifiers across Wayland protocol, so we or in the + * BO_USE_LINEAR flag here. We need to fix ARC++ to allocate and work + * with tiled buffers. + */ + if (resolved_format == DRM_FORMAT_NV12) + use_flags |= BO_USE_LINEAR; bo = drv_bo_create(drv_, descriptor->width, descriptor->height, resolved_format, - descriptor->use_flags); + use_flags); if (!bo) { drv_log("Failed to create bo.\n"); return -ENOMEM; diff --git a/drv.h b/drv.h index 9ca77d3..d27e845 100644 --- a/drv.h +++ b/drv.h @@ -37,6 +37,8 @@ extern "C" { #define BO_USE_CAMERA_READ (1ull << 14) #define BO_USE_RENDERSCRIPT (1ull << 16) #define BO_USE_TEXTURE (1ull << 17) +#define BO_USE_HW_VIDEO_DECODER (1ull << 18) + /* Map flags */ #define BO_MAP_NONE 0 diff --git a/gbm.h b/gbm.h index da993c2..ce05ce3 100644 --- a/gbm.h +++ b/gbm.h @@ -265,6 +265,10 @@ enum gbm_bo_flags { GBM_BO_USE_SW_READ_RARELY = (1 << 10), GBM_BO_USE_SW_WRITE_OFTEN = (1 << 11), GBM_BO_USE_SW_WRITE_RARELY = (1 << 12), + /** + * The buffer will be written by a video decode accelerator. + */ + GBM_BO_USE_HW_VIDEO_DECODER = (1 << 13), }; int diff --git a/gbm_helpers.c b/gbm_helpers.c index 2683669..81d1680 100644 --- a/gbm_helpers.c +++ b/gbm_helpers.c @@ -40,6 +40,8 @@ uint64_t gbm_convert_usage(uint32_t usage) use_flags |= BO_USE_SW_WRITE_OFTEN; if (usage & GBM_BO_USE_SW_WRITE_RARELY) use_flags |= BO_USE_SW_WRITE_RARELY; + if (usage & GBM_BO_USE_HW_VIDEO_DECODER) + use_flags |= BO_USE_HW_VIDEO_DECODER; return use_flags; } diff --git a/i915.c b/i915.c index 8e1871a..6df6dcc 100644 --- a/i915.c +++ b/i915.c @@ -101,6 +101,10 @@ static int i915_add_kms_item(struct driver *drv, const struct kms_item *item) 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; } @@ -178,6 +182,11 @@ static int i915_add_combinations(struct driver *drv) ARRAY_SIZE(tileable_texture_source_formats), &metadata, texture_use_flags); + /* Support y-tiled NV12 for libva */ + const uint32_t nv12_format = DRM_FORMAT_NV12; + drv_add_combinations(drv, &nv12_format, 1, &metadata, + BO_USE_TEXTURE | BO_USE_HW_VIDEO_DECODER); + kms_items = drv_query_kms(drv); if (!kms_items) return 0; -- 2.11.0