1 // SwiftShader Software Renderer
\r
3 // Copyright(c) 2005-2013 TransGaming Inc.
\r
5 // All rights reserved. No part of this software may be copied, distributed, transmitted,
\r
6 // transcribed, stored in a retrieval system, translated into any human or computer
\r
7 // language by any means, or disclosed to third parties without the explicit written
\r
8 // agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
\r
9 // or implied, including but not limited to any patent rights, are granted to you.
\r
12 // main.cpp: DLL entry point and management of thread-local data.
\r
16 #include "libEGL.hpp"
\r
17 #include "Context.hpp"
\r
18 #include "Surface.h"
\r
20 #include "resource.h"
\r
21 #include "Common/Thread.hpp"
\r
22 #include "Common/SharedLibrary.hpp"
\r
23 #include "common/debug.h"
\r
25 #include <EGL/eglext.h>
\r
27 static sw::Thread::LocalStorageKey currentTLS = TLS_OUT_OF_INDEXES;
\r
29 #if !defined(_MSC_VER)
\r
30 #define CONSTRUCTOR __attribute__((constructor))
\r
31 #define DESTRUCTOR __attribute__((destructor))
\r
37 static void eglAttachThread()
\r
41 egl::Current *current = new egl::Current;
\r
45 sw::Thread::setLocalStorage(currentTLS, current);
\r
47 current->error = EGL_SUCCESS;
\r
48 current->API = EGL_OPENGL_ES_API;
\r
49 current->display = nullptr;
\r
50 current->context = nullptr;
\r
51 current->drawSurface = nullptr;
\r
52 current->readSurface = nullptr;
\r
56 static void eglDetachThread()
\r
60 egl::Current *current = (egl::Current*)sw::Thread::getLocalStorage(currentTLS);
\r
68 CONSTRUCTOR static void eglAttachProcess()
\r
72 #if !defined(ANGLE_DISABLE_TRACE) && defined(TRACE_OUTPUT_FILE)
\r
73 FILE *debug = fopen(TRACE_OUTPUT_FILE, "rt");
\r
78 debug = fopen(TRACE_OUTPUT_FILE, "wt"); // Erase
\r
83 currentTLS = sw::Thread::allocateLocalStorageKey();
\r
85 if(currentTLS == TLS_OUT_OF_INDEXES)
\r
93 DESTRUCTOR static void eglDetachProcess()
\r
98 sw::Thread::freeLocalStorageKey(currentTLS);
\r
101 #if defined(_WIN32)
\r
102 static INT_PTR CALLBACK DebuggerWaitDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
\r
108 case WM_INITDIALOG:
\r
109 GetWindowRect(GetDesktopWindow(), &rect);
\r
110 SetWindowPos(hwnd, HWND_TOP, rect.right / 2, rect.bottom / 2, 0, 0, SWP_NOSIZE);
\r
111 SetTimer(hwnd, 1, 100, NULL);
\r
114 if(LOWORD(wParam) == IDCANCEL)
\r
116 EndDialog(hwnd, 0);
\r
120 if(IsDebuggerPresent())
\r
122 EndDialog(hwnd, 0);
\r
129 static void WaitForDebugger(HINSTANCE instance)
\r
131 if(!IsDebuggerPresent())
\r
133 HRSRC dialog = FindResource(instance, MAKEINTRESOURCE(IDD_DIALOG1), RT_DIALOG);
\r
134 DLGTEMPLATE *dialogTemplate = (DLGTEMPLATE*)LoadResource(instance, dialog);
\r
135 DialogBoxIndirect(instance, dialogTemplate, NULL, DebuggerWaitDialogProc);
\r
139 extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
\r
143 case DLL_PROCESS_ATTACH:
\r
145 WaitForDebugger(instance);
\r
147 eglAttachProcess();
\r
149 case DLL_THREAD_ATTACH:
\r
152 case DLL_THREAD_DETACH:
\r
155 case DLL_PROCESS_DETACH:
\r
156 eglDetachProcess();
\r
168 static Current *eglGetCurrent(void)
\r
170 Current *current = (Current*)sw::Thread::getLocalStorage(currentTLS);
\r
177 return (Current*)sw::Thread::getLocalStorage(currentTLS);
\r
180 void setCurrentError(EGLint error)
\r
182 Current *current = eglGetCurrent();
\r
184 current->error = error;
\r
187 EGLint getCurrentError()
\r
189 Current *current = eglGetCurrent();
\r
191 return current->error;
\r
194 void setCurrentAPI(EGLenum API)
\r
196 Current *current = eglGetCurrent();
\r
198 current->API = API;
\r
201 EGLenum getCurrentAPI()
\r
203 Current *current = eglGetCurrent();
\r
205 return current->API;
\r
208 void setCurrentDisplay(egl::Display *dpy)
\r
210 Current *current = eglGetCurrent();
\r
212 current->display = dpy;
\r
215 egl::Display *getCurrentDisplay()
\r
217 Current *current = eglGetCurrent();
\r
219 return current->display;
\r
222 void setCurrentContext(egl::Context *ctx)
\r
224 Current *current = eglGetCurrent();
\r
231 if(current->context)
\r
233 current->context->release();
\r
236 current->context = ctx;
\r
239 egl::Context *getCurrentContext()
\r
241 Current *current = eglGetCurrent();
\r
243 return current->context;
\r
246 void setCurrentDrawSurface(egl::Surface *surface)
\r
248 Current *current = eglGetCurrent();
\r
255 if(current->drawSurface)
\r
257 current->drawSurface->release();
\r
260 current->drawSurface = surface;
\r
263 egl::Surface *getCurrentDrawSurface()
\r
265 Current *current = eglGetCurrent();
\r
267 return current->drawSurface;
\r
270 void setCurrentReadSurface(egl::Surface *surface)
\r
272 Current *current = eglGetCurrent();
\r
279 if(current->readSurface)
\r
281 current->readSurface->release();
\r
284 current->readSurface = surface;
\r
287 egl::Surface *getCurrentReadSurface()
\r
289 Current *current = eglGetCurrent();
\r
291 return current->readSurface;
\r
294 void error(EGLint errorCode)
\r
296 egl::setCurrentError(errorCode);
\r
298 if(errorCode != EGL_SUCCESS)
\r
302 case EGL_NOT_INITIALIZED: TRACE("\t! Error generated: not initialized\n"); break;
\r
303 case EGL_BAD_ACCESS: TRACE("\t! Error generated: bad access\n"); break;
\r
304 case EGL_BAD_ALLOC: TRACE("\t! Error generated: bad alloc\n"); break;
\r
305 case EGL_BAD_ATTRIBUTE: TRACE("\t! Error generated: bad attribute\n"); break;
\r
306 case EGL_BAD_CONFIG: TRACE("\t! Error generated: bad config\n"); break;
\r
307 case EGL_BAD_CONTEXT: TRACE("\t! Error generated: bad context\n"); break;
\r
308 case EGL_BAD_CURRENT_SURFACE: TRACE("\t! Error generated: bad current surface\n"); break;
\r
309 case EGL_BAD_DISPLAY: TRACE("\t! Error generated: bad display\n"); break;
\r
310 case EGL_BAD_MATCH: TRACE("\t! Error generated: bad match\n"); break;
\r
311 case EGL_BAD_NATIVE_PIXMAP: TRACE("\t! Error generated: bad native pixmap\n"); break;
\r
312 case EGL_BAD_NATIVE_WINDOW: TRACE("\t! Error generated: bad native window\n"); break;
\r
313 case EGL_BAD_PARAMETER: TRACE("\t! Error generated: bad parameter\n"); break;
\r
314 case EGL_BAD_SURFACE: TRACE("\t! Error generated: bad surface\n"); break;
\r
315 case EGL_CONTEXT_LOST: TRACE("\t! Error generated: context lost\n"); break;
\r
316 default: TRACE("\t! Error generated: <0x%X>\n", errorCode); break;
\r
324 EGLint GetError(void);
\r
325 EGLDisplay GetDisplay(EGLNativeDisplayType display_id);
\r
326 EGLBoolean Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
\r
327 EGLBoolean Terminate(EGLDisplay dpy);
\r
328 const char *QueryString(EGLDisplay dpy, EGLint name);
\r
329 EGLBoolean GetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
\r
330 EGLBoolean ChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
\r
331 EGLBoolean GetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
\r
332 EGLSurface CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list);
\r
333 EGLSurface CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
\r
334 EGLSurface CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);
\r
335 EGLBoolean DestroySurface(EGLDisplay dpy, EGLSurface surface);
\r
336 EGLBoolean QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
\r
337 EGLBoolean BindAPI(EGLenum api);
\r
338 EGLenum QueryAPI(void);
\r
339 EGLBoolean WaitClient(void);
\r
340 EGLBoolean ReleaseThread(void);
\r
341 EGLSurface CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);
\r
342 EGLBoolean SurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
\r
343 EGLBoolean BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
\r
344 EGLBoolean ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
\r
345 EGLBoolean SwapInterval(EGLDisplay dpy, EGLint interval);
\r
346 EGLContext CreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
\r
347 EGLBoolean DestroyContext(EGLDisplay dpy, EGLContext ctx);
\r
348 EGLBoolean MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
\r
349 EGLContext GetCurrentContext(void);
\r
350 EGLSurface GetCurrentSurface(EGLint readdraw);
\r
351 EGLDisplay GetCurrentDisplay(void);
\r
352 EGLBoolean QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
\r
353 EGLBoolean WaitGL(void);
\r
354 EGLBoolean WaitNative(EGLint engine);
\r
355 EGLBoolean SwapBuffers(EGLDisplay dpy, EGLSurface surface);
\r
356 EGLBoolean CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
\r
357 EGLImageKHR CreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
\r
358 EGLBoolean DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image);
\r
359 EGLDisplay GetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list);
\r
360 EGLSurface CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);
\r
361 EGLSurface CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);
\r
362 EGLSyncKHR CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
\r
363 EGLBoolean DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync);
\r
364 EGLint ClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
\r
365 EGLBoolean GetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
\r
366 __eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname);
\r
371 EGLAPI EGLint EGLAPIENTRY eglGetError(void)
\r
373 return egl::GetError();
\r
376 EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id)
\r
378 return egl::GetDisplay(display_id);
\r
381 EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
\r
383 return egl::Initialize(dpy, major, minor);
\r
386 EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy)
\r
388 return egl::Terminate(dpy);
\r
391 EGLAPI const char *EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name)
\r
393 return egl::QueryString(dpy, name);
\r
396 EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config)
\r
398 return egl::GetConfigs(dpy, configs, config_size, num_config);
\r
401 EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config)
\r
403 return egl::ChooseConfig(dpy, attrib_list, configs, config_size, num_config);
\r
406 EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value)
\r
408 return egl::GetConfigAttrib(dpy, config, attribute, value);
\r
411 EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list)
\r
413 return egl::CreateWindowSurface(dpy, config, window, attrib_list);
\r
416 EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
\r
418 return egl::CreatePbufferSurface(dpy, config, attrib_list);
\r
421 EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list)
\r
423 return egl::CreatePixmapSurface(dpy, config, pixmap, attrib_list);
\r
426 EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
\r
428 return egl::DestroySurface(dpy, surface);
\r
431 EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value)
\r
433 return egl::QuerySurface(dpy, surface, attribute, value);
\r
436 EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api)
\r
438 return egl::BindAPI(api);
\r
441 EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void)
\r
443 return egl::QueryAPI();
\r
446 EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void)
\r
448 return egl::WaitClient();
\r
451 EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void)
\r
453 return egl::ReleaseThread();
\r
456 EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list)
\r
458 return egl::CreatePbufferFromClientBuffer(dpy, buftype, buffer, config, attrib_list);
\r
461 EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
\r
463 return egl::SurfaceAttrib(dpy, surface, attribute, value);
\r
466 EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
\r
468 return egl::BindTexImage(dpy, surface, buffer);
\r
471 EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
\r
473 return egl::ReleaseTexImage(dpy, surface, buffer);
\r
476 EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval)
\r
478 return egl::SwapInterval(dpy, interval);
\r
481 EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list)
\r
483 return egl::CreateContext(dpy, config, share_context, attrib_list);
\r
486 EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
\r
488 return egl::DestroyContext(dpy, ctx);
\r
491 EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
\r
493 return egl::MakeCurrent(dpy, draw, read, ctx);
\r
496 EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void)
\r
498 return egl::GetCurrentContext();
\r
501 EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw)
\r
503 return egl::GetCurrentSurface(readdraw);
\r
506 EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void)
\r
508 return egl::GetCurrentDisplay();
\r
511 EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
\r
513 return egl::QueryContext(dpy, ctx, attribute, value);
\r
516 EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void)
\r
518 return egl::WaitClient();
\r
521 EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine)
\r
523 return egl::WaitNative(engine);
\r
526 EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
\r
528 return egl::SwapBuffers(dpy, surface);
\r
531 EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
\r
533 return egl::CopyBuffers(dpy, surface, target);
\r
536 EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
\r
538 return egl::CreateImageKHR(dpy, ctx, target, buffer, attrib_list);
\r
541 EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
\r
543 return egl::DestroyImageKHR(dpy, image);
\r
546 EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list)
\r
548 return egl::GetPlatformDisplayEXT(platform, native_display, attrib_list);
\r
551 EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list)
\r
553 return egl::CreatePlatformWindowSurfaceEXT(dpy, config, native_window, attrib_list);
\r
556 EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list)
\r
558 return egl::CreatePlatformPixmapSurfaceEXT(dpy, config, native_pixmap, attrib_list);
\r
561 EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
\r
563 return egl::CreateSyncKHR(dpy, type, attrib_list);
\r
566 EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
\r
568 return egl::DestroySyncKHR(dpy, sync);
\r
571 EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
\r
573 return egl::ClientWaitSyncKHR(dpy, sync, flags, timeout);
\r
576 EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
\r
578 return egl::GetSyncAttribKHR(dpy, sync, attribute, value);
\r
581 EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
\r
583 return egl::GetProcAddress(procname);
\r
587 LibEGLexports::LibEGLexports()
\r
589 this->eglGetError = egl::GetError;
\r
590 this->eglGetDisplay = egl::GetDisplay;
\r
591 this->eglInitialize = egl::Initialize;
\r
592 this->eglTerminate = egl::Terminate;
\r
593 this->eglQueryString = egl::QueryString;
\r
594 this->eglGetConfigs = egl::GetConfigs;
\r
595 this->eglChooseConfig = egl::ChooseConfig;
\r
596 this->eglGetConfigAttrib = egl::GetConfigAttrib;
\r
597 this->eglCreateWindowSurface = egl::CreateWindowSurface;
\r
598 this->eglCreatePbufferSurface = egl::CreatePbufferSurface;
\r
599 this->eglCreatePixmapSurface = egl::CreatePixmapSurface;
\r
600 this->eglDestroySurface = egl::DestroySurface;
\r
601 this->eglQuerySurface = egl::QuerySurface;
\r
602 this->eglBindAPI = egl::BindAPI;
\r
603 this->eglQueryAPI = egl::QueryAPI;
\r
604 this->eglWaitClient = egl::WaitClient;
\r
605 this->eglReleaseThread = egl::ReleaseThread;
\r
606 this->eglCreatePbufferFromClientBuffer = egl::CreatePbufferFromClientBuffer;
\r
607 this->eglSurfaceAttrib = egl::SurfaceAttrib;
\r
608 this->eglBindTexImage = egl::BindTexImage;
\r
609 this->eglReleaseTexImage = egl::ReleaseTexImage;
\r
610 this->eglSwapInterval = egl::SwapInterval;
\r
611 this->eglCreateContext = egl::CreateContext;
\r
612 this->eglDestroyContext = egl::DestroyContext;
\r
613 this->eglMakeCurrent = egl::MakeCurrent;
\r
614 this->eglGetCurrentContext = egl::GetCurrentContext;
\r
615 this->eglGetCurrentSurface = egl::GetCurrentSurface;
\r
616 this->eglGetCurrentDisplay = egl::GetCurrentDisplay;
\r
617 this->eglQueryContext = egl::QueryContext;
\r
618 this->eglWaitGL = egl::WaitGL;
\r
619 this->eglWaitNative = egl::WaitNative;
\r
620 this->eglSwapBuffers = egl::SwapBuffers;
\r
621 this->eglCopyBuffers = egl::CopyBuffers;
\r
622 this->eglCreateImageKHR = egl::CreateImageKHR;
\r
623 this->eglDestroyImageKHR = egl::DestroyImageKHR;
\r
624 this->eglGetProcAddress = egl::GetProcAddress;
\r
625 this->eglCreateSyncKHR = egl::CreateSyncKHR;
\r
626 this->eglDestroySyncKHR = egl::DestroySyncKHR;
\r
627 this->eglClientWaitSyncKHR = egl::ClientWaitSyncKHR;
\r
628 this->eglGetSyncAttribKHR = egl::GetSyncAttribKHR;
\r
630 this->clientGetCurrentContext = egl::getCurrentContext;
\r
631 this->clientGetCurrentDisplay = egl::getCurrentDisplay;
\r
634 extern "C" EGLAPI LibEGLexports *libEGL_swiftshader()
\r
636 static LibEGLexports libEGL;
\r
640 LibGLES_CM libGLES_CM;
\r
641 LibGLESv2 libGLESv2;
\r