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