• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_B8G8R8A8_UNORM:
109         case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
110         case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
111         case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
112         case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
113         case AHARDWAREBUFFER_FORMAT_D16_UNORM:
114         case AHARDWAREBUFFER_FORMAT_D24_UNORM:
115         case AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT:
116         case AHARDWAREBUFFER_FORMAT_D32_FLOAT:
117         case AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT:
118         case AHARDWAREBUFFER_FORMAT_S8_UINT:
119             return false;
120         case HAL_PIXEL_FORMAT_NV12_Y_TILED_INTEL:
121         case OMX_COLOR_FormatYUV420Planar:
122         case HAL_PIXEL_FORMAT_YV12:
123 #if __ANDROID_API__ >= 30
124         case AHARDWAREBUFFER_FORMAT_YCbCr_P010:
125 #endif
126         case AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420:
127             return true;
128         default:
129             mesa_loge("%s: unhandled format: %d", __FUNCTION__, android_format);
130             return false;
131     }
132 }
133 
vk_format_aspects(VkFormat format)134 static inline VkImageAspectFlags vk_format_aspects(VkFormat format) {
135     switch (format) {
136         case VK_FORMAT_UNDEFINED:
137             return 0;
138 
139         case VK_FORMAT_S8_UINT:
140             return VK_IMAGE_ASPECT_STENCIL_BIT;
141 
142         case VK_FORMAT_D16_UNORM_S8_UINT:
143         case VK_FORMAT_D24_UNORM_S8_UINT:
144         case VK_FORMAT_D32_SFLOAT_S8_UINT:
145             return VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
146 
147         case VK_FORMAT_D16_UNORM:
148         case VK_FORMAT_X8_D24_UNORM_PACK32:
149         case VK_FORMAT_D32_SFLOAT:
150             return VK_IMAGE_ASPECT_DEPTH_BIT;
151 
152         case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
153         case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
154         case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:
155         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
156         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
157         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:
158         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
159         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
160         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:
161         case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
162         case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
163         case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:
164             return (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT |
165                     VK_IMAGE_ASPECT_PLANE_2_BIT);
166 
167         case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
168         case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
169         case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
170         case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
171         case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
172         case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
173         case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
174         case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
175             return (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT);
176 
177         default:
178             return VK_IMAGE_ASPECT_COLOR_BIT;
179     }
180 }
181 
vk_format_is_color(VkFormat format)182 static inline bool vk_format_is_color(VkFormat format) {
183     return vk_format_aspects(format) == VK_IMAGE_ASPECT_COLOR_BIT;
184 }
185 
vk_format_is_depth_or_stencil(VkFormat format)186 static inline bool vk_format_is_depth_or_stencil(VkFormat format) {
187     const VkImageAspectFlags aspects = vk_format_aspects(format);
188     return aspects & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
189 }
190 
vk_format_has_depth(VkFormat format)191 static inline bool vk_format_has_depth(VkFormat format) {
192     const VkImageAspectFlags aspects = vk_format_aspects(format);
193     return aspects & VK_IMAGE_ASPECT_DEPTH_BIT;
194 }
195 
196 }  // namespace vk
197 }  // namespace gfxstream
198 
199 #endif /* VK_FORMAT_INFO_H */
200