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

Side by Side Diff: content/common/gpu/image_transport_surface_linux.cc

Issue 7980006: Implement OSMesa image transport for TOUCH_UI builds (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Fix mac build 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 #if defined(ENABLE_GPU) 5 #if defined(ENABLE_GPU)
6 6
7 #include "content/common/gpu/image_transport_surface_linux.h" 7 #include "content/common/gpu/image_transport_surface_linux.h"
8 8
9 // This conflicts with the defines in Xlib.h and must come first. 9 // This conflicts with the defines in Xlib.h and must come first.
10 #include "content/common/gpu/gpu_messages.h" 10 #include "content/common/gpu/gpu_messages.h"
11 11
12 #include <map> 12 #include <map>
13 #include <X11/Xlib.h> 13 #include <X11/Xlib.h>
14 #include <X11/extensions/Xcomposite.h> 14 #include <X11/extensions/Xcomposite.h>
15 15
16 #include "base/callback.h" 16 #include "base/callback.h"
17 #include "content/common/gpu/gpu_channel.h" 17 #include "content/common/gpu/gpu_channel.h"
18 #include "content/common/gpu/gpu_channel_manager.h" 18 #include "content/common/gpu/gpu_channel_manager.h"
19 #include "content/common/gpu/gpu_command_buffer_stub.h" 19 #include "content/common/gpu/gpu_command_buffer_stub.h"
20 #include "gpu/command_buffer/service/gpu_scheduler.h" 20 #include "gpu/command_buffer/service/gpu_scheduler.h"
21 #include "third_party/angle/include/EGL/egl.h" 21 #include "third_party/angle/include/EGL/egl.h"
22 #include "third_party/angle/include/EGL/eglext.h" 22 #include "third_party/angle/include/EGL/eglext.h"
23 #include "third_party/mesa/MesaLib/include/GL/osmesa.h"
23 #include "ui/gfx/gl/gl_context.h" 24 #include "ui/gfx/gl/gl_context.h"
24 #include "ui/gfx/gl/gl_bindings.h" 25 #include "ui/gfx/gl/gl_bindings.h"
25 #include "ui/gfx/gl/gl_implementation.h" 26 #include "ui/gfx/gl/gl_implementation.h"
26 #include "ui/gfx/gl/gl_surface_egl.h" 27 #include "ui/gfx/gl/gl_surface_egl.h"
27 #include "ui/gfx/gl/gl_surface_glx.h" 28 #include "ui/gfx/gl/gl_surface_glx.h"
29 #include "ui/gfx/gl/gl_surface_osmesa.h"
28 #include "ui/gfx/surface/accelerated_surface_linux.h" 30 #include "ui/gfx/surface/accelerated_surface_linux.h"
29 31
30 namespace { 32 namespace {
31 33
32 // We are backed by an Pbuffer offscreen surface for the purposes of creating a 34 // We are backed by an Pbuffer offscreen surface for the purposes of creating a
33 // context, but use FBOs to render to X Pixmap backed EGLImages. 35 // context, but use FBOs to render to X Pixmap backed EGLImages.
34 class EGLImageTransportSurface : public ImageTransportSurface, 36 class EGLImageTransportSurface : public ImageTransportSurface,
35 public gfx::PbufferGLSurfaceEGL { 37 public gfx::PbufferGLSurfaceEGL {
36 public: 38 public:
37 EGLImageTransportSurface(GpuChannelManager* manager, 39 EGLImageTransportSurface(GpuChannelManager* manager,
38 int32 render_view_id, 40 int32 render_view_id,
39 int32 renderer_id, 41 int32 renderer_id,
40 int32 command_buffer_id); 42 int32 command_buffer_id);
41 43
42 // GLSurface implementation 44 // GLSurface implementation
43 virtual bool Initialize() OVERRIDE; 45 virtual bool Initialize() OVERRIDE;
44 virtual void Destroy() OVERRIDE; 46 virtual void Destroy() OVERRIDE;
45 virtual bool IsOffscreen() OVERRIDE; 47 virtual bool IsOffscreen() OVERRIDE;
46 virtual bool SwapBuffers() OVERRIDE; 48 virtual bool SwapBuffers() OVERRIDE;
47 virtual gfx::Size GetSize() OVERRIDE; 49 virtual gfx::Size GetSize() OVERRIDE;
48 virtual void OnMakeCurrent(gfx::GLContext* context) OVERRIDE; 50 virtual void OnMakeCurrent(gfx::GLContext* context) OVERRIDE;
49 virtual unsigned int GetBackingFrameBufferObject() OVERRIDE; 51 virtual unsigned int GetBackingFrameBufferObject() OVERRIDE;
50 52
51 protected: 53 protected:
52 // ImageTransportSurface implementation 54 // ImageTransportSurface implementation
53 virtual void OnSetSurfaceACK(uint64 surface_id) OVERRIDE; 55 virtual void OnNewSurfaceACK(
56 uint64 surface_id, TransportDIB::Handle surface_handle) OVERRIDE;
54 virtual void OnBuffersSwappedACK() OVERRIDE; 57 virtual void OnBuffersSwappedACK() OVERRIDE;
55 virtual void OnResize(gfx::Size size) OVERRIDE; 58 virtual void OnResize(gfx::Size size) OVERRIDE;
56 59
57 private: 60 private:
58 virtual ~EGLImageTransportSurface() OVERRIDE; 61 virtual ~EGLImageTransportSurface() OVERRIDE;
59 void ReleaseSurface(scoped_refptr<AcceleratedSurface>* surface); 62 void ReleaseSurface(scoped_refptr<AcceleratedSurface>* surface);
60 63
61 uint32 fbo_id_; 64 uint32 fbo_id_;
62 65
63 scoped_refptr<AcceleratedSurface> back_surface_; 66 scoped_refptr<AcceleratedSurface> back_surface_;
64 scoped_refptr<AcceleratedSurface> front_surface_; 67 scoped_refptr<AcceleratedSurface> front_surface_;
65 68
66 scoped_ptr<ImageTransportHelper> helper_; 69 scoped_ptr<ImageTransportHelper> helper_;
67 70
68 DISALLOW_COPY_AND_ASSIGN(EGLImageTransportSurface); 71 DISALLOW_COPY_AND_ASSIGN(EGLImageTransportSurface);
69 }; 72 };
70 73
71 // We are backed by an Pbuffer offscreen surface for the purposes of creating a 74 // We render to an off-screen (but mapped) window that the browser process will
72 // context, but use FBOs to render to X Pixmap backed EGLImages. 75 // read from via XComposite
73 class GLXImageTransportSurface : public ImageTransportSurface, 76 class GLXImageTransportSurface : public ImageTransportSurface,
74 public gfx::NativeViewGLSurfaceGLX { 77 public gfx::NativeViewGLSurfaceGLX {
75 public: 78 public:
76 GLXImageTransportSurface(GpuChannelManager* manager, 79 GLXImageTransportSurface(GpuChannelManager* manager,
77 int32 render_view_id, 80 int32 render_view_id,
78 int32 renderer_id, 81 int32 renderer_id,
79 int32 command_buffer_id); 82 int32 command_buffer_id);
80 83
81 // gfx::GLSurface implementation: 84 // gfx::GLSurface implementation:
82 virtual bool Initialize() OVERRIDE; 85 virtual bool Initialize() OVERRIDE;
83 virtual void Destroy() OVERRIDE; 86 virtual void Destroy() OVERRIDE;
84 virtual bool SwapBuffers() OVERRIDE; 87 virtual bool SwapBuffers() OVERRIDE;
85 virtual gfx::Size GetSize() OVERRIDE; 88 virtual gfx::Size GetSize() OVERRIDE;
86 virtual void OnMakeCurrent(gfx::GLContext* context) OVERRIDE; 89 virtual void OnMakeCurrent(gfx::GLContext* context) OVERRIDE;
87 90
88 protected: 91 protected:
89 // ImageTransportSurface implementation: 92 // ImageTransportSurface implementation:
90 void OnSetSurfaceACK(uint64 surface_id) OVERRIDE; 93 virtual void OnNewSurfaceACK(
91 void OnBuffersSwappedACK() OVERRIDE; 94 uint64 surface_id, TransportDIB::Handle surface_handle) OVERRIDE;
92 void OnResize(gfx::Size size) OVERRIDE; 95 virtual void OnBuffersSwappedACK() OVERRIDE;
96 virtual void OnResize(gfx::Size size) OVERRIDE;
93 97
94 private: 98 private:
95 virtual ~GLXImageTransportSurface(); 99 virtual ~GLXImageTransportSurface();
96 100
97 // Tell the browser to release the surface. 101 // Tell the browser to release the surface.
98 void ReleaseSurface(); 102 void ReleaseSurface();
99 103
100 XID dummy_parent_; 104 XID dummy_parent_;
101 gfx::Size size_; 105 gfx::Size size_;
102 106
103 // Whether or not the image has been bound on the browser side. 107 // Whether or not the image has been bound on the browser side.
104 bool bound_; 108 bool bound_;
105 109
106 // Whether or not we've set the swap interval on the associated context. 110 // Whether or not we've set the swap interval on the associated context.
107 bool swap_interval_set_; 111 bool swap_interval_set_;
108 112
109 scoped_ptr<ImageTransportHelper> helper_; 113 scoped_ptr<ImageTransportHelper> helper_;
110 114
111 DISALLOW_COPY_AND_ASSIGN(GLXImageTransportSurface); 115 DISALLOW_COPY_AND_ASSIGN(GLXImageTransportSurface);
112 }; 116 };
113 117
118 // We render to a hunk of shared memory that we get from the browser.
119 // Swapping buffers simply means telling the browser to read the contents
120 // of the memory.
121 class OSMesaImageTransportSurface : public ImageTransportSurface,
122 public gfx::GLSurfaceOSMesa {
123 public:
124 OSMesaImageTransportSurface(GpuChannelManager* manager,
125 int32 render_view_id,
apatrick_chromium 2011/09/21 22:07:51 indentation
126 int32 renderer_id,
127 int32 command_buffer_id);
128
129 // gfx::GLSurface implementation:
130 virtual bool Initialize() OVERRIDE;
131 virtual void Destroy() OVERRIDE;
132 virtual bool IsOffscreen() OVERRIDE;
133 virtual bool SwapBuffers() OVERRIDE;
134 virtual gfx::Size GetSize() OVERRIDE;
135 virtual void* GetHandle() OVERRIDE;
136
137 protected:
138 // ImageTransportSurface implementation:
139 virtual void OnNewSurfaceACK(
140 uint64 surface_id, TransportDIB::Handle surface_handle) OVERRIDE;
141 virtual void OnBuffersSwappedACK() OVERRIDE;
142 virtual void OnResize(gfx::Size size) OVERRIDE;
143
144 private:
145 virtual ~OSMesaImageTransportSurface();
146
147 // Tell the browser to release the surface.
148 void ReleaseSurface();
149
150 scoped_ptr<TransportDIB> shared_mem_;
151 uint32 shared_id_;
152 gfx::Size size_;
153
154 scoped_ptr<ImageTransportHelper> helper_;
155
156 DISALLOW_COPY_AND_ASSIGN(OSMesaImageTransportSurface);
157 };
158
114 EGLImageTransportSurface::EGLImageTransportSurface( 159 EGLImageTransportSurface::EGLImageTransportSurface(
115 GpuChannelManager* manager, 160 GpuChannelManager* manager,
116 int32 render_view_id, 161 int32 render_view_id,
117 int32 renderer_id, 162 int32 renderer_id,
118 int32 command_buffer_id) 163 int32 command_buffer_id)
119 : gfx::PbufferGLSurfaceEGL(false, gfx::Size(1, 1)), 164 : gfx::PbufferGLSurfaceEGL(false, gfx::Size(1, 1)),
120 fbo_id_(0) { 165 fbo_id_(0) {
121 helper_.reset(new ImageTransportHelper(this, 166 helper_.reset(new ImageTransportHelper(this,
122 manager, 167 manager,
123 render_view_id, 168 render_view_id,
(...skipping 14 matching lines...) Expand all
138 void EGLImageTransportSurface::Destroy() { 183 void EGLImageTransportSurface::Destroy() {
139 if (back_surface_.get()) 184 if (back_surface_.get())
140 ReleaseSurface(&back_surface_); 185 ReleaseSurface(&back_surface_);
141 if (front_surface_.get()) 186 if (front_surface_.get())
142 ReleaseSurface(&front_surface_); 187 ReleaseSurface(&front_surface_);
143 188
144 helper_->Destroy(); 189 helper_->Destroy();
145 PbufferGLSurfaceEGL::Destroy(); 190 PbufferGLSurfaceEGL::Destroy();
146 } 191 }
147 192
193 // Make sure that buffer swaps occur for the surface, so we can send the data
194 // to the actual onscreen surface in the browser
148 bool EGLImageTransportSurface::IsOffscreen() { 195 bool EGLImageTransportSurface::IsOffscreen() {
149 return false; 196 return false;
150 } 197 }
151 198
152 void EGLImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) { 199 void EGLImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) {
153 if (fbo_id_) 200 if (fbo_id_)
154 return; 201 return;
155 202
156 glGenFramebuffersEXT(1, &fbo_id_); 203 glGenFramebuffersEXT(1, &fbo_id_);
157 glBindFramebufferEXT(GL_FRAMEBUFFER, fbo_id_); 204 glBindFramebufferEXT(GL_FRAMEBUFFER, fbo_id_);
(...skipping 24 matching lines...) Expand all
182 ReleaseSurface(&back_surface_); 229 ReleaseSurface(&back_surface_);
183 230
184 back_surface_ = new AcceleratedSurface(size); 231 back_surface_ = new AcceleratedSurface(size);
185 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, 232 glFramebufferTexture2DEXT(GL_FRAMEBUFFER,
186 GL_COLOR_ATTACHMENT0, 233 GL_COLOR_ATTACHMENT0,
187 GL_TEXTURE_2D, 234 GL_TEXTURE_2D,
188 back_surface_->texture(), 235 back_surface_->texture(),
189 0); 236 0);
190 glFlush(); 237 glFlush();
191 238
192 GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params params; 239 GpuHostMsg_AcceleratedSurfaceNew_Params params;
193 params.width = size.width(); 240 params.width = size.width();
194 params.height = size.height(); 241 params.height = size.height();
195 params.identifier = back_surface_->pixmap(); 242 params.identifier = back_surface_->pixmap();
196 helper_->SendAcceleratedSurfaceSetIOSurface(params); 243 helper_->SendAcceleratedSurfaceNew(params);
197 244
198 helper_->SetScheduled(false); 245 helper_->SetScheduled(false);
199 } 246 }
200 247
201 bool EGLImageTransportSurface::SwapBuffers() { 248 bool EGLImageTransportSurface::SwapBuffers() {
202 front_surface_.swap(back_surface_); 249 front_surface_.swap(back_surface_);
203 DCHECK_NE(front_surface_.get(), static_cast<AcceleratedSurface*>(NULL)); 250 DCHECK_NE(front_surface_.get(), static_cast<AcceleratedSurface*>(NULL));
204 glFlush(); 251 glFlush();
205 252
206 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; 253 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
(...skipping 11 matching lines...) Expand all
218 0); 265 0);
219 } 266 }
220 helper_->SetScheduled(false); 267 helper_->SetScheduled(false);
221 return true; 268 return true;
222 } 269 }
223 270
224 gfx::Size EGLImageTransportSurface::GetSize() { 271 gfx::Size EGLImageTransportSurface::GetSize() {
225 return back_surface_->size(); 272 return back_surface_->size();
226 } 273 }
227 274
228 void EGLImageTransportSurface::OnSetSurfaceACK( 275 void EGLImageTransportSurface::OnNewSurfaceACK(
229 uint64 surface_id) { 276 uint64 surface_id, TransportDIB::Handle /*surface_handle*/) {
230 DCHECK_EQ(back_surface_->pixmap(), surface_id); 277 DCHECK_EQ(back_surface_->pixmap(), surface_id);
231 helper_->SetScheduled(true); 278 helper_->SetScheduled(true);
232 } 279 }
233 280
234 void EGLImageTransportSurface::OnBuffersSwappedACK() { 281 void EGLImageTransportSurface::OnBuffersSwappedACK() {
235 helper_->SetScheduled(true); 282 helper_->SetScheduled(true);
236 } 283 }
237 284
238 GLXImageTransportSurface::GLXImageTransportSurface( 285 GLXImageTransportSurface::GLXImageTransportSurface(
239 GpuChannelManager* manager, 286 GpuChannelManager* manager,
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 size_ = size; 371 size_ = size;
325 if (bound_) { 372 if (bound_) {
326 ReleaseSurface(); 373 ReleaseSurface();
327 bound_ = false; 374 bound_ = false;
328 } 375 }
329 376
330 Display* dpy = gfx::GLSurfaceGLX::GetDisplay(); 377 Display* dpy = gfx::GLSurfaceGLX::GetDisplay();
331 XResizeWindow(dpy, window_, size_.width(), size_.height()); 378 XResizeWindow(dpy, window_, size_.width(), size_.height());
332 XFlush(dpy); 379 XFlush(dpy);
333 380
334 GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params params; 381 GpuHostMsg_AcceleratedSurfaceNew_Params params;
335 params.width = size_.width(); 382 params.width = size_.width();
336 params.height = size_.height(); 383 params.height = size_.height();
337 params.identifier = window_; 384 params.identifier = window_;
338 helper_->SendAcceleratedSurfaceSetIOSurface(params); 385 helper_->SendAcceleratedSurfaceNew(params);
339 386
340 helper_->SetScheduled(false); 387 helper_->SetScheduled(false);
341 } 388 }
342 389
343 bool GLXImageTransportSurface::SwapBuffers() { 390 bool GLXImageTransportSurface::SwapBuffers() {
344 gfx::NativeViewGLSurfaceGLX::SwapBuffers(); 391 gfx::NativeViewGLSurfaceGLX::SwapBuffers();
345 glFlush(); 392 glFlush();
346 393
347 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; 394 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
348 params.surface_id = window_; 395 params.surface_id = window_;
349 helper_->SendAcceleratedSurfaceBuffersSwapped(params); 396 helper_->SendAcceleratedSurfaceBuffersSwapped(params);
350 397
351 helper_->SetScheduled(false); 398 helper_->SetScheduled(false);
352 return true; 399 return true;
353 } 400 }
354 401
355 gfx::Size GLXImageTransportSurface::GetSize() { 402 gfx::Size GLXImageTransportSurface::GetSize() {
356 return size_; 403 return size_;
357 } 404 }
358 405
359 void GLXImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) { 406 void GLXImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) {
360 if (!swap_interval_set_) { 407 if (!swap_interval_set_) {
361 context->SetSwapInterval(0); 408 context->SetSwapInterval(0);
362 swap_interval_set_ = true; 409 swap_interval_set_ = true;
363 } 410 }
364 } 411 }
365 412
366 void GLXImageTransportSurface::OnSetSurfaceACK( 413 void GLXImageTransportSurface::OnNewSurfaceACK(
367 uint64 surface_id) { 414 uint64 surface_id, TransportDIB::Handle /*surface_handle*/) {
368 DCHECK(!bound_); 415 DCHECK(!bound_);
369 bound_ = true; 416 bound_ = true;
370 helper_->SetScheduled(true); 417 helper_->SetScheduled(true);
371 } 418 }
372 419
373 void GLXImageTransportSurface::OnBuffersSwappedACK() { 420 void GLXImageTransportSurface::OnBuffersSwappedACK() {
374 helper_->SetScheduled(true); 421 helper_->SetScheduled(true);
375 } 422 }
376 423
424 OSMesaImageTransportSurface::OSMesaImageTransportSurface(
425 GpuChannelManager* manager,
426 int32 render_view_id,
427 int32 renderer_id,
428 int32 command_buffer_id)
429 : gfx::GLSurfaceOSMesa(OSMESA_RGBA, gfx::Size(1, 1)),
430 size_(gfx::Size(1, 1)) {
431 helper_.reset(new ImageTransportHelper(this,
432 manager,
433 render_view_id,
434 renderer_id,
435 command_buffer_id));
436 }
437
438 OSMesaImageTransportSurface::~OSMesaImageTransportSurface() {
439 Destroy();
440 }
441
442 bool OSMesaImageTransportSurface::Initialize() {
443 if (!helper_->Initialize())
444 return false;
445 return gfx::GLSurfaceOSMesa::Initialize();
446 }
447
448 void OSMesaImageTransportSurface::Destroy() {
449 if (shared_mem_.get())
450 ReleaseSurface();
451
452 helper_->Destroy();
453 gfx::GLSurfaceOSMesa::Destroy();
454 }
455
456 // Make sure that buffer swaps occur for the surface, so we can send the data
457 // to the actual onscreen surface in the browser
458 bool OSMesaImageTransportSurface::IsOffscreen() {
459 return false;
460 }
461
462 void OSMesaImageTransportSurface::ReleaseSurface() {
463 GpuHostMsg_AcceleratedSurfaceRelease_Params params;
464 params.identifier = shared_id_;
465 helper_->SendAcceleratedSurfaceRelease(params);
466
467 shared_mem_.reset();
468 shared_id_ = 0;
469 }
470
471 void OSMesaImageTransportSurface::OnResize(gfx::Size size) {
472 if (shared_mem_.get())
473 ReleaseSurface();
474
475 // Now that the shared memory buffer is gone, we need to change OSMesa to
476 // point at something valid, so we'll let it point to the buffer in the super
477 // class. This would be really bad since that buffer has a different size,
478 // but we don't allow any drawing to take place until we reset the surface
479 // back to a new buffer of shared memory.
480 helper_->MakeCurrent();
481
482 size_ = size;
483
484 GpuHostMsg_AcceleratedSurfaceNew_Params params;
485 params.width = size_.width();
486 params.height = size_.height();
487 params.identifier = 0; // id comes from the browser with the shared mem
488 helper_->SendAcceleratedSurfaceNew(params);
489
490 helper_->SetScheduled(false);
491 }
492
493 void OSMesaImageTransportSurface::OnNewSurfaceACK(
494 uint64 surface_id, TransportDIB::Handle surface_handle) {
495 shared_id_ = surface_id;
496 shared_mem_.reset(TransportDIB::Map(surface_handle));
497 DCHECK_NE(shared_mem_.get(), static_cast<void*>(NULL));
498
499 // When we get the shared memory buffer back we can use that for OSMesa to
500 // write in, so we give it to OSMesa.
501 helper_->MakeCurrent();
502
503 helper_->SetScheduled(true);
504 }
505
506 bool OSMesaImageTransportSurface::SwapBuffers() {
507 DCHECK_NE(shared_mem_.get(), static_cast<void*>(NULL));
508
509 // Copy the OSMesa buffer to the shared memory
510 memcpy(shared_mem_->memory(), GetHandle(), size_.GetArea() * 4);
511
512 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
513 params.surface_id = shared_id_;
514 helper_->SendAcceleratedSurfaceBuffersSwapped(params);
515
516 helper_->SetScheduled(false);
517 return true;
518 }
519
520 void OSMesaImageTransportSurface::OnBuffersSwappedACK() {
521 helper_->SetScheduled(true);
522 }
523
524 gfx::Size OSMesaImageTransportSurface::GetSize() {
525 return size_;
526 }
527
528 void* OSMesaImageTransportSurface::GetHandle() {
529 if (shared_mem_.get())
530 return shared_mem_->memory();
531 else
532 return GLSurfaceOSMesa::GetHandle();
533 }
534
377 } // namespace 535 } // namespace
378 536
379 // static 537 // static
380 scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateSurface( 538 scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateSurface(
381 GpuChannelManager* manager, 539 GpuChannelManager* manager,
382 int32 render_view_id, 540 int32 render_view_id,
383 int32 renderer_id, 541 int32 renderer_id,
384 int32 command_buffer_id) { 542 int32 command_buffer_id) {
385 scoped_refptr<gfx::GLSurface> surface; 543 scoped_refptr<gfx::GLSurface> surface;
386 switch (gfx::GetGLImplementation()) { 544 switch (gfx::GetGLImplementation()) {
387 case gfx::kGLImplementationDesktopGL: 545 case gfx::kGLImplementationDesktopGL:
388 surface = new GLXImageTransportSurface(manager, 546 surface = new GLXImageTransportSurface(manager,
389 render_view_id, 547 render_view_id,
390 renderer_id, 548 renderer_id,
391 command_buffer_id); 549 command_buffer_id);
392 break; 550 break;
393 case gfx::kGLImplementationEGLGLES2: 551 case gfx::kGLImplementationEGLGLES2:
394 surface = new EGLImageTransportSurface(manager, 552 surface = new EGLImageTransportSurface(manager,
395 render_view_id, 553 render_view_id,
396 renderer_id, 554 renderer_id,
397 command_buffer_id); 555 command_buffer_id);
398 break; 556 break;
557 case gfx::kGLImplementationOSMesaGL:
558 surface = new OSMesaImageTransportSurface(manager,
559 render_view_id,
560 renderer_id,
561 command_buffer_id);
562 break;
399 default: 563 default:
400 NOTREACHED(); 564 NOTREACHED();
401 return NULL; 565 return NULL;
402 } 566 }
403 if (surface->Initialize()) 567 if (surface->Initialize())
404 return surface; 568 return surface;
405 else 569 else
406 return NULL; 570 return NULL;
407 } 571 }
408 572
(...skipping 25 matching lines...) Expand all
434 598
435 return true; 599 return true;
436 } 600 }
437 601
438 void ImageTransportHelper::Destroy() { 602 void ImageTransportHelper::Destroy() {
439 } 603 }
440 604
441 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { 605 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) {
442 bool handled = true; 606 bool handled = true;
443 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) 607 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message)
444 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_SetSurfaceACK, 608 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK,
445 OnSetSurfaceACK) 609 OnNewSurfaceACK)
446 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK, 610 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK,
447 OnBuffersSwappedACK) 611 OnBuffersSwappedACK)
448 IPC_MESSAGE_UNHANDLED(handled = false) 612 IPC_MESSAGE_UNHANDLED(handled = false)
449 IPC_END_MESSAGE_MAP() 613 IPC_END_MESSAGE_MAP()
450 return handled; 614 return handled;
451 } 615 }
452 616
453 void ImageTransportHelper::SendAcceleratedSurfaceRelease( 617 void ImageTransportHelper::SendAcceleratedSurfaceRelease(
454 GpuHostMsg_AcceleratedSurfaceRelease_Params params) { 618 GpuHostMsg_AcceleratedSurfaceRelease_Params params) {
455 params.renderer_id = renderer_id_; 619 params.renderer_id = renderer_id_;
456 params.render_view_id = render_view_id_; 620 params.render_view_id = render_view_id_;
457 params.route_id = route_id_; 621 params.route_id = route_id_;
458 manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params)); 622 manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params));
459 } 623 }
460 624
461 void ImageTransportHelper::SendAcceleratedSurfaceSetIOSurface( 625 void ImageTransportHelper::SendAcceleratedSurfaceNew(
462 GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params params) { 626 GpuHostMsg_AcceleratedSurfaceNew_Params params) {
463 params.renderer_id = renderer_id_; 627 params.renderer_id = renderer_id_;
464 params.render_view_id = render_view_id_; 628 params.render_view_id = render_view_id_;
465 params.route_id = route_id_; 629 params.route_id = route_id_;
466 manager_->Send(new GpuHostMsg_AcceleratedSurfaceSetIOSurface(params)); 630 manager_->Send(new GpuHostMsg_AcceleratedSurfaceNew(params));
467 } 631 }
468 632
469 void ImageTransportHelper::SendAcceleratedSurfaceBuffersSwapped( 633 void ImageTransportHelper::SendAcceleratedSurfaceBuffersSwapped(
470 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) { 634 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) {
471 params.renderer_id = renderer_id_; 635 params.renderer_id = renderer_id_;
472 params.render_view_id = render_view_id_; 636 params.render_view_id = render_view_id_;
473 params.route_id = route_id_; 637 params.route_id = route_id_;
474 manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); 638 manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params));
475 } 639 }
476 640
477 void ImageTransportHelper::SetScheduled(bool is_scheduled) { 641 void ImageTransportHelper::SetScheduled(bool is_scheduled) {
478 gpu::GpuScheduler* scheduler = Scheduler(); 642 gpu::GpuScheduler* scheduler = Scheduler();
479 if (!scheduler) 643 if (!scheduler)
480 return; 644 return;
481 645
482 scheduler->SetScheduled(is_scheduled); 646 scheduler->SetScheduled(is_scheduled);
483 } 647 }
484 648
485 void ImageTransportHelper::OnSetSurfaceACK(uint64 surface_id) { 649 void ImageTransportHelper::OnNewSurfaceACK(
486 surface_->OnSetSurfaceACK(surface_id); 650 uint64 surface_id, TransportDIB::Handle surface_handle) {
651 surface_->OnNewSurfaceACK(surface_id, surface_handle);
487 } 652 }
488 653
489 void ImageTransportHelper::OnBuffersSwappedACK() { 654 void ImageTransportHelper::OnBuffersSwappedACK() {
490 surface_->OnBuffersSwappedACK(); 655 surface_->OnBuffersSwappedACK();
491 } 656 }
492 657
493 void ImageTransportHelper::Resize(gfx::Size size) { 658 void ImageTransportHelper::Resize(gfx::Size size) {
494 surface_->OnResize(size); 659 surface_->OnResize(size);
495 } 660 }
496 661
662 bool ImageTransportHelper::MakeCurrent() {
663 gpu::gles2::GLES2Decoder* decoder = Decoder();
664 if (!decoder)
665 return false;
666 return decoder->MakeCurrent();
667 }
668
497 gpu::GpuScheduler* ImageTransportHelper::Scheduler() { 669 gpu::GpuScheduler* ImageTransportHelper::Scheduler() {
498 GpuChannel* channel = manager_->LookupChannel(renderer_id_); 670 GpuChannel* channel = manager_->LookupChannel(renderer_id_);
499 if (!channel) 671 if (!channel)
500 return NULL; 672 return NULL;
501 673
502 GpuCommandBufferStub* stub = 674 GpuCommandBufferStub* stub =
503 channel->LookupCommandBuffer(command_buffer_id_); 675 channel->LookupCommandBuffer(command_buffer_id_);
504 if (!stub) 676 if (!stub)
505 return NULL; 677 return NULL;
506 678
507 return stub->scheduler(); 679 return stub->scheduler();
508 } 680 }
509 681
510 gpu::gles2::GLES2Decoder* ImageTransportHelper::Decoder() { 682 gpu::gles2::GLES2Decoder* ImageTransportHelper::Decoder() {
511 GpuChannel* channel = manager_->LookupChannel(renderer_id_); 683 GpuChannel* channel = manager_->LookupChannel(renderer_id_);
512 if (!channel) 684 if (!channel)
513 return NULL; 685 return NULL;
514 686
515 GpuCommandBufferStub* stub = 687 GpuCommandBufferStub* stub =
516 channel->LookupCommandBuffer(command_buffer_id_); 688 channel->LookupCommandBuffer(command_buffer_id_);
517 if (!stub) 689 if (!stub)
518 return NULL; 690 return NULL;
519 691
520 return stub->decoder(); 692 return stub->decoder();
521 } 693 }
522 694
523 #endif // defined(USE_GPU) 695 #endif // defined(USE_GPU)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698