From d4df3d57ebb3ef7a2e77e69570133c128e862db3 Mon Sep 17 00:00:00 2001 From: Hsin-Yi Wang Date: Mon, 28 Mar 2022 13:29:06 +0800 Subject: minigbm: mediatek: remove USE_SCANOUT in yuv format minigbm clients use the SCANOUT flag whenever they want the minigbm-allocated buffers to be promoted to overlays. Mediatek doesn't support YUV overlays, so remove the SCANOUT flag. BUG=b:224698291 TEST=emerge on elm, emerge and deploy on kukui/jacuzzi Change-Id: If3ee2fb925c7e729269c31caab991bb0bc56b0de Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3555233 Tested-by: Hsin-Yi Wang Feels: Hsin-Yi Wang Auto-Submit: Hsin-Yi Wang Reviewed-by: Miguel Casas Commit-Queue: Hsin-Yi Wang --- mediatek.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/mediatek.c b/mediatek.c index 076f478..17de0d3 100644 --- a/mediatek.c +++ b/mediatek.c @@ -59,7 +59,6 @@ static const uint32_t texture_source_formats[] = { DRM_FORMAT_YVU420_ANDROID }; -#ifdef DONT_USE_64_ALIGNMENT_FOR_VIDEO_BUFFERS static const uint32_t video_yuv_formats[] = { DRM_FORMAT_NV21, DRM_FORMAT_NV12, @@ -77,7 +76,6 @@ static bool is_video_yuv_format(uint32_t format) } return false; } -#endif static int mediatek_init(struct driver *drv) { @@ -361,12 +359,12 @@ static void mediatek_resolve_format_and_use_flags(struct driver *drv, uint32_t f *out_format = DRM_FORMAT_YVU420; *out_use_flags &= ~BO_USE_SCANOUT; break; - case DRM_FORMAT_YVU420_ANDROID: - *out_use_flags &= ~BO_USE_SCANOUT; - break; default: break; } + /* Mediatek doesn't support YUV overlays */ + if (is_video_yuv_format(format)) + *out_use_flags &= ~BO_USE_SCANOUT; } const struct backend backend_mediatek = { -- cgit v1.2.3 From 853b8542fbf5711cca4b00d0e30cd3e559c925fd Mon Sep 17 00:00:00 2001 From: Kazuhiro Inaba Date: Tue, 5 Apr 2022 03:20:05 +0000 Subject: Revert "minigbm: i915/amdgpu: Update plane count in bo_import" This reverts commit 1a733377e91b9e714541ea1f51e1f5808b32897c. Reason for revert: Broke many ARC tests b/227807607 b/227830888 Original change's description: > minigbm: i915/amdgpu: Update plane count in bo_import > > For format/modifier combination where the plane count does not > match the `DRM_FORMAT_MOD_INVALID` case, importing BOs > (via e.g. `gbm_bo_import`) currently fails as `bo->meta.num_planes` > is not set correctly. > > Fix that by making the driver backends that support such > format/modifier combinations update the plane count accordingly. > > > minigbm: i915: Implement num_planes_from_modifier interface > > Some format/modifier combinations have different plane counts > compared to the formats default (i.e. when the modifier is > `DRM_FORMAT_MOD_INVALID`). > > Right now the supported cases are hardcoded in > `i915_bo_compute_metadata()`, however this does not cover all > use-cases. So implement the already existing backend interface, > aligning i915 with e.g. amdgpu. > > Bug:b:224580219 > Change-Id: If017997c70ab7da04ebf9d6cb9db775d9271ed05 > Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3516490 > Reviewed-by: Bas Nieuwenhuizen > Tested-by: Bas Nieuwenhuizen > Commit-Queue: Bas Nieuwenhuizen Bug: b:224580219 Change-Id: I334f8cedb1d0414ecd0a38217afa4afc0df6ab47 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3568890 Bot-Commit: Rubber Stamper Tested-by: Kazuhiro Inaba Auto-Submit: Kazuhiro Inaba Reviewed-by: Tadashi G. Takaoka Commit-Queue: Tadashi G. Takaoka Owners-Override: Tadashi G. Takaoka --- amdgpu.c | 3 --- i915.c | 21 ++------------------- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/amdgpu.c b/amdgpu.c index 700a8c7..f0053d6 100644 --- a/amdgpu.c +++ b/amdgpu.c @@ -625,9 +625,6 @@ static int amdgpu_import_bo(struct bo *bo, struct drv_import_fd_data *data) dri_tiling = combo->metadata.tiling != TILE_TYPE_LINEAR; } - bo->meta.num_planes = dri_num_planes_from_modifier(bo->drv, data->format, - data->format_modifier); - if (dri_tiling) return dri_bo_import(bo, data); else diff --git a/i915.c b/i915.c index de33cd8..6a44448 100644 --- a/i915.c +++ b/i915.c @@ -440,19 +440,6 @@ static int i915_bo_from_format(struct bo *bo, uint32_t width, uint32_t height, u return 0; } -static size_t i915_num_planes_from_modifier(struct driver *drv, uint32_t format, - uint64_t modifier) -{ - size_t num_planes = drv_num_planes_from_format(format); - if (modifier == I915_FORMAT_MOD_Y_TILED_CCS || - modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS) { - assert(num_planes == 1); - return 2; - } - - return num_planes; -} - static int i915_bo_compute_metadata(struct bo *bo, uint32_t width, uint32_t height, uint32_t format, uint64_t use_flags, const uint64_t *modifiers, uint32_t count) { @@ -577,7 +564,7 @@ static int i915_bo_compute_metadata(struct bo *bo, uint32_t width, uint32_t heig bo->meta.offsets[1] = offset; offset += ccs_size; - bo->meta.num_planes = i915_num_planes_from_modifier(bo->drv, format, modifier); + bo->meta.num_planes = 2; bo->meta.total_size = offset; } else if (modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS) { @@ -612,7 +599,7 @@ static int i915_bo_compute_metadata(struct bo *bo, uint32_t width, uint32_t heig bo->meta.sizes[1] = ALIGN(bo->meta.sizes[0] / 256, getpagesize()); bo->meta.offsets[1] = bo->meta.sizes[0]; /* Total number of planes & sizes */ - bo->meta.num_planes = i915_num_planes_from_modifier(bo->drv, format, modifier); + bo->meta.num_planes = 2; bo->meta.total_size = bo->meta.sizes[0] + bo->meta.sizes[1]; } else { i915_bo_from_format(bo, width, height, format); @@ -690,9 +677,6 @@ static int i915_bo_import(struct bo *bo, struct drv_import_fd_data *data) int ret; struct drm_i915_gem_get_tiling gem_get_tiling = { 0 }; - bo->meta.num_planes = i915_num_planes_from_modifier(bo->drv, data->format, - data->format_modifier); - ret = drv_prime_bo_import(bo, data); if (ret) return ret; @@ -823,7 +807,6 @@ const struct backend backend_i915 = { .bo_invalidate = i915_bo_invalidate, .bo_flush = i915_bo_flush, .resolve_format_and_use_flags = drv_resolve_format_and_use_flags_helper, - .num_planes_from_modifier = i915_num_planes_from_modifier, }; #endif -- cgit v1.2.3 From 2581c470d653c98507f5015f63f99e55c588988d Mon Sep 17 00:00:00 2001 From: Hsin-Yi Wang Date: Wed, 6 Apr 2022 17:34:33 +0800 Subject: minigbm: mediatek: check BO_USE_CAMERA_WRITE flag on camera preview case We only want camera preview use case to use the same padding as BO_USE_HW_VIDEO_ENCODER. Previously we check this by BO_USE_SCANOUT flag. This would cause some format issues in CTS drm tests. This patch updates CL:3551188 to check for BO_USE_CAMERA_WRITE flag as well. BUG=b:227983122 TEST=check camera is normal on kukui TEST=android.media.cts.MediaDrmClearkeyTest#* pass on kukui Change-Id: I1606b677678dfafc6331713f67d327a2b6030394 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3574581 Tested-by: Hsin-Yi Wang Reviewed-by: Miguel Casas-Sanchez Reviewed-by: Miguel Casas Reviewed-by: Kazuhiro Inaba Tested-by: Kazuhiro Inaba Commit-Queue: Hsin-Yi Wang --- mediatek.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mediatek.c b/mediatek.c index 17de0d3..562b1d1 100644 --- a/mediatek.c +++ b/mediatek.c @@ -140,6 +140,12 @@ static int mediatek_bo_create_with_modifiers(struct bo *bo, uint32_t width, uint size_t plane; uint32_t stride; struct drm_mtk_gem_create gem_create = { 0 }; + /* + * We identify the ChromeOS Camera App buffers via these two USE flags. Those buffers need + * the same alignment as the video hardware encoding. + */ + const bool is_camera_preview = + (bo->meta.use_flags & BO_USE_SCANOUT) && (bo->meta.use_flags & BO_USE_CAMERA_WRITE); if (!drv_has_modifier(modifiers, count, DRM_FORMAT_MOD_LINEAR)) { errno = EINVAL; @@ -161,7 +167,7 @@ static int mediatek_bo_create_with_modifiers(struct bo *bo, uint32_t width, uint stride = ALIGN(stride, 64); #endif - if (bo->meta.use_flags & (BO_USE_HW_VIDEO_ENCODER | BO_USE_SCANOUT)) { + if ((bo->meta.use_flags & BO_USE_HW_VIDEO_ENCODER) || is_camera_preview) { uint32_t aligned_height = ALIGN(height, 32); uint32_t padding[DRV_MAX_PLANES] = { 0 }; -- cgit v1.2.3 From 17d3eb85a3946399ad79c2f6436838c23279ee7b Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Fri, 8 Apr 2022 17:37:52 -0400 Subject: dumb_driver: Support R8 camera buffers This format is used for JPEG camera data. BUG=b:228365501 TEST=emerge-reven minigbm && cros deploy dut minigbm TEST=Camera preview works on Macbook 7,1 Change-Id: Ida4b1896b68ef7db0bef76e7d6dd2e49b17b2e14 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3577364 Commit-Queue: Nicholas Bishop Tested-by: Nicholas Bishop Auto-Submit: Nicholas Bishop Reviewed-by: Yiwei Zhang Commit-Queue: Yiwei Zhang --- dumb_driver.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dumb_driver.c b/dumb_driver.c index ef7dd36..c667a51 100644 --- a/dumb_driver.c +++ b/dumb_driver.c @@ -27,7 +27,7 @@ static const uint32_t scanout_render_formats[] = { DRM_FORMAT_ARGB8888, DRM_FORM DRM_FORMAT_ABGR8888, DRM_FORMAT_XBGR8888, DRM_FORMAT_BGR888, DRM_FORMAT_RGB565 }; -static const uint32_t texture_only_formats[] = { DRM_FORMAT_NV12, DRM_FORMAT_NV21, +static const uint32_t texture_only_formats[] = { DRM_FORMAT_R8, DRM_FORMAT_NV12, DRM_FORMAT_NV21, DRM_FORMAT_YVU420, DRM_FORMAT_YVU420_ANDROID }; static int dumb_driver_init(struct driver *drv) @@ -38,6 +38,9 @@ static int dumb_driver_init(struct driver *drv) drv_add_combinations(drv, texture_only_formats, ARRAY_SIZE(texture_only_formats), &LINEAR_METADATA, BO_USE_TEXTURE_MASK); + drv_modify_combination(drv, DRM_FORMAT_R8, &LINEAR_METADATA, + BO_USE_HW_VIDEO_ENCODER | BO_USE_HW_VIDEO_DECODER | + BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE); drv_modify_combination(drv, DRM_FORMAT_NV12, &LINEAR_METADATA, BO_USE_HW_VIDEO_ENCODER | BO_USE_HW_VIDEO_DECODER | BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE); -- cgit v1.2.3 From 69ccacd3abd61c5abaafb95d74a83d326f0ae9a3 Mon Sep 17 00:00:00 2001 From: Sudarshan S Date: Fri, 18 Feb 2022 07:31:46 +0530 Subject: i915: Add ADL-N Device IDs BUG=b:220084884 TEST=emerge-nissa minigbm On DUT, check UI,video playback and camera previews Ref: https://cgit.freedesktop.org/drm/drm-tip/commit/?id=7e28d0b26759846485978ada860ef4a427e06c8f Change-Id: Ifaa7d3c8336872af07fcfe15cf0f50f83ef24f69 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3473669 Reviewed-by: Victor Ding Tested-by: Altaf Basha Reviewed-by: Dominik Behr Commit-Queue: Victor Ding --- i915.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/i915.c b/i915.c index 6a44448..f43c67c 100644 --- a/i915.c +++ b/i915.c @@ -105,7 +105,8 @@ static void i915_info_from_device_id(struct i915_device *i915) }; const uint16_t adlp_ids[] = { 0x46A0, 0x46A1, 0x46A2, 0x46A3, 0x46A6, 0x46A8, 0x46AA, 0x462A, 0x4626, 0x4628, 0x46B0, 0x46B1, - 0x46B2, 0x46B3, 0x46C0, 0x46C1, 0x46C2, 0x46C3 }; + 0x46B2, 0x46B3, 0x46C0, 0x46C1, 0x46C2, 0x46C3, + 0x46D0, 0x46D1, 0x46D2 }; unsigned i; i915->gen = 4; i915->is_adlp = false; -- cgit v1.2.3 From 2119a9cefc12f892d0dc12107723adbb5f74d3be Mon Sep 17 00:00:00 2001 From: Jason Macnak Date: Mon, 11 Apr 2022 15:31:00 -0700 Subject: virtgpu_virgl: update virgl_hw.h from upstream ... to pull in VIRGL_FORMAT_P010 for use with Gfxstream. BUG=b:191084459 TEST=build Change-Id: I7cf9d4ea54f5606e5582d1329dfb1467084a89d3 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3579856 Reviewed-by: Yiwei Zhang Tested-by: Jason Macnak Commit-Queue: Jason Macnak --- external/virgl_hw.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/external/virgl_hw.h b/external/virgl_hw.h index 7f4a63f..4527ced 100644 --- a/external/virgl_hw.h +++ b/external/virgl_hw.h @@ -222,6 +222,12 @@ enum virgl_formats { VIRGL_FORMAT_A4B4G4R4_UNORM = 311, VIRGL_FORMAT_R8_SRGB = 312, + VIRGL_FORMAT_R8G8_SRGB = 313, + + VIRGL_FORMAT_P010 = 314, + VIRGL_FORMAT_P012 = 315, + VIRGL_FORMAT_P016 = 316, + VIRGL_FORMAT_MAX /* = PIPE_FORMAT_COUNT */, /* Below formats must not be used in the guest. */ -- cgit v1.2.3 From 7a1a7dbda342415279f01eccb728803446ab3250 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Thu, 14 Apr 2022 06:28:14 +0000 Subject: minigbm/msm: disable UBWC for virtualization This actually reverts commit 407eb0ebf3ce52fd4b3d79712d1b86d7b021c29b. However, the rationales have been updated. BUG=b:229147702 TEST=emerge and deploy and verified graphics working in crostini Change-Id: I8f491daf14f97a5dbda797207886695a985e44e7 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3586372 Tested-by: Yiwei Zhang Auto-Submit: Yiwei Zhang Commit-Queue: Yiwei Zhang Reviewed-by: Chia-I Wu Commit-Queue: Chia-I Wu --- msm.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/msm.c b/msm.c index 14ecf2b..5a2a73c 100644 --- a/msm.c +++ b/msm.c @@ -207,6 +207,21 @@ static bool should_avoid_ubwc(void) drv_log("WARNING: waffle detected, disabling UBWC\n"); return true; } + + /* Sommelier relies on implicit modifier, which does not pass host modifier to + * zwp_linux_buffer_params_v1_add. Graphics will be broken if UBWC is enabled. + * Sommelier shall be fixed to mirror what arc wayland_service does, and then + * we can re-enable UBWC here. + * + * Inherit the trick from crrev/c/2523246 previously used for gtest. The side + * effect is all VM guests on msm will revert back to use linear modifier. + * + * See b/229147702 + */ + if (!dlsym(RTLD_DEFAULT, "cupsFilePrintf")) { + drv_log("WARNING: virtualization detected, disabling UBWC\n"); + return true; + } #endif return false; } -- cgit v1.2.3 From bc51ff31d274f847b6fc78c280ae663880b196ec Mon Sep 17 00:00:00 2001 From: Jason Macnak Date: Mon, 11 Apr 2022 15:32:58 -0700 Subject: virtgpu_virgl: enable P010 for 3D mode BUG=b:191084459 TEST=cvd start --gpu_mode=gfxstream TEST=Camera2Video sample app TEST=cts -m CtsCameraTestCases Change-Id: I7b2c902298fed7d1ccab7c31eac8376b0077b718 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3579857 Reviewed-by: Yiwei Zhang Tested-by: Jason Macnak Commit-Queue: Jason Macnak --- virtgpu_virgl.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/virtgpu_virgl.c b/virtgpu_virgl.c index cbfae66..163865b 100644 --- a/virtgpu_virgl.c +++ b/virtgpu_virgl.c @@ -91,6 +91,8 @@ static uint32_t translate_format(uint32_t drm_fourcc) return VIRGL_FORMAT_NV12; case DRM_FORMAT_NV21: return VIRGL_FORMAT_NV21; + case DRM_FORMAT_P010: + return VIRGL_FORMAT_P010; case DRM_FORMAT_YVU420: case DRM_FORMAT_YVU420_ANDROID: return VIRGL_FORMAT_YV12; @@ -633,8 +635,12 @@ static int virgl_init(struct driver *drv) /* Android CTS tests require this. */ virgl_add_combination(drv, DRM_FORMAT_RGB888, &LINEAR_METADATA, BO_USE_SW_MASK); virgl_add_combination(drv, DRM_FORMAT_BGR888, &LINEAR_METADATA, BO_USE_SW_MASK); - virgl_add_combination(drv, DRM_FORMAT_P010, &LINEAR_METADATA, BO_USE_TEXTURE | - BO_USE_SW_MASK | BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE); + /* Android Camera CTS tests requires this. Additionally, the scanout usage is needed for + * Camera preview and is expected to be conditionally stripped by virgl_add_combination + * when not natively supported and instead handled by HWComposer. */ + virgl_add_combination(drv, DRM_FORMAT_P010, &LINEAR_METADATA, + BO_USE_SCANOUT | BO_USE_TEXTURE | BO_USE_SW_MASK | + BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE); drv_modify_combination(drv, DRM_FORMAT_R8, &LINEAR_METADATA, BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE | BO_USE_HW_VIDEO_DECODER | BO_USE_HW_VIDEO_ENCODER | BO_USE_GPU_DATA_BUFFER); -- cgit v1.2.3 From 96058f97e8c3cc91b1692025db22d1742fe6070d Mon Sep 17 00:00:00 2001 From: Robert Mader Date: Tue, 5 Apr 2022 12:15:11 +0200 Subject: minigbm: i915: Update plane count in bo_import and implement num_planes_from_modifier interface. This only includes the i915 parts of commit 1a733377e91b9e714541ea1f51e1f5808b32897c, partially reverting commit 853b8542fbf5711cca4b00d0e30cd3e559c925fd. Bug:b:224580219 Change-Id: I94b5181f3ec231929873bc56c1044ca427f9de5b Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3568488 Reviewed-by: Yiwei Zhang Reviewed-by: Robert Mader Tested-by: Robert Mader Commit-Queue: Yiwei Zhang --- i915.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/i915.c b/i915.c index f43c67c..35c45eb 100644 --- a/i915.c +++ b/i915.c @@ -441,6 +441,19 @@ static int i915_bo_from_format(struct bo *bo, uint32_t width, uint32_t height, u return 0; } +static size_t i915_num_planes_from_modifier(struct driver *drv, uint32_t format, + uint64_t modifier) +{ + size_t num_planes = drv_num_planes_from_format(format); + if (modifier == I915_FORMAT_MOD_Y_TILED_CCS || + modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS) { + assert(num_planes == 1); + return 2; + } + + return num_planes; +} + static int i915_bo_compute_metadata(struct bo *bo, uint32_t width, uint32_t height, uint32_t format, uint64_t use_flags, const uint64_t *modifiers, uint32_t count) { @@ -565,7 +578,7 @@ static int i915_bo_compute_metadata(struct bo *bo, uint32_t width, uint32_t heig bo->meta.offsets[1] = offset; offset += ccs_size; - bo->meta.num_planes = 2; + bo->meta.num_planes = i915_num_planes_from_modifier(bo->drv, format, modifier); bo->meta.total_size = offset; } else if (modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS) { @@ -600,7 +613,7 @@ static int i915_bo_compute_metadata(struct bo *bo, uint32_t width, uint32_t heig bo->meta.sizes[1] = ALIGN(bo->meta.sizes[0] / 256, getpagesize()); bo->meta.offsets[1] = bo->meta.sizes[0]; /* Total number of planes & sizes */ - bo->meta.num_planes = 2; + bo->meta.num_planes = i915_num_planes_from_modifier(bo->drv, format, modifier); bo->meta.total_size = bo->meta.sizes[0] + bo->meta.sizes[1]; } else { i915_bo_from_format(bo, width, height, format); @@ -678,6 +691,9 @@ static int i915_bo_import(struct bo *bo, struct drv_import_fd_data *data) int ret; struct drm_i915_gem_get_tiling gem_get_tiling = { 0 }; + bo->meta.num_planes = i915_num_planes_from_modifier(bo->drv, data->format, + data->format_modifier); + ret = drv_prime_bo_import(bo, data); if (ret) return ret; @@ -808,6 +824,7 @@ const struct backend backend_i915 = { .bo_invalidate = i915_bo_invalidate, .bo_flush = i915_bo_flush, .resolve_format_and_use_flags = drv_resolve_format_and_use_flags_helper, + .num_planes_from_modifier = i915_num_planes_from_modifier, }; #endif -- cgit v1.2.3 From 1d87c8004ccab05e95b9c3f96f71ee1c24304625 Mon Sep 17 00:00:00 2001 From: David Stevens Date: Wed, 20 Apr 2022 10:02:53 +0900 Subject: minigbm: remove stevensd from OWNERS BUG=None TEST=None Change-Id: I4396f90f9e7de7c5d91ad2777e9061735787caa3 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3593418 Tested-by: David Stevens Auto-Submit: David Stevens Reviewed-by: Yiwei Zhang Commit-Queue: Yiwei Zhang --- OWNERS | 1 - 1 file changed, 1 deletion(-) diff --git a/OWNERS b/OWNERS index 892eb39..6d49c2d 100644 --- a/OWNERS +++ b/OWNERS @@ -8,7 +8,6 @@ marcheu@chromium.org mcasas@chromium.org olv@google.com robdclark@chromium.org -stevensd@chromium.org tfiga@chromium.org zzyiwei@chromium.org -- cgit v1.2.3 From d73fa7ff377919d94d4ed675cc91a070f0631548 Mon Sep 17 00:00:00 2001 From: Robert Mader Date: Tue, 3 May 2022 09:24:37 +0200 Subject: minigbm: amdgpu: Update plane count in bo_import This is required for importing multi-plane modifiers where the format plane count is lower (usually `1`). It will be used by Exo for v3/4 of the `zwp_linux_dmabuf_v1` Wayland potocol, allowing Wayland clients (and thus all clients that build on the Wayland support) to use explicit modifiers which again can increase performance on many GPUs. Also add another fallback path to `dri_num_planes_from_modifier()` for cases when `queryDmaBufFormatModifierAttribs()` fails and do some refactoring there. Without this, some test apparently fail. This includes the amdgpu part of commit 1a733377e91b9e714541ea1f51e1f5808b32897c, partially reverting commit 853b8542fbf5711cca4b00d0e30cd3e559c925fd. Bug:b:224580219 Change-Id: I93b64123420b39f3b83ff1bbbb9c59ddf4bc6105 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3568489 Reviewed-by: Bas Nieuwenhuizen Tested-by: Robert Mader Commit-Queue: Robert Mader --- amdgpu.c | 3 +++ dri.c | 21 ++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/amdgpu.c b/amdgpu.c index f0053d6..700a8c7 100644 --- a/amdgpu.c +++ b/amdgpu.c @@ -625,6 +625,9 @@ static int amdgpu_import_bo(struct bo *bo, struct drv_import_fd_data *data) dri_tiling = combo->metadata.tiling != TILE_TYPE_LINEAR; } + bo->meta.num_planes = dri_num_planes_from_modifier(bo->drv, data->format, + data->format_modifier); + if (dri_tiling) return dri_bo_import(bo, data); else diff --git a/dri.c b/dri.c index ea8c757..7257c31 100644 --- a/dri.c +++ b/dri.c @@ -452,19 +452,18 @@ int dri_bo_unmap(struct bo *bo, struct vma *vma) size_t dri_num_planes_from_modifier(struct driver *drv, uint32_t format, uint64_t modifier) { struct dri_driver *dri = drv->priv; - if (!dri->image_extension->queryDmaBufFormatModifierAttribs) { - /* We do not do any modifier checks here. The create will fail - * later if the modifier is not supported. */ - return drv_num_planes_from_format(format); - } + uint64_t planes = 0; - uint64_t planes; - unsigned char ret = dri->image_extension->queryDmaBufFormatModifierAttribs( - dri->device, format, modifier, __DRI_IMAGE_FORMAT_MODIFIER_ATTRIB_PLANE_COUNT, &planes); - if (!ret) - return 0; + /* We do not do any modifier checks here. The create will fail later if the modifier is not + * supported. + */ + if (dri->image_extension->queryDmaBufFormatModifierAttribs && + dri->image_extension->queryDmaBufFormatModifierAttribs( + dri->device, format, modifier, __DRI_IMAGE_FORMAT_MODIFIER_ATTRIB_PLANE_COUNT, + &planes)) + return planes; - return planes; + return drv_num_planes_from_format(format); } bool dri_query_modifiers(struct driver *drv, uint32_t format, int max, uint64_t *modifiers, -- cgit v1.2.3 From 365e5b4a9efe758236bc7bd43262bc32508c4171 Mon Sep 17 00:00:00 2001 From: Brian Norris Date: Thu, 13 Jan 2022 17:21:40 -0800 Subject: minigbm: rockchip: Support upstream AFBC modifier BUG=b:214459790 TEST=boot to ui TEST=null_platform_test, with modifications for choosing CRTC (big VOP) and AFBC modifier; e.g.,: `null_platform_test \ --crtc_index 1 \ --modifier \ 'DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16|AFBC_FORMAT_MOD_SPARSE|AFBC_FORMAT_MOD_YTR)'` Change-Id: I771d223ada1d7e6254855d28d998c01e455e72ef Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3462927 Reviewed-by: Dominik Behr Tested-by: Brian Norris Commit-Queue: Brian Norris --- rockchip.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/rockchip.c b/rockchip.c index 89063ee..6d25e3a 100644 --- a/rockchip.c +++ b/rockchip.c @@ -6,6 +6,7 @@ #ifdef DRV_ROCKCHIP +#include #include #include #include @@ -18,6 +19,10 @@ #include "drv_priv.h" #include "util.h" +#define DRM_FORMAT_MOD_ROCKCHIP_AFBC \ + DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | AFBC_FORMAT_MOD_SPARSE | \ + AFBC_FORMAT_MOD_YTR) + struct rockchip_private_map_data { void *cached_addr; void *gem_addr; @@ -30,7 +35,8 @@ static const uint32_t scanout_render_formats[] = { DRM_FORMAT_ABGR8888, DRM_FORM static const uint32_t texture_only_formats[] = { DRM_FORMAT_NV12, DRM_FORMAT_YVU420, DRM_FORMAT_YVU420_ANDROID }; -static int afbc_bo_from_format(struct bo *bo, uint32_t width, uint32_t height, uint32_t format) +static int afbc_bo_from_format(struct bo *bo, uint32_t width, uint32_t height, uint32_t format, + uint64_t modifier) { /* We've restricted ourselves to four bytes per pixel. */ const uint32_t pixel_size = 4; @@ -69,7 +75,7 @@ static int afbc_bo_from_format(struct bo *bo, uint32_t width, uint32_t height, u bo->meta.total_size = total_size; - bo->meta.format_modifier = DRM_FORMAT_MOD_CHROMEOS_ROCKCHIP_AFBC; + bo->meta.format_modifier = modifier; return 0; } @@ -113,6 +119,14 @@ static int rockchip_bo_create_with_modifiers(struct bo *bo, uint32_t width, uint int ret; size_t plane; struct drm_rockchip_gem_create gem_create = { 0 }; + uint64_t afbc_modifier; + + if (drv_has_modifier(modifiers, count, DRM_FORMAT_MOD_ROCKCHIP_AFBC)) + afbc_modifier = DRM_FORMAT_MOD_ROCKCHIP_AFBC; + else if (drv_has_modifier(modifiers, count, DRM_FORMAT_MOD_CHROMEOS_ROCKCHIP_AFBC)) + afbc_modifier = DRM_FORMAT_MOD_CHROMEOS_ROCKCHIP_AFBC; + else + afbc_modifier = 0; if (format == DRM_FORMAT_NV12) { uint32_t w_mbs = DIV_ROUND_UP(width, 16); @@ -127,12 +141,10 @@ static int rockchip_bo_create_with_modifiers(struct bo *bo, uint32_t width, uint * driver to store motion vectors. */ bo->meta.total_size += w_mbs * h_mbs * 128; - } else if (width <= 2560 && - drv_has_modifier(modifiers, count, DRM_FORMAT_MOD_CHROMEOS_ROCKCHIP_AFBC) && - bo->drv->compression) { + } else if (width <= 2560 && afbc_modifier && bo->drv->compression) { /* If the caller has decided they can use AFBC, always * pick that */ - afbc_bo_from_format(bo, width, height, format); + afbc_bo_from_format(bo, width, height, format, afbc_modifier); } else { if (!drv_has_modifier(modifiers, count, DRM_FORMAT_MOD_LINEAR)) { errno = EINVAL; @@ -188,7 +200,8 @@ static void *rockchip_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint3 /* We can only map buffers created with SW access flags, which should * have no modifiers (ie, not AFBC). */ - if (bo->meta.format_modifier == DRM_FORMAT_MOD_CHROMEOS_ROCKCHIP_AFBC) + if (bo->meta.format_modifier == DRM_FORMAT_MOD_CHROMEOS_ROCKCHIP_AFBC || + bo->meta.format_modifier == DRM_FORMAT_MOD_ROCKCHIP_AFBC) return MAP_FAILED; gem_map.handle = bo->handles[0].u32; -- cgit v1.2.3 From 26960909ad3e1d3a9adb987735e52d39216bc242 Mon Sep 17 00:00:00 2001 From: Miguel Casas Date: Fri, 13 May 2022 17:55:49 -0700 Subject: amdgpu: Only align video BOs to 512 for Android crrev/c/3633249 compares libva and minigbm allocated Surfaces/BOs for accelerated video decoding. Currently it fails on e.g. zork because libva (mesa-amd backend) aligns those buffers to 256, whereas minigbm aligns them to 512. This CL reduces the 512-align provision in amdgpu to Android-originated buffers, where IIUC from the bug there is such restriction. BUG=b:200680176 BUG=b:171013552 TEST=vaapi_unittest on zork w/ crrev/c/3633249 Change-Id: I703037c70dded8596408c475518a29de3b59f039 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3647157 Tested-by: Miguel Casas-Sanchez Reviewed-by: Drew Davenport Commit-Queue: Miguel Casas-Sanchez --- amdgpu.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/amdgpu.c b/amdgpu.c index 700a8c7..7ff61a4 100644 --- a/amdgpu.c +++ b/amdgpu.c @@ -517,10 +517,10 @@ static int amdgpu_create_bo_linear(struct bo *bo, uint32_t width, uint32_t heigh * aligned. This uses more memory than necessary since the first plane only needs to be * 256 aligned, but it's acceptable for a short-term fix. It's probably safe for other gpu * families, but let's restrict it to Raven and Stoney for now (b/171013552, b/190484589). + * This only applies to the Android YUV (multiplane) format. * */ - if (num_planes > 1 && - (priv->dev_info.family == AMDGPU_FAMILY_RV || - (priv->dev_info.family == AMDGPU_FAMILY_CZ && !(use_flags & BO_USE_HW_VIDEO_ENCODER)))) + if (format == DRM_FORMAT_YVU420_ANDROID && + (priv->dev_info.family == AMDGPU_FAMILY_RV || priv->dev_info.family == AMDGPU_FAMILY_CZ)) stride = ALIGN(stride, 512); else stride = ALIGN(stride, 256); -- cgit v1.2.3 From 2fe64ebda9af778bc8b85d7abdca19682765f64b Mon Sep 17 00:00:00 2001 From: Gurchetan Singh Date: Thu, 19 May 2022 14:35:28 -0700 Subject: ANDROID: minigbm: eliminate fake capset check It's better just to conditionally advertise cross domain capset in crosvm. BUG=173630595 TEST=compile Change-Id: Ic44176141cade44bfa0cc2fcf457ddafb7ae7195 --- virtgpu_cross_domain.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/virtgpu_cross_domain.c b/virtgpu_cross_domain.c index 85ea1a3..161cc08 100644 --- a/virtgpu_cross_domain.c +++ b/virtgpu_cross_domain.c @@ -239,14 +239,6 @@ static int cross_domain_init(struct driver *drv) if (!params[param_host_visible].value && !params[param_create_guest_handle].value) return -ENOTSUP; - /* - * crosvm never reports the fake capset. This is just an extra check to make sure we - * don't use the cross-domain context by accident. Developers may remove this for - * testing purposes. - */ - if ((params[param_supported_capset_ids].value & (1 << CAPSET_CROSS_FAKE)) == 0) - return -ENOTSUP; - priv = calloc(1, sizeof(*priv)); if (!priv) return -ENOMEM; -- cgit v1.2.3 From 335711e592d238b6fe30bf048ac7d9024d5bb638 Mon Sep 17 00:00:00 2001 From: Robert Tarasov Date: Thu, 26 May 2022 17:34:30 -0700 Subject: minigbm/virgl: Add NV12 to texture formats Add NV12 to the list of supported texture source formats for virgl. Bug: 218708219 Test: run cts -m CtsNativeHardwareTestCases Change-Id: I771551287400bc974530b273372c01e2645f8f52 --- virtgpu_virgl.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/virtgpu_virgl.c b/virtgpu_virgl.c index 163865b..d2e2e76 100644 --- a/virtgpu_virgl.c +++ b/virtgpu_virgl.c @@ -48,8 +48,9 @@ static const uint32_t dumb_texture_source_formats[] = { }; static const uint32_t texture_source_formats[] = { - DRM_FORMAT_NV21, DRM_FORMAT_R8, DRM_FORMAT_R16, DRM_FORMAT_RG88, - DRM_FORMAT_YVU420_ANDROID, DRM_FORMAT_ABGR2101010, DRM_FORMAT_ABGR16161616F + DRM_FORMAT_NV12, DRM_FORMAT_NV21, DRM_FORMAT_R8, + DRM_FORMAT_R16, DRM_FORMAT_RG88, DRM_FORMAT_YVU420_ANDROID, + DRM_FORMAT_ABGR2101010, DRM_FORMAT_ABGR16161616F }; extern struct virtgpu_param params[]; -- cgit v1.2.3 From f08bb293f6d9e99fd3205ea993d8a770bc16a0d5 Mon Sep 17 00:00:00 2001 From: Jason Macnak Date: Thu, 2 Jun 2022 12:42:02 -0700 Subject: virtgpu_virgl: invalidate with BO_USE_GPU_DATA_BUFFER ... as the host may write to the buffer in a compute shader. BUG=b:234513607 TEST=cts -m CtsNativeHardwareTestCases -t android.hardware.nativehardware.cts.AHardwareBufferNativeTests#Blob_BlobTest_GpuDataBufferCpuRead_BLOB Change-Id: Ied49e7861e9ae0cbc9e25ecfb7feec30cc733864 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3688450 Tested-by: Jason Macnak Commit-Queue: Jason Macnak Reviewed-by: Yiwei Zhang --- virtgpu_virgl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/virtgpu_virgl.c b/virtgpu_virgl.c index 163865b..4a8c713 100644 --- a/virtgpu_virgl.c +++ b/virtgpu_virgl.c @@ -805,7 +805,7 @@ static int virgl_bo_invalidate(struct bo *bo, struct mapping *mapping) // Invalidate is only necessary if the host writes to the buffer. The encoder and // decoder flags don't differentiate between input and output buffers, but we can // use the format to determine whether this buffer could be encoder/decoder output. - host_write_flags = BO_USE_RENDERING | BO_USE_CAMERA_WRITE; + host_write_flags = BO_USE_RENDERING | BO_USE_CAMERA_WRITE | BO_USE_GPU_DATA_BUFFER; if (bo->meta.format == DRM_FORMAT_R8) host_write_flags |= BO_USE_HW_VIDEO_ENCODER; else -- cgit v1.2.3 From 9527781c926e92392aabf56e0439983cd1516c95 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Wed, 8 Jun 2022 10:15:30 -0700 Subject: virtgpu_crosdomain: Always use _USE_CROSS_DEVICE (when available) This is required for dma-buf sharing, which is a thing that can happen for sharing across processes even if it is the same GPU device involved on both ends. (Also, anything that gralloc allocates needs to be dmabuf exportable, so not setting _USE_CROSS_DEVICE is just plain wrong.) This fixes hangs in deqp-cts when using cross-domain virtgpu backend (rather than the virgl backend) BUG=b:230100768 TEST=Run deqp-cts Change-Id: Ic9204feb0af52ef4a25bcfd554425cb8cd3f3fe1 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3696038 Tested-by: Rob Clark Reviewed-by: Yiwei Zhang Commit-Queue: Rob Clark Auto-Submit: Rob Clark --- virtgpu_cross_domain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/virtgpu_cross_domain.c b/virtgpu_cross_domain.c index 85ea1a3..3cb6ac3 100644 --- a/virtgpu_cross_domain.c +++ b/virtgpu_cross_domain.c @@ -366,7 +366,7 @@ static int cross_domain_bo_create(struct bo *bo, uint32_t width, uint32_t height if (use_flags & BO_USE_SW_MASK) blob_flags |= VIRTGPU_BLOB_FLAG_USE_MAPPABLE; - if (params[param_cross_device].value && (use_flags & BO_USE_NON_GPU_HW)) + if (params[param_cross_device].value) blob_flags |= VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE; /// It may be possible to have host3d blobs and handles from guest memory at the same time. -- cgit v1.2.3