diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-06-28 01:10:23 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-06-28 01:10:23 +0000 |
commit | 563bef1bb60e76b2aca671b6c5fd9c14121a9e80 (patch) | |
tree | f28cbe098c054d1f1cf473b305af30f0fe96fcef | |
parent | 35af76086f7b1faf2028441f30cab70a75cfcfd9 (diff) | |
parent | b6f4d90c557e4c3e9e235ae19afdfef8698b1ee9 (diff) | |
download | minigbm-android13-qpr1-release.tar.gz |
Snap for 8774677 from b6f4d90c557e4c3e9e235ae19afdfef8698b1ee9 to tm-qpr1-releaseandroid-13.0.0_r30android-13.0.0_r29android-13.0.0_r28android-13.0.0_r27android-13.0.0_r24android-13.0.0_r23android-13.0.0_r22android-13.0.0_r21android-13.0.0_r20android-13.0.0_r19android-13.0.0_r18android-13.0.0_r17android-13.0.0_r16android13-qpr1-s8-releaseandroid13-qpr1-s7-releaseandroid13-qpr1-s6-releaseandroid13-qpr1-s5-releaseandroid13-qpr1-s4-releaseandroid13-qpr1-s3-releaseandroid13-qpr1-s2-releaseandroid13-qpr1-s1-releaseandroid13-qpr1-release
Change-Id: Iaf09776921ae365f35ddb247dc0474952898a91d
-rw-r--r-- | OWNERS | 1 | ||||
-rw-r--r-- | amdgpu.c | 6 | ||||
-rw-r--r-- | dri.c | 21 | ||||
-rw-r--r-- | dumb_driver.c | 5 | ||||
-rw-r--r-- | external/virgl_hw.h | 6 | ||||
-rw-r--r-- | i915.c | 3 | ||||
-rw-r--r-- | mediatek.c | 16 | ||||
-rw-r--r-- | msm.c | 15 | ||||
-rw-r--r-- | rockchip.c | 27 | ||||
-rw-r--r-- | virtgpu_cross_domain.c | 10 | ||||
-rw-r--r-- | virtgpu_virgl.c | 12 |
11 files changed, 80 insertions, 42 deletions
@@ -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 @@ -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); @@ -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, 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); 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. */ @@ -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; @@ -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) { @@ -142,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; @@ -163,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 }; @@ -361,12 +365,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 = { @@ -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; } @@ -6,6 +6,7 @@ #ifdef DRV_ROCKCHIP +#include <drm_fourcc.h> #include <errno.h> #include <inttypes.h> #include <rockchip_drm.h> @@ -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; diff --git a/virtgpu_cross_domain.c b/virtgpu_cross_domain.c index 85ea1a3..10930fc 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; @@ -366,7 +358,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. diff --git a/virtgpu_virgl.c b/virtgpu_virgl.c index 9846313..8bcfc9d 100644 --- a/virtgpu_virgl.c +++ b/virtgpu_virgl.c @@ -92,6 +92,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; @@ -634,8 +636,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); @@ -800,7 +806,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 |