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 <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
> Tested-by: Kristian H. Kristensen <hoegsberg@chromium.org>
> Reviewed-by: Kristian H. Kristensen <hoegsberg@chromium.org>
Bug: 822346
Change-Id: Icf0921dc91ac422da26371bffea34b26550b8234
Reviewed-on: https://chromium-review.googlesource.com/
1073877
Commit-Ready: Kristian H. Kristensen <hoegsberg@chromium.org>
Tested-by: Kristian H. Kristensen <hoegsberg@chromium.org>
Reviewed-by: Kristian H. Kristensen <hoegsberg@chromium.org>
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;
#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
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
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;
}
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;
}
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;