blob: 386c3eae11e0933c5d7938067539daef8a54767b [file] [log] [blame]
Nicolas Capens0bac2852016-05-07 06:09:58 -04001// 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"
Nicolas Capens31c07a32017-06-13 23:44:13 -040021#include "Surface.hpp"
Nicolas Capens0bac2852016-05-07 06:09:58 -040022
23#include "resource.h"
24#include "Common/Thread.hpp"
25#include "Common/SharedLibrary.hpp"
26#include "common/debug.h"
27
28#include <EGL/eglext.h>
29
30static sw::Thread::LocalStorageKey currentTLS = TLS_OUT_OF_INDEXES;
31
32#if !defined(_MSC_VER)
33#define CONSTRUCTOR __attribute__((constructor))
34#define DESTRUCTOR __attribute__((destructor))
35#else
36#define CONSTRUCTOR
37#define DESTRUCTOR
38#endif
39
Nicolas Capensaf93a422016-06-12 16:11:25 -040040namespace egl
41{
David Rim10bcdb42018-04-06 17:48:41 +090042void releaseCurrent(void *storage)
43{
44 // This pthread destructor is called after the TLS is already reset to NULL,
45 // so we can't call EGL functions here to do the cleanup.
46
47 Current *current = (Current*)storage;
48
49 if(current)
50 {
51 if(current->drawSurface)
52 {
53 current->drawSurface->release();
54 }
55
56 if(current->readSurface)
57 {
58 current->readSurface->release();
59 }
60
61 if(current->context)
62 {
63 current->context->release();
64 }
65
66 free(current);
67 }
68}
69
Nicolas Capens420b64d2017-07-07 17:01:16 -040070Current *attachThread()
Nicolas Capens0bac2852016-05-07 06:09:58 -040071{
72 TRACE("()");
73
Nicolas Capens420b64d2017-07-07 17:01:16 -040074 if(currentTLS == TLS_OUT_OF_INDEXES)
Nicolas Capens0bac2852016-05-07 06:09:58 -040075 {
David Rim10bcdb42018-04-06 17:48:41 +090076 currentTLS = sw::Thread::allocateLocalStorageKey(releaseCurrent);
Nicolas Capens0bac2852016-05-07 06:09:58 -040077 }
Nicolas Capens420b64d2017-07-07 17:01:16 -040078
Nicolas Capens4ad365b2017-09-12 16:39:42 -040079 Current *current = (Current*)sw::Thread::allocateLocalStorage(currentTLS, sizeof(Current));
Nicolas Capens420b64d2017-07-07 17:01:16 -040080
81 current->error = EGL_SUCCESS;
82 current->API = EGL_OPENGL_ES_API;
83 current->context = nullptr;
84 current->drawSurface = nullptr;
85 current->readSurface = nullptr;
86
87 return current;
Nicolas Capens0bac2852016-05-07 06:09:58 -040088}
89
Nicolas Capensaf93a422016-06-12 16:11:25 -040090void detachThread()
Nicolas Capens0bac2852016-05-07 06:09:58 -040091{
92 TRACE("()");
93
Nicolas Capenscc5c7d92016-06-13 14:35:11 -040094 eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_CONTEXT, EGL_NO_SURFACE, EGL_NO_SURFACE);
95
Nicolas Capens4ad365b2017-09-12 16:39:42 -040096 sw::Thread::freeLocalStorage(currentTLS);
Nicolas Capens0bac2852016-05-07 06:09:58 -040097}
98
Nicolas Capensaf93a422016-06-12 16:11:25 -040099CONSTRUCTOR void attachProcess()
Nicolas Capens0bac2852016-05-07 06:09:58 -0400100{
101 TRACE("()");
102
103 #if !defined(ANGLE_DISABLE_TRACE) && defined(TRACE_OUTPUT_FILE)
104 FILE *debug = fopen(TRACE_OUTPUT_FILE, "rt");
105
106 if(debug)
107 {
108 fclose(debug);
109 debug = fopen(TRACE_OUTPUT_FILE, "wt"); // Erase
110 fclose(debug);
111 }
112 #endif
113
Nicolas Capensaf93a422016-06-12 16:11:25 -0400114 attachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400115}
116
Nicolas Capensaf93a422016-06-12 16:11:25 -0400117DESTRUCTOR void detachProcess()
Nicolas Capens0bac2852016-05-07 06:09:58 -0400118{
119 TRACE("()");
120
Nicolas Capensaf93a422016-06-12 16:11:25 -0400121 detachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400122 sw::Thread::freeLocalStorageKey(currentTLS);
123}
Nicolas Capensaf93a422016-06-12 16:11:25 -0400124}
Nicolas Capens0bac2852016-05-07 06:09:58 -0400125
126#if defined(_WIN32)
Alexis Hetu8e942eb2017-03-16 10:53:01 -0400127#ifdef DEBUGGER_WAIT_DIALOG
Nicolas Capens0bac2852016-05-07 06:09:58 -0400128static INT_PTR CALLBACK DebuggerWaitDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
129{
130 RECT rect;
131
132 switch(uMsg)
133 {
134 case WM_INITDIALOG:
135 GetWindowRect(GetDesktopWindow(), &rect);
136 SetWindowPos(hwnd, HWND_TOP, rect.right / 2, rect.bottom / 2, 0, 0, SWP_NOSIZE);
137 SetTimer(hwnd, 1, 100, NULL);
138 return TRUE;
139 case WM_COMMAND:
140 if(LOWORD(wParam) == IDCANCEL)
141 {
142 EndDialog(hwnd, 0);
143 }
144 break;
145 case WM_TIMER:
146 if(IsDebuggerPresent())
147 {
148 EndDialog(hwnd, 0);
149 }
150 }
151
152 return FALSE;
153}
154
155static void WaitForDebugger(HINSTANCE instance)
156{
157 if(!IsDebuggerPresent())
158 {
159 HRSRC dialog = FindResource(instance, MAKEINTRESOURCE(IDD_DIALOG1), RT_DIALOG);
160 DLGTEMPLATE *dialogTemplate = (DLGTEMPLATE*)LoadResource(instance, dialog);
161 DialogBoxIndirect(instance, dialogTemplate, NULL, DebuggerWaitDialogProc);
162 }
163}
Alexis Hetue97a31e2016-11-14 14:10:47 -0500164#endif
Nicolas Capens0bac2852016-05-07 06:09:58 -0400165
166extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
167{
168 switch(reason)
169 {
170 case DLL_PROCESS_ATTACH:
Alexis Hetu38182312017-03-16 11:46:16 -0400171 #ifdef DEBUGGER_WAIT_DIALOG
Nicolas Capens0bac2852016-05-07 06:09:58 -0400172 WaitForDebugger(instance);
173 #endif
Nicolas Capensaf93a422016-06-12 16:11:25 -0400174 egl::attachProcess();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400175 break;
176 case DLL_THREAD_ATTACH:
Nicolas Capensaf93a422016-06-12 16:11:25 -0400177 egl::attachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400178 break;
179 case DLL_THREAD_DETACH:
Nicolas Capensaf93a422016-06-12 16:11:25 -0400180 egl::detachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400181 break;
182 case DLL_PROCESS_DETACH:
Nicolas Capensaf93a422016-06-12 16:11:25 -0400183 egl::detachProcess();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400184 break;
185 default:
186 break;
187 }
188
189 return TRUE;
190}
191#endif
192
193namespace egl
194{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400195static Current *getCurrent(void)
Nicolas Capens0bac2852016-05-07 06:09:58 -0400196{
197 Current *current = (Current*)sw::Thread::getLocalStorage(currentTLS);
198
199 if(!current)
200 {
Nicolas Capens420b64d2017-07-07 17:01:16 -0400201 current = attachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400202 }
203
Nicolas Capens420b64d2017-07-07 17:01:16 -0400204 return current;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400205}
206
207void setCurrentError(EGLint error)
208{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400209 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400210
211 current->error = error;
212}
213
214EGLint getCurrentError()
215{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400216 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400217
218 return current->error;
219}
220
221void setCurrentAPI(EGLenum API)
222{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400223 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400224
225 current->API = API;
226}
227
228EGLenum getCurrentAPI()
229{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400230 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400231
232 return current->API;
233}
234
Nicolas Capens0bac2852016-05-07 06:09:58 -0400235void setCurrentContext(egl::Context *ctx)
236{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400237 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400238
239 if(ctx)
240 {
241 ctx->addRef();
242 }
243
244 if(current->context)
245 {
246 current->context->release();
247 }
248
249 current->context = ctx;
250}
251
Nicolas Capens506cc5e2017-07-24 11:30:55 -0400252NO_SANITIZE_FUNCTION egl::Context *getCurrentContext()
Nicolas Capens0bac2852016-05-07 06:09:58 -0400253{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400254 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400255
256 return current->context;
257}
258
259void setCurrentDrawSurface(egl::Surface *surface)
260{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400261 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400262
263 if(surface)
264 {
265 surface->addRef();
266 }
267
268 if(current->drawSurface)
269 {
270 current->drawSurface->release();
271 }
272
273 current->drawSurface = surface;
274}
275
276egl::Surface *getCurrentDrawSurface()
277{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400278 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400279
280 return current->drawSurface;
281}
282
283void setCurrentReadSurface(egl::Surface *surface)
284{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400285 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400286
287 if(surface)
288 {
289 surface->addRef();
290 }
291
292 if(current->readSurface)
293 {
294 current->readSurface->release();
295 }
296
297 current->readSurface = surface;
298}
299
300egl::Surface *getCurrentReadSurface()
301{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400302 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400303
304 return current->readSurface;
305}
306
307void error(EGLint errorCode)
308{
309 egl::setCurrentError(errorCode);
310
311 if(errorCode != EGL_SUCCESS)
312 {
313 switch(errorCode)
314 {
315 case EGL_NOT_INITIALIZED: TRACE("\t! Error generated: not initialized\n"); break;
316 case EGL_BAD_ACCESS: TRACE("\t! Error generated: bad access\n"); break;
317 case EGL_BAD_ALLOC: TRACE("\t! Error generated: bad alloc\n"); break;
318 case EGL_BAD_ATTRIBUTE: TRACE("\t! Error generated: bad attribute\n"); break;
319 case EGL_BAD_CONFIG: TRACE("\t! Error generated: bad config\n"); break;
320 case EGL_BAD_CONTEXT: TRACE("\t! Error generated: bad context\n"); break;
321 case EGL_BAD_CURRENT_SURFACE: TRACE("\t! Error generated: bad current surface\n"); break;
322 case EGL_BAD_DISPLAY: TRACE("\t! Error generated: bad display\n"); break;
323 case EGL_BAD_MATCH: TRACE("\t! Error generated: bad match\n"); break;
324 case EGL_BAD_NATIVE_PIXMAP: TRACE("\t! Error generated: bad native pixmap\n"); break;
325 case EGL_BAD_NATIVE_WINDOW: TRACE("\t! Error generated: bad native window\n"); break;
326 case EGL_BAD_PARAMETER: TRACE("\t! Error generated: bad parameter\n"); break;
327 case EGL_BAD_SURFACE: TRACE("\t! Error generated: bad surface\n"); break;
328 case EGL_CONTEXT_LOST: TRACE("\t! Error generated: context lost\n"); break;
329 default: TRACE("\t! Error generated: <0x%X>\n", errorCode); break;
330 }
331 }
332}
333}
334
335namespace egl
336{
337EGLint GetError(void);
338EGLDisplay GetDisplay(EGLNativeDisplayType display_id);
339EGLBoolean Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
340EGLBoolean Terminate(EGLDisplay dpy);
341const char *QueryString(EGLDisplay dpy, EGLint name);
342EGLBoolean GetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
343EGLBoolean ChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
344EGLBoolean GetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
345EGLSurface CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list);
346EGLSurface CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
347EGLSurface CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);
348EGLBoolean DestroySurface(EGLDisplay dpy, EGLSurface surface);
349EGLBoolean QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
350EGLBoolean BindAPI(EGLenum api);
351EGLenum QueryAPI(void);
352EGLBoolean WaitClient(void);
353EGLBoolean ReleaseThread(void);
354EGLSurface CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);
355EGLBoolean SurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
356EGLBoolean BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
357EGLBoolean ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
358EGLBoolean SwapInterval(EGLDisplay dpy, EGLint interval);
359EGLContext CreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
360EGLBoolean DestroyContext(EGLDisplay dpy, EGLContext ctx);
361EGLBoolean MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
362EGLContext GetCurrentContext(void);
363EGLSurface GetCurrentSurface(EGLint readdraw);
364EGLDisplay GetCurrentDisplay(void);
365EGLBoolean QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
366EGLBoolean WaitGL(void);
367EGLBoolean WaitNative(EGLint engine);
368EGLBoolean SwapBuffers(EGLDisplay dpy, EGLSurface surface);
369EGLBoolean CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
370EGLImageKHR CreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
371EGLBoolean DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image);
372EGLDisplay GetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list);
373EGLSurface CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);
374EGLSurface CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);
375EGLSyncKHR CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
376EGLBoolean DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync);
377EGLint ClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
378EGLBoolean GetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
379__eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname);
380}
381
382extern "C"
383{
384EGLAPI EGLint EGLAPIENTRY eglGetError(void)
385{
386 return egl::GetError();
387}
388
389EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id)
390{
391 return egl::GetDisplay(display_id);
392}
393
394EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
395{
396 return egl::Initialize(dpy, major, minor);
397}
398
399EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy)
400{
401 return egl::Terminate(dpy);
402}
403
404EGLAPI const char *EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name)
405{
406 return egl::QueryString(dpy, name);
407}
408
409EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config)
410{
411 return egl::GetConfigs(dpy, configs, config_size, num_config);
412}
413
414EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config)
415{
416 return egl::ChooseConfig(dpy, attrib_list, configs, config_size, num_config);
417}
418
419EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value)
420{
421 return egl::GetConfigAttrib(dpy, config, attribute, value);
422}
423
424EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list)
425{
426 return egl::CreateWindowSurface(dpy, config, window, attrib_list);
427}
428
429EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
430{
431 return egl::CreatePbufferSurface(dpy, config, attrib_list);
432}
433
434EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list)
435{
436 return egl::CreatePixmapSurface(dpy, config, pixmap, attrib_list);
437}
438
439EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
440{
441 return egl::DestroySurface(dpy, surface);
442}
443
444EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value)
445{
446 return egl::QuerySurface(dpy, surface, attribute, value);
447}
448
449EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api)
450{
451 return egl::BindAPI(api);
452}
453
454EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void)
455{
456 return egl::QueryAPI();
457}
458
459EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void)
460{
461 return egl::WaitClient();
462}
463
464EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void)
465{
466 return egl::ReleaseThread();
467}
468
469EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list)
470{
471 return egl::CreatePbufferFromClientBuffer(dpy, buftype, buffer, config, attrib_list);
472}
473
474EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
475{
476 return egl::SurfaceAttrib(dpy, surface, attribute, value);
477}
478
479EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
480{
481 return egl::BindTexImage(dpy, surface, buffer);
482}
483
484EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
485{
486 return egl::ReleaseTexImage(dpy, surface, buffer);
487}
488
489EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval)
490{
491 return egl::SwapInterval(dpy, interval);
492}
493
494EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list)
495{
496 return egl::CreateContext(dpy, config, share_context, attrib_list);
497}
498
499EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
500{
501 return egl::DestroyContext(dpy, ctx);
502}
503
504EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
505{
506 return egl::MakeCurrent(dpy, draw, read, ctx);
507}
508
509EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void)
510{
511 return egl::GetCurrentContext();
512}
513
514EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw)
515{
516 return egl::GetCurrentSurface(readdraw);
517}
518
519EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void)
520{
521 return egl::GetCurrentDisplay();
522}
523
524EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
525{
526 return egl::QueryContext(dpy, ctx, attribute, value);
527}
528
529EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void)
530{
531 return egl::WaitClient();
532}
533
534EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine)
535{
536 return egl::WaitNative(engine);
537}
538
539EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
540{
541 return egl::SwapBuffers(dpy, surface);
542}
543
544EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
545{
546 return egl::CopyBuffers(dpy, surface, target);
547}
548
549EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
550{
551 return egl::CreateImageKHR(dpy, ctx, target, buffer, attrib_list);
552}
553
554EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
555{
556 return egl::DestroyImageKHR(dpy, image);
557}
558
559EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list)
560{
561 return egl::GetPlatformDisplayEXT(platform, native_display, attrib_list);
562}
563
564EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list)
565{
566 return egl::CreatePlatformWindowSurfaceEXT(dpy, config, native_window, attrib_list);
567}
568
569EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list)
570{
571 return egl::CreatePlatformPixmapSurfaceEXT(dpy, config, native_pixmap, attrib_list);
572}
573
574EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
575{
576 return egl::CreateSyncKHR(dpy, type, attrib_list);
577}
578
579EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
580{
581 return egl::DestroySyncKHR(dpy, sync);
582}
583
584EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
585{
586 return egl::ClientWaitSyncKHR(dpy, sync, flags, timeout);
587}
588
589EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
590{
591 return egl::GetSyncAttribKHR(dpy, sync, attribute, value);
592}
593
594EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
595{
596 return egl::GetProcAddress(procname);
597}
598}
599
600LibEGLexports::LibEGLexports()
601{
602 this->eglGetError = egl::GetError;
603 this->eglGetDisplay = egl::GetDisplay;
604 this->eglInitialize = egl::Initialize;
605 this->eglTerminate = egl::Terminate;
606 this->eglQueryString = egl::QueryString;
607 this->eglGetConfigs = egl::GetConfigs;
608 this->eglChooseConfig = egl::ChooseConfig;
609 this->eglGetConfigAttrib = egl::GetConfigAttrib;
610 this->eglCreateWindowSurface = egl::CreateWindowSurface;
611 this->eglCreatePbufferSurface = egl::CreatePbufferSurface;
612 this->eglCreatePixmapSurface = egl::CreatePixmapSurface;
613 this->eglDestroySurface = egl::DestroySurface;
614 this->eglQuerySurface = egl::QuerySurface;
615 this->eglBindAPI = egl::BindAPI;
616 this->eglQueryAPI = egl::QueryAPI;
617 this->eglWaitClient = egl::WaitClient;
618 this->eglReleaseThread = egl::ReleaseThread;
619 this->eglCreatePbufferFromClientBuffer = egl::CreatePbufferFromClientBuffer;
620 this->eglSurfaceAttrib = egl::SurfaceAttrib;
621 this->eglBindTexImage = egl::BindTexImage;
622 this->eglReleaseTexImage = egl::ReleaseTexImage;
623 this->eglSwapInterval = egl::SwapInterval;
624 this->eglCreateContext = egl::CreateContext;
625 this->eglDestroyContext = egl::DestroyContext;
626 this->eglMakeCurrent = egl::MakeCurrent;
627 this->eglGetCurrentContext = egl::GetCurrentContext;
628 this->eglGetCurrentSurface = egl::GetCurrentSurface;
629 this->eglGetCurrentDisplay = egl::GetCurrentDisplay;
630 this->eglQueryContext = egl::QueryContext;
631 this->eglWaitGL = egl::WaitGL;
632 this->eglWaitNative = egl::WaitNative;
633 this->eglSwapBuffers = egl::SwapBuffers;
634 this->eglCopyBuffers = egl::CopyBuffers;
635 this->eglCreateImageKHR = egl::CreateImageKHR;
636 this->eglDestroyImageKHR = egl::DestroyImageKHR;
637 this->eglGetProcAddress = egl::GetProcAddress;
638 this->eglCreateSyncKHR = egl::CreateSyncKHR;
639 this->eglDestroySyncKHR = egl::DestroySyncKHR;
640 this->eglClientWaitSyncKHR = egl::ClientWaitSyncKHR;
641 this->eglGetSyncAttribKHR = egl::GetSyncAttribKHR;
642
643 this->clientGetCurrentContext = egl::getCurrentContext;
644}
645
Nicolas Capens840f47e2018-04-25 16:26:17 -0400646extern "C" LibEGLexports *libEGL_swiftshader()
Nicolas Capens0bac2852016-05-07 06:09:58 -0400647{
648 static LibEGLexports libEGL;
649 return &libEGL;
650}
651
Alexis Hetu99be3182018-04-16 15:38:40 -0400652LibGLES_CM libGLES_CM(getLibraryDirectoryFromSymbol((void*)libEGL_swiftshader));
653LibGLESv2 libGLESv2(getLibraryDirectoryFromSymbol((void*)libEGL_swiftshader));