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

Side by Side Diff: cc/resources/resource_provider.cc

Issue 454843002: cc: Do bitmap conversion for RasterBuffer in the worker thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 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
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/resources/resource_provider.h" 5 #include "cc/resources/resource_provider.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/containers/hash_tables.h" 10 #include "base/containers/hash_tables.h"
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 shared_bitmap_id(bitmap_id), 394 shared_bitmap_id(bitmap_id),
395 shared_bitmap(NULL) { 395 shared_bitmap(NULL) {
396 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); 396 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT);
397 } 397 }
398 398
399 ResourceProvider::RasterBuffer::RasterBuffer( 399 ResourceProvider::RasterBuffer::RasterBuffer(
400 const Resource* resource, 400 const Resource* resource,
401 ResourceProvider* resource_provider) 401 ResourceProvider* resource_provider)
402 : resource_(resource), 402 : resource_(resource),
403 resource_provider_(resource_provider), 403 resource_provider_(resource_provider),
404 locked_canvas_(NULL),
405 canvas_save_count_(0) { 404 canvas_save_count_(0) {
406 DCHECK(resource_); 405 DCHECK(resource_);
407 DCHECK(resource_provider_); 406 DCHECK(resource_provider_);
408 } 407 }
409 408
410 ResourceProvider::RasterBuffer::~RasterBuffer() {} 409 ResourceProvider::RasterBuffer::~RasterBuffer() {}
411 410
412 SkCanvas* ResourceProvider::RasterBuffer::LockForWrite() { 411 void ResourceProvider::RasterBuffer::LockForWrite() {
413 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 412 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
414 "ResourceProvider::RasterBuffer::LockForWrite"); 413 "ResourceProvider::RasterBuffer::LockForWrite");
415 414
416 DCHECK(!locked_canvas_); 415 DCHECK(!locked_canvas_);
417 416
418 locked_canvas_ = DoLockForWrite(); 417 locked_canvas_ = DoLockForWrite();
419 canvas_save_count_ = locked_canvas_ ? locked_canvas_->save() : 0; 418 canvas_save_count_ = locked_canvas_ ? locked_canvas_->save() : 0;
420 return locked_canvas_;
421 } 419 }
422 420
423 bool ResourceProvider::RasterBuffer::UnlockForWrite() { 421 bool ResourceProvider::RasterBuffer::UnlockForWrite() {
424 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 422 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
425 "ResourceProvider::RasterBuffer::UnlockForWrite"); 423 "ResourceProvider::RasterBuffer::UnlockForWrite");
426 424
427 if (locked_canvas_) { 425 if (locked_canvas_) {
428 locked_canvas_->restoreToCount(canvas_save_count_); 426 locked_canvas_->restoreToCount(canvas_save_count_);
429 locked_canvas_ = NULL; 427 locked_canvas_ = NULL;
430 } 428 }
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 case RGB_565: 518 case RGB_565:
521 case ETC1: 519 case ETC1:
522 NOTREACHED(); 520 NOTREACHED();
523 break; 521 break;
524 } 522 }
525 raster_canvas_ = skia::AdoptRef(new SkCanvas(raster_bitmap_)); 523 raster_canvas_ = skia::AdoptRef(new SkCanvas(raster_bitmap_));
526 raster_bitmap_generation_id_ = raster_bitmap_.getGenerationID(); 524 raster_bitmap_generation_id_ = raster_bitmap_.getGenerationID();
527 return raster_canvas_.get(); 525 return raster_canvas_.get();
528 } 526 }
529 527
530 bool ResourceProvider::BitmapRasterBuffer::DoUnlockForWrite() { 528 void ResourceProvider::BitmapRasterBuffer::Flush() {
531 raster_canvas_.clear(); 529 // Note that this function is called from a worker thread.
532 530
533 // getGenerationID returns a non-zero, unique value corresponding to the 531 // getGenerationID returns a non-zero, unique value corresponding to the
534 // pixels in bitmap. Hence, a change since DoLockForWrite was called means the 532 // pixels in bitmap. Hence, a change since DoLockForWrite was called means the
535 // bitmap has changed. 533 // bitmap has changed.
536 bool raster_bitmap_changed = 534 bool raster_bitmap_changed =
537 raster_bitmap_generation_id_ != raster_bitmap_.getGenerationID(); 535 raster_bitmap_generation_id_ != raster_bitmap_.getGenerationID();
538
539 if (raster_bitmap_changed) { 536 if (raster_bitmap_changed) {
540 SkColorType buffer_colorType = 537 SkColorType buffer_colorType =
541 ResourceFormatToSkColorType(resource()->format); 538 ResourceFormatToSkColorType(resource()->format);
542 if (mapped_buffer_ && (buffer_colorType != raster_bitmap_.colorType())) 539 if (mapped_buffer_ && (buffer_colorType != raster_bitmap_.colorType()))
543 CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_colorType); 540 CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_colorType);
544 } 541 }
542 }
543
544 bool ResourceProvider::BitmapRasterBuffer::DoUnlockForWrite() {
545 raster_canvas_.clear();
546
547 bool raster_bitmap_changed =
548 raster_bitmap_generation_id_ != raster_bitmap_.getGenerationID();
545 raster_bitmap_.reset(); 549 raster_bitmap_.reset();
546 550
547 UnmapBuffer(); 551 UnmapBuffer();
548 mapped_buffer_ = NULL; 552 mapped_buffer_ = NULL;
549 return raster_bitmap_changed; 553 return raster_bitmap_changed;
550 } 554 }
551 555
552 ResourceProvider::ImageRasterBuffer::ImageRasterBuffer( 556 ResourceProvider::ImageRasterBuffer::ImageRasterBuffer(
553 const Resource* resource, 557 const Resource* resource,
554 ResourceProvider* resource_provider) 558 ResourceProvider* resource_provider)
(...skipping 1165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1720 if (!to_return.empty()) 1724 if (!to_return.empty())
1721 child_info->return_callback.Run(to_return); 1725 child_info->return_callback.Run(to_return);
1722 1726
1723 if (child_info->marked_for_deletion && 1727 if (child_info->marked_for_deletion &&
1724 child_info->parent_to_child_map.empty()) { 1728 child_info->parent_to_child_map.empty()) {
1725 DCHECK(child_info->child_to_parent_map.empty()); 1729 DCHECK(child_info->child_to_parent_map.empty());
1726 children_.erase(child_it); 1730 children_.erase(child_it);
1727 } 1731 }
1728 } 1732 }
1729 1733
1730 SkCanvas* ResourceProvider::MapGpuRasterBuffer(ResourceId id) { 1734 RasterCanvas* ResourceProvider::MapGpuRasterBuffer(ResourceId id) {
1731 // Resource needs to be locked for write since GpuRasterBuffer writes 1735 // Resource needs to be locked for write since GpuRasterBuffer writes
1732 // directly to it. 1736 // directly to it.
1733 LockForWrite(id); 1737 LockForWrite(id);
1734 Resource* resource = GetResource(id); 1738 Resource* resource = GetResource(id);
1735 if (!resource->gpu_raster_buffer.get()) { 1739 if (!resource->gpu_raster_buffer.get()) {
1736 resource->gpu_raster_buffer.reset( 1740 resource->gpu_raster_buffer.reset(
1737 new GpuRasterBuffer(resource, this, use_distance_field_text_)); 1741 new GpuRasterBuffer(resource, this, use_distance_field_text_));
1738 } 1742 }
1739 return resource->gpu_raster_buffer->LockForWrite(); 1743 resource->gpu_raster_buffer->LockForWrite();
1744 return resource->gpu_raster_buffer.get();
1740 } 1745 }
1741 1746
1742 void ResourceProvider::UnmapGpuRasterBuffer(ResourceId id) { 1747 void ResourceProvider::UnmapGpuRasterBuffer(ResourceId id) {
1743 Resource* resource = GetResource(id); 1748 Resource* resource = GetResource(id);
1744 DCHECK(resource->gpu_raster_buffer.get()); 1749 DCHECK(resource->gpu_raster_buffer.get());
1745 resource->gpu_raster_buffer->UnlockForWrite(); 1750 resource->gpu_raster_buffer->UnlockForWrite();
1746 UnlockForWrite(id); 1751 UnlockForWrite(id);
1747 } 1752 }
1748 1753
1749 SkCanvas* ResourceProvider::MapImageRasterBuffer(ResourceId id) { 1754 RasterCanvas* ResourceProvider::MapImageRasterBuffer(ResourceId id) {
1750 Resource* resource = GetResource(id); 1755 Resource* resource = GetResource(id);
1751 AcquireImage(resource); 1756 AcquireImage(resource);
1752 if (!resource->image_raster_buffer.get()) 1757 if (!resource->image_raster_buffer.get())
1753 resource->image_raster_buffer.reset(new ImageRasterBuffer(resource, this)); 1758 resource->image_raster_buffer.reset(new ImageRasterBuffer(resource, this));
1754 return resource->image_raster_buffer->LockForWrite(); 1759 resource->image_raster_buffer->LockForWrite();
1760 return resource->image_raster_buffer.get();
1755 } 1761 }
1756 1762
1757 bool ResourceProvider::UnmapImageRasterBuffer(ResourceId id) { 1763 bool ResourceProvider::UnmapImageRasterBuffer(ResourceId id) {
1758 Resource* resource = GetResource(id); 1764 Resource* resource = GetResource(id);
1759 resource->dirty_image = true; 1765 resource->dirty_image = true;
1760 return resource->image_raster_buffer->UnlockForWrite(); 1766 return resource->image_raster_buffer->UnlockForWrite();
1761 } 1767 }
1762 1768
1763 void ResourceProvider::AcquirePixelRasterBuffer(ResourceId id) { 1769 void ResourceProvider::AcquirePixelRasterBuffer(ResourceId id) {
1764 Resource* resource = GetResource(id); 1770 Resource* resource = GetResource(id);
1765 AcquirePixelBuffer(resource); 1771 AcquirePixelBuffer(resource);
1766 resource->pixel_raster_buffer.reset(new PixelRasterBuffer(resource, this)); 1772 resource->pixel_raster_buffer.reset(new PixelRasterBuffer(resource, this));
1767 } 1773 }
1768 1774
1769 void ResourceProvider::ReleasePixelRasterBuffer(ResourceId id) { 1775 void ResourceProvider::ReleasePixelRasterBuffer(ResourceId id) {
1770 Resource* resource = GetResource(id); 1776 Resource* resource = GetResource(id);
1771 resource->pixel_raster_buffer.reset(); 1777 resource->pixel_raster_buffer.reset();
1772 ReleasePixelBuffer(resource); 1778 ReleasePixelBuffer(resource);
1773 } 1779 }
1774 1780
1775 SkCanvas* ResourceProvider::MapPixelRasterBuffer(ResourceId id) { 1781 RasterCanvas* ResourceProvider::MapPixelRasterBuffer(ResourceId id) {
1776 Resource* resource = GetResource(id); 1782 Resource* resource = GetResource(id);
1777 DCHECK(resource->pixel_raster_buffer.get()); 1783 DCHECK(resource->pixel_raster_buffer.get());
1778 return resource->pixel_raster_buffer->LockForWrite(); 1784 resource->pixel_raster_buffer->LockForWrite();
1785 return resource->pixel_raster_buffer.get();
1779 } 1786 }
1780 1787
1781 bool ResourceProvider::UnmapPixelRasterBuffer(ResourceId id) { 1788 bool ResourceProvider::UnmapPixelRasterBuffer(ResourceId id) {
1782 Resource* resource = GetResource(id); 1789 Resource* resource = GetResource(id);
1783 DCHECK(resource->pixel_raster_buffer.get()); 1790 DCHECK(resource->pixel_raster_buffer.get());
1784 return resource->pixel_raster_buffer->UnlockForWrite(); 1791 return resource->pixel_raster_buffer->UnlockForWrite();
1785 } 1792 }
1786 1793
1787 void ResourceProvider::AcquirePixelBuffer(Resource* resource) { 1794 void ResourceProvider::AcquirePixelBuffer(Resource* resource) {
1788 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 1795 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
2252 ContextProvider* context_provider = output_surface_->context_provider(); 2259 ContextProvider* context_provider = output_surface_->context_provider();
2253 return context_provider ? context_provider->ContextGL() : NULL; 2260 return context_provider ? context_provider->ContextGL() : NULL;
2254 } 2261 }
2255 2262
2256 class GrContext* ResourceProvider::GrContext() const { 2263 class GrContext* ResourceProvider::GrContext() const {
2257 ContextProvider* context_provider = output_surface_->context_provider(); 2264 ContextProvider* context_provider = output_surface_->context_provider();
2258 return context_provider ? context_provider->GrContext() : NULL; 2265 return context_provider ? context_provider->GrContext() : NULL;
2259 } 2266 }
2260 2267
2261 } // namespace cc 2268 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698