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 // main.cpp: DLL entry point and management of thread-local data.
16 
17 #include "main.h"
18 
19 #include "libEGL.hpp"
20 #include "Context.hpp"
21 #include "Surface.hpp"
22 #include "Display.h"
23 
24 #include "resource.h"
25 #include "Common/Thread.hpp"
26 #include "Common/SharedLibrary.hpp"
27 #include "common/debug.h"
28 
29 #include <EGL/eglext.h>
30 
31 static sw::Thread::LocalStorageKey currentTLS = TLS_OUT_OF_INDEXES;
32 
33 #if !defined(_MSC_VER)
34 #define CONSTRUCTOR __attribute__((constructor))
35 #define DESTRUCTOR __attribute__((destructor))
36 #else
37 #define CONSTRUCTOR
38 #define DESTRUCTOR
39 #endif
40 
41 namespace egl
42 {
releaseCurrent(void * storage)43 void releaseCurrent(void *storage)
44 {
45 	// This pthread destructor is called after the TLS is already reset to NULL,
46 	// so we can't call EGL functions here to do the cleanup.
47 
48 	Current *current = (Current*)storage;
49 
50 	if(current)
51 	{
52 		if(current->drawSurface)
53 		{
54 			current->drawSurface->release();
55 		}
56 
57 		if(current->readSurface)
58 		{
59 			current->readSurface->release();
60 		}
61 
62 		if(current->context)
63 		{
64 			current->context->release();
65 		}
66 
67 		free(current);
68 	}
69 }
70 
attachThread()71 Current *attachThread()
72 {
73 	TRACE("()");
74 
75 	if(currentTLS == TLS_OUT_OF_INDEXES)
76 	{
77 		currentTLS = sw::Thread::allocateLocalStorageKey(releaseCurrent);
78 	}
79 
80 	Current *current = (Current*)sw::Thread::allocateLocalStorage(currentTLS, sizeof(Current));
81 
82 	current->error = EGL_SUCCESS;
83 	current->API = EGL_OPENGL_ES_API;
84 	current->context = nullptr;
85 	current->drawSurface = nullptr;
86 	current->readSurface = nullptr;
87 
88 	return current;
89 }
90 
detachThread()91 void detachThread()
92 {
93 	TRACE("()");
94 
95 	eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_CONTEXT, EGL_NO_SURFACE, EGL_NO_SURFACE);
96 
97 	sw::Thread::freeLocalStorage(currentTLS);
98 }
99 
attachProcess()100 CONSTRUCTOR void attachProcess()
101 {
102 	TRACE("()");
103 
104 	#if !defined(ANGLE_DISABLE_TRACE) && defined(TRACE_OUTPUT_FILE)
105 		FILE *debug = fopen(TRACE_OUTPUT_FILE, "rt");
106 
107 		if(debug)
108 		{
109 			fclose(debug);
110 			debug = fopen(TRACE_OUTPUT_FILE, "wt");   // Erase
111 			fclose(debug);
112 		}
113 	#endif
114 
115 	attachThread();
116 }
117 
detachProcess()118 DESTRUCTOR void detachProcess()
119 {
120 	TRACE("()");
121 
122 	detachThread();
123 	sw::Thread::freeLocalStorageKey(currentTLS);
124 }
125 }
126 
127 #if defined(_WIN32)
128 #ifdef DEBUGGER_WAIT_DIALOG
DebuggerWaitDialogProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)129 static INT_PTR CALLBACK DebuggerWaitDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
130 {
131 	RECT rect;
132 
133 	switch(uMsg)
134 	{
135 	case WM_INITDIALOG:
136 		GetWindowRect(GetDesktopWindow(), &rect);
137 		SetWindowPos(hwnd, HWND_TOP, rect.right / 2, rect.bottom / 2, 0, 0, SWP_NOSIZE);
138 		SetTimer(hwnd, 1, 100, NULL);
139 		return TRUE;
140 	case WM_COMMAND:
141 		if(LOWORD(wParam) == IDCANCEL)
142 		{
143 			EndDialog(hwnd, 0);
144 		}
145 		break;
146 	case WM_TIMER:
147 		if(IsDebuggerPresent())
148 		{
149 			EndDialog(hwnd, 0);
150 		}
151 	}
152 
153 	return FALSE;
154 }
155 
WaitForDebugger(HINSTANCE instance)156 static void WaitForDebugger(HINSTANCE instance)
157 {
158 	if(!IsDebuggerPresent())
159 	{
160 		HRSRC dialog = FindResource(instance, MAKEINTRESOURCE(IDD_DIALOG1), RT_DIALOG);
161 		DLGTEMPLATE *dialogTemplate = (DLGTEMPLATE*)LoadResource(instance, dialog);
162 		DialogBoxIndirect(instance, dialogTemplate, NULL, DebuggerWaitDialogProc);
163 	}
164 }
165 #endif
166 
DllMain(HINSTANCE instance,DWORD reason,LPVOID reserved)167 extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
168 {
169 	switch(reason)
170 	{
171 	case DLL_PROCESS_ATTACH:
172 		#ifdef DEBUGGER_WAIT_DIALOG
173 		{
174 			char disable_debugger_wait_dialog[] = "0";
175 			GetEnvironmentVariable("SWIFTSHADER_DISABLE_DEBUGGER_WAIT_DIALOG", disable_debugger_wait_dialog, sizeof(disable_debugger_wait_dialog));
176 
177 			if(disable_debugger_wait_dialog[0] != '1')
178 			{
179 				WaitForDebugger(instance);
180 			}
181 		}
182 		#endif
183 		egl::attachProcess();
184 		break;
185 	case DLL_THREAD_ATTACH:
186 		egl::attachThread();
187 		break;
188 	case DLL_THREAD_DETACH:
189 		egl::detachThread();
190 		break;
191 	case DLL_PROCESS_DETACH:
192 		egl::detachProcess();
193 		break;
194 	default:
195 		break;
196 	}
197 
198 	return TRUE;
199 }
200 #endif
201 
202 namespace egl
203 {
getCurrent(void)204 static Current *getCurrent(void)
205 {
206 	Current *current = (Current*)sw::Thread::getLocalStorage(currentTLS);
207 
208 	if(!current)
209 	{
210 		current = attachThread();
211 	}
212 
213 	return current;
214 }
215 
setCurrentError(EGLint error)216 void setCurrentError(EGLint error)
217 {
218 	Current *current = getCurrent();
219 
220 	current->error = error;
221 }
222 
getCurrentError()223 EGLint getCurrentError()
224 {
225 	Current *current = getCurrent();
226 
227 	return current->error;
228 }
229 
setCurrentAPI(EGLenum API)230 void setCurrentAPI(EGLenum API)
231 {
232 	Current *current = getCurrent();
233 
234 	current->API = API;
235 }
236 
getCurrentAPI()237 EGLenum getCurrentAPI()
238 {
239 	Current *current = getCurrent();
240 
241 	return current->API;
242 }
243 
setCurrentContext(egl::Context * ctx)244 void setCurrentContext(egl::Context *ctx)
245 {
246 	Current *current = getCurrent();
247 
248 	if(ctx)
249 	{
250 		ctx->addRef();
251 	}
252 
253 	if(current->context)
254 	{
255 		current->context->release();
256 	}
257 
258 	current->context = ctx;
259 }
260 
getCurrentContext()261 NO_SANITIZE_FUNCTION egl::Context *getCurrentContext()
262 {
263 	Current *current = getCurrent();
264 
265 	return current->context;
266 }
267 
setCurrentDrawSurface(egl::Surface * surface)268 void setCurrentDrawSurface(egl::Surface *surface)
269 {
270 	Current *current = getCurrent();
271 
272 	if(surface)
273 	{
274 		surface->addRef();
275 	}
276 
277 	if(current->drawSurface)
278 	{
279 		current->drawSurface->release();
280 	}
281 
282 	current->drawSurface = surface;
283 }
284 
getCurrentDrawSurface()285 egl::Surface *getCurrentDrawSurface()
286 {
287 	Current *current = getCurrent();
288 
289 	return current->drawSurface;
290 }
291 
setCurrentReadSurface(egl::Surface * surface)292 void setCurrentReadSurface(egl::Surface *surface)
293 {
294 	Current *current = getCurrent();
295 
296 	if(surface)
297 	{
298 		surface->addRef();
299 	}
300 
301 	if(current->readSurface)
302 	{
303 		current->readSurface->release();
304 	}
305 
306 	current->readSurface = surface;
307 }
308 
getCurrentReadSurface()309 egl::Surface *getCurrentReadSurface()
310 {
311 	Current *current = getCurrent();
312 
313 	return current->readSurface;
314 }
315 
error(EGLint errorCode)316 void error(EGLint errorCode)
317 {
318 	egl::setCurrentError(errorCode);
319 
320 	if(errorCode != EGL_SUCCESS)
321 	{
322 		switch(errorCode)
323 		{
324 		case EGL_NOT_INITIALIZED:     TRACE("\t! Error generated: not initialized\n");     break;
325 		case EGL_BAD_ACCESS:          TRACE("\t! Error generated: bad access\n");          break;
326 		case EGL_BAD_ALLOC:           TRACE("\t! Error generated: bad alloc\n");           break;
327 		case EGL_BAD_ATTRIBUTE:       TRACE("\t! Error generated: bad attribute\n");       break;
328 		case EGL_BAD_CONFIG:          TRACE("\t! Error generated: bad config\n");          break;
329 		case EGL_BAD_CONTEXT:         TRACE("\t! Error generated: bad context\n");         break;
330 		case EGL_BAD_CURRENT_SURFACE: TRACE("\t! Error generated: bad current surface\n"); break;
331 		case EGL_BAD_DISPLAY:         TRACE("\t! Error generated: bad display\n");         break;
332 		case EGL_BAD_MATCH:           TRACE("\t! Error generated: bad match\n");           break;
333 		case EGL_BAD_NATIVE_PIXMAP:   TRACE("\t! Error generated: bad native pixmap\n");   break;
334 		case EGL_BAD_NATIVE_WINDOW:   TRACE("\t! Error generated: bad native window\n");   break;
335 		case EGL_BAD_PARAMETER:       TRACE("\t! Error generated: bad parameter\n");       break;
336 		case EGL_BAD_SURFACE:         TRACE("\t! Error generated: bad surface\n");         break;
337 		case EGL_CONTEXT_LOST:        TRACE("\t! Error generated: context lost\n");        break;
338 		default:                      TRACE("\t! Error generated: <0x%X>\n", errorCode);   break;
339 		}
340 	}
341 }
342 
343 }
344 
345 namespace egl
346 {
347 EGLint EGLAPIENTRY GetError(void);
348 EGLDisplay EGLAPIENTRY GetDisplay(EGLNativeDisplayType display_id);
349 EGLBoolean EGLAPIENTRY Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
350 EGLBoolean EGLAPIENTRY Terminate(EGLDisplay dpy);
351 const char *EGLAPIENTRY QueryString(EGLDisplay dpy, EGLint name);
352 EGLBoolean EGLAPIENTRY GetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
353 EGLBoolean EGLAPIENTRY ChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
354 EGLBoolean EGLAPIENTRY GetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
355 EGLSurface EGLAPIENTRY CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list);
356 EGLSurface EGLAPIENTRY CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
357 EGLSurface EGLAPIENTRY CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);
358 EGLBoolean EGLAPIENTRY DestroySurface(EGLDisplay dpy, EGLSurface surface);
359 EGLBoolean EGLAPIENTRY QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
360 EGLBoolean EGLAPIENTRY BindAPI(EGLenum api);
361 EGLenum EGLAPIENTRY QueryAPI(void);
362 EGLBoolean EGLAPIENTRY WaitClient(void);
363 EGLBoolean EGLAPIENTRY ReleaseThread(void);
364 EGLSurface EGLAPIENTRY CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);
365 EGLBoolean EGLAPIENTRY SurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
366 EGLBoolean EGLAPIENTRY BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
367 EGLBoolean EGLAPIENTRY ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
368 EGLBoolean EGLAPIENTRY SwapInterval(EGLDisplay dpy, EGLint interval);
369 EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
370 EGLBoolean EGLAPIENTRY DestroyContext(EGLDisplay dpy, EGLContext ctx);
371 EGLBoolean EGLAPIENTRY MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
372 EGLContext EGLAPIENTRY GetCurrentContext(void);
373 EGLSurface EGLAPIENTRY GetCurrentSurface(EGLint readdraw);
374 EGLDisplay EGLAPIENTRY GetCurrentDisplay(void);
375 EGLBoolean EGLAPIENTRY QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
376 EGLBoolean EGLAPIENTRY WaitGL(void);
377 EGLBoolean EGLAPIENTRY WaitNative(EGLint engine);
378 EGLBoolean EGLAPIENTRY SwapBuffers(EGLDisplay dpy, EGLSurface surface);
379 EGLBoolean EGLAPIENTRY CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
380 EGLImageKHR EGLAPIENTRY CreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
381 EGLImageKHR EGLAPIENTRY CreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list);
382 EGLBoolean EGLAPIENTRY DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image);
383 EGLDisplay EGLAPIENTRY GetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list);
384 EGLDisplay EGLAPIENTRY GetPlatformDisplay(EGLenum platform, void *native_display, const EGLAttrib *attrib_list);
385 EGLSurface EGLAPIENTRY CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);
386 EGLSurface EGLAPIENTRY CreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list);
387 EGLSurface EGLAPIENTRY CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);
388 EGLSurface EGLAPIENTRY CreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list);
389 EGLSyncKHR EGLAPIENTRY CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
390 EGLSyncKHR EGLAPIENTRY CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list);
391 EGLBoolean EGLAPIENTRY DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync);
392 EGLint EGLAPIENTRY ClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
393 EGLBoolean EGLAPIENTRY GetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
394 EGLBoolean EGLAPIENTRY GetSyncAttrib(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLAttrib *value);
395 __eglMustCastToProperFunctionPointerType EGLAPIENTRY GetProcAddress(const char *procname);
396 }
397 
398 extern "C"
399 {
eglGetError(void)400 EGLAPI EGLint EGLAPIENTRY eglGetError(void)
401 {
402 	return egl::GetError();
403 }
404 
eglGetDisplay(EGLNativeDisplayType display_id)405 EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id)
406 {
407 	return egl::GetDisplay(display_id);
408 }
409 
eglInitialize(EGLDisplay dpy,EGLint * major,EGLint * minor)410 EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
411 {
412 	return egl::Initialize(dpy, major, minor);
413 }
414 
eglTerminate(EGLDisplay dpy)415 EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy)
416 {
417 	return egl::Terminate(dpy);
418 }
419 
eglQueryString(EGLDisplay dpy,EGLint name)420 EGLAPI const char *EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name)
421 {
422 	return egl::QueryString(dpy, name);
423 }
424 
eglGetConfigs(EGLDisplay dpy,EGLConfig * configs,EGLint config_size,EGLint * num_config)425 EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config)
426 {
427 	return egl::GetConfigs(dpy, configs, config_size, num_config);
428 }
429 
eglChooseConfig(EGLDisplay dpy,const EGLint * attrib_list,EGLConfig * configs,EGLint config_size,EGLint * num_config)430 EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config)
431 {
432 	return egl::ChooseConfig(dpy, attrib_list, configs, config_size, num_config);
433 }
434 
eglGetConfigAttrib(EGLDisplay dpy,EGLConfig config,EGLint attribute,EGLint * value)435 EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value)
436 {
437 	return egl::GetConfigAttrib(dpy, config, attribute, value);
438 }
439 
eglCreateWindowSurface(EGLDisplay dpy,EGLConfig config,EGLNativeWindowType window,const EGLint * attrib_list)440 EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list)
441 {
442 	return egl::CreateWindowSurface(dpy, config, window, attrib_list);
443 }
444 
eglCreatePbufferSurface(EGLDisplay dpy,EGLConfig config,const EGLint * attrib_list)445 EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
446 {
447 	return egl::CreatePbufferSurface(dpy, config, attrib_list);
448 }
449 
eglCreatePixmapSurface(EGLDisplay dpy,EGLConfig config,EGLNativePixmapType pixmap,const EGLint * attrib_list)450 EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list)
451 {
452 	return egl::CreatePixmapSurface(dpy, config, pixmap, attrib_list);
453 }
454 
eglDestroySurface(EGLDisplay dpy,EGLSurface surface)455 EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
456 {
457 	return egl::DestroySurface(dpy, surface);
458 }
459 
eglQuerySurface(EGLDisplay dpy,EGLSurface surface,EGLint attribute,EGLint * value)460 EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value)
461 {
462 	return egl::QuerySurface(dpy, surface, attribute, value);
463 }
464 
eglBindAPI(EGLenum api)465 EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api)
466 {
467 	return egl::BindAPI(api);
468 }
469 
eglQueryAPI(void)470 EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void)
471 {
472 	return egl::QueryAPI();
473 }
474 
eglWaitClient(void)475 EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void)
476 {
477 	return egl::WaitClient();
478 }
479 
eglReleaseThread(void)480 EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void)
481 {
482 	return egl::ReleaseThread();
483 }
484 
eglCreatePbufferFromClientBuffer(EGLDisplay dpy,EGLenum buftype,EGLClientBuffer buffer,EGLConfig config,const EGLint * attrib_list)485 EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list)
486 {
487 	return egl::CreatePbufferFromClientBuffer(dpy, buftype, buffer, config, attrib_list);
488 }
489 
eglSurfaceAttrib(EGLDisplay dpy,EGLSurface surface,EGLint attribute,EGLint value)490 EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
491 {
492 	return egl::SurfaceAttrib(dpy, surface, attribute, value);
493 }
494 
eglBindTexImage(EGLDisplay dpy,EGLSurface surface,EGLint buffer)495 EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
496 {
497 	return egl::BindTexImage(dpy, surface, buffer);
498 }
499 
eglReleaseTexImage(EGLDisplay dpy,EGLSurface surface,EGLint buffer)500 EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
501 {
502 	return egl::ReleaseTexImage(dpy, surface, buffer);
503 }
504 
eglSwapInterval(EGLDisplay dpy,EGLint interval)505 EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval)
506 {
507 	return egl::SwapInterval(dpy, interval);
508 }
509 
eglCreateContext(EGLDisplay dpy,EGLConfig config,EGLContext share_context,const EGLint * attrib_list)510 EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list)
511 {
512 	return egl::CreateContext(dpy, config, share_context, attrib_list);
513 }
514 
eglDestroyContext(EGLDisplay dpy,EGLContext ctx)515 EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
516 {
517 	return egl::DestroyContext(dpy, ctx);
518 }
519 
eglMakeCurrent(EGLDisplay dpy,EGLSurface draw,EGLSurface read,EGLContext ctx)520 EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
521 {
522 	return egl::MakeCurrent(dpy, draw, read, ctx);
523 }
524 
eglGetCurrentContext(void)525 EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void)
526 {
527 	return egl::GetCurrentContext();
528 }
529 
eglGetCurrentSurface(EGLint readdraw)530 EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw)
531 {
532 	return egl::GetCurrentSurface(readdraw);
533 }
534 
eglGetCurrentDisplay(void)535 EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void)
536 {
537 	return egl::GetCurrentDisplay();
538 }
539 
eglQueryContext(EGLDisplay dpy,EGLContext ctx,EGLint attribute,EGLint * value)540 EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
541 {
542 	return egl::QueryContext(dpy, ctx, attribute, value);
543 }
544 
eglWaitGL(void)545 EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void)
546 {
547 	return egl::WaitClient();
548 }
549 
eglWaitNative(EGLint engine)550 EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine)
551 {
552 	return egl::WaitNative(engine);
553 }
554 
eglSwapBuffers(EGLDisplay dpy,EGLSurface surface)555 EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
556 {
557 	return egl::SwapBuffers(dpy, surface);
558 }
559 
eglCopyBuffers(EGLDisplay dpy,EGLSurface surface,EGLNativePixmapType target)560 EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
561 {
562 	return egl::CopyBuffers(dpy, surface, target);
563 }
564 
eglCreateImageKHR(EGLDisplay dpy,EGLContext ctx,EGLenum target,EGLClientBuffer buffer,const EGLint * attrib_list)565 EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
566 {
567 	return egl::CreateImageKHR(dpy, ctx, target, buffer, attrib_list);
568 }
569 
eglCreateImage(EGLDisplay dpy,EGLContext ctx,EGLenum target,EGLClientBuffer buffer,const EGLAttrib * attrib_list)570 EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list)
571 {
572 	return egl::CreateImage(dpy, ctx, target, buffer, attrib_list);
573 }
574 
eglDestroyImageKHR(EGLDisplay dpy,EGLImageKHR image)575 EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
576 {
577 	return egl::DestroyImageKHR(dpy, image);
578 }
579 
eglDestroyImage(EGLDisplay dpy,EGLImageKHR image)580 EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImage(EGLDisplay dpy, EGLImageKHR image)
581 {
582 	return egl::DestroyImageKHR(dpy, image);
583 }
584 
eglGetPlatformDisplayEXT(EGLenum platform,void * native_display,const EGLint * attrib_list)585 EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list)
586 {
587 	return egl::GetPlatformDisplayEXT(platform, native_display, attrib_list);
588 }
589 
eglGetPlatformDisplay(EGLenum platform,void * native_display,const EGLAttrib * attrib_list)590 EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplay(EGLenum platform, void *native_display, const EGLAttrib *attrib_list)
591 {
592 	return egl::GetPlatformDisplay(platform, native_display, attrib_list);
593 }
594 
eglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy,EGLConfig config,void * native_window,const EGLint * attrib_list)595 EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list)
596 {
597 	return egl::CreatePlatformWindowSurfaceEXT(dpy, config, native_window, attrib_list);
598 }
599 
eglCreatePlatformWindowSurface(EGLDisplay dpy,EGLConfig config,void * native_window,const EGLAttrib * attrib_list)600 EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list)
601 {
602 	return egl::CreatePlatformWindowSurface(dpy, config, native_window, attrib_list);
603 }
604 
eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy,EGLConfig config,void * native_pixmap,const EGLint * attrib_list)605 EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list)
606 {
607 	return egl::CreatePlatformPixmapSurfaceEXT(dpy, config, native_pixmap, attrib_list);
608 }
609 
eglCreatePlatformPixmapSurface(EGLDisplay dpy,EGLConfig config,void * native_pixmap,const EGLAttrib * attrib_list)610 EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list)
611 {
612 	return egl::CreatePlatformPixmapSurface(dpy, config, native_pixmap, attrib_list);
613 }
614 
eglCreateSyncKHR(EGLDisplay dpy,EGLenum type,const EGLint * attrib_list)615 EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
616 {
617 	return egl::CreateSyncKHR(dpy, type, attrib_list);
618 }
619 
eglCreateSync(EGLDisplay dpy,EGLenum type,const EGLAttrib * attrib_list)620 EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
621 {
622 	return egl::CreateSync(dpy, type, attrib_list);
623 }
624 
eglDestroySyncKHR(EGLDisplay dpy,EGLSyncKHR sync)625 EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
626 {
627 	return egl::DestroySyncKHR(dpy, sync);
628 }
629 
eglDestroySync(EGLDisplay dpy,EGLSyncKHR sync)630 EGLAPI EGLBoolean EGLAPIENTRY eglDestroySync(EGLDisplay dpy, EGLSyncKHR sync)
631 {
632 	return egl::DestroySyncKHR(dpy, sync);
633 }
634 
eglClientWaitSyncKHR(EGLDisplay dpy,EGLSyncKHR sync,EGLint flags,EGLTimeKHR timeout)635 EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
636 {
637 	return egl::ClientWaitSyncKHR(dpy, sync, flags, timeout);
638 }
639 
eglClientWaitSync(EGLDisplay dpy,EGLSyncKHR sync,EGLint flags,EGLTimeKHR timeout)640 EGLAPI EGLint EGLAPIENTRY eglClientWaitSync(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
641 {
642 	return egl::ClientWaitSyncKHR(dpy, sync, flags, timeout);
643 }
644 
eglGetSyncAttribKHR(EGLDisplay dpy,EGLSyncKHR sync,EGLint attribute,EGLint * value)645 EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
646 {
647 	return egl::GetSyncAttribKHR(dpy, sync, attribute, value);
648 }
649 
eglGetSyncAttrib(EGLDisplay dpy,EGLSyncKHR sync,EGLint attribute,EGLAttrib * value)650 EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttrib(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLAttrib *value)
651 {
652 	return egl::GetSyncAttrib(dpy, sync, attribute, value);
653 }
654 
eglWaitSyncKHR(EGLDisplay dpy,EGLSyncKHR sync,EGLint flags)655 EGLAPI EGLint EGLAPIENTRY eglWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags)
656 {
657 	return egl::ClientWaitSyncKHR(dpy, sync, flags, EGL_FOREVER_KHR);
658 }
659 
eglWaitSync(EGLDisplay dpy,EGLSync sync,EGLint flags)660 EGLAPI EGLBoolean EGLAPIENTRY eglWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags)
661 {
662 	return egl::ClientWaitSyncKHR(dpy, sync, flags, EGL_FOREVER_KHR);
663 }
664 
eglGetProcAddress(const char * procname)665 EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
666 {
667 	return egl::GetProcAddress(procname);
668 }
669 }
670 
LibEGLexports()671 LibEGLexports::LibEGLexports()
672 {
673 	this->eglGetError = egl::GetError;
674 	this->eglGetDisplay = egl::GetDisplay;
675 	this->eglInitialize = egl::Initialize;
676 	this->eglTerminate = egl::Terminate;
677 	this->eglQueryString = egl::QueryString;
678 	this->eglGetConfigs = egl::GetConfigs;
679 	this->eglChooseConfig = egl::ChooseConfig;
680 	this->eglGetConfigAttrib = egl::GetConfigAttrib;
681 	this->eglCreateWindowSurface = egl::CreateWindowSurface;
682 	this->eglCreatePbufferSurface = egl::CreatePbufferSurface;
683 	this->eglCreatePixmapSurface = egl::CreatePixmapSurface;
684 	this->eglDestroySurface = egl::DestroySurface;
685 	this->eglQuerySurface = egl::QuerySurface;
686 	this->eglBindAPI = egl::BindAPI;
687 	this->eglQueryAPI = egl::QueryAPI;
688 	this->eglWaitClient = egl::WaitClient;
689 	this->eglReleaseThread = egl::ReleaseThread;
690 	this->eglCreatePbufferFromClientBuffer = egl::CreatePbufferFromClientBuffer;
691 	this->eglSurfaceAttrib = egl::SurfaceAttrib;
692 	this->eglBindTexImage = egl::BindTexImage;
693 	this->eglReleaseTexImage = egl::ReleaseTexImage;
694 	this->eglSwapInterval = egl::SwapInterval;
695 	this->eglCreateContext = egl::CreateContext;
696 	this->eglDestroyContext = egl::DestroyContext;
697 	this->eglMakeCurrent = egl::MakeCurrent;
698 	this->eglGetCurrentContext = egl::GetCurrentContext;
699 	this->eglGetCurrentSurface = egl::GetCurrentSurface;
700 	this->eglGetCurrentDisplay = egl::GetCurrentDisplay;
701 	this->eglQueryContext = egl::QueryContext;
702 	this->eglWaitGL = egl::WaitGL;
703 	this->eglWaitNative = egl::WaitNative;
704 	this->eglSwapBuffers = egl::SwapBuffers;
705 	this->eglCopyBuffers = egl::CopyBuffers;
706 	this->eglCreateImageKHR = egl::CreateImageKHR;
707 	this->eglDestroyImageKHR = egl::DestroyImageKHR;
708 	this->eglGetProcAddress = egl::GetProcAddress;
709 	this->eglCreateSyncKHR = egl::CreateSyncKHR;
710 	this->eglDestroySyncKHR = egl::DestroySyncKHR;
711 	this->eglClientWaitSyncKHR = egl::ClientWaitSyncKHR;
712 	this->eglGetSyncAttribKHR = egl::GetSyncAttribKHR;
713 
714 	this->clientGetCurrentContext = egl::getCurrentContext;
715 }
716 
libEGL_swiftshader()717 extern "C" EGLAPI LibEGLexports *libEGL_swiftshader()
718 {
719 	static LibEGLexports libEGL;
720 	return &libEGL;
721 }
722 
723 LibGLES_CM libGLES_CM;
724 LibGLESv2 libGLESv2;
725