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 #include "content/renderer/gpu/renderer_gl_context.h" | 5 #include "content/renderer/gpu/renderer_gl_context.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 20 matching lines...) Expand all Loading... |
31 #endif // ENABLE_GPU | 31 #endif // ENABLE_GPU |
32 | 32 |
33 namespace { | 33 namespace { |
34 | 34 |
35 const int32 kCommandBufferSize = 1024 * 1024; | 35 const int32 kCommandBufferSize = 1024 * 1024; |
36 // TODO(kbr): make the transfer buffer size configurable via context | 36 // TODO(kbr): make the transfer buffer size configurable via context |
37 // creation attributes. | 37 // creation attributes. |
38 const int32 kTransferBufferSize = 1024 * 1024; | 38 const int32 kTransferBufferSize = 1024 * 1024; |
39 | 39 |
40 const uint32 kMaxLatchesPerRenderer = 2048; | 40 const uint32 kMaxLatchesPerRenderer = 2048; |
41 const uint32 kInvalidLatchId = 0xffffffffu; | |
42 | 41 |
43 // Singleton used to initialize and terminate the gles2 library. | 42 // Singleton used to initialize and terminate the gles2 library. |
44 class GLES2Initializer { | 43 class GLES2Initializer { |
45 public: | 44 public: |
46 GLES2Initializer() { | 45 GLES2Initializer() { |
47 gles2::Initialize(); | 46 gles2::Initialize(); |
48 } | 47 } |
49 | 48 |
50 ~GLES2Initializer() { | 49 ~GLES2Initializer() { |
51 gles2::Terminate(); | 50 gles2::Terminate(); |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 } | 373 } |
375 | 374 |
376 gpu::gles2::GLES2Implementation* RendererGLContext::GetImplementation() { | 375 gpu::gles2::GLES2Implementation* RendererGLContext::GetImplementation() { |
377 return gles2_implementation_; | 376 return gles2_implementation_; |
378 } | 377 } |
379 | 378 |
380 RendererGLContext::RendererGLContext(GpuChannelHost* channel) | 379 RendererGLContext::RendererGLContext(GpuChannelHost* channel) |
381 : channel_(channel), | 380 : channel_(channel), |
382 parent_(base::WeakPtr<RendererGLContext>()), | 381 parent_(base::WeakPtr<RendererGLContext>()), |
383 parent_texture_id_(0), | 382 parent_texture_id_(0), |
384 child_to_parent_latch_(kInvalidLatchId), | 383 child_to_parent_latch_(gpu::kInvalidLatchId), |
385 parent_to_child_latch_(kInvalidLatchId), | 384 parent_to_child_latch_(gpu::kInvalidLatchId), |
386 latch_transfer_buffer_id_(-1), | 385 latch_transfer_buffer_id_(-1), |
387 command_buffer_(NULL), | 386 command_buffer_(NULL), |
388 gles2_helper_(NULL), | 387 gles2_helper_(NULL), |
389 transfer_buffer_id_(-1), | 388 transfer_buffer_id_(-1), |
390 gles2_implementation_(NULL), | 389 gles2_implementation_(NULL), |
391 last_error_(SUCCESS), | 390 last_error_(SUCCESS), |
392 frame_number_(0) { | 391 frame_number_(0) { |
393 DCHECK(channel); | 392 DCHECK(channel); |
394 } | 393 } |
395 | 394 |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 return true; | 531 return true; |
533 } | 532 } |
534 | 533 |
535 void RendererGLContext::Destroy() { | 534 void RendererGLContext::Destroy() { |
536 TRACE_EVENT0("gpu", "RendererGLContext::Destroy"); | 535 TRACE_EVENT0("gpu", "RendererGLContext::Destroy"); |
537 SetParent(NULL); | 536 SetParent(NULL); |
538 | 537 |
539 delete gles2_implementation_; | 538 delete gles2_implementation_; |
540 gles2_implementation_ = NULL; | 539 gles2_implementation_ = NULL; |
541 | 540 |
542 if (child_to_parent_latch_ != kInvalidLatchId) { | 541 // Do not destroy these transfer buffers here, because commands are still |
543 DestroyLatch(child_to_parent_latch_); | 542 // in flight on the GPU process that may access them. When the command buffer |
544 child_to_parent_latch_ = kInvalidLatchId; | 543 // is destroyed, the associated shared memory will be cleaned up. |
545 } | 544 latch_transfer_buffer_id_ = -1; |
546 if (parent_to_child_latch_ != kInvalidLatchId) { | 545 transfer_buffer_id_ = -1; |
547 DestroyLatch(parent_to_child_latch_); | |
548 parent_to_child_latch_ = kInvalidLatchId; | |
549 } | |
550 if (command_buffer_ && latch_transfer_buffer_id_ != -1) { | |
551 command_buffer_->DestroyTransferBuffer(latch_transfer_buffer_id_); | |
552 latch_transfer_buffer_id_ = -1; | |
553 } | |
554 | |
555 if (command_buffer_ && transfer_buffer_id_ != -1) { | |
556 command_buffer_->DestroyTransferBuffer(transfer_buffer_id_); | |
557 transfer_buffer_id_ = -1; | |
558 } | |
559 | 546 |
560 delete gles2_helper_; | 547 delete gles2_helper_; |
561 gles2_helper_ = NULL; | 548 gles2_helper_ = NULL; |
562 | 549 |
563 if (channel_ && command_buffer_) { | 550 if (channel_ && command_buffer_) { |
564 channel_->DestroyCommandBuffer(command_buffer_); | 551 channel_->DestroyCommandBuffer(command_buffer_); |
565 command_buffer_ = NULL; | 552 command_buffer_ = NULL; |
566 } | 553 } |
567 | 554 |
568 channel_ = NULL; | 555 channel_ = NULL; |
| 556 |
| 557 // Destroy latches here, after the command buffer is destroyed so that no |
| 558 // commands are still in flight that may access the latch memory. |
| 559 if (child_to_parent_latch_ != gpu::kInvalidLatchId) { |
| 560 DestroyLatch(child_to_parent_latch_); |
| 561 child_to_parent_latch_ = gpu::kInvalidLatchId; |
| 562 } |
| 563 if (parent_to_child_latch_ != gpu::kInvalidLatchId) { |
| 564 DestroyLatch(parent_to_child_latch_); |
| 565 parent_to_child_latch_ = gpu::kInvalidLatchId; |
| 566 } |
569 } | 567 } |
570 | 568 |
571 void RendererGLContext::OnSwapBuffers() { | 569 void RendererGLContext::OnSwapBuffers() { |
572 if (swap_buffers_callback_.get()) | 570 if (swap_buffers_callback_.get()) |
573 swap_buffers_callback_->Run(); | 571 swap_buffers_callback_->Run(); |
574 } | 572 } |
575 | 573 |
576 void RendererGLContext::OnContextLost() { | 574 void RendererGLContext::OnContextLost() { |
577 if (context_lost_callback_.get()) | 575 if (context_lost_callback_.get()) |
578 context_lost_callback_->Run(); | 576 context_lost_callback_->Run(); |
579 } | 577 } |
580 | 578 |
581 bool RendererGLContext::CreateLatch(uint32* ret_latch) { | 579 bool RendererGLContext::CreateLatch(uint32* ret_latch) { |
582 return LatchAllocator::GetInstance()->AllocateLatch(ret_latch); | 580 return LatchAllocator::GetInstance()->AllocateLatch(ret_latch); |
583 } | 581 } |
584 | 582 |
585 bool RendererGLContext::DestroyLatch(uint32 latch) { | 583 bool RendererGLContext::DestroyLatch(uint32 latch) { |
586 return LatchAllocator::GetInstance()->FreeLatch(latch); | 584 return LatchAllocator::GetInstance()->FreeLatch(latch); |
587 } | 585 } |
588 | 586 |
589 bool RendererGLContext::GetParentToChildLatch(uint32* parent_to_child_latch) { | 587 bool RendererGLContext::GetParentToChildLatch(uint32* parent_to_child_latch) { |
590 *parent_to_child_latch = parent_to_child_latch_; | 588 *parent_to_child_latch = parent_to_child_latch_; |
591 return true; | 589 return true; |
592 } | 590 } |
593 | 591 |
594 bool RendererGLContext::GetChildToParentLatch(uint32* child_to_parent_latch) { | 592 bool RendererGLContext::GetChildToParentLatch(uint32* child_to_parent_latch) { |
595 *child_to_parent_latch = child_to_parent_latch_; | 593 *child_to_parent_latch = child_to_parent_latch_; |
596 return true; | 594 return true; |
597 } | 595 } |
OLD | NEW |