blob: 5903f72a6e86dd037aafc07bc4f747ba8fc91ed7 [file] [log] [blame]
Geoff Lange7c6e432014-12-03 14:48:07 -05001//
2// Copyright(c) 2014 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// entry_points_egl.cpp : Implements the EGL entry points.
8
9#include "libGLESv2/entry_points_egl.h"
10#include "libGLESv2/entry_points_egl_ext.h"
Jamie Madill2e16d962017-04-19 14:06:36 -040011#include "libGLESv2/entry_points_gles_2_0_autogen.h"
Geoff Lange7c6e432014-12-03 14:48:07 -050012#include "libGLESv2/entry_points_gles_2_0_ext.h"
Geoff Lang55659362015-08-26 13:39:59 -040013#include "libGLESv2/entry_points_gles_3_0.h"
Martin Radevee7e1e22016-07-18 15:39:47 +030014#include "libGLESv2/entry_points_gles_3_1.h"
Geoff Lange7c6e432014-12-03 14:48:07 -050015#include "libGLESv2/global_state.h"
16
17#include "libANGLE/Context.h"
18#include "libANGLE/Display.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040019#include "libANGLE/Surface.h"
Geoff Lange7c6e432014-12-03 14:48:07 -050020#include "libANGLE/Texture.h"
Geoff Lang7b8f3c92016-11-10 10:42:48 -050021#include "libANGLE/Thread.h"
Geoff Lang65603eb2017-01-12 16:48:03 -050022#include "libANGLE/queryutils.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040023#include "libANGLE/validationEGL.h"
Geoff Lange7c6e432014-12-03 14:48:07 -050024
25#include "common/debug.h"
26#include "common/version.h"
27
Corentin Wallez64598b52016-11-11 08:25:44 -050028#include "platform/Platform.h"
29
Geoff Lange7c6e432014-12-03 14:48:07 -050030#include <EGL/eglext.h>
31
32namespace egl
33{
34
Geoff Lang65603eb2017-01-12 16:48:03 -050035namespace
36{
37
38void ClipConfigs(const std::vector<const Config *> &filteredConfigs,
39 EGLConfig *output_configs,
40 EGLint config_size,
41 EGLint *num_config)
42{
43 EGLint result_size = static_cast<EGLint>(filteredConfigs.size());
44 if (output_configs)
45 {
46 result_size = std::max(std::min(result_size, config_size), 0);
47 for (EGLint i = 0; i < result_size; i++)
48 {
49 output_configs[i] = const_cast<Config *>(filteredConfigs[i]);
50 }
51 }
52 *num_config = result_size;
53}
54
55} // anonymous namespace
56
Geoff Lange7c6e432014-12-03 14:48:07 -050057// EGL 1.0
Geoff Lang130e6e82014-12-05 12:17:40 -050058EGLint EGLAPIENTRY GetError(void)
Geoff Lange7c6e432014-12-03 14:48:07 -050059{
60 EVENT("()");
Geoff Lang7b8f3c92016-11-10 10:42:48 -050061 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -050062
Geoff Lang7b8f3c92016-11-10 10:42:48 -050063 EGLint error = thread->getError();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -050064 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -050065 return error;
66}
67
Geoff Lang130e6e82014-12-05 12:17:40 -050068EGLDisplay EGLAPIENTRY GetDisplay(EGLNativeDisplayType display_id)
Geoff Lange7c6e432014-12-03 14:48:07 -050069{
70 EVENT("(EGLNativeDisplayType display_id = 0x%0.8p)", display_id);
71
Geoff Lange70413c2017-01-12 16:35:17 -050072 return Display::GetDisplayFromNativeDisplay(display_id, AttributeMap());
Geoff Lange7c6e432014-12-03 14:48:07 -050073}
74
Geoff Lang130e6e82014-12-05 12:17:40 -050075EGLBoolean EGLAPIENTRY Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
Geoff Lange7c6e432014-12-03 14:48:07 -050076{
Geoff Lang7b8f3c92016-11-10 10:42:48 -050077 EVENT("(EGLDisplay dpy = 0x%0.8p, EGLint *major = 0x%0.8p, EGLint *minor = 0x%0.8p)", dpy,
78 major, minor);
79 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -050080
Austin Kinross26d84352015-11-02 11:08:16 -080081 Display *display = static_cast<Display *>(dpy);
82 if (dpy == EGL_NO_DISPLAY || !Display::isValidDisplay(display))
Geoff Lange7c6e432014-12-03 14:48:07 -050083 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -050084 thread->setError(EglBadDisplay());
Geoff Lange7c6e432014-12-03 14:48:07 -050085 return EGL_FALSE;
86 }
87
Geoff Lange7c6e432014-12-03 14:48:07 -050088 Error error = display->initialize();
89 if (error.isError())
90 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -050091 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -050092 return EGL_FALSE;
93 }
94
Jamie Madill231c7f52017-04-26 13:45:37 -040095 if (major)
96 *major = 1;
97 if (minor)
98 *minor = 4;
Geoff Lange7c6e432014-12-03 14:48:07 -050099
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500100 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500101 return EGL_TRUE;
102}
103
Geoff Lang130e6e82014-12-05 12:17:40 -0500104EGLBoolean EGLAPIENTRY Terminate(EGLDisplay dpy)
Geoff Lange7c6e432014-12-03 14:48:07 -0500105{
106 EVENT("(EGLDisplay dpy = 0x%0.8p)", dpy);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500107 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500108
Austin Kinross26d84352015-11-02 11:08:16 -0800109 Display *display = static_cast<Display *>(dpy);
110 if (dpy == EGL_NO_DISPLAY || !Display::isValidDisplay(display))
Geoff Lange7c6e432014-12-03 14:48:07 -0500111 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500112 thread->setError(EglBadDisplay());
Geoff Lange7c6e432014-12-03 14:48:07 -0500113 return EGL_FALSE;
114 }
115
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500116 if (display->isValidContext(thread->getContext()))
Geoff Lange7c6e432014-12-03 14:48:07 -0500117 {
Jamie Madill61e16b42017-06-19 11:13:23 -0400118 thread->setCurrent(nullptr);
Geoff Lange7c6e432014-12-03 14:48:07 -0500119 }
120
Jamie Madill4928b7c2017-06-20 12:57:39 -0400121 Error error = display->terminate();
122 if (error.isError())
123 {
124 thread->setError(error);
125 return EGL_FALSE;
126 }
Geoff Lange7c6e432014-12-03 14:48:07 -0500127
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500128 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500129 return EGL_TRUE;
130}
131
Geoff Lang130e6e82014-12-05 12:17:40 -0500132const char *EGLAPIENTRY QueryString(EGLDisplay dpy, EGLint name)
Geoff Lange7c6e432014-12-03 14:48:07 -0500133{
134 EVENT("(EGLDisplay dpy = 0x%0.8p, EGLint name = %d)", dpy, name);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500135 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500136
Jamie Madill231c7f52017-04-26 13:45:37 -0400137 Display *display = static_cast<Display *>(dpy);
Geoff Langdd43fcc2015-01-19 15:44:17 -0500138 if (!(display == EGL_NO_DISPLAY && name == EGL_EXTENSIONS))
Geoff Lange7c6e432014-12-03 14:48:07 -0500139 {
Geoff Langdd43fcc2015-01-19 15:44:17 -0500140 Error error = ValidateDisplay(display);
141 if (error.isError())
142 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500143 thread->setError(error);
Yunchao Hef81ce4a2017-04-24 10:49:17 +0800144 return nullptr;
Geoff Langdd43fcc2015-01-19 15:44:17 -0500145 }
Geoff Lange7c6e432014-12-03 14:48:07 -0500146 }
147
148 const char *result;
149 switch (name)
150 {
Jamie Madill231c7f52017-04-26 13:45:37 -0400151 case EGL_CLIENT_APIS:
152 result = "OpenGL_ES";
153 break;
154 case EGL_EXTENSIONS:
155 if (display == EGL_NO_DISPLAY)
156 {
Jamie Madill948bbe52017-06-01 13:10:42 -0400157 result = Display::GetClientExtensionString().c_str();
Jamie Madill231c7f52017-04-26 13:45:37 -0400158 }
159 else
160 {
161 result = display->getExtensionString().c_str();
162 }
163 break;
164 case EGL_VENDOR:
165 result = display->getVendorString().c_str();
166 break;
167 case EGL_VERSION:
168 result = "1.4 (ANGLE " ANGLE_VERSION_STRING ")";
169 break;
170 default:
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500171 thread->setError(EglBadParameter());
Jamie Madill231c7f52017-04-26 13:45:37 -0400172 return nullptr;
Geoff Lange7c6e432014-12-03 14:48:07 -0500173 }
174
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500175 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500176 return result;
177}
178
Jamie Madill231c7f52017-04-26 13:45:37 -0400179EGLBoolean EGLAPIENTRY GetConfigs(EGLDisplay dpy,
180 EGLConfig *configs,
181 EGLint config_size,
182 EGLint *num_config)
Geoff Lange7c6e432014-12-03 14:48:07 -0500183{
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500184 EVENT(
185 "(EGLDisplay dpy = 0x%0.8p, EGLConfig *configs = 0x%0.8p, "
186 "EGLint config_size = %d, EGLint *num_config = 0x%0.8p)",
187 dpy, configs, config_size, num_config);
188 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500189
Jamie Madill231c7f52017-04-26 13:45:37 -0400190 Display *display = static_cast<Display *>(dpy);
Geoff Lange7c6e432014-12-03 14:48:07 -0500191
Geoff Lang65603eb2017-01-12 16:48:03 -0500192 Error error = ValidateGetConfigs(display, config_size, num_config);
Geoff Langdd43fcc2015-01-19 15:44:17 -0500193 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500194 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500195 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500196 return EGL_FALSE;
197 }
198
Geoff Lang65603eb2017-01-12 16:48:03 -0500199 ClipConfigs(display->getConfigs(AttributeMap()), configs, config_size, num_config);
Geoff Lange7c6e432014-12-03 14:48:07 -0500200
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500201 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500202 return EGL_TRUE;
203}
204
Jamie Madill231c7f52017-04-26 13:45:37 -0400205EGLBoolean EGLAPIENTRY ChooseConfig(EGLDisplay dpy,
206 const EGLint *attrib_list,
207 EGLConfig *configs,
208 EGLint config_size,
209 EGLint *num_config)
Geoff Lange7c6e432014-12-03 14:48:07 -0500210{
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500211 EVENT(
212 "(EGLDisplay dpy = 0x%0.8p, const EGLint *attrib_list = 0x%0.8p, "
213 "EGLConfig *configs = 0x%0.8p, EGLint config_size = %d, EGLint *num_config = 0x%0.8p)",
214 dpy, attrib_list, configs, config_size, num_config);
215 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500216
Jamie Madill231c7f52017-04-26 13:45:37 -0400217 Display *display = static_cast<Display *>(dpy);
Geoff Lang65603eb2017-01-12 16:48:03 -0500218 AttributeMap attribMap = AttributeMap::CreateFromIntArray(attrib_list);
Geoff Lange7c6e432014-12-03 14:48:07 -0500219
Geoff Lang65603eb2017-01-12 16:48:03 -0500220 Error error = ValidateChooseConfig(display, attribMap, config_size, num_config);
Geoff Langdd43fcc2015-01-19 15:44:17 -0500221 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500222 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500223 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500224 return EGL_FALSE;
225 }
226
Geoff Lang65603eb2017-01-12 16:48:03 -0500227 ClipConfigs(display->getConfigs(attribMap), configs, config_size, num_config);
Geoff Lange7c6e432014-12-03 14:48:07 -0500228
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500229 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500230 return EGL_TRUE;
231}
232
Jamie Madill231c7f52017-04-26 13:45:37 -0400233EGLBoolean EGLAPIENTRY GetConfigAttrib(EGLDisplay dpy,
234 EGLConfig config,
235 EGLint attribute,
236 EGLint *value)
Geoff Lange7c6e432014-12-03 14:48:07 -0500237{
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500238 EVENT(
239 "(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, EGLint attribute = %d, EGLint "
240 "*value = 0x%0.8p)",
241 dpy, config, attribute, value);
242 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500243
Jamie Madill231c7f52017-04-26 13:45:37 -0400244 Display *display = static_cast<Display *>(dpy);
245 Config *configuration = static_cast<Config *>(config);
Geoff Lange7c6e432014-12-03 14:48:07 -0500246
Geoff Lang65603eb2017-01-12 16:48:03 -0500247 Error error = ValidateGetConfigAttrib(display, configuration, attribute);
Geoff Langdd43fcc2015-01-19 15:44:17 -0500248 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500249 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500250 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500251 return EGL_FALSE;
252 }
253
Geoff Lang65603eb2017-01-12 16:48:03 -0500254 QueryConfigAttrib(configuration, attribute, value);
Geoff Lange7c6e432014-12-03 14:48:07 -0500255
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500256 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500257 return EGL_TRUE;
258}
259
Jamie Madill231c7f52017-04-26 13:45:37 -0400260EGLSurface EGLAPIENTRY CreateWindowSurface(EGLDisplay dpy,
261 EGLConfig config,
262 EGLNativeWindowType win,
263 const EGLint *attrib_list)
Geoff Lange7c6e432014-12-03 14:48:07 -0500264{
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500265 EVENT(
266 "(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, EGLNativeWindowType win = 0x%0.8p, "
267 "const EGLint *attrib_list = 0x%0.8p)",
268 dpy, config, win, attrib_list);
269 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500270
Jamie Madill231c7f52017-04-26 13:45:37 -0400271 Display *display = static_cast<Display *>(dpy);
272 Config *configuration = static_cast<Config *>(config);
Ian Ewellec2c0c52016-04-05 13:46:26 -0400273 AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
Geoff Lange7c6e432014-12-03 14:48:07 -0500274
Geoff Lang0eef0822015-01-19 16:22:40 -0500275 Error error = ValidateCreateWindowSurface(display, configuration, win, attributes);
Geoff Langdd43fcc2015-01-19 15:44:17 -0500276 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500277 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500278 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500279 return EGL_NO_SURFACE;
280 }
281
Geoff Lang0eef0822015-01-19 16:22:40 -0500282 egl::Surface *surface = nullptr;
Jamie Madill231c7f52017-04-26 13:45:37 -0400283 error = display->createWindowSurface(configuration, win, attributes, &surface);
Geoff Lange7c6e432014-12-03 14:48:07 -0500284 if (error.isError())
285 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500286 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500287 return EGL_NO_SURFACE;
288 }
289
Geoff Lang0eef0822015-01-19 16:22:40 -0500290 return static_cast<EGLSurface>(surface);
Geoff Lange7c6e432014-12-03 14:48:07 -0500291}
292
Jamie Madill231c7f52017-04-26 13:45:37 -0400293EGLSurface EGLAPIENTRY CreatePbufferSurface(EGLDisplay dpy,
294 EGLConfig config,
295 const EGLint *attrib_list)
Geoff Lange7c6e432014-12-03 14:48:07 -0500296{
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500297 EVENT(
298 "(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, const EGLint *attrib_list = "
299 "0x%0.8p)",
300 dpy, config, attrib_list);
301 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500302
Jamie Madill231c7f52017-04-26 13:45:37 -0400303 Display *display = static_cast<Display *>(dpy);
304 Config *configuration = static_cast<Config *>(config);
Ian Ewellec2c0c52016-04-05 13:46:26 -0400305 AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
Geoff Lange7c6e432014-12-03 14:48:07 -0500306
Geoff Langf81b6a12015-01-19 16:51:55 -0500307 Error error = ValidateCreatePbufferSurface(display, configuration, attributes);
Geoff Langdd43fcc2015-01-19 15:44:17 -0500308 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500309 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500310 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500311 return EGL_NO_SURFACE;
312 }
313
Geoff Langf81b6a12015-01-19 16:51:55 -0500314 egl::Surface *surface = nullptr;
Jamie Madill231c7f52017-04-26 13:45:37 -0400315 error = display->createPbufferSurface(configuration, attributes, &surface);
Geoff Lange7c6e432014-12-03 14:48:07 -0500316 if (error.isError())
317 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500318 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500319 return EGL_NO_SURFACE;
320 }
321
Geoff Langf81b6a12015-01-19 16:51:55 -0500322 return static_cast<EGLSurface>(surface);
Geoff Lange7c6e432014-12-03 14:48:07 -0500323}
324
Jamie Madill231c7f52017-04-26 13:45:37 -0400325EGLSurface EGLAPIENTRY CreatePixmapSurface(EGLDisplay dpy,
326 EGLConfig config,
327 EGLNativePixmapType pixmap,
328 const EGLint *attrib_list)
Geoff Lange7c6e432014-12-03 14:48:07 -0500329{
Jamie Madill231c7f52017-04-26 13:45:37 -0400330 EVENT(
331 "(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, EGLNativePixmapType pixmap = "
332 "0x%0.8p, "
333 "const EGLint *attrib_list = 0x%0.8p)",
334 dpy, config, pixmap, attrib_list);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500335 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500336
Jamie Madill231c7f52017-04-26 13:45:37 -0400337 Display *display = static_cast<Display *>(dpy);
338 Config *configuration = static_cast<Config *>(config);
Geoff Lange7c6e432014-12-03 14:48:07 -0500339
Geoff Langdd43fcc2015-01-19 15:44:17 -0500340 Error error = ValidateConfig(display, configuration);
341 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500342 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500343 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500344 return EGL_NO_SURFACE;
345 }
346
Jamie Madill231c7f52017-04-26 13:45:37 -0400347 UNIMPLEMENTED(); // FIXME
Geoff Lange7c6e432014-12-03 14:48:07 -0500348
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500349 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500350 return EGL_NO_SURFACE;
351}
352
Geoff Lang130e6e82014-12-05 12:17:40 -0500353EGLBoolean EGLAPIENTRY DestroySurface(EGLDisplay dpy, EGLSurface surface)
Geoff Lange7c6e432014-12-03 14:48:07 -0500354{
355 EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p)", dpy, surface);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500356 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500357
Jamie Madill231c7f52017-04-26 13:45:37 -0400358 Display *display = static_cast<Display *>(dpy);
359 Surface *eglSurface = static_cast<Surface *>(surface);
Geoff Lange7c6e432014-12-03 14:48:07 -0500360
Geoff Langdd43fcc2015-01-19 15:44:17 -0500361 Error error = ValidateSurface(display, eglSurface);
362 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500363 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500364 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500365 return EGL_FALSE;
366 }
367
368 if (surface == EGL_NO_SURFACE)
369 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500370 thread->setError(EglBadSurface());
Geoff Lange7c6e432014-12-03 14:48:07 -0500371 return EGL_FALSE;
372 }
373
Jamie Madill4928b7c2017-06-20 12:57:39 -0400374 error = display->destroySurface(reinterpret_cast<Surface *>(surface));
375 if (error.isError())
376 {
377 thread->setError(error);
378 return EGL_FALSE;
379 }
Geoff Lange7c6e432014-12-03 14:48:07 -0500380
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500381 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500382 return EGL_TRUE;
383}
384
Jamie Madill231c7f52017-04-26 13:45:37 -0400385EGLBoolean EGLAPIENTRY QuerySurface(EGLDisplay dpy,
386 EGLSurface surface,
387 EGLint attribute,
388 EGLint *value)
Geoff Lange7c6e432014-12-03 14:48:07 -0500389{
Jamie Madill231c7f52017-04-26 13:45:37 -0400390 EVENT(
391 "(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint attribute = %d, EGLint "
392 "*value = 0x%0.8p)",
393 dpy, surface, attribute, value);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500394 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500395
Jamie Madill231c7f52017-04-26 13:45:37 -0400396 Display *display = static_cast<Display *>(dpy);
397 Surface *eglSurface = (Surface *)surface;
Geoff Lange7c6e432014-12-03 14:48:07 -0500398
Geoff Langdd43fcc2015-01-19 15:44:17 -0500399 Error error = ValidateSurface(display, eglSurface);
400 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500401 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500402 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500403 return EGL_FALSE;
404 }
405
406 if (surface == EGL_NO_SURFACE)
407 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500408 thread->setError(EglBadSurface());
Geoff Lange7c6e432014-12-03 14:48:07 -0500409 return EGL_FALSE;
410 }
411
412 switch (attribute)
413 {
Jamie Madill231c7f52017-04-26 13:45:37 -0400414 case EGL_VG_ALPHA_FORMAT:
415 UNIMPLEMENTED(); // FIXME
416 break;
417 case EGL_VG_COLORSPACE:
418 UNIMPLEMENTED(); // FIXME
419 break;
420 case EGL_CONFIG_ID:
421 *value = eglSurface->getConfig()->configID;
422 break;
423 case EGL_HEIGHT:
424 *value = eglSurface->getHeight();
425 break;
426 case EGL_HORIZONTAL_RESOLUTION:
427 UNIMPLEMENTED(); // FIXME
428 break;
429 case EGL_LARGEST_PBUFFER:
430 UNIMPLEMENTED(); // FIXME
431 break;
432 case EGL_MIPMAP_TEXTURE:
433 UNIMPLEMENTED(); // FIXME
434 break;
435 case EGL_MIPMAP_LEVEL:
436 UNIMPLEMENTED(); // FIXME
437 break;
438 case EGL_MULTISAMPLE_RESOLVE:
439 UNIMPLEMENTED(); // FIXME
440 break;
441 case EGL_PIXEL_ASPECT_RATIO:
442 *value = eglSurface->getPixelAspectRatio();
443 break;
444 case EGL_RENDER_BUFFER:
445 *value = eglSurface->getRenderBuffer();
446 break;
447 case EGL_SWAP_BEHAVIOR:
448 *value = eglSurface->getSwapBehavior();
449 break;
450 case EGL_TEXTURE_FORMAT:
451 *value = eglSurface->getTextureFormat();
452 break;
453 case EGL_TEXTURE_TARGET:
454 *value = eglSurface->getTextureTarget();
455 break;
456 case EGL_VERTICAL_RESOLUTION:
457 UNIMPLEMENTED(); // FIXME
458 break;
459 case EGL_WIDTH:
460 *value = eglSurface->getWidth();
461 break;
462 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
463 if (!display->getExtensions().postSubBuffer)
464 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500465 thread->setError(EglBadAttribute());
Jamie Madill231c7f52017-04-26 13:45:37 -0400466 return EGL_FALSE;
467 }
468 *value = eglSurface->isPostSubBufferSupported();
469 break;
470 case EGL_FIXED_SIZE_ANGLE:
471 if (!display->getExtensions().windowFixedSize)
472 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500473 thread->setError(EglBadAttribute());
Jamie Madill231c7f52017-04-26 13:45:37 -0400474 return EGL_FALSE;
475 }
476 *value = eglSurface->isFixedSize();
477 break;
478 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
479 if (!display->getExtensions().flexibleSurfaceCompatibility)
480 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500481 thread->setError(
482 EglBadAttribute()
483 << "EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE cannot be "
484 "used without EGL_ANGLE_flexible_surface_compatibility support.");
Jamie Madill231c7f52017-04-26 13:45:37 -0400485 return EGL_FALSE;
486 }
487 *value = eglSurface->flexibleSurfaceCompatibilityRequested();
488 break;
489 case EGL_SURFACE_ORIENTATION_ANGLE:
490 if (!display->getExtensions().surfaceOrientation)
491 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500492 thread->setError(EglBadAttribute() << "EGL_SURFACE_ORIENTATION_ANGLE cannot be "
493 "queried without "
494 "EGL_ANGLE_surface_orientation support.");
Jamie Madill231c7f52017-04-26 13:45:37 -0400495 return EGL_FALSE;
496 }
497 *value = eglSurface->getOrientation();
498 break;
499 case EGL_DIRECT_COMPOSITION_ANGLE:
500 if (!display->getExtensions().directComposition)
501 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500502 thread->setError(EglBadAttribute() << "EGL_DIRECT_COMPOSITION_ANGLE cannot be "
503 "used without "
504 "EGL_ANGLE_direct_composition support.");
Jamie Madill231c7f52017-04-26 13:45:37 -0400505 return EGL_FALSE;
506 }
507 *value = eglSurface->directComposition();
508 break;
509 default:
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500510 thread->setError(EglBadAttribute());
Geoff Langb931e722014-12-11 13:49:13 -0500511 return EGL_FALSE;
Geoff Lange7c6e432014-12-03 14:48:07 -0500512 }
513
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500514 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500515 return EGL_TRUE;
516}
517
Jamie Madill231c7f52017-04-26 13:45:37 -0400518EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy,
519 EGLConfig config,
520 EGLContext share_context,
521 const EGLint *attrib_list)
Geoff Lange7c6e432014-12-03 14:48:07 -0500522{
Jamie Madill231c7f52017-04-26 13:45:37 -0400523 EVENT(
524 "(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, EGLContext share_context = "
525 "0x%0.8p, "
526 "const EGLint *attrib_list = 0x%0.8p)",
527 dpy, config, share_context, attrib_list);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500528 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500529
Jamie Madill231c7f52017-04-26 13:45:37 -0400530 Display *display = static_cast<Display *>(dpy);
531 Config *configuration = static_cast<Config *>(config);
532 gl::Context *sharedGLContext = static_cast<gl::Context *>(share_context);
Ian Ewellec2c0c52016-04-05 13:46:26 -0400533 AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
Geoff Langdd43fcc2015-01-19 15:44:17 -0500534
Geoff Lang33b6ae52015-01-19 15:58:09 -0500535 Error error = ValidateCreateContext(display, configuration, sharedGLContext, attributes);
Geoff Langdd43fcc2015-01-19 15:44:17 -0500536 if (error.isError())
Geoff Langb931e722014-12-11 13:49:13 -0500537 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500538 thread->setError(error);
Geoff Langb931e722014-12-11 13:49:13 -0500539 return EGL_NO_CONTEXT;
540 }
541
Geoff Lang33b6ae52015-01-19 15:58:09 -0500542 gl::Context *context = nullptr;
543 error = display->createContext(configuration, sharedGLContext, attributes, &context);
Geoff Lange7c6e432014-12-03 14:48:07 -0500544 if (error.isError())
545 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500546 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500547 return EGL_NO_CONTEXT;
548 }
549
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500550 thread->setError(NoError());
Geoff Lang33b6ae52015-01-19 15:58:09 -0500551 return static_cast<EGLContext>(context);
Geoff Lange7c6e432014-12-03 14:48:07 -0500552}
553
Geoff Lang130e6e82014-12-05 12:17:40 -0500554EGLBoolean EGLAPIENTRY DestroyContext(EGLDisplay dpy, EGLContext ctx)
Geoff Lange7c6e432014-12-03 14:48:07 -0500555{
556 EVENT("(EGLDisplay dpy = 0x%0.8p, EGLContext ctx = 0x%0.8p)", dpy, ctx);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500557 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500558
Jamie Madill231c7f52017-04-26 13:45:37 -0400559 Display *display = static_cast<Display *>(dpy);
560 gl::Context *context = static_cast<gl::Context *>(ctx);
Geoff Lange7c6e432014-12-03 14:48:07 -0500561
Geoff Langdd43fcc2015-01-19 15:44:17 -0500562 Error error = ValidateContext(display, context);
563 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500564 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500565 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500566 return EGL_FALSE;
567 }
568
569 if (ctx == EGL_NO_CONTEXT)
570 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500571 thread->setError(EglBadContext());
Geoff Lange7c6e432014-12-03 14:48:07 -0500572 return EGL_FALSE;
573 }
574
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500575 if (context == thread->getContext())
Geoff Lange7c6e432014-12-03 14:48:07 -0500576 {
Jamie Madill61e16b42017-06-19 11:13:23 -0400577 thread->setCurrent(nullptr);
Geoff Lange7c6e432014-12-03 14:48:07 -0500578 }
579
Jamie Madill4928b7c2017-06-20 12:57:39 -0400580 error = display->destroyContext(context);
581 if (error.isError())
582 {
583 thread->setError(error);
584 return EGL_FALSE;
585 }
Geoff Lange7c6e432014-12-03 14:48:07 -0500586
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500587 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500588 return EGL_TRUE;
589}
590
Geoff Lang130e6e82014-12-05 12:17:40 -0500591EGLBoolean EGLAPIENTRY MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
Geoff Lange7c6e432014-12-03 14:48:07 -0500592{
Jamie Madill231c7f52017-04-26 13:45:37 -0400593 EVENT(
594 "(EGLDisplay dpy = 0x%0.8p, EGLSurface draw = 0x%0.8p, EGLSurface read = 0x%0.8p, "
595 "EGLContext ctx = 0x%0.8p)",
596 dpy, draw, read, ctx);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500597 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500598
Jamie Madill231c7f52017-04-26 13:45:37 -0400599 Display *display = static_cast<Display *>(dpy);
600 gl::Context *context = static_cast<gl::Context *>(ctx);
Geoff Lange7c6e432014-12-03 14:48:07 -0500601
Corentin Wallezc295e512017-01-27 17:47:50 -0500602 Error error = ValidateMakeCurrent(display, draw, read, context);
603 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500604 {
Corentin Wallezc295e512017-01-27 17:47:50 -0500605 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500606 return EGL_FALSE;
607 }
608
Jamie Madill231c7f52017-04-26 13:45:37 -0400609 Surface *readSurface = static_cast<Surface *>(read);
Corentin Wallezc295e512017-01-27 17:47:50 -0500610 Surface *drawSurface = static_cast<Surface *>(draw);
Corentin Wallezc70e1202015-07-10 10:53:01 -0400611 Error makeCurrentError = display->makeCurrent(drawSurface, readSurface, context);
612 if (makeCurrentError.isError())
613 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500614 thread->setError(makeCurrentError);
Corentin Wallezc70e1202015-07-10 10:53:01 -0400615 return EGL_FALSE;
616 }
617
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500618 gl::Context *previousContext = thread->getContext();
Jamie Madill61e16b42017-06-19 11:13:23 -0400619 thread->setCurrent(context);
Geoff Lange7c6e432014-12-03 14:48:07 -0500620
Jamie Madill77a72f62015-04-14 11:18:32 -0400621 // Release the surface from the previously-current context, to allow
622 // destroyed surfaces to delete themselves.
623 if (previousContext != nullptr && context != previousContext)
Geoff Lange7c6e432014-12-03 14:48:07 -0500624 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400625 auto err = previousContext->releaseSurface(display);
626 if (err.isError())
627 {
628 thread->setError(err);
629 return EGL_FALSE;
630 }
Geoff Lange7c6e432014-12-03 14:48:07 -0500631 }
632
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500633 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500634 return EGL_TRUE;
635}
636
Geoff Lang130e6e82014-12-05 12:17:40 -0500637EGLSurface EGLAPIENTRY GetCurrentSurface(EGLint readdraw)
Geoff Lange7c6e432014-12-03 14:48:07 -0500638{
639 EVENT("(EGLint readdraw = %d)", readdraw);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500640 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500641
642 if (readdraw == EGL_READ)
643 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500644 thread->setError(NoError());
Jamie Madill61e16b42017-06-19 11:13:23 -0400645 return thread->getCurrentReadSurface();
Geoff Lange7c6e432014-12-03 14:48:07 -0500646 }
647 else if (readdraw == EGL_DRAW)
648 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500649 thread->setError(NoError());
Jamie Madill61e16b42017-06-19 11:13:23 -0400650 return thread->getCurrentDrawSurface();
Geoff Lange7c6e432014-12-03 14:48:07 -0500651 }
652 else
653 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500654 thread->setError(EglBadParameter());
Geoff Lange7c6e432014-12-03 14:48:07 -0500655 return EGL_NO_SURFACE;
656 }
657}
658
Geoff Lang130e6e82014-12-05 12:17:40 -0500659EGLDisplay EGLAPIENTRY GetCurrentDisplay(void)
Geoff Lange7c6e432014-12-03 14:48:07 -0500660{
661 EVENT("()");
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500662 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500663
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500664 thread->setError(NoError());
Jamie Madill61e16b42017-06-19 11:13:23 -0400665 if (thread->getContext() != nullptr)
666 {
667 return thread->getContext()->getCurrentDisplay();
668 }
669 return EGL_NO_DISPLAY;
Geoff Lange7c6e432014-12-03 14:48:07 -0500670}
671
Geoff Lang130e6e82014-12-05 12:17:40 -0500672EGLBoolean EGLAPIENTRY QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
Geoff Lange7c6e432014-12-03 14:48:07 -0500673{
Jamie Madill231c7f52017-04-26 13:45:37 -0400674 EVENT(
675 "(EGLDisplay dpy = 0x%0.8p, EGLContext ctx = 0x%0.8p, EGLint attribute = %d, EGLint *value "
676 "= 0x%0.8p)",
677 dpy, ctx, attribute, value);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500678 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500679
Jamie Madill231c7f52017-04-26 13:45:37 -0400680 Display *display = static_cast<Display *>(dpy);
681 gl::Context *context = static_cast<gl::Context *>(ctx);
Geoff Lange7c6e432014-12-03 14:48:07 -0500682
Geoff Langdd43fcc2015-01-19 15:44:17 -0500683 Error error = ValidateContext(display, context);
684 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500685 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500686 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500687 return EGL_FALSE;
688 }
689
Régis Fénéon83107972015-02-05 12:57:44 +0100690 switch (attribute)
691 {
Jamie Madill231c7f52017-04-26 13:45:37 -0400692 case EGL_CONFIG_ID:
693 *value = context->getConfig()->configID;
694 break;
695 case EGL_CONTEXT_CLIENT_TYPE:
696 *value = context->getClientType();
697 break;
698 case EGL_CONTEXT_CLIENT_VERSION:
699 *value = context->getClientMajorVersion();
700 break;
701 case EGL_RENDER_BUFFER:
702 *value = context->getRenderBuffer();
703 break;
704 default:
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500705 thread->setError(EglBadAttribute());
Jamie Madill231c7f52017-04-26 13:45:37 -0400706 return EGL_FALSE;
Régis Fénéon83107972015-02-05 12:57:44 +0100707 }
Geoff Lange7c6e432014-12-03 14:48:07 -0500708
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500709 thread->setError(NoError());
Régis Fénéon83107972015-02-05 12:57:44 +0100710 return EGL_TRUE;
Geoff Lange7c6e432014-12-03 14:48:07 -0500711}
712
Geoff Lang130e6e82014-12-05 12:17:40 -0500713EGLBoolean EGLAPIENTRY WaitGL(void)
Geoff Lange7c6e432014-12-03 14:48:07 -0500714{
715 EVENT("()");
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500716 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500717
Jamie Madill61e16b42017-06-19 11:13:23 -0400718 Display *display = thread->getCurrentDisplay();
Corentin Walleza4333882016-01-14 17:24:50 -0500719
720 Error error = ValidateDisplay(display);
721 if (error.isError())
722 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500723 thread->setError(error);
Corentin Walleza4333882016-01-14 17:24:50 -0500724 return EGL_FALSE;
725 }
726
727 // eglWaitGL like calling eglWaitClient with the OpenGL ES API bound. Since we only implement
728 // OpenGL ES we can do the call directly.
Jamie Madillfe548342017-06-19 11:13:24 -0400729 error = display->waitClient(thread->getContext());
Corentin Walleza4333882016-01-14 17:24:50 -0500730 if (error.isError())
731 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500732 thread->setError(error);
Corentin Walleza4333882016-01-14 17:24:50 -0500733 return EGL_FALSE;
734 }
Geoff Lange7c6e432014-12-03 14:48:07 -0500735
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500736 thread->setError(NoError());
Corentin Walleza4333882016-01-14 17:24:50 -0500737 return EGL_TRUE;
Geoff Lange7c6e432014-12-03 14:48:07 -0500738}
739
Geoff Lang130e6e82014-12-05 12:17:40 -0500740EGLBoolean EGLAPIENTRY WaitNative(EGLint engine)
Geoff Lange7c6e432014-12-03 14:48:07 -0500741{
742 EVENT("(EGLint engine = %d)", engine);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500743 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500744
Jamie Madill61e16b42017-06-19 11:13:23 -0400745 Display *display = thread->getCurrentDisplay();
Corentin Walleza4333882016-01-14 17:24:50 -0500746
747 Error error = ValidateDisplay(display);
748 if (error.isError())
749 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500750 thread->setError(error);
Corentin Walleza4333882016-01-14 17:24:50 -0500751 return EGL_FALSE;
752 }
753
754 if (engine != EGL_CORE_NATIVE_ENGINE)
755 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500756 thread->setError(EglBadParameter() << "the 'engine' parameter has an unrecognized value");
Corentin Walleza4333882016-01-14 17:24:50 -0500757 }
758
Jamie Madillfe548342017-06-19 11:13:24 -0400759 error = display->waitNative(thread->getContext(), engine);
Corentin Walleza4333882016-01-14 17:24:50 -0500760 if (error.isError())
761 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500762 thread->setError(error);
Corentin Walleza4333882016-01-14 17:24:50 -0500763 return EGL_FALSE;
764 }
Geoff Lange7c6e432014-12-03 14:48:07 -0500765
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500766 thread->setError(NoError());
Corentin Walleza4333882016-01-14 17:24:50 -0500767 return EGL_TRUE;
Geoff Lange7c6e432014-12-03 14:48:07 -0500768}
769
Geoff Lang130e6e82014-12-05 12:17:40 -0500770EGLBoolean EGLAPIENTRY SwapBuffers(EGLDisplay dpy, EGLSurface surface)
Geoff Lange7c6e432014-12-03 14:48:07 -0500771{
772 EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p)", dpy, surface);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500773 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500774
Jamie Madill231c7f52017-04-26 13:45:37 -0400775 Display *display = static_cast<Display *>(dpy);
776 Surface *eglSurface = (Surface *)surface;
Geoff Lange7c6e432014-12-03 14:48:07 -0500777
Geoff Langdd43fcc2015-01-19 15:44:17 -0500778 Error error = ValidateSurface(display, eglSurface);
779 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500780 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500781 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500782 return EGL_FALSE;
783 }
784
Corentin Wallez9c721c62016-08-02 14:56:23 -0400785 if (display->testDeviceLost())
Geoff Lange7c6e432014-12-03 14:48:07 -0500786 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500787 thread->setError(EglContextLost());
Geoff Lange7c6e432014-12-03 14:48:07 -0500788 return EGL_FALSE;
789 }
790
791 if (surface == EGL_NO_SURFACE)
792 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500793 thread->setError(EglBadSurface());
Geoff Lange7c6e432014-12-03 14:48:07 -0500794 return EGL_FALSE;
795 }
796
Jamie Madillfe548342017-06-19 11:13:24 -0400797 if (!thread->getContext() || thread->getCurrentDrawSurface() != eglSurface)
798 {
799 thread->setError(EglBadSurface());
800 return EGL_FALSE;
801 }
802
803 error = eglSurface->swap(thread->getContext());
Geoff Lange7c6e432014-12-03 14:48:07 -0500804 if (error.isError())
805 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500806 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500807 return EGL_FALSE;
808 }
809
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500810 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500811 return EGL_TRUE;
812}
813
Geoff Lang130e6e82014-12-05 12:17:40 -0500814EGLBoolean EGLAPIENTRY CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
Geoff Lange7c6e432014-12-03 14:48:07 -0500815{
Jamie Madill231c7f52017-04-26 13:45:37 -0400816 EVENT(
817 "(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLNativePixmapType target = "
818 "0x%0.8p)",
819 dpy, surface, target);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500820 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500821
Jamie Madill231c7f52017-04-26 13:45:37 -0400822 Display *display = static_cast<Display *>(dpy);
823 Surface *eglSurface = static_cast<Surface *>(surface);
Geoff Lange7c6e432014-12-03 14:48:07 -0500824
Geoff Langdd43fcc2015-01-19 15:44:17 -0500825 Error error = ValidateSurface(display, eglSurface);
826 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500827 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500828 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500829 return EGL_FALSE;
830 }
831
Corentin Wallez9c721c62016-08-02 14:56:23 -0400832 if (display->testDeviceLost())
Geoff Lange7c6e432014-12-03 14:48:07 -0500833 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500834 thread->setError(EglContextLost());
Geoff Lange7c6e432014-12-03 14:48:07 -0500835 return EGL_FALSE;
836 }
837
Jamie Madill231c7f52017-04-26 13:45:37 -0400838 UNIMPLEMENTED(); // FIXME
Geoff Lange7c6e432014-12-03 14:48:07 -0500839
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500840 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500841 return 0;
842}
843
844// EGL 1.1
Geoff Lang130e6e82014-12-05 12:17:40 -0500845EGLBoolean EGLAPIENTRY BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
Geoff Lange7c6e432014-12-03 14:48:07 -0500846{
Jamie Madill231c7f52017-04-26 13:45:37 -0400847 EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint buffer = %d)", dpy,
848 surface, buffer);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500849 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500850
Jamie Madill231c7f52017-04-26 13:45:37 -0400851 Display *display = static_cast<Display *>(dpy);
852 Surface *eglSurface = static_cast<Surface *>(surface);
Geoff Lange7c6e432014-12-03 14:48:07 -0500853
Geoff Langdd43fcc2015-01-19 15:44:17 -0500854 Error error = ValidateSurface(display, eglSurface);
855 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500856 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500857 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500858 return EGL_FALSE;
859 }
860
861 if (buffer != EGL_BACK_BUFFER)
862 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500863 thread->setError(EglBadParameter());
Geoff Lange7c6e432014-12-03 14:48:07 -0500864 return EGL_FALSE;
865 }
866
Geoff Lang9d3ae5f2015-03-18 17:20:33 -0400867 if (surface == EGL_NO_SURFACE || eglSurface->getType() == EGL_WINDOW_BIT)
Geoff Lange7c6e432014-12-03 14:48:07 -0500868 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500869 thread->setError(EglBadSurface());
Geoff Lange7c6e432014-12-03 14:48:07 -0500870 return EGL_FALSE;
871 }
872
873 if (eglSurface->getBoundTexture())
874 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500875 thread->setError(EglBadAccess());
Geoff Lange7c6e432014-12-03 14:48:07 -0500876 return EGL_FALSE;
877 }
878
879 if (eglSurface->getTextureFormat() == EGL_NO_TEXTURE)
880 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500881 thread->setError(EglBadMatch());
Geoff Lange7c6e432014-12-03 14:48:07 -0500882 return EGL_FALSE;
883 }
884
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500885 gl::Context *context = thread->getContext();
Geoff Lange7c6e432014-12-03 14:48:07 -0500886 if (context)
887 {
Geoff Lang7c973ea2014-12-19 15:58:28 -0500888 gl::Texture *textureObject = context->getTargetTexture(GL_TEXTURE_2D);
Yunchao He4f285442017-04-21 12:15:49 +0800889 ASSERT(textureObject != nullptr);
Geoff Lange7c6e432014-12-03 14:48:07 -0500890
Geoff Lang69cce582015-09-17 13:20:36 -0400891 if (textureObject->getImmutableFormat())
Geoff Lange7c6e432014-12-03 14:48:07 -0500892 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500893 thread->setError(EglBadMatch());
Geoff Lange7c6e432014-12-03 14:48:07 -0500894 return EGL_FALSE;
895 }
896
Jamie Madill4928b7c2017-06-20 12:57:39 -0400897 error = eglSurface->bindTexImage(context, textureObject, buffer);
Geoff Lang03053202015-04-09 11:21:13 -0400898 if (error.isError())
899 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500900 thread->setError(error);
Geoff Lang03053202015-04-09 11:21:13 -0400901 return EGL_FALSE;
902 }
Geoff Lange7c6e432014-12-03 14:48:07 -0500903 }
904
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500905 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500906 return EGL_TRUE;
907}
908
Jamie Madill231c7f52017-04-26 13:45:37 -0400909EGLBoolean EGLAPIENTRY SurfaceAttrib(EGLDisplay dpy,
910 EGLSurface surface,
911 EGLint attribute,
912 EGLint value)
Geoff Lange7c6e432014-12-03 14:48:07 -0500913{
Jamie Madill231c7f52017-04-26 13:45:37 -0400914 EVENT(
915 "(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint attribute = %d, EGLint "
916 "value = %d)",
Geoff Lange7c6e432014-12-03 14:48:07 -0500917 dpy, surface, attribute, value);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500918 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500919
Jamie Madill231c7f52017-04-26 13:45:37 -0400920 Display *display = static_cast<Display *>(dpy);
921 Surface *eglSurface = static_cast<Surface *>(surface);
Geoff Lange7c6e432014-12-03 14:48:07 -0500922
Geoff Langdd43fcc2015-01-19 15:44:17 -0500923 Error error = ValidateSurface(display, eglSurface);
924 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500925 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500926 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500927 return EGL_FALSE;
928 }
929
Jamie Madill231c7f52017-04-26 13:45:37 -0400930 UNIMPLEMENTED(); // FIXME
Geoff Lange7c6e432014-12-03 14:48:07 -0500931
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500932 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500933 return EGL_TRUE;
934}
935
Geoff Lang130e6e82014-12-05 12:17:40 -0500936EGLBoolean EGLAPIENTRY ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
Geoff Lange7c6e432014-12-03 14:48:07 -0500937{
Jamie Madill231c7f52017-04-26 13:45:37 -0400938 EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint buffer = %d)", dpy,
939 surface, buffer);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500940 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500941
Jamie Madill231c7f52017-04-26 13:45:37 -0400942 Display *display = static_cast<Display *>(dpy);
943 Surface *eglSurface = static_cast<Surface *>(surface);
Geoff Lange7c6e432014-12-03 14:48:07 -0500944
Geoff Langdd43fcc2015-01-19 15:44:17 -0500945 Error error = ValidateSurface(display, eglSurface);
946 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500947 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500948 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500949 return EGL_FALSE;
950 }
951
952 if (buffer != EGL_BACK_BUFFER)
953 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500954 thread->setError(EglBadParameter());
Geoff Lange7c6e432014-12-03 14:48:07 -0500955 return EGL_FALSE;
956 }
957
Geoff Lang9d3ae5f2015-03-18 17:20:33 -0400958 if (surface == EGL_NO_SURFACE || eglSurface->getType() == EGL_WINDOW_BIT)
Geoff Lange7c6e432014-12-03 14:48:07 -0500959 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500960 thread->setError(EglBadSurface());
Geoff Lange7c6e432014-12-03 14:48:07 -0500961 return EGL_FALSE;
962 }
963
964 if (eglSurface->getTextureFormat() == EGL_NO_TEXTURE)
965 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500966 thread->setError(EglBadMatch());
Geoff Lange7c6e432014-12-03 14:48:07 -0500967 return EGL_FALSE;
968 }
969
Geoff Lang7c973ea2014-12-19 15:58:28 -0500970 gl::Texture *texture = eglSurface->getBoundTexture();
Geoff Lange7c6e432014-12-03 14:48:07 -0500971
972 if (texture)
973 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400974 error = eglSurface->releaseTexImage(thread->getContext(), buffer);
Geoff Lang03053202015-04-09 11:21:13 -0400975 if (error.isError())
976 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500977 thread->setError(error);
Geoff Lang03053202015-04-09 11:21:13 -0400978 return EGL_FALSE;
979 }
Geoff Lange7c6e432014-12-03 14:48:07 -0500980 }
981
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500982 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -0500983 return EGL_TRUE;
984}
985
Geoff Lang130e6e82014-12-05 12:17:40 -0500986EGLBoolean EGLAPIENTRY SwapInterval(EGLDisplay dpy, EGLint interval)
Geoff Lange7c6e432014-12-03 14:48:07 -0500987{
988 EVENT("(EGLDisplay dpy = 0x%0.8p, EGLint interval = %d)", dpy, interval);
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500989 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -0500990
Jamie Madill231c7f52017-04-26 13:45:37 -0400991 Display *display = static_cast<Display *>(dpy);
Geoff Lange7c6e432014-12-03 14:48:07 -0500992
Geoff Langdd43fcc2015-01-19 15:44:17 -0500993 Error error = ValidateDisplay(display);
994 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -0500995 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -0500996 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -0500997 return EGL_FALSE;
998 }
999
Jamie Madill61e16b42017-06-19 11:13:23 -04001000 Surface *draw_surface = static_cast<Surface *>(thread->getCurrentDrawSurface());
Geoff Lange7c6e432014-12-03 14:48:07 -05001001
Yunchao He4f285442017-04-21 12:15:49 +08001002 if (draw_surface == nullptr)
Geoff Lange7c6e432014-12-03 14:48:07 -05001003 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001004 thread->setError(EglBadSurface());
Geoff Lange7c6e432014-12-03 14:48:07 -05001005 return EGL_FALSE;
1006 }
1007
Geoff Lang1aca9222015-03-19 12:02:50 -04001008 const egl::Config *surfaceConfig = draw_surface->getConfig();
Jamie Madill231c7f52017-04-26 13:45:37 -04001009 EGLint clampedInterval = std::min(std::max(interval, surfaceConfig->minSwapInterval),
1010 surfaceConfig->maxSwapInterval);
Geoff Lang1aca9222015-03-19 12:02:50 -04001011
1012 draw_surface->setSwapInterval(clampedInterval);
Geoff Lange7c6e432014-12-03 14:48:07 -05001013
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001014 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -05001015 return EGL_TRUE;
1016}
1017
Geoff Lange7c6e432014-12-03 14:48:07 -05001018// EGL 1.2
Geoff Lang130e6e82014-12-05 12:17:40 -05001019EGLBoolean EGLAPIENTRY BindAPI(EGLenum api)
Geoff Lange7c6e432014-12-03 14:48:07 -05001020{
1021 EVENT("(EGLenum api = 0x%X)", api);
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001022 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001023
1024 switch (api)
1025 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001026 case EGL_OPENGL_API:
1027 case EGL_OPENVG_API:
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001028 thread->setError(EglBadParameter());
Jamie Madill231c7f52017-04-26 13:45:37 -04001029 return EGL_FALSE; // Not supported by this implementation
1030 case EGL_OPENGL_ES_API:
1031 break;
1032 default:
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001033 thread->setError(EglBadParameter());
Jamie Madill231c7f52017-04-26 13:45:37 -04001034 return EGL_FALSE;
Geoff Lange7c6e432014-12-03 14:48:07 -05001035 }
1036
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001037 thread->setAPI(api);
Geoff Lange7c6e432014-12-03 14:48:07 -05001038
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001039 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -05001040 return EGL_TRUE;
1041}
1042
Geoff Lang130e6e82014-12-05 12:17:40 -05001043EGLenum EGLAPIENTRY QueryAPI(void)
Geoff Lange7c6e432014-12-03 14:48:07 -05001044{
1045 EVENT("()");
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001046 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001047
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001048 EGLenum API = thread->getAPI();
Geoff Lange7c6e432014-12-03 14:48:07 -05001049
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001050 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -05001051 return API;
1052}
1053
Jamie Madill231c7f52017-04-26 13:45:37 -04001054EGLSurface EGLAPIENTRY CreatePbufferFromClientBuffer(EGLDisplay dpy,
1055 EGLenum buftype,
1056 EGLClientBuffer buffer,
1057 EGLConfig config,
1058 const EGLint *attrib_list)
Geoff Lange7c6e432014-12-03 14:48:07 -05001059{
Jamie Madill231c7f52017-04-26 13:45:37 -04001060 EVENT(
1061 "(EGLDisplay dpy = 0x%0.8p, EGLenum buftype = 0x%X, EGLClientBuffer buffer = 0x%0.8p, "
1062 "EGLConfig config = 0x%0.8p, const EGLint *attrib_list = 0x%0.8p)",
1063 dpy, buftype, buffer, config, attrib_list);
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001064 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001065
Jamie Madill231c7f52017-04-26 13:45:37 -04001066 Display *display = static_cast<Display *>(dpy);
1067 Config *configuration = static_cast<Config *>(config);
Ian Ewellec2c0c52016-04-05 13:46:26 -04001068 AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
Geoff Langdd43fcc2015-01-19 15:44:17 -05001069
Jamie Madill231c7f52017-04-26 13:45:37 -04001070 Error error =
1071 ValidateCreatePbufferFromClientBuffer(display, buftype, buffer, configuration, attributes);
Geoff Langdd43fcc2015-01-19 15:44:17 -05001072 if (error.isError())
Geoff Lange7c6e432014-12-03 14:48:07 -05001073 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001074 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -05001075 return EGL_NO_SURFACE;
1076 }
1077
Geoff Langf81b6a12015-01-19 16:51:55 -05001078 egl::Surface *surface = nullptr;
Geoff Lang2018c0b2015-12-08 11:48:51 -05001079 error = display->createPbufferFromClientBuffer(configuration, buftype, buffer, attributes,
1080 &surface);
Geoff Lange7c6e432014-12-03 14:48:07 -05001081 if (error.isError())
1082 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001083 thread->setError(error);
Geoff Lange7c6e432014-12-03 14:48:07 -05001084 return EGL_NO_SURFACE;
1085 }
1086
Geoff Langf81b6a12015-01-19 16:51:55 -05001087 return static_cast<EGLSurface>(surface);
Geoff Lange7c6e432014-12-03 14:48:07 -05001088}
1089
Geoff Lang130e6e82014-12-05 12:17:40 -05001090EGLBoolean EGLAPIENTRY ReleaseThread(void)
Geoff Lange7c6e432014-12-03 14:48:07 -05001091{
1092 EVENT("()");
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001093 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001094
1095 MakeCurrent(EGL_NO_DISPLAY, EGL_NO_CONTEXT, EGL_NO_SURFACE, EGL_NO_SURFACE);
1096
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001097 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -05001098 return EGL_TRUE;
1099}
1100
Geoff Lang130e6e82014-12-05 12:17:40 -05001101EGLBoolean EGLAPIENTRY WaitClient(void)
Geoff Lange7c6e432014-12-03 14:48:07 -05001102{
1103 EVENT("()");
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001104 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001105
Jamie Madill61e16b42017-06-19 11:13:23 -04001106 Display *display = thread->getCurrentDisplay();
Corentin Walleza4333882016-01-14 17:24:50 -05001107
1108 Error error = ValidateDisplay(display);
1109 if (error.isError())
1110 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001111 thread->setError(error);
Corentin Walleza4333882016-01-14 17:24:50 -05001112 return EGL_FALSE;
1113 }
1114
Jamie Madillfe548342017-06-19 11:13:24 -04001115 error = display->waitClient(thread->getContext());
Corentin Walleza4333882016-01-14 17:24:50 -05001116 if (error.isError())
1117 {
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001118 thread->setError(error);
Corentin Walleza4333882016-01-14 17:24:50 -05001119 return EGL_FALSE;
1120 }
Geoff Lange7c6e432014-12-03 14:48:07 -05001121
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001122 thread->setError(NoError());
Corentin Walleza4333882016-01-14 17:24:50 -05001123 return EGL_TRUE;
Geoff Lange7c6e432014-12-03 14:48:07 -05001124}
1125
1126// EGL 1.4
Geoff Lang130e6e82014-12-05 12:17:40 -05001127EGLContext EGLAPIENTRY GetCurrentContext(void)
Geoff Lange7c6e432014-12-03 14:48:07 -05001128{
1129 EVENT("()");
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001130 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001131
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001132 gl::Context *context = thread->getContext();
Geoff Lange7c6e432014-12-03 14:48:07 -05001133
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001134 thread->setError(NoError());
Geoff Lange7c6e432014-12-03 14:48:07 -05001135 return static_cast<EGLContext>(context);
1136}
1137
1138// EGL 1.5
Geoff Lang130e6e82014-12-05 12:17:40 -05001139EGLSync EGLAPIENTRY CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
Geoff Lange7c6e432014-12-03 14:48:07 -05001140{
Jamie Madill231c7f52017-04-26 13:45:37 -04001141 EVENT("(EGLDisplay dpy = 0x%0.8p, EGLenum type = 0x%X, const EGLint* attrib_list = 0x%0.8p)",
1142 dpy, type, attrib_list);
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001143 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001144
1145 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001146 thread->setError(EglBadDisplay() << "eglCreateSync unimplemented.");
Geoff Lange7c6e432014-12-03 14:48:07 -05001147 return EGL_NO_SYNC;
1148}
1149
Geoff Lang130e6e82014-12-05 12:17:40 -05001150EGLBoolean EGLAPIENTRY DestroySync(EGLDisplay dpy, EGLSync sync)
Geoff Lange7c6e432014-12-03 14:48:07 -05001151{
1152 EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSync sync = 0x%0.8p)", dpy, sync);
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001153 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001154
1155 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001156 thread->setError(EglBadDisplay() << "eglDestroySync unimplemented.");
Geoff Lange7c6e432014-12-03 14:48:07 -05001157 return EGL_FALSE;
1158}
1159
Geoff Lang130e6e82014-12-05 12:17:40 -05001160EGLint EGLAPIENTRY ClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout)
Geoff Lange7c6e432014-12-03 14:48:07 -05001161{
Jamie Madill231c7f52017-04-26 13:45:37 -04001162 EVENT(
1163 "(EGLDisplay dpy = 0x%0.8p, EGLSync sync = 0x%0.8p, EGLint flags = 0x%X, EGLTime timeout = "
1164 "%d)",
1165 dpy, sync, flags, timeout);
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001166 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001167
1168 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001169 thread->setError(EglBadDisplay() << "eglClientWaitSync unimplemented.");
Geoff Lange7c6e432014-12-03 14:48:07 -05001170 return 0;
1171}
1172
Jamie Madill231c7f52017-04-26 13:45:37 -04001173EGLBoolean EGLAPIENTRY GetSyncAttrib(EGLDisplay dpy,
1174 EGLSync sync,
1175 EGLint attribute,
1176 EGLAttrib *value)
Geoff Lange7c6e432014-12-03 14:48:07 -05001177{
Jamie Madill231c7f52017-04-26 13:45:37 -04001178 EVENT(
1179 "(EGLDisplay dpy = 0x%0.8p, EGLSync sync = 0x%0.8p, EGLint attribute = 0x%X, EGLAttrib "
1180 "*value = 0x%0.8p)",
1181 dpy, sync, attribute, value);
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001182 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001183
1184 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001185 thread->setError(EglBadDisplay() << "eglSyncAttrib unimplemented.");
Geoff Lange7c6e432014-12-03 14:48:07 -05001186 return EGL_FALSE;
1187}
1188
Jamie Madill231c7f52017-04-26 13:45:37 -04001189EGLImage EGLAPIENTRY CreateImage(EGLDisplay dpy,
1190 EGLContext ctx,
1191 EGLenum target,
1192 EGLClientBuffer buffer,
1193 const EGLAttrib *attrib_list)
Jamie Madill254f3682015-01-29 16:33:07 -05001194{
Jamie Madill231c7f52017-04-26 13:45:37 -04001195 EVENT(
1196 "(EGLDisplay dpy = 0x%0.8p, EGLContext ctx = 0x%0.8p, EGLenum target = 0x%X, "
1197 "EGLClientBuffer buffer = 0x%0.8p, const EGLAttrib *attrib_list = 0x%0.8p)",
1198 dpy, ctx, target, buffer, attrib_list);
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001199 Thread *thread = GetCurrentThread();
Jamie Madill254f3682015-01-29 16:33:07 -05001200
1201 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001202 thread->setError(EglBadDisplay() << "eglCreateImage unimplemented.");
Jamie Madill254f3682015-01-29 16:33:07 -05001203 return EGL_NO_IMAGE;
1204}
1205
1206EGLBoolean EGLAPIENTRY DestroyImage(EGLDisplay dpy, EGLImage image)
1207{
1208 EVENT("(EGLDisplay dpy = 0x%0.8p, EGLImage image = 0x%0.8p)", dpy, image);
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001209 Thread *thread = GetCurrentThread();
Jamie Madill254f3682015-01-29 16:33:07 -05001210
1211 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001212 thread->setError(EglBadDisplay() << "eglDestroyImage unimplemented.");
Jamie Madill254f3682015-01-29 16:33:07 -05001213 return EGL_FALSE;
1214}
1215
Jamie Madill231c7f52017-04-26 13:45:37 -04001216EGLDisplay EGLAPIENTRY GetPlatformDisplay(EGLenum platform,
1217 void *native_display,
1218 const EGLAttrib *attrib_list)
Geoff Lange7c6e432014-12-03 14:48:07 -05001219{
Jamie Madill231c7f52017-04-26 13:45:37 -04001220 EVENT(
1221 "(EGLenum platform = %d, void* native_display = 0x%0.8p, const EGLint* attrib_list = "
1222 "0x%0.8p)",
1223 platform, native_display, attrib_list);
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001224 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001225
Jamie Madill6811a312017-05-24 16:50:06 -04001226 Error err = ValidateGetPlatformDisplay(platform, native_display, attrib_list);
1227 thread->setError(err);
1228 if (err.isError())
1229 {
1230 return EGL_NO_DISPLAY;
1231 }
1232
Jamie Madill948bbe52017-06-01 13:10:42 -04001233 const auto &attribMap = AttributeMap::CreateFromAttribArray(attrib_list);
Jamie Madill6811a312017-05-24 16:50:06 -04001234 if (platform == EGL_PLATFORM_ANGLE_ANGLE)
1235 {
1236 return Display::GetDisplayFromNativeDisplay(
Jamie Madill948bbe52017-06-01 13:10:42 -04001237 gl::bitCast<EGLNativeDisplayType>(native_display), attribMap);
Jamie Madill6811a312017-05-24 16:50:06 -04001238 }
1239 else if (platform == EGL_PLATFORM_DEVICE_EXT)
1240 {
1241 Device *eglDevice = reinterpret_cast<Device *>(native_display);
Jamie Madill948bbe52017-06-01 13:10:42 -04001242 return Display::GetDisplayFromDevice(eglDevice, attribMap);
Jamie Madill6811a312017-05-24 16:50:06 -04001243 }
1244 else
1245 {
1246 UNREACHABLE();
1247 return EGL_NO_DISPLAY;
1248 }
Geoff Lange7c6e432014-12-03 14:48:07 -05001249}
1250
Jamie Madill231c7f52017-04-26 13:45:37 -04001251EGLSurface EGLAPIENTRY CreatePlatformWindowSurface(EGLDisplay dpy,
1252 EGLConfig config,
1253 void *native_window,
1254 const EGLAttrib *attrib_list)
Geoff Lange7c6e432014-12-03 14:48:07 -05001255{
Jamie Madill231c7f52017-04-26 13:45:37 -04001256 EVENT(
1257 "(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, void* native_window = 0x%0.8p, "
1258 "const EGLint* attrib_list = 0x%0.8p)",
1259 dpy, config, native_window, attrib_list);
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001260 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001261
1262 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001263 thread->setError(EglBadDisplay() << "eglCreatePlatformWindowSurface unimplemented.");
Geoff Lange7c6e432014-12-03 14:48:07 -05001264 return EGL_NO_SURFACE;
1265}
1266
Jamie Madill231c7f52017-04-26 13:45:37 -04001267EGLSurface EGLAPIENTRY CreatePlatformPixmapSurface(EGLDisplay dpy,
1268 EGLConfig config,
1269 void *native_pixmap,
1270 const EGLAttrib *attrib_list)
Geoff Lange7c6e432014-12-03 14:48:07 -05001271{
Jamie Madill231c7f52017-04-26 13:45:37 -04001272 EVENT(
1273 "(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, void* native_pixmap = 0x%0.8p, "
1274 "const EGLint* attrib_list = 0x%0.8p)",
1275 dpy, config, native_pixmap, attrib_list);
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001276 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001277
1278 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001279 thread->setError(EglBadDisplay() << "eglCreatePlatformPixmapSurface unimplemented.");
Geoff Lange7c6e432014-12-03 14:48:07 -05001280 return EGL_NO_SURFACE;
1281}
1282
Geoff Lang130e6e82014-12-05 12:17:40 -05001283EGLBoolean EGLAPIENTRY WaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags)
Geoff Lange7c6e432014-12-03 14:48:07 -05001284{
Jamie Madill231c7f52017-04-26 13:45:37 -04001285 EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSync sync = 0x%0.8p, EGLint flags = 0x%X)", dpy, sync,
1286 flags);
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001287 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001288
1289 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001290 thread->setError(EglBadDisplay() << "eglWaitSync unimplemented.");
Geoff Lange7c6e432014-12-03 14:48:07 -05001291 return EGL_FALSE;
1292}
1293
Geoff Lang130e6e82014-12-05 12:17:40 -05001294__eglMustCastToProperFunctionPointerType EGLAPIENTRY GetProcAddress(const char *procname)
Geoff Lange7c6e432014-12-03 14:48:07 -05001295{
1296 EVENT("(const char *procname = \"%s\")", procname);
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001297 Thread *thread = GetCurrentThread();
Geoff Lange7c6e432014-12-03 14:48:07 -05001298
Geoff Lang55659362015-08-26 13:39:59 -04001299 typedef std::map<std::string, __eglMustCastToProperFunctionPointerType> ProcAddressMap;
Jamie Madill231c7f52017-04-26 13:45:37 -04001300 auto generateProcAddressMap = []() {
Geoff Lang55659362015-08-26 13:39:59 -04001301 ProcAddressMap map;
1302#define INSERT_PROC_ADDRESS(ns, proc) \
Geoff Langa65a4c72015-08-27 10:38:40 -04001303 map[#ns #proc] = reinterpret_cast<__eglMustCastToProperFunctionPointerType>(ns::proc)
Geoff Lang55659362015-08-26 13:39:59 -04001304
Corentin Wallez64598b52016-11-11 08:25:44 -05001305#define INSERT_PROC_ADDRESS_NO_NS(name, proc) \
1306 map[name] = reinterpret_cast<__eglMustCastToProperFunctionPointerType>(proc)
1307
Geoff Lang55659362015-08-26 13:39:59 -04001308 // GLES2 core
1309 INSERT_PROC_ADDRESS(gl, ActiveTexture);
1310 INSERT_PROC_ADDRESS(gl, AttachShader);
1311 INSERT_PROC_ADDRESS(gl, BindAttribLocation);
1312 INSERT_PROC_ADDRESS(gl, BindBuffer);
1313 INSERT_PROC_ADDRESS(gl, BindFramebuffer);
1314 INSERT_PROC_ADDRESS(gl, BindRenderbuffer);
1315 INSERT_PROC_ADDRESS(gl, BindTexture);
1316 INSERT_PROC_ADDRESS(gl, BlendColor);
1317 INSERT_PROC_ADDRESS(gl, BlendEquation);
1318 INSERT_PROC_ADDRESS(gl, BlendEquationSeparate);
1319 INSERT_PROC_ADDRESS(gl, BlendFunc);
1320 INSERT_PROC_ADDRESS(gl, BlendFuncSeparate);
1321 INSERT_PROC_ADDRESS(gl, BufferData);
1322 INSERT_PROC_ADDRESS(gl, BufferSubData);
1323 INSERT_PROC_ADDRESS(gl, CheckFramebufferStatus);
1324 INSERT_PROC_ADDRESS(gl, Clear);
1325 INSERT_PROC_ADDRESS(gl, ClearColor);
1326 INSERT_PROC_ADDRESS(gl, ClearDepthf);
1327 INSERT_PROC_ADDRESS(gl, ClearStencil);
1328 INSERT_PROC_ADDRESS(gl, ColorMask);
1329 INSERT_PROC_ADDRESS(gl, CompileShader);
1330 INSERT_PROC_ADDRESS(gl, CompressedTexImage2D);
1331 INSERT_PROC_ADDRESS(gl, CompressedTexSubImage2D);
1332 INSERT_PROC_ADDRESS(gl, CopyTexImage2D);
1333 INSERT_PROC_ADDRESS(gl, CopyTexSubImage2D);
1334 INSERT_PROC_ADDRESS(gl, CreateProgram);
1335 INSERT_PROC_ADDRESS(gl, CreateShader);
1336 INSERT_PROC_ADDRESS(gl, CullFace);
1337 INSERT_PROC_ADDRESS(gl, DeleteBuffers);
1338 INSERT_PROC_ADDRESS(gl, DeleteFramebuffers);
1339 INSERT_PROC_ADDRESS(gl, DeleteProgram);
1340 INSERT_PROC_ADDRESS(gl, DeleteRenderbuffers);
1341 INSERT_PROC_ADDRESS(gl, DeleteShader);
1342 INSERT_PROC_ADDRESS(gl, DeleteTextures);
1343 INSERT_PROC_ADDRESS(gl, DepthFunc);
1344 INSERT_PROC_ADDRESS(gl, DepthMask);
1345 INSERT_PROC_ADDRESS(gl, DepthRangef);
1346 INSERT_PROC_ADDRESS(gl, DetachShader);
1347 INSERT_PROC_ADDRESS(gl, Disable);
1348 INSERT_PROC_ADDRESS(gl, DisableVertexAttribArray);
1349 INSERT_PROC_ADDRESS(gl, DrawArrays);
1350 INSERT_PROC_ADDRESS(gl, DrawElements);
1351 INSERT_PROC_ADDRESS(gl, Enable);
1352 INSERT_PROC_ADDRESS(gl, EnableVertexAttribArray);
1353 INSERT_PROC_ADDRESS(gl, Finish);
1354 INSERT_PROC_ADDRESS(gl, Flush);
1355 INSERT_PROC_ADDRESS(gl, FramebufferRenderbuffer);
1356 INSERT_PROC_ADDRESS(gl, FramebufferTexture2D);
1357 INSERT_PROC_ADDRESS(gl, FrontFace);
1358 INSERT_PROC_ADDRESS(gl, GenBuffers);
1359 INSERT_PROC_ADDRESS(gl, GenerateMipmap);
1360 INSERT_PROC_ADDRESS(gl, GenFramebuffers);
1361 INSERT_PROC_ADDRESS(gl, GenRenderbuffers);
1362 INSERT_PROC_ADDRESS(gl, GenTextures);
1363 INSERT_PROC_ADDRESS(gl, GetActiveAttrib);
1364 INSERT_PROC_ADDRESS(gl, GetActiveUniform);
1365 INSERT_PROC_ADDRESS(gl, GetAttachedShaders);
1366 INSERT_PROC_ADDRESS(gl, GetAttribLocation);
1367 INSERT_PROC_ADDRESS(gl, GetBooleanv);
1368 INSERT_PROC_ADDRESS(gl, GetBufferParameteriv);
1369 INSERT_PROC_ADDRESS(gl, GetError);
1370 INSERT_PROC_ADDRESS(gl, GetFloatv);
1371 INSERT_PROC_ADDRESS(gl, GetFramebufferAttachmentParameteriv);
1372 INSERT_PROC_ADDRESS(gl, GetIntegerv);
1373 INSERT_PROC_ADDRESS(gl, GetProgramiv);
1374 INSERT_PROC_ADDRESS(gl, GetProgramInfoLog);
1375 INSERT_PROC_ADDRESS(gl, GetRenderbufferParameteriv);
1376 INSERT_PROC_ADDRESS(gl, GetShaderiv);
1377 INSERT_PROC_ADDRESS(gl, GetShaderInfoLog);
1378 INSERT_PROC_ADDRESS(gl, GetShaderPrecisionFormat);
1379 INSERT_PROC_ADDRESS(gl, GetShaderSource);
1380 INSERT_PROC_ADDRESS(gl, GetString);
1381 INSERT_PROC_ADDRESS(gl, GetTexParameterfv);
1382 INSERT_PROC_ADDRESS(gl, GetTexParameteriv);
1383 INSERT_PROC_ADDRESS(gl, GetUniformfv);
1384 INSERT_PROC_ADDRESS(gl, GetUniformiv);
1385 INSERT_PROC_ADDRESS(gl, GetUniformLocation);
1386 INSERT_PROC_ADDRESS(gl, GetVertexAttribfv);
1387 INSERT_PROC_ADDRESS(gl, GetVertexAttribiv);
1388 INSERT_PROC_ADDRESS(gl, GetVertexAttribPointerv);
1389 INSERT_PROC_ADDRESS(gl, Hint);
1390 INSERT_PROC_ADDRESS(gl, IsBuffer);
1391 INSERT_PROC_ADDRESS(gl, IsEnabled);
1392 INSERT_PROC_ADDRESS(gl, IsFramebuffer);
1393 INSERT_PROC_ADDRESS(gl, IsProgram);
1394 INSERT_PROC_ADDRESS(gl, IsRenderbuffer);
1395 INSERT_PROC_ADDRESS(gl, IsShader);
1396 INSERT_PROC_ADDRESS(gl, IsTexture);
1397 INSERT_PROC_ADDRESS(gl, LineWidth);
1398 INSERT_PROC_ADDRESS(gl, LinkProgram);
1399 INSERT_PROC_ADDRESS(gl, PixelStorei);
1400 INSERT_PROC_ADDRESS(gl, PolygonOffset);
1401 INSERT_PROC_ADDRESS(gl, ReadPixels);
1402 INSERT_PROC_ADDRESS(gl, ReleaseShaderCompiler);
1403 INSERT_PROC_ADDRESS(gl, RenderbufferStorage);
1404 INSERT_PROC_ADDRESS(gl, SampleCoverage);
1405 INSERT_PROC_ADDRESS(gl, Scissor);
1406 INSERT_PROC_ADDRESS(gl, ShaderBinary);
1407 INSERT_PROC_ADDRESS(gl, ShaderSource);
1408 INSERT_PROC_ADDRESS(gl, StencilFunc);
1409 INSERT_PROC_ADDRESS(gl, StencilFuncSeparate);
1410 INSERT_PROC_ADDRESS(gl, StencilMask);
1411 INSERT_PROC_ADDRESS(gl, StencilMaskSeparate);
1412 INSERT_PROC_ADDRESS(gl, StencilOp);
1413 INSERT_PROC_ADDRESS(gl, StencilOpSeparate);
1414 INSERT_PROC_ADDRESS(gl, TexImage2D);
1415 INSERT_PROC_ADDRESS(gl, TexParameterf);
1416 INSERT_PROC_ADDRESS(gl, TexParameterfv);
1417 INSERT_PROC_ADDRESS(gl, TexParameteri);
1418 INSERT_PROC_ADDRESS(gl, TexParameteriv);
1419 INSERT_PROC_ADDRESS(gl, TexSubImage2D);
1420 INSERT_PROC_ADDRESS(gl, Uniform1f);
1421 INSERT_PROC_ADDRESS(gl, Uniform1fv);
1422 INSERT_PROC_ADDRESS(gl, Uniform1i);
1423 INSERT_PROC_ADDRESS(gl, Uniform1iv);
1424 INSERT_PROC_ADDRESS(gl, Uniform2f);
1425 INSERT_PROC_ADDRESS(gl, Uniform2fv);
1426 INSERT_PROC_ADDRESS(gl, Uniform2i);
1427 INSERT_PROC_ADDRESS(gl, Uniform2iv);
1428 INSERT_PROC_ADDRESS(gl, Uniform3f);
1429 INSERT_PROC_ADDRESS(gl, Uniform3fv);
1430 INSERT_PROC_ADDRESS(gl, Uniform3i);
1431 INSERT_PROC_ADDRESS(gl, Uniform3iv);
1432 INSERT_PROC_ADDRESS(gl, Uniform4f);
1433 INSERT_PROC_ADDRESS(gl, Uniform4fv);
1434 INSERT_PROC_ADDRESS(gl, Uniform4i);
1435 INSERT_PROC_ADDRESS(gl, Uniform4iv);
1436 INSERT_PROC_ADDRESS(gl, UniformMatrix2fv);
1437 INSERT_PROC_ADDRESS(gl, UniformMatrix3fv);
1438 INSERT_PROC_ADDRESS(gl, UniformMatrix4fv);
1439 INSERT_PROC_ADDRESS(gl, UseProgram);
1440 INSERT_PROC_ADDRESS(gl, ValidateProgram);
1441 INSERT_PROC_ADDRESS(gl, VertexAttrib1f);
1442 INSERT_PROC_ADDRESS(gl, VertexAttrib1fv);
1443 INSERT_PROC_ADDRESS(gl, VertexAttrib2f);
1444 INSERT_PROC_ADDRESS(gl, VertexAttrib2fv);
1445 INSERT_PROC_ADDRESS(gl, VertexAttrib3f);
1446 INSERT_PROC_ADDRESS(gl, VertexAttrib3fv);
1447 INSERT_PROC_ADDRESS(gl, VertexAttrib4f);
1448 INSERT_PROC_ADDRESS(gl, VertexAttrib4fv);
1449 INSERT_PROC_ADDRESS(gl, VertexAttribPointer);
1450 INSERT_PROC_ADDRESS(gl, Viewport);
1451
1452 // GL_ANGLE_framebuffer_blit
1453 INSERT_PROC_ADDRESS(gl, BlitFramebufferANGLE);
1454
1455 // GL_ANGLE_framebuffer_multisample
1456 INSERT_PROC_ADDRESS(gl, RenderbufferStorageMultisampleANGLE);
1457
1458 // GL_EXT_discard_framebuffer
1459 INSERT_PROC_ADDRESS(gl, DiscardFramebufferEXT);
1460
1461 // GL_NV_fence
1462 INSERT_PROC_ADDRESS(gl, DeleteFencesNV);
1463 INSERT_PROC_ADDRESS(gl, GenFencesNV);
1464 INSERT_PROC_ADDRESS(gl, IsFenceNV);
1465 INSERT_PROC_ADDRESS(gl, TestFenceNV);
1466 INSERT_PROC_ADDRESS(gl, GetFenceivNV);
1467 INSERT_PROC_ADDRESS(gl, FinishFenceNV);
1468 INSERT_PROC_ADDRESS(gl, SetFenceNV);
1469
1470 // GL_ANGLE_translated_shader_source
1471 INSERT_PROC_ADDRESS(gl, GetTranslatedShaderSourceANGLE);
1472
1473 // GL_EXT_texture_storage
1474 INSERT_PROC_ADDRESS(gl, TexStorage2DEXT);
1475
1476 // GL_EXT_robustness
1477 INSERT_PROC_ADDRESS(gl, GetGraphicsResetStatusEXT);
1478 INSERT_PROC_ADDRESS(gl, ReadnPixelsEXT);
1479 INSERT_PROC_ADDRESS(gl, GetnUniformfvEXT);
1480 INSERT_PROC_ADDRESS(gl, GetnUniformivEXT);
1481
1482 // GL_EXT_occlusion_query_boolean
1483 INSERT_PROC_ADDRESS(gl, GenQueriesEXT);
1484 INSERT_PROC_ADDRESS(gl, DeleteQueriesEXT);
1485 INSERT_PROC_ADDRESS(gl, IsQueryEXT);
1486 INSERT_PROC_ADDRESS(gl, BeginQueryEXT);
1487 INSERT_PROC_ADDRESS(gl, EndQueryEXT);
1488 INSERT_PROC_ADDRESS(gl, GetQueryivEXT);
1489 INSERT_PROC_ADDRESS(gl, GetQueryObjectuivEXT);
1490
Geoff Lang7d20dd42016-06-07 10:45:36 -07001491 // GL_EXT_disjoint_timer_query
Bruce Dawson09e7c0a2017-03-01 16:38:32 -08001492 // Commented out functions are needed for GL_EXT_disjoint_timer_query
1493 // but are pulled in by GL_EXT_occlusion_query_boolean.
1494 // INSERT_PROC_ADDRESS(gl, GenQueriesEXT);
1495 // INSERT_PROC_ADDRESS(gl, DeleteQueriesEXT);
1496 // INSERT_PROC_ADDRESS(gl, IsQueryEXT);
1497 // INSERT_PROC_ADDRESS(gl, BeginQueryEXT);
1498 // INSERT_PROC_ADDRESS(gl, EndQueryEXT);
Geoff Lang7d20dd42016-06-07 10:45:36 -07001499 INSERT_PROC_ADDRESS(gl, QueryCounterEXT);
Bruce Dawson09e7c0a2017-03-01 16:38:32 -08001500 // INSERT_PROC_ADDRESS(gl, GetQueryivEXT);
Geoff Lang7d20dd42016-06-07 10:45:36 -07001501 INSERT_PROC_ADDRESS(gl, GetQueryObjectivEXT);
Bruce Dawson09e7c0a2017-03-01 16:38:32 -08001502 // INSERT_PROC_ADDRESS(gl, GetQueryObjectuivEXT);
Geoff Lang7d20dd42016-06-07 10:45:36 -07001503 INSERT_PROC_ADDRESS(gl, GetQueryObjecti64vEXT);
1504 INSERT_PROC_ADDRESS(gl, GetQueryObjectui64vEXT);
1505
Geoff Lang55659362015-08-26 13:39:59 -04001506 // GL_EXT_draw_buffers
1507 INSERT_PROC_ADDRESS(gl, DrawBuffersEXT);
1508
1509 // GL_ANGLE_instanced_arrays
1510 INSERT_PROC_ADDRESS(gl, DrawArraysInstancedANGLE);
1511 INSERT_PROC_ADDRESS(gl, DrawElementsInstancedANGLE);
1512 INSERT_PROC_ADDRESS(gl, VertexAttribDivisorANGLE);
1513
1514 // GL_OES_get_program_binary
1515 INSERT_PROC_ADDRESS(gl, GetProgramBinaryOES);
1516 INSERT_PROC_ADDRESS(gl, ProgramBinaryOES);
1517
1518 // GL_OES_mapbuffer
1519 INSERT_PROC_ADDRESS(gl, MapBufferOES);
1520 INSERT_PROC_ADDRESS(gl, UnmapBufferOES);
1521 INSERT_PROC_ADDRESS(gl, GetBufferPointervOES);
1522
1523 // GL_EXT_map_buffer_range
1524 INSERT_PROC_ADDRESS(gl, MapBufferRangeEXT);
1525 INSERT_PROC_ADDRESS(gl, FlushMappedBufferRangeEXT);
1526
1527 // GL_EXT_debug_marker
1528 INSERT_PROC_ADDRESS(gl, InsertEventMarkerEXT);
1529 INSERT_PROC_ADDRESS(gl, PushGroupMarkerEXT);
1530 INSERT_PROC_ADDRESS(gl, PopGroupMarkerEXT);
1531
1532 // GL_OES_EGL_image
1533 INSERT_PROC_ADDRESS(gl, EGLImageTargetTexture2DOES);
1534 INSERT_PROC_ADDRESS(gl, EGLImageTargetRenderbufferStorageOES);
1535
Austin Kinrossbc781f32015-10-26 09:27:38 -07001536 // GL_OES_vertex_array_object
1537 INSERT_PROC_ADDRESS(gl, BindVertexArrayOES);
1538 INSERT_PROC_ADDRESS(gl, DeleteVertexArraysOES);
1539 INSERT_PROC_ADDRESS(gl, GenVertexArraysOES);
1540 INSERT_PROC_ADDRESS(gl, IsVertexArrayOES);
1541
Geoff Lange102fee2015-12-10 11:23:30 -05001542 // GL_KHR_debug
1543 INSERT_PROC_ADDRESS(gl, DebugMessageControlKHR);
1544 INSERT_PROC_ADDRESS(gl, DebugMessageInsertKHR);
1545 INSERT_PROC_ADDRESS(gl, DebugMessageCallbackKHR);
1546 INSERT_PROC_ADDRESS(gl, GetDebugMessageLogKHR);
1547 INSERT_PROC_ADDRESS(gl, PushDebugGroupKHR);
1548 INSERT_PROC_ADDRESS(gl, PopDebugGroupKHR);
1549 INSERT_PROC_ADDRESS(gl, ObjectLabelKHR);
1550 INSERT_PROC_ADDRESS(gl, GetObjectLabelKHR);
1551 INSERT_PROC_ADDRESS(gl, ObjectPtrLabelKHR);
1552 INSERT_PROC_ADDRESS(gl, GetObjectPtrLabelKHR);
1553 INSERT_PROC_ADDRESS(gl, GetPointervKHR);
1554
Geoff Langd8605522016-04-13 10:19:12 -04001555 // GL_CHROMIUM_bind_uniform_location
1556 INSERT_PROC_ADDRESS(gl, BindUniformLocationCHROMIUM);
1557
Geoff Lang97073d12016-04-20 10:42:34 -07001558 // GL_CHROMIUM_copy_texture
1559 INSERT_PROC_ADDRESS(gl, CopyTextureCHROMIUM);
1560 INSERT_PROC_ADDRESS(gl, CopySubTextureCHROMIUM);
1561
Geoff Lang47110bf2016-04-20 11:13:22 -07001562 // GL_CHROMIUM_copy_compressed_texture
1563 INSERT_PROC_ADDRESS(gl, CompressedCopyTextureCHROMIUM);
1564
Geoff Langc339c4e2016-11-29 10:37:36 -05001565 // GL_ANGLE_request_extension
1566 INSERT_PROC_ADDRESS(gl, RequestExtensionANGLE);
Geoff Langc287ea62016-09-16 14:46:51 -04001567
Geoff Langff5b2d52016-09-07 11:32:23 -04001568 // GL_ANGLE_robust_client_memory
1569 INSERT_PROC_ADDRESS(gl, GetBooleanvRobustANGLE);
1570 INSERT_PROC_ADDRESS(gl, GetBufferParameterivRobustANGLE);
1571 INSERT_PROC_ADDRESS(gl, GetFloatvRobustANGLE);
1572 INSERT_PROC_ADDRESS(gl, GetFramebufferAttachmentParameterivRobustANGLE);
1573 INSERT_PROC_ADDRESS(gl, GetIntegervRobustANGLE);
1574 INSERT_PROC_ADDRESS(gl, GetProgramivRobustANGLE);
1575 INSERT_PROC_ADDRESS(gl, GetRenderbufferParameterivRobustANGLE);
1576 INSERT_PROC_ADDRESS(gl, GetShaderivRobustANGLE);
1577 INSERT_PROC_ADDRESS(gl, GetTexParameterfvRobustANGLE);
1578 INSERT_PROC_ADDRESS(gl, GetTexParameterivRobustANGLE);
1579 INSERT_PROC_ADDRESS(gl, GetUniformfvRobustANGLE);
1580 INSERT_PROC_ADDRESS(gl, GetUniformivRobustANGLE);
1581 INSERT_PROC_ADDRESS(gl, GetVertexAttribfvRobustANGLE);
1582 INSERT_PROC_ADDRESS(gl, GetVertexAttribivRobustANGLE);
1583 INSERT_PROC_ADDRESS(gl, GetVertexAttribPointervRobustANGLE);
1584 INSERT_PROC_ADDRESS(gl, ReadPixelsRobustANGLE);
1585 INSERT_PROC_ADDRESS(gl, TexImage2DRobustANGLE);
1586 INSERT_PROC_ADDRESS(gl, TexParameterfvRobustANGLE);
1587 INSERT_PROC_ADDRESS(gl, TexParameterivRobustANGLE);
1588 INSERT_PROC_ADDRESS(gl, TexSubImage2DRobustANGLE);
1589 INSERT_PROC_ADDRESS(gl, TexImage3DRobustANGLE);
1590 INSERT_PROC_ADDRESS(gl, TexSubImage3DRobustANGLE);
Corentin Wallezb2931602017-04-11 15:58:57 -04001591 INSERT_PROC_ADDRESS(gl, CompressedTexImage2DRobustANGLE);
1592 INSERT_PROC_ADDRESS(gl, CompressedTexSubImage2DRobustANGLE);
1593 INSERT_PROC_ADDRESS(gl, CompressedTexImage3DRobustANGLE);
1594 INSERT_PROC_ADDRESS(gl, CompressedTexSubImage3DRobustANGLE);
Geoff Langff5b2d52016-09-07 11:32:23 -04001595 INSERT_PROC_ADDRESS(gl, GetQueryivRobustANGLE);
1596 INSERT_PROC_ADDRESS(gl, GetQueryObjectuivRobustANGLE);
1597 INSERT_PROC_ADDRESS(gl, GetBufferPointervRobustANGLE);
1598 INSERT_PROC_ADDRESS(gl, GetIntegeri_vRobustANGLE);
Geoff Lang0a9661f2016-10-20 10:59:20 -07001599 INSERT_PROC_ADDRESS(gl, GetInternalformativRobustANGLE);
Geoff Langff5b2d52016-09-07 11:32:23 -04001600 INSERT_PROC_ADDRESS(gl, GetVertexAttribIivRobustANGLE);
1601 INSERT_PROC_ADDRESS(gl, GetVertexAttribIuivRobustANGLE);
1602 INSERT_PROC_ADDRESS(gl, GetUniformuivRobustANGLE);
1603 INSERT_PROC_ADDRESS(gl, GetActiveUniformBlockivRobustANGLE);
1604 INSERT_PROC_ADDRESS(gl, GetInteger64vRobustANGLE);
1605 INSERT_PROC_ADDRESS(gl, GetInteger64i_vRobustANGLE);
1606 INSERT_PROC_ADDRESS(gl, GetBufferParameteri64vRobustANGLE);
1607 INSERT_PROC_ADDRESS(gl, SamplerParameterivRobustANGLE);
1608 INSERT_PROC_ADDRESS(gl, SamplerParameterfvRobustANGLE);
1609 INSERT_PROC_ADDRESS(gl, GetSamplerParameterivRobustANGLE);
1610 INSERT_PROC_ADDRESS(gl, GetSamplerParameterfvRobustANGLE);
1611 INSERT_PROC_ADDRESS(gl, GetFramebufferParameterivRobustANGLE);
1612 INSERT_PROC_ADDRESS(gl, GetProgramInterfaceivRobustANGLE);
1613 INSERT_PROC_ADDRESS(gl, GetBooleani_vRobustANGLE);
1614 INSERT_PROC_ADDRESS(gl, GetMultisamplefvRobustANGLE);
1615 INSERT_PROC_ADDRESS(gl, GetTexLevelParameterivRobustANGLE);
1616 INSERT_PROC_ADDRESS(gl, GetTexLevelParameterfvRobustANGLE);
1617 INSERT_PROC_ADDRESS(gl, GetPointervRobustANGLERobustANGLE);
1618 INSERT_PROC_ADDRESS(gl, ReadnPixelsRobustANGLE);
1619 INSERT_PROC_ADDRESS(gl, GetnUniformfvRobustANGLE);
1620 INSERT_PROC_ADDRESS(gl, GetnUniformivRobustANGLE);
1621 INSERT_PROC_ADDRESS(gl, GetnUniformuivRobustANGLE);
1622 INSERT_PROC_ADDRESS(gl, TexParameterIivRobustANGLE);
1623 INSERT_PROC_ADDRESS(gl, TexParameterIuivRobustANGLE);
1624 INSERT_PROC_ADDRESS(gl, GetTexParameterIivRobustANGLE);
1625 INSERT_PROC_ADDRESS(gl, GetTexParameterIuivRobustANGLE);
1626 INSERT_PROC_ADDRESS(gl, SamplerParameterIivRobustANGLE);
1627 INSERT_PROC_ADDRESS(gl, SamplerParameterIuivRobustANGLE);
1628 INSERT_PROC_ADDRESS(gl, GetSamplerParameterIivRobustANGLE);
1629 INSERT_PROC_ADDRESS(gl, GetSamplerParameterIuivRobustANGLE);
1630 INSERT_PROC_ADDRESS(gl, GetQueryObjectivRobustANGLE);
1631 INSERT_PROC_ADDRESS(gl, GetQueryObjecti64vRobustANGLE);
1632 INSERT_PROC_ADDRESS(gl, GetQueryObjectui64vRobustANGLE);
1633
Geoff Lang55659362015-08-26 13:39:59 -04001634 // GLES3 core
1635 INSERT_PROC_ADDRESS(gl, ReadBuffer);
1636 INSERT_PROC_ADDRESS(gl, DrawRangeElements);
1637 INSERT_PROC_ADDRESS(gl, TexImage3D);
1638 INSERT_PROC_ADDRESS(gl, TexSubImage3D);
1639 INSERT_PROC_ADDRESS(gl, CopyTexSubImage3D);
1640 INSERT_PROC_ADDRESS(gl, CompressedTexImage3D);
1641 INSERT_PROC_ADDRESS(gl, CompressedTexSubImage3D);
1642 INSERT_PROC_ADDRESS(gl, GenQueries);
1643 INSERT_PROC_ADDRESS(gl, DeleteQueries);
1644 INSERT_PROC_ADDRESS(gl, IsQuery);
1645 INSERT_PROC_ADDRESS(gl, BeginQuery);
1646 INSERT_PROC_ADDRESS(gl, EndQuery);
1647 INSERT_PROC_ADDRESS(gl, GetQueryiv);
1648 INSERT_PROC_ADDRESS(gl, GetQueryObjectuiv);
1649 INSERT_PROC_ADDRESS(gl, UnmapBuffer);
1650 INSERT_PROC_ADDRESS(gl, GetBufferPointerv);
1651 INSERT_PROC_ADDRESS(gl, DrawBuffers);
1652 INSERT_PROC_ADDRESS(gl, UniformMatrix2x3fv);
1653 INSERT_PROC_ADDRESS(gl, UniformMatrix3x2fv);
1654 INSERT_PROC_ADDRESS(gl, UniformMatrix2x4fv);
1655 INSERT_PROC_ADDRESS(gl, UniformMatrix4x2fv);
1656 INSERT_PROC_ADDRESS(gl, UniformMatrix3x4fv);
1657 INSERT_PROC_ADDRESS(gl, UniformMatrix4x3fv);
1658 INSERT_PROC_ADDRESS(gl, BlitFramebuffer);
1659 INSERT_PROC_ADDRESS(gl, RenderbufferStorageMultisample);
1660 INSERT_PROC_ADDRESS(gl, FramebufferTextureLayer);
1661 INSERT_PROC_ADDRESS(gl, MapBufferRange);
1662 INSERT_PROC_ADDRESS(gl, FlushMappedBufferRange);
1663 INSERT_PROC_ADDRESS(gl, BindVertexArray);
1664 INSERT_PROC_ADDRESS(gl, DeleteVertexArrays);
1665 INSERT_PROC_ADDRESS(gl, GenVertexArrays);
1666 INSERT_PROC_ADDRESS(gl, IsVertexArray);
1667 INSERT_PROC_ADDRESS(gl, GetIntegeri_v);
1668 INSERT_PROC_ADDRESS(gl, BeginTransformFeedback);
1669 INSERT_PROC_ADDRESS(gl, EndTransformFeedback);
1670 INSERT_PROC_ADDRESS(gl, BindBufferRange);
1671 INSERT_PROC_ADDRESS(gl, BindBufferBase);
1672 INSERT_PROC_ADDRESS(gl, TransformFeedbackVaryings);
1673 INSERT_PROC_ADDRESS(gl, GetTransformFeedbackVarying);
1674 INSERT_PROC_ADDRESS(gl, VertexAttribIPointer);
1675 INSERT_PROC_ADDRESS(gl, GetVertexAttribIiv);
1676 INSERT_PROC_ADDRESS(gl, GetVertexAttribIuiv);
1677 INSERT_PROC_ADDRESS(gl, VertexAttribI4i);
1678 INSERT_PROC_ADDRESS(gl, VertexAttribI4ui);
1679 INSERT_PROC_ADDRESS(gl, VertexAttribI4iv);
1680 INSERT_PROC_ADDRESS(gl, VertexAttribI4uiv);
1681 INSERT_PROC_ADDRESS(gl, GetUniformuiv);
1682 INSERT_PROC_ADDRESS(gl, GetFragDataLocation);
1683 INSERT_PROC_ADDRESS(gl, Uniform1ui);
1684 INSERT_PROC_ADDRESS(gl, Uniform2ui);
1685 INSERT_PROC_ADDRESS(gl, Uniform3ui);
1686 INSERT_PROC_ADDRESS(gl, Uniform4ui);
1687 INSERT_PROC_ADDRESS(gl, Uniform1uiv);
1688 INSERT_PROC_ADDRESS(gl, Uniform2uiv);
1689 INSERT_PROC_ADDRESS(gl, Uniform3uiv);
1690 INSERT_PROC_ADDRESS(gl, Uniform4uiv);
1691 INSERT_PROC_ADDRESS(gl, ClearBufferiv);
1692 INSERT_PROC_ADDRESS(gl, ClearBufferuiv);
1693 INSERT_PROC_ADDRESS(gl, ClearBufferfv);
1694 INSERT_PROC_ADDRESS(gl, ClearBufferfi);
1695 INSERT_PROC_ADDRESS(gl, GetStringi);
1696 INSERT_PROC_ADDRESS(gl, CopyBufferSubData);
1697 INSERT_PROC_ADDRESS(gl, GetUniformIndices);
1698 INSERT_PROC_ADDRESS(gl, GetActiveUniformsiv);
1699 INSERT_PROC_ADDRESS(gl, GetUniformBlockIndex);
1700 INSERT_PROC_ADDRESS(gl, GetActiveUniformBlockiv);
1701 INSERT_PROC_ADDRESS(gl, GetActiveUniformBlockName);
1702 INSERT_PROC_ADDRESS(gl, UniformBlockBinding);
1703 INSERT_PROC_ADDRESS(gl, DrawArraysInstanced);
1704 INSERT_PROC_ADDRESS(gl, DrawElementsInstanced);
Corentin Wallez64598b52016-11-11 08:25:44 -05001705 // FenceSync is the name of a class, the function has an added _ to prevent a name conflict.
1706 INSERT_PROC_ADDRESS_NO_NS("glFenceSync", gl::FenceSync_);
Geoff Lang55659362015-08-26 13:39:59 -04001707 INSERT_PROC_ADDRESS(gl, IsSync);
1708 INSERT_PROC_ADDRESS(gl, DeleteSync);
1709 INSERT_PROC_ADDRESS(gl, ClientWaitSync);
1710 INSERT_PROC_ADDRESS(gl, WaitSync);
1711 INSERT_PROC_ADDRESS(gl, GetInteger64v);
1712 INSERT_PROC_ADDRESS(gl, GetSynciv);
1713 INSERT_PROC_ADDRESS(gl, GetInteger64i_v);
1714 INSERT_PROC_ADDRESS(gl, GetBufferParameteri64v);
1715 INSERT_PROC_ADDRESS(gl, GenSamplers);
1716 INSERT_PROC_ADDRESS(gl, DeleteSamplers);
1717 INSERT_PROC_ADDRESS(gl, IsSampler);
1718 INSERT_PROC_ADDRESS(gl, BindSampler);
1719 INSERT_PROC_ADDRESS(gl, SamplerParameteri);
1720 INSERT_PROC_ADDRESS(gl, SamplerParameteriv);
1721 INSERT_PROC_ADDRESS(gl, SamplerParameterf);
1722 INSERT_PROC_ADDRESS(gl, SamplerParameterfv);
1723 INSERT_PROC_ADDRESS(gl, GetSamplerParameteriv);
1724 INSERT_PROC_ADDRESS(gl, GetSamplerParameterfv);
1725 INSERT_PROC_ADDRESS(gl, VertexAttribDivisor);
1726 INSERT_PROC_ADDRESS(gl, BindTransformFeedback);
1727 INSERT_PROC_ADDRESS(gl, DeleteTransformFeedbacks);
1728 INSERT_PROC_ADDRESS(gl, GenTransformFeedbacks);
1729 INSERT_PROC_ADDRESS(gl, IsTransformFeedback);
1730 INSERT_PROC_ADDRESS(gl, PauseTransformFeedback);
1731 INSERT_PROC_ADDRESS(gl, ResumeTransformFeedback);
1732 INSERT_PROC_ADDRESS(gl, GetProgramBinary);
1733 INSERT_PROC_ADDRESS(gl, ProgramBinary);
1734 INSERT_PROC_ADDRESS(gl, ProgramParameteri);
1735 INSERT_PROC_ADDRESS(gl, InvalidateFramebuffer);
1736 INSERT_PROC_ADDRESS(gl, InvalidateSubFramebuffer);
1737 INSERT_PROC_ADDRESS(gl, TexStorage2D);
1738 INSERT_PROC_ADDRESS(gl, TexStorage3D);
1739 INSERT_PROC_ADDRESS(gl, GetInternalformativ);
1740
Martin Radevee7e1e22016-07-18 15:39:47 +03001741 // GLES31 core
1742 INSERT_PROC_ADDRESS(gl, DispatchCompute);
1743 INSERT_PROC_ADDRESS(gl, DispatchComputeIndirect);
1744 INSERT_PROC_ADDRESS(gl, DrawArraysIndirect);
1745 INSERT_PROC_ADDRESS(gl, DrawElementsIndirect);
1746 INSERT_PROC_ADDRESS(gl, FramebufferParameteri);
1747 INSERT_PROC_ADDRESS(gl, GetFramebufferParameteriv);
1748 INSERT_PROC_ADDRESS(gl, GetProgramInterfaceiv);
1749 INSERT_PROC_ADDRESS(gl, GetProgramResourceIndex);
1750 INSERT_PROC_ADDRESS(gl, GetProgramResourceName);
1751 INSERT_PROC_ADDRESS(gl, GetProgramResourceiv);
1752 INSERT_PROC_ADDRESS(gl, GetProgramResourceLocation);
1753 INSERT_PROC_ADDRESS(gl, UseProgramStages);
1754 INSERT_PROC_ADDRESS(gl, ActiveShaderProgram);
1755 INSERT_PROC_ADDRESS(gl, CreateShaderProgramv);
1756 INSERT_PROC_ADDRESS(gl, BindProgramPipeline);
1757 INSERT_PROC_ADDRESS(gl, DeleteProgramPipelines);
1758 INSERT_PROC_ADDRESS(gl, GenProgramPipelines);
1759 INSERT_PROC_ADDRESS(gl, IsProgramPipeline);
1760 INSERT_PROC_ADDRESS(gl, GetProgramPipelineiv);
1761 INSERT_PROC_ADDRESS(gl, ProgramUniform1i);
1762 INSERT_PROC_ADDRESS(gl, ProgramUniform2i);
1763 INSERT_PROC_ADDRESS(gl, ProgramUniform3i);
1764 INSERT_PROC_ADDRESS(gl, ProgramUniform4i);
1765 INSERT_PROC_ADDRESS(gl, ProgramUniform1ui);
1766 INSERT_PROC_ADDRESS(gl, ProgramUniform2ui);
1767 INSERT_PROC_ADDRESS(gl, ProgramUniform3ui);
1768 INSERT_PROC_ADDRESS(gl, ProgramUniform4ui);
1769 INSERT_PROC_ADDRESS(gl, ProgramUniform1f);
1770 INSERT_PROC_ADDRESS(gl, ProgramUniform2f);
1771 INSERT_PROC_ADDRESS(gl, ProgramUniform3f);
1772 INSERT_PROC_ADDRESS(gl, ProgramUniform4f);
1773 INSERT_PROC_ADDRESS(gl, ProgramUniform1iv);
1774 INSERT_PROC_ADDRESS(gl, ProgramUniform2iv);
1775 INSERT_PROC_ADDRESS(gl, ProgramUniform3iv);
1776 INSERT_PROC_ADDRESS(gl, ProgramUniform4iv);
1777 INSERT_PROC_ADDRESS(gl, ProgramUniform1uiv);
1778 INSERT_PROC_ADDRESS(gl, ProgramUniform2uiv);
1779 INSERT_PROC_ADDRESS(gl, ProgramUniform3uiv);
1780 INSERT_PROC_ADDRESS(gl, ProgramUniform4uiv);
1781 INSERT_PROC_ADDRESS(gl, ProgramUniform1fv);
1782 INSERT_PROC_ADDRESS(gl, ProgramUniform2fv);
1783 INSERT_PROC_ADDRESS(gl, ProgramUniform3fv);
1784 INSERT_PROC_ADDRESS(gl, ProgramUniform4fv);
1785 INSERT_PROC_ADDRESS(gl, ProgramUniformMatrix2fv);
1786 INSERT_PROC_ADDRESS(gl, ProgramUniformMatrix3fv);
1787 INSERT_PROC_ADDRESS(gl, ProgramUniformMatrix4fv);
1788 INSERT_PROC_ADDRESS(gl, ProgramUniformMatrix2x3fv);
1789 INSERT_PROC_ADDRESS(gl, ProgramUniformMatrix3x2fv);
1790 INSERT_PROC_ADDRESS(gl, ProgramUniformMatrix2x4fv);
1791 INSERT_PROC_ADDRESS(gl, ProgramUniformMatrix4x2fv);
1792 INSERT_PROC_ADDRESS(gl, ProgramUniformMatrix3x4fv);
1793 INSERT_PROC_ADDRESS(gl, ProgramUniformMatrix4x3fv);
1794 INSERT_PROC_ADDRESS(gl, ValidateProgramPipeline);
1795 INSERT_PROC_ADDRESS(gl, GetProgramPipelineInfoLog);
1796 INSERT_PROC_ADDRESS(gl, BindImageTexture);
1797 INSERT_PROC_ADDRESS(gl, GetBooleani_v);
1798 INSERT_PROC_ADDRESS(gl, MemoryBarrier);
1799 INSERT_PROC_ADDRESS(gl, MemoryBarrierByRegion);
1800 INSERT_PROC_ADDRESS(gl, TexStorage2DMultisample);
1801 INSERT_PROC_ADDRESS(gl, GetMultisamplefv);
1802 INSERT_PROC_ADDRESS(gl, SampleMaski);
1803 INSERT_PROC_ADDRESS(gl, GetTexLevelParameteriv);
1804 INSERT_PROC_ADDRESS(gl, GetTexLevelParameterfv);
1805 INSERT_PROC_ADDRESS(gl, BindVertexBuffer);
1806 INSERT_PROC_ADDRESS(gl, VertexAttribFormat);
1807 INSERT_PROC_ADDRESS(gl, VertexAttribIFormat);
1808 INSERT_PROC_ADDRESS(gl, VertexAttribBinding);
1809 INSERT_PROC_ADDRESS(gl, VertexBindingDivisor);
1810
Geoff Lang55659362015-08-26 13:39:59 -04001811 // EGL 1.0
1812 INSERT_PROC_ADDRESS(egl, ChooseConfig);
1813 INSERT_PROC_ADDRESS(egl, CopyBuffers);
1814 INSERT_PROC_ADDRESS(egl, CreateContext);
1815 INSERT_PROC_ADDRESS(egl, CreatePbufferSurface);
1816 INSERT_PROC_ADDRESS(egl, CreatePixmapSurface);
1817 INSERT_PROC_ADDRESS(egl, CreateWindowSurface);
1818 INSERT_PROC_ADDRESS(egl, DestroyContext);
1819 INSERT_PROC_ADDRESS(egl, DestroySurface);
1820 INSERT_PROC_ADDRESS(egl, GetConfigAttrib);
1821 INSERT_PROC_ADDRESS(egl, GetConfigs);
1822 INSERT_PROC_ADDRESS(egl, GetCurrentDisplay);
1823 INSERT_PROC_ADDRESS(egl, GetCurrentSurface);
1824 INSERT_PROC_ADDRESS(egl, GetDisplay);
1825 INSERT_PROC_ADDRESS(egl, GetError);
1826 INSERT_PROC_ADDRESS(egl, GetProcAddress);
1827 INSERT_PROC_ADDRESS(egl, Initialize);
1828 INSERT_PROC_ADDRESS(egl, MakeCurrent);
1829 INSERT_PROC_ADDRESS(egl, QueryContext);
1830 INSERT_PROC_ADDRESS(egl, QueryString);
1831 INSERT_PROC_ADDRESS(egl, QuerySurface);
1832 INSERT_PROC_ADDRESS(egl, SwapBuffers);
1833 INSERT_PROC_ADDRESS(egl, Terminate);
1834 INSERT_PROC_ADDRESS(egl, WaitGL);
1835 INSERT_PROC_ADDRESS(egl, WaitNative);
1836
1837 // EGL 1.1
1838 INSERT_PROC_ADDRESS(egl, BindTexImage);
1839 INSERT_PROC_ADDRESS(egl, ReleaseTexImage);
1840 INSERT_PROC_ADDRESS(egl, SurfaceAttrib);
1841 INSERT_PROC_ADDRESS(egl, SwapInterval);
1842
1843 // EGL 1.2
1844 INSERT_PROC_ADDRESS(egl, BindAPI);
1845 INSERT_PROC_ADDRESS(egl, QueryAPI);
1846 INSERT_PROC_ADDRESS(egl, CreatePbufferFromClientBuffer);
1847 INSERT_PROC_ADDRESS(egl, ReleaseThread);
1848 INSERT_PROC_ADDRESS(egl, WaitClient);
1849
1850 // EGL 1.4
1851 INSERT_PROC_ADDRESS(egl, GetCurrentContext);
1852
1853 // EGL 1.5
1854 INSERT_PROC_ADDRESS(egl, CreateSync);
1855 INSERT_PROC_ADDRESS(egl, DestroySync);
1856 INSERT_PROC_ADDRESS(egl, ClientWaitSync);
1857 INSERT_PROC_ADDRESS(egl, GetSyncAttrib);
1858 INSERT_PROC_ADDRESS(egl, CreateImage);
1859 INSERT_PROC_ADDRESS(egl, DestroyImage);
1860 INSERT_PROC_ADDRESS(egl, GetPlatformDisplay);
1861 INSERT_PROC_ADDRESS(egl, CreatePlatformWindowSurface);
1862 INSERT_PROC_ADDRESS(egl, CreatePlatformPixmapSurface);
1863 INSERT_PROC_ADDRESS(egl, WaitSync);
1864
1865 // EGL_ANGLE_query_surface_pointer
1866 INSERT_PROC_ADDRESS(egl, QuerySurfacePointerANGLE);
1867
1868 // EGL_NV_post_sub_buffer
1869 INSERT_PROC_ADDRESS(egl, PostSubBufferNV);
1870
1871 // EGL_EXT_platform_base
1872 INSERT_PROC_ADDRESS(egl, GetPlatformDisplayEXT);
1873
1874 // EGL_EXT_device_query
1875 INSERT_PROC_ADDRESS(egl, QueryDisplayAttribEXT);
1876 INSERT_PROC_ADDRESS(egl, QueryDeviceAttribEXT);
1877 INSERT_PROC_ADDRESS(egl, QueryDeviceStringEXT);
1878
1879 // EGL_KHR_image_base/EGL_KHR_image
1880 INSERT_PROC_ADDRESS(egl, CreateImageKHR);
1881 INSERT_PROC_ADDRESS(egl, DestroyImageKHR);
1882
Austin Kinrossfc1a44a2015-12-02 12:37:10 -08001883 // EGL_EXT_device_creation
1884 INSERT_PROC_ADDRESS(egl, CreateDeviceANGLE);
1885 INSERT_PROC_ADDRESS(egl, ReleaseDeviceANGLE);
1886
Ian Ewell701b74b2016-03-02 15:26:39 -05001887 // EGL_KHR_stream
1888 INSERT_PROC_ADDRESS(egl, CreateStreamKHR);
1889 INSERT_PROC_ADDRESS(egl, DestroyStreamKHR);
1890 INSERT_PROC_ADDRESS(egl, StreamAttribKHR);
1891 INSERT_PROC_ADDRESS(egl, QueryStreamKHR);
1892 INSERT_PROC_ADDRESS(egl, QueryStreamu64KHR);
1893
Ian Ewell54f87462016-03-10 13:47:21 -05001894 // EGL_KHR_stream_consumer_gltexture
1895 INSERT_PROC_ADDRESS(egl, StreamConsumerGLTextureExternalKHR);
1896 INSERT_PROC_ADDRESS(egl, StreamConsumerAcquireKHR);
1897 INSERT_PROC_ADDRESS(egl, StreamConsumerReleaseKHR);
1898
1899 // EGL_NV_stream_consumer_gltexture_yuv
1900 INSERT_PROC_ADDRESS(egl, StreamConsumerGLTextureExternalAttribsNV);
1901
Ian Ewellbda75592016-04-18 17:25:54 -04001902 // EGL_ANGLE_stream_producer_d3d_texture_nv12
1903 INSERT_PROC_ADDRESS(egl, CreateStreamProducerD3DTextureNV12ANGLE);
1904 INSERT_PROC_ADDRESS(egl, StreamPostD3DTextureNV12ANGLE);
1905
Stanislav Chiknavaryanee218f22017-03-22 15:39:13 -07001906 // EGL_CHROMIUM_get_sync_values
1907 INSERT_PROC_ADDRESS(egl, GetSyncValuesCHROMIUM);
1908
Geoff Langa284f2f2015-08-07 16:49:07 -04001909 // EGL_EXT_swap_buffers_with_damage
1910 INSERT_PROC_ADDRESS(egl, SwapBuffersWithDamageEXT);
1911
Corentin Wallez64598b52016-11-11 08:25:44 -05001912 // angle::Platform related entry points
Jamie Madillb1eeba12017-02-13 16:36:40 -05001913 INSERT_PROC_ADDRESS_NO_NS("ANGLEGetDisplayPlatform", ANGLEGetDisplayPlatform);
1914 INSERT_PROC_ADDRESS_NO_NS("ANGLEResetDisplayPlatform", ANGLEResetDisplayPlatform);
Corentin Wallez64598b52016-11-11 08:25:44 -05001915
Geoff Lang55659362015-08-26 13:39:59 -04001916#undef INSERT_PROC_ADDRESS
Corentin Wallez64598b52016-11-11 08:25:44 -05001917#undef INSERT_PROC_ADDRESS_NO_NS
1918
Geoff Lang55659362015-08-26 13:39:59 -04001919 return map;
Geoff Lange7c6e432014-12-03 14:48:07 -05001920 };
1921
Geoff Lang55659362015-08-26 13:39:59 -04001922 static const ProcAddressMap procAddressMap = generateProcAddressMap();
Geoff Lange7c6e432014-12-03 14:48:07 -05001923
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05001924 thread->setError(NoError());
Geoff Lang55659362015-08-26 13:39:59 -04001925 auto iter = procAddressMap.find(procname);
Geoff Lang7b8f3c92016-11-10 10:42:48 -05001926 return iter != procAddressMap.end() ? iter->second : nullptr;
Geoff Lange7c6e432014-12-03 14:48:07 -05001927}
Geoff Lange7c6e432014-12-03 14:48:07 -05001928}