summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-06-28 01:10:23 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-06-28 01:10:23 +0000
commit563bef1bb60e76b2aca671b6c5fd9c14121a9e80 (patch)
treef28cbe098c054d1f1cf473b305af30f0fe96fcef
parent35af76086f7b1faf2028441f30cab70a75cfcfd9 (diff)
parentb6f4d90c557e4c3e9e235ae19afdfef8698b1ee9 (diff)
downloadminigbm-android13-qpr1-release.tar.gz
Change-Id: Iaf09776921ae365f35ddb247dc0474952898a91d
-rw-r--r--OWNERS1
-rw-r--r--amdgpu.c6
-rw-r--r--dri.c21
-rw-r--r--dumb_driver.c5
-rw-r--r--external/virgl_hw.h6
-rw-r--r--i915.c3
-rw-r--r--mediatek.c16
-rw-r--r--msm.c15
-rw-r--r--rockchip.c27
-rw-r--r--virtgpu_cross_domain.c10
-rw-r--r--virtgpu_virgl.c12
11 files changed, 80 insertions, 42 deletions
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
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);
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,
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. */
diff --git a/i915.c b/i915.c
index de33cd8..35c45eb 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;
diff --git a/mediatek.c b/mediatek.c
index 076f478..562b1d1 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)
{
@@ -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 = {
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;
}
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 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