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