• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2016 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 // DisplayAndroid.h: Android implementation of egl::Display
8 
9 #ifndef LIBANGLE_RENDERER_GL_EGL_ANDROID_DISPLAYANDROID_H_
10 #define LIBANGLE_RENDERER_GL_EGL_ANDROID_DISPLAYANDROID_H_
11 
12 #include <map>
13 #include <string>
14 #include <thread>
15 #include <vector>
16 
17 #include "libANGLE/renderer/gl/egl/DisplayEGL.h"
18 
19 namespace rx
20 {
21 
22 class RendererEGL;
23 
24 class DisplayAndroid : public DisplayEGL
25 {
26   public:
27     DisplayAndroid(const egl::DisplayState &state);
28     ~DisplayAndroid() override;
29 
30     egl::Error initialize(egl::Display *display) override;
31     void terminate() override;
32 
33     SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
34                                      EGLNativeWindowType window,
35                                      const egl::AttributeMap &attribs) override;
36     SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state,
37                                       const egl::AttributeMap &attribs) override;
38     SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state,
39                                                EGLenum buftype,
40                                                EGLClientBuffer clientBuffer,
41                                                const egl::AttributeMap &attribs) override;
42     SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state,
43                                      NativePixmapType nativePixmap,
44                                      const egl::AttributeMap &attribs) override;
45 
46     ContextImpl *createContext(const gl::State &state,
47                                gl::ErrorSet *errorSet,
48                                const egl::Config *configuration,
49                                const gl::Context *shareContext,
50                                const egl::AttributeMap &attribs) override;
51 
52     egl::ConfigSet generateConfigs() override;
53 
54     bool testDeviceLost() override;
55     egl::Error restoreLostDevice(const egl::Display *display) override;
56 
57     bool isValidNativeWindow(EGLNativeWindowType window) const override;
58     egl::Error validateImageClientBuffer(const gl::Context *context,
59                                          EGLenum target,
60                                          EGLClientBuffer clientBuffer,
61                                          const egl::AttributeMap &attribs) const override;
62 
63     ExternalImageSiblingImpl *createExternalImageSibling(const gl::Context *context,
64                                                          EGLenum target,
65                                                          EGLClientBuffer buffer,
66                                                          const egl::AttributeMap &attribs) override;
67 
68     DeviceImpl *createDevice() override;
69 
70     egl::Error waitClient(const gl::Context *context) override;
71     egl::Error waitNative(const gl::Context *context, EGLint engine) override;
72 
73     egl::Error makeCurrent(egl::Surface *drawSurface,
74                            egl::Surface *readSurface,
75                            gl::Context *context) override;
76 
77     gl::Version getMaxSupportedESVersion() const override;
78 
79     void destroyNativeContext(EGLContext context) override;
80 
81     WorkerContext *createWorkerContext(std::string *infoLog,
82                                        EGLContext sharedContext,
83                                        const native_egl::AttributeVector workerAttribs) override;
84 
85     void initializeFrontendFeatures(angle::FrontendFeatures *features) const override;
86 
87     void populateFeatureList(angle::FeatureList *features) override;
88 
89   private:
90     void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
91 
92     egl::Error createRenderer(EGLContext shareContext,
93                               bool makeNewContextCurrent,
94                               std::shared_ptr<RendererEGL> *outRenderer);
95 
96     egl::Error makeCurrentSurfaceless(gl::Context *context) override;
97 
98     template <typename T>
99     void getConfigAttrib(EGLConfig config, EGLint attribute, T *value) const;
100 
101     template <typename T, typename U>
102     void getConfigAttribIfExtension(EGLConfig config,
103                                     EGLint attribute,
104                                     T *value,
105                                     const char *extension,
106                                     const U &defaultValue) const;
107 
108     bool mVirtualizedContexts;
109     std::shared_ptr<RendererEGL> mRenderer;
110 
111     egl::AttributeMap mDisplayAttributes;
112 
113     bool mSupportsSurfaceless;
114 
115     std::vector<EGLint> mConfigAttribList;
116     std::map<EGLint, EGLint> mConfigIds;
117     EGLSurface mDummyPbuffer;
118 
119     struct CurrentNativeContext
120     {
121         EGLSurface surface = EGL_NO_SURFACE;
122         EGLContext context = EGL_NO_CONTEXT;
123     };
124     std::unordered_map<std::thread::id, CurrentNativeContext> mCurrentNativeContext;
125 };
126 
127 }  // namespace rx
128 
129 #endif  // LIBANGLE_RENDERER_GL_EGL_ANDROID_DISPLAYANDROID_H_
130