1 // 2 // Copyright 2020 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 // DisplayEAGL.h: EAGL implementation of egl::Display 8 9 #ifndef LIBANGLE_RENDERER_GL_EAGL_DISPLAYEAGL_H_ 10 #define LIBANGLE_RENDERER_GL_EAGL_DISPLAYEAGL_H_ 11 12 #include <thread> 13 #include <unordered_set> 14 15 #import "common/platform.h" 16 17 #if defined(ANGLE_ENABLE_EAGL) 18 19 # include "libANGLE/renderer/gl/DisplayGL.h" 20 21 # ifdef __OBJC__ 22 @class EAGLContext; 23 typedef EAGLContext *EAGLContextObj; 24 # else 25 typedef void *EAGLContextObj; 26 # endif 27 28 namespace rx 29 { 30 31 class WorkerContext; 32 33 class DisplayEAGL : public DisplayGL 34 { 35 public: 36 DisplayEAGL(const egl::DisplayState &state); 37 ~DisplayEAGL() override; 38 39 egl::Error initialize(egl::Display *display) override; 40 void terminate() override; 41 egl::Error prepareForCall() override; 42 egl::Error releaseThread() override; 43 44 SurfaceImpl *createWindowSurface(const egl::SurfaceState &state, 45 EGLNativeWindowType window, 46 const egl::AttributeMap &attribs) override; 47 SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state, 48 const egl::AttributeMap &attribs) override; 49 SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state, 50 EGLenum buftype, 51 EGLClientBuffer clientBuffer, 52 const egl::AttributeMap &attribs) override; 53 SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state, 54 NativePixmapType nativePixmap, 55 const egl::AttributeMap &attribs) override; 56 57 ContextImpl *createContext(const gl::State &state, 58 gl::ErrorSet *errorSet, 59 const egl::Config *configuration, 60 const gl::Context *shareContext, 61 const egl::AttributeMap &attribs) override; 62 63 egl::ConfigSet generateConfigs() override; 64 65 bool testDeviceLost() override; 66 egl::Error restoreLostDevice(const egl::Display *display) override; 67 68 bool isValidNativeWindow(EGLNativeWindowType window) const override; 69 egl::Error validateClientBuffer(const egl::Config *configuration, 70 EGLenum buftype, 71 EGLClientBuffer clientBuffer, 72 const egl::AttributeMap &attribs) const override; 73 74 DeviceImpl *createDevice() override; 75 76 egl::Error waitClient(const gl::Context *context) override; 77 egl::Error waitNative(const gl::Context *context, EGLint engine) override; 78 79 gl::Version getMaxSupportedESVersion() const override; 80 81 EAGLContextObj getEAGLContext() const; 82 83 WorkerContext *createWorkerContext(std::string *infoLog); 84 85 void initializeFrontendFeatures(angle::FrontendFeatures *features) const override; 86 87 void populateFeatureList(angle::FeatureList *features) override; 88 89 RendererGL *getRenderer() const override; 90 91 private: 92 egl::Error makeCurrentSurfaceless(gl::Context *context) override; 93 94 void generateExtensions(egl::DisplayExtensions *outExtensions) const override; 95 void generateCaps(egl::Caps *outCaps) const override; 96 97 std::shared_ptr<RendererGL> mRenderer; 98 99 egl::Display *mEGLDisplay; 100 EAGLContextObj mContext; 101 std::unordered_set<std::thread::id> mThreadsWithContextCurrent; 102 bool mDeviceContextIsVolatile = false; 103 }; 104 105 } // namespace rx 106 107 #endif // defined(ANGLE_ENABLE_EAGL) 108 109 #endif // LIBANGLE_RENDERER_GL_EAGL_DISPLAYEAGL_H_ 110