// // Copyright 2016 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // DisplayEGL.h: Common across EGL parts of platform specific egl::Display implementations #ifndef LIBANGLE_RENDERER_GL_EGL_DISPLAYEGL_H_ #define LIBANGLE_RENDERER_GL_EGL_DISPLAYEGL_H_ #include #include #include #include "libANGLE/renderer/gl/DisplayGL.h" #include "libANGLE/renderer/gl/egl/egl_utils.h" namespace rx { class FunctionsEGL; class FunctionsEGLDL; class RendererEGL; class DisplayEGL : public DisplayGL { public: DisplayEGL(const egl::DisplayState &state); ~DisplayEGL() override; ImageImpl *createImage(const egl::ImageState &state, const gl::Context *context, EGLenum target, const egl::AttributeMap &attribs) override; EGLSyncImpl *createSync() override; void setBlobCacheFuncs(EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get) override; virtual void destroyNativeContext(EGLContext context); egl::Error initialize(egl::Display *display) override; void terminate() override; SurfaceImpl *createWindowSurface(const egl::SurfaceState &state, EGLNativeWindowType window, const egl::AttributeMap &attribs) override; SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state, const egl::AttributeMap &attribs) override; SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state, EGLenum buftype, EGLClientBuffer clientBuffer, const egl::AttributeMap &attribs) override; SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state, NativePixmapType nativePixmap, const egl::AttributeMap &attribs) override; ContextImpl *createContext(const gl::State &state, gl::ErrorSet *errorSet, const egl::Config *configuration, const gl::Context *shareContext, const egl::AttributeMap &attribs) override; egl::ConfigSet generateConfigs() override; bool testDeviceLost() override; egl::Error restoreLostDevice(const egl::Display *display) override; bool isValidNativeWindow(EGLNativeWindowType window) const override; egl::Error validateClientBuffer(const egl::Config *configuration, EGLenum buftype, EGLClientBuffer clientBuffer, const egl::AttributeMap &attribs) const override; egl::Error waitClient(const gl::Context *context) override; egl::Error waitNative(const gl::Context *context, EGLint engine) override; egl::Error makeCurrent(egl::Display *display, egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context) override; gl::Version getMaxSupportedESVersion() const override; void initializeFrontendFeatures(angle::FrontendFeatures *features) const override; void populateFeatureList(angle::FeatureList *features) override; RendererGL *getRenderer() const override; egl::Error validateImageClientBuffer(const gl::Context *context, EGLenum target, EGLClientBuffer clientBuffer, const egl::AttributeMap &attribs) const override; ExternalImageSiblingImpl *createExternalImageSibling(const gl::Context *context, EGLenum target, EGLClientBuffer buffer, const egl::AttributeMap &attribs) override; const FunctionsEGL *getFunctionsEGL() const; DeviceImpl *createDevice() override; bool supportsDmaBufFormat(EGLint format) const override; egl::Error queryDmaBufFormats(EGLint maxFormats, EGLint *formats, EGLint *numFormats) override; egl::Error queryDmaBufModifiers(EGLint format, EGLint maxModifiers, EGLuint64KHR *modifiers, EGLBoolean *externalOnly, EGLint *numModifiers) override; protected: virtual EGLint fixSurfaceType(EGLint surfaceType) const; private: const char *getEGLPath() const; egl::Error initializeContext(EGLContext shareContext, const egl::AttributeMap &eglAttributes, EGLContext *outContext) const; void generateExtensions(egl::DisplayExtensions *outExtensions) const override; egl::Error createRenderer(EGLContext shareContext, bool makeNewContextCurrent, bool isExternalContext, std::shared_ptr *outRenderer); egl::Error makeCurrentSurfaceless(gl::Context *context) override; template void getConfigAttrib(EGLConfig config, EGLint attribute, T *value) const; template void getConfigAttribIfExtension(EGLConfig config, EGLint attribute, T *value, const char *extension, const U &defaultValue) const; egl::Error findConfig(egl::Display *display, bool forMockPbuffer, EGLConfig *outConfig, std::vector *outConfigAttribs); std::shared_ptr mRenderer; std::map> mVirtualizationGroups; FunctionsEGLDL *mEGL = nullptr; EGLConfig mConfig = EGL_NO_CONFIG_KHR; egl::AttributeMap mDisplayAttributes; std::vector mConfigAttribList; struct CurrentNativeContext { EGLSurface surface = EGL_NO_SURFACE; EGLContext context = EGL_NO_CONTEXT; // True if the current context is an external context. and both surface and context will be // unset when an external context is current. bool isExternalContext = false; }; angle::HashMap mCurrentNativeContexts; void generateCaps(egl::Caps *outCaps) const override; std::map mConfigIds; bool mHasEXTCreateContextRobustness = false; bool mHasNVRobustnessVideoMemoryPurge = false; bool mSupportsSurfaceless = false; bool mSupportsNoConfigContexts = false; EGLSurface mMockPbuffer = EGL_NO_SURFACE; // Supported DRM formats bool mSupportsDmaBufImportModifiers = false; bool mNoOpDmaBufImportModifiers = false; std::vector mDrmFormats; bool mDrmFormatsInitialized = false; }; } // namespace rx #endif // LIBANGLE_RENDERER_GL_EGL_DISPLAYEGL_H_