Mesa (main): venus: resolve YV12 AHB to VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 17 00:46:19 UTC 2022


Module: Mesa
Branch: main
Commit: b37d97bb867b26f0619fba4786a700c80929bf20
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b37d97bb867b26f0619fba4786a700c80929bf20

Author: Yiwei Zhang <zzyiwei at chromium.org>
Date:   Tue Jun  7 06:59:32 2022 +0000

venus: resolve YV12 AHB to VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM

YV12 is a 3-plane format with minigbm. This change mitigates the crash
of testGLViewLargerHeightDecodeAccuracy[4], and successfully creates the
host side image and imports the memory.

vk_format(1000156002) drm_fourcc(842094169)
offsets(0, 27648, 34560, 0)
strides(256, 128, 128, 0)
modifier(0)

Signed-off-by: Yiwei Zhang <zzyiwei at chromium.org>
Reviewed-by: Ryan Neph <ryanneph at google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16913>

---

 src/virtio/vulkan/vn_android.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/src/virtio/vulkan/vn_android.c b/src/virtio/vulkan/vn_android.c
index 39114be4ad6..58781fffe62 100644
--- a/src/virtio/vulkan/vn_android.c
+++ b/src/virtio/vulkan/vn_android.c
@@ -226,6 +226,10 @@ vn_hal_open(const struct hw_module_t *mod,
 static uint32_t
 vn_android_ahb_format_from_vk_format(VkFormat format)
 {
+   /* Only non-external AHB compatible formats are expected at:
+    * - image format query
+    * - memory export allocation
+    */
    switch (format) {
    case VK_FORMAT_R8G8B8A8_UNORM:
       return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
@@ -237,8 +241,6 @@ vn_android_ahb_format_from_vk_format(VkFormat format)
       return AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT;
    case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
       return AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM;
-   case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
-      return AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420;
    default:
       return 0;
    }
@@ -295,6 +297,7 @@ vn_android_drm_format_to_vk_format(uint32_t format)
    case DRM_FORMAT_ABGR2101010:
       return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
    case DRM_FORMAT_YVU420:
+      return VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
    case DRM_FORMAT_NV12:
       return VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
    default:
@@ -935,17 +938,18 @@ vn_android_get_ahb_format_properties(
     * Applications should treat these values as sensible defaults to use in the
     * absence of more reliable information obtained through some other means.
     */
+   const bool is_yuv = vn_android_drm_format_is_yuv(buf_props.drm_fourcc);
    const VkSamplerYcbcrModelConversion model =
-      vn_android_drm_format_is_yuv(buf_props.drm_fourcc)
-         ? VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601
-         : VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY;
+      is_yuv ? VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601
+             : VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY;
 
    /* ANGLE expects VK_FORMAT_UNDEFINED with externalFormat resolved from
     * AHARDWAREBUFFER_FORMAT_IMPLEMENTATION_DEFINED and any supported planar
-    * AHB formats (venus supports AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420).
+    * AHB formats. Venus supports below explicit ones:
+    * - AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420 (DRM_FORMAT_NV12)
+    * - AHARDWAREBUFFER_FORMAT_YV12 (DRM_FORMAT_YVU420)
     */
-   if (desc.format == AHARDWAREBUFFER_FORMAT_IMPLEMENTATION_DEFINED ||
-       desc.format == AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420)
+   if (desc.format == AHARDWAREBUFFER_FORMAT_IMPLEMENTATION_DEFINED || is_yuv)
       format = VK_FORMAT_UNDEFINED;
 
    *out_props = (VkAndroidHardwareBufferFormatPropertiesANDROID) {



More information about the mesa-commit mailing list