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