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 ¶ms); 132 133 // Only initializes the Surface. 134 bool initializeSurface(OSWindow *osWindow, 135 angle::Library *glWindowingLibrary, 136 const ConfigParameters ¶ms); 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