1 // 2 // Copyright 2015 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 // DisplayCGL.h: CGL implementation of egl::Display 8 9 #ifndef LIBANGLE_RENDERER_GL_CGL_DISPLAYCGL_H_ 10 #define LIBANGLE_RENDERER_GL_CGL_DISPLAYCGL_H_ 11 12 #include "libANGLE/renderer/gl/DisplayGL.h" 13 14 struct _CGLContextObject; 15 typedef _CGLContextObject *CGLContextObj; 16 17 struct _CGLPixelFormatObject; 18 typedef _CGLPixelFormatObject *CGLPixelFormatObj; 19 20 namespace rx 21 { 22 23 class WorkerContext; 24 25 class DisplayCGL : public DisplayGL 26 { 27 public: 28 DisplayCGL(const egl::DisplayState &state); 29 ~DisplayCGL() override; 30 31 egl::Error initialize(egl::Display *display) override; 32 void terminate() override; 33 34 SurfaceImpl *createWindowSurface(const egl::SurfaceState &state, 35 EGLNativeWindowType window, 36 const egl::AttributeMap &attribs) override; 37 SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state, 38 const egl::AttributeMap &attribs) override; 39 SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state, 40 EGLenum buftype, 41 EGLClientBuffer clientBuffer, 42 const egl::AttributeMap &attribs) override; 43 SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state, 44 NativePixmapType nativePixmap, 45 const egl::AttributeMap &attribs) override; 46 47 ContextImpl *createContext(const gl::State &state, 48 gl::ErrorSet *errorSet, 49 const egl::Config *configuration, 50 const gl::Context *shareContext, 51 const egl::AttributeMap &attribs) override; 52 53 egl::ConfigSet generateConfigs() override; 54 55 bool testDeviceLost() override; 56 egl::Error restoreLostDevice(const egl::Display *display) override; 57 58 bool isValidNativeWindow(EGLNativeWindowType window) const override; 59 egl::Error validateClientBuffer(const egl::Config *configuration, 60 EGLenum buftype, 61 EGLClientBuffer clientBuffer, 62 const egl::AttributeMap &attribs) const override; 63 64 DeviceImpl *createDevice() override; 65 66 std::string getVendorString() const override; 67 68 egl::Error waitClient(const gl::Context *context) override; 69 egl::Error waitNative(const gl::Context *context, EGLint engine) override; 70 71 gl::Version getMaxSupportedESVersion() const override; 72 73 CGLContextObj getCGLContext() const; 74 CGLPixelFormatObj getCGLPixelFormat() const; 75 76 WorkerContext *createWorkerContext(std::string *infoLog); 77 78 void initializeFrontendFeatures(angle::FrontendFeatures *features) const override; 79 80 void populateFeatureList(angle::FeatureList *features) override; 81 82 // Support for dual-GPU MacBook Pros. If the context was created 83 // preferring the high-power GPU, unreference that GPU during 84 // context destruction. 85 void unreferenceDiscreteGPU(); 86 87 private: 88 egl::Error makeCurrentSurfaceless(gl::Context *context) override; 89 90 void generateExtensions(egl::DisplayExtensions *outExtensions) const override; 91 void generateCaps(egl::Caps *outCaps) const override; 92 93 std::shared_ptr<RendererGL> mRenderer; 94 95 egl::Display *mEGLDisplay; 96 CGLContextObj mContext; 97 CGLPixelFormatObj mPixelFormat; 98 bool mSupportsGPUSwitching; 99 CGLPixelFormatObj mDiscreteGPUPixelFormat; 100 int mDiscreteGPURefs; 101 }; 102 103 } // namespace rx 104 105 #endif // LIBANGLE_RENDERER_GL_CGL_DISPLAYCGL_H_ 106