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