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 // FunctionsEGL.h: Defines the FunctionsEGL class to load functions and data from EGL 8 9 #ifndef LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGL_H_ 10 #define LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGL_H_ 11 12 #include <EGL/egl.h> 13 #include <EGL/eglext.h> 14 15 #include <string> 16 #include <vector> 17 18 #include "libANGLE/Error.h" 19 20 namespace rx 21 { 22 23 class FunctionsGL; 24 25 class FunctionsEGL 26 { 27 public: 28 FunctionsEGL(); 29 virtual ~FunctionsEGL(); 30 31 int majorVersion; 32 int minorVersion; 33 std::string vendorString; 34 std::string versionString; 35 36 egl::Error initialize(EGLAttrib platformType, EGLNativeDisplayType nativeDisplay); 37 egl::Error terminate(); 38 39 virtual void *getProcAddress(const char *name) const = 0; 40 41 FunctionsGL *makeFunctionsGL() const; 42 bool hasExtension(const char *extension) const; 43 bool hasDmaBufImportModifierFunctions() const; 44 EGLDisplay getDisplay() const; 45 EGLint getError() const; 46 47 EGLBoolean chooseConfig(EGLint const *attrib_list, 48 EGLConfig *configs, 49 EGLint config_size, 50 EGLint *num_config) const; 51 EGLBoolean getConfigs(EGLConfig *configs, EGLint config_size, EGLint *num_config) const; 52 EGLBoolean getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value) const; 53 EGLSurface getCurrentSurface(EGLint readdraw) const; 54 EGLContext createContext(EGLConfig config, 55 EGLContext share_context, 56 EGLint const *attrib_list) const; 57 EGLSurface createPbufferSurface(EGLConfig config, const EGLint *attrib_list) const; 58 EGLSurface createWindowSurface(EGLConfig config, 59 EGLNativeWindowType win, 60 const EGLint *attrib_list) const; 61 EGLBoolean destroyContext(EGLContext context) const; 62 EGLBoolean destroySurface(EGLSurface surface) const; 63 EGLBoolean makeCurrent(EGLSurface surface, EGLContext context) const; 64 const char *queryString(EGLint name) const; 65 EGLBoolean querySurface(EGLSurface surface, EGLint attribute, EGLint *value) const; 66 EGLBoolean swapBuffers(EGLSurface surface) const; 67 68 EGLBoolean bindTexImage(EGLSurface surface, EGLint buffer) const; 69 EGLBoolean releaseTexImage(EGLSurface surface, EGLint buffer) const; 70 EGLBoolean surfaceAttrib(EGLSurface surface, EGLint attribute, EGLint value) const; 71 EGLBoolean swapInterval(EGLint interval) const; 72 73 EGLContext getCurrentContext() const; 74 75 EGLImageKHR createImageKHR(EGLContext context, 76 EGLenum target, 77 EGLClientBuffer buffer, 78 const EGLint *attrib_list) const; 79 EGLBoolean destroyImageKHR(EGLImageKHR image) const; 80 81 EGLSyncKHR createSyncKHR(EGLenum type, const EGLint *attrib_list) const; 82 EGLBoolean destroySyncKHR(EGLSyncKHR sync) const; 83 EGLint clientWaitSyncKHR(EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout) const; 84 EGLBoolean getSyncAttribKHR(EGLSyncKHR sync, EGLint attribute, EGLint *value) const; 85 86 EGLint waitSyncKHR(EGLSyncKHR sync, EGLint flags) const; 87 88 EGLBoolean swapBuffersWithDamageKHR(EGLSurface surface, 89 const EGLint *rects, 90 EGLint n_rects) const; 91 92 EGLBoolean presentationTimeANDROID(EGLSurface surface, EGLnsecsANDROID time) const; 93 94 void setBlobCacheFuncsANDROID(EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get) const; 95 96 EGLBoolean getCompositorTimingSupportedANDROID(EGLSurface surface, EGLint name) const; 97 EGLBoolean getCompositorTimingANDROID(EGLSurface surface, 98 EGLint numTimestamps, 99 const EGLint *names, 100 EGLnsecsANDROID *values) const; 101 EGLBoolean getNextFrameIdANDROID(EGLSurface surface, EGLuint64KHR *frameId) const; 102 EGLBoolean getFrameTimestampSupportedANDROID(EGLSurface surface, EGLint timestamp) const; 103 EGLBoolean getFrameTimestampsANDROID(EGLSurface surface, 104 EGLuint64KHR frameId, 105 EGLint numTimestamps, 106 const EGLint *timestamps, 107 EGLnsecsANDROID *values) const; 108 109 EGLint dupNativeFenceFDANDROID(EGLSync sync) const; 110 111 EGLint queryDmaBufFormatsEXT(EGLint maxFormats, EGLint *formats, EGLint *numFormats) const; 112 113 EGLint queryDmaBufModifiersEXT(EGLint format, 114 EGLint maxModifiers, 115 EGLuint64KHR *modifiers, 116 EGLBoolean *externalOnly, 117 EGLint *numModifiers) const; 118 119 EGLBoolean queryDeviceAttribEXT(EGLDisplay dpy, EGLint attribute, EGLAttrib *value) const; 120 const char *queryDeviceStringEXT(EGLDeviceEXT device, EGLint name) const; 121 EGLBoolean queryDisplayAttribEXT(EGLint attribute, EGLAttrib *value) const; 122 123 private: 124 // So as to isolate from angle we do not include angleutils.h and cannot 125 // use angle::NonCopyable so we replicated it here instead. 126 FunctionsEGL(const FunctionsEGL &) = delete; 127 void operator=(const FunctionsEGL &) = delete; 128 129 // Helper mechanism for creating a display for the desired platform type. 130 EGLDisplay getPlatformDisplay(EGLAttrib platformType, EGLNativeDisplayType nativeDisplay); 131 132 // Helper method to populate EGL extensions. Returns true if extensions are found. 133 bool queryExtensions(); 134 135 // Helper method to query egl for devices. 136 std::vector<EGLDeviceEXT> queryDevices(int *major, int *minor); 137 138 // Fallback mechanism for creating a display from a native device object. 139 EGLDisplay getNativeDisplay(int *major, int *minor); 140 141 #if defined(ANGLE_HAS_LIBDRM) 142 // Helper method to select preferred EGL device from queried devices. 143 EGLDeviceEXT getPreferredEGLDevice(const std::vector<EGLDeviceEXT> &devices); 144 145 // Helper method to get preferred display. 146 EGLDisplay getPreferredDisplay(int *major, int *minor); 147 #endif // defined(ANGLE_HAS_LIBDRM) 148 149 struct EGLDispatchTable; 150 EGLDispatchTable *mFnPtrs; 151 EGLDisplay mEGLDisplay; 152 std::vector<std::string> mExtensions; 153 }; 154 } // namespace rx 155 156 #endif // LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGL_H_ 157