diff options
author | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-25 17:01:55 +0000 |
---|---|---|
committer | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-25 17:01:55 +0000 |
commit | ae80234930dff518134b0073fe7c3d3fdcdcd4ec (patch) | |
tree | 5b267918fac3d3b414ab5a6d1a62f137e45bf4cc /ui | |
parent | 1cf99aa4097c941fbd3295eee277b40a947978df (diff) | |
download | chromium_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.py | 7 | ||||
-rw-r--r-- | ui/gfx/gl/gl_bindings.h | 2 | ||||
-rw-r--r-- | ui/gfx/gl/gl_interface.h | 3 | ||||
-rw-r--r-- | ui/gfx/surface/accelerated_surface_linux.cc | 47 | ||||
-rw-r--r-- | ui/gfx/surface/accelerated_surface_linux.h | 33 | ||||
-rw-r--r-- | ui/gfx/surface/surface.gyp | 5 |
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, ¤t_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', |