1 //
2 // Copyright 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 // DmaBufImageSiblingEGL.cpp: Defines the DmaBufImageSiblingEGL to wrap EGL images
8 // created from dma_buf objects
9 
10 #include "libANGLE/renderer/gl/egl/DmaBufImageSiblingEGL.h"
11 
12 namespace
13 {
14 
15 // Refer to the following link
16 // https://source.chromium.org/chromium/chromium/src/+/master:ui/gl/gl_image_native_pixmap.cc;l=24
17 #define FOURCC(a, b, c, d)                                          \
18     ((static_cast<uint32_t>(a)) | (static_cast<uint32_t>(b) << 8) | \
19      (static_cast<uint32_t>(c) << 16) | (static_cast<uint32_t>(d) << 24))
20 
21 #define DRM_FORMAT_R8 FOURCC('R', '8', ' ', ' ')
22 #define DRM_FORMAT_R16 FOURCC('R', '1', '6', ' ')
23 #define DRM_FORMAT_GR88 FOURCC('G', 'R', '8', '8')
24 #define DRM_FORMAT_RGB565 FOURCC('R', 'G', '1', '6')
25 #define DRM_FORMAT_ARGB8888 FOURCC('A', 'R', '2', '4')
26 #define DRM_FORMAT_ABGR8888 FOURCC('A', 'B', '2', '4')
27 #define DRM_FORMAT_XRGB8888 FOURCC('X', 'R', '2', '4')
28 #define DRM_FORMAT_XBGR8888 FOURCC('X', 'B', '2', '4')
29 #define DRM_FORMAT_ABGR2101010 FOURCC('A', 'B', '3', '0')
30 #define DRM_FORMAT_ARGB2101010 FOURCC('A', 'R', '3', '0')
31 #define DRM_FORMAT_YVU420 FOURCC('Y', 'V', '1', '2')
32 #define DRM_FORMAT_NV12 FOURCC('N', 'V', '1', '2')
33 #define DRM_FORMAT_P010 FOURCC('P', '0', '1', '0')
34 
FourCCFormatToGLInternalFormat(int format)35 GLenum FourCCFormatToGLInternalFormat(int format)
36 {
37     switch (format)
38     {
39         case DRM_FORMAT_R8:
40             return GL_R8;
41         case DRM_FORMAT_R16:
42             return GL_R16_EXT;
43         case DRM_FORMAT_GR88:
44             return GL_RG8_EXT;
45         case DRM_FORMAT_ABGR8888:
46             return GL_RGBA8;
47         case DRM_FORMAT_XBGR8888:
48             return GL_RGB8;
49         case DRM_FORMAT_ARGB8888:
50             return GL_BGRA8_EXT;
51         case DRM_FORMAT_XRGB8888:
52             return GL_RGB8;
53         case DRM_FORMAT_ABGR2101010:
54         case DRM_FORMAT_ARGB2101010:
55             return GL_RGB10_A2_EXT;
56         case DRM_FORMAT_RGB565:
57             return GL_RGB565;
58         case DRM_FORMAT_NV12:
59         case DRM_FORMAT_YVU420:
60         case DRM_FORMAT_P010:
61             return GL_RGB8;
62         default:
63             NOTREACHED();
64             WARN() << "Unknown dma_buf format " << format << " used to initialize an EGL image.";
65             return GL_RGB8;
66     }
67 }
68 
69 }  // namespace
70 
71 namespace rx
72 {
DmaBufImageSiblingEGL(const egl::AttributeMap & attribs)73 DmaBufImageSiblingEGL::DmaBufImageSiblingEGL(const egl::AttributeMap &attribs)
74     : mAttribs(attribs), mFormat(GL_NONE)
75 {
76     ASSERT(mAttribs.contains(EGL_WIDTH));
77     mSize.width = mAttribs.getAsInt(EGL_WIDTH);
78     ASSERT(mAttribs.contains(EGL_HEIGHT));
79     mSize.height = mAttribs.getAsInt(EGL_HEIGHT);
80     mSize.depth  = 1;
81 
82     int fourCCFormat = mAttribs.getAsInt(EGL_LINUX_DRM_FOURCC_EXT);
83     mFormat          = gl::Format(FourCCFormatToGLInternalFormat(fourCCFormat));
84 }
85 
~DmaBufImageSiblingEGL()86 DmaBufImageSiblingEGL::~DmaBufImageSiblingEGL() {}
87 
initialize(const egl::Display * display)88 egl::Error DmaBufImageSiblingEGL::initialize(const egl::Display *display)
89 {
90     return egl::NoError();
91 }
92 
getFormat() const93 gl::Format DmaBufImageSiblingEGL::getFormat() const
94 {
95     return mFormat;
96 }
97 
isRenderable(const gl::Context * context) const98 bool DmaBufImageSiblingEGL::isRenderable(const gl::Context *context) const
99 {
100     return true;
101 }
102 
isTexturable(const gl::Context * context) const103 bool DmaBufImageSiblingEGL::isTexturable(const gl::Context *context) const
104 {
105     return true;
106 }
107 
getSize() const108 gl::Extents DmaBufImageSiblingEGL::getSize() const
109 {
110     return mSize;
111 }
112 
getSamples() const113 size_t DmaBufImageSiblingEGL::getSamples() const
114 {
115     return 0;
116 }
117 
getBuffer() const118 EGLClientBuffer DmaBufImageSiblingEGL::getBuffer() const
119 {
120     return nullptr;
121 }
122 
getImageCreationAttributes(std::vector<EGLint> * outAttributes) const123 void DmaBufImageSiblingEGL::getImageCreationAttributes(std::vector<EGLint> *outAttributes) const
124 {
125     EGLenum kForwardedAttribs[] = {EGL_WIDTH,
126                                    EGL_HEIGHT,
127                                    EGL_LINUX_DRM_FOURCC_EXT,
128                                    EGL_DMA_BUF_PLANE0_FD_EXT,
129                                    EGL_DMA_BUF_PLANE0_OFFSET_EXT,
130                                    EGL_DMA_BUF_PLANE0_PITCH_EXT,
131                                    EGL_DMA_BUF_PLANE1_FD_EXT,
132                                    EGL_DMA_BUF_PLANE1_OFFSET_EXT,
133                                    EGL_DMA_BUF_PLANE1_PITCH_EXT,
134                                    EGL_DMA_BUF_PLANE2_FD_EXT,
135                                    EGL_DMA_BUF_PLANE2_OFFSET_EXT,
136                                    EGL_DMA_BUF_PLANE2_PITCH_EXT,
137                                    EGL_YUV_COLOR_SPACE_HINT_EXT,
138                                    EGL_SAMPLE_RANGE_HINT_EXT,
139                                    EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT,
140                                    EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT,
141 
142                                    EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT,
143                                    EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT,
144                                    EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT,
145                                    EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT,
146                                    EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT,
147                                    EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT,
148                                    EGL_DMA_BUF_PLANE3_FD_EXT,
149                                    EGL_DMA_BUF_PLANE3_OFFSET_EXT,
150                                    EGL_DMA_BUF_PLANE3_PITCH_EXT,
151                                    EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT,
152                                    EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT};
153 
154     for (EGLenum forwardedAttrib : kForwardedAttribs)
155     {
156         if (mAttribs.contains(forwardedAttrib))
157         {
158             outAttributes->push_back(forwardedAttrib);
159             outAttributes->push_back(mAttribs.getAsInt(forwardedAttrib));
160         }
161     }
162 }
163 
164 }  // namespace rx
165