Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1 | // |
| 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 Madill | 2e16d96 | 2017-04-19 14:06:36 -0400 | [diff] [blame] | 11 | #include "libGLESv2/entry_points_gles_2_0_autogen.h" |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 12 | #include "libGLESv2/entry_points_gles_2_0_ext.h" |
Geoff Lang | 5565936 | 2015-08-26 13:39:59 -0400 | [diff] [blame] | 13 | #include "libGLESv2/entry_points_gles_3_0.h" |
Martin Radev | ee7e1e2 | 2016-07-18 15:39:47 +0300 | [diff] [blame] | 14 | #include "libGLESv2/entry_points_gles_3_1.h" |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 15 | #include "libGLESv2/global_state.h" |
| 16 | |
| 17 | #include "libANGLE/Context.h" |
| 18 | #include "libANGLE/Display.h" |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 19 | #include "libANGLE/Surface.h" |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 20 | #include "libANGLE/Texture.h" |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 21 | #include "libANGLE/Thread.h" |
Geoff Lang | 65603eb | 2017-01-12 16:48:03 -0500 | [diff] [blame] | 22 | #include "libANGLE/queryutils.h" |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 23 | #include "libANGLE/validationEGL.h" |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 24 | |
| 25 | #include "common/debug.h" |
| 26 | #include "common/version.h" |
| 27 | |
Corentin Wallez | 64598b5 | 2016-11-11 08:25:44 -0500 | [diff] [blame] | 28 | #include "platform/Platform.h" |
| 29 | |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 30 | #include <EGL/eglext.h> |
| 31 | |
| 32 | namespace egl |
| 33 | { |
| 34 | |
Geoff Lang | 65603eb | 2017-01-12 16:48:03 -0500 | [diff] [blame] | 35 | namespace |
| 36 | { |
| 37 | |
| 38 | void 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 Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 57 | // EGL 1.0 |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 58 | EGLint EGLAPIENTRY GetError(void) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 59 | { |
| 60 | EVENT("()"); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 61 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 62 | |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 63 | EGLint error = thread->getError(); |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 64 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 65 | return error; |
| 66 | } |
| 67 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 68 | EGLDisplay EGLAPIENTRY GetDisplay(EGLNativeDisplayType display_id) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 69 | { |
| 70 | EVENT("(EGLNativeDisplayType display_id = 0x%0.8p)", display_id); |
| 71 | |
Geoff Lang | e70413c | 2017-01-12 16:35:17 -0500 | [diff] [blame] | 72 | return Display::GetDisplayFromNativeDisplay(display_id, AttributeMap()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 73 | } |
| 74 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 75 | EGLBoolean EGLAPIENTRY Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 76 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 77 | 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 Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 80 | |
Austin Kinross | 26d8435 | 2015-11-02 11:08:16 -0800 | [diff] [blame] | 81 | Display *display = static_cast<Display *>(dpy); |
| 82 | if (dpy == EGL_NO_DISPLAY || !Display::isValidDisplay(display)) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 83 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 84 | thread->setError(EglBadDisplay()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 85 | return EGL_FALSE; |
| 86 | } |
| 87 | |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 88 | Error error = display->initialize(); |
| 89 | if (error.isError()) |
| 90 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 91 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 92 | return EGL_FALSE; |
| 93 | } |
| 94 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 95 | if (major) |
| 96 | *major = 1; |
| 97 | if (minor) |
| 98 | *minor = 4; |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 99 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 100 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 101 | return EGL_TRUE; |
| 102 | } |
| 103 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 104 | EGLBoolean EGLAPIENTRY Terminate(EGLDisplay dpy) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 105 | { |
| 106 | EVENT("(EGLDisplay dpy = 0x%0.8p)", dpy); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 107 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 108 | |
Austin Kinross | 26d8435 | 2015-11-02 11:08:16 -0800 | [diff] [blame] | 109 | Display *display = static_cast<Display *>(dpy); |
| 110 | if (dpy == EGL_NO_DISPLAY || !Display::isValidDisplay(display)) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 111 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 112 | thread->setError(EglBadDisplay()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 113 | return EGL_FALSE; |
| 114 | } |
| 115 | |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 116 | if (display->isValidContext(thread->getContext())) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 117 | { |
Jamie Madill | 61e16b4 | 2017-06-19 11:13:23 -0400 | [diff] [blame] | 118 | thread->setCurrent(nullptr); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 119 | } |
| 120 | |
Jamie Madill | 4928b7c | 2017-06-20 12:57:39 -0400 | [diff] [blame] | 121 | Error error = display->terminate(); |
| 122 | if (error.isError()) |
| 123 | { |
| 124 | thread->setError(error); |
| 125 | return EGL_FALSE; |
| 126 | } |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 127 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 128 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 129 | return EGL_TRUE; |
| 130 | } |
| 131 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 132 | const char *EGLAPIENTRY QueryString(EGLDisplay dpy, EGLint name) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 133 | { |
| 134 | EVENT("(EGLDisplay dpy = 0x%0.8p, EGLint name = %d)", dpy, name); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 135 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 136 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 137 | Display *display = static_cast<Display *>(dpy); |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 138 | if (!(display == EGL_NO_DISPLAY && name == EGL_EXTENSIONS)) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 139 | { |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 140 | Error error = ValidateDisplay(display); |
| 141 | if (error.isError()) |
| 142 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 143 | thread->setError(error); |
Yunchao He | f81ce4a | 2017-04-24 10:49:17 +0800 | [diff] [blame] | 144 | return nullptr; |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 145 | } |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 146 | } |
| 147 | |
| 148 | const char *result; |
| 149 | switch (name) |
| 150 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 151 | case EGL_CLIENT_APIS: |
| 152 | result = "OpenGL_ES"; |
| 153 | break; |
| 154 | case EGL_EXTENSIONS: |
| 155 | if (display == EGL_NO_DISPLAY) |
| 156 | { |
Jamie Madill | 948bbe5 | 2017-06-01 13:10:42 -0400 | [diff] [blame] | 157 | result = Display::GetClientExtensionString().c_str(); |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 158 | } |
| 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 Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 171 | thread->setError(EglBadParameter()); |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 172 | return nullptr; |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 173 | } |
| 174 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 175 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 176 | return result; |
| 177 | } |
| 178 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 179 | EGLBoolean EGLAPIENTRY GetConfigs(EGLDisplay dpy, |
| 180 | EGLConfig *configs, |
| 181 | EGLint config_size, |
| 182 | EGLint *num_config) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 183 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 184 | 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 Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 189 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 190 | Display *display = static_cast<Display *>(dpy); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 191 | |
Geoff Lang | 65603eb | 2017-01-12 16:48:03 -0500 | [diff] [blame] | 192 | Error error = ValidateGetConfigs(display, config_size, num_config); |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 193 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 194 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 195 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 196 | return EGL_FALSE; |
| 197 | } |
| 198 | |
Geoff Lang | 65603eb | 2017-01-12 16:48:03 -0500 | [diff] [blame] | 199 | ClipConfigs(display->getConfigs(AttributeMap()), configs, config_size, num_config); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 200 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 201 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 202 | return EGL_TRUE; |
| 203 | } |
| 204 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 205 | EGLBoolean EGLAPIENTRY ChooseConfig(EGLDisplay dpy, |
| 206 | const EGLint *attrib_list, |
| 207 | EGLConfig *configs, |
| 208 | EGLint config_size, |
| 209 | EGLint *num_config) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 210 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 211 | 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 Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 216 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 217 | Display *display = static_cast<Display *>(dpy); |
Geoff Lang | 65603eb | 2017-01-12 16:48:03 -0500 | [diff] [blame] | 218 | AttributeMap attribMap = AttributeMap::CreateFromIntArray(attrib_list); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 219 | |
Geoff Lang | 65603eb | 2017-01-12 16:48:03 -0500 | [diff] [blame] | 220 | Error error = ValidateChooseConfig(display, attribMap, config_size, num_config); |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 221 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 222 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 223 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 224 | return EGL_FALSE; |
| 225 | } |
| 226 | |
Geoff Lang | 65603eb | 2017-01-12 16:48:03 -0500 | [diff] [blame] | 227 | ClipConfigs(display->getConfigs(attribMap), configs, config_size, num_config); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 228 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 229 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 230 | return EGL_TRUE; |
| 231 | } |
| 232 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 233 | EGLBoolean EGLAPIENTRY GetConfigAttrib(EGLDisplay dpy, |
| 234 | EGLConfig config, |
| 235 | EGLint attribute, |
| 236 | EGLint *value) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 237 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 238 | 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 Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 243 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 244 | Display *display = static_cast<Display *>(dpy); |
| 245 | Config *configuration = static_cast<Config *>(config); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 246 | |
Geoff Lang | 65603eb | 2017-01-12 16:48:03 -0500 | [diff] [blame] | 247 | Error error = ValidateGetConfigAttrib(display, configuration, attribute); |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 248 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 249 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 250 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 251 | return EGL_FALSE; |
| 252 | } |
| 253 | |
Geoff Lang | 65603eb | 2017-01-12 16:48:03 -0500 | [diff] [blame] | 254 | QueryConfigAttrib(configuration, attribute, value); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 255 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 256 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 257 | return EGL_TRUE; |
| 258 | } |
| 259 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 260 | EGLSurface EGLAPIENTRY CreateWindowSurface(EGLDisplay dpy, |
| 261 | EGLConfig config, |
| 262 | EGLNativeWindowType win, |
| 263 | const EGLint *attrib_list) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 264 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 265 | 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 Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 270 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 271 | Display *display = static_cast<Display *>(dpy); |
| 272 | Config *configuration = static_cast<Config *>(config); |
Ian Ewell | ec2c0c5 | 2016-04-05 13:46:26 -0400 | [diff] [blame] | 273 | AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 274 | |
Geoff Lang | 0eef082 | 2015-01-19 16:22:40 -0500 | [diff] [blame] | 275 | Error error = ValidateCreateWindowSurface(display, configuration, win, attributes); |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 276 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 277 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 278 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 279 | return EGL_NO_SURFACE; |
| 280 | } |
| 281 | |
Geoff Lang | 0eef082 | 2015-01-19 16:22:40 -0500 | [diff] [blame] | 282 | egl::Surface *surface = nullptr; |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 283 | error = display->createWindowSurface(configuration, win, attributes, &surface); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 284 | if (error.isError()) |
| 285 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 286 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 287 | return EGL_NO_SURFACE; |
| 288 | } |
| 289 | |
Geoff Lang | 0eef082 | 2015-01-19 16:22:40 -0500 | [diff] [blame] | 290 | return static_cast<EGLSurface>(surface); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 291 | } |
| 292 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 293 | EGLSurface EGLAPIENTRY CreatePbufferSurface(EGLDisplay dpy, |
| 294 | EGLConfig config, |
| 295 | const EGLint *attrib_list) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 296 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 297 | 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 Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 302 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 303 | Display *display = static_cast<Display *>(dpy); |
| 304 | Config *configuration = static_cast<Config *>(config); |
Ian Ewell | ec2c0c5 | 2016-04-05 13:46:26 -0400 | [diff] [blame] | 305 | AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 306 | |
Geoff Lang | f81b6a1 | 2015-01-19 16:51:55 -0500 | [diff] [blame] | 307 | Error error = ValidateCreatePbufferSurface(display, configuration, attributes); |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 308 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 309 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 310 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 311 | return EGL_NO_SURFACE; |
| 312 | } |
| 313 | |
Geoff Lang | f81b6a1 | 2015-01-19 16:51:55 -0500 | [diff] [blame] | 314 | egl::Surface *surface = nullptr; |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 315 | error = display->createPbufferSurface(configuration, attributes, &surface); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 316 | if (error.isError()) |
| 317 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 318 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 319 | return EGL_NO_SURFACE; |
| 320 | } |
| 321 | |
Geoff Lang | f81b6a1 | 2015-01-19 16:51:55 -0500 | [diff] [blame] | 322 | return static_cast<EGLSurface>(surface); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 323 | } |
| 324 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 325 | EGLSurface EGLAPIENTRY CreatePixmapSurface(EGLDisplay dpy, |
| 326 | EGLConfig config, |
| 327 | EGLNativePixmapType pixmap, |
| 328 | const EGLint *attrib_list) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 329 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 330 | 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 Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 335 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 336 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 337 | Display *display = static_cast<Display *>(dpy); |
| 338 | Config *configuration = static_cast<Config *>(config); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 339 | |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 340 | Error error = ValidateConfig(display, configuration); |
| 341 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 342 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 343 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 344 | return EGL_NO_SURFACE; |
| 345 | } |
| 346 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 347 | UNIMPLEMENTED(); // FIXME |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 348 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 349 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 350 | return EGL_NO_SURFACE; |
| 351 | } |
| 352 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 353 | EGLBoolean EGLAPIENTRY DestroySurface(EGLDisplay dpy, EGLSurface surface) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 354 | { |
| 355 | EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p)", dpy, surface); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 356 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 357 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 358 | Display *display = static_cast<Display *>(dpy); |
| 359 | Surface *eglSurface = static_cast<Surface *>(surface); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 360 | |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 361 | Error error = ValidateSurface(display, eglSurface); |
| 362 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 363 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 364 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 365 | return EGL_FALSE; |
| 366 | } |
| 367 | |
| 368 | if (surface == EGL_NO_SURFACE) |
| 369 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 370 | thread->setError(EglBadSurface()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 371 | return EGL_FALSE; |
| 372 | } |
| 373 | |
Jamie Madill | 4928b7c | 2017-06-20 12:57:39 -0400 | [diff] [blame] | 374 | error = display->destroySurface(reinterpret_cast<Surface *>(surface)); |
| 375 | if (error.isError()) |
| 376 | { |
| 377 | thread->setError(error); |
| 378 | return EGL_FALSE; |
| 379 | } |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 380 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 381 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 382 | return EGL_TRUE; |
| 383 | } |
| 384 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 385 | EGLBoolean EGLAPIENTRY QuerySurface(EGLDisplay dpy, |
| 386 | EGLSurface surface, |
| 387 | EGLint attribute, |
| 388 | EGLint *value) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 389 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 390 | 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 Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 394 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 395 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 396 | Display *display = static_cast<Display *>(dpy); |
| 397 | Surface *eglSurface = (Surface *)surface; |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 398 | |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 399 | Error error = ValidateSurface(display, eglSurface); |
| 400 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 401 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 402 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 403 | return EGL_FALSE; |
| 404 | } |
| 405 | |
| 406 | if (surface == EGL_NO_SURFACE) |
| 407 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 408 | thread->setError(EglBadSurface()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 409 | return EGL_FALSE; |
| 410 | } |
| 411 | |
| 412 | switch (attribute) |
| 413 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 414 | 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 Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 465 | thread->setError(EglBadAttribute()); |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 466 | return EGL_FALSE; |
| 467 | } |
| 468 | *value = eglSurface->isPostSubBufferSupported(); |
| 469 | break; |
| 470 | case EGL_FIXED_SIZE_ANGLE: |
| 471 | if (!display->getExtensions().windowFixedSize) |
| 472 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 473 | thread->setError(EglBadAttribute()); |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 474 | 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 Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 481 | thread->setError( |
| 482 | EglBadAttribute() |
| 483 | << "EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE cannot be " |
| 484 | "used without EGL_ANGLE_flexible_surface_compatibility support."); |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 485 | return EGL_FALSE; |
| 486 | } |
| 487 | *value = eglSurface->flexibleSurfaceCompatibilityRequested(); |
| 488 | break; |
| 489 | case EGL_SURFACE_ORIENTATION_ANGLE: |
| 490 | if (!display->getExtensions().surfaceOrientation) |
| 491 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 492 | thread->setError(EglBadAttribute() << "EGL_SURFACE_ORIENTATION_ANGLE cannot be " |
| 493 | "queried without " |
| 494 | "EGL_ANGLE_surface_orientation support."); |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 495 | return EGL_FALSE; |
| 496 | } |
| 497 | *value = eglSurface->getOrientation(); |
| 498 | break; |
| 499 | case EGL_DIRECT_COMPOSITION_ANGLE: |
| 500 | if (!display->getExtensions().directComposition) |
| 501 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 502 | thread->setError(EglBadAttribute() << "EGL_DIRECT_COMPOSITION_ANGLE cannot be " |
| 503 | "used without " |
| 504 | "EGL_ANGLE_direct_composition support."); |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 505 | return EGL_FALSE; |
| 506 | } |
| 507 | *value = eglSurface->directComposition(); |
| 508 | break; |
| 509 | default: |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 510 | thread->setError(EglBadAttribute()); |
Geoff Lang | b931e72 | 2014-12-11 13:49:13 -0500 | [diff] [blame] | 511 | return EGL_FALSE; |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 512 | } |
| 513 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 514 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 515 | return EGL_TRUE; |
| 516 | } |
| 517 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 518 | EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, |
| 519 | EGLConfig config, |
| 520 | EGLContext share_context, |
| 521 | const EGLint *attrib_list) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 522 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 523 | 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 Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 528 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 529 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 530 | Display *display = static_cast<Display *>(dpy); |
| 531 | Config *configuration = static_cast<Config *>(config); |
| 532 | gl::Context *sharedGLContext = static_cast<gl::Context *>(share_context); |
Ian Ewell | ec2c0c5 | 2016-04-05 13:46:26 -0400 | [diff] [blame] | 533 | AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list); |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 534 | |
Geoff Lang | 33b6ae5 | 2015-01-19 15:58:09 -0500 | [diff] [blame] | 535 | Error error = ValidateCreateContext(display, configuration, sharedGLContext, attributes); |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 536 | if (error.isError()) |
Geoff Lang | b931e72 | 2014-12-11 13:49:13 -0500 | [diff] [blame] | 537 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 538 | thread->setError(error); |
Geoff Lang | b931e72 | 2014-12-11 13:49:13 -0500 | [diff] [blame] | 539 | return EGL_NO_CONTEXT; |
| 540 | } |
| 541 | |
Geoff Lang | 33b6ae5 | 2015-01-19 15:58:09 -0500 | [diff] [blame] | 542 | gl::Context *context = nullptr; |
| 543 | error = display->createContext(configuration, sharedGLContext, attributes, &context); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 544 | if (error.isError()) |
| 545 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 546 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 547 | return EGL_NO_CONTEXT; |
| 548 | } |
| 549 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 550 | thread->setError(NoError()); |
Geoff Lang | 33b6ae5 | 2015-01-19 15:58:09 -0500 | [diff] [blame] | 551 | return static_cast<EGLContext>(context); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 552 | } |
| 553 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 554 | EGLBoolean EGLAPIENTRY DestroyContext(EGLDisplay dpy, EGLContext ctx) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 555 | { |
| 556 | EVENT("(EGLDisplay dpy = 0x%0.8p, EGLContext ctx = 0x%0.8p)", dpy, ctx); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 557 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 558 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 559 | Display *display = static_cast<Display *>(dpy); |
| 560 | gl::Context *context = static_cast<gl::Context *>(ctx); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 561 | |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 562 | Error error = ValidateContext(display, context); |
| 563 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 564 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 565 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 566 | return EGL_FALSE; |
| 567 | } |
| 568 | |
| 569 | if (ctx == EGL_NO_CONTEXT) |
| 570 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 571 | thread->setError(EglBadContext()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 572 | return EGL_FALSE; |
| 573 | } |
| 574 | |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 575 | if (context == thread->getContext()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 576 | { |
Jamie Madill | 61e16b4 | 2017-06-19 11:13:23 -0400 | [diff] [blame] | 577 | thread->setCurrent(nullptr); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 578 | } |
| 579 | |
Jamie Madill | 4928b7c | 2017-06-20 12:57:39 -0400 | [diff] [blame] | 580 | error = display->destroyContext(context); |
| 581 | if (error.isError()) |
| 582 | { |
| 583 | thread->setError(error); |
| 584 | return EGL_FALSE; |
| 585 | } |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 586 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 587 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 588 | return EGL_TRUE; |
| 589 | } |
| 590 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 591 | EGLBoolean EGLAPIENTRY MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 592 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 593 | 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 Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 597 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 598 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 599 | Display *display = static_cast<Display *>(dpy); |
| 600 | gl::Context *context = static_cast<gl::Context *>(ctx); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 601 | |
Corentin Wallez | c295e51 | 2017-01-27 17:47:50 -0500 | [diff] [blame] | 602 | Error error = ValidateMakeCurrent(display, draw, read, context); |
| 603 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 604 | { |
Corentin Wallez | c295e51 | 2017-01-27 17:47:50 -0500 | [diff] [blame] | 605 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 606 | return EGL_FALSE; |
| 607 | } |
| 608 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 609 | Surface *readSurface = static_cast<Surface *>(read); |
Corentin Wallez | c295e51 | 2017-01-27 17:47:50 -0500 | [diff] [blame] | 610 | Surface *drawSurface = static_cast<Surface *>(draw); |
Corentin Wallez | c70e120 | 2015-07-10 10:53:01 -0400 | [diff] [blame] | 611 | Error makeCurrentError = display->makeCurrent(drawSurface, readSurface, context); |
| 612 | if (makeCurrentError.isError()) |
| 613 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 614 | thread->setError(makeCurrentError); |
Corentin Wallez | c70e120 | 2015-07-10 10:53:01 -0400 | [diff] [blame] | 615 | return EGL_FALSE; |
| 616 | } |
| 617 | |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 618 | gl::Context *previousContext = thread->getContext(); |
Jamie Madill | 61e16b4 | 2017-06-19 11:13:23 -0400 | [diff] [blame] | 619 | thread->setCurrent(context); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 620 | |
Jamie Madill | 77a72f6 | 2015-04-14 11:18:32 -0400 | [diff] [blame] | 621 | // Release the surface from the previously-current context, to allow |
| 622 | // destroyed surfaces to delete themselves. |
| 623 | if (previousContext != nullptr && context != previousContext) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 624 | { |
Jamie Madill | 4928b7c | 2017-06-20 12:57:39 -0400 | [diff] [blame] | 625 | auto err = previousContext->releaseSurface(display); |
| 626 | if (err.isError()) |
| 627 | { |
| 628 | thread->setError(err); |
| 629 | return EGL_FALSE; |
| 630 | } |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 631 | } |
| 632 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 633 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 634 | return EGL_TRUE; |
| 635 | } |
| 636 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 637 | EGLSurface EGLAPIENTRY GetCurrentSurface(EGLint readdraw) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 638 | { |
| 639 | EVENT("(EGLint readdraw = %d)", readdraw); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 640 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 641 | |
| 642 | if (readdraw == EGL_READ) |
| 643 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 644 | thread->setError(NoError()); |
Jamie Madill | 61e16b4 | 2017-06-19 11:13:23 -0400 | [diff] [blame] | 645 | return thread->getCurrentReadSurface(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 646 | } |
| 647 | else if (readdraw == EGL_DRAW) |
| 648 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 649 | thread->setError(NoError()); |
Jamie Madill | 61e16b4 | 2017-06-19 11:13:23 -0400 | [diff] [blame] | 650 | return thread->getCurrentDrawSurface(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 651 | } |
| 652 | else |
| 653 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 654 | thread->setError(EglBadParameter()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 655 | return EGL_NO_SURFACE; |
| 656 | } |
| 657 | } |
| 658 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 659 | EGLDisplay EGLAPIENTRY GetCurrentDisplay(void) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 660 | { |
| 661 | EVENT("()"); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 662 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 663 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 664 | thread->setError(NoError()); |
Jamie Madill | 61e16b4 | 2017-06-19 11:13:23 -0400 | [diff] [blame] | 665 | if (thread->getContext() != nullptr) |
| 666 | { |
| 667 | return thread->getContext()->getCurrentDisplay(); |
| 668 | } |
| 669 | return EGL_NO_DISPLAY; |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 670 | } |
| 671 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 672 | EGLBoolean EGLAPIENTRY QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 673 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 674 | 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 Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 678 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 679 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 680 | Display *display = static_cast<Display *>(dpy); |
| 681 | gl::Context *context = static_cast<gl::Context *>(ctx); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 682 | |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 683 | Error error = ValidateContext(display, context); |
| 684 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 685 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 686 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 687 | return EGL_FALSE; |
| 688 | } |
| 689 | |
Régis Fénéon | 8310797 | 2015-02-05 12:57:44 +0100 | [diff] [blame] | 690 | switch (attribute) |
| 691 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 692 | 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 Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 705 | thread->setError(EglBadAttribute()); |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 706 | return EGL_FALSE; |
Régis Fénéon | 8310797 | 2015-02-05 12:57:44 +0100 | [diff] [blame] | 707 | } |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 708 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 709 | thread->setError(NoError()); |
Régis Fénéon | 8310797 | 2015-02-05 12:57:44 +0100 | [diff] [blame] | 710 | return EGL_TRUE; |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 711 | } |
| 712 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 713 | EGLBoolean EGLAPIENTRY WaitGL(void) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 714 | { |
| 715 | EVENT("()"); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 716 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 717 | |
Jamie Madill | 61e16b4 | 2017-06-19 11:13:23 -0400 | [diff] [blame] | 718 | Display *display = thread->getCurrentDisplay(); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 719 | |
| 720 | Error error = ValidateDisplay(display); |
| 721 | if (error.isError()) |
| 722 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 723 | thread->setError(error); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 724 | 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 Madill | fe54834 | 2017-06-19 11:13:24 -0400 | [diff] [blame] | 729 | error = display->waitClient(thread->getContext()); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 730 | if (error.isError()) |
| 731 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 732 | thread->setError(error); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 733 | return EGL_FALSE; |
| 734 | } |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 735 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 736 | thread->setError(NoError()); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 737 | return EGL_TRUE; |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 738 | } |
| 739 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 740 | EGLBoolean EGLAPIENTRY WaitNative(EGLint engine) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 741 | { |
| 742 | EVENT("(EGLint engine = %d)", engine); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 743 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 744 | |
Jamie Madill | 61e16b4 | 2017-06-19 11:13:23 -0400 | [diff] [blame] | 745 | Display *display = thread->getCurrentDisplay(); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 746 | |
| 747 | Error error = ValidateDisplay(display); |
| 748 | if (error.isError()) |
| 749 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 750 | thread->setError(error); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 751 | return EGL_FALSE; |
| 752 | } |
| 753 | |
| 754 | if (engine != EGL_CORE_NATIVE_ENGINE) |
| 755 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 756 | thread->setError(EglBadParameter() << "the 'engine' parameter has an unrecognized value"); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 757 | } |
| 758 | |
Jamie Madill | fe54834 | 2017-06-19 11:13:24 -0400 | [diff] [blame] | 759 | error = display->waitNative(thread->getContext(), engine); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 760 | if (error.isError()) |
| 761 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 762 | thread->setError(error); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 763 | return EGL_FALSE; |
| 764 | } |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 765 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 766 | thread->setError(NoError()); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 767 | return EGL_TRUE; |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 768 | } |
| 769 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 770 | EGLBoolean EGLAPIENTRY SwapBuffers(EGLDisplay dpy, EGLSurface surface) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 771 | { |
| 772 | EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p)", dpy, surface); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 773 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 774 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 775 | Display *display = static_cast<Display *>(dpy); |
| 776 | Surface *eglSurface = (Surface *)surface; |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 777 | |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 778 | Error error = ValidateSurface(display, eglSurface); |
| 779 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 780 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 781 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 782 | return EGL_FALSE; |
| 783 | } |
| 784 | |
Corentin Wallez | 9c721c6 | 2016-08-02 14:56:23 -0400 | [diff] [blame] | 785 | if (display->testDeviceLost()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 786 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 787 | thread->setError(EglContextLost()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 788 | return EGL_FALSE; |
| 789 | } |
| 790 | |
| 791 | if (surface == EGL_NO_SURFACE) |
| 792 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 793 | thread->setError(EglBadSurface()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 794 | return EGL_FALSE; |
| 795 | } |
| 796 | |
Jamie Madill | fe54834 | 2017-06-19 11:13:24 -0400 | [diff] [blame] | 797 | if (!thread->getContext() || thread->getCurrentDrawSurface() != eglSurface) |
| 798 | { |
| 799 | thread->setError(EglBadSurface()); |
| 800 | return EGL_FALSE; |
| 801 | } |
| 802 | |
| 803 | error = eglSurface->swap(thread->getContext()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 804 | if (error.isError()) |
| 805 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 806 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 807 | return EGL_FALSE; |
| 808 | } |
| 809 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 810 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 811 | return EGL_TRUE; |
| 812 | } |
| 813 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 814 | EGLBoolean EGLAPIENTRY CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 815 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 816 | EVENT( |
| 817 | "(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLNativePixmapType target = " |
| 818 | "0x%0.8p)", |
| 819 | dpy, surface, target); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 820 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 821 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 822 | Display *display = static_cast<Display *>(dpy); |
| 823 | Surface *eglSurface = static_cast<Surface *>(surface); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 824 | |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 825 | Error error = ValidateSurface(display, eglSurface); |
| 826 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 827 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 828 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 829 | return EGL_FALSE; |
| 830 | } |
| 831 | |
Corentin Wallez | 9c721c6 | 2016-08-02 14:56:23 -0400 | [diff] [blame] | 832 | if (display->testDeviceLost()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 833 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 834 | thread->setError(EglContextLost()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 835 | return EGL_FALSE; |
| 836 | } |
| 837 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 838 | UNIMPLEMENTED(); // FIXME |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 839 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 840 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 841 | return 0; |
| 842 | } |
| 843 | |
| 844 | // EGL 1.1 |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 845 | EGLBoolean EGLAPIENTRY BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 846 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 847 | EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint buffer = %d)", dpy, |
| 848 | surface, buffer); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 849 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 850 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 851 | Display *display = static_cast<Display *>(dpy); |
| 852 | Surface *eglSurface = static_cast<Surface *>(surface); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 853 | |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 854 | Error error = ValidateSurface(display, eglSurface); |
| 855 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 856 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 857 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 858 | return EGL_FALSE; |
| 859 | } |
| 860 | |
| 861 | if (buffer != EGL_BACK_BUFFER) |
| 862 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 863 | thread->setError(EglBadParameter()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 864 | return EGL_FALSE; |
| 865 | } |
| 866 | |
Geoff Lang | 9d3ae5f | 2015-03-18 17:20:33 -0400 | [diff] [blame] | 867 | if (surface == EGL_NO_SURFACE || eglSurface->getType() == EGL_WINDOW_BIT) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 868 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 869 | thread->setError(EglBadSurface()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 870 | return EGL_FALSE; |
| 871 | } |
| 872 | |
| 873 | if (eglSurface->getBoundTexture()) |
| 874 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 875 | thread->setError(EglBadAccess()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 876 | return EGL_FALSE; |
| 877 | } |
| 878 | |
| 879 | if (eglSurface->getTextureFormat() == EGL_NO_TEXTURE) |
| 880 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 881 | thread->setError(EglBadMatch()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 882 | return EGL_FALSE; |
| 883 | } |
| 884 | |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 885 | gl::Context *context = thread->getContext(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 886 | if (context) |
| 887 | { |
Geoff Lang | 7c973ea | 2014-12-19 15:58:28 -0500 | [diff] [blame] | 888 | gl::Texture *textureObject = context->getTargetTexture(GL_TEXTURE_2D); |
Yunchao He | 4f28544 | 2017-04-21 12:15:49 +0800 | [diff] [blame] | 889 | ASSERT(textureObject != nullptr); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 890 | |
Geoff Lang | 69cce58 | 2015-09-17 13:20:36 -0400 | [diff] [blame] | 891 | if (textureObject->getImmutableFormat()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 892 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 893 | thread->setError(EglBadMatch()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 894 | return EGL_FALSE; |
| 895 | } |
| 896 | |
Jamie Madill | 4928b7c | 2017-06-20 12:57:39 -0400 | [diff] [blame] | 897 | error = eglSurface->bindTexImage(context, textureObject, buffer); |
Geoff Lang | 0305320 | 2015-04-09 11:21:13 -0400 | [diff] [blame] | 898 | if (error.isError()) |
| 899 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 900 | thread->setError(error); |
Geoff Lang | 0305320 | 2015-04-09 11:21:13 -0400 | [diff] [blame] | 901 | return EGL_FALSE; |
| 902 | } |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 903 | } |
| 904 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 905 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 906 | return EGL_TRUE; |
| 907 | } |
| 908 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 909 | EGLBoolean EGLAPIENTRY SurfaceAttrib(EGLDisplay dpy, |
| 910 | EGLSurface surface, |
| 911 | EGLint attribute, |
| 912 | EGLint value) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 913 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 914 | EVENT( |
| 915 | "(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint attribute = %d, EGLint " |
| 916 | "value = %d)", |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 917 | dpy, surface, attribute, value); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 918 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 919 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 920 | Display *display = static_cast<Display *>(dpy); |
| 921 | Surface *eglSurface = static_cast<Surface *>(surface); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 922 | |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 923 | Error error = ValidateSurface(display, eglSurface); |
| 924 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 925 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 926 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 927 | return EGL_FALSE; |
| 928 | } |
| 929 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 930 | UNIMPLEMENTED(); // FIXME |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 931 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 932 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 933 | return EGL_TRUE; |
| 934 | } |
| 935 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 936 | EGLBoolean EGLAPIENTRY ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 937 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 938 | EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint buffer = %d)", dpy, |
| 939 | surface, buffer); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 940 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 941 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 942 | Display *display = static_cast<Display *>(dpy); |
| 943 | Surface *eglSurface = static_cast<Surface *>(surface); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 944 | |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 945 | Error error = ValidateSurface(display, eglSurface); |
| 946 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 947 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 948 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 949 | return EGL_FALSE; |
| 950 | } |
| 951 | |
| 952 | if (buffer != EGL_BACK_BUFFER) |
| 953 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 954 | thread->setError(EglBadParameter()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 955 | return EGL_FALSE; |
| 956 | } |
| 957 | |
Geoff Lang | 9d3ae5f | 2015-03-18 17:20:33 -0400 | [diff] [blame] | 958 | if (surface == EGL_NO_SURFACE || eglSurface->getType() == EGL_WINDOW_BIT) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 959 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 960 | thread->setError(EglBadSurface()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 961 | return EGL_FALSE; |
| 962 | } |
| 963 | |
| 964 | if (eglSurface->getTextureFormat() == EGL_NO_TEXTURE) |
| 965 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 966 | thread->setError(EglBadMatch()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 967 | return EGL_FALSE; |
| 968 | } |
| 969 | |
Geoff Lang | 7c973ea | 2014-12-19 15:58:28 -0500 | [diff] [blame] | 970 | gl::Texture *texture = eglSurface->getBoundTexture(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 971 | |
| 972 | if (texture) |
| 973 | { |
Jamie Madill | 4928b7c | 2017-06-20 12:57:39 -0400 | [diff] [blame] | 974 | error = eglSurface->releaseTexImage(thread->getContext(), buffer); |
Geoff Lang | 0305320 | 2015-04-09 11:21:13 -0400 | [diff] [blame] | 975 | if (error.isError()) |
| 976 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 977 | thread->setError(error); |
Geoff Lang | 0305320 | 2015-04-09 11:21:13 -0400 | [diff] [blame] | 978 | return EGL_FALSE; |
| 979 | } |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 980 | } |
| 981 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 982 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 983 | return EGL_TRUE; |
| 984 | } |
| 985 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 986 | EGLBoolean EGLAPIENTRY SwapInterval(EGLDisplay dpy, EGLint interval) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 987 | { |
| 988 | EVENT("(EGLDisplay dpy = 0x%0.8p, EGLint interval = %d)", dpy, interval); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 989 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 990 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 991 | Display *display = static_cast<Display *>(dpy); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 992 | |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 993 | Error error = ValidateDisplay(display); |
| 994 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 995 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 996 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 997 | return EGL_FALSE; |
| 998 | } |
| 999 | |
Jamie Madill | 61e16b4 | 2017-06-19 11:13:23 -0400 | [diff] [blame] | 1000 | Surface *draw_surface = static_cast<Surface *>(thread->getCurrentDrawSurface()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1001 | |
Yunchao He | 4f28544 | 2017-04-21 12:15:49 +0800 | [diff] [blame] | 1002 | if (draw_surface == nullptr) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1003 | { |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1004 | thread->setError(EglBadSurface()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1005 | return EGL_FALSE; |
| 1006 | } |
| 1007 | |
Geoff Lang | 1aca922 | 2015-03-19 12:02:50 -0400 | [diff] [blame] | 1008 | const egl::Config *surfaceConfig = draw_surface->getConfig(); |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1009 | EGLint clampedInterval = std::min(std::max(interval, surfaceConfig->minSwapInterval), |
| 1010 | surfaceConfig->maxSwapInterval); |
Geoff Lang | 1aca922 | 2015-03-19 12:02:50 -0400 | [diff] [blame] | 1011 | |
| 1012 | draw_surface->setSwapInterval(clampedInterval); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1013 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1014 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1015 | return EGL_TRUE; |
| 1016 | } |
| 1017 | |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1018 | // EGL 1.2 |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 1019 | EGLBoolean EGLAPIENTRY BindAPI(EGLenum api) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1020 | { |
| 1021 | EVENT("(EGLenum api = 0x%X)", api); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1022 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1023 | |
| 1024 | switch (api) |
| 1025 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1026 | case EGL_OPENGL_API: |
| 1027 | case EGL_OPENVG_API: |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1028 | thread->setError(EglBadParameter()); |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1029 | return EGL_FALSE; // Not supported by this implementation |
| 1030 | case EGL_OPENGL_ES_API: |
| 1031 | break; |
| 1032 | default: |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1033 | thread->setError(EglBadParameter()); |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1034 | return EGL_FALSE; |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1035 | } |
| 1036 | |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1037 | thread->setAPI(api); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1038 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1039 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1040 | return EGL_TRUE; |
| 1041 | } |
| 1042 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 1043 | EGLenum EGLAPIENTRY QueryAPI(void) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1044 | { |
| 1045 | EVENT("()"); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1046 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1047 | |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1048 | EGLenum API = thread->getAPI(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1049 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1050 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1051 | return API; |
| 1052 | } |
| 1053 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1054 | EGLSurface EGLAPIENTRY CreatePbufferFromClientBuffer(EGLDisplay dpy, |
| 1055 | EGLenum buftype, |
| 1056 | EGLClientBuffer buffer, |
| 1057 | EGLConfig config, |
| 1058 | const EGLint *attrib_list) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1059 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1060 | 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 Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1064 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1065 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1066 | Display *display = static_cast<Display *>(dpy); |
| 1067 | Config *configuration = static_cast<Config *>(config); |
Ian Ewell | ec2c0c5 | 2016-04-05 13:46:26 -0400 | [diff] [blame] | 1068 | AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list); |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 1069 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1070 | Error error = |
| 1071 | ValidateCreatePbufferFromClientBuffer(display, buftype, buffer, configuration, attributes); |
Geoff Lang | dd43fcc | 2015-01-19 15:44:17 -0500 | [diff] [blame] | 1072 | if (error.isError()) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1073 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1074 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1075 | return EGL_NO_SURFACE; |
| 1076 | } |
| 1077 | |
Geoff Lang | f81b6a1 | 2015-01-19 16:51:55 -0500 | [diff] [blame] | 1078 | egl::Surface *surface = nullptr; |
Geoff Lang | 2018c0b | 2015-12-08 11:48:51 -0500 | [diff] [blame] | 1079 | error = display->createPbufferFromClientBuffer(configuration, buftype, buffer, attributes, |
| 1080 | &surface); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1081 | if (error.isError()) |
| 1082 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1083 | thread->setError(error); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1084 | return EGL_NO_SURFACE; |
| 1085 | } |
| 1086 | |
Geoff Lang | f81b6a1 | 2015-01-19 16:51:55 -0500 | [diff] [blame] | 1087 | return static_cast<EGLSurface>(surface); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1088 | } |
| 1089 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 1090 | EGLBoolean EGLAPIENTRY ReleaseThread(void) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1091 | { |
| 1092 | EVENT("()"); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1093 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1094 | |
| 1095 | MakeCurrent(EGL_NO_DISPLAY, EGL_NO_CONTEXT, EGL_NO_SURFACE, EGL_NO_SURFACE); |
| 1096 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1097 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1098 | return EGL_TRUE; |
| 1099 | } |
| 1100 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 1101 | EGLBoolean EGLAPIENTRY WaitClient(void) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1102 | { |
| 1103 | EVENT("()"); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1104 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1105 | |
Jamie Madill | 61e16b4 | 2017-06-19 11:13:23 -0400 | [diff] [blame] | 1106 | Display *display = thread->getCurrentDisplay(); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 1107 | |
| 1108 | Error error = ValidateDisplay(display); |
| 1109 | if (error.isError()) |
| 1110 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1111 | thread->setError(error); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 1112 | return EGL_FALSE; |
| 1113 | } |
| 1114 | |
Jamie Madill | fe54834 | 2017-06-19 11:13:24 -0400 | [diff] [blame] | 1115 | error = display->waitClient(thread->getContext()); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 1116 | if (error.isError()) |
| 1117 | { |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1118 | thread->setError(error); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 1119 | return EGL_FALSE; |
| 1120 | } |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1121 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1122 | thread->setError(NoError()); |
Corentin Wallez | a433388 | 2016-01-14 17:24:50 -0500 | [diff] [blame] | 1123 | return EGL_TRUE; |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1124 | } |
| 1125 | |
| 1126 | // EGL 1.4 |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 1127 | EGLContext EGLAPIENTRY GetCurrentContext(void) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1128 | { |
| 1129 | EVENT("()"); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1130 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1131 | |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1132 | gl::Context *context = thread->getContext(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1133 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1134 | thread->setError(NoError()); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1135 | return static_cast<EGLContext>(context); |
| 1136 | } |
| 1137 | |
| 1138 | // EGL 1.5 |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 1139 | EGLSync EGLAPIENTRY CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1140 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1141 | EVENT("(EGLDisplay dpy = 0x%0.8p, EGLenum type = 0x%X, const EGLint* attrib_list = 0x%0.8p)", |
| 1142 | dpy, type, attrib_list); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1143 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1144 | |
| 1145 | UNIMPLEMENTED(); |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1146 | thread->setError(EglBadDisplay() << "eglCreateSync unimplemented."); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1147 | return EGL_NO_SYNC; |
| 1148 | } |
| 1149 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 1150 | EGLBoolean EGLAPIENTRY DestroySync(EGLDisplay dpy, EGLSync sync) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1151 | { |
| 1152 | EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSync sync = 0x%0.8p)", dpy, sync); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1153 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1154 | |
| 1155 | UNIMPLEMENTED(); |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1156 | thread->setError(EglBadDisplay() << "eglDestroySync unimplemented."); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1157 | return EGL_FALSE; |
| 1158 | } |
| 1159 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 1160 | EGLint EGLAPIENTRY ClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1161 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1162 | 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 Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1166 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1167 | |
| 1168 | UNIMPLEMENTED(); |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1169 | thread->setError(EglBadDisplay() << "eglClientWaitSync unimplemented."); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1170 | return 0; |
| 1171 | } |
| 1172 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1173 | EGLBoolean EGLAPIENTRY GetSyncAttrib(EGLDisplay dpy, |
| 1174 | EGLSync sync, |
| 1175 | EGLint attribute, |
| 1176 | EGLAttrib *value) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1177 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1178 | 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 Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1182 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1183 | |
| 1184 | UNIMPLEMENTED(); |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1185 | thread->setError(EglBadDisplay() << "eglSyncAttrib unimplemented."); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1186 | return EGL_FALSE; |
| 1187 | } |
| 1188 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1189 | EGLImage EGLAPIENTRY CreateImage(EGLDisplay dpy, |
| 1190 | EGLContext ctx, |
| 1191 | EGLenum target, |
| 1192 | EGLClientBuffer buffer, |
| 1193 | const EGLAttrib *attrib_list) |
Jamie Madill | 254f368 | 2015-01-29 16:33:07 -0500 | [diff] [blame] | 1194 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1195 | 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 Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1199 | Thread *thread = GetCurrentThread(); |
Jamie Madill | 254f368 | 2015-01-29 16:33:07 -0500 | [diff] [blame] | 1200 | |
| 1201 | UNIMPLEMENTED(); |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1202 | thread->setError(EglBadDisplay() << "eglCreateImage unimplemented."); |
Jamie Madill | 254f368 | 2015-01-29 16:33:07 -0500 | [diff] [blame] | 1203 | return EGL_NO_IMAGE; |
| 1204 | } |
| 1205 | |
| 1206 | EGLBoolean EGLAPIENTRY DestroyImage(EGLDisplay dpy, EGLImage image) |
| 1207 | { |
| 1208 | EVENT("(EGLDisplay dpy = 0x%0.8p, EGLImage image = 0x%0.8p)", dpy, image); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1209 | Thread *thread = GetCurrentThread(); |
Jamie Madill | 254f368 | 2015-01-29 16:33:07 -0500 | [diff] [blame] | 1210 | |
| 1211 | UNIMPLEMENTED(); |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1212 | thread->setError(EglBadDisplay() << "eglDestroyImage unimplemented."); |
Jamie Madill | 254f368 | 2015-01-29 16:33:07 -0500 | [diff] [blame] | 1213 | return EGL_FALSE; |
| 1214 | } |
| 1215 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1216 | EGLDisplay EGLAPIENTRY GetPlatformDisplay(EGLenum platform, |
| 1217 | void *native_display, |
| 1218 | const EGLAttrib *attrib_list) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1219 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1220 | 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 Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1224 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1225 | |
Jamie Madill | 6811a31 | 2017-05-24 16:50:06 -0400 | [diff] [blame] | 1226 | 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 Madill | 948bbe5 | 2017-06-01 13:10:42 -0400 | [diff] [blame] | 1233 | const auto &attribMap = AttributeMap::CreateFromAttribArray(attrib_list); |
Jamie Madill | 6811a31 | 2017-05-24 16:50:06 -0400 | [diff] [blame] | 1234 | if (platform == EGL_PLATFORM_ANGLE_ANGLE) |
| 1235 | { |
| 1236 | return Display::GetDisplayFromNativeDisplay( |
Jamie Madill | 948bbe5 | 2017-06-01 13:10:42 -0400 | [diff] [blame] | 1237 | gl::bitCast<EGLNativeDisplayType>(native_display), attribMap); |
Jamie Madill | 6811a31 | 2017-05-24 16:50:06 -0400 | [diff] [blame] | 1238 | } |
| 1239 | else if (platform == EGL_PLATFORM_DEVICE_EXT) |
| 1240 | { |
| 1241 | Device *eglDevice = reinterpret_cast<Device *>(native_display); |
Jamie Madill | 948bbe5 | 2017-06-01 13:10:42 -0400 | [diff] [blame] | 1242 | return Display::GetDisplayFromDevice(eglDevice, attribMap); |
Jamie Madill | 6811a31 | 2017-05-24 16:50:06 -0400 | [diff] [blame] | 1243 | } |
| 1244 | else |
| 1245 | { |
| 1246 | UNREACHABLE(); |
| 1247 | return EGL_NO_DISPLAY; |
| 1248 | } |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1249 | } |
| 1250 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1251 | EGLSurface EGLAPIENTRY CreatePlatformWindowSurface(EGLDisplay dpy, |
| 1252 | EGLConfig config, |
| 1253 | void *native_window, |
| 1254 | const EGLAttrib *attrib_list) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1255 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1256 | 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 Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1260 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1261 | |
| 1262 | UNIMPLEMENTED(); |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1263 | thread->setError(EglBadDisplay() << "eglCreatePlatformWindowSurface unimplemented."); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1264 | return EGL_NO_SURFACE; |
| 1265 | } |
| 1266 | |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1267 | EGLSurface EGLAPIENTRY CreatePlatformPixmapSurface(EGLDisplay dpy, |
| 1268 | EGLConfig config, |
| 1269 | void *native_pixmap, |
| 1270 | const EGLAttrib *attrib_list) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1271 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1272 | 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 Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1276 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1277 | |
| 1278 | UNIMPLEMENTED(); |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1279 | thread->setError(EglBadDisplay() << "eglCreatePlatformPixmapSurface unimplemented."); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1280 | return EGL_NO_SURFACE; |
| 1281 | } |
| 1282 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 1283 | EGLBoolean EGLAPIENTRY WaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1284 | { |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1285 | EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSync sync = 0x%0.8p, EGLint flags = 0x%X)", dpy, sync, |
| 1286 | flags); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1287 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1288 | |
| 1289 | UNIMPLEMENTED(); |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1290 | thread->setError(EglBadDisplay() << "eglWaitSync unimplemented."); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1291 | return EGL_FALSE; |
| 1292 | } |
| 1293 | |
Geoff Lang | 130e6e8 | 2014-12-05 12:17:40 -0500 | [diff] [blame] | 1294 | __eglMustCastToProperFunctionPointerType EGLAPIENTRY GetProcAddress(const char *procname) |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1295 | { |
| 1296 | EVENT("(const char *procname = \"%s\")", procname); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1297 | Thread *thread = GetCurrentThread(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1298 | |
Geoff Lang | 5565936 | 2015-08-26 13:39:59 -0400 | [diff] [blame] | 1299 | typedef std::map<std::string, __eglMustCastToProperFunctionPointerType> ProcAddressMap; |
Jamie Madill | 231c7f5 | 2017-04-26 13:45:37 -0400 | [diff] [blame] | 1300 | auto generateProcAddressMap = []() { |
Geoff Lang | 5565936 | 2015-08-26 13:39:59 -0400 | [diff] [blame] | 1301 | ProcAddressMap map; |
| 1302 | #define INSERT_PROC_ADDRESS(ns, proc) \ |
Geoff Lang | a65a4c7 | 2015-08-27 10:38:40 -0400 | [diff] [blame] | 1303 | map[#ns #proc] = reinterpret_cast<__eglMustCastToProperFunctionPointerType>(ns::proc) |
Geoff Lang | 5565936 | 2015-08-26 13:39:59 -0400 | [diff] [blame] | 1304 | |
Corentin Wallez | 64598b5 | 2016-11-11 08:25:44 -0500 | [diff] [blame] | 1305 | #define INSERT_PROC_ADDRESS_NO_NS(name, proc) \ |
| 1306 | map[name] = reinterpret_cast<__eglMustCastToProperFunctionPointerType>(proc) |
| 1307 | |
Geoff Lang | 5565936 | 2015-08-26 13:39:59 -0400 | [diff] [blame] | 1308 | // 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 Lang | 7d20dd4 | 2016-06-07 10:45:36 -0700 | [diff] [blame] | 1491 | // GL_EXT_disjoint_timer_query |
Bruce Dawson | 09e7c0a | 2017-03-01 16:38:32 -0800 | [diff] [blame] | 1492 | // 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 Lang | 7d20dd4 | 2016-06-07 10:45:36 -0700 | [diff] [blame] | 1499 | INSERT_PROC_ADDRESS(gl, QueryCounterEXT); |
Bruce Dawson | 09e7c0a | 2017-03-01 16:38:32 -0800 | [diff] [blame] | 1500 | // INSERT_PROC_ADDRESS(gl, GetQueryivEXT); |
Geoff Lang | 7d20dd4 | 2016-06-07 10:45:36 -0700 | [diff] [blame] | 1501 | INSERT_PROC_ADDRESS(gl, GetQueryObjectivEXT); |
Bruce Dawson | 09e7c0a | 2017-03-01 16:38:32 -0800 | [diff] [blame] | 1502 | // INSERT_PROC_ADDRESS(gl, GetQueryObjectuivEXT); |
Geoff Lang | 7d20dd4 | 2016-06-07 10:45:36 -0700 | [diff] [blame] | 1503 | INSERT_PROC_ADDRESS(gl, GetQueryObjecti64vEXT); |
| 1504 | INSERT_PROC_ADDRESS(gl, GetQueryObjectui64vEXT); |
| 1505 | |
Geoff Lang | 5565936 | 2015-08-26 13:39:59 -0400 | [diff] [blame] | 1506 | // 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 Kinross | bc781f3 | 2015-10-26 09:27:38 -0700 | [diff] [blame] | 1536 | // 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 Lang | e102fee | 2015-12-10 11:23:30 -0500 | [diff] [blame] | 1542 | // 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 Lang | d860552 | 2016-04-13 10:19:12 -0400 | [diff] [blame] | 1555 | // GL_CHROMIUM_bind_uniform_location |
| 1556 | INSERT_PROC_ADDRESS(gl, BindUniformLocationCHROMIUM); |
| 1557 | |
Geoff Lang | 97073d1 | 2016-04-20 10:42:34 -0700 | [diff] [blame] | 1558 | // GL_CHROMIUM_copy_texture |
| 1559 | INSERT_PROC_ADDRESS(gl, CopyTextureCHROMIUM); |
| 1560 | INSERT_PROC_ADDRESS(gl, CopySubTextureCHROMIUM); |
| 1561 | |
Geoff Lang | 47110bf | 2016-04-20 11:13:22 -0700 | [diff] [blame] | 1562 | // GL_CHROMIUM_copy_compressed_texture |
| 1563 | INSERT_PROC_ADDRESS(gl, CompressedCopyTextureCHROMIUM); |
| 1564 | |
Geoff Lang | c339c4e | 2016-11-29 10:37:36 -0500 | [diff] [blame] | 1565 | // GL_ANGLE_request_extension |
| 1566 | INSERT_PROC_ADDRESS(gl, RequestExtensionANGLE); |
Geoff Lang | c287ea6 | 2016-09-16 14:46:51 -0400 | [diff] [blame] | 1567 | |
Geoff Lang | ff5b2d5 | 2016-09-07 11:32:23 -0400 | [diff] [blame] | 1568 | // 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 Wallez | b293160 | 2017-04-11 15:58:57 -0400 | [diff] [blame] | 1591 | INSERT_PROC_ADDRESS(gl, CompressedTexImage2DRobustANGLE); |
| 1592 | INSERT_PROC_ADDRESS(gl, CompressedTexSubImage2DRobustANGLE); |
| 1593 | INSERT_PROC_ADDRESS(gl, CompressedTexImage3DRobustANGLE); |
| 1594 | INSERT_PROC_ADDRESS(gl, CompressedTexSubImage3DRobustANGLE); |
Geoff Lang | ff5b2d5 | 2016-09-07 11:32:23 -0400 | [diff] [blame] | 1595 | 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 Lang | 0a9661f | 2016-10-20 10:59:20 -0700 | [diff] [blame] | 1599 | INSERT_PROC_ADDRESS(gl, GetInternalformativRobustANGLE); |
Geoff Lang | ff5b2d5 | 2016-09-07 11:32:23 -0400 | [diff] [blame] | 1600 | 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 Lang | 5565936 | 2015-08-26 13:39:59 -0400 | [diff] [blame] | 1634 | // 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 Wallez | 64598b5 | 2016-11-11 08:25:44 -0500 | [diff] [blame] | 1705 | // 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 Lang | 5565936 | 2015-08-26 13:39:59 -0400 | [diff] [blame] | 1707 | 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 Radev | ee7e1e2 | 2016-07-18 15:39:47 +0300 | [diff] [blame] | 1741 | // 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 Lang | 5565936 | 2015-08-26 13:39:59 -0400 | [diff] [blame] | 1811 | // 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 Kinross | fc1a44a | 2015-12-02 12:37:10 -0800 | [diff] [blame] | 1883 | // EGL_EXT_device_creation |
| 1884 | INSERT_PROC_ADDRESS(egl, CreateDeviceANGLE); |
| 1885 | INSERT_PROC_ADDRESS(egl, ReleaseDeviceANGLE); |
| 1886 | |
Ian Ewell | 701b74b | 2016-03-02 15:26:39 -0500 | [diff] [blame] | 1887 | // 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 Ewell | 54f8746 | 2016-03-10 13:47:21 -0500 | [diff] [blame] | 1894 | // 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 Ewell | bda7559 | 2016-04-18 17:25:54 -0400 | [diff] [blame] | 1902 | // EGL_ANGLE_stream_producer_d3d_texture_nv12 |
| 1903 | INSERT_PROC_ADDRESS(egl, CreateStreamProducerD3DTextureNV12ANGLE); |
| 1904 | INSERT_PROC_ADDRESS(egl, StreamPostD3DTextureNV12ANGLE); |
| 1905 | |
Stanislav Chiknavaryan | ee218f2 | 2017-03-22 15:39:13 -0700 | [diff] [blame] | 1906 | // EGL_CHROMIUM_get_sync_values |
| 1907 | INSERT_PROC_ADDRESS(egl, GetSyncValuesCHROMIUM); |
| 1908 | |
Geoff Lang | a284f2f | 2015-08-07 16:49:07 -0400 | [diff] [blame] | 1909 | // EGL_EXT_swap_buffers_with_damage |
| 1910 | INSERT_PROC_ADDRESS(egl, SwapBuffersWithDamageEXT); |
| 1911 | |
Corentin Wallez | 64598b5 | 2016-11-11 08:25:44 -0500 | [diff] [blame] | 1912 | // angle::Platform related entry points |
Jamie Madill | b1eeba1 | 2017-02-13 16:36:40 -0500 | [diff] [blame] | 1913 | INSERT_PROC_ADDRESS_NO_NS("ANGLEGetDisplayPlatform", ANGLEGetDisplayPlatform); |
| 1914 | INSERT_PROC_ADDRESS_NO_NS("ANGLEResetDisplayPlatform", ANGLEResetDisplayPlatform); |
Corentin Wallez | 64598b5 | 2016-11-11 08:25:44 -0500 | [diff] [blame] | 1915 | |
Geoff Lang | 5565936 | 2015-08-26 13:39:59 -0400 | [diff] [blame] | 1916 | #undef INSERT_PROC_ADDRESS |
Corentin Wallez | 64598b5 | 2016-11-11 08:25:44 -0500 | [diff] [blame] | 1917 | #undef INSERT_PROC_ADDRESS_NO_NS |
| 1918 | |
Geoff Lang | 5565936 | 2015-08-26 13:39:59 -0400 | [diff] [blame] | 1919 | return map; |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1920 | }; |
| 1921 | |
Geoff Lang | 5565936 | 2015-08-26 13:39:59 -0400 | [diff] [blame] | 1922 | static const ProcAddressMap procAddressMap = generateProcAddressMap(); |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1923 | |
Yuly Novikov | c4d18aa | 2017-03-09 18:45:02 -0500 | [diff] [blame] | 1924 | thread->setError(NoError()); |
Geoff Lang | 5565936 | 2015-08-26 13:39:59 -0400 | [diff] [blame] | 1925 | auto iter = procAddressMap.find(procname); |
Geoff Lang | 7b8f3c9 | 2016-11-10 10:42:48 -0500 | [diff] [blame] | 1926 | return iter != procAddressMap.end() ? iter->second : nullptr; |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1927 | } |
Geoff Lang | e7c6e43 | 2014-12-03 14:48:07 -0500 | [diff] [blame] | 1928 | } |