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

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: Changed RasterBuffer interface. 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 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 texture_pool(0), 389 texture_pool(0),
390 wrap_mode(wrap_mode), 390 wrap_mode(wrap_mode),
391 hint(TextureUsageAny), 391 hint(TextureUsageAny),
392 type(Bitmap), 392 type(Bitmap),
393 format(RGBA_8888), 393 format(RGBA_8888),
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(
400 const Resource* resource,
401 ResourceProvider* resource_provider)
402 : resource_(resource),
403 resource_provider_(resource_provider),
404 locked_canvas_(NULL),
405 canvas_save_count_(0) {
406 DCHECK(resource_);
407 DCHECK(resource_provider_);
408 }
409
410 ResourceProvider::RasterBuffer::~RasterBuffer() {}
411
412 SkCanvas* ResourceProvider::RasterBuffer::LockForWrite() {
413 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
414 "ResourceProvider::RasterBuffer::LockForWrite");
415
416 DCHECK(!locked_canvas_);
417
418 locked_canvas_ = DoLockForWrite();
419 canvas_save_count_ = locked_canvas_ ? locked_canvas_->save() : 0;
420 return locked_canvas_;
421 }
422
423 bool ResourceProvider::RasterBuffer::UnlockForWrite() {
424 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
425 "ResourceProvider::RasterBuffer::UnlockForWrite");
426
427 if (locked_canvas_) {
428 locked_canvas_->restoreToCount(canvas_save_count_);
429 locked_canvas_ = NULL;
430 }
431 return DoUnlockForWrite();
432 }
433
434 ResourceProvider::GpuRasterBuffer::GpuRasterBuffer( 399 ResourceProvider::GpuRasterBuffer::GpuRasterBuffer(
435 const Resource* resource, 400 const Resource* resource,
436 ResourceProvider* resource_provider, 401 ResourceProvider* resource_provider,
437 bool use_distance_field_text) 402 bool use_distance_field_text)
438 : RasterBuffer(resource, resource_provider), 403 : resource_(resource),
404 resource_provider_(resource_provider),
405 locked_canvas_(NULL),
406 canvas_save_count_(0),
439 surface_generation_id_(0u), 407 surface_generation_id_(0u),
440 use_distance_field_text_(use_distance_field_text) { 408 use_distance_field_text_(use_distance_field_text) {
441 } 409 }
442 410
443 ResourceProvider::GpuRasterBuffer::~GpuRasterBuffer() { 411 ResourceProvider::GpuRasterBuffer::~GpuRasterBuffer() {
444 } 412 }
445 413
446 SkCanvas* ResourceProvider::GpuRasterBuffer::DoLockForWrite() { 414 void ResourceProvider::GpuRasterBuffer::LockForWrite() {
415 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
416 "ResourceProvider::GpuRasterBuffer::LockForWrite");
417
418 DCHECK(!locked_canvas_);
419
447 if (!surface_) 420 if (!surface_)
448 surface_ = CreateSurface(); 421 surface_ = CreateSurface();
449 surface_generation_id_ = surface_ ? surface_->generationID() : 0u; 422 surface_generation_id_ = surface_ ? surface_->generationID() : 0u;
450 return surface_ ? surface_->getCanvas() : NULL;
451 } 423 }
452 424
453 bool ResourceProvider::GpuRasterBuffer::DoUnlockForWrite() { 425 bool ResourceProvider::GpuRasterBuffer::UnlockForWrite() {
426 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
427 "ResourceProvider::GpuRasterBuffer::UnlockForWrite");
428
429 DCHECK(!locked_canvas_);
430
454 // generationID returns a non-zero, unique value corresponding to the content 431 // generationID returns a non-zero, unique value corresponding to the content
455 // of surface. Hence, a change since DoLockForWrite was called means the 432 // of surface. Hence, a change since LockForWrite was called means the surface
456 // surface has changed. 433 // has changed.
457 return surface_ ? surface_generation_id_ != surface_->generationID() : false; 434 return surface_ ? surface_generation_id_ != surface_->generationID() : false;
458 } 435 }
459 436
437 SkCanvas* ResourceProvider::GpuRasterBuffer::AcquireSkCanvas() {
438 // Note that this function is called from a worker thread.
439 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
440 "ResourceProvider::GpuRasterBuffer::AcquireSkCanvas");
441
442 DCHECK(!locked_canvas_);
443 locked_canvas_ = surface_ ? surface_->getCanvas() : NULL;
444 canvas_save_count_ = locked_canvas_ ? locked_canvas_->save() : 0;
445 return locked_canvas_;
446 }
447
448 void ResourceProvider::GpuRasterBuffer::ReleaseSkCanvas() {
449 // Note that this function is called from a worker thread.
450 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
451 "ResourceProvider::GpuRasterBuffer::ReleaseSkCanvas");
452
453 if (locked_canvas_) {
454 locked_canvas_->restoreToCount(canvas_save_count_);
455 locked_canvas_ = NULL;
456 }
457 }
458
460 skia::RefPtr<SkSurface> ResourceProvider::GpuRasterBuffer::CreateSurface() { 459 skia::RefPtr<SkSurface> ResourceProvider::GpuRasterBuffer::CreateSurface() {
461 DCHECK_EQ(GLTexture, resource()->type); 460 DCHECK_EQ(GLTexture, resource()->type);
462 DCHECK(resource()->gl_id); 461 DCHECK(resource()->gl_id);
463 462
464 class GrContext* gr_context = resource_provider()->GrContext(); 463 class GrContext* gr_context = resource_provider()->GrContext();
465 // TODO(alokp): Implement TestContextProvider::GrContext(). 464 // TODO(alokp): Implement TestContextProvider::GrContext().
466 if (!gr_context) 465 if (!gr_context)
467 return skia::RefPtr<SkSurface>(); 466 return skia::RefPtr<SkSurface>();
468 467
469 GrBackendTextureDesc desc; 468 GrBackendTextureDesc desc;
470 desc.fFlags = kRenderTarget_GrBackendTextureFlag; 469 desc.fFlags = kRenderTarget_GrBackendTextureFlag;
471 desc.fWidth = resource()->size.width(); 470 desc.fWidth = resource()->size.width();
472 desc.fHeight = resource()->size.height(); 471 desc.fHeight = resource()->size.height();
473 desc.fConfig = ToGrPixelConfig(resource()->format); 472 desc.fConfig = ToGrPixelConfig(resource()->format);
474 desc.fOrigin = kTopLeft_GrSurfaceOrigin; 473 desc.fOrigin = kTopLeft_GrSurfaceOrigin;
475 desc.fTextureHandle = resource()->gl_id; 474 desc.fTextureHandle = resource()->gl_id;
476 skia::RefPtr<GrTexture> gr_texture = 475 skia::RefPtr<GrTexture> gr_texture =
477 skia::AdoptRef(gr_context->wrapBackendTexture(desc)); 476 skia::AdoptRef(gr_context->wrapBackendTexture(desc));
478 SkSurface::TextRenderMode text_render_mode = 477 SkSurface::TextRenderMode text_render_mode =
479 use_distance_field_text_ ? SkSurface::kDistanceField_TextRenderMode 478 use_distance_field_text_ ? SkSurface::kDistanceField_TextRenderMode
480 : SkSurface::kStandard_TextRenderMode; 479 : SkSurface::kStandard_TextRenderMode;
481 return skia::AdoptRef(SkSurface::NewRenderTargetDirect( 480 return skia::AdoptRef(SkSurface::NewRenderTargetDirect(
482 gr_texture->asRenderTarget(), text_render_mode)); 481 gr_texture->asRenderTarget(), text_render_mode));
483 } 482 }
484 483
485 ResourceProvider::BitmapRasterBuffer::BitmapRasterBuffer( 484 ResourceProvider::BitmapRasterBuffer::BitmapRasterBuffer(
486 const Resource* resource, 485 const Resource* resource,
487 ResourceProvider* resource_provider) 486 ResourceProvider* resource_provider)
488 : RasterBuffer(resource, resource_provider), 487 : resource_(resource),
488 resource_provider_(resource_provider),
489 canvas_save_count_(0),
489 mapped_buffer_(NULL), 490 mapped_buffer_(NULL),
490 raster_bitmap_generation_id_(0u) {} 491 raster_bitmap_generation_id_(0u),
492 raster_bitmap_changed_(false),
493 stride_(0) {
494 }
491 495
492 ResourceProvider::BitmapRasterBuffer::~BitmapRasterBuffer() {} 496 ResourceProvider::BitmapRasterBuffer::~BitmapRasterBuffer() {}
493 497
494 SkCanvas* ResourceProvider::BitmapRasterBuffer::DoLockForWrite() { 498 void ResourceProvider::BitmapRasterBuffer::LockForWrite() {
499 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
500 "ResourceProvider::BitmapRasterBuffer::LockForWrite");
501
495 DCHECK(!mapped_buffer_); 502 DCHECK(!mapped_buffer_);
496 DCHECK(!raster_canvas_); 503 DCHECK(!raster_canvas_);
497 504
498 int stride = 0; 505 stride_ = 0;
499 mapped_buffer_ = MapBuffer(&stride); 506 mapped_buffer_ = MapBuffer(&stride_);
507 raster_bitmap_changed_ = false;
508 }
509
510 bool ResourceProvider::BitmapRasterBuffer::UnlockForWrite() {
511 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
512 "ResourceProvider::BitmapRasterBuffer::UnlockForWrite");
513
514 DCHECK(!raster_canvas_);
515
516 UnmapBuffer();
517 mapped_buffer_ = NULL;
518 return raster_bitmap_changed_;
519 }
520
521 SkCanvas* ResourceProvider::BitmapRasterBuffer::AcquireSkCanvas() {
522 // Note that this function is called from a worker thread.
523 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
524 "ResourceProvider::BitmapRasterBuffer::AcquireSkCanvas");
525
500 if (!mapped_buffer_) 526 if (!mapped_buffer_)
501 return NULL; 527 return NULL;
502 528
503 switch (resource()->format) { 529 switch (resource()->format) {
504 case RGBA_4444: 530 case RGBA_4444:
505 // Use the default stride if we will eventually convert this 531 // Use the default stride if we will eventually convert this
506 // bitmap to 4444. 532 // bitmap to 4444.
507 raster_bitmap_.allocN32Pixels(resource()->size.width(), 533 raster_bitmap_.allocN32Pixels(resource()->size.width(),
508 resource()->size.height()); 534 resource()->size.height());
509 break; 535 break;
510 case RGBA_8888: 536 case RGBA_8888:
511 case BGRA_8888: { 537 case BGRA_8888: {
512 SkImageInfo info = SkImageInfo::MakeN32Premul(resource()->size.width(), 538 SkImageInfo info = SkImageInfo::MakeN32Premul(resource()->size.width(),
513 resource()->size.height()); 539 resource()->size.height());
514 if (0 == stride) 540 if (0 == stride_)
515 stride = info.minRowBytes(); 541 stride_ = info.minRowBytes();
516 raster_bitmap_.installPixels(info, mapped_buffer_, stride); 542 raster_bitmap_.installPixels(info, mapped_buffer_, stride_);
517 break; 543 break;
518 } 544 }
519 case LUMINANCE_8: 545 case LUMINANCE_8:
520 case RGB_565: 546 case RGB_565:
521 case ETC1: 547 case ETC1:
522 NOTREACHED(); 548 NOTREACHED();
523 break; 549 break;
524 } 550 }
551
552 raster_bitmap_generation_id_ = raster_bitmap_.getGenerationID();
553
554 DCHECK(!raster_canvas_);
525 raster_canvas_ = skia::AdoptRef(new SkCanvas(raster_bitmap_)); 555 raster_canvas_ = skia::AdoptRef(new SkCanvas(raster_bitmap_));
526 raster_bitmap_generation_id_ = raster_bitmap_.getGenerationID(); 556 canvas_save_count_ = raster_canvas_->save();
527 return raster_canvas_.get(); 557 return raster_canvas_.get();
528 } 558 }
529 559
530 bool ResourceProvider::BitmapRasterBuffer::DoUnlockForWrite() { 560 void ResourceProvider::BitmapRasterBuffer::ReleaseSkCanvas() {
531 raster_canvas_.clear(); 561 // Note that this function is called from a worker thread.
562 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
563 "ResourceProvider::BitmapRasterBuffer::ReleaseSkCanvas");
564
565 if (raster_canvas_) {
566 raster_canvas_->restoreToCount(canvas_save_count_);
567 raster_canvas_.clear();
568 }
532 569
533 // getGenerationID returns a non-zero, unique value corresponding to the 570 // getGenerationID returns a non-zero, unique value corresponding to the
534 // pixels in bitmap. Hence, a change since DoLockForWrite was called means the 571 // pixels in bitmap. Hence, a change since LockForWrite was called means the
535 // bitmap has changed. 572 // bitmap has changed.
536 bool raster_bitmap_changed = 573 raster_bitmap_changed_ =
537 raster_bitmap_generation_id_ != raster_bitmap_.getGenerationID(); 574 raster_bitmap_generation_id_ != raster_bitmap_.getGenerationID();
538 575 if (raster_bitmap_changed_) {
539 if (raster_bitmap_changed) {
540 SkColorType buffer_colorType = 576 SkColorType buffer_colorType =
541 ResourceFormatToSkColorType(resource()->format); 577 ResourceFormatToSkColorType(resource()->format);
542 if (mapped_buffer_ && (buffer_colorType != raster_bitmap_.colorType())) 578 if (mapped_buffer_ && (buffer_colorType != raster_bitmap_.colorType()))
543 CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_colorType); 579 CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_colorType);
544 } 580 }
545 raster_bitmap_.reset(); 581 raster_bitmap_.reset();
546
547 UnmapBuffer();
548 mapped_buffer_ = NULL;
549 return raster_bitmap_changed;
550 } 582 }
551 583
552 ResourceProvider::ImageRasterBuffer::ImageRasterBuffer( 584 ResourceProvider::ImageRasterBuffer::ImageRasterBuffer(
553 const Resource* resource, 585 const Resource* resource,
554 ResourceProvider* resource_provider) 586 ResourceProvider* resource_provider)
555 : BitmapRasterBuffer(resource, resource_provider) {} 587 : BitmapRasterBuffer(resource, resource_provider) {}
556 588
557 ResourceProvider::ImageRasterBuffer::~ImageRasterBuffer() {} 589 ResourceProvider::ImageRasterBuffer::~ImageRasterBuffer() {}
558 590
559 uint8_t* ResourceProvider::ImageRasterBuffer::MapBuffer(int* stride) { 591 uint8_t* ResourceProvider::ImageRasterBuffer::MapBuffer(int* stride) {
(...skipping 1160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1720 if (!to_return.empty()) 1752 if (!to_return.empty())
1721 child_info->return_callback.Run(to_return); 1753 child_info->return_callback.Run(to_return);
1722 1754
1723 if (child_info->marked_for_deletion && 1755 if (child_info->marked_for_deletion &&
1724 child_info->parent_to_child_map.empty()) { 1756 child_info->parent_to_child_map.empty()) {
1725 DCHECK(child_info->child_to_parent_map.empty()); 1757 DCHECK(child_info->child_to_parent_map.empty());
1726 children_.erase(child_it); 1758 children_.erase(child_it);
1727 } 1759 }
1728 } 1760 }
1729 1761
1730 SkCanvas* ResourceProvider::MapGpuRasterBuffer(ResourceId id) { 1762 RasterBuffer* ResourceProvider::AcquireGpuRasterBuffer(ResourceId id) {
1731 // Resource needs to be locked for write since GpuRasterBuffer writes 1763 // Resource needs to be locked for write since GpuRasterBuffer writes
1732 // directly to it. 1764 // directly to it.
1733 LockForWrite(id); 1765 LockForWrite(id);
1734 Resource* resource = GetResource(id); 1766 Resource* resource = GetResource(id);
1735 if (!resource->gpu_raster_buffer.get()) { 1767 if (!resource->gpu_raster_buffer.get()) {
1736 resource->gpu_raster_buffer.reset( 1768 resource->gpu_raster_buffer.reset(
1737 new GpuRasterBuffer(resource, this, use_distance_field_text_)); 1769 new GpuRasterBuffer(resource, this, use_distance_field_text_));
1738 } 1770 }
1739 return resource->gpu_raster_buffer->LockForWrite(); 1771 resource->gpu_raster_buffer->LockForWrite();
1772 return resource->gpu_raster_buffer.get();
1740 } 1773 }
1741 1774
1742 void ResourceProvider::UnmapGpuRasterBuffer(ResourceId id) { 1775 void ResourceProvider::ReleaseGpuRasterBuffer(ResourceId id) {
1743 Resource* resource = GetResource(id); 1776 Resource* resource = GetResource(id);
1744 DCHECK(resource->gpu_raster_buffer.get()); 1777 DCHECK(resource->gpu_raster_buffer.get());
1745 resource->gpu_raster_buffer->UnlockForWrite(); 1778 resource->gpu_raster_buffer->UnlockForWrite();
1746 UnlockForWrite(id); 1779 UnlockForWrite(id);
1747 } 1780 }
1748 1781
1749 SkCanvas* ResourceProvider::MapImageRasterBuffer(ResourceId id) { 1782 RasterBuffer* ResourceProvider::AcquireImageRasterBuffer(ResourceId id) {
1750 Resource* resource = GetResource(id); 1783 Resource* resource = GetResource(id);
1751 AcquireImage(resource); 1784 AcquireImage(resource);
1752 if (!resource->image_raster_buffer.get()) 1785 if (!resource->image_raster_buffer.get())
1753 resource->image_raster_buffer.reset(new ImageRasterBuffer(resource, this)); 1786 resource->image_raster_buffer.reset(new ImageRasterBuffer(resource, this));
1754 return resource->image_raster_buffer->LockForWrite(); 1787 resource->image_raster_buffer->LockForWrite();
1788 return resource->image_raster_buffer.get();
1755 } 1789 }
1756 1790
1757 bool ResourceProvider::UnmapImageRasterBuffer(ResourceId id) { 1791 bool ResourceProvider::ReleaseImageRasterBuffer(ResourceId id) {
1758 Resource* resource = GetResource(id); 1792 Resource* resource = GetResource(id);
1759 resource->dirty_image = true; 1793 resource->dirty_image = true;
1760 return resource->image_raster_buffer->UnlockForWrite(); 1794 return resource->image_raster_buffer->UnlockForWrite();
1761 } 1795 }
1762 1796
1763 void ResourceProvider::AcquirePixelRasterBuffer(ResourceId id) { 1797 void ResourceProvider::AcquirePixelRasterBuffer(ResourceId id) {
1764 Resource* resource = GetResource(id); 1798 Resource* resource = GetResource(id);
1765 AcquirePixelBuffer(resource); 1799 AcquirePixelBuffer(resource);
1766 resource->pixel_raster_buffer.reset(new PixelRasterBuffer(resource, this)); 1800 resource->pixel_raster_buffer.reset(new PixelRasterBuffer(resource, this));
1767 } 1801 }
1768 1802
1769 void ResourceProvider::ReleasePixelRasterBuffer(ResourceId id) { 1803 void ResourceProvider::ReleasePixelRasterBuffer(ResourceId id) {
1770 Resource* resource = GetResource(id); 1804 Resource* resource = GetResource(id);
1771 resource->pixel_raster_buffer.reset(); 1805 resource->pixel_raster_buffer.reset();
1772 ReleasePixelBuffer(resource); 1806 ReleasePixelBuffer(resource);
1773 } 1807 }
1774 1808
1775 SkCanvas* ResourceProvider::MapPixelRasterBuffer(ResourceId id) { 1809 RasterBuffer* ResourceProvider::MapPixelRasterBuffer(ResourceId id) {
1776 Resource* resource = GetResource(id); 1810 Resource* resource = GetResource(id);
1777 DCHECK(resource->pixel_raster_buffer.get()); 1811 DCHECK(resource->pixel_raster_buffer.get());
1778 return resource->pixel_raster_buffer->LockForWrite(); 1812 resource->pixel_raster_buffer->LockForWrite();
1813 return resource->pixel_raster_buffer.get();
1779 } 1814 }
1780 1815
1781 bool ResourceProvider::UnmapPixelRasterBuffer(ResourceId id) { 1816 bool ResourceProvider::UnmapPixelRasterBuffer(ResourceId id) {
1782 Resource* resource = GetResource(id); 1817 Resource* resource = GetResource(id);
1783 DCHECK(resource->pixel_raster_buffer.get()); 1818 DCHECK(resource->pixel_raster_buffer.get());
1784 return resource->pixel_raster_buffer->UnlockForWrite(); 1819 return resource->pixel_raster_buffer->UnlockForWrite();
1785 } 1820 }
1786 1821
1787 void ResourceProvider::AcquirePixelBuffer(Resource* resource) { 1822 void ResourceProvider::AcquirePixelBuffer(Resource* resource) {
1788 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 1823 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(); 2287 ContextProvider* context_provider = output_surface_->context_provider();
2253 return context_provider ? context_provider->ContextGL() : NULL; 2288 return context_provider ? context_provider->ContextGL() : NULL;
2254 } 2289 }
2255 2290
2256 class GrContext* ResourceProvider::GrContext() const { 2291 class GrContext* ResourceProvider::GrContext() const {
2257 ContextProvider* context_provider = output_surface_->context_provider(); 2292 ContextProvider* context_provider = output_surface_->context_provider();
2258 return context_provider ? context_provider->GrContext() : NULL; 2293 return context_provider ? context_provider->GrContext() : NULL;
2259 } 2294 }
2260 2295
2261 } // namespace cc 2296 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698