xref: /aosp_15_r20/external/angle/src/common/linux/dma_buf_utils.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // dma_buf_utils.cpp: Utilities to interact with Linux dma bufs.
8 
9 #include "dma_buf_utils.h"
10 
11 #include "common/debug.h"
12 
13 #include <sys/stat.h>
14 #include <sys/time.h>
15 #include <sys/types.h>
16 #include <unistd.h>
17 
18 #include <array>
19 
20 namespace angle
21 {
DrmFourCCFormatToGLInternalFormat(int fourccFormat,bool * isYUV)22 GLenum DrmFourCCFormatToGLInternalFormat(int fourccFormat, bool *isYUV)
23 {
24     *isYUV = false;
25 
26     switch (fourccFormat)
27     {
28         case DRM_FORMAT_R8:
29             return GL_R8;
30         case DRM_FORMAT_R16:
31             return GL_R16_EXT;
32         case DRM_FORMAT_GR88:
33             return GL_RG8_EXT;
34         case DRM_FORMAT_ABGR8888:
35             return GL_RGBA8;
36         case DRM_FORMAT_XBGR8888:
37             return GL_RGBX8_ANGLE;
38         case DRM_FORMAT_ARGB8888:
39             return GL_BGRA8_EXT;
40         case DRM_FORMAT_XRGB8888:
41             return GL_BGRX8_ANGLEX;
42         case DRM_FORMAT_ABGR2101010:
43         case DRM_FORMAT_ARGB2101010:
44             return GL_RGB10_A2_EXT;
45         case DRM_FORMAT_ABGR16161616F:
46             return GL_RGBA16F_EXT;
47         case DRM_FORMAT_RGB565:
48             return GL_RGB565;
49         case DRM_FORMAT_NV12:
50         case DRM_FORMAT_YVU420:
51         case DRM_FORMAT_P010:
52             *isYUV = true;
53             return GL_RGB8;
54         default:
55             UNREACHABLE();
56             WARN() << "Unknown dma_buf format " << fourccFormat
57                    << " used to initialize an EGL image.";
58             return GL_RGB8;
59     }
60 }
61 
62 #if defined(ANGLE_ENABLE_VULKAN)
VkFormatToDrmFourCCFormat(VkFormat format)63 std::vector<int> VkFormatToDrmFourCCFormat(VkFormat format)
64 {
65     switch (format)
66     {
67         case VK_FORMAT_R8_UNORM:
68         case VK_FORMAT_R8_SRGB:
69             return {DRM_FORMAT_R8};
70         case VK_FORMAT_R16_UNORM:
71             return {DRM_FORMAT_R16};
72         case VK_FORMAT_R8G8_UNORM:
73         case VK_FORMAT_R8G8_SRGB:
74             return {DRM_FORMAT_GR88};
75         case VK_FORMAT_R8G8B8_UNORM:
76         case VK_FORMAT_R8G8B8_SRGB:
77             return {DRM_FORMAT_BGR888};
78         case VK_FORMAT_B8G8R8_UNORM:
79         case VK_FORMAT_B8G8R8_SRGB:
80             return {DRM_FORMAT_RGB888};
81         case VK_FORMAT_R8G8B8A8_UNORM:
82         case VK_FORMAT_R8G8B8A8_SRGB:
83             return {DRM_FORMAT_ABGR8888, DRM_FORMAT_XBGR8888};
84         case VK_FORMAT_B8G8R8A8_UNORM:
85         case VK_FORMAT_B8G8R8A8_SRGB:
86             return {DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB8888};
87         case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
88             return {DRM_FORMAT_ARGB2101010};
89         case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
90             return {DRM_FORMAT_ABGR2101010};
91         case VK_FORMAT_B5G6R5_UNORM_PACK16:
92             return {DRM_FORMAT_RGB565};
93         default:
94             return {};
95     }
96 }
97 
DrmFourCCFormatToVkFormats(int fourccFormat)98 std::vector<VkFormat> DrmFourCCFormatToVkFormats(int fourccFormat)
99 {
100     switch (fourccFormat)
101     {
102         case DRM_FORMAT_R8:
103             return {VK_FORMAT_R8_UNORM, VK_FORMAT_R8_SRGB};
104         case DRM_FORMAT_R16:
105             return {VK_FORMAT_R16_UNORM};
106         case DRM_FORMAT_GR88:
107             return {VK_FORMAT_R8G8_UNORM, VK_FORMAT_R8G8_SRGB};
108         case DRM_FORMAT_BGR888:
109             return {VK_FORMAT_R8G8B8_UNORM, VK_FORMAT_R8G8B8_SRGB};
110         case DRM_FORMAT_RGB888:
111             return {VK_FORMAT_B8G8R8_UNORM, VK_FORMAT_B8G8R8_SRGB};
112         case DRM_FORMAT_ABGR8888:
113         case DRM_FORMAT_XBGR8888:
114             return {VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_SRGB};
115         case DRM_FORMAT_ARGB8888:
116         case DRM_FORMAT_XRGB8888:
117             return {VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_SRGB};
118         case DRM_FORMAT_ABGR2101010:
119             return {VK_FORMAT_A2R10G10B10_UNORM_PACK32};
120         case DRM_FORMAT_ARGB2101010:
121             return {VK_FORMAT_A2B10G10R10_UNORM_PACK32};
122         case DRM_FORMAT_RGB565:
123             return {VK_FORMAT_B5G6R5_UNORM_PACK16};
124         case DRM_FORMAT_NV12:
125             return {VK_FORMAT_G8_B8R8_2PLANE_420_UNORM};
126         default:
127             WARN() << "Unknown dma_buf format " << fourccFormat
128                    << " used to initialize an EGL image.";
129             return {};
130     }
131 }
132 
133 #endif  // ANGLE_ENABLE_VULKAN
134 
135 #if defined(ANGLE_PLATFORM_LINUX) && defined(ANGLE_USES_GBM)
136 #    include <gbm.h>
137 
GLInternalFormatToGbmFourCCFormat(GLenum internalFormat)138 int GLInternalFormatToGbmFourCCFormat(GLenum internalFormat)
139 {
140     switch (internalFormat)
141     {
142         case GL_R8:
143             return GBM_FORMAT_R8;
144         case GL_RGB8:
145             return GBM_FORMAT_GR88;
146         case GL_RGB565:
147             return GBM_FORMAT_RGB565;
148         case GL_RGBA8:
149             return GBM_FORMAT_ABGR8888;
150         case GL_BGRA8_EXT:
151             return GBM_FORMAT_ARGB8888;
152         case GL_BGRX8_ANGLEX:
153             return GBM_FORMAT_XRGB8888;
154         case GL_RGBX8_ANGLE:
155             return GBM_FORMAT_XBGR8888;
156         case GL_RGB10_A2:
157             return GBM_FORMAT_ABGR2101010;
158         default:
159             WARN() << "Unknown internalFormat: " << internalFormat << ". Treating as 0";
160             return 0;
161     }
162 }
163 #endif
164 
165 }  // namespace angle
166