Index: gpu/gles2_conform_support/egl/egl.cc |
diff --git a/gpu/gles2_conform_support/egl/egl.cc b/gpu/gles2_conform_support/egl/egl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1e414d323a53466a64290f322777387b7620c594 |
--- /dev/null |
+++ b/gpu/gles2_conform_support/egl/egl.cc |
@@ -0,0 +1,377 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <EGL/egl.h> |
+ |
+#include "ui/gfx/gl/gl_context.h" |
+#include "ui/gfx/gl/gl_surface.h" |
+#include "base/command_line.h" |
+#include "gpu/gles2_conform_support/egl/display.h" |
+ |
+namespace { |
+void SetCurrentError(EGLint error_code) { |
+} |
+ |
+template<typename T> |
+T EglError(EGLint error_code, T return_value) { |
+ SetCurrentError(error_code); |
+ return return_value; |
+} |
+ |
+template<typename T> |
+T EglSuccess(T return_value) { |
+ SetCurrentError(EGL_SUCCESS); |
+ return return_value; |
+} |
+ |
+EGLint ValidateDisplay(EGLDisplay dpy) { |
+ if (dpy == EGL_NO_DISPLAY) |
+ return EGL_BAD_DISPLAY; |
+ |
+ egl::Display* display = static_cast<egl::Display*>(dpy); |
+ if (!display->is_initialized()) |
+ return EGL_NOT_INITIALIZED; |
+ |
+ return EGL_SUCCESS; |
+} |
+ |
+EGLint ValidateDisplayConfig(EGLDisplay dpy, EGLConfig config) { |
+ EGLint error_code = ValidateDisplay(dpy); |
+ if (error_code != EGL_SUCCESS) |
+ return error_code; |
+ |
+ egl::Display* display = static_cast<egl::Display*>(dpy); |
+ if (!display->IsValidConfig(config)) |
+ return EGL_BAD_CONFIG; |
+ |
+ return EGL_SUCCESS; |
+} |
+ |
+EGLint ValidateDisplaySurface(EGLDisplay dpy, EGLSurface surface) { |
+ EGLint error_code = ValidateDisplay(dpy); |
+ if (error_code != EGL_SUCCESS) |
+ return error_code; |
+ |
+ egl::Display* display = static_cast<egl::Display*>(dpy); |
+ if (!display->IsValidSurface(surface)) |
+ return EGL_BAD_SURFACE; |
+ |
+ return EGL_SUCCESS; |
+} |
+ |
+EGLint ValidateDisplayContext(EGLDisplay dpy, EGLContext context) { |
+ EGLint error_code = ValidateDisplay(dpy); |
+ if (error_code != EGL_SUCCESS) |
+ return error_code; |
+ |
+ egl::Display* display = static_cast<egl::Display*>(dpy); |
+ if (!display->IsValidContext(context)) |
+ return EGL_BAD_CONTEXT; |
+ |
+ return EGL_SUCCESS; |
+} |
+} // namespace |
+ |
+extern "C" { |
+EGLint eglGetError() { |
+ // TODO(alokp): Fix me. |
+ return EGL_SUCCESS; |
+} |
+ |
+EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id) { |
+ return new egl::Display(display_id); |
+} |
+ |
+EGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) { |
+ if (dpy == EGL_NO_DISPLAY) |
+ return EglError(EGL_BAD_DISPLAY, EGL_FALSE); |
+ |
+ egl::Display* display = static_cast<egl::Display*>(dpy); |
+ if (!display->Initialize()) |
+ return EglError(EGL_NOT_INITIALIZED, EGL_FALSE); |
+ |
+ int argc = 1; |
+ const char* const argv[] = { |
+ "dummy" |
+ }; |
+ CommandLine::Init(argc, argv); |
+ gfx::GLSurface::InitializeOneOff(); |
+ |
+ *major = 1; |
+ *minor = 4; |
+ return EglSuccess(EGL_TRUE); |
+} |
+ |
+EGLBoolean eglTerminate(EGLDisplay dpy) { |
+ EGLint error_code = ValidateDisplay(dpy); |
+ if (error_code != EGL_SUCCESS) |
+ return EglError(error_code, EGL_FALSE); |
+ |
+ egl::Display* display = static_cast<egl::Display*>(dpy); |
+ delete display; |
+ |
+ return EglSuccess(EGL_TRUE); |
+} |
+ |
+const char* eglQueryString(EGLDisplay dpy, EGLint name) { |
+ EGLint error_code = ValidateDisplay(dpy); |
+ if (error_code != EGL_SUCCESS) |
+ return EglError(error_code, static_cast<const char*>(NULL)); |
+ |
+ switch (name) { |
+ case EGL_CLIENT_APIS: |
+ return EglSuccess("OpenGL_ES"); |
+ case EGL_EXTENSIONS: |
+ return EglSuccess(""); |
+ case EGL_VENDOR: |
+ return EglSuccess("Google Inc."); |
+ case EGL_VERSION: |
+ return EglSuccess("1.4"); |
+ default: |
+ return EglError(EGL_BAD_PARAMETER, static_cast<const char*>(NULL)); |
+ } |
+} |
+ |
+EGLBoolean eglGetConfigs(EGLDisplay dpy, |
+ EGLConfig* configs, |
+ EGLint config_size, |
+ EGLint* num_config) { |
+ EGLint error_code = ValidateDisplay(dpy); |
+ if (error_code != EGL_SUCCESS) |
+ return EglError(error_code, EGL_FALSE); |
+ |
+ if (num_config == NULL) |
+ return EglError(EGL_BAD_PARAMETER, EGL_FALSE); |
+ |
+ egl::Display* display = static_cast<egl::Display*>(dpy); |
+ if (!display->GetConfigs(configs, config_size, num_config)) |
+ return EglError(EGL_BAD_ATTRIBUTE, EGL_FALSE); |
+ |
+ return EglSuccess(EGL_TRUE); |
+} |
+ |
+EGLBoolean eglChooseConfig(EGLDisplay dpy, |
+ const EGLint* attrib_list, |
+ EGLConfig* configs, |
+ EGLint config_size, |
+ EGLint* num_config) { |
+ return EGL_FALSE; |
+} |
+ |
+EGLBoolean eglGetConfigAttrib(EGLDisplay dpy, |
+ EGLConfig config, |
+ EGLint attribute, |
+ EGLint* value) { |
+ EGLint error_code = ValidateDisplayConfig(dpy, config); |
+ if (error_code != EGL_SUCCESS) |
+ return EglError(error_code, EGL_FALSE); |
+ |
+ egl::Display* display = static_cast<egl::Display*>(dpy); |
+ if (!display->GetConfigAttrib(config, attribute, value)) |
+ return EglError(EGL_BAD_ATTRIBUTE, EGL_FALSE); |
+ |
+ return EglSuccess(EGL_TRUE); |
+} |
+ |
+EGLSurface eglCreateWindowSurface(EGLDisplay dpy, |
+ EGLConfig config, |
+ EGLNativeWindowType win, |
+ const EGLint* attrib_list) { |
+ EGLint error_code = ValidateDisplayConfig(dpy, config); |
+ if (error_code != EGL_SUCCESS) |
+ return EglError(error_code, EGL_NO_SURFACE); |
+ |
+ egl::Display* display = static_cast<egl::Display*>(dpy); |
+ if (!display->IsValidNativeWindow(win)) |
+ return EglError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); |
+ |
+ EGLSurface surface = display->CreateWindowSurface(config, win, attrib_list); |
+ if (surface == EGL_NO_SURFACE) |
+ return EglError(EGL_BAD_ALLOC, EGL_NO_SURFACE); |
+ |
+ return EglSuccess(surface); |
+} |
+ |
+EGLSurface eglCreatePbufferSurface(EGLDisplay dpy, |
+ EGLConfig config, |
+ const EGLint* attrib_list) { |
+ return EGL_NO_SURFACE; |
+} |
+ |
+EGLSurface eglCreatePixmapSurface(EGLDisplay dpy, |
+ EGLConfig config, |
+ EGLNativePixmapType pixmap, |
+ const EGLint* attrib_list) { |
+ return EGL_NO_SURFACE; |
+} |
+ |
+EGLBoolean eglDestroySurface(EGLDisplay dpy, |
+ EGLSurface surface) { |
+ EGLint error_code = ValidateDisplaySurface(dpy, surface); |
+ if (error_code != EGL_SUCCESS) |
+ return EglError(error_code, EGL_FALSE); |
+ |
+ egl::Display* display = static_cast<egl::Display*>(dpy); |
+ display->DestroySurface(surface); |
+ return EglSuccess(EGL_TRUE); |
+} |
+ |
+EGLBoolean eglQuerySurface(EGLDisplay dpy, |
+ EGLSurface surface, |
+ EGLint attribute, |
+ EGLint* value) { |
+ return EGL_FALSE; |
+} |
+ |
+EGLBoolean eglBindAPI(EGLenum api) { |
+ return EGL_FALSE; |
+} |
+ |
+EGLenum eglQueryAPI() { |
+ return EGL_OPENGL_ES_API; |
+} |
+ |
+EGLBoolean eglWaitClient(void) { |
+ return EGL_FALSE; |
+} |
+ |
+EGLBoolean eglReleaseThread(void) { |
+ return EGL_FALSE; |
+} |
+ |
+EGLSurface eglCreatePbufferFromClientBuffer(EGLDisplay dpy, |
+ EGLenum buftype, |
+ EGLClientBuffer buffer, |
+ EGLConfig config, |
+ const EGLint* attrib_list) { |
+ return EGL_NO_SURFACE; |
+} |
+ |
+EGLBoolean eglSurfaceAttrib(EGLDisplay dpy, |
+ EGLSurface surface, |
+ EGLint attribute, |
+ EGLint value) { |
+ return EGL_FALSE; |
+} |
+ |
+EGLBoolean eglBindTexImage(EGLDisplay dpy, |
+ EGLSurface surface, |
+ EGLint buffer) { |
+ return EGL_FALSE; |
+} |
+ |
+EGLBoolean eglReleaseTexImage(EGLDisplay dpy, |
+ EGLSurface surface, |
+ EGLint buffer) { |
+ return EGL_FALSE; |
+} |
+ |
+EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) { |
+ return EGL_FALSE; |
+} |
+ |
+EGLContext eglCreateContext(EGLDisplay dpy, |
+ EGLConfig config, |
+ EGLContext share_context, |
+ const EGLint* attrib_list) { |
+ EGLint error_code = ValidateDisplayConfig(dpy, config); |
+ if (error_code != EGL_SUCCESS) |
+ return EglError(error_code, EGL_NO_CONTEXT); |
+ |
+ if (share_context != EGL_NO_CONTEXT) { |
+ error_code = ValidateDisplayContext(dpy, share_context); |
+ if (error_code != EGL_SUCCESS) |
+ return EglError(error_code, EGL_NO_CONTEXT); |
+ } |
+ |
+ egl::Display* display = static_cast<egl::Display*>(dpy); |
+ EGLContext context = display->CreateContext( |
+ config, share_context, attrib_list); |
+ if (context == EGL_NO_CONTEXT) |
+ return EglError(EGL_BAD_ALLOC, EGL_NO_CONTEXT); |
+ |
+ return EglSuccess(context); |
+} |
+ |
+EGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) { |
+ EGLint error_code = ValidateDisplayContext(dpy, ctx); |
+ if (error_code != EGL_SUCCESS) |
+ return EglError(error_code, EGL_FALSE); |
+ |
+ egl::Display* display = static_cast<egl::Display*>(dpy); |
+ display->DestroyContext(ctx); |
+ return EGL_TRUE; |
+} |
+ |
+EGLBoolean eglMakeCurrent(EGLDisplay dpy, |
+ EGLSurface draw, |
+ EGLSurface read, |
+ EGLContext ctx) { |
+ if (ctx != EGL_NO_CONTEXT) { |
+ EGLint error_code = ValidateDisplaySurface(dpy, draw); |
+ if (error_code != EGL_SUCCESS) |
+ return EglError(error_code, EGL_FALSE); |
+ error_code = ValidateDisplaySurface(dpy, read); |
+ if (error_code != EGL_SUCCESS) |
+ return EglError(error_code, EGL_FALSE); |
+ error_code = ValidateDisplayContext(dpy, ctx); |
+ if (error_code != EGL_SUCCESS) |
+ return EglError(error_code, EGL_FALSE); |
+ } |
+ |
+ egl::Display* display = static_cast<egl::Display*>(dpy); |
+ if (!display->MakeCurrent(draw, read, ctx)) |
+ return EglError(EGL_CONTEXT_LOST, EGL_FALSE); |
+ return EGL_TRUE; |
+} |
+ |
+EGLContext eglGetCurrentContext() { |
+ return EGL_NO_CONTEXT; |
+} |
+ |
+EGLSurface eglGetCurrentSurface(EGLint readdraw) { |
+ return EGL_NO_SURFACE; |
+} |
+ |
+EGLDisplay eglGetCurrentDisplay() { |
+ return EGL_NO_DISPLAY; |
+} |
+ |
+EGLBoolean eglQueryContext(EGLDisplay dpy, |
+ EGLContext ctx, |
+ EGLint attribute, |
+ EGLint* value) { |
+ return EGL_FALSE; |
+} |
+ |
+EGLBoolean eglWaitGL() { |
+ return EGL_FALSE; |
+} |
+ |
+EGLBoolean eglWaitNative(EGLint engine) { |
+ return EGL_FALSE; |
+} |
+ |
+EGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) { |
+ EGLint error_code = ValidateDisplaySurface(dpy, surface); |
+ if (error_code != EGL_SUCCESS) |
+ return EglError(error_code, EGL_FALSE); |
+ |
+ egl::Display* display = static_cast<egl::Display*>(dpy); |
+ display->SwapBuffers(surface); |
+ return EglSuccess(EGL_TRUE); |
+} |
+ |
+EGLBoolean eglCopyBuffers(EGLDisplay dpy, |
+ EGLSurface surface, |
+ EGLNativePixmapType target) { |
+ return EGL_FALSE; |
+} |
+ |
+/* Now, define eglGetProcAddress using the generic function ptr. type */ |
+__eglMustCastToProperFunctionPointerType |
+eglGetProcAddress(const char* procname) { |
+ return NULL; |
+} |
+} // extern "C" |