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