blob: 2479b4efe94855d455a84fd8921442d9b94333bb [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"
21#include "Surface.h"
22
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 Capensaf93a422016-06-12 16:11:25 -040065 delete (Current*)sw::Thread::getLocalStorage(currentTLS);
Nicolas Capens0bac2852016-05-07 06:09:58 -040066}
67
Nicolas Capensaf93a422016-06-12 16:11:25 -040068CONSTRUCTOR void attachProcess()
Nicolas Capens0bac2852016-05-07 06:09:58 -040069{
70 TRACE("()");
71
72 #if !defined(ANGLE_DISABLE_TRACE) && defined(TRACE_OUTPUT_FILE)
73 FILE *debug = fopen(TRACE_OUTPUT_FILE, "rt");
74
75 if(debug)
76 {
77 fclose(debug);
78 debug = fopen(TRACE_OUTPUT_FILE, "wt"); // Erase
79 fclose(debug);
80 }
81 #endif
82
83 currentTLS = sw::Thread::allocateLocalStorageKey();
84
85 if(currentTLS == TLS_OUT_OF_INDEXES)
86 {
87 return;
88 }
89
Nicolas Capensaf93a422016-06-12 16:11:25 -040090 attachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -040091}
92
Nicolas Capensaf93a422016-06-12 16:11:25 -040093DESTRUCTOR void detachProcess()
Nicolas Capens0bac2852016-05-07 06:09:58 -040094{
95 TRACE("()");
96
Nicolas Capensaf93a422016-06-12 16:11:25 -040097 detachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -040098 sw::Thread::freeLocalStorageKey(currentTLS);
99}
Nicolas Capensaf93a422016-06-12 16:11:25 -0400100}
Nicolas Capens0bac2852016-05-07 06:09:58 -0400101
102#if defined(_WIN32)
103static INT_PTR CALLBACK DebuggerWaitDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
104{
105 RECT rect;
106
107 switch(uMsg)
108 {
109 case WM_INITDIALOG:
110 GetWindowRect(GetDesktopWindow(), &rect);
111 SetWindowPos(hwnd, HWND_TOP, rect.right / 2, rect.bottom / 2, 0, 0, SWP_NOSIZE);
112 SetTimer(hwnd, 1, 100, NULL);
113 return TRUE;
114 case WM_COMMAND:
115 if(LOWORD(wParam) == IDCANCEL)
116 {
117 EndDialog(hwnd, 0);
118 }
119 break;
120 case WM_TIMER:
121 if(IsDebuggerPresent())
122 {
123 EndDialog(hwnd, 0);
124 }
125 }
126
127 return FALSE;
128}
129
130static void WaitForDebugger(HINSTANCE instance)
131{
132 if(!IsDebuggerPresent())
133 {
134 HRSRC dialog = FindResource(instance, MAKEINTRESOURCE(IDD_DIALOG1), RT_DIALOG);
135 DLGTEMPLATE *dialogTemplate = (DLGTEMPLATE*)LoadResource(instance, dialog);
136 DialogBoxIndirect(instance, dialogTemplate, NULL, DebuggerWaitDialogProc);
137 }
138}
139
140extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
141{
142 switch(reason)
143 {
144 case DLL_PROCESS_ATTACH:
145 #ifndef NDEBUG
146 WaitForDebugger(instance);
147 #endif
Nicolas Capensaf93a422016-06-12 16:11:25 -0400148 egl::attachProcess();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400149 break;
150 case DLL_THREAD_ATTACH:
Nicolas Capensaf93a422016-06-12 16:11:25 -0400151 egl::attachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400152 break;
153 case DLL_THREAD_DETACH:
Nicolas Capensaf93a422016-06-12 16:11:25 -0400154 egl::detachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400155 break;
156 case DLL_PROCESS_DETACH:
Nicolas Capensaf93a422016-06-12 16:11:25 -0400157 egl::detachProcess();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400158 break;
159 default:
160 break;
161 }
162
163 return TRUE;
164}
165#endif
166
167namespace egl
168{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400169static Current *getCurrent(void)
Nicolas Capens0bac2852016-05-07 06:09:58 -0400170{
171 Current *current = (Current*)sw::Thread::getLocalStorage(currentTLS);
172
173 if(!current)
174 {
Nicolas Capensaf93a422016-06-12 16:11:25 -0400175 attachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400176 }
177
178 return (Current*)sw::Thread::getLocalStorage(currentTLS);
179}
180
181void setCurrentError(EGLint error)
182{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400183 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400184
185 current->error = error;
186}
187
188EGLint getCurrentError()
189{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400190 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400191
192 return current->error;
193}
194
195void setCurrentAPI(EGLenum API)
196{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400197 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400198
199 current->API = API;
200}
201
202EGLenum getCurrentAPI()
203{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400204 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400205
206 return current->API;
207}
208
209void setCurrentDisplay(EGLDisplay dpy)
210{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400211 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400212
213 current->display = dpy;
214}
215
216EGLDisplay getCurrentDisplay()
217{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400218 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400219
220 return current->display;
221}
222
223void setCurrentContext(egl::Context *ctx)
224{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400225 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400226
227 if(ctx)
228 {
229 ctx->addRef();
230 }
231
232 if(current->context)
233 {
234 current->context->release();
235 }
236
237 current->context = ctx;
238}
239
240egl::Context *getCurrentContext()
241{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400242 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400243
244 return current->context;
245}
246
247void setCurrentDrawSurface(egl::Surface *surface)
248{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400249 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400250
251 if(surface)
252 {
253 surface->addRef();
254 }
255
256 if(current->drawSurface)
257 {
258 current->drawSurface->release();
259 }
260
261 current->drawSurface = surface;
262}
263
264egl::Surface *getCurrentDrawSurface()
265{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400266 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400267
268 return current->drawSurface;
269}
270
271void setCurrentReadSurface(egl::Surface *surface)
272{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400273 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400274
275 if(surface)
276 {
277 surface->addRef();
278 }
279
280 if(current->readSurface)
281 {
282 current->readSurface->release();
283 }
284
285 current->readSurface = surface;
286}
287
288egl::Surface *getCurrentReadSurface()
289{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400290 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400291
292 return current->readSurface;
293}
294
295void error(EGLint errorCode)
296{
297 egl::setCurrentError(errorCode);
298
299 if(errorCode != EGL_SUCCESS)
300 {
301 switch(errorCode)
302 {
303 case EGL_NOT_INITIALIZED: TRACE("\t! Error generated: not initialized\n"); break;
304 case EGL_BAD_ACCESS: TRACE("\t! Error generated: bad access\n"); break;
305 case EGL_BAD_ALLOC: TRACE("\t! Error generated: bad alloc\n"); break;
306 case EGL_BAD_ATTRIBUTE: TRACE("\t! Error generated: bad attribute\n"); break;
307 case EGL_BAD_CONFIG: TRACE("\t! Error generated: bad config\n"); break;
308 case EGL_BAD_CONTEXT: TRACE("\t! Error generated: bad context\n"); break;
309 case EGL_BAD_CURRENT_SURFACE: TRACE("\t! Error generated: bad current surface\n"); break;
310 case EGL_BAD_DISPLAY: TRACE("\t! Error generated: bad display\n"); break;
311 case EGL_BAD_MATCH: TRACE("\t! Error generated: bad match\n"); break;
312 case EGL_BAD_NATIVE_PIXMAP: TRACE("\t! Error generated: bad native pixmap\n"); break;
313 case EGL_BAD_NATIVE_WINDOW: TRACE("\t! Error generated: bad native window\n"); break;
314 case EGL_BAD_PARAMETER: TRACE("\t! Error generated: bad parameter\n"); break;
315 case EGL_BAD_SURFACE: TRACE("\t! Error generated: bad surface\n"); break;
316 case EGL_CONTEXT_LOST: TRACE("\t! Error generated: context lost\n"); break;
317 default: TRACE("\t! Error generated: <0x%X>\n", errorCode); break;
318 }
319 }
320}
321}
322
323namespace egl
324{
325EGLint GetError(void);
326EGLDisplay GetDisplay(EGLNativeDisplayType display_id);
327EGLBoolean Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
328EGLBoolean Terminate(EGLDisplay dpy);
329const char *QueryString(EGLDisplay dpy, EGLint name);
330EGLBoolean GetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
331EGLBoolean ChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
332EGLBoolean GetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
333EGLSurface CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list);
334EGLSurface CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
335EGLSurface CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);
336EGLBoolean DestroySurface(EGLDisplay dpy, EGLSurface surface);
337EGLBoolean QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
338EGLBoolean BindAPI(EGLenum api);
339EGLenum QueryAPI(void);
340EGLBoolean WaitClient(void);
341EGLBoolean ReleaseThread(void);
342EGLSurface CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);
343EGLBoolean SurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
344EGLBoolean BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
345EGLBoolean ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
346EGLBoolean SwapInterval(EGLDisplay dpy, EGLint interval);
347EGLContext CreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
348EGLBoolean DestroyContext(EGLDisplay dpy, EGLContext ctx);
349EGLBoolean MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
350EGLContext GetCurrentContext(void);
351EGLSurface GetCurrentSurface(EGLint readdraw);
352EGLDisplay GetCurrentDisplay(void);
353EGLBoolean QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
354EGLBoolean WaitGL(void);
355EGLBoolean WaitNative(EGLint engine);
356EGLBoolean SwapBuffers(EGLDisplay dpy, EGLSurface surface);
357EGLBoolean CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
358EGLImageKHR CreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
359EGLBoolean DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image);
360EGLDisplay GetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list);
361EGLSurface CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);
362EGLSurface CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);
363EGLSyncKHR CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
364EGLBoolean DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync);
365EGLint ClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
366EGLBoolean GetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
367__eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname);
368}
369
370extern "C"
371{
372EGLAPI EGLint EGLAPIENTRY eglGetError(void)
373{
374 return egl::GetError();
375}
376
377EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id)
378{
379 return egl::GetDisplay(display_id);
380}
381
382EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
383{
384 return egl::Initialize(dpy, major, minor);
385}
386
387EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy)
388{
389 return egl::Terminate(dpy);
390}
391
392EGLAPI const char *EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name)
393{
394 return egl::QueryString(dpy, name);
395}
396
397EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config)
398{
399 return egl::GetConfigs(dpy, configs, config_size, num_config);
400}
401
402EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config)
403{
404 return egl::ChooseConfig(dpy, attrib_list, configs, config_size, num_config);
405}
406
407EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value)
408{
409 return egl::GetConfigAttrib(dpy, config, attribute, value);
410}
411
412EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list)
413{
414 return egl::CreateWindowSurface(dpy, config, window, attrib_list);
415}
416
417EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
418{
419 return egl::CreatePbufferSurface(dpy, config, attrib_list);
420}
421
422EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list)
423{
424 return egl::CreatePixmapSurface(dpy, config, pixmap, attrib_list);
425}
426
427EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
428{
429 return egl::DestroySurface(dpy, surface);
430}
431
432EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value)
433{
434 return egl::QuerySurface(dpy, surface, attribute, value);
435}
436
437EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api)
438{
439 return egl::BindAPI(api);
440}
441
442EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void)
443{
444 return egl::QueryAPI();
445}
446
447EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void)
448{
449 return egl::WaitClient();
450}
451
452EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void)
453{
454 return egl::ReleaseThread();
455}
456
457EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list)
458{
459 return egl::CreatePbufferFromClientBuffer(dpy, buftype, buffer, config, attrib_list);
460}
461
462EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
463{
464 return egl::SurfaceAttrib(dpy, surface, attribute, value);
465}
466
467EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
468{
469 return egl::BindTexImage(dpy, surface, buffer);
470}
471
472EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
473{
474 return egl::ReleaseTexImage(dpy, surface, buffer);
475}
476
477EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval)
478{
479 return egl::SwapInterval(dpy, interval);
480}
481
482EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list)
483{
484 return egl::CreateContext(dpy, config, share_context, attrib_list);
485}
486
487EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
488{
489 return egl::DestroyContext(dpy, ctx);
490}
491
492EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
493{
494 return egl::MakeCurrent(dpy, draw, read, ctx);
495}
496
497EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void)
498{
499 return egl::GetCurrentContext();
500}
501
502EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw)
503{
504 return egl::GetCurrentSurface(readdraw);
505}
506
507EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void)
508{
509 return egl::GetCurrentDisplay();
510}
511
512EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
513{
514 return egl::QueryContext(dpy, ctx, attribute, value);
515}
516
517EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void)
518{
519 return egl::WaitClient();
520}
521
522EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine)
523{
524 return egl::WaitNative(engine);
525}
526
527EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
528{
529 return egl::SwapBuffers(dpy, surface);
530}
531
532EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
533{
534 return egl::CopyBuffers(dpy, surface, target);
535}
536
537EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
538{
539 return egl::CreateImageKHR(dpy, ctx, target, buffer, attrib_list);
540}
541
542EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
543{
544 return egl::DestroyImageKHR(dpy, image);
545}
546
547EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list)
548{
549 return egl::GetPlatformDisplayEXT(platform, native_display, attrib_list);
550}
551
552EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list)
553{
554 return egl::CreatePlatformWindowSurfaceEXT(dpy, config, native_window, attrib_list);
555}
556
557EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list)
558{
559 return egl::CreatePlatformPixmapSurfaceEXT(dpy, config, native_pixmap, attrib_list);
560}
561
562EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
563{
564 return egl::CreateSyncKHR(dpy, type, attrib_list);
565}
566
567EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
568{
569 return egl::DestroySyncKHR(dpy, sync);
570}
571
572EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
573{
574 return egl::ClientWaitSyncKHR(dpy, sync, flags, timeout);
575}
576
577EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
578{
579 return egl::GetSyncAttribKHR(dpy, sync, attribute, value);
580}
581
582EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
583{
584 return egl::GetProcAddress(procname);
585}
586}
587
588LibEGLexports::LibEGLexports()
589{
590 this->eglGetError = egl::GetError;
591 this->eglGetDisplay = egl::GetDisplay;
592 this->eglInitialize = egl::Initialize;
593 this->eglTerminate = egl::Terminate;
594 this->eglQueryString = egl::QueryString;
595 this->eglGetConfigs = egl::GetConfigs;
596 this->eglChooseConfig = egl::ChooseConfig;
597 this->eglGetConfigAttrib = egl::GetConfigAttrib;
598 this->eglCreateWindowSurface = egl::CreateWindowSurface;
599 this->eglCreatePbufferSurface = egl::CreatePbufferSurface;
600 this->eglCreatePixmapSurface = egl::CreatePixmapSurface;
601 this->eglDestroySurface = egl::DestroySurface;
602 this->eglQuerySurface = egl::QuerySurface;
603 this->eglBindAPI = egl::BindAPI;
604 this->eglQueryAPI = egl::QueryAPI;
605 this->eglWaitClient = egl::WaitClient;
606 this->eglReleaseThread = egl::ReleaseThread;
607 this->eglCreatePbufferFromClientBuffer = egl::CreatePbufferFromClientBuffer;
608 this->eglSurfaceAttrib = egl::SurfaceAttrib;
609 this->eglBindTexImage = egl::BindTexImage;
610 this->eglReleaseTexImage = egl::ReleaseTexImage;
611 this->eglSwapInterval = egl::SwapInterval;
612 this->eglCreateContext = egl::CreateContext;
613 this->eglDestroyContext = egl::DestroyContext;
614 this->eglMakeCurrent = egl::MakeCurrent;
615 this->eglGetCurrentContext = egl::GetCurrentContext;
616 this->eglGetCurrentSurface = egl::GetCurrentSurface;
617 this->eglGetCurrentDisplay = egl::GetCurrentDisplay;
618 this->eglQueryContext = egl::QueryContext;
619 this->eglWaitGL = egl::WaitGL;
620 this->eglWaitNative = egl::WaitNative;
621 this->eglSwapBuffers = egl::SwapBuffers;
622 this->eglCopyBuffers = egl::CopyBuffers;
623 this->eglCreateImageKHR = egl::CreateImageKHR;
624 this->eglDestroyImageKHR = egl::DestroyImageKHR;
625 this->eglGetProcAddress = egl::GetProcAddress;
626 this->eglCreateSyncKHR = egl::CreateSyncKHR;
627 this->eglDestroySyncKHR = egl::DestroySyncKHR;
628 this->eglClientWaitSyncKHR = egl::ClientWaitSyncKHR;
629 this->eglGetSyncAttribKHR = egl::GetSyncAttribKHR;
630
631 this->clientGetCurrentContext = egl::getCurrentContext;
632}
633
634extern "C" EGLAPI LibEGLexports *libEGL_swiftshader()
635{
636 static LibEGLexports libEGL;
637 return &libEGL;
638}
639
640LibGLES_CM libGLES_CM;
641LibGLESv2 libGLESv2;