From 6158bc1fdcc0aed5ea2049b9bbc3c127c83561e9 Mon Sep 17 00:00:00 2001 From: Jean-Francois Thibert Date: Mon, 17 Jun 2024 15:13:27 -0400 Subject: [PATCH] Add depth buffer support for virtgpu virgl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: b:347022601 Test: Ran app that export/import depth through AHB with cf Change-Id: I07e60729b18a9f15e0d795c33c462ba4b4f255b6 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/5636740 Tested-by: Jean-François Thibert Reviewed-by: Dawn Han Commit-Queue: Jean-François Thibert Reviewed-by: Jason Macnak --- cros_gralloc/cros_gralloc_helpers.cc | 10 ++++++++++ drv.h | 8 ++++++++ drv_helpers.c | 5 +++++ virtgpu_virgl.c | 18 ++++++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/cros_gralloc/cros_gralloc_helpers.cc b/cros_gralloc/cros_gralloc_helpers.cc index 67a53a0..4b40bfd 100644 --- a/cros_gralloc/cros_gralloc_helpers.cc +++ b/cros_gralloc/cros_gralloc_helpers.cc @@ -78,6 +78,16 @@ uint32_t cros_gralloc_convert_format(int format) case HAL_PIXEL_FORMAT_YCBCR_P010: return DRM_FORMAT_P010; #endif + case HAL_PIXEL_FORMAT_DEPTH_16: + return DRM_FORMAT_DEPTH16; + case HAL_PIXEL_FORMAT_DEPTH_24: + return DRM_FORMAT_DEPTH24; + case HAL_PIXEL_FORMAT_DEPTH_24_STENCIL_8: + return DRM_FORMAT_DEPTH24_STENCIL8; + case HAL_PIXEL_FORMAT_DEPTH_32F: + return DRM_FORMAT_DEPTH32; + case HAL_PIXEL_FORMAT_DEPTH_32F_STENCIL_8: + return DRM_FORMAT_DEPTH32_STENCIL8; } return DRM_FORMAT_NONE; diff --git a/drv.h b/drv.h index 245fd57..bd380b5 100644 --- a/drv.h +++ b/drv.h @@ -64,6 +64,14 @@ extern "C" { #define DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED fourcc_code('9', '9', '9', '8') #define DRM_FORMAT_FLEX_YCbCr_420_888 fourcc_code('9', '9', '9', '9') +#ifndef DRM_FORMAT_DEPTH16 +#define DRM_FORMAT_DEPTH16 fourcc_code('D', '1', '6', ' ') +#define DRM_FORMAT_DEPTH24 fourcc_code('D', '2', '4', 'X') +#define DRM_FORMAT_DEPTH24_STENCIL8 fourcc_code('D', '2', '4', 'S') +#define DRM_FORMAT_DEPTH32 fourcc_code('D', '3', '2', 'F') +#define DRM_FORMAT_DEPTH32_STENCIL8 fourcc_code('D', 'F', 'S', '8') +#endif + /* This is a 10-bit bayer format for private reprocessing on MediaTek ISP. It's * a private RAW format that other DRM drivers will never support and thus * making it not upstreamable (i.e., defined in official DRM headers). */ diff --git a/drv_helpers.c b/drv_helpers.c index c810d8e..12b671a 100644 --- a/drv_helpers.c +++ b/drv_helpers.c @@ -100,6 +100,7 @@ static const struct planar_layout *layout_from_format(uint32_t format) return &packed_1bpp_layout; case DRM_FORMAT_R16: + case DRM_FORMAT_DEPTH16: return &packed_2bpp_layout; case DRM_FORMAT_YVU420: @@ -144,6 +145,9 @@ static const struct planar_layout *layout_from_format(uint32_t format) case DRM_FORMAT_RGB888: return &packed_3bpp_layout; + case DRM_FORMAT_DEPTH24: + case DRM_FORMAT_DEPTH24_STENCIL8: + case DRM_FORMAT_DEPTH32: case DRM_FORMAT_ABGR2101010: case DRM_FORMAT_ABGR8888: case DRM_FORMAT_ARGB2101010: @@ -163,6 +167,7 @@ static const struct planar_layout *layout_from_format(uint32_t format) case DRM_FORMAT_XRGB8888: return &packed_4bpp_layout; + case DRM_FORMAT_DEPTH32_STENCIL8: case DRM_FORMAT_ABGR16161616F: return &packed_8bpp_layout; diff --git a/virtgpu_virgl.c b/virtgpu_virgl.c index 983777a..4850971 100644 --- a/virtgpu_virgl.c +++ b/virtgpu_virgl.c @@ -51,6 +51,11 @@ static const uint32_t texture_source_formats[] = { DRM_FORMAT_YVU420_ANDROID, DRM_FORMAT_ABGR2101010, DRM_FORMAT_ABGR16161616F }; +static const uint32_t depth_stencil_formats[] = { + DRM_FORMAT_DEPTH16, DRM_FORMAT_DEPTH24, DRM_FORMAT_DEPTH24_STENCIL8, + DRM_FORMAT_DEPTH32, DRM_FORMAT_DEPTH32_STENCIL8 +}; + extern struct virtgpu_param params[]; struct virgl_blob_metadata_cache { @@ -107,6 +112,16 @@ static uint32_t translate_format(uint32_t drm_fourcc) case DRM_FORMAT_YVU420: case DRM_FORMAT_YVU420_ANDROID: return VIRGL_FORMAT_YV12; + case DRM_FORMAT_DEPTH16: + return VIRGL_FORMAT_Z16_UNORM; + case DRM_FORMAT_DEPTH24: + return VIRGL_FORMAT_Z24X8_UNORM; + case DRM_FORMAT_DEPTH24_STENCIL8: + return VIRGL_FORMAT_Z24_UNORM_S8_UINT; + case DRM_FORMAT_DEPTH32: + return VIRGL_FORMAT_Z32_FLOAT; + case DRM_FORMAT_DEPTH32_STENCIL8: + return VIRGL_FORMAT_Z32_FLOAT_S8X24_UINT; default: drv_loge("Unhandled format:%d\n", drm_fourcc); return 0; @@ -638,6 +653,9 @@ static int virgl_init(struct driver *drv) virgl_add_combinations(drv, texture_source_formats, ARRAY_SIZE(texture_source_formats), &LINEAR_METADATA, BO_USE_TEXTURE_MASK); + virgl_add_combinations(drv, depth_stencil_formats, + ARRAY_SIZE(depth_stencil_formats), &LINEAR_METADATA, + BO_USE_RENDER_MASK | BO_USE_TEXTURE_MASK); /* NV12 with scanout must flow through virgl_add_combination, so that the native * support is checked and scanout use_flag can be conditionally stripped. */ virgl_add_combination(drv, DRM_FORMAT_NV12, &LINEAR_METADATA,