From dbe7f03f0c3318f55523217c7d06151c32cbd8e3 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Mon, 29 Aug 2022 13:29:20 -0400 Subject: [PATCH] virtgpu_virgl: Add basic support for modifiers In recent kernel versions virtgpu reports support for the linear modifier due to commit "drm: add support modifiers for drivers whose planes only support linear layout" [1]. This causes the UI to when it calls gbm_bo_create_with_modifiers; it hits an early return in drv_bo_create_with_modifiers due to the virtgpu backend setting neither bo_create_with_modifiers nor bo_compute_metadata. Fix by adding a virgl_bo_create_with_modifiers modeled on dumb_bo_create_with_modifiers. If the requested modifiers include the linear modifier, pass the request on to virgl_bo_create. Otherwise fail with EINVAL. [1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8be576837b6e62b2ad0de2f9ba31cef618fa2891 BUG=b:243569755 TEST=Deploy minigbm to a reven-kernelnext VM TEST=Restart UI, observe UI is no longer black TEST=Logs don't show "Failed to create scanout buffer" errors Change-Id: If8d02225a7a50600b5ae4685cc963ad391bd9bf7 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3862241 Reviewed-by: Dominik Behr Commit-Queue: Dominik Behr Tested-by: Nicholas Bishop Auto-Submit: Nicholas Bishop --- virtgpu_virgl.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/virtgpu_virgl.c b/virtgpu_virgl.c index 9bc3ac0..92864ef 100644 --- a/virtgpu_virgl.c +++ b/virtgpu_virgl.c @@ -776,6 +776,20 @@ static int virgl_bo_create(struct bo *bo, uint32_t width, uint32_t height, uint3 return virgl_2d_dumb_bo_create(bo, width, height, format, use_flags); } +static int virgl_bo_create_with_modifiers(struct bo *bo, uint32_t width, uint32_t height, + uint32_t format, const uint64_t *modifiers, uint32_t count) +{ + uint64_t use_flags = 0; + + for (uint32_t i = 0; i < count; i++) { + if (modifiers[i] == DRM_FORMAT_MOD_LINEAR) { + return virgl_bo_create(bo, width, height, format, use_flags); + } + } + + return -EINVAL; +} + static int virgl_bo_destroy(struct bo *bo) { if (params[param_3d].value) @@ -1100,6 +1114,7 @@ const struct backend virtgpu_virgl = { .name = "virtgpu_virgl", .init = virgl_init, .close = virgl_close, .bo_create = virgl_bo_create, + .bo_create_with_modifiers = virgl_bo_create_with_modifiers, .bo_destroy = virgl_bo_destroy, .bo_import = drv_prime_bo_import, .bo_map = virgl_bo_map,