• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //    http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef libEGL_hpp
16 #define libEGL_hpp
17 
18 #include <EGL/egl.h>
19 #include <EGL/eglext.h>
20 
21 #include "Common/SharedLibrary.hpp"
22 
23 class LibEGLexports
24 {
25 public:
26 	LibEGLexports();
27 
28 	EGLint (*eglGetError)(void);
29 	EGLDisplay (*eglGetDisplay)(EGLNativeDisplayType display_id);
30 	EGLBoolean (*eglInitialize)(EGLDisplay dpy, EGLint *major, EGLint *minor);
31 	EGLBoolean (*eglTerminate)(EGLDisplay dpy);
32 	const char *(*eglQueryString)(EGLDisplay dpy, EGLint name);
33 	EGLBoolean (*eglGetConfigs)(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
34 	EGLBoolean (*eglChooseConfig)(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
35 	EGLBoolean (*eglGetConfigAttrib)(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
36 	EGLSurface (*eglCreateWindowSurface)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list);
37 	EGLSurface (*eglCreatePbufferSurface)(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
38 	EGLSurface (*eglCreatePixmapSurface)(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);
39 	EGLBoolean (*eglDestroySurface)(EGLDisplay dpy, EGLSurface surface);
40 	EGLBoolean (*eglQuerySurface)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
41 	EGLBoolean (*eglBindAPI)(EGLenum api);
42 	EGLenum (*eglQueryAPI)(void);
43 	EGLBoolean (*eglWaitClient)(void);
44 	EGLBoolean (*eglReleaseThread)(void);
45 	EGLSurface (*eglCreatePbufferFromClientBuffer)(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);
46 	EGLBoolean (*eglSurfaceAttrib)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
47 	EGLBoolean (*eglBindTexImage)(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
48 	EGLBoolean (*eglReleaseTexImage)(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
49 	EGLBoolean (*eglSwapInterval)(EGLDisplay dpy, EGLint interval);
50 	EGLContext (*eglCreateContext)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
51 	EGLBoolean (*eglDestroyContext)(EGLDisplay dpy, EGLContext ctx);
52 	EGLBoolean (*eglMakeCurrent)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
53 	EGLContext (*eglGetCurrentContext)(void);
54 	EGLSurface (*eglGetCurrentSurface)(EGLint readdraw);
55 	EGLDisplay (*eglGetCurrentDisplay)(void);
56 	EGLBoolean (*eglQueryContext)(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
57 	EGLBoolean (*eglWaitGL)(void);
58 	EGLBoolean (*eglWaitNative)(EGLint engine);
59 	EGLBoolean (*eglSwapBuffers)(EGLDisplay dpy, EGLSurface surface);
60 	EGLBoolean (*eglCopyBuffers)(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
61 	EGLImageKHR (*eglCreateImageKHR)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
62 	EGLBoolean (*eglDestroyImageKHR)(EGLDisplay dpy, EGLImageKHR image);
63 	__eglMustCastToProperFunctionPointerType (*eglGetProcAddress)(const char*);
64 	EGLSyncKHR (*eglCreateSyncKHR)(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
65 	EGLBoolean (*eglDestroySyncKHR)(EGLDisplay dpy, EGLSyncKHR sync);
66 	EGLint (*eglClientWaitSyncKHR)(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
67 	EGLBoolean (*eglGetSyncAttribKHR)(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
68 
69 	// Functions that don't change the error code, for use by client APIs
70 	egl::Context *(*clientGetCurrentContext)();
71 };
72 
73 class LibEGL
74 {
75 public:
LibEGL()76 	LibEGL()
77 	{
78 		libEGL = nullptr;
79 		libEGLexports = nullptr;
80 	}
81 
~LibEGL()82 	~LibEGL()
83 	{
84 		freeLibrary(libEGL);
85 	}
86 
operator ->()87 	LibEGLexports *operator->()
88 	{
89 		return loadExports();
90 	}
91 
92 private:
loadExports()93 	LibEGLexports *loadExports()
94 	{
95 		if(!libEGL)
96 		{
97 			#if defined(_WIN32)
98 				#if defined(__LP64__)
99 					const char *libEGL_lib[] = {"libEGL.dll", "lib64EGL_translator.dll"};
100 				#else
101 					const char *libEGL_lib[] = {"libEGL.dll", "libEGL_translator.dll"};
102 				#endif
103 			#elif defined(__ANDROID__)
104 				#if defined(__LP64__)
105 					const char *libEGL_lib[] = {"/vendor/lib64/egl/libEGL_swiftshader.so", "/system/lib64/egl/libEGL_swiftshader.so"};
106 				#else
107 					const char *libEGL_lib[] = {"/vendor/lib/egl/libEGL_swiftshader.so", "/system/lib/egl/libEGL_swiftshader.so"};
108 				#endif
109 			#elif defined(__linux__)
110 				#if defined(__LP64__)
111 					const char *libEGL_lib[] = {"lib64EGL_translator.so", "libEGL.so.1", "libEGL.so"};
112 				#else
113 					const char *libEGL_lib[] = {"libEGL_translator.so", "libEGL.so.1", "libEGL.so"};
114 				#endif
115 			#elif defined(__APPLE__)
116 				#if defined(__LP64__)
117 					const char *libEGL_lib[] = {"libswiftshader_libEGL.dylib", "lib64EGL_translator.dylib", "libEGL.so", "libEGL.dylib"};
118 				#else
119 					const char *libEGL_lib[] = {"libswiftshader_libEGL.dylib", "libEGL_translator.dylib", "libEGL.so", "libEGL.dylib"};
120 				#endif
121 			#elif defined(__Fuchsia__)
122 				const char *libEGL_lib[] = {"libEGL.so"};
123 			#else
124 				#error "libEGL::loadExports unimplemented for this platform"
125 			#endif
126 
127 			libEGL = loadLibrary(libEGL_lib, "libEGL_swiftshader");
128 
129 			if(libEGL)
130 			{
131 				auto libEGL_swiftshader = (LibEGLexports *(*)())getProcAddress(libEGL, "libEGL_swiftshader");
132 				libEGLexports = libEGL_swiftshader();
133 			}
134 		}
135 
136 		return libEGLexports;
137 	}
138 
139 	void *libEGL;
140 	LibEGLexports *libEGLexports;
141 };
142 
143 #endif   // libEGL_hpp
144