1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <EGL/egl.h> 6 7 #include "base/command_line.h" 8 #include "gpu/command_buffer/client/gles2_lib.h" 9 #include "gpu/gles2_conform_support/egl/display.h" 10 #include "ui/gl/gl_context.h" 11 #include "ui/gl/gl_surface.h" 12 13 #if REGAL_STATIC_EGL 14 extern "C" { 15 16 typedef EGLContext RegalSystemContext; 17 #define REGAL_DECL 18 REGAL_DECL void RegalMakeCurrent( RegalSystemContext ctx ); 19 20 } // extern "C" 21 #endif 22 23 namespace { 24 void SetCurrentError(EGLint error_code) { 25 } 26 27 template<typename T> 28 T EglError(EGLint error_code, T return_value) { 29 SetCurrentError(error_code); 30 return return_value; 31 } 32 33 template<typename T> 34 T EglSuccess(T return_value) { 35 SetCurrentError(EGL_SUCCESS); 36 return return_value; 37 } 38 39 EGLint ValidateDisplay(EGLDisplay dpy) { 40 if (dpy == EGL_NO_DISPLAY) 41 return EGL_BAD_DISPLAY; 42 43 egl::Display* display = static_cast<egl::Display*>(dpy); 44 if (!display->is_initialized()) 45 return EGL_NOT_INITIALIZED; 46 47 return EGL_SUCCESS; 48 } 49 50 EGLint ValidateDisplayConfig(EGLDisplay dpy, EGLConfig config) { 51 EGLint error_code = ValidateDisplay(dpy); 52 if (error_code != EGL_SUCCESS) 53 return error_code; 54 55 egl::Display* display = static_cast<egl::Display*>(dpy); 56 if (!display->IsValidConfig(config)) 57 return EGL_BAD_CONFIG; 58 59 return EGL_SUCCESS; 60 } 61 62 EGLint ValidateDisplaySurface(EGLDisplay dpy, EGLSurface surface) { 63 EGLint error_code = ValidateDisplay(dpy); 64 if (error_code != EGL_SUCCESS) 65 return error_code; 66 67 egl::Display* display = static_cast<egl::Display*>(dpy); 68 if (!display->IsValidSurface(surface)) 69 return EGL_BAD_SURFACE; 70 71 return EGL_SUCCESS; 72 } 73 74 EGLint ValidateDisplayContext(EGLDisplay dpy, EGLContext context) { 75 EGLint error_code = ValidateDisplay(dpy); 76 if (error_code != EGL_SUCCESS) 77 return error_code; 78 79 egl::Display* display = static_cast<egl::Display*>(dpy); 80 if (!display->IsValidContext(context)) 81 return EGL_BAD_CONTEXT; 82 83 return EGL_SUCCESS; 84 } 85 } // namespace 86 87 extern "C" { 88 EGLint eglGetError() { 89 // TODO(alokp): Fix me. 90 return EGL_SUCCESS; 91 } 92 93 EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id) { 94 return new egl::Display(display_id); 95 } 96 97 EGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) { 98 if (dpy == EGL_NO_DISPLAY) 99 return EglError(EGL_BAD_DISPLAY, EGL_FALSE); 100 101 egl::Display* display = static_cast<egl::Display*>(dpy); 102 if (!display->Initialize()) 103 return EglError(EGL_NOT_INITIALIZED, EGL_FALSE); 104 105 int argc = 1; 106 const char* const argv[] = { 107 "dummy" 108 }; 109 CommandLine::Init(argc, argv); 110 gfx::GLSurface::InitializeOneOff(); 111 112 *major = 1; 113 *minor = 4; 114 return EglSuccess(EGL_TRUE); 115 } 116 117 EGLBoolean eglTerminate(EGLDisplay dpy) { 118 EGLint error_code = ValidateDisplay(dpy); 119 if (error_code != EGL_SUCCESS) 120 return EglError(error_code, EGL_FALSE); 121 122 egl::Display* display = static_cast<egl::Display*>(dpy); 123 delete display; 124 125 return EglSuccess(EGL_TRUE); 126 } 127 128 const char* eglQueryString(EGLDisplay dpy, EGLint name) { 129 EGLint error_code = ValidateDisplay(dpy); 130 if (error_code != EGL_SUCCESS) 131 return EglError(error_code, static_cast<const char*>(NULL)); 132 133 switch (name) { 134 case EGL_CLIENT_APIS: 135 return EglSuccess("OpenGL_ES"); 136 case EGL_EXTENSIONS: 137 return EglSuccess(""); 138 case EGL_VENDOR: 139 return EglSuccess("Google Inc."); 140 case EGL_VERSION: 141 return EglSuccess("1.4"); 142 default: 143 return EglError(EGL_BAD_PARAMETER, static_cast<const char*>(NULL)); 144 } 145 } 146 147 EGLBoolean eglChooseConfig(EGLDisplay dpy, 148 const EGLint* attrib_list, 149 EGLConfig* configs, 150 EGLint config_size, 151 EGLint* num_config) { 152 EGLint error_code = ValidateDisplay(dpy); 153 if (error_code != EGL_SUCCESS) 154 return EglError(error_code, EGL_FALSE); 155 156 if (num_config == NULL) 157 return EglError(EGL_BAD_PARAMETER, EGL_FALSE); 158 159 egl::Display* display = static_cast<egl::Display*>(dpy); 160 if (!display->ChooseConfigs(configs, config_size, num_config)) 161 return EglError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 162 163 return EglSuccess(EGL_TRUE); 164 } 165 166 EGLBoolean eglGetConfigs(EGLDisplay dpy, 167 EGLConfig* configs, 168 EGLint config_size, 169 EGLint* num_config) { 170 EGLint error_code = ValidateDisplay(dpy); 171 if (error_code != EGL_SUCCESS) 172 return EglError(error_code, EGL_FALSE); 173 174 if (num_config == NULL) 175 return EglError(EGL_BAD_PARAMETER, EGL_FALSE); 176 177 egl::Display* display = static_cast<egl::Display*>(dpy); 178 if (!display->GetConfigs(configs, config_size, num_config)) 179 return EglError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 180 181 return EglSuccess(EGL_TRUE); 182 } 183 184 EGLBoolean eglGetConfigAttrib(EGLDisplay dpy, 185 EGLConfig config, 186 EGLint attribute, 187 EGLint* value) { 188 EGLint error_code = ValidateDisplayConfig(dpy, config); 189 if (error_code != EGL_SUCCESS) 190 return EglError(error_code, EGL_FALSE); 191 192 egl::Display* display = static_cast<egl::Display*>(dpy); 193 if (!display->GetConfigAttrib(config, attribute, value)) 194 return EglError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 195 196 return EglSuccess(EGL_TRUE); 197 } 198 199 EGLSurface eglCreateWindowSurface(EGLDisplay dpy, 200 EGLConfig config, 201 EGLNativeWindowType win, 202 const EGLint* attrib_list) { 203 EGLint error_code = ValidateDisplayConfig(dpy, config); 204 if (error_code != EGL_SUCCESS) 205 return EglError(error_code, EGL_NO_SURFACE); 206 207 egl::Display* display = static_cast<egl::Display*>(dpy); 208 if (!display->IsValidNativeWindow(win)) 209 return EglError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); 210 211 EGLSurface surface = display->CreateWindowSurface(config, win, attrib_list); 212 if (surface == EGL_NO_SURFACE) 213 return EglError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 214 215 return EglSuccess(surface); 216 } 217 218 EGLSurface eglCreatePbufferSurface(EGLDisplay dpy, 219 EGLConfig config, 220 const EGLint* attrib_list) { 221 return EGL_NO_SURFACE; 222 } 223 224 EGLSurface eglCreatePixmapSurface(EGLDisplay dpy, 225 EGLConfig config, 226 EGLNativePixmapType pixmap, 227 const EGLint* attrib_list) { 228 return EGL_NO_SURFACE; 229 } 230 231 EGLBoolean eglDestroySurface(EGLDisplay dpy, 232 EGLSurface surface) { 233 EGLint error_code = ValidateDisplaySurface(dpy, surface); 234 if (error_code != EGL_SUCCESS) 235 return EglError(error_code, EGL_FALSE); 236 237 egl::Display* display = static_cast<egl::Display*>(dpy); 238 display->DestroySurface(surface); 239 return EglSuccess(EGL_TRUE); 240 } 241 242 EGLBoolean eglQuerySurface(EGLDisplay dpy, 243 EGLSurface surface, 244 EGLint attribute, 245 EGLint* value) { 246 return EGL_FALSE; 247 } 248 249 EGLBoolean eglBindAPI(EGLenum api) { 250 return EGL_FALSE; 251 } 252 253 EGLenum eglQueryAPI() { 254 return EGL_OPENGL_ES_API; 255 } 256 257 EGLBoolean eglWaitClient(void) { 258 return EGL_FALSE; 259 } 260 261 EGLBoolean eglReleaseThread(void) { 262 return EGL_FALSE; 263 } 264 265 EGLSurface eglCreatePbufferFromClientBuffer(EGLDisplay dpy, 266 EGLenum buftype, 267 EGLClientBuffer buffer, 268 EGLConfig config, 269 const EGLint* attrib_list) { 270 return EGL_NO_SURFACE; 271 } 272 273 EGLBoolean eglSurfaceAttrib(EGLDisplay dpy, 274 EGLSurface surface, 275 EGLint attribute, 276 EGLint value) { 277 return EGL_FALSE; 278 } 279 280 EGLBoolean eglBindTexImage(EGLDisplay dpy, 281 EGLSurface surface, 282 EGLint buffer) { 283 return EGL_FALSE; 284 } 285 286 EGLBoolean eglReleaseTexImage(EGLDisplay dpy, 287 EGLSurface surface, 288 EGLint buffer) { 289 return EGL_FALSE; 290 } 291 292 EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) { 293 return EGL_FALSE; 294 } 295 296 EGLContext eglCreateContext(EGLDisplay dpy, 297 EGLConfig config, 298 EGLContext share_context, 299 const EGLint* attrib_list) { 300 EGLint error_code = ValidateDisplayConfig(dpy, config); 301 if (error_code != EGL_SUCCESS) 302 return EglError(error_code, EGL_NO_CONTEXT); 303 304 if (share_context != EGL_NO_CONTEXT) { 305 error_code = ValidateDisplayContext(dpy, share_context); 306 if (error_code != EGL_SUCCESS) 307 return EglError(error_code, EGL_NO_CONTEXT); 308 } 309 310 egl::Display* display = static_cast<egl::Display*>(dpy); 311 EGLContext context = display->CreateContext( 312 config, share_context, attrib_list); 313 if (context == EGL_NO_CONTEXT) 314 return EglError(EGL_BAD_ALLOC, EGL_NO_CONTEXT); 315 316 return EglSuccess(context); 317 } 318 319 EGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) { 320 EGLint error_code = ValidateDisplayContext(dpy, ctx); 321 if (error_code != EGL_SUCCESS) 322 return EglError(error_code, EGL_FALSE); 323 324 egl::Display* display = static_cast<egl::Display*>(dpy); 325 display->DestroyContext(ctx); 326 return EGL_TRUE; 327 } 328 329 EGLBoolean eglMakeCurrent(EGLDisplay dpy, 330 EGLSurface draw, 331 EGLSurface read, 332 EGLContext ctx) { 333 if (ctx != EGL_NO_CONTEXT) { 334 EGLint error_code = ValidateDisplaySurface(dpy, draw); 335 if (error_code != EGL_SUCCESS) 336 return EglError(error_code, EGL_FALSE); 337 error_code = ValidateDisplaySurface(dpy, read); 338 if (error_code != EGL_SUCCESS) 339 return EglError(error_code, EGL_FALSE); 340 error_code = ValidateDisplayContext(dpy, ctx); 341 if (error_code != EGL_SUCCESS) 342 return EglError(error_code, EGL_FALSE); 343 } 344 345 egl::Display* display = static_cast<egl::Display*>(dpy); 346 if (!display->MakeCurrent(draw, read, ctx)) 347 return EglError(EGL_CONTEXT_LOST, EGL_FALSE); 348 349 #if REGAL_STATIC_EGL 350 RegalMakeCurrent(ctx); 351 #endif 352 353 return EGL_TRUE; 354 } 355 356 EGLContext eglGetCurrentContext() { 357 return EGL_NO_CONTEXT; 358 } 359 360 EGLSurface eglGetCurrentSurface(EGLint readdraw) { 361 return EGL_NO_SURFACE; 362 } 363 364 EGLDisplay eglGetCurrentDisplay() { 365 return EGL_NO_DISPLAY; 366 } 367 368 EGLBoolean eglQueryContext(EGLDisplay dpy, 369 EGLContext ctx, 370 EGLint attribute, 371 EGLint* value) { 372 return EGL_FALSE; 373 } 374 375 EGLBoolean eglWaitGL() { 376 return EGL_FALSE; 377 } 378 379 EGLBoolean eglWaitNative(EGLint engine) { 380 return EGL_FALSE; 381 } 382 383 EGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) { 384 EGLint error_code = ValidateDisplaySurface(dpy, surface); 385 if (error_code != EGL_SUCCESS) 386 return EglError(error_code, EGL_FALSE); 387 388 egl::Display* display = static_cast<egl::Display*>(dpy); 389 display->SwapBuffers(surface); 390 return EglSuccess(EGL_TRUE); 391 } 392 393 EGLBoolean eglCopyBuffers(EGLDisplay dpy, 394 EGLSurface surface, 395 EGLNativePixmapType target) { 396 return EGL_FALSE; 397 } 398 399 /* Now, define eglGetProcAddress using the generic function ptr. type */ 400 __eglMustCastToProperFunctionPointerType 401 eglGetProcAddress(const char* procname) { 402 return gles2::GetGLFunctionPointer(procname); 403 } 404 } // extern "C" 405