xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/gl/DisplayGL.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // DisplayGL.h: GL implementation of egl::Display
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/DisplayGL.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/AttributeMap.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Display.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Surface.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/ContextGL.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/RendererGL.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/StateManagerGL.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/SurfaceGL.h"
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker #include <EGL/eglext.h>
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker namespace rx
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker 
25*8975f5c5SAndroid Build Coastguard Worker // On Linux with the amdgpu driver, the renderer string looks like:
26*8975f5c5SAndroid Build Coastguard Worker //
27*8975f5c5SAndroid Build Coastguard Worker // AMD Radeon (TM) <GPU model> Graphics (<GPUgeneration>, DRM <DRMversion>, <kernelversion>,
28*8975f5c5SAndroid Build Coastguard Worker // LLVM <LLVMversion>) eg. AMD Radeon (TM) RX 460 Graphics (POLARIS11,
29*8975f5c5SAndroid Build Coastguard Worker // DRM 3.35.0, 5.4.0-65-generic, LLVM 11.0.0)
30*8975f5c5SAndroid Build Coastguard Worker //
31*8975f5c5SAndroid Build Coastguard Worker // We also want to handle the case without GPUGeneration:
32*8975f5c5SAndroid Build Coastguard Worker // AMD Radeon GPU model (DRM DRMversion, kernelversion, LLVM LLVMversion)
33*8975f5c5SAndroid Build Coastguard Worker //
34*8975f5c5SAndroid Build Coastguard Worker // Thanks to Kelsey Gilbert of Mozilla for this example
35*8975f5c5SAndroid Build Coastguard Worker // https://phabricator.services.mozilla.com/D105636
SanitizeRendererString(std::string rendererString)36*8975f5c5SAndroid Build Coastguard Worker std::string SanitizeRendererString(std::string rendererString)
37*8975f5c5SAndroid Build Coastguard Worker {
38*8975f5c5SAndroid Build Coastguard Worker     size_t pos = rendererString.find(", DRM ");
39*8975f5c5SAndroid Build Coastguard Worker     if (pos != std::string::npos)
40*8975f5c5SAndroid Build Coastguard Worker     {
41*8975f5c5SAndroid Build Coastguard Worker         rendererString.resize(pos);
42*8975f5c5SAndroid Build Coastguard Worker         rendererString.push_back(')');
43*8975f5c5SAndroid Build Coastguard Worker         return rendererString;
44*8975f5c5SAndroid Build Coastguard Worker     }
45*8975f5c5SAndroid Build Coastguard Worker     pos = rendererString.find(" (DRM ");
46*8975f5c5SAndroid Build Coastguard Worker     if (pos != std::string::npos)
47*8975f5c5SAndroid Build Coastguard Worker     {
48*8975f5c5SAndroid Build Coastguard Worker         rendererString.resize(pos);
49*8975f5c5SAndroid Build Coastguard Worker         return rendererString;
50*8975f5c5SAndroid Build Coastguard Worker     }
51*8975f5c5SAndroid Build Coastguard Worker     return rendererString;
52*8975f5c5SAndroid Build Coastguard Worker }
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker // OpenGL ES requires a prefix of "OpenGL ES" for the GL_VERSION string.
55*8975f5c5SAndroid Build Coastguard Worker // We can also add the prefix to desktop OpenGL for consistency.
SanitizeVersionString(std::string versionString,bool isES,bool includeFullVersion)56*8975f5c5SAndroid Build Coastguard Worker std::string SanitizeVersionString(std::string versionString, bool isES, bool includeFullVersion)
57*8975f5c5SAndroid Build Coastguard Worker {
58*8975f5c5SAndroid Build Coastguard Worker     const std::string GLString = "OpenGL ";
59*8975f5c5SAndroid Build Coastguard Worker     const std::string ESString = "ES ";
60*8975f5c5SAndroid Build Coastguard Worker     size_t openGLESPos         = versionString.find(GLString);
61*8975f5c5SAndroid Build Coastguard Worker     std::ostringstream result;
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker     if (openGLESPos == std::string::npos)
64*8975f5c5SAndroid Build Coastguard Worker     {
65*8975f5c5SAndroid Build Coastguard Worker         openGLESPos = 0;
66*8975f5c5SAndroid Build Coastguard Worker     }
67*8975f5c5SAndroid Build Coastguard Worker     else
68*8975f5c5SAndroid Build Coastguard Worker     {
69*8975f5c5SAndroid Build Coastguard Worker         openGLESPos += GLString.size() + (isES ? ESString.size() : 0);
70*8975f5c5SAndroid Build Coastguard Worker     }
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker     result << GLString << (isES ? ESString : "");
73*8975f5c5SAndroid Build Coastguard Worker     if (includeFullVersion)
74*8975f5c5SAndroid Build Coastguard Worker     {
75*8975f5c5SAndroid Build Coastguard Worker         result << versionString.substr(openGLESPos);
76*8975f5c5SAndroid Build Coastguard Worker     }
77*8975f5c5SAndroid Build Coastguard Worker     else
78*8975f5c5SAndroid Build Coastguard Worker     {
79*8975f5c5SAndroid Build Coastguard Worker         size_t postVersionSpace = versionString.find(" ", openGLESPos);
80*8975f5c5SAndroid Build Coastguard Worker         result << versionString.substr(openGLESPos, postVersionSpace - openGLESPos);
81*8975f5c5SAndroid Build Coastguard Worker     }
82*8975f5c5SAndroid Build Coastguard Worker 
83*8975f5c5SAndroid Build Coastguard Worker     return result.str();
84*8975f5c5SAndroid Build Coastguard Worker }
85*8975f5c5SAndroid Build Coastguard Worker 
DisplayGL(const egl::DisplayState & state)86*8975f5c5SAndroid Build Coastguard Worker DisplayGL::DisplayGL(const egl::DisplayState &state) : DisplayImpl(state) {}
87*8975f5c5SAndroid Build Coastguard Worker 
~DisplayGL()88*8975f5c5SAndroid Build Coastguard Worker DisplayGL::~DisplayGL() {}
89*8975f5c5SAndroid Build Coastguard Worker 
initialize(egl::Display * display)90*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayGL::initialize(egl::Display *display)
91*8975f5c5SAndroid Build Coastguard Worker {
92*8975f5c5SAndroid Build Coastguard Worker     return egl::NoError();
93*8975f5c5SAndroid Build Coastguard Worker }
94*8975f5c5SAndroid Build Coastguard Worker 
terminate()95*8975f5c5SAndroid Build Coastguard Worker void DisplayGL::terminate() {}
96*8975f5c5SAndroid Build Coastguard Worker 
createImage(const egl::ImageState & state,const gl::Context * context,EGLenum target,const egl::AttributeMap & attribs)97*8975f5c5SAndroid Build Coastguard Worker ImageImpl *DisplayGL::createImage(const egl::ImageState &state,
98*8975f5c5SAndroid Build Coastguard Worker                                   const gl::Context *context,
99*8975f5c5SAndroid Build Coastguard Worker                                   EGLenum target,
100*8975f5c5SAndroid Build Coastguard Worker                                   const egl::AttributeMap &attribs)
101*8975f5c5SAndroid Build Coastguard Worker {
102*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
103*8975f5c5SAndroid Build Coastguard Worker     return nullptr;
104*8975f5c5SAndroid Build Coastguard Worker }
105*8975f5c5SAndroid Build Coastguard Worker 
createPbufferFromClientBuffer(const egl::SurfaceState & state,EGLenum buftype,EGLClientBuffer clientBuffer,const egl::AttributeMap & attribs)106*8975f5c5SAndroid Build Coastguard Worker SurfaceImpl *DisplayGL::createPbufferFromClientBuffer(const egl::SurfaceState &state,
107*8975f5c5SAndroid Build Coastguard Worker                                                       EGLenum buftype,
108*8975f5c5SAndroid Build Coastguard Worker                                                       EGLClientBuffer clientBuffer,
109*8975f5c5SAndroid Build Coastguard Worker                                                       const egl::AttributeMap &attribs)
110*8975f5c5SAndroid Build Coastguard Worker {
111*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
112*8975f5c5SAndroid Build Coastguard Worker     return nullptr;
113*8975f5c5SAndroid Build Coastguard Worker }
114*8975f5c5SAndroid Build Coastguard Worker 
createStreamProducerD3DTexture(egl::Stream::ConsumerType consumerType,const egl::AttributeMap & attribs)115*8975f5c5SAndroid Build Coastguard Worker StreamProducerImpl *DisplayGL::createStreamProducerD3DTexture(
116*8975f5c5SAndroid Build Coastguard Worker     egl::Stream::ConsumerType consumerType,
117*8975f5c5SAndroid Build Coastguard Worker     const egl::AttributeMap &attribs)
118*8975f5c5SAndroid Build Coastguard Worker {
119*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
120*8975f5c5SAndroid Build Coastguard Worker     return nullptr;
121*8975f5c5SAndroid Build Coastguard Worker }
122*8975f5c5SAndroid Build Coastguard Worker 
createShareGroup(const egl::ShareGroupState & state)123*8975f5c5SAndroid Build Coastguard Worker ShareGroupImpl *DisplayGL::createShareGroup(const egl::ShareGroupState &state)
124*8975f5c5SAndroid Build Coastguard Worker {
125*8975f5c5SAndroid Build Coastguard Worker     return new ShareGroupGL(state);
126*8975f5c5SAndroid Build Coastguard Worker }
127*8975f5c5SAndroid Build Coastguard Worker 
makeCurrent(egl::Display * display,egl::Surface * drawSurface,egl::Surface * readSurface,gl::Context * context)128*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayGL::makeCurrent(egl::Display *display,
129*8975f5c5SAndroid Build Coastguard Worker                                   egl::Surface *drawSurface,
130*8975f5c5SAndroid Build Coastguard Worker                                   egl::Surface *readSurface,
131*8975f5c5SAndroid Build Coastguard Worker                                   gl::Context *context)
132*8975f5c5SAndroid Build Coastguard Worker {
133*8975f5c5SAndroid Build Coastguard Worker     // Ensure that the correct global DebugAnnotator is installed when the end2end tests change
134*8975f5c5SAndroid Build Coastguard Worker     // the ANGLE back-end (done frequently).
135*8975f5c5SAndroid Build Coastguard Worker     display->setGlobalDebugAnnotator();
136*8975f5c5SAndroid Build Coastguard Worker 
137*8975f5c5SAndroid Build Coastguard Worker     if (!context)
138*8975f5c5SAndroid Build Coastguard Worker     {
139*8975f5c5SAndroid Build Coastguard Worker         return egl::NoError();
140*8975f5c5SAndroid Build Coastguard Worker     }
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker     // Pause transform feedback before making a new surface current, to workaround
143*8975f5c5SAndroid Build Coastguard Worker     // anglebug.com/42260421
144*8975f5c5SAndroid Build Coastguard Worker     ContextGL *glContext = GetImplAs<ContextGL>(context);
145*8975f5c5SAndroid Build Coastguard Worker     glContext->getStateManager()->pauseTransformFeedback();
146*8975f5c5SAndroid Build Coastguard Worker 
147*8975f5c5SAndroid Build Coastguard Worker     if (drawSurface == nullptr)
148*8975f5c5SAndroid Build Coastguard Worker     {
149*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(makeCurrentSurfaceless(context));
150*8975f5c5SAndroid Build Coastguard Worker     }
151*8975f5c5SAndroid Build Coastguard Worker 
152*8975f5c5SAndroid Build Coastguard Worker     return egl::NoError();
153*8975f5c5SAndroid Build Coastguard Worker }
154*8975f5c5SAndroid Build Coastguard Worker 
getMaxConformantESVersion() const155*8975f5c5SAndroid Build Coastguard Worker gl::Version DisplayGL::getMaxConformantESVersion() const
156*8975f5c5SAndroid Build Coastguard Worker {
157*8975f5c5SAndroid Build Coastguard Worker     // 3.1 support is in progress.
158*8975f5c5SAndroid Build Coastguard Worker     return std::min(getMaxSupportedESVersion(), gl::Version(3, 0));
159*8975f5c5SAndroid Build Coastguard Worker }
160*8975f5c5SAndroid Build Coastguard Worker 
generateExtensions(egl::DisplayExtensions * outExtensions) const161*8975f5c5SAndroid Build Coastguard Worker void DisplayGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
162*8975f5c5SAndroid Build Coastguard Worker {
163*8975f5c5SAndroid Build Coastguard Worker     // Advertise robust resource initialization on all OpenGL backends for testing even though it is
164*8975f5c5SAndroid Build Coastguard Worker     // not fully implemented.
165*8975f5c5SAndroid Build Coastguard Worker     outExtensions->robustResourceInitializationANGLE = true;
166*8975f5c5SAndroid Build Coastguard Worker }
167*8975f5c5SAndroid Build Coastguard Worker 
makeCurrentSurfaceless(gl::Context * context)168*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayGL::makeCurrentSurfaceless(gl::Context *context)
169*8975f5c5SAndroid Build Coastguard Worker {
170*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
171*8975f5c5SAndroid Build Coastguard Worker     return egl::NoError();
172*8975f5c5SAndroid Build Coastguard Worker }
173*8975f5c5SAndroid Build Coastguard Worker 
getRendererDescription()174*8975f5c5SAndroid Build Coastguard Worker std::string DisplayGL::getRendererDescription()
175*8975f5c5SAndroid Build Coastguard Worker {
176*8975f5c5SAndroid Build Coastguard Worker     std::string rendererString        = GetRendererString(getRenderer()->getFunctions());
177*8975f5c5SAndroid Build Coastguard Worker     const angle::FeaturesGL &features = getRenderer()->getFeatures();
178*8975f5c5SAndroid Build Coastguard Worker 
179*8975f5c5SAndroid Build Coastguard Worker     if (features.sanitizeAMDGPURendererString.enabled)
180*8975f5c5SAndroid Build Coastguard Worker     {
181*8975f5c5SAndroid Build Coastguard Worker         return SanitizeRendererString(rendererString);
182*8975f5c5SAndroid Build Coastguard Worker     }
183*8975f5c5SAndroid Build Coastguard Worker     return rendererString;
184*8975f5c5SAndroid Build Coastguard Worker }
185*8975f5c5SAndroid Build Coastguard Worker 
getVendorString()186*8975f5c5SAndroid Build Coastguard Worker std::string DisplayGL::getVendorString()
187*8975f5c5SAndroid Build Coastguard Worker {
188*8975f5c5SAndroid Build Coastguard Worker     return GetVendorString(getRenderer()->getFunctions());
189*8975f5c5SAndroid Build Coastguard Worker }
190*8975f5c5SAndroid Build Coastguard Worker 
getVersionString(bool includeFullVersion)191*8975f5c5SAndroid Build Coastguard Worker std::string DisplayGL::getVersionString(bool includeFullVersion)
192*8975f5c5SAndroid Build Coastguard Worker {
193*8975f5c5SAndroid Build Coastguard Worker     std::string versionString = GetVersionString(getRenderer()->getFunctions());
194*8975f5c5SAndroid Build Coastguard Worker     return SanitizeVersionString(versionString,
195*8975f5c5SAndroid Build Coastguard Worker                                  getRenderer()->getFunctions()->standard == STANDARD_GL_ES,
196*8975f5c5SAndroid Build Coastguard Worker                                  includeFullVersion);
197*8975f5c5SAndroid Build Coastguard Worker }
198*8975f5c5SAndroid Build Coastguard Worker 
199*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
200