OLD | NEW |
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.h" | 7 #include "content/common/gpu/image_transport_surface.h" |
8 | 8 |
9 #include "base/mac/scoped_cftyperef.h" | 9 #include "base/mac/scoped_cftyperef.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; | 227 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; |
228 params.surface_id = io_surface_id_; | 228 params.surface_id = io_surface_id_; |
229 helper_->SendAcceleratedSurfaceBuffersSwapped(params); | 229 helper_->SendAcceleratedSurfaceBuffersSwapped(params); |
230 | 230 |
231 helper_->SetScheduled(false); | 231 helper_->SetScheduled(false); |
232 return true; | 232 return true; |
233 } | 233 } |
234 | 234 |
235 bool IOSurfaceImageTransportSurface::PostSubBuffer( | 235 bool IOSurfaceImageTransportSurface::PostSubBuffer( |
236 int x, int y, int width, int height) { | 236 int x, int y, int width, int height) { |
237 NOTREACHED(); | 237 glFlush(); |
238 return false; | 238 |
| 239 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params; |
| 240 params.surface_id = io_surface_id_; |
| 241 params.x = x; |
| 242 params.y = y; |
| 243 params.width = width; |
| 244 params.height = height; |
| 245 helper_->SendAcceleratedSurfacePostSubBuffer(params); |
| 246 |
| 247 helper_->SetScheduled(false); |
| 248 return true; |
239 } | 249 } |
240 | 250 |
241 std::string IOSurfaceImageTransportSurface::GetExtensions() { | 251 std::string IOSurfaceImageTransportSurface::GetExtensions() { |
242 std::string extensions = gfx::GLSurface::GetExtensions(); | 252 std::string extensions = gfx::GLSurface::GetExtensions(); |
243 extensions += extensions.empty() ? "" : " "; | 253 extensions += extensions.empty() ? "" : " "; |
244 extensions += "GL_CHROMIUM_front_buffer_cached"; | 254 extensions += "GL_CHROMIUM_front_buffer_cached "; |
| 255 extensions += "GL_CHROMIUM_post_sub_buffer"; |
245 return extensions; | 256 return extensions; |
246 } | 257 } |
247 | 258 |
248 gfx::Size IOSurfaceImageTransportSurface::GetSize() { | 259 gfx::Size IOSurfaceImageTransportSurface::GetSize() { |
249 return size_; | 260 return size_; |
250 } | 261 } |
251 | 262 |
252 void IOSurfaceImageTransportSurface::OnBuffersSwappedACK() { | 263 void IOSurfaceImageTransportSurface::OnBuffersSwappedACK() { |
253 helper_->SetScheduled(true); | 264 helper_->SetScheduled(true); |
254 } | 265 } |
255 | 266 |
256 void IOSurfaceImageTransportSurface::OnPostSubBufferACK() { | 267 void IOSurfaceImageTransportSurface::OnPostSubBufferACK() { |
257 NOTREACHED(); | 268 helper_->SetScheduled(true); |
258 } | 269 } |
259 | 270 |
260 void IOSurfaceImageTransportSurface::OnNewSurfaceACK( | 271 void IOSurfaceImageTransportSurface::OnNewSurfaceACK( |
261 uint64 surface_id, | 272 uint64 surface_id, |
262 TransportDIB::Handle /* shm_handle */) { | 273 TransportDIB::Handle /* shm_handle */) { |
263 DCHECK_EQ(io_surface_id_, surface_id); | 274 DCHECK_EQ(io_surface_id_, surface_id); |
264 helper_->SetScheduled(true); | 275 helper_->SetScheduled(true); |
265 } | 276 } |
266 | 277 |
267 void IOSurfaceImageTransportSurface::OnResizeViewACK() { | 278 void IOSurfaceImageTransportSurface::OnResizeViewACK() { |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; | 461 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; |
451 params.surface_id = next_id_; | 462 params.surface_id = next_id_; |
452 helper_->SendAcceleratedSurfaceBuffersSwapped(params); | 463 helper_->SendAcceleratedSurfaceBuffersSwapped(params); |
453 | 464 |
454 helper_->SetScheduled(false); | 465 helper_->SetScheduled(false); |
455 return true; | 466 return true; |
456 } | 467 } |
457 | 468 |
458 bool TransportDIBImageTransportSurface::PostSubBuffer( | 469 bool TransportDIBImageTransportSurface::PostSubBuffer( |
459 int x, int y, int width, int height) { | 470 int x, int y, int width, int height) { |
460 NOTREACHED(); | 471 DCHECK_NE(shared_mem_.get(), static_cast<void*>(NULL)); |
461 return false; | 472 |
| 473 GLint previous_fbo_id = 0; |
| 474 glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &previous_fbo_id); |
| 475 |
| 476 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo_id_); |
| 477 |
| 478 GLint current_alignment = 0, current_pack_row_length = 0; |
| 479 glGetIntegerv(GL_PACK_ALIGNMENT, ¤t_alignment); |
| 480 glGetIntegerv(GL_PACK_ROW_LENGTH, ¤t_pack_row_length); |
| 481 |
| 482 glPixelStorei(GL_PACK_ALIGNMENT, 4); |
| 483 glPixelStorei(GL_PACK_ROW_LENGTH, size_.width()); |
| 484 |
| 485 unsigned char* buffer = |
| 486 static_cast<unsigned char*>(shared_mem_->memory()); |
| 487 glReadPixels(x, y, |
| 488 width, height, |
| 489 GL_BGRA, // This pixel format should have no conversion. |
| 490 GL_UNSIGNED_INT_8_8_8_8_REV, |
| 491 &buffer[(x + y * size_.width()) * 4]); |
| 492 |
| 493 glPixelStorei(GL_PACK_ALIGNMENT, current_alignment); |
| 494 glPixelStorei(GL_PACK_ROW_LENGTH, current_pack_row_length); |
| 495 |
| 496 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, previous_fbo_id); |
| 497 |
| 498 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params; |
| 499 params.surface_id = next_id_; |
| 500 params.x = x; |
| 501 params.y = y; |
| 502 params.width = width; |
| 503 params.height = height; |
| 504 helper_->SendAcceleratedSurfacePostSubBuffer(params); |
| 505 |
| 506 helper_->SetScheduled(false); |
| 507 return true; |
462 } | 508 } |
463 | 509 |
464 std::string TransportDIBImageTransportSurface::GetExtensions() { | 510 std::string TransportDIBImageTransportSurface::GetExtensions() { |
465 std::string extensions = gfx::GLSurface::GetExtensions(); | 511 std::string extensions = gfx::GLSurface::GetExtensions(); |
466 extensions += extensions.empty() ? "" : " "; | 512 extensions += extensions.empty() ? "" : " "; |
467 extensions += "GL_CHROMIUM_front_buffer_cached"; | 513 extensions += "GL_CHROMIUM_front_buffer_cached "; |
| 514 extensions += "GL_CHROMIUM_post_sub_buffer"; |
468 return extensions; | 515 return extensions; |
469 } | 516 } |
470 | 517 |
471 gfx::Size TransportDIBImageTransportSurface::GetSize() { | 518 gfx::Size TransportDIBImageTransportSurface::GetSize() { |
472 return size_; | 519 return size_; |
473 } | 520 } |
474 | 521 |
475 void TransportDIBImageTransportSurface::OnBuffersSwappedACK() { | 522 void TransportDIBImageTransportSurface::OnBuffersSwappedACK() { |
476 helper_->SetScheduled(true); | 523 helper_->SetScheduled(true); |
477 } | 524 } |
478 | 525 |
479 void TransportDIBImageTransportSurface::OnPostSubBufferACK() { | 526 void TransportDIBImageTransportSurface::OnPostSubBufferACK() { |
480 NOTREACHED(); | 527 helper_->SetScheduled(true); |
481 } | 528 } |
482 | 529 |
483 void TransportDIBImageTransportSurface::OnNewSurfaceACK( | 530 void TransportDIBImageTransportSurface::OnNewSurfaceACK( |
484 uint64 surface_id, | 531 uint64 surface_id, |
485 TransportDIB::Handle shm_handle) { | 532 TransportDIB::Handle shm_handle) { |
486 helper_->SetScheduled(true); | 533 helper_->SetScheduled(true); |
487 | 534 |
488 shared_mem_.reset(TransportDIB::Map(shm_handle)); | 535 shared_mem_.reset(TransportDIB::Map(shm_handle)); |
489 DCHECK_NE(shared_mem_.get(), static_cast<void*>(NULL)); | 536 DCHECK_NE(shared_mem_.get(), static_cast<void*>(NULL)); |
490 } | 537 } |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 NOTREACHED(); | 608 NOTREACHED(); |
562 return NULL; | 609 return NULL; |
563 } | 610 } |
564 if (surface->Initialize()) | 611 if (surface->Initialize()) |
565 return surface; | 612 return surface; |
566 else | 613 else |
567 return NULL; | 614 return NULL; |
568 } | 615 } |
569 | 616 |
570 #endif // defined(USE_GPU) | 617 #endif // defined(USE_GPU) |
OLD | NEW |