blob: 0ef957ce639ed6173842799c9b78247e1f622d0e [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"
Chris Forbes1aae88c2018-09-11 17:31:52 -070022#include "Display.h"
Nicolas Capens0bac2852016-05-07 06:09:58 -040023
24#include "resource.h"
25#include "Common/Thread.hpp"
26#include "Common/SharedLibrary.hpp"
27#include "common/debug.h"
28
29#include <EGL/eglext.h>
30
31static sw::Thread::LocalStorageKey currentTLS = TLS_OUT_OF_INDEXES;
32
33#if !defined(_MSC_VER)
34#define CONSTRUCTOR __attribute__((constructor))
35#define DESTRUCTOR __attribute__((destructor))
36#else
37#define CONSTRUCTOR
38#define DESTRUCTOR
39#endif
40
Nicolas Capensaf93a422016-06-12 16:11:25 -040041namespace egl
42{
David Rim10bcdb42018-04-06 17:48:41 +090043void releaseCurrent(void *storage)
44{
45 // This pthread destructor is called after the TLS is already reset to NULL,
46 // so we can't call EGL functions here to do the cleanup.
47
48 Current *current = (Current*)storage;
49
50 if(current)
51 {
52 if(current->drawSurface)
53 {
54 current->drawSurface->release();
55 }
56
57 if(current->readSurface)
58 {
59 current->readSurface->release();
60 }
61
62 if(current->context)
63 {
64 current->context->release();
65 }
66
67 free(current);
68 }
69}
70
Nicolas Capens420b64d2017-07-07 17:01:16 -040071Current *attachThread()
Nicolas Capens0bac2852016-05-07 06:09:58 -040072{
73 TRACE("()");
74
Nicolas Capens420b64d2017-07-07 17:01:16 -040075 if(currentTLS == TLS_OUT_OF_INDEXES)
Nicolas Capens0bac2852016-05-07 06:09:58 -040076 {
David Rim10bcdb42018-04-06 17:48:41 +090077 currentTLS = sw::Thread::allocateLocalStorageKey(releaseCurrent);
Nicolas Capens0bac2852016-05-07 06:09:58 -040078 }
Nicolas Capens420b64d2017-07-07 17:01:16 -040079
Nicolas Capens4ad365b2017-09-12 16:39:42 -040080 Current *current = (Current*)sw::Thread::allocateLocalStorage(currentTLS, sizeof(Current));
Nicolas Capens420b64d2017-07-07 17:01:16 -040081
82 current->error = EGL_SUCCESS;
83 current->API = EGL_OPENGL_ES_API;
84 current->context = nullptr;
85 current->drawSurface = nullptr;
86 current->readSurface = nullptr;
87
88 return current;
Nicolas Capens0bac2852016-05-07 06:09:58 -040089}
90
Nicolas Capensaf93a422016-06-12 16:11:25 -040091void detachThread()
Nicolas Capens0bac2852016-05-07 06:09:58 -040092{
93 TRACE("()");
94
Nicolas Capenscc5c7d92016-06-13 14:35:11 -040095 eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_CONTEXT, EGL_NO_SURFACE, EGL_NO_SURFACE);
96
Nicolas Capens4ad365b2017-09-12 16:39:42 -040097 sw::Thread::freeLocalStorage(currentTLS);
Nicolas Capens0bac2852016-05-07 06:09:58 -040098}
99
Nicolas Capensaf93a422016-06-12 16:11:25 -0400100CONSTRUCTOR void attachProcess()
Nicolas Capens0bac2852016-05-07 06:09:58 -0400101{
102 TRACE("()");
103
104 #if !defined(ANGLE_DISABLE_TRACE) && defined(TRACE_OUTPUT_FILE)
105 FILE *debug = fopen(TRACE_OUTPUT_FILE, "rt");
106
107 if(debug)
108 {
109 fclose(debug);
110 debug = fopen(TRACE_OUTPUT_FILE, "wt"); // Erase
111 fclose(debug);
112 }
113 #endif
114
Nicolas Capensaf93a422016-06-12 16:11:25 -0400115 attachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400116}
117
Nicolas Capensaf93a422016-06-12 16:11:25 -0400118DESTRUCTOR void detachProcess()
Nicolas Capens0bac2852016-05-07 06:09:58 -0400119{
120 TRACE("()");
121
Nicolas Capensaf93a422016-06-12 16:11:25 -0400122 detachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400123 sw::Thread::freeLocalStorageKey(currentTLS);
124}
Nicolas Capensaf93a422016-06-12 16:11:25 -0400125}
Nicolas Capens0bac2852016-05-07 06:09:58 -0400126
127#if defined(_WIN32)
Alexis Hetu8e942eb2017-03-16 10:53:01 -0400128#ifdef DEBUGGER_WAIT_DIALOG
Nicolas Capens0bac2852016-05-07 06:09:58 -0400129static INT_PTR CALLBACK DebuggerWaitDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
130{
131 RECT rect;
132
133 switch(uMsg)
134 {
135 case WM_INITDIALOG:
136 GetWindowRect(GetDesktopWindow(), &rect);
137 SetWindowPos(hwnd, HWND_TOP, rect.right / 2, rect.bottom / 2, 0, 0, SWP_NOSIZE);
138 SetTimer(hwnd, 1, 100, NULL);
139 return TRUE;
140 case WM_COMMAND:
141 if(LOWORD(wParam) == IDCANCEL)
142 {
143 EndDialog(hwnd, 0);
144 }
145 break;
146 case WM_TIMER:
147 if(IsDebuggerPresent())
148 {
149 EndDialog(hwnd, 0);
150 }
151 }
152
153 return FALSE;
154}
155
156static void WaitForDebugger(HINSTANCE instance)
157{
158 if(!IsDebuggerPresent())
159 {
160 HRSRC dialog = FindResource(instance, MAKEINTRESOURCE(IDD_DIALOG1), RT_DIALOG);
161 DLGTEMPLATE *dialogTemplate = (DLGTEMPLATE*)LoadResource(instance, dialog);
162 DialogBoxIndirect(instance, dialogTemplate, NULL, DebuggerWaitDialogProc);
163 }
164}
Alexis Hetue97a31e2016-11-14 14:10:47 -0500165#endif
Nicolas Capens0bac2852016-05-07 06:09:58 -0400166
167extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
168{
169 switch(reason)
170 {
171 case DLL_PROCESS_ATTACH:
Alexis Hetu38182312017-03-16 11:46:16 -0400172 #ifdef DEBUGGER_WAIT_DIALOG
Nicolas Capens0bac2852016-05-07 06:09:58 -0400173 WaitForDebugger(instance);
174 #endif
Nicolas Capensaf93a422016-06-12 16:11:25 -0400175 egl::attachProcess();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400176 break;
177 case DLL_THREAD_ATTACH:
Nicolas Capensaf93a422016-06-12 16:11:25 -0400178 egl::attachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400179 break;
180 case DLL_THREAD_DETACH:
Nicolas Capensaf93a422016-06-12 16:11:25 -0400181 egl::detachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400182 break;
183 case DLL_PROCESS_DETACH:
Nicolas Capensaf93a422016-06-12 16:11:25 -0400184 egl::detachProcess();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400185 break;
186 default:
187 break;
188 }
189
190 return TRUE;
191}
192#endif
193
194namespace egl
195{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400196static Current *getCurrent(void)
Nicolas Capens0bac2852016-05-07 06:09:58 -0400197{
198 Current *current = (Current*)sw::Thread::getLocalStorage(currentTLS);
199
200 if(!current)
201 {
Nicolas Capens420b64d2017-07-07 17:01:16 -0400202 current = attachThread();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400203 }
204
Nicolas Capens420b64d2017-07-07 17:01:16 -0400205 return current;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400206}
207
208void setCurrentError(EGLint error)
209{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400210 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400211
212 current->error = error;
213}
214
215EGLint getCurrentError()
216{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400217 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400218
219 return current->error;
220}
221
222void setCurrentAPI(EGLenum API)
223{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400224 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400225
226 current->API = API;
227}
228
229EGLenum getCurrentAPI()
230{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400231 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400232
233 return current->API;
234}
235
Nicolas Capens0bac2852016-05-07 06:09:58 -0400236void setCurrentContext(egl::Context *ctx)
237{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400238 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400239
240 if(ctx)
241 {
242 ctx->addRef();
243 }
244
245 if(current->context)
246 {
247 current->context->release();
248 }
249
250 current->context = ctx;
251}
252
Nicolas Capens506cc5e2017-07-24 11:30:55 -0400253NO_SANITIZE_FUNCTION egl::Context *getCurrentContext()
Nicolas Capens0bac2852016-05-07 06:09:58 -0400254{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400255 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400256
257 return current->context;
258}
259
260void setCurrentDrawSurface(egl::Surface *surface)
261{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400262 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400263
264 if(surface)
265 {
266 surface->addRef();
267 }
268
269 if(current->drawSurface)
270 {
271 current->drawSurface->release();
272 }
273
274 current->drawSurface = surface;
275}
276
277egl::Surface *getCurrentDrawSurface()
278{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400279 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400280
281 return current->drawSurface;
282}
283
284void setCurrentReadSurface(egl::Surface *surface)
285{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400286 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400287
288 if(surface)
289 {
290 surface->addRef();
291 }
292
293 if(current->readSurface)
294 {
295 current->readSurface->release();
296 }
297
298 current->readSurface = surface;
299}
300
301egl::Surface *getCurrentReadSurface()
302{
Nicolas Capensaf93a422016-06-12 16:11:25 -0400303 Current *current = getCurrent();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400304
305 return current->readSurface;
306}
307
308void error(EGLint errorCode)
309{
310 egl::setCurrentError(errorCode);
311
312 if(errorCode != EGL_SUCCESS)
313 {
314 switch(errorCode)
315 {
316 case EGL_NOT_INITIALIZED: TRACE("\t! Error generated: not initialized\n"); break;
317 case EGL_BAD_ACCESS: TRACE("\t! Error generated: bad access\n"); break;
318 case EGL_BAD_ALLOC: TRACE("\t! Error generated: bad alloc\n"); break;
319 case EGL_BAD_ATTRIBUTE: TRACE("\t! Error generated: bad attribute\n"); break;
320 case EGL_BAD_CONFIG: TRACE("\t! Error generated: bad config\n"); break;
321 case EGL_BAD_CONTEXT: TRACE("\t! Error generated: bad context\n"); break;
322 case EGL_BAD_CURRENT_SURFACE: TRACE("\t! Error generated: bad current surface\n"); break;
323 case EGL_BAD_DISPLAY: TRACE("\t! Error generated: bad display\n"); break;
324 case EGL_BAD_MATCH: TRACE("\t! Error generated: bad match\n"); break;
325 case EGL_BAD_NATIVE_PIXMAP: TRACE("\t! Error generated: bad native pixmap\n"); break;
326 case EGL_BAD_NATIVE_WINDOW: TRACE("\t! Error generated: bad native window\n"); break;
327 case EGL_BAD_PARAMETER: TRACE("\t! Error generated: bad parameter\n"); break;
328 case EGL_BAD_SURFACE: TRACE("\t! Error generated: bad surface\n"); break;
329 case EGL_CONTEXT_LOST: TRACE("\t! Error generated: context lost\n"); break;
330 default: TRACE("\t! Error generated: <0x%X>\n", errorCode); break;
331 }
332 }
333}
Chris Forbes1aae88c2018-09-11 17:31:52 -0700334
335sw::MutexLock *getDisplayLock(EGLDisplay dpy)
336{
337 auto display = Display::get(dpy);
338 if (!display) return nullptr;
339 return display->getLock();
340}
Nicolas Capens0bac2852016-05-07 06:09:58 -0400341}
342
343namespace egl
344{
345EGLint GetError(void);
346EGLDisplay GetDisplay(EGLNativeDisplayType display_id);
347EGLBoolean Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
348EGLBoolean Terminate(EGLDisplay dpy);
349const char *QueryString(EGLDisplay dpy, EGLint name);
350EGLBoolean GetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
351EGLBoolean ChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
352EGLBoolean GetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
353EGLSurface CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list);
354EGLSurface CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
355EGLSurface CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);
356EGLBoolean DestroySurface(EGLDisplay dpy, EGLSurface surface);
357EGLBoolean QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
358EGLBoolean BindAPI(EGLenum api);
359EGLenum QueryAPI(void);
360EGLBoolean WaitClient(void);
361EGLBoolean ReleaseThread(void);
362EGLSurface CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);
363EGLBoolean SurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
364EGLBoolean BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
365EGLBoolean ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
366EGLBoolean SwapInterval(EGLDisplay dpy, EGLint interval);
367EGLContext CreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
368EGLBoolean DestroyContext(EGLDisplay dpy, EGLContext ctx);
369EGLBoolean MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
370EGLContext GetCurrentContext(void);
371EGLSurface GetCurrentSurface(EGLint readdraw);
372EGLDisplay GetCurrentDisplay(void);
373EGLBoolean QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
374EGLBoolean WaitGL(void);
375EGLBoolean WaitNative(EGLint engine);
376EGLBoolean SwapBuffers(EGLDisplay dpy, EGLSurface surface);
377EGLBoolean CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
378EGLImageKHR CreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
Nicolas Capens48908cb2018-01-08 13:07:14 -0500379EGLImageKHR CreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400380EGLBoolean DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image);
381EGLDisplay GetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list);
Nicolas Capens48908cb2018-01-08 13:07:14 -0500382EGLDisplay GetPlatformDisplay(EGLenum platform, void *native_display, const EGLAttrib *attrib_list);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400383EGLSurface CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);
Nicolas Capens48908cb2018-01-08 13:07:14 -0500384EGLSurface CreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400385EGLSurface CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);
Nicolas Capens48908cb2018-01-08 13:07:14 -0500386EGLSurface CreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400387EGLSyncKHR CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
Nicolas Capens48908cb2018-01-08 13:07:14 -0500388EGLSyncKHR CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400389EGLBoolean DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync);
390EGLint ClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
391EGLBoolean GetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
Nicolas Capens48908cb2018-01-08 13:07:14 -0500392EGLBoolean GetSyncAttrib(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLAttrib *value);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400393__eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname);
394}
395
396extern "C"
397{
398EGLAPI EGLint EGLAPIENTRY eglGetError(void)
399{
400 return egl::GetError();
401}
402
403EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id)
404{
405 return egl::GetDisplay(display_id);
406}
407
408EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
409{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700410 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400411 return egl::Initialize(dpy, major, minor);
412}
413
414EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy)
415{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700416 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400417 return egl::Terminate(dpy);
418}
419
420EGLAPI const char *EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name)
421{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700422 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400423 return egl::QueryString(dpy, name);
424}
425
426EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config)
427{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700428 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400429 return egl::GetConfigs(dpy, configs, config_size, num_config);
430}
431
432EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config)
433{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700434 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400435 return egl::ChooseConfig(dpy, attrib_list, configs, config_size, num_config);
436}
437
438EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value)
439{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700440 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400441 return egl::GetConfigAttrib(dpy, config, attribute, value);
442}
443
444EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list)
445{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700446 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400447 return egl::CreateWindowSurface(dpy, config, window, attrib_list);
448}
449
450EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
451{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700452 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400453 return egl::CreatePbufferSurface(dpy, config, attrib_list);
454}
455
456EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list)
457{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700458 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400459 return egl::CreatePixmapSurface(dpy, config, pixmap, attrib_list);
460}
461
462EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
463{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700464 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400465 return egl::DestroySurface(dpy, surface);
466}
467
468EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value)
469{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700470 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400471 return egl::QuerySurface(dpy, surface, attribute, value);
472}
473
474EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api)
475{
476 return egl::BindAPI(api);
477}
478
479EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void)
480{
481 return egl::QueryAPI();
482}
483
484EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void)
485{
486 return egl::WaitClient();
487}
488
489EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void)
490{
491 return egl::ReleaseThread();
492}
493
494EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list)
495{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700496 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400497 return egl::CreatePbufferFromClientBuffer(dpy, buftype, buffer, config, attrib_list);
498}
499
500EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
501{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700502 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400503 return egl::SurfaceAttrib(dpy, surface, attribute, value);
504}
505
506EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
507{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700508 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400509 return egl::BindTexImage(dpy, surface, buffer);
510}
511
512EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
513{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700514 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400515 return egl::ReleaseTexImage(dpy, surface, buffer);
516}
517
518EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval)
519{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700520 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400521 return egl::SwapInterval(dpy, interval);
522}
523
524EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list)
525{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700526 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400527 return egl::CreateContext(dpy, config, share_context, attrib_list);
528}
529
530EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
531{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700532 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400533 return egl::DestroyContext(dpy, ctx);
534}
535
536EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
537{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700538 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400539 return egl::MakeCurrent(dpy, draw, read, ctx);
540}
541
542EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void)
543{
544 return egl::GetCurrentContext();
545}
546
547EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw)
548{
549 return egl::GetCurrentSurface(readdraw);
550}
551
552EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void)
553{
554 return egl::GetCurrentDisplay();
555}
556
557EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
558{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700559 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400560 return egl::QueryContext(dpy, ctx, attribute, value);
561}
562
563EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void)
564{
565 return egl::WaitClient();
566}
567
568EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine)
569{
570 return egl::WaitNative(engine);
571}
572
573EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
574{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700575 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400576 return egl::SwapBuffers(dpy, surface);
577}
578
579EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
580{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700581 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400582 return egl::CopyBuffers(dpy, surface, target);
583}
584
585EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
586{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700587 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400588 return egl::CreateImageKHR(dpy, ctx, target, buffer, attrib_list);
589}
590
Nicolas Capens48908cb2018-01-08 13:07:14 -0500591EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list)
592{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700593 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens48908cb2018-01-08 13:07:14 -0500594 return egl::CreateImage(dpy, ctx, target, buffer, attrib_list);
595}
596
Nicolas Capens0bac2852016-05-07 06:09:58 -0400597EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
598{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700599 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400600 return egl::DestroyImageKHR(dpy, image);
601}
602
Nicolas Capens48908cb2018-01-08 13:07:14 -0500603EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImage(EGLDisplay dpy, EGLImageKHR image)
604{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700605 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens48908cb2018-01-08 13:07:14 -0500606 return egl::DestroyImageKHR(dpy, image);
607}
608
Nicolas Capens0bac2852016-05-07 06:09:58 -0400609EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list)
610{
611 return egl::GetPlatformDisplayEXT(platform, native_display, attrib_list);
612}
613
Nicolas Capens48908cb2018-01-08 13:07:14 -0500614EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplay(EGLenum platform, void *native_display, const EGLAttrib *attrib_list)
615{
616 return egl::GetPlatformDisplay(platform, native_display, attrib_list);
617}
618
Nicolas Capens0bac2852016-05-07 06:09:58 -0400619EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list)
620{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700621 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400622 return egl::CreatePlatformWindowSurfaceEXT(dpy, config, native_window, attrib_list);
623}
624
Nicolas Capens48908cb2018-01-08 13:07:14 -0500625EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list)
626{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700627 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens48908cb2018-01-08 13:07:14 -0500628 return egl::CreatePlatformWindowSurface(dpy, config, native_window, attrib_list);
629}
630
Nicolas Capens0bac2852016-05-07 06:09:58 -0400631EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list)
632{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700633 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400634 return egl::CreatePlatformPixmapSurfaceEXT(dpy, config, native_pixmap, attrib_list);
635}
636
Nicolas Capens48908cb2018-01-08 13:07:14 -0500637EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list)
638{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700639 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens48908cb2018-01-08 13:07:14 -0500640 return egl::CreatePlatformPixmapSurface(dpy, config, native_pixmap, attrib_list);
641}
642
Nicolas Capens0bac2852016-05-07 06:09:58 -0400643EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
644{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700645 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400646 return egl::CreateSyncKHR(dpy, type, attrib_list);
647}
648
Nicolas Capens48908cb2018-01-08 13:07:14 -0500649EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
650{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700651 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens48908cb2018-01-08 13:07:14 -0500652 return egl::CreateSync(dpy, type, attrib_list);
653}
654
Nicolas Capens0bac2852016-05-07 06:09:58 -0400655EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
656{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700657 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400658 return egl::DestroySyncKHR(dpy, sync);
659}
660
Nicolas Capens48908cb2018-01-08 13:07:14 -0500661EGLAPI EGLBoolean EGLAPIENTRY eglDestroySync(EGLDisplay dpy, EGLSyncKHR sync)
662{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700663 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens48908cb2018-01-08 13:07:14 -0500664 return egl::DestroySyncKHR(dpy, sync);
665}
666
Nicolas Capens0bac2852016-05-07 06:09:58 -0400667EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
668{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700669 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400670 return egl::ClientWaitSyncKHR(dpy, sync, flags, timeout);
671}
672
Nicolas Capens48908cb2018-01-08 13:07:14 -0500673EGLAPI EGLint EGLAPIENTRY eglClientWaitSync(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
674{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700675 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens48908cb2018-01-08 13:07:14 -0500676 return egl::ClientWaitSyncKHR(dpy, sync, flags, timeout);
677}
678
Nicolas Capens0bac2852016-05-07 06:09:58 -0400679EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
680{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700681 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens0bac2852016-05-07 06:09:58 -0400682 return egl::GetSyncAttribKHR(dpy, sync, attribute, value);
683}
684
Nicolas Capens48908cb2018-01-08 13:07:14 -0500685EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttrib(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLAttrib *value)
686{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700687 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens48908cb2018-01-08 13:07:14 -0500688 return egl::GetSyncAttrib(dpy, sync, attribute, value);
689}
690
691EGLAPI EGLint EGLAPIENTRY eglWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags)
692{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700693 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens48908cb2018-01-08 13:07:14 -0500694 return egl::ClientWaitSyncKHR(dpy, sync, flags, EGL_FOREVER_KHR);
695}
696
697EGLAPI EGLBoolean EGLAPIENTRY eglWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags)
698{
Chris Forbes1aae88c2018-09-11 17:31:52 -0700699 LockGuard lock(egl::getDisplayLock(dpy));
Nicolas Capens48908cb2018-01-08 13:07:14 -0500700 return egl::ClientWaitSyncKHR(dpy, sync, flags, EGL_FOREVER_KHR);
701}
702
Nicolas Capens0bac2852016-05-07 06:09:58 -0400703EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
704{
705 return egl::GetProcAddress(procname);
706}
707}
708
709LibEGLexports::LibEGLexports()
710{
711 this->eglGetError = egl::GetError;
712 this->eglGetDisplay = egl::GetDisplay;
713 this->eglInitialize = egl::Initialize;
714 this->eglTerminate = egl::Terminate;
715 this->eglQueryString = egl::QueryString;
716 this->eglGetConfigs = egl::GetConfigs;
717 this->eglChooseConfig = egl::ChooseConfig;
718 this->eglGetConfigAttrib = egl::GetConfigAttrib;
719 this->eglCreateWindowSurface = egl::CreateWindowSurface;
720 this->eglCreatePbufferSurface = egl::CreatePbufferSurface;
721 this->eglCreatePixmapSurface = egl::CreatePixmapSurface;
722 this->eglDestroySurface = egl::DestroySurface;
723 this->eglQuerySurface = egl::QuerySurface;
724 this->eglBindAPI = egl::BindAPI;
725 this->eglQueryAPI = egl::QueryAPI;
726 this->eglWaitClient = egl::WaitClient;
727 this->eglReleaseThread = egl::ReleaseThread;
728 this->eglCreatePbufferFromClientBuffer = egl::CreatePbufferFromClientBuffer;
729 this->eglSurfaceAttrib = egl::SurfaceAttrib;
730 this->eglBindTexImage = egl::BindTexImage;
731 this->eglReleaseTexImage = egl::ReleaseTexImage;
732 this->eglSwapInterval = egl::SwapInterval;
733 this->eglCreateContext = egl::CreateContext;
734 this->eglDestroyContext = egl::DestroyContext;
735 this->eglMakeCurrent = egl::MakeCurrent;
736 this->eglGetCurrentContext = egl::GetCurrentContext;
737 this->eglGetCurrentSurface = egl::GetCurrentSurface;
738 this->eglGetCurrentDisplay = egl::GetCurrentDisplay;
739 this->eglQueryContext = egl::QueryContext;
740 this->eglWaitGL = egl::WaitGL;
741 this->eglWaitNative = egl::WaitNative;
742 this->eglSwapBuffers = egl::SwapBuffers;
743 this->eglCopyBuffers = egl::CopyBuffers;
744 this->eglCreateImageKHR = egl::CreateImageKHR;
745 this->eglDestroyImageKHR = egl::DestroyImageKHR;
746 this->eglGetProcAddress = egl::GetProcAddress;
747 this->eglCreateSyncKHR = egl::CreateSyncKHR;
748 this->eglDestroySyncKHR = egl::DestroySyncKHR;
749 this->eglClientWaitSyncKHR = egl::ClientWaitSyncKHR;
750 this->eglGetSyncAttribKHR = egl::GetSyncAttribKHR;
751
752 this->clientGetCurrentContext = egl::getCurrentContext;
753}
754
Alexis Hetu2a0def72018-05-14 08:16:05 -0400755extern "C" EGLAPI LibEGLexports *libEGL_swiftshader()
Nicolas Capens0bac2852016-05-07 06:09:58 -0400756{
757 static LibEGLexports libEGL;
758 return &libEGL;
759}
760
Nicolas Capens5e1520f2018-07-03 16:13:28 -0400761LibGLES_CM libGLES_CM;
762LibGLESv2 libGLESv2;