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>
This commit is contained in:
parent
26e16cbd64
commit
b8ad7b88ca
16 changed files with 151 additions and 110 deletions
123
virtgpu_virgl.c
123
virtgpu_virgl.c
|
|
@ -945,66 +945,93 @@ static int virgl_bo_flush(struct bo *bo, struct mapping *mapping)
|
|||
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 @@ const struct backend virtgpu_virgl = { .name = "virtgpu_virgl",
|
|||
.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 };
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue