summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorbacker@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-25 17:01:55 +0000
committerbacker@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-25 17:01:55 +0000
commitae80234930dff518134b0073fe7c3d3fdcdcd4ec (patch)
tree5b267918fac3d3b414ab5a6d1a62f137e45bf4cc /ui
parent1cf99aa4097c941fbd3295eee277b40a947978df (diff)
downloadchromium_src-ae80234930dff518134b0073fe7c3d3fdcdcd4ec.zip
chromium_src-ae80234930dff518134b0073fe7c3d3fdcdcd4ec.tar.gz
chromium_src-ae80234930dff518134b0073fe7c3d3fdcdcd4ec.tar.bz2
Reland "EGLImage transport for TOUCH_UI".
The issue with r90511 was that we need EGL header files for touchui=1 builds. The solution was to pull them in from third_party/angle for touchui=1 only. BUG=none TEST=by hand on Linux (w/ and w/o TOUCH_UI), Windows, and Mac TBR=sky@chromium.org,apatrick@chromium.org git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90513 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r--ui/gfx/gl/generate_bindings.py7
-rw-r--r--ui/gfx/gl/gl_bindings.h2
-rw-r--r--ui/gfx/gl/gl_interface.h3
-rw-r--r--ui/gfx/surface/accelerated_surface_linux.cc47
-rw-r--r--ui/gfx/surface/accelerated_surface_linux.h33
-rw-r--r--ui/gfx/surface/surface.gyp5
6 files changed, 97 insertions, 0 deletions
diff --git a/ui/gfx/gl/generate_bindings.py b/ui/gfx/gl/generate_bindings.py
index 99a93c46..b083229 100644
--- a/ui/gfx/gl/generate_bindings.py
+++ b/ui/gfx/gl/generate_bindings.py
@@ -84,6 +84,8 @@ GL_FUNCTIONS = [
['void', ['glDrawArrays'], 'GLenum mode, GLint first, GLsizei count'],
['void', ['glDrawElements'],
'GLenum mode, GLsizei count, GLenum type, const void* indices'],
+['void', ['glEGLImageTargetTexture2DOES'],
+ 'GLenum target, GLeglImageOES image'],
['void', ['glEnable'], 'GLenum cap'],
['void', ['glEnableVertexAttribArray'], 'GLuint index'],
['void', ['glFinish'], 'void'],
@@ -291,6 +293,11 @@ EGL_FUNCTIONS = [
'EGLint config_size, EGLint* num_config'],
['EGLBoolean', ['eglGetConfigAttrib'],
'EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint* value'],
+['EGLImageKHR', ['eglCreateImageKHR'],
+ 'EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, '
+ 'const EGLint* attrib_list'],
+['EGLBoolean', ['eglDestroyImageKHR'],
+ 'EGLDisplay dpy, EGLImageKHR image'],
['EGLSurface', ['eglCreateWindowSurface'],
'EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, '
'const EGLint* attrib_list'],
diff --git a/ui/gfx/gl/gl_bindings.h b/ui/gfx/gl/gl_bindings.h
index e7d6ad9..34f9772 100644
--- a/ui/gfx/gl/gl_bindings.h
+++ b/ui/gfx/gl/gl_bindings.h
@@ -54,9 +54,11 @@ typedef int EGLint;
typedef void *EGLConfig;
typedef void *EGLContext;
typedef void *EGLDisplay;
+typedef void *EGLImageKHR;
typedef void *EGLSurface;
typedef void *EGLClientBuffer;
typedef void (*__eglMustCastToProperFunctionPointerType)(void);
+typedef void* GLeglImageOES;
#if defined(OS_WIN)
typedef HDC EGLNativeDisplayType;
diff --git a/ui/gfx/gl/gl_interface.h b/ui/gfx/gl/gl_interface.h
index 4795625..55ea9d1 100644
--- a/ui/gfx/gl/gl_interface.h
+++ b/ui/gfx/gl/gl_interface.h
@@ -168,6 +168,9 @@ class GLInterface {
GLenum type,
const void* indices) = 0;
+ virtual void EGLImageTargetTexture2DOES(
+ GLenum target, GLeglImageOES image) = 0;
+
virtual void Enable(GLenum cap) = 0;
virtual void EnableVertexAttribArray(GLuint index) = 0;
diff --git a/ui/gfx/surface/accelerated_surface_linux.cc b/ui/gfx/surface/accelerated_surface_linux.cc
new file mode 100644
index 0000000..9a42c68
--- /dev/null
+++ b/ui/gfx/surface/accelerated_surface_linux.cc
@@ -0,0 +1,47 @@
+// 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 "ui/gfx/surface/accelerated_surface_linux.h"
+
+#include <X11/Xlib.h>
+
+#include "third_party/angle/include/EGL/egl.h"
+#include "third_party/angle/include/EGL/eglext.h"
+#include "ui/gfx/gl/gl_surface_egl.h"
+#include "ui/gfx/gl/gl_bindings.h"
+
+AcceleratedSurface::AcceleratedSurface(const gfx::Size& size)
+ : size_(size) {
+ Display* dpy = gfx::GLSurfaceEGL::GetNativeDisplay();
+ EGLDisplay edpy = gfx::GLSurfaceEGL::GetDisplay();
+
+ XID window = XDefaultRootWindow(dpy);
+ XWindowAttributes gwa;
+ XGetWindowAttributes(dpy, window, &gwa);
+ pixmap_ = XCreatePixmap(
+ dpy, window, size_.width(), size_.height(), gwa.depth);
+
+ image_ = eglCreateImageKHR(
+ edpy, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, (void*) pixmap_, NULL);
+
+ glGenTextures(1, &texture_);
+
+ GLint current_texture = 0;
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &current_texture);
+
+ glBindTexture(GL_TEXTURE_2D, texture_);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image_);
+
+ glBindTexture(GL_TEXTURE_2D, current_texture);
+}
+
+AcceleratedSurface::~AcceleratedSurface() {
+ glDeleteTextures(1, &texture_);
+ eglDestroyImageKHR(gfx::GLSurfaceEGL::GetDisplay(), image_);
+ XFreePixmap(gfx::GLSurfaceEGL::GetNativeDisplay(), pixmap_);
+}
diff --git a/ui/gfx/surface/accelerated_surface_linux.h b/ui/gfx/surface/accelerated_surface_linux.h
new file mode 100644
index 0000000..b905712
--- /dev/null
+++ b/ui/gfx/surface/accelerated_surface_linux.h
@@ -0,0 +1,33 @@
+// 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.
+
+#ifndef UI_GFX_SURFACE_ACCELERATED_SURFACE_LINUX_H_
+#define UI_GFX_SURFACE_ACCELERATED_SURFACE_LINUX_H_
+#pragma once
+
+#include "base/memory/ref_counted.h"
+#include "ui/gfx/size.h"
+
+// The GL context associated with the surface must be current when
+// an instance is created or destroyed.
+class AcceleratedSurface : public base::RefCounted<AcceleratedSurface> {
+ public:
+ AcceleratedSurface(const gfx::Size& size);
+ const gfx::Size& size() const { return size_; }
+ uint32 pixmap() const { return pixmap_; }
+ uint32 texture() const { return texture_; }
+
+ private:
+ ~AcceleratedSurface();
+
+ gfx::Size size_;
+ void* image_;
+ uint32 pixmap_;
+ uint32 texture_;
+
+ friend class base::RefCounted<AcceleratedSurface>;
+ DISALLOW_COPY_AND_ASSIGN(AcceleratedSurface);
+};
+
+#endif // UI_GFX_SURFACE_ACCELERATED_SURFACE_LINUX_H_
diff --git a/ui/gfx/surface/surface.gyp b/ui/gfx/surface/surface.gyp
index e4c2893..960e148 100644
--- a/ui/gfx/surface/surface.gyp
+++ b/ui/gfx/surface/surface.gyp
@@ -16,6 +16,9 @@
['include', '_(gtk|linux|posix|skia|x)\\.cc$'],
['include', '/(gtk|x11)_[^/]*\\.cc$'],
],
+ 'include_dirs': [
+ '<(DEPTH)/third_party/angle/include',
+ ],
}],
['OS=="mac"', {'sources/': [
['include', '/cocoa/'],
@@ -44,6 +47,8 @@
'<(DEPTH)/ui/ui.gyp:ui_gfx',
],
'sources': [
+ 'accelerated_surface_linux.cc',
+ 'accelerated_surface_linux.h',
'accelerated_surface_mac.cc',
'accelerated_surface_mac.h',
'io_surface_support_mac.cc',