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

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: Rebase onto newer trunk 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"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 virtual bool Initialize() OVERRIDE; 43 virtual bool Initialize() OVERRIDE;
44 virtual void Destroy() OVERRIDE; 44 virtual void Destroy() OVERRIDE;
45 virtual bool IsOffscreen() OVERRIDE; 45 virtual bool IsOffscreen() OVERRIDE;
46 virtual bool SwapBuffers() OVERRIDE; 46 virtual bool SwapBuffers() OVERRIDE;
47 virtual gfx::Size GetSize() OVERRIDE; 47 virtual gfx::Size GetSize() OVERRIDE;
48 virtual void OnMakeCurrent(gfx::GLContext* context) OVERRIDE; 48 virtual void OnMakeCurrent(gfx::GLContext* context) OVERRIDE;
49 virtual unsigned int GetBackingFrameBufferObject() OVERRIDE; 49 virtual unsigned int GetBackingFrameBufferObject() OVERRIDE;
50 50
51 protected: 51 protected:
52 // ImageTransportSurface implementation 52 // ImageTransportSurface implementation
53 virtual void OnSetSurfaceACK(uint64 surface_id) OVERRIDE; 53 virtual void OnNewSurfaceACK(
54 uint64 surface_id, TransportDIB::Handle surface_handle) OVERRIDE;
54 virtual void OnBuffersSwappedACK() OVERRIDE; 55 virtual void OnBuffersSwappedACK() OVERRIDE;
55 virtual void OnResize(gfx::Size size) OVERRIDE; 56 virtual void OnResize(gfx::Size size) OVERRIDE;
56 57
57 private: 58 private:
58 virtual ~EGLImageTransportSurface() OVERRIDE; 59 virtual ~EGLImageTransportSurface() OVERRIDE;
59 void ReleaseSurface(scoped_refptr<AcceleratedSurface>* surface); 60 void ReleaseSurface(scoped_refptr<AcceleratedSurface>* surface);
60 61
61 uint32 fbo_id_; 62 uint32 fbo_id_;
62 63
63 scoped_refptr<AcceleratedSurface> back_surface_; 64 scoped_refptr<AcceleratedSurface> back_surface_;
64 scoped_refptr<AcceleratedSurface> front_surface_; 65 scoped_refptr<AcceleratedSurface> front_surface_;
65 66
66 scoped_ptr<ImageTransportHelper> helper_; 67 scoped_ptr<ImageTransportHelper> helper_;
67 68
68 DISALLOW_COPY_AND_ASSIGN(EGLImageTransportSurface); 69 DISALLOW_COPY_AND_ASSIGN(EGLImageTransportSurface);
69 }; 70 };
70 71
71 // We are backed by an Pbuffer offscreen surface for the purposes of creating a 72 // 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. 73 // read from via XComposite
73 class GLXImageTransportSurface : public ImageTransportSurface, 74 class GLXImageTransportSurface : public ImageTransportSurface,
74 public gfx::NativeViewGLSurfaceGLX { 75 public gfx::NativeViewGLSurfaceGLX {
75 public: 76 public:
76 GLXImageTransportSurface(GpuChannelManager* manager, 77 GLXImageTransportSurface(GpuChannelManager* manager,
77 int32 render_view_id, 78 int32 render_view_id,
78 int32 renderer_id, 79 int32 renderer_id,
79 int32 command_buffer_id); 80 int32 command_buffer_id);
80 81
81 // gfx::GLSurface implementation: 82 // gfx::GLSurface implementation:
82 virtual bool Initialize() OVERRIDE; 83 virtual bool Initialize() OVERRIDE;
83 virtual void Destroy() OVERRIDE; 84 virtual void Destroy() OVERRIDE;
84 virtual bool SwapBuffers() OVERRIDE; 85 virtual bool SwapBuffers() OVERRIDE;
85 virtual gfx::Size GetSize() OVERRIDE; 86 virtual gfx::Size GetSize() OVERRIDE;
86 virtual void OnMakeCurrent(gfx::GLContext* context) OVERRIDE; 87 virtual void OnMakeCurrent(gfx::GLContext* context) OVERRIDE;
87 88
88 protected: 89 protected:
89 // ImageTransportSurface implementation: 90 // ImageTransportSurface implementation:
90 void OnSetSurfaceACK(uint64 surface_id) OVERRIDE; 91 virtual void OnNewSurfaceACK(
91 void OnBuffersSwappedACK() OVERRIDE; 92 uint64 surface_id, TransportDIB::Handle surface_handle) OVERRIDE;
92 void OnResize(gfx::Size size) OVERRIDE; 93 virtual void OnBuffersSwappedACK() OVERRIDE;
94 virtual void OnResize(gfx::Size size) OVERRIDE;
93 95
94 private: 96 private:
95 virtual ~GLXImageTransportSurface(); 97 virtual ~GLXImageTransportSurface();
96 98
97 // Tell the browser to release the surface. 99 // Tell the browser to release the surface.
98 void ReleaseSurface(); 100 void ReleaseSurface();
99 101
100 XID dummy_parent_; 102 XID dummy_parent_;
101 gfx::Size size_; 103 gfx::Size size_;
102 104
103 // Whether or not the image has been bound on the browser side. 105 // Whether or not the image has been bound on the browser side.
104 bool bound_; 106 bool bound_;
105 107
106 // Whether or not we've set the swap interval on the associated context. 108 // Whether or not we've set the swap interval on the associated context.
107 bool swap_interval_set_; 109 bool swap_interval_set_;
108 110
109 scoped_ptr<ImageTransportHelper> helper_; 111 scoped_ptr<ImageTransportHelper> helper_;
110 112
111 DISALLOW_COPY_AND_ASSIGN(GLXImageTransportSurface); 113 DISALLOW_COPY_AND_ASSIGN(GLXImageTransportSurface);
112 }; 114 };
113 115
116 // We render to an off-screen (but mapped) window, then dump its contents
117 // into a shared memory buffer to get the memory to the browser compositor.
118 // This is to replicate the behaviour of OSMesa, without using OSMesa for now.
119 class GLXShmImageTransportSurface : public ImageTransportSurface,
120 public gfx::PbufferGLSurfaceGLX {
121 public:
122 GLXShmImageTransportSurface(GpuChannelManager* manager,
123 int32 render_view_id,
124 int32 renderer_id,
125 int32 command_buffer_id);
126
127 // gfx::GLSurface implementation:
128 virtual bool Initialize() OVERRIDE;
129 virtual void Destroy() OVERRIDE;
130 virtual bool IsOffscreen() OVERRIDE;
131 virtual bool SwapBuffers() OVERRIDE;
132 virtual gfx::Size GetSize() OVERRIDE;
133 virtual void OnMakeCurrent(gfx::GLContext* context) OVERRIDE;
134 virtual unsigned int GetBackingFrameBufferObject() OVERRIDE;
135
136 protected:
137 // ImageTransportSurface implementation:
138 virtual void OnNewSurfaceACK(
139 uint64 surface_id, TransportDIB::Handle surface_handle) OVERRIDE;
140 virtual void OnBuffersSwappedACK() OVERRIDE;
141 virtual void OnResize(gfx::Size size) OVERRIDE;
142
143 private:
144 virtual ~GLXShmImageTransportSurface();
145
146 // Tell the browser to release the surface.
147 void ReleaseSurface();
148
149 uint32 fbo_id_;
150 uint32 texture_;
151
152 gfx::Size size_;
153
154 scoped_ptr<TransportDIB> shared_mem_;
155 uint32 shared_id_;
156
157 scoped_ptr<ImageTransportHelper> helper_;
158
159 DISALLOW_COPY_AND_ASSIGN(GLXShmImageTransportSurface);
160 };
161
114 EGLImageTransportSurface::EGLImageTransportSurface( 162 EGLImageTransportSurface::EGLImageTransportSurface(
115 GpuChannelManager* manager, 163 GpuChannelManager* manager,
116 int32 render_view_id, 164 int32 render_view_id,
117 int32 renderer_id, 165 int32 renderer_id,
118 int32 command_buffer_id) 166 int32 command_buffer_id)
119 : gfx::PbufferGLSurfaceEGL(false, gfx::Size(1, 1)), 167 : gfx::PbufferGLSurfaceEGL(false, gfx::Size(1, 1)),
120 fbo_id_(0) { 168 fbo_id_(0) {
121 helper_.reset(new ImageTransportHelper(this, 169 helper_.reset(new ImageTransportHelper(this,
122 manager, 170 manager,
123 render_view_id, 171 render_view_id,
(...skipping 14 matching lines...) Expand all
138 void EGLImageTransportSurface::Destroy() { 186 void EGLImageTransportSurface::Destroy() {
139 if (back_surface_.get()) 187 if (back_surface_.get())
140 ReleaseSurface(&back_surface_); 188 ReleaseSurface(&back_surface_);
141 if (front_surface_.get()) 189 if (front_surface_.get())
142 ReleaseSurface(&front_surface_); 190 ReleaseSurface(&front_surface_);
143 191
144 helper_->Destroy(); 192 helper_->Destroy();
145 PbufferGLSurfaceEGL::Destroy(); 193 PbufferGLSurfaceEGL::Destroy();
146 } 194 }
147 195
196 // Make sure that buffer swaps occur for the surface, so we can send the data
197 // to the actual onscreen surface in the browser
148 bool EGLImageTransportSurface::IsOffscreen() { 198 bool EGLImageTransportSurface::IsOffscreen() {
149 return false; 199 return false;
150 } 200 }
151 201
152 void EGLImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) { 202 void EGLImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) {
153 if (fbo_id_) 203 if (fbo_id_)
154 return; 204 return;
155 205
156 glGenFramebuffersEXT(1, &fbo_id_); 206 glGenFramebuffersEXT(1, &fbo_id_);
157 glBindFramebufferEXT(GL_FRAMEBUFFER, fbo_id_); 207 glBindFramebufferEXT(GL_FRAMEBUFFER, fbo_id_);
(...skipping 24 matching lines...) Expand all
182 ReleaseSurface(&back_surface_); 232 ReleaseSurface(&back_surface_);
183 233
184 back_surface_ = new AcceleratedSurface(size); 234 back_surface_ = new AcceleratedSurface(size);
185 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, 235 glFramebufferTexture2DEXT(GL_FRAMEBUFFER,
186 GL_COLOR_ATTACHMENT0, 236 GL_COLOR_ATTACHMENT0,
187 GL_TEXTURE_2D, 237 GL_TEXTURE_2D,
188 back_surface_->texture(), 238 back_surface_->texture(),
189 0); 239 0);
190 glFlush(); 240 glFlush();
191 241
192 GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params params; 242 GpuHostMsg_AcceleratedSurfaceNew_Params params;
193 params.width = size.width(); 243 params.width = size.width();
194 params.height = size.height(); 244 params.height = size.height();
195 params.identifier = back_surface_->pixmap(); 245 params.identifier = back_surface_->pixmap();
196 helper_->SendAcceleratedSurfaceSetIOSurface(params); 246 helper_->SendAcceleratedSurfaceNew(params);
197 247
198 helper_->SetScheduled(false); 248 helper_->SetScheduled(false);
199 } 249 }
200 250
201 bool EGLImageTransportSurface::SwapBuffers() { 251 bool EGLImageTransportSurface::SwapBuffers() {
202 front_surface_.swap(back_surface_); 252 front_surface_.swap(back_surface_);
203 DCHECK_NE(front_surface_.get(), static_cast<AcceleratedSurface*>(NULL)); 253 DCHECK_NE(front_surface_.get(), static_cast<AcceleratedSurface*>(NULL));
204 glFlush(); 254 glFlush();
205 255
206 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; 256 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
(...skipping 11 matching lines...) Expand all
218 0); 268 0);
219 } 269 }
220 helper_->SetScheduled(false); 270 helper_->SetScheduled(false);
221 return true; 271 return true;
222 } 272 }
223 273
224 gfx::Size EGLImageTransportSurface::GetSize() { 274 gfx::Size EGLImageTransportSurface::GetSize() {
225 return back_surface_->size(); 275 return back_surface_->size();
226 } 276 }
227 277
228 void EGLImageTransportSurface::OnSetSurfaceACK( 278 void EGLImageTransportSurface::OnNewSurfaceACK(
229 uint64 surface_id) { 279 uint64 surface_id, TransportDIB::Handle /*surface_handle*/) {
230 DCHECK_EQ(back_surface_->pixmap(), surface_id); 280 DCHECK_EQ(back_surface_->pixmap(), surface_id);
231 helper_->SetScheduled(true); 281 helper_->SetScheduled(true);
232 } 282 }
233 283
234 void EGLImageTransportSurface::OnBuffersSwappedACK() { 284 void EGLImageTransportSurface::OnBuffersSwappedACK() {
235 helper_->SetScheduled(true); 285 helper_->SetScheduled(true);
236 } 286 }
237 287
238 GLXImageTransportSurface::GLXImageTransportSurface( 288 GLXImageTransportSurface::GLXImageTransportSurface(
239 GpuChannelManager* manager, 289 GpuChannelManager* manager,
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 size_ = size; 374 size_ = size;
325 if (bound_) { 375 if (bound_) {
326 ReleaseSurface(); 376 ReleaseSurface();
327 bound_ = false; 377 bound_ = false;
328 } 378 }
329 379
330 Display* dpy = gfx::GLSurfaceGLX::GetDisplay(); 380 Display* dpy = gfx::GLSurfaceGLX::GetDisplay();
331 XResizeWindow(dpy, window_, size_.width(), size_.height()); 381 XResizeWindow(dpy, window_, size_.width(), size_.height());
332 XFlush(dpy); 382 XFlush(dpy);
333 383
334 GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params params; 384 GpuHostMsg_AcceleratedSurfaceNew_Params params;
335 params.width = size_.width(); 385 params.width = size_.width();
336 params.height = size_.height(); 386 params.height = size_.height();
337 params.identifier = window_; 387 params.identifier = window_;
338 helper_->SendAcceleratedSurfaceSetIOSurface(params); 388 helper_->SendAcceleratedSurfaceNew(params);
339 389
340 helper_->SetScheduled(false); 390 helper_->SetScheduled(false);
341 } 391 }
342 392
343 bool GLXImageTransportSurface::SwapBuffers() { 393 bool GLXImageTransportSurface::SwapBuffers() {
344 gfx::NativeViewGLSurfaceGLX::SwapBuffers(); 394 gfx::NativeViewGLSurfaceGLX::SwapBuffers();
345 glFlush(); 395 glFlush();
346 396
347 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; 397 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
348 params.surface_id = window_; 398 params.surface_id = window_;
349 helper_->SendAcceleratedSurfaceBuffersSwapped(params); 399 helper_->SendAcceleratedSurfaceBuffersSwapped(params);
350 400
351 helper_->SetScheduled(false); 401 helper_->SetScheduled(false);
352 return true; 402 return true;
353 } 403 }
354 404
355 gfx::Size GLXImageTransportSurface::GetSize() { 405 gfx::Size GLXImageTransportSurface::GetSize() {
356 return size_; 406 return size_;
357 } 407 }
358 408
359 void GLXImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) { 409 void GLXImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) {
360 if (!swap_interval_set_) { 410 if (!swap_interval_set_) {
361 context->SetSwapInterval(0); 411 context->SetSwapInterval(0);
362 swap_interval_set_ = true; 412 swap_interval_set_ = true;
363 } 413 }
364 } 414 }
365 415
366 void GLXImageTransportSurface::OnSetSurfaceACK( 416 void GLXImageTransportSurface::OnNewSurfaceACK(
367 uint64 surface_id) { 417 uint64 surface_id, TransportDIB::Handle /*surface_handle*/) {
368 DCHECK(!bound_); 418 DCHECK(!bound_);
369 bound_ = true; 419 bound_ = true;
370 helper_->SetScheduled(true); 420 helper_->SetScheduled(true);
371 } 421 }
372 422
373 void GLXImageTransportSurface::OnBuffersSwappedACK() { 423 void GLXImageTransportSurface::OnBuffersSwappedACK() {
374 helper_->SetScheduled(true); 424 helper_->SetScheduled(true);
375 } 425 }
376 426
427 GLXShmImageTransportSurface::GLXShmImageTransportSurface(
428 GpuChannelManager* manager,
429 int32 render_view_id,
430 int32 renderer_id,
431 int32 command_buffer_id)
432 : gfx::PbufferGLSurfaceGLX(gfx::Size(1,1)),
433 size_(0, 0) {
434 helper_.reset(new ImageTransportHelper(this,
435 manager,
436 render_view_id,
437 renderer_id,
438 command_buffer_id));
439 }
440
441 GLXShmImageTransportSurface::~GLXShmImageTransportSurface() {
442 Destroy();
443 }
444
445 bool GLXShmImageTransportSurface::Initialize() {
446 if (!helper_->Initialize())
447 return false;
448 return gfx::PbufferGLSurfaceGLX::Initialize();
449 }
450
451 void GLXShmImageTransportSurface::Destroy() {
452 if (shared_mem_.get())
453 ReleaseSurface();
454
455 helper_->Destroy();
456 gfx::PbufferGLSurfaceGLX::Destroy();
457 }
458
459 // Make sure that buffer swaps occur for the surface, so we can send the data
460 // to the actual onscreen surface in the browser
461 bool GLXShmImageTransportSurface::IsOffscreen() {
462 return false;
463 }
464
465 void GLXShmImageTransportSurface::ReleaseSurface() {
466 GpuHostMsg_AcceleratedSurfaceRelease_Params params;
467 params.identifier = shared_id_;
468 helper_->SendAcceleratedSurfaceRelease(params);
469
470 shared_mem_.reset();
471 shared_id_ = 0;
472 }
473
474 void GLXShmImageTransportSurface::OnResize(gfx::Size size) {
475 LOG(ERROR) << "OnResize *********** " << size;
476 size_ = size;
477
478 if (shared_mem_.get())
479 ReleaseSurface();
480
481 // resize the texture
482 LOG(ERROR) << std::hex << "4 GLError: " << glGetError();
483 glBindTexture(GL_TEXTURE_2D, texture_);
484 LOG(ERROR) << std::hex << "5 GLError: " << glGetError();
485 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
486 size_.width(), size_.height(), 0,
487 GL_RGBA, GL_UNSIGNED_BYTE, NULL);
488 LOG(ERROR) << std::hex << "6 GLError: " << glGetError();
489 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo_id_);
490 LOG(ERROR) << std::hex << "6.1 GLError: " << glGetError();
491 glFramebufferTexture2DEXT(GL_FRAMEBUFFER,
492 GL_COLOR_ATTACHMENT0,
493 GL_TEXTURE_2D,
494 texture_,
495 0);
496 LOG(ERROR) << std::hex << "7 GLError: " << glGetError();
497 glBindTexture(GL_TEXTURE_2D, 0);
498 glFlush();
499 LOG(ERROR) << std::hex << "7.1 GLError: " << glGetError();
500
501 GpuHostMsg_AcceleratedSurfaceNew_Params params;
502 params.width = size_.width();
503 params.height = size_.height();
504 params.identifier = 0; // id comes from the browser with the shared mem
505 helper_->SendAcceleratedSurfaceNew(params);
506
507 helper_->SetScheduled(false);
508 }
509
510 void GLXShmImageTransportSurface::OnNewSurfaceACK(
511 uint64 surface_id, TransportDIB::Handle surface_handle) {
512 shared_id_ = surface_id;
513 shared_mem_.reset(TransportDIB::Map(surface_handle));
514 DCHECK_NE(shared_mem_.get(), static_cast<void*>(NULL));
515
516 helper_->SetScheduled(true);
517 }
518
519 bool GLXShmImageTransportSurface::SwapBuffers() {
520 DCHECK_NE(shared_mem_.get(), static_cast<void*>(NULL));
521
522 // grab the pixel data from the texture into the shared memory, and send
523 // it over to the browser
524 LOG(ERROR) << std::hex << "1 GLError: " << glGetError();
525 glBindTexture(GL_TEXTURE_2D, texture_);
526 LOG(ERROR) << std::hex << "2 GLError: " << glGetError();
527 LOG(ERROR) << "glReadPixels ***************";
528 glReadPixels(0, 0, size_.width(), size_.height(),
529 GL_RGBA, GL_UNSIGNED_BYTE, shared_mem_->memory());
530 LOG(ERROR) << std::hex << "3 GLError: " << glGetError();
531 glBindTexture(GL_TEXTURE_2D, 0);
532 glFlush();
533 LOG(ERROR) << std::hex << "3.1 GLError: " << glGetError();
534
535 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
536 params.surface_id = shared_id_;
537 helper_->SendAcceleratedSurfaceBuffersSwapped(params);
538
539 helper_->SetScheduled(false);
540 return true;
541 }
542
543 gfx::Size GLXShmImageTransportSurface::GetSize() {
544 return size_;
545 }
546
547 unsigned int GLXShmImageTransportSurface::GetBackingFrameBufferObject() {
548 return fbo_id_;
549 }
550
551 void GLXShmImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) {
552 if (fbo_id_)
553 return;
554
555 LOG(ERROR) << std::hex << "8 GLError: " << glGetError();
556 glGenTextures(1, &texture_);
557 glBindTexture(GL_TEXTURE_2D, texture_);
jonathan.backer 2011/09/20 15:16:29 I think you can get rid of a bit of code duplicati
558 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
559 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
560 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
561 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
562 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0,
563 GL_RGBA, GL_UNSIGNED_BYTE, NULL);
564 glBindTexture(GL_TEXTURE_2D, 0);
565 LOG(ERROR) << std::hex << "9 GLError: " << glGetError();
566
567 glGenFramebuffersEXT(1, &fbo_id_);
568 LOG(ERROR) << std::hex << "10 GLError: " << glGetError();
569 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo_id_);
570 LOG(ERROR) << std::hex << "11 GLError: " << glGetError();
571
572 GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER);
573 if (status != GL_FRAMEBUFFER_COMPLETE) {
574 LOG(ERROR) << "Framebuffer incomplete";
575 }
576 LOG(ERROR) << std::hex << "12 GLError: " << glGetError();
577 }
578
579 void GLXShmImageTransportSurface::OnBuffersSwappedACK() {
580 helper_->SetScheduled(true);
581 }
582
377 } // namespace 583 } // namespace
378 584
379 // static 585 // static
380 scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateSurface( 586 scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateSurface(
381 GpuChannelManager* manager, 587 GpuChannelManager* manager,
382 int32 render_view_id, 588 int32 render_view_id,
383 int32 renderer_id, 589 int32 renderer_id,
384 int32 command_buffer_id) { 590 int32 command_buffer_id) {
385 scoped_refptr<gfx::GLSurface> surface; 591 scoped_refptr<gfx::GLSurface> surface;
386 switch (gfx::GetGLImplementation()) { 592 switch (gfx::GetGLImplementation()) {
387 case gfx::kGLImplementationDesktopGL: 593 case gfx::kGLImplementationDesktopGL:
388 surface = new GLXImageTransportSurface(manager, 594 surface = new GLXShmImageTransportSurface(manager,
389 render_view_id, 595 render_view_id,
390 renderer_id, 596 renderer_id,
391 command_buffer_id); 597 command_buffer_id);
392 break; 598 break;
393 case gfx::kGLImplementationEGLGLES2: 599 case gfx::kGLImplementationEGLGLES2:
394 surface = new EGLImageTransportSurface(manager, 600 surface = new EGLImageTransportSurface(manager,
395 render_view_id, 601 render_view_id,
396 renderer_id, 602 renderer_id,
397 command_buffer_id); 603 command_buffer_id);
398 break; 604 break;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 640
435 return true; 641 return true;
436 } 642 }
437 643
438 void ImageTransportHelper::Destroy() { 644 void ImageTransportHelper::Destroy() {
439 } 645 }
440 646
441 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { 647 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) {
442 bool handled = true; 648 bool handled = true;
443 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) 649 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message)
444 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_SetSurfaceACK, 650 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK,
445 OnSetSurfaceACK) 651 OnNewSurfaceACK)
446 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK, 652 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK,
447 OnBuffersSwappedACK) 653 OnBuffersSwappedACK)
448 IPC_MESSAGE_UNHANDLED(handled = false) 654 IPC_MESSAGE_UNHANDLED(handled = false)
449 IPC_END_MESSAGE_MAP() 655 IPC_END_MESSAGE_MAP()
450 return handled; 656 return handled;
451 } 657 }
452 658
453 void ImageTransportHelper::SendAcceleratedSurfaceRelease( 659 void ImageTransportHelper::SendAcceleratedSurfaceRelease(
454 GpuHostMsg_AcceleratedSurfaceRelease_Params params) { 660 GpuHostMsg_AcceleratedSurfaceRelease_Params params) {
455 params.renderer_id = renderer_id_; 661 params.renderer_id = renderer_id_;
456 params.render_view_id = render_view_id_; 662 params.render_view_id = render_view_id_;
457 params.route_id = route_id_; 663 params.route_id = route_id_;
458 manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params)); 664 manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params));
459 } 665 }
460 666
461 void ImageTransportHelper::SendAcceleratedSurfaceSetIOSurface( 667 void ImageTransportHelper::SendAcceleratedSurfaceNew(
462 GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params params) { 668 GpuHostMsg_AcceleratedSurfaceNew_Params params) {
463 params.renderer_id = renderer_id_; 669 params.renderer_id = renderer_id_;
464 params.render_view_id = render_view_id_; 670 params.render_view_id = render_view_id_;
465 params.route_id = route_id_; 671 params.route_id = route_id_;
466 manager_->Send(new GpuHostMsg_AcceleratedSurfaceSetIOSurface(params)); 672 manager_->Send(new GpuHostMsg_AcceleratedSurfaceNew(params));
467 } 673 }
468 674
469 void ImageTransportHelper::SendAcceleratedSurfaceBuffersSwapped( 675 void ImageTransportHelper::SendAcceleratedSurfaceBuffersSwapped(
470 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) { 676 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) {
471 params.renderer_id = renderer_id_; 677 params.renderer_id = renderer_id_;
472 params.render_view_id = render_view_id_; 678 params.render_view_id = render_view_id_;
473 params.route_id = route_id_; 679 params.route_id = route_id_;
474 manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); 680 manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params));
475 } 681 }
476 682
477 void ImageTransportHelper::SetScheduled(bool is_scheduled) { 683 void ImageTransportHelper::SetScheduled(bool is_scheduled) {
478 gpu::GpuScheduler* scheduler = Scheduler(); 684 gpu::GpuScheduler* scheduler = Scheduler();
479 if (!scheduler) 685 if (!scheduler)
480 return; 686 return;
481 687
482 scheduler->SetScheduled(is_scheduled); 688 scheduler->SetScheduled(is_scheduled);
483 } 689 }
484 690
485 void ImageTransportHelper::OnSetSurfaceACK(uint64 surface_id) { 691 void ImageTransportHelper::OnNewSurfaceACK(
486 surface_->OnSetSurfaceACK(surface_id); 692 uint64 surface_id, TransportDIB::Handle surface_handle) {
693 surface_->OnNewSurfaceACK(surface_id, surface_handle);
487 } 694 }
488 695
489 void ImageTransportHelper::OnBuffersSwappedACK() { 696 void ImageTransportHelper::OnBuffersSwappedACK() {
490 surface_->OnBuffersSwappedACK(); 697 surface_->OnBuffersSwappedACK();
491 } 698 }
492 699
493 void ImageTransportHelper::Resize(gfx::Size size) { 700 void ImageTransportHelper::Resize(gfx::Size size) {
494 surface_->OnResize(size); 701 surface_->OnResize(size);
495 } 702 }
496 703
(...skipping 17 matching lines...) Expand all
514 721
515 GpuCommandBufferStub* stub = 722 GpuCommandBufferStub* stub =
516 channel->LookupCommandBuffer(command_buffer_id_); 723 channel->LookupCommandBuffer(command_buffer_id_);
517 if (!stub) 724 if (!stub)
518 return NULL; 725 return NULL;
519 726
520 return stub->decoder(); 727 return stub->decoder();
521 } 728 }
522 729
523 #endif // defined(USE_GPU) 730 #endif // defined(USE_GPU)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698