• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2014 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 #ifndef UTIL_EGLWINDOW_H_
8 #define UTIL_EGLWINDOW_H_
9 
10 #include <stdint.h>
11 #include <list>
12 #include <memory>
13 #include <string>
14 
15 #include "common/Optional.h"
16 #include "common/angleutils.h"
17 #include "util/EGLPlatformParameters.h"
18 #include "util/util_export.h"
19 #include "util/util_gl.h"
20 
21 class OSWindow;
22 
23 namespace angle
24 {
25 class Library;
26 struct PlatformMethods;
27 }  // namespace angle
28 
29 struct ANGLE_UTIL_EXPORT ConfigParameters
30 {
31     ConfigParameters();
32     ~ConfigParameters();
33 
34     void reset();
35 
36     // Surface and Context parameters.
37     int redBits;
38     int greenBits;
39     int blueBits;
40     int alphaBits;
41     int depthBits;
42     int stencilBits;
43 
44     Optional<bool> webGLCompatibility;
45     Optional<bool> robustResourceInit;
46 
47     // EGLWindow-specific.
48     EGLenum componentType;
49     bool multisample;
50     bool debug;
51     bool noError;
52     Optional<bool> extensionsEnabled;
53     bool bindGeneratesResource;
54     bool clientArraysEnabled;
55     bool robustAccess;
56     EGLint samples;
57     Optional<bool> contextProgramCacheEnabled;
58     EGLenum resetStrategy;
59 };
60 
61 class ANGLE_UTIL_EXPORT GLWindowBase : angle::NonCopyable
62 {
63   public:
64     static void Delete(GLWindowBase **window);
65 
66     // It should also be possible to set multisample and floating point framebuffers.
getClientMajorVersion()67     EGLint getClientMajorVersion() const { return mClientMajorVersion; }
getClientMinorVersion()68     EGLint getClientMinorVersion() const { return mClientMinorVersion; }
69 
70     virtual bool initializeGL(OSWindow *osWindow,
71                               angle::Library *glWindowingLibrary,
72                               const EGLPlatformParameters &platformParams,
73                               const ConfigParameters &configParams) = 0;
74     virtual bool isGLInitialized() const                            = 0;
75     virtual void swap()                                             = 0;
76     virtual void destroyGL()                                        = 0;
77     virtual bool makeCurrent()                                      = 0;
78     virtual bool hasError() const                                   = 0;
79     virtual bool setSwapInterval(EGLint swapInterval)               = 0;
80 
isMultisample()81     bool isMultisample() const { return mConfigParams.multisample; }
isDebugEnabled()82     bool isDebugEnabled() const { return mConfigParams.debug; }
83 
getPlatformMethods()84     const angle::PlatformMethods *getPlatformMethods() const { return mPlatform.platformMethods; }
85 
getPlatform()86     const EGLPlatformParameters &getPlatform() const { return mPlatform; }
getConfigParams()87     const ConfigParameters &getConfigParams() const { return mConfigParams; }
88 
89   protected:
90     GLWindowBase(EGLint glesMajorVersion, EGLint glesMinorVersion);
91     virtual ~GLWindowBase();
92 
93     EGLint mClientMajorVersion;
94     EGLint mClientMinorVersion;
95     EGLPlatformParameters mPlatform;
96     ConfigParameters mConfigParams;
97 };
98 
99 class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase
100 {
101   public:
102     static EGLWindow *New(EGLint glesMajorVersion, EGLint glesMinorVersion);
103     static void Delete(EGLWindow **window);
104 
105     static EGLBoolean FindEGLConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *config);
106 
107     EGLConfig getConfig() const;
108     EGLDisplay getDisplay() const;
109     EGLSurface getSurface() const;
110     EGLContext getContext() const;
111 
112     // Internally initializes the Display, Surface and Context.
113     bool initializeGL(OSWindow *osWindow,
114                       angle::Library *glWindowingLibrary,
115                       const EGLPlatformParameters &platformParams,
116                       const ConfigParameters &configParams) override;
117 
118     bool isGLInitialized() const override;
119     void swap() override;
120     void destroyGL() override;
121     bool makeCurrent() override;
122     bool hasError() const override;
123     bool setSwapInterval(EGLint swapInterval) override;
124 
125     // Only initializes the Display.
126     bool initializeDisplay(OSWindow *osWindow,
127                            angle::Library *glWindowingLibrary,
128                            const EGLPlatformParameters &params);
129 
130     // Only initializes the Surface.
131     bool initializeSurface(OSWindow *osWindow,
132                            angle::Library *glWindowingLibrary,
133                            const ConfigParameters &params);
134 
135     // Create an EGL context with this window's configuration
136     EGLContext createContext(EGLContext share) const;
137 
138     // Only initializes the Context.
139     bool initializeContext();
140 
141     void destroySurface();
142     void destroyContext();
143 
isDisplayInitialized()144     bool isDisplayInitialized() const { return mDisplay != EGL_NO_DISPLAY; }
145 
146   private:
147     EGLWindow(EGLint glesMajorVersion, EGLint glesMinorVersion);
148 
149     ~EGLWindow() override;
150 
151     EGLConfig mConfig;
152     EGLDisplay mDisplay;
153     EGLSurface mSurface;
154     EGLContext mContext;
155 
156     EGLint mEGLMajorVersion;
157     EGLint mEGLMinorVersion;
158 };
159 
160 ANGLE_UTIL_EXPORT bool CheckExtensionExists(const char *allExtensions, const std::string &extName);
161 
162 #endif  // UTIL_EGLWINDOW_H_
163