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