Merge cherrypicks of [19057927] into tm-release.

Change-Id: I6f4671755cfa61d3b45fad456f08caf19deaeacd
diff --git a/OWNERS b/OWNERS
index 892eb39..6d49c2d 100644
--- a/OWNERS
+++ b/OWNERS
@@ -8,7 +8,6 @@
 mcasas@chromium.org
 olv@google.com
 robdclark@chromium.org
-stevensd@chromium.org
 tfiga@chromium.org
 zzyiwei@chromium.org
 
diff --git a/amdgpu.c b/amdgpu.c
index 700a8c7..7ff61a4 100644
--- a/amdgpu.c
+++ b/amdgpu.c
@@ -517,10 +517,10 @@
 	 * 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);
diff --git a/dri.c b/dri.c
index ea8c757..7257c31 100644
--- a/dri.c
+++ b/dri.c
@@ -452,19 +452,18 @@
 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 @@
 						   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 @@
 	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 @@
    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. */
diff --git a/i915.c b/i915.c
index de33cd8..35c45eb 100644
--- a/i915.c
+++ b/i915.c
@@ -105,7 +105,8 @@
 	};
 	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;
diff --git a/mediatek.c b/mediatek.c
index 076f478..562b1d1 100644
--- a/mediatek.c
+++ b/mediatek.c
@@ -59,7 +59,6 @@
 	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 @@
 	}
 	return false;
 }
-#endif
 
 static int mediatek_init(struct driver *drv)
 {
@@ -142,6 +140,12 @@
 	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 @@
 	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 @@
 		*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 = {
diff --git a/msm.c b/msm.c
index 14ecf2b..5a2a73c 100644
--- a/msm.c
+++ b/msm.c
@@ -207,6 +207,21 @@
 		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;
 }
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 <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 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 @@
 
 	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 @@
 	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 @@
 		 * 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 @@
 
 	/* 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 @@
 	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 @@
 	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 @@
 		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 @@
 	/* 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 @@
 	// 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