Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(273)

Side by Side Diff: chrome/browser/renderer_host/accelerated_surface_container_touch.cc

Issue 7552039: Vend common GL context (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address reviewer comments. Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/renderer_host/accelerated_surface_container_touch.h" 5 #include "chrome/browser/renderer_host/accelerated_surface_container_touch.h"
6 6
7 #include <X11/Xlib.h> 7 #include <X11/Xlib.h>
8 #include <X11/extensions/Xcomposite.h> 8 #include <X11/extensions/Xcomposite.h>
9 9
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "third_party/angle/include/EGL/egl.h" 11 #include "third_party/angle/include/EGL/egl.h"
12 #include "third_party/angle/include/EGL/eglext.h" 12 #include "third_party/angle/include/EGL/eglext.h"
13 #include "ui/gfx/gl/gl_bindings.h" 13 #include "ui/gfx/gl/gl_bindings.h"
14 #include "ui/gfx/gl/gl_implementation.h" 14 #include "ui/gfx/gl/gl_implementation.h"
15 #include "ui/gfx/gl/gl_surface_egl.h" 15 #include "ui/gfx/gl/gl_surface_egl.h"
16 #include "ui/gfx/gl/gl_surface_glx.h"
16 #include "ui/gfx/rect.h" 17 #include "ui/gfx/rect.h"
17 #include "ui/gfx/gl/gl_surface_glx.h"
18 #include "ui/gfx/transform.h" 18 #include "ui/gfx/transform.h"
19 19
20 namespace { 20 namespace {
21 21
22 class AcceleratedSurfaceContainerTouchEGL 22 class AcceleratedSurfaceContainerTouchEGL
23 : public AcceleratedSurfaceContainerTouch { 23 : public AcceleratedSurfaceContainerTouch {
24 public: 24 public:
25 AcceleratedSurfaceContainerTouchEGL(ui::CompositorGL* compositor, 25 AcceleratedSurfaceContainerTouchEGL(const gfx::Size& size,
26 const gfx::Size& size,
27 uint64 surface_handle); 26 uint64 surface_handle);
28 // TextureGL implementation 27 // TextureGL implementation
29 virtual void Draw(const ui::TextureDrawParams& params, 28 virtual void Draw(const ui::TextureDrawParams& params,
30 const gfx::Rect& clip_bounds_in_texture) OVERRIDE; 29 const gfx::Rect& clip_bounds_in_texture) OVERRIDE;
31 30
32 private: 31 private:
33 ~AcceleratedSurfaceContainerTouchEGL(); 32 ~AcceleratedSurfaceContainerTouchEGL();
34 33
35 void* image_; 34 void* image_;
35
36 DISALLOW_COPY_AND_ASSIGN(AcceleratedSurfaceContainerTouchEGL); 36 DISALLOW_COPY_AND_ASSIGN(AcceleratedSurfaceContainerTouchEGL);
37 }; 37 };
38 38
39 class AcceleratedSurfaceContainerTouchGLX 39 class AcceleratedSurfaceContainerTouchGLX
40 : public AcceleratedSurfaceContainerTouch { 40 : public AcceleratedSurfaceContainerTouch {
41 public: 41 public:
42 AcceleratedSurfaceContainerTouchGLX(ui::CompositorGL* compositor, 42 AcceleratedSurfaceContainerTouchGLX(const gfx::Size& size,
43 const gfx::Size& size,
44 uint64 surface_handle); 43 uint64 surface_handle);
45 // TextureGL implementation 44 // TextureGL implementation
46 virtual void Draw(const ui::TextureDrawParams& params, 45 virtual void Draw(const ui::TextureDrawParams& params,
47 const gfx::Rect& clip_bounds_in_texture) OVERRIDE; 46 const gfx::Rect& clip_bounds_in_texture) OVERRIDE;
48 47
49 private: 48 private:
50 ~AcceleratedSurfaceContainerTouchGLX(); 49 ~AcceleratedSurfaceContainerTouchGLX();
51 50
52 XID pixmap_; 51 XID pixmap_;
53 XID glx_pixmap_; 52 XID glx_pixmap_;
53
54 DISALLOW_COPY_AND_ASSIGN(AcceleratedSurfaceContainerTouchGLX); 54 DISALLOW_COPY_AND_ASSIGN(AcceleratedSurfaceContainerTouchGLX);
55 }; 55 };
56 56
57 class ScopedPtrXFree { 57 class ScopedPtrXFree {
58 public: 58 public:
59 void operator()(void* x) const { 59 void operator()(void* x) const {
60 ::XFree(x); 60 ::XFree(x);
61 } 61 }
62 }; 62 };
63 63
64 AcceleratedSurfaceContainerTouchEGL::AcceleratedSurfaceContainerTouchEGL( 64 AcceleratedSurfaceContainerTouchEGL::AcceleratedSurfaceContainerTouchEGL(
65 ui::CompositorGL* compositor,
66 const gfx::Size& size, 65 const gfx::Size& size,
67 uint64 surface_handle) 66 uint64 surface_handle)
68 : AcceleratedSurfaceContainerTouch(compositor, size), 67 : AcceleratedSurfaceContainerTouch(size),
69 image_(NULL) { 68 image_(NULL) {
70 compositor_->MakeCurrent(); 69 ui::SharedResources* instance = ui::SharedResources::GetInstance();
70 DCHECK(instance);
71 instance->MakeSharedContextCurrent();
71 72
72 image_ = eglCreateImageKHR( 73 image_ = eglCreateImageKHR(
73 gfx::GLSurfaceEGL::GetHardwareDisplay(), EGL_NO_CONTEXT, 74 gfx::GLSurfaceEGL::GetHardwareDisplay(), EGL_NO_CONTEXT,
74 EGL_NATIVE_PIXMAP_KHR, reinterpret_cast<void*>(surface_handle), NULL); 75 EGL_NATIVE_PIXMAP_KHR, reinterpret_cast<void*>(surface_handle), NULL);
75 76
76 glGenTextures(1, &texture_id_); 77 glGenTextures(1, &texture_id_);
77 glBindTexture(GL_TEXTURE_2D, texture_id_); 78 glBindTexture(GL_TEXTURE_2D, texture_id_);
78 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 79 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
79 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 80 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
80 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 81 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
81 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 82 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
82 glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image_); 83 glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image_);
83 glFlush(); 84 glFlush();
84 } 85 }
85 86
86 AcceleratedSurfaceContainerTouchEGL::~AcceleratedSurfaceContainerTouchEGL() { 87 AcceleratedSurfaceContainerTouchEGL::~AcceleratedSurfaceContainerTouchEGL() {
88 ui::SharedResources* instance = ui::SharedResources::GetInstance();
89 DCHECK(instance);
90 instance->MakeSharedContextCurrent();
91
87 eglDestroyImageKHR(gfx::GLSurfaceEGL::GetHardwareDisplay(), image_); 92 eglDestroyImageKHR(gfx::GLSurfaceEGL::GetHardwareDisplay(), image_);
88 glFlush(); 93 glFlush();
89 } 94 }
90 95
91 void AcceleratedSurfaceContainerTouchEGL::Draw( 96 void AcceleratedSurfaceContainerTouchEGL::Draw(
92 const ui::TextureDrawParams& params, 97 const ui::TextureDrawParams& params,
93 const gfx::Rect& clip_bounds_in_texture) { 98 const gfx::Rect& clip_bounds_in_texture) {
94 DCHECK(compositor_->program_no_swizzle()); 99 ui::SharedResources* instance = ui::SharedResources::GetInstance();
100 DCHECK(instance);
95 101
96 ui::TextureDrawParams modified_params = params; 102 ui::TextureDrawParams modified_params = params;
97 103
98 // Texture from GPU is flipped vertically. 104 // Texture from GPU is flipped vertically.
99 ui::Transform flipped; 105 ui::Transform flipped;
100 flipped.SetScaleY(-1.0); 106 flipped.SetScaleY(-1.0);
101 flipped.SetTranslateY(size_.height()); 107 flipped.SetTranslateY(size_.height());
102 flipped.ConcatTransform(params.transform); 108 flipped.ConcatTransform(params.transform);
103 109
104 modified_params.transform = flipped; 110 modified_params.transform = flipped;
105 111
106 DrawInternal(*compositor_->program_no_swizzle(), 112 DrawInternal(*instance->program_no_swizzle(),
107 modified_params, 113 modified_params,
108 clip_bounds_in_texture); 114 clip_bounds_in_texture);
109 } 115 }
110 116
111 AcceleratedSurfaceContainerTouchGLX::AcceleratedSurfaceContainerTouchGLX( 117 AcceleratedSurfaceContainerTouchGLX::AcceleratedSurfaceContainerTouchGLX(
112 ui::CompositorGL* compositor,
113 const gfx::Size& size, 118 const gfx::Size& size,
114 uint64 surface_handle) 119 uint64 surface_handle)
115 : AcceleratedSurfaceContainerTouch(compositor, size), 120 : AcceleratedSurfaceContainerTouch(size),
116 pixmap_(0), 121 pixmap_(0),
117 glx_pixmap_(0) { 122 glx_pixmap_(0) {
123 ui::SharedResources* instance = ui::SharedResources::GetInstance();
124 DCHECK(instance);
125 instance->MakeSharedContextCurrent();
126
118 // Create pixmap from window. 127 // Create pixmap from window.
119 Display* dpy = gfx::GLSurfaceGLX::GetDisplay(); 128 Display* dpy = gfx::GLSurfaceGLX::GetDisplay();
120 int event_base, error_base; 129 int event_base, error_base;
121 if (XCompositeQueryExtension(dpy, &event_base, &error_base)) { 130 if (XCompositeQueryExtension(dpy, &event_base, &error_base)) {
122 int major = 0, minor = 2; 131 int major = 0, minor = 2;
123 XCompositeQueryVersion(dpy, &major, &minor); 132 XCompositeQueryVersion(dpy, &major, &minor);
124 if (major == 0 && minor < 2) { 133 if (major == 0 && minor < 2) {
125 LOG(ERROR) << "Pixmap from window not supported."; 134 LOG(ERROR) << "Pixmap from window not supported.";
126 return; 135 return;
127 } 136 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 const int pixmapAttribs[] = { 188 const int pixmapAttribs[] = {
180 GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT, 189 GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
181 GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGB_EXT, 190 GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGB_EXT,
182 0 191 0
183 }; 192 };
184 193
185 glx_pixmap_ = glXCreatePixmap( 194 glx_pixmap_ = glXCreatePixmap(
186 dpy, fbconfigs.get()[config], pixmap_, pixmapAttribs); 195 dpy, fbconfigs.get()[config], pixmap_, pixmapAttribs);
187 196
188 // Create texture. 197 // Create texture.
189 compositor_->MakeCurrent();
190 glGenTextures(1, &texture_id_); 198 glGenTextures(1, &texture_id_);
191 glBindTexture(GL_TEXTURE_2D, texture_id_); 199 glBindTexture(GL_TEXTURE_2D, texture_id_);
192 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 200 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
193 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 201 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
194 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 202 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
195 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 203 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
196 } 204 }
197 205
198 AcceleratedSurfaceContainerTouchGLX::~AcceleratedSurfaceContainerTouchGLX() { 206 AcceleratedSurfaceContainerTouchGLX::~AcceleratedSurfaceContainerTouchGLX() {
207 ui::SharedResources* instance = ui::SharedResources::GetInstance();
208 DCHECK(instance);
209 instance->MakeSharedContextCurrent();
210
199 Display* dpy = gfx::GLSurfaceGLX::GetDisplay(); 211 Display* dpy = gfx::GLSurfaceGLX::GetDisplay();
200 if (glx_pixmap_) 212 if (glx_pixmap_)
201 glXDestroyGLXPixmap(dpy, glx_pixmap_); 213 glXDestroyGLXPixmap(dpy, glx_pixmap_);
202 if (pixmap_) 214 if (pixmap_)
203 XFreePixmap(dpy, pixmap_); 215 XFreePixmap(dpy, pixmap_);
204 } 216 }
205 217
206 void AcceleratedSurfaceContainerTouchGLX::Draw( 218 void AcceleratedSurfaceContainerTouchGLX::Draw(
207 const ui::TextureDrawParams& params, 219 const ui::TextureDrawParams& params,
208 const gfx::Rect& clip_bounds_in_texture) { 220 const gfx::Rect& clip_bounds_in_texture) {
209 DCHECK(compositor_->program_no_swizzle()); 221 ui::SharedResources* instance = ui::SharedResources::GetInstance();
222 DCHECK(instance);
223
210 Display* dpy = gfx::GLSurfaceGLX::GetDisplay(); 224 Display* dpy = gfx::GLSurfaceGLX::GetDisplay();
211 225
212 glBindTexture(GL_TEXTURE_2D, texture_id_); 226 glBindTexture(GL_TEXTURE_2D, texture_id_);
213 glXBindTexImageEXT(dpy, glx_pixmap_, GLX_FRONT_LEFT_EXT, NULL); 227 glXBindTexImageEXT(dpy, glx_pixmap_, GLX_FRONT_LEFT_EXT, NULL);
214 DrawInternal(*compositor_->program_no_swizzle(), 228 DrawInternal(*instance->program_no_swizzle(),
215 params, 229 params,
216 clip_bounds_in_texture); 230 clip_bounds_in_texture);
217 glXReleaseTexImageEXT(dpy, glx_pixmap_, GLX_FRONT_LEFT_EXT); 231 glXReleaseTexImageEXT(dpy, glx_pixmap_, GLX_FRONT_LEFT_EXT);
218 } 232 }
219 233
220 } // namespace 234 } // namespace
221 235
222 AcceleratedSurfaceContainerTouch::AcceleratedSurfaceContainerTouch( 236 AcceleratedSurfaceContainerTouch::AcceleratedSurfaceContainerTouch(
223 ui::CompositorGL* compositor, 237 const gfx::Size& size) : TextureGL(size) {
224 const gfx::Size& size) :
225 TextureGL(compositor, size) {
226 } 238 }
227 239
228 // static 240 // static
229 AcceleratedSurfaceContainerTouch* 241 AcceleratedSurfaceContainerTouch*
230 AcceleratedSurfaceContainerTouch::CreateAcceleratedSurfaceContainer( 242 AcceleratedSurfaceContainerTouch::CreateAcceleratedSurfaceContainer(
231 ui::CompositorGL* compositor,
232 const gfx::Size& size, 243 const gfx::Size& size,
233 uint64 surface_handle) { 244 uint64 surface_handle) {
234 switch (gfx::GetGLImplementation()) { 245 switch (gfx::GetGLImplementation()) {
235 case gfx::kGLImplementationDesktopGL: 246 case gfx::kGLImplementationDesktopGL:
236 return new AcceleratedSurfaceContainerTouchGLX(compositor, 247 return new AcceleratedSurfaceContainerTouchGLX(size,
237 size,
238 surface_handle); 248 surface_handle);
239 case gfx::kGLImplementationEGLGLES2: 249 case gfx::kGLImplementationEGLGLES2:
240 return new AcceleratedSurfaceContainerTouchEGL(compositor, 250 return new AcceleratedSurfaceContainerTouchEGL(size,
241 size,
242 surface_handle); 251 surface_handle);
243 default: 252 default:
244 NOTREACHED(); 253 NOTREACHED();
245 return NULL; 254 return NULL;
246 } 255 }
247 } 256 }
248 257
249 void AcceleratedSurfaceContainerTouch::SetCanvas( 258 void AcceleratedSurfaceContainerTouch::SetCanvas(
250 const SkCanvas& canvas, 259 const SkCanvas& canvas,
251 const gfx::Point& origin, 260 const gfx::Point& origin,
252 const gfx::Size& overall_size) { 261 const gfx::Size& overall_size) {
253 NOTREACHED(); 262 NOTREACHED();
254 } 263 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698