• 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                               angle::GLESDriverType driverType,
73                               const EGLPlatformParameters &platformParams,
74                               const ConfigParameters &configParams) = 0;
75     virtual bool isGLInitialized() const                            = 0;
76     virtual void swap()                                             = 0;
77     virtual void destroyGL()                                        = 0;
78     virtual bool makeCurrent()                                      = 0;
79     virtual bool hasError() const                                   = 0;
80     virtual bool setSwapInterval(EGLint swapInterval)               = 0;
81 
isMultisample()82     bool isMultisample() const { return mConfigParams.multisample; }
isDebugEnabled()83     bool isDebugEnabled() const { return mConfigParams.debug; }
84 
getPlatformMethods()85     const angle::PlatformMethods *getPlatformMethods() const { return mPlatform.platformMethods; }
86 
getPlatform()87     const EGLPlatformParameters &getPlatform() const { return mPlatform; }
getConfigParams()88     const ConfigParameters &getConfigParams() const { return mConfigParams; }
89 
90   protected:
91     GLWindowBase(EGLint glesMajorVersion, EGLint glesMinorVersion);
92     virtual ~GLWindowBase();
93 
94     EGLint mClientMajorVersion;
95     EGLint mClientMinorVersion;
96     EGLPlatformParameters mPlatform;
97     ConfigParameters mConfigParams;
98 };
99 
100 class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase
101 {
102   public:
103     static EGLWindow *New(EGLint glesMajorVersion, EGLint glesMinorVersion);
104     static void Delete(EGLWindow **window);
105 
106     static EGLBoolean FindEGLConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *config);
107 
108     EGLConfig getConfig() const;
109     EGLDisplay getDisplay() const;
110     EGLSurface getSurface() const;
111     EGLContext getContext() const;
112 
113     // Internally initializes the Display, Surface and Context.
114     bool initializeGL(OSWindow *osWindow,
115                       angle::Library *glWindowingLibrary,
116                       angle::GLESDriverType driverType,
117                       const EGLPlatformParameters &platformParams,
118                       const ConfigParameters &configParams) override;
119 
120     bool isGLInitialized() const override;
121     void swap() override;
122     void destroyGL() override;
123     bool makeCurrent() override;
124     bool hasError() const override;
125     bool setSwapInterval(EGLint swapInterval) override;
126 
127     // Only initializes the Display.
128     bool initializeDisplay(OSWindow *osWindow,
129                            angle::Library *glWindowingLibrary,
130                            angle::GLESDriverType driverType,
131                            const EGLPlatformParameters &params);
132 
133     // Only initializes the Surface.
134     bool initializeSurface(OSWindow *osWindow,
135                            angle::Library *glWindowingLibrary,
136                            const ConfigParameters &params);
137 
138     // Create an EGL context with this window's configuration
139     EGLContext createContext(EGLContext share) const;
140 
141     // Only initializes the Context.
142     bool initializeContext();
143 
144     void destroySurface();
145     void destroyContext();
146 
isDisplayInitialized()147     bool isDisplayInitialized() const { return mDisplay != EGL_NO_DISPLAY; }
148 
149   private:
150     EGLWindow(EGLint glesMajorVersion, EGLint glesMinorVersion);
151 
152     ~EGLWindow() override;
153 
154     EGLConfig mConfig;
155     EGLDisplay mDisplay;
156     EGLSurface mSurface;
157     EGLContext mContext;
158 
159     EGLint mEGLMajorVersion;
160     EGLint mEGLMinorVersion;
161 };
162 
163 #endif  // UTIL_EGLWINDOW_H_
164