| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "cc/raster/one_copy_tile_task_worker_pool.h" | 5 #include "cc/raster/one_copy_tile_task_worker_pool.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| 11 #include "base/thread_task_runner_handle.h" | 11 #include "base/thread_task_runner_handle.h" |
| 12 #include "base/trace_event/memory_dump_manager.h" | 12 #include "base/trace_event/memory_dump_manager.h" |
| 13 #include "base/trace_event/trace_event.h" | 13 #include "base/trace_event/trace_event.h" |
| 14 #include "base/trace_event/trace_event_argument.h" | 14 #include "base/trace_event/trace_event_argument.h" |
| 15 #include "cc/base/container_util.h" |
| 15 #include "cc/base/math_util.h" | 16 #include "cc/base/math_util.h" |
| 16 #include "cc/debug/traced_value.h" | 17 #include "cc/debug/traced_value.h" |
| 17 #include "cc/raster/raster_buffer.h" | 18 #include "cc/raster/raster_buffer.h" |
| 18 #include "cc/resources/platform_color.h" | 19 #include "cc/resources/platform_color.h" |
| 19 #include "cc/resources/resource_format.h" | 20 #include "cc/resources/resource_format.h" |
| 20 #include "cc/resources/resource_util.h" | 21 #include "cc/resources/resource_util.h" |
| 21 #include "cc/resources/scoped_resource.h" | 22 #include "cc/resources/scoped_resource.h" |
| 22 #include "gpu/GLES2/gl2extchromium.h" | 23 #include "gpu/GLES2/gl2extchromium.h" |
| 23 #include "gpu/command_buffer/client/gles2_interface.h" | 24 #include "gpu/command_buffer/client/gles2_interface.h" |
| 24 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" | 25 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" |
| (...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 | 607 |
| 607 gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL(); | 608 gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL(); |
| 608 DCHECK(gl); | 609 DCHECK(gl); |
| 609 | 610 |
| 610 // Check if any busy buffers have become available. | 611 // Check if any busy buffers have become available. |
| 611 if (resource_provider_->use_sync_query()) { | 612 if (resource_provider_->use_sync_query()) { |
| 612 while (!busy_buffers_.empty()) { | 613 while (!busy_buffers_.empty()) { |
| 613 if (!CheckForQueryResult(gl, busy_buffers_.front()->query_id)) | 614 if (!CheckForQueryResult(gl, busy_buffers_.front()->query_id)) |
| 614 break; | 615 break; |
| 615 | 616 |
| 616 MarkStagingBufferAsFree(busy_buffers_.front()); | 617 MarkStagingBufferAsFree(busy_buffers_.front().get()); |
| 617 free_buffers_.push_back(busy_buffers_.take_front()); | 618 free_buffers_.push_back(PopFront(&busy_buffers_)); |
| 618 } | 619 } |
| 619 } | 620 } |
| 620 | 621 |
| 621 // Wait for memory usage of non-free buffers to become less than the limit. | 622 // Wait for memory usage of non-free buffers to become less than the limit. |
| 622 while ( | 623 while ( |
| 623 (staging_buffer_usage_in_bytes_ - free_staging_buffer_usage_in_bytes_) >= | 624 (staging_buffer_usage_in_bytes_ - free_staging_buffer_usage_in_bytes_) >= |
| 624 max_staging_buffer_usage_in_bytes_) { | 625 max_staging_buffer_usage_in_bytes_) { |
| 625 // Stop when there are no more busy buffers to wait for. | 626 // Stop when there are no more busy buffers to wait for. |
| 626 if (busy_buffers_.empty()) | 627 if (busy_buffers_.empty()) |
| 627 break; | 628 break; |
| 628 | 629 |
| 629 if (resource_provider_->use_sync_query()) { | 630 if (resource_provider_->use_sync_query()) { |
| 630 WaitForQueryResult(gl, busy_buffers_.front()->query_id); | 631 WaitForQueryResult(gl, busy_buffers_.front()->query_id); |
| 631 MarkStagingBufferAsFree(busy_buffers_.front()); | 632 MarkStagingBufferAsFree(busy_buffers_.front().get()); |
| 632 free_buffers_.push_back(busy_buffers_.take_front()); | 633 free_buffers_.push_back(PopFront(&busy_buffers_)); |
| 633 } else { | 634 } else { |
| 634 // Fall-back to glFinish if CHROMIUM_sync_query is not available. | 635 // Fall-back to glFinish if CHROMIUM_sync_query is not available. |
| 635 gl->Finish(); | 636 gl->Finish(); |
| 636 while (!busy_buffers_.empty()) { | 637 while (!busy_buffers_.empty()) { |
| 637 MarkStagingBufferAsFree(busy_buffers_.front()); | 638 MarkStagingBufferAsFree(busy_buffers_.front().get()); |
| 638 free_buffers_.push_back(busy_buffers_.take_front()); | 639 free_buffers_.push_back(PopFront(&busy_buffers_)); |
| 639 } | 640 } |
| 640 } | 641 } |
| 641 } | 642 } |
| 642 | 643 |
| 643 // Find a staging buffer that allows us to perform partial raster when | 644 // Find a staging buffer that allows us to perform partial raster when |
| 644 // using persistent GpuMemoryBuffers. | 645 // using persistent GpuMemoryBuffers. |
| 645 if (use_partial_raster_ && previous_content_id) { | 646 if (use_partial_raster_ && previous_content_id) { |
| 646 StagingBufferDeque::iterator it = | 647 StagingBufferDeque::iterator it = std::find_if( |
| 647 std::find_if(free_buffers_.begin(), free_buffers_.end(), | 648 free_buffers_.begin(), free_buffers_.end(), |
| 648 [previous_content_id](const StagingBuffer* buffer) { | 649 [previous_content_id](const scoped_ptr<StagingBuffer>& buffer) { |
| 649 return buffer->content_id == previous_content_id; | 650 return buffer->content_id == previous_content_id; |
| 650 }); | 651 }); |
| 651 if (it != free_buffers_.end()) { | 652 if (it != free_buffers_.end()) { |
| 652 staging_buffer = free_buffers_.take(it); | 653 staging_buffer = it->Pass(); |
| 654 free_buffers_.erase(it); |
| 653 MarkStagingBufferAsBusy(staging_buffer.get()); | 655 MarkStagingBufferAsBusy(staging_buffer.get()); |
| 654 } | 656 } |
| 655 } | 657 } |
| 656 | 658 |
| 657 // Find staging buffer of correct size and format. | 659 // Find staging buffer of correct size and format. |
| 658 if (!staging_buffer) { | 660 if (!staging_buffer) { |
| 659 StagingBufferDeque::iterator it = | 661 StagingBufferDeque::iterator it = |
| 660 std::find_if(free_buffers_.begin(), free_buffers_.end(), | 662 std::find_if(free_buffers_.begin(), free_buffers_.end(), |
| 661 [resource](const StagingBuffer* buffer) { | 663 [resource](const scoped_ptr<StagingBuffer>& buffer) { |
| 662 return buffer->size == resource->size() && | 664 return buffer->size == resource->size() && |
| 663 buffer->format == resource->format(); | 665 buffer->format == resource->format(); |
| 664 }); | 666 }); |
| 665 if (it != free_buffers_.end()) { | 667 if (it != free_buffers_.end()) { |
| 666 staging_buffer = free_buffers_.take(it); | 668 staging_buffer = it->Pass(); |
| 669 free_buffers_.erase(it); |
| 667 MarkStagingBufferAsBusy(staging_buffer.get()); | 670 MarkStagingBufferAsBusy(staging_buffer.get()); |
| 668 } | 671 } |
| 669 } | 672 } |
| 670 | 673 |
| 671 // Create new staging buffer if necessary. | 674 // Create new staging buffer if necessary. |
| 672 if (!staging_buffer) { | 675 if (!staging_buffer) { |
| 673 staging_buffer = make_scoped_ptr( | 676 staging_buffer = make_scoped_ptr( |
| 674 new StagingBuffer(resource->size(), resource->format())); | 677 new StagingBuffer(resource->size(), resource->format())); |
| 675 AddStagingBuffer(staging_buffer.get(), resource->format()); | 678 AddStagingBuffer(staging_buffer.get(), resource->format()); |
| 676 } | 679 } |
| 677 | 680 |
| 678 // Release enough free buffers to stay within the limit. | 681 // Release enough free buffers to stay within the limit. |
| 679 while (staging_buffer_usage_in_bytes_ > max_staging_buffer_usage_in_bytes_) { | 682 while (staging_buffer_usage_in_bytes_ > max_staging_buffer_usage_in_bytes_) { |
| 680 if (free_buffers_.empty()) | 683 if (free_buffers_.empty()) |
| 681 break; | 684 break; |
| 682 | 685 |
| 683 free_buffers_.front()->DestroyGLResources(gl); | 686 free_buffers_.front()->DestroyGLResources(gl); |
| 684 MarkStagingBufferAsBusy(free_buffers_.front()); | 687 MarkStagingBufferAsBusy(free_buffers_.front().get()); |
| 685 RemoveStagingBuffer(free_buffers_.front()); | 688 RemoveStagingBuffer(free_buffers_.front().get()); |
| 686 free_buffers_.take_front(); | 689 free_buffers_.pop_front(); |
| 687 } | 690 } |
| 688 | 691 |
| 689 return staging_buffer.Pass(); | 692 return staging_buffer.Pass(); |
| 690 } | 693 } |
| 691 | 694 |
| 692 base::TimeTicks OneCopyTileTaskWorkerPool::GetUsageTimeForLRUBuffer() { | 695 base::TimeTicks OneCopyTileTaskWorkerPool::GetUsageTimeForLRUBuffer() { |
| 693 lock_.AssertAcquired(); | 696 lock_.AssertAcquired(); |
| 694 | 697 |
| 695 if (!free_buffers_.empty()) | 698 if (!free_buffers_.empty()) |
| 696 return free_buffers_.front()->last_usage; | 699 return free_buffers_.front()->last_usage; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 756 gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL(); | 759 gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL(); |
| 757 DCHECK(gl); | 760 DCHECK(gl); |
| 758 | 761 |
| 759 // Note: Front buffer is guaranteed to be LRU so we can stop releasing | 762 // Note: Front buffer is guaranteed to be LRU so we can stop releasing |
| 760 // buffers as soon as we find a buffer that has been used since |time|. | 763 // buffers as soon as we find a buffer that has been used since |time|. |
| 761 while (!free_buffers_.empty()) { | 764 while (!free_buffers_.empty()) { |
| 762 if (free_buffers_.front()->last_usage > time) | 765 if (free_buffers_.front()->last_usage > time) |
| 763 return; | 766 return; |
| 764 | 767 |
| 765 free_buffers_.front()->DestroyGLResources(gl); | 768 free_buffers_.front()->DestroyGLResources(gl); |
| 766 MarkStagingBufferAsBusy(free_buffers_.front()); | 769 MarkStagingBufferAsBusy(free_buffers_.front().get()); |
| 767 RemoveStagingBuffer(free_buffers_.front()); | 770 RemoveStagingBuffer(free_buffers_.front().get()); |
| 768 free_buffers_.take_front(); | 771 free_buffers_.pop_front(); |
| 769 } | 772 } |
| 770 | 773 |
| 771 while (!busy_buffers_.empty()) { | 774 while (!busy_buffers_.empty()) { |
| 772 if (busy_buffers_.front()->last_usage > time) | 775 if (busy_buffers_.front()->last_usage > time) |
| 773 return; | 776 return; |
| 774 | 777 |
| 775 busy_buffers_.front()->DestroyGLResources(gl); | 778 busy_buffers_.front()->DestroyGLResources(gl); |
| 776 RemoveStagingBuffer(busy_buffers_.front()); | 779 RemoveStagingBuffer(busy_buffers_.front().get()); |
| 777 busy_buffers_.take_front(); | 780 busy_buffers_.pop_front(); |
| 778 } | 781 } |
| 779 } | 782 } |
| 780 } | 783 } |
| 781 | 784 |
| 782 void OneCopyTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) { | 785 void OneCopyTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) { |
| 783 TRACE_EVENT1("cc", "OneCopyTileTaskWorkerPool::OnTaskSetFinished", "task_set", | 786 TRACE_EVENT1("cc", "OneCopyTileTaskWorkerPool::OnTaskSetFinished", "task_set", |
| 784 task_set); | 787 task_set); |
| 785 | 788 |
| 786 DCHECK(tasks_pending_[task_set]); | 789 DCHECK(tasks_pending_[task_set]); |
| 787 tasks_pending_[task_set] = false; | 790 tasks_pending_[task_set] = false; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 816 | 819 |
| 817 staging_state->SetInteger("staging_buffer_count", | 820 staging_state->SetInteger("staging_buffer_count", |
| 818 static_cast<int>(buffers_.size())); | 821 static_cast<int>(buffers_.size())); |
| 819 staging_state->SetInteger("busy_count", | 822 staging_state->SetInteger("busy_count", |
| 820 static_cast<int>(busy_buffers_.size())); | 823 static_cast<int>(busy_buffers_.size())); |
| 821 staging_state->SetInteger("free_count", | 824 staging_state->SetInteger("free_count", |
| 822 static_cast<int>(free_buffers_.size())); | 825 static_cast<int>(free_buffers_.size())); |
| 823 } | 826 } |
| 824 | 827 |
| 825 } // namespace cc | 828 } // namespace cc |
| OLD | NEW |