• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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