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 <unordered_set> 13 14 #include "libANGLE/renderer/gl/DisplayGL.h" 15 16 struct _CGLContextObject; 17 typedef _CGLContextObject *CGLContextObj; 18 19 struct _CGLPixelFormatObject; 20 typedef _CGLPixelFormatObject *CGLPixelFormatObj; 21 22 namespace rx 23 { 24 25 struct EnsureCGLContextIsCurrent : angle::NonCopyable 26 { 27 public: 28 EnsureCGLContextIsCurrent(CGLContextObj context); 29 ~EnsureCGLContextIsCurrent(); 30 31 private: 32 CGLContextObj mOldContext; 33 bool mResetContext; 34 }; 35 36 class DisplayCGL : public DisplayGL 37 { 38 public: 39 DisplayCGL(const egl::DisplayState &state); 40 ~DisplayCGL() override; 41 42 egl::Error initialize(egl::Display *display) override; 43 void terminate() override; 44 egl::Error prepareForCall() override; 45 egl::Error releaseThread() override; 46 47 egl::Error makeCurrent(egl::Display *display, 48 egl::Surface *drawSurface, 49 egl::Surface *readSurface, 50 gl::Context *context) override; 51 52 SurfaceImpl *createWindowSurface(const egl::SurfaceState &state, 53 EGLNativeWindowType window, 54 const egl::AttributeMap &attribs) override; 55 SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state, 56 const egl::AttributeMap &attribs) override; 57 SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state, 58 EGLenum buftype, 59 EGLClientBuffer clientBuffer, 60 const egl::AttributeMap &attribs) override; 61 SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state, 62 NativePixmapType nativePixmap, 63 const egl::AttributeMap &attribs) override; 64 65 ContextImpl *createContext(const gl::State &state, 66 gl::ErrorSet *errorSet, 67 const egl::Config *configuration, 68 const gl::Context *shareContext, 69 const egl::AttributeMap &attribs) override; 70 71 egl::ConfigSet generateConfigs() override; 72 73 bool testDeviceLost() override; 74 egl::Error restoreLostDevice(const egl::Display *display) override; 75 76 bool isValidNativeWindow(EGLNativeWindowType window) const override; 77 egl::Error validateClientBuffer(const egl::Config *configuration, 78 EGLenum buftype, 79 EGLClientBuffer clientBuffer, 80 const egl::AttributeMap &attribs) const override; 81 82 DeviceImpl *createDevice() override; 83 84 egl::Error waitClient(const gl::Context *context) override; 85 egl::Error waitUntilWorkScheduled() override; 86 egl::Error waitNative(const gl::Context *context, EGLint engine) override; 87 88 gl::Version getMaxSupportedESVersion() const override; 89 90 CGLContextObj getCGLContext() const; 91 CGLPixelFormatObj getCGLPixelFormat() const; 92 93 void initializeFrontendFeatures(angle::FrontendFeatures *features) const override; 94 95 void populateFeatureList(angle::FeatureList *features) override; 96 97 RendererGL *getRenderer() const override; 98 99 // Support for dual-GPU MacBook Pros. Used only by ContextCGL. The use of 100 // these entry points is gated by the presence of dual GPUs. 101 egl::Error referenceDiscreteGPU(); 102 egl::Error unreferenceDiscreteGPU(); 103 egl::Error handleGPUSwitch() override; 104 egl::Error forceGPUSwitch(EGLint gpuIDHigh, EGLint gpuIDLow) override; 105 106 private: 107 egl::Error makeCurrentSurfaceless(gl::Context *context) override; 108 109 void generateExtensions(egl::DisplayExtensions *outExtensions) const override; 110 void generateCaps(egl::Caps *outCaps) const override; 111 112 void checkDiscreteGPUStatus(); 113 void setContextToGPU(uint64_t gpuID, GLint virtualScreen); 114 115 std::shared_ptr<RendererGL> mRenderer; 116 117 egl::Display *mEGLDisplay; 118 CGLContextObj mContext; 119 std::unordered_set<uint64_t> mThreadsWithCurrentContext; 120 CGLPixelFormatObj mPixelFormat; 121 bool mSupportsGPUSwitching; 122 uint64_t mCurrentGPUID; 123 CGLPixelFormatObj mDiscreteGPUPixelFormat; 124 int mDiscreteGPURefs; 125 // This comes from the ANGLE platform's DefaultMonotonicallyIncreasingTime. If the discrete GPU 126 // is unref'd for the last time, this is set to the time of that last unref. If it isn't 127 // activated again in 10 seconds, the discrete GPU pixel format is deleted. 128 double mLastDiscreteGPUUnrefTime; 129 bool mDeviceContextIsVolatile = false; 130 }; 131 132 } // namespace rx 133 134 #endif // LIBANGLE_RENDERER_GL_CGL_DISPLAYCGL_H_ 135