xref: /aosp_15_r20/external/mesa3d/src/gfxstream/guest/vulkan_enc/vk_format_info.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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)38 static 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)69 static 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)102 static 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)133 static 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)181 static 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)185 static 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)190 static 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