1 /* 2 * Copyright 2016 Intel 3 * SPDX-License-Identifier: MIT 4 */ 5 #ifndef VK_FORMAT_INFO_H 6 #define VK_FORMAT_INFO_H 7 8 #include <stdbool.h> 9 #include <drm_fourcc.h> 10 #define DRM_FORMAT_YVU420_ANDROID fourcc_code('9', '9', '9', '7') 11 #ifdef VK_USE_PLATFORM_ANDROID_KHR 12 #include <system/graphics.h> 13 #else 14 /* See system/graphics.h. */ 15 enum { 16 HAL_PIXEL_FORMAT_YV12 = 842094169, 17 }; 18 #endif 19 20 #if !defined(__INTRODUCED_IN) 21 #define __INTRODUCED_IN(__api_level) /* nothing */ 22 #endif 23 #include <vndk/hardware_buffer.h> 24 #include <vulkan/vulkan.h> 25 #include "util/log.h" 26 27 namespace gfxstream { 28 namespace vk { 29 30 /* See i915_private_android_types.h in minigbm. */ 31 #define HAL_PIXEL_FORMAT_NV12_Y_TILED_INTEL 0x100 32 33 // TODO(b/167698976): We should not use OMX_COLOR_FormatYUV420Planar 34 // but we seem to miss a format translation somewhere. 35 36 #define OMX_COLOR_FormatYUV420Planar 0x13 37 vk_format_from_fourcc(unsigned fourcc_format)38static inline VkFormat vk_format_from_fourcc(unsigned fourcc_format) { 39 switch (fourcc_format) { 40 case DRM_FORMAT_R8: 41 return VK_FORMAT_R8_UNORM; 42 case DRM_FORMAT_ABGR8888: 43 return VK_FORMAT_R8G8B8A8_UNORM; 44 case DRM_FORMAT_XBGR8888: 45 return VK_FORMAT_R8G8B8A8_UNORM; 46 case DRM_FORMAT_BGR888: 47 return VK_FORMAT_R8G8B8_UNORM; 48 case DRM_FORMAT_RGB565: 49 return VK_FORMAT_R5G6B5_UNORM_PACK16; 50 case DRM_FORMAT_ABGR16161616F: 51 return VK_FORMAT_R16G16B16A16_SFLOAT; 52 case DRM_FORMAT_ABGR2101010: 53 return VK_FORMAT_A2B10G10R10_UNORM_PACK32; 54 case DRM_FORMAT_P010: 55 return VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16; 56 case HAL_PIXEL_FORMAT_NV12_Y_TILED_INTEL: 57 case DRM_FORMAT_NV12: 58 case DRM_FORMAT_NV21: 59 return VK_FORMAT_G8_B8R8_2PLANE_420_UNORM; 60 case DRM_FORMAT_YUV420: 61 case DRM_FORMAT_YVU420_ANDROID: 62 case DRM_FORMAT_YVU420: 63 return VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM; 64 default: 65 return VK_FORMAT_UNDEFINED; 66 } 67 } 68 android_format_from_vk(VkFormat vk_format)69static inline unsigned android_format_from_vk(VkFormat vk_format) { 70 switch (vk_format) { 71 case VK_FORMAT_R8_UNORM: 72 return AHARDWAREBUFFER_FORMAT_R8_UNORM; 73 case VK_FORMAT_R8G8B8A8_UNORM: 74 return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; 75 case VK_FORMAT_R8G8B8_UNORM: 76 return AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM; 77 case VK_FORMAT_R5G6B5_UNORM_PACK16: 78 return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM; 79 case VK_FORMAT_R16G16B16A16_SFLOAT: 80 return AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT; 81 case VK_FORMAT_A2B10G10R10_UNORM_PACK32: 82 return AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM; 83 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM: 84 return HAL_PIXEL_FORMAT_NV12_Y_TILED_INTEL; 85 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM: 86 return HAL_PIXEL_FORMAT_YV12; 87 case VK_FORMAT_D16_UNORM: 88 return AHARDWAREBUFFER_FORMAT_D16_UNORM; 89 case VK_FORMAT_X8_D24_UNORM_PACK32: 90 return AHARDWAREBUFFER_FORMAT_D24_UNORM; 91 case VK_FORMAT_D24_UNORM_S8_UINT: 92 return AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT; 93 case VK_FORMAT_D32_SFLOAT: 94 return AHARDWAREBUFFER_FORMAT_D32_FLOAT; 95 case VK_FORMAT_D32_SFLOAT_S8_UINT: 96 return AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT; 97 default: 98 return AHARDWAREBUFFER_FORMAT_BLOB; 99 } 100 } 101 android_format_is_yuv(unsigned android_format)102static inline bool android_format_is_yuv(unsigned android_format) { 103 switch (android_format) { 104 case AHARDWAREBUFFER_FORMAT_BLOB: 105 case AHARDWAREBUFFER_FORMAT_R8_UNORM: 106 case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM: 107 case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM: 108 case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM: 109 case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM: 110 case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT: 111 case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM: 112 case AHARDWAREBUFFER_FORMAT_D16_UNORM: 113 case AHARDWAREBUFFER_FORMAT_D24_UNORM: 114 case AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT: 115 case AHARDWAREBUFFER_FORMAT_D32_FLOAT: 116 case AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT: 117 case AHARDWAREBUFFER_FORMAT_S8_UINT: 118 return false; 119 case HAL_PIXEL_FORMAT_NV12_Y_TILED_INTEL: 120 case OMX_COLOR_FormatYUV420Planar: 121 case HAL_PIXEL_FORMAT_YV12: 122 #if __ANDROID_API__ >= 30 123 case AHARDWAREBUFFER_FORMAT_YCbCr_P010: 124 #endif 125 case AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420: 126 return true; 127 default: 128 mesa_loge("%s: unhandled format: %d", __FUNCTION__, android_format); 129 return false; 130 } 131 } 132 vk_format_aspects(VkFormat format)133static inline VkImageAspectFlags vk_format_aspects(VkFormat format) { 134 switch (format) { 135 case VK_FORMAT_UNDEFINED: 136 return 0; 137 138 case VK_FORMAT_S8_UINT: 139 return VK_IMAGE_ASPECT_STENCIL_BIT; 140 141 case VK_FORMAT_D16_UNORM_S8_UINT: 142 case VK_FORMAT_D24_UNORM_S8_UINT: 143 case VK_FORMAT_D32_SFLOAT_S8_UINT: 144 return VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; 145 146 case VK_FORMAT_D16_UNORM: 147 case VK_FORMAT_X8_D24_UNORM_PACK32: 148 case VK_FORMAT_D32_SFLOAT: 149 return VK_IMAGE_ASPECT_DEPTH_BIT; 150 151 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM: 152 case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM: 153 case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM: 154 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16: 155 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16: 156 case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16: 157 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16: 158 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16: 159 case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16: 160 case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM: 161 case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM: 162 case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM: 163 return (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT | 164 VK_IMAGE_ASPECT_PLANE_2_BIT); 165 166 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM: 167 case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM: 168 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16: 169 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16: 170 case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16: 171 case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16: 172 case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM: 173 case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM: 174 return (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT); 175 176 default: 177 return VK_IMAGE_ASPECT_COLOR_BIT; 178 } 179 } 180 vk_format_is_color(VkFormat format)181static inline bool vk_format_is_color(VkFormat format) { 182 return vk_format_aspects(format) == VK_IMAGE_ASPECT_COLOR_BIT; 183 } 184 vk_format_is_depth_or_stencil(VkFormat format)185static inline bool vk_format_is_depth_or_stencil(VkFormat format) { 186 const VkImageAspectFlags aspects = vk_format_aspects(format); 187 return aspects & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT); 188 } 189 vk_format_has_depth(VkFormat format)190static inline bool vk_format_has_depth(VkFormat format) { 191 const VkImageAspectFlags aspects = vk_format_aspects(format); 192 return aspects & VK_IMAGE_ASPECT_DEPTH_BIT; 193 } 194 195 } // namespace vk 196 } // namespace gfxstream 197 198 #endif /* VK_FORMAT_INFO_H */ 199