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