summaryrefslogtreecommitdiffstats
path: root/gpu/gles2_conform_support/native/egl_native_linux.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gpu/gles2_conform_support/native/egl_native_linux.cc')
-rw-r--r--gpu/gles2_conform_support/native/egl_native_linux.cc121
1 files changed, 121 insertions, 0 deletions
diff --git a/gpu/gles2_conform_support/native/egl_native_linux.cc b/gpu/gles2_conform_support/native/egl_native_linux.cc
new file mode 100644
index 0000000..a356e61
--- /dev/null
+++ b/gpu/gles2_conform_support/native/egl_native_linux.cc
@@ -0,0 +1,121 @@
+// 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 <EGL/eglext.h>
+#include <gdk/gdkx.h>
+#include <gtk/gtk.h>
+
+extern "C" {
+#if defined(GLES2_CONFORM_SUPPORT_ONLY)
+#include "gpu/gles2_conform_support/gtf/gtf_stubs.h"
+#else
+#include "third_party/gles2_conform/GTF_ES/glsl/GTF/Source/eglNative.h"
+#endif
+}
+
+
+GTFbool GTFNativeCreateDisplay(EGLNativeDisplayType *pNativeDisplay) {
+ int argc = 0;
+ char **argv = NULL;
+ gtk_init(&argc, &argv);
+ *pNativeDisplay = GDK_DISPLAY();;
+ return *pNativeDisplay ? GTFtrue : GTFfalse;
+}
+
+void GTFNativeDestroyDisplay(EGLNativeDisplayType nativeDisplay) {
+ gtk_exit(0);
+}
+
+GTFbool GTFNativeCreateWindow(EGLNativeDisplayType nativeDisplay,
+ EGLDisplay eglDisplay, EGLConfig eglConfig,
+ const char* title, int width, int height,
+ EGLNativeWindowType *pNativeWindow) {
+#ifdef CHROMEOS_GLES2_CONFORMANCE
+ // Due to the behavior of ChromeOS window manager, which always resize the
+ // top level window etc, we had to create a popup window.
+ GtkWidget* hwnd = gtk_window_new(GTK_WINDOW_POPUP);
+#else
+ GtkWidget* hwnd = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+#endif
+
+ gtk_window_set_title(GTK_WINDOW(hwnd), title);
+ gtk_window_set_default_size(GTK_WINDOW(hwnd), width, height);
+ gtk_widget_set_double_buffered(hwnd, FALSE);
+ gtk_widget_set_app_paintable(hwnd, TRUE);
+
+ // We had to enter gtk main loop to realize the window on ChromeOS.
+ gtk_widget_show_now(hwnd);
+
+ *pNativeWindow = GDK_WINDOW_XWINDOW(hwnd->window);
+
+ return GTFtrue;
+}
+
+void GTFNativeDestroyWindow(EGLNativeDisplayType nativeDisplay,
+ EGLNativeWindowType nativeWindow) {
+ GdkWindow* window = gdk_window_lookup(nativeWindow);
+ gpointer widget = NULL;
+ gdk_window_get_user_data(window, &widget);
+ gtk_widget_destroy(GTK_WIDGET(widget));
+}
+
+EGLImageKHR GTFCreateEGLImage(int width, int height,
+ GLenum format, GLenum type) {
+ PFNEGLCREATEIMAGEKHRPROC egl_create_image_khr_;
+ egl_create_image_khr_ = reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>
+ (eglGetProcAddress("eglCreateImageKHR"));
+
+ static const EGLint attrib[] = {
+ EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,
+ EGL_GL_TEXTURE_LEVEL_KHR, 0,
+ EGL_NONE
+ };
+
+ if (format != GL_RGBA && format != GL_RGB)
+ return static_cast<EGLImageKHR>(NULL);
+
+ if (type != GL_UNSIGNED_BYTE)
+ return static_cast<EGLImageKHR>(NULL);
+
+ GLuint texture;
+ glGenTextures(1, &texture);
+ glBindTexture(GL_TEXTURE_2D, texture);
+ glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ format,
+ width,
+ height,
+ 0,
+ format,
+ type,
+ NULL);
+
+ // Disable mip-maps because we do not require it.
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+ if(glGetError() != GL_NO_ERROR)
+ return static_cast<EGLImageKHR>(NULL);
+
+ EGLImageKHR egl_image =
+ egl_create_image_khr_(eglGetCurrentDisplay(),
+ eglGetCurrentContext(),
+ EGL_GL_TEXTURE_2D_KHR,
+ reinterpret_cast<EGLClientBuffer>(texture),
+ attrib);
+
+ if (eglGetError() == EGL_SUCCESS)
+ return egl_image;
+ else
+ return static_cast<EGLImageKHR>(NULL);
+}
+
+void GTFDestroyEGLImage(EGLImageKHR image) {
+ PFNEGLDESTROYIMAGEKHRPROC egl_destroy_image_khr_;
+ egl_destroy_image_khr_ = reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>
+ (eglGetProcAddress("eglDestroyImageKHR"));
+
+ egl_destroy_image_khr_(eglGetCurrentDisplay(), image);
+}