blob: 1a98a52cd98156dea2fbe96f01309ba5f8ce5d30 [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"
Alexis Hetu2f48bcb2016-12-05 12:43:27 -050021#include "EGLSurface.h"
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{
42void attachThread()
Nicolas Capens0bac2852016-05-07 06:09:58 -040043{
44 TRACE("()");
45
Nicolas Capensaf93a422016-06-12 16:11:25 -040046 Current *current = new Current;
Nicolas Capens0bac2852016-05-07 06:09:58 -040047
48 if(current)
49 {
50 sw::Thread::setLocalStorage(currentTLS, current);
51
52 current->error = EGL_SUCCESS;
53 current->API = EGL_OPENGL_ES_API;
54 current->display = EGL_NO_DISPLAY;
55 current->context = nullptr;
56 current->drawSurface = nullptr;
57 current->readSurface = nullptr;
58 }
59}
60
Nicolas Capensaf93a422016-06-12 16:11:25 -040061void detachThread()
Nicolas Capens0bac2852016-05-07 06:09:58 -040062{
63 TRACE("()");
64
Nicolas Capenscc5c7d92016-06-13 14:35:11 -040065 eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_CONTEXT, EGL_NO_SURFACE, EGL_NO_SURFACE);
66
Nicolas Capensaf93a422016-06-12 16:11:25 -040067 delete (Current*)sw::Thread::getLocalStorage(currentTLS);
Nicolas Capenscc5c7d92016-06-13 14:35:11 -040068 sw::Thread::setLocalStorage(currentTLS, nullptr);
Nicolas Capens0bac2852016-05-07 06:09:58 -040069}
70
Nicolas Capensaf93a422016-06-12 16:11:25 -040071CONSTRUCTOR void attachProcess()
Nicolas Capens0bac2852016-05-07 06:09:58 -040072{
73 TRACE("()");
74
75 #if !defined(ANGLE_DISABLE_TRACE) && defined(TRACE_OUTPUT_FILE)
76 FILE *debug = fopen(TRACE_OUTPUT_FILE, "rt");
77
78 if(debug)
79 {
80 fclose(debug);
81 debug = fopen(TRACE_OUTPUT_FILE, "wt"); // Erase
82 fclose(debug);
83 }
84 #endif
85
86 currentTLS = sw::Thread::allocateLocalStorageKey();
87
88 if(currentTLS == TLS_OUT_OF_INDEXES)
89 {
90 return;
91 }
92
Nicolas Capensaf93a422016-06-12 16:11:25 -040093 attachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -040094}
95
Nicolas Capensaf93a422016-06-12 16:11:25 -040096DESTRUCTOR void detachProcess()
Nicolas Capens0bac2852016-05-07 06:09:58 -040097{
98 TRACE("()");
99
Nicolas Capensaf93a422016-06-12 16:11:25 -0400100 detachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400101 sw::Thread::freeLocalStorageKey(currentTLS);
102}
Nicolas Capensaf93a422016-06-12 16:11:25 -0400103}
Nicolas Capens0bac2852016-05-07 06:09:58 -0400104
105#if defined(_WIN32)
Alexis Hetu8e942eb2017-03-16 10:53:01 -0400106#ifdef DEBUGGER_WAIT_DIALOG
Nicolas Capens0bac2852016-05-07 06:09:58 -0400107static INT_PTR CALLBACK DebuggerWaitDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
108{
109 RECT rect;
110
111 switch(uMsg)
112 {
113 case WM_INITDIALOG:
114 GetWindowRect(GetDesktopWindow(), &rect);
115 SetWindowPos(hwnd, HWND_TOP, rect.right / 2, rect.bottom / 2, 0, 0, SWP_NOSIZE);
116 SetTimer(hwnd, 1, 100, NULL);
117 return TRUE;
118 case WM_COMMAND:
119 if(LOWORD(wParam) == IDCANCEL)
120 {
121 EndDialog(hwnd, 0);
122 }
123 break;
124 case WM_TIMER:
125 if(IsDebuggerPresent())
126 {
127 EndDialog(hwnd, 0);
128 }
129 }
130
131 return FALSE;
132}
133
134static void WaitForDebugger(HINSTANCE instance)
135{
136 if(!IsDebuggerPresent())
137 {
138 HRSRC dialog = FindResource(instance, MAKEINTRESOURCE(IDD_DIALOG1), RT_DIALOG);
139 DLGTEMPLATE *dialogTemplate = (DLGTEMPLATE*)LoadResource(instance, dialog);
140 DialogBoxIndirect(instance, dialogTemplate, NULL, DebuggerWaitDialogProc);
141 }
142}
Alexis Hetue97a31e2016-11-14 14:10:47 -0500143#endif
Nicolas Capens0bac2852016-05-07 06:09:58 -0400144
145extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
146{
147 switch(reason)
148 {
149 case DLL_PROCESS_ATTACH:
150 #ifndef NDEBUG
151 WaitForDebugger(instance);
152 #endif
Nicolas Capensaf93a422016-06-12 16:11:25 -0400153 egl::attachProcess();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400154 break;
155 case DLL_THREAD_ATTACH:
Nicolas Capensaf93a422016-06-12 16:11:25 -0400156 egl::attachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400157 break;
158 case DLL_THREAD_DETACH:
Nicolas Capensaf93a422016-06-12 16:11:25 -0400159 egl::detachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400160 break;
161 case DLL_PROCESS_DETACH:
Nicolas Capensaf93a422016-06-12 16:11:25 -0400162 egl::detachProcess();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400163 break;
164 default:
165 break;
166 }
167
168 return TRUE;
169}
170#endif
171
172namespace egl
173{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400174static Current *getCurrent(void)
Nicolas Capens0bac2852016-05-07 06:09:58 -0400175{
176 Current *current = (Current*)sw::Thread::getLocalStorage(currentTLS);
177
178 if(!current)
179 {
Nicolas Capensaf93a422016-06-12 16:11:25 -0400180 attachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400181 }
182
183 return (Current*)sw::Thread::getLocalStorage(currentTLS);
184}
185
186void setCurrentError(EGLint error)
187{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400188 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400189
190 current->error = error;
191}
192
193EGLint getCurrentError()
194{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400195 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400196
197 return current->error;
198}
199
200void setCurrentAPI(EGLenum API)
201{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400202 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400203
204 current->API = API;
205}
206
207EGLenum getCurrentAPI()
208{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400209 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400210
211 return current->API;
212}
213
214void setCurrentDisplay(EGLDisplay dpy)
215{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400216 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400217
218 current->display = dpy;
219}
220
221EGLDisplay getCurrentDisplay()
222{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400223 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400224
225 return current->display;
226}
227
228void setCurrentContext(egl::Context *ctx)
229{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400230 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400231
232 if(ctx)
233 {
234 ctx->addRef();
235 }
236
237 if(current->context)
238 {
239 current->context->release();
240 }
241
242 current->context = ctx;
243}
244
245egl::Context *getCurrentContext()
246{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400247 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400248
249 return current->context;
250}
251
252void setCurrentDrawSurface(egl::Surface *surface)
253{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400254 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400255
256 if(surface)
257 {
258 surface->addRef();
259 }
260
261 if(current->drawSurface)
262 {
263 current->drawSurface->release();
264 }
265
266 current->drawSurface = surface;
267}
268
269egl::Surface *getCurrentDrawSurface()
270{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400271 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400272
273 return current->drawSurface;
274}
275
276void setCurrentReadSurface(egl::Surface *surface)
277{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400278 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400279
280 if(surface)
281 {
282 surface->addRef();
283 }
284
285 if(current->readSurface)
286 {
287 current->readSurface->release();
288 }
289
290 current->readSurface = surface;
291}
292
293egl::Surface *getCurrentReadSurface()
294{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400295 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400296
297 return current->readSurface;
298}
299
300void error(EGLint errorCode)
301{
302 egl::setCurrentError(errorCode);
303
304 if(errorCode != EGL_SUCCESS)
305 {
306 switch(errorCode)
307 {
308 case EGL_NOT_INITIALIZED: TRACE("\t! Error generated: not initialized\n"); break;
309 case EGL_BAD_ACCESS: TRACE("\t! Error generated: bad access\n"); break;
310 case EGL_BAD_ALLOC: TRACE("\t! Error generated: bad alloc\n"); break;
311 case EGL_BAD_ATTRIBUTE: TRACE("\t! Error generated: bad attribute\n"); break;
312 case EGL_BAD_CONFIG: TRACE("\t! Error generated: bad config\n"); break;
313 case EGL_BAD_CONTEXT: TRACE("\t! Error generated: bad context\n"); break;
314 case EGL_BAD_CURRENT_SURFACE: TRACE("\t! Error generated: bad current surface\n"); break;
315 case EGL_BAD_DISPLAY: TRACE("\t! Error generated: bad display\n"); break;
316 case EGL_BAD_MATCH: TRACE("\t! Error generated: bad match\n"); break;
317 case EGL_BAD_NATIVE_PIXMAP: TRACE("\t! Error generated: bad native pixmap\n"); break;
318 case EGL_BAD_NATIVE_WINDOW: TRACE("\t! Error generated: bad native window\n"); break;
319 case EGL_BAD_PARAMETER: TRACE("\t! Error generated: bad parameter\n"); break;
320 case EGL_BAD_SURFACE: TRACE("\t! Error generated: bad surface\n"); break;
321 case EGL_CONTEXT_LOST: TRACE("\t! Error generated: context lost\n"); break;
322 default: TRACE("\t! Error generated: <0x%X>\n", errorCode); break;
323 }
324 }
325}
326}
327
328namespace egl
329{
330EGLint GetError(void);
331EGLDisplay GetDisplay(EGLNativeDisplayType display_id);
332EGLBoolean Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
333EGLBoolean Terminate(EGLDisplay dpy);
334const char *QueryString(EGLDisplay dpy, EGLint name);
335EGLBoolean GetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
336EGLBoolean ChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
337EGLBoolean GetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
338EGLSurface CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list);
339EGLSurface CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
340EGLSurface CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);
341EGLBoolean DestroySurface(EGLDisplay dpy, EGLSurface surface);
342EGLBoolean QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
343EGLBoolean BindAPI(EGLenum api);
344EGLenum QueryAPI(void);
345EGLBoolean WaitClient(void);
346EGLBoolean ReleaseThread(void);
347EGLSurface CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);
348EGLBoolean SurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
349EGLBoolean BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
350EGLBoolean ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
351EGLBoolean SwapInterval(EGLDisplay dpy, EGLint interval);
352EGLContext CreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
353EGLBoolean DestroyContext(EGLDisplay dpy, EGLContext ctx);
354EGLBoolean MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
355EGLContext GetCurrentContext(void);
356EGLSurface GetCurrentSurface(EGLint readdraw);
357EGLDisplay GetCurrentDisplay(void);
358EGLBoolean QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
359EGLBoolean WaitGL(void);
360EGLBoolean WaitNative(EGLint engine);
361EGLBoolean SwapBuffers(EGLDisplay dpy, EGLSurface surface);
362EGLBoolean CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
363EGLImageKHR CreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
364EGLBoolean DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image);
365EGLDisplay GetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list);
366EGLSurface CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);
367EGLSurface CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);
368EGLSyncKHR CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
369EGLBoolean DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync);
370EGLint ClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
371EGLBoolean GetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
372__eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname);
373}
374
375extern "C"
376{
377EGLAPI EGLint EGLAPIENTRY eglGetError(void)
378{
379 return egl::GetError();
380}
381
382EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id)
383{
384 return egl::GetDisplay(display_id);
385}
386
387EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
388{
389 return egl::Initialize(dpy, major, minor);
390}
391
392EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy)
393{
394 return egl::Terminate(dpy);
395}
396
397EGLAPI const char *EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name)
398{
399 return egl::QueryString(dpy, name);
400}
401
402EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config)
403{
404 return egl::GetConfigs(dpy, configs, config_size, num_config);
405}
406
407EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config)
408{
409 return egl::ChooseConfig(dpy, attrib_list, configs, config_size, num_config);
410}
411
412EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value)
413{
414 return egl::GetConfigAttrib(dpy, config, attribute, value);
415}
416
417EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list)
418{
419 return egl::CreateWindowSurface(dpy, config, window, attrib_list);
420}
421
422EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
423{
424 return egl::CreatePbufferSurface(dpy, config, attrib_list);
425}
426
427EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list)
428{
429 return egl::CreatePixmapSurface(dpy, config, pixmap, attrib_list);
430}
431
432EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
433{
434 return egl::DestroySurface(dpy, surface);
435}
436
437EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value)
438{
439 return egl::QuerySurface(dpy, surface, attribute, value);
440}
441
442EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api)
443{
444 return egl::BindAPI(api);
445}
446
447EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void)
448{
449 return egl::QueryAPI();
450}
451
452EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void)
453{
454 return egl::WaitClient();
455}
456
457EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void)
458{
459 return egl::ReleaseThread();
460}
461
462EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list)
463{
464 return egl::CreatePbufferFromClientBuffer(dpy, buftype, buffer, config, attrib_list);
465}
466
467EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
468{
469 return egl::SurfaceAttrib(dpy, surface, attribute, value);
470}
471
472EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
473{
474 return egl::BindTexImage(dpy, surface, buffer);
475}
476
477EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
478{
479 return egl::ReleaseTexImage(dpy, surface, buffer);
480}
481
482EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval)
483{
484 return egl::SwapInterval(dpy, interval);
485}
486
487EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list)
488{
489 return egl::CreateContext(dpy, config, share_context, attrib_list);
490}
491
492EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
493{
494 return egl::DestroyContext(dpy, ctx);
495}
496
497EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
498{
499 return egl::MakeCurrent(dpy, draw, read, ctx);
500}
501
502EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void)
503{
504 return egl::GetCurrentContext();
505}
506
507EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw)
508{
509 return egl::GetCurrentSurface(readdraw);
510}
511
512EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void)
513{
514 return egl::GetCurrentDisplay();
515}
516
517EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
518{
519 return egl::QueryContext(dpy, ctx, attribute, value);
520}
521
522EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void)
523{
524 return egl::WaitClient();
525}
526
527EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine)
528{
529 return egl::WaitNative(engine);
530}
531
532EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
533{
534 return egl::SwapBuffers(dpy, surface);
535}
536
537EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
538{
539 return egl::CopyBuffers(dpy, surface, target);
540}
541
542EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
543{
544 return egl::CreateImageKHR(dpy, ctx, target, buffer, attrib_list);
545}
546
547EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
548{
549 return egl::DestroyImageKHR(dpy, image);
550}
551
552EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list)
553{
554 return egl::GetPlatformDisplayEXT(platform, native_display, attrib_list);
555}
556
557EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list)
558{
559 return egl::CreatePlatformWindowSurfaceEXT(dpy, config, native_window, attrib_list);
560}
561
562EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list)
563{
564 return egl::CreatePlatformPixmapSurfaceEXT(dpy, config, native_pixmap, attrib_list);
565}
566
567EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
568{
569 return egl::CreateSyncKHR(dpy, type, attrib_list);
570}
571
572EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
573{
574 return egl::DestroySyncKHR(dpy, sync);
575}
576
577EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
578{
579 return egl::ClientWaitSyncKHR(dpy, sync, flags, timeout);
580}
581
582EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
583{
584 return egl::GetSyncAttribKHR(dpy, sync, attribute, value);
585}
586
587EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
588{
589 return egl::GetProcAddress(procname);
590}
591}
592
593LibEGLexports::LibEGLexports()
594{
595 this->eglGetError = egl::GetError;
596 this->eglGetDisplay = egl::GetDisplay;
597 this->eglInitialize = egl::Initialize;
598 this->eglTerminate = egl::Terminate;
599 this->eglQueryString = egl::QueryString;
600 this->eglGetConfigs = egl::GetConfigs;
601 this->eglChooseConfig = egl::ChooseConfig;
602 this->eglGetConfigAttrib = egl::GetConfigAttrib;
603 this->eglCreateWindowSurface = egl::CreateWindowSurface;
604 this->eglCreatePbufferSurface = egl::CreatePbufferSurface;
605 this->eglCreatePixmapSurface = egl::CreatePixmapSurface;
606 this->eglDestroySurface = egl::DestroySurface;
607 this->eglQuerySurface = egl::QuerySurface;
608 this->eglBindAPI = egl::BindAPI;
609 this->eglQueryAPI = egl::QueryAPI;
610 this->eglWaitClient = egl::WaitClient;
611 this->eglReleaseThread = egl::ReleaseThread;
612 this->eglCreatePbufferFromClientBuffer = egl::CreatePbufferFromClientBuffer;
613 this->eglSurfaceAttrib = egl::SurfaceAttrib;
614 this->eglBindTexImage = egl::BindTexImage;
615 this->eglReleaseTexImage = egl::ReleaseTexImage;
616 this->eglSwapInterval = egl::SwapInterval;
617 this->eglCreateContext = egl::CreateContext;
618 this->eglDestroyContext = egl::DestroyContext;
619 this->eglMakeCurrent = egl::MakeCurrent;
620 this->eglGetCurrentContext = egl::GetCurrentContext;
621 this->eglGetCurrentSurface = egl::GetCurrentSurface;
622 this->eglGetCurrentDisplay = egl::GetCurrentDisplay;
623 this->eglQueryContext = egl::QueryContext;
624 this->eglWaitGL = egl::WaitGL;
625 this->eglWaitNative = egl::WaitNative;
626 this->eglSwapBuffers = egl::SwapBuffers;
627 this->eglCopyBuffers = egl::CopyBuffers;
628 this->eglCreateImageKHR = egl::CreateImageKHR;
629 this->eglDestroyImageKHR = egl::DestroyImageKHR;
630 this->eglGetProcAddress = egl::GetProcAddress;
631 this->eglCreateSyncKHR = egl::CreateSyncKHR;
632 this->eglDestroySyncKHR = egl::DestroySyncKHR;
633 this->eglClientWaitSyncKHR = egl::ClientWaitSyncKHR;
634 this->eglGetSyncAttribKHR = egl::GetSyncAttribKHR;
635
636 this->clientGetCurrentContext = egl::getCurrentContext;
637}
638
639extern "C" EGLAPI LibEGLexports *libEGL_swiftshader()
640{
641 static LibEGLexports libEGL;
642 return &libEGL;
643}
644
645LibGLES_CM libGLES_CM;
646LibGLESv2 libGLESv2;