minigbm: refactor to add unified resolve_format_and_use_flags helper
It makes more sense to resovle the format and use_flags together to
avoid duplicates.
Add the helper to vc4 and dumb_driver backends since that's missed
from prior frontend refactoring.
Split the resolve helper in virtgpu_virgl for the 3d and 2d paths to
make code logic cleaner.
BUG=b:199524294
TEST=CQ
Change-Id: I89b633ea484f0fc5bb9b4e0548cad017b9970cc6
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3200143
Tested-by: Yiwei Zhang <zzyiwei@chromium.org>
Tested-by: Jason Macnak <natsu@google.com>
Reviewed-by: Chia-I Wu <olv@google.com>
Reviewed-by: Jason Macnak <natsu@google.com>
Reviewed-by: Dominik Behr <dbehr@chromium.org>
Commit-Queue: Yiwei Zhang <zzyiwei@chromium.org>
diff --git a/virtgpu_virgl.c b/virtgpu_virgl.c
index 9745288..becce8b 100644
--- a/virtgpu_virgl.c
+++ b/virtgpu_virgl.c
@@ -945,66 +945,93 @@
return 0;
}
-static uint32_t virgl_resolve_format(uint32_t format, uint64_t use_flags)
+static void virgl_3d_resolve_format_and_use_flags(struct driver *drv, uint32_t format,
+ uint64_t use_flags, uint32_t *out_format,
+ uint64_t *out_use_flags)
{
+ *out_format = format;
+ *out_use_flags = use_flags;
switch (format) {
case DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED:
/* Camera subsystem requires NV12. */
- if (use_flags & (BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE))
- return DRM_FORMAT_NV12;
- /*HACK: See b/28671744 */
- return DRM_FORMAT_XBGR8888;
+ if (use_flags & (BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE)) {
+ *out_format = DRM_FORMAT_NV12;
+ } else {
+ /* HACK: See b/28671744 */
+ *out_format = DRM_FORMAT_XBGR8888;
+ }
+ break;
case DRM_FORMAT_FLEX_YCbCr_420_888:
- /*
- * All of our host drivers prefer NV12 as their flexible media format.
- * If that changes, this will need to be modified.
- */
- if (params[param_3d].value)
- return DRM_FORMAT_NV12;
- else
- return DRM_FORMAT_YVU420_ANDROID;
+ /* All of our host drivers prefer NV12 as their flexible media format.
+ * If that changes, this will need to be modified. */
+ *out_format = DRM_FORMAT_NV12;
+ /* fallthrough */
+ case DRM_FORMAT_NV12:
+ case DRM_FORMAT_ABGR8888:
+ case DRM_FORMAT_ARGB8888:
+ case DRM_FORMAT_RGB565:
+ case DRM_FORMAT_XBGR8888:
+ case DRM_FORMAT_XRGB8888:
+ /* These are the scanout capable formats to the guest. Strip scanout use_flag if the
+ * host does not natively support scanout on the requested format. */
+ if ((use_flags & BO_USE_SCANOUT) &&
+ !virgl_supports_combination_natively(drv, format, BO_USE_SCANOUT))
+ *out_use_flags &= ~BO_USE_SCANOUT;
+ break;
+ case DRM_FORMAT_YVU420_ANDROID:
+ *out_use_flags &= ~BO_USE_SCANOUT;
+ /* HACK: See b/172389166. Also see gbm_bo_create. */
+ *out_use_flags |= BO_USE_LINEAR;
+ break;
default:
- return format;
+ break;
}
}
-static uint64_t virgl_resolve_use_flags(struct driver *drv, uint32_t format, uint64_t use_flags)
+static void virgl_2d_resolve_format_and_use_flags(uint32_t format, uint64_t use_flags,
+ uint32_t *out_format, uint64_t *out_use_flags)
{
- if (format == DRM_FORMAT_YVU420_ANDROID) {
- use_flags &= ~BO_USE_SCANOUT;
- /*
- * HACK: See b/172389166. This is for HAL_PIXEL_FORMAT_YV12 buffers allocated by
- * arcvm. None of our platforms can display YV12, so we can treat as a SW buffer.
- * Remove once this can be intelligently resolved in the guest. Also see
- * gbm_bo_create.
- */
- use_flags |= BO_USE_LINEAR;
- return use_flags;
- }
+ *out_format = format;
+ *out_use_flags = use_flags;
- if (params[param_3d].value) {
- switch (format) {
- /* formats need to support scanout */
- case DRM_FORMAT_ABGR8888:
- case DRM_FORMAT_ARGB8888:
- case DRM_FORMAT_RGB565:
- case DRM_FORMAT_XBGR8888:
- case DRM_FORMAT_XRGB8888:
- case DRM_FORMAT_NV12:
- /* strip scanout use_flag if necessary */
- if ((use_flags & BO_USE_SCANOUT) &&
- !virgl_supports_combination_natively(drv, format, BO_USE_SCANOUT))
- return use_flags & ~BO_USE_SCANOUT;
- break;
- default:
- break;
+ /* HACK: See crrev/c/1849773 */
+ if (format != DRM_FORMAT_XRGB8888)
+ *out_use_flags &= ~BO_USE_SCANOUT;
+
+ switch (format) {
+ case DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED:
+ /* Camera subsystem requires NV12. */
+ if (use_flags & (BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE)) {
+ *out_format = DRM_FORMAT_NV12;
+ } else {
+ /* HACK: See b/28671744 */
+ *out_format = DRM_FORMAT_XBGR8888;
}
- } else {
- if (format != DRM_FORMAT_XRGB8888)
- return use_flags & ~BO_USE_SCANOUT;
+ break;
+ case DRM_FORMAT_FLEX_YCbCr_420_888:
+ *out_format = DRM_FORMAT_YVU420_ANDROID;
+ /* fallthrough */
+ case DRM_FORMAT_YVU420_ANDROID:
+ *out_use_flags &= ~BO_USE_SCANOUT;
+ /* HACK: See b/172389166. Also see gbm_bo_create. */
+ *out_use_flags |= BO_USE_LINEAR;
+ break;
+ default:
+ break;
}
+}
- return use_flags;
+static void virgl_resolve_format_and_use_flags(struct driver *drv, uint32_t format,
+ uint64_t use_flags, uint32_t *out_format,
+ uint64_t *out_use_flags)
+{
+ if (params[param_3d].value) {
+ return virgl_3d_resolve_format_and_use_flags(drv, format, use_flags, out_format,
+ out_use_flags);
+ } else {
+ return virgl_2d_resolve_format_and_use_flags(format, use_flags, out_format,
+ out_use_flags);
+ }
}
static int virgl_resource_info(struct bo *bo, uint32_t strides[DRV_MAX_PLANES],
@@ -1058,7 +1085,7 @@
.bo_unmap = drv_bo_munmap,
.bo_invalidate = virgl_bo_invalidate,
.bo_flush = virgl_bo_flush,
- .resolve_format = virgl_resolve_format,
- .resolve_use_flags = virgl_resolve_use_flags,
+ .resolve_format_and_use_flags =
+ virgl_resolve_format_and_use_flags,
.resource_info = virgl_resource_info,
.get_max_texture_2d_size = virgl_get_max_texture_2d_size };