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

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: More code refactoring and some interface changes. 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 explicit IdentityAllocator(void* buffer) : buffer_(buffer) {} 114 explicit IdentityAllocator(void* buffer) : buffer_(buffer) {}
115 virtual bool allocPixelRef(SkBitmap* dst, SkColorTable*) OVERRIDE { 115 virtual bool allocPixelRef(SkBitmap* dst, SkColorTable*) OVERRIDE {
116 dst->setPixels(buffer_); 116 dst->setPixels(buffer_);
117 return true; 117 return true;
118 } 118 }
119 119
120 private: 120 private:
121 void* buffer_; 121 void* buffer_;
122 }; 122 };
123 123
124 void MakeBitmap(SkBitmap* bitmap,
125 uint8_t* buffer,
126 ResourceFormat format,
127 const gfx::Size& size,
128 int stride) {
129 switch (format) {
130 case RGBA_4444:
131 // Use the default stride if we will eventually convert this
132 // bitmap to 4444.
133 bitmap->allocN32Pixels(size.width(), size.height());
134 break;
135 case RGBA_8888:
136 case BGRA_8888: {
137 SkImageInfo info =
138 SkImageInfo::MakeN32Premul(size.width(), size.height());
139 if (0 == stride)
140 stride = info.minRowBytes();
141 bitmap->installPixels(info, buffer, stride);
142 break;
143 }
144 case LUMINANCE_8:
145 case RGB_565:
146 case ETC1:
147 NOTREACHED();
148 break;
149 }
150 }
151
124 void CopyBitmap(const SkBitmap& src, uint8_t* dst, SkColorType dst_colorType) { 152 void CopyBitmap(const SkBitmap& src, uint8_t* dst, SkColorType dst_colorType) {
125 SkBitmap dst_bitmap; 153 SkBitmap dst_bitmap;
126 IdentityAllocator allocator(dst); 154 IdentityAllocator allocator(dst);
127 src.copyTo(&dst_bitmap, dst_colorType, &allocator); 155 src.copyTo(&dst_bitmap, dst_colorType, &allocator);
128 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the 156 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the
129 // bitmap data. This check will be removed once crbug.com/293728 is fixed. 157 // bitmap data. This check will be removed once crbug.com/293728 is fixed.
130 CHECK_EQ(0u, dst_bitmap.rowBytes() % 4); 158 CHECK_EQ(0u, dst_bitmap.rowBytes() % 4);
131 } 159 }
132 160
133 class ScopedSetActiveTexture { 161 class ScopedSetActiveTexture {
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 texture_pool(0), 417 texture_pool(0),
390 wrap_mode(wrap_mode), 418 wrap_mode(wrap_mode),
391 hint(TextureUsageAny), 419 hint(TextureUsageAny),
392 type(Bitmap), 420 type(Bitmap),
393 format(RGBA_8888), 421 format(RGBA_8888),
394 shared_bitmap_id(bitmap_id), 422 shared_bitmap_id(bitmap_id),
395 shared_bitmap(NULL) { 423 shared_bitmap(NULL) {
396 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); 424 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT);
397 } 425 }
398 426
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( 427 ResourceProvider::GpuRasterBuffer::GpuRasterBuffer(
435 const Resource* resource, 428 const Resource* resource,
436 ResourceProvider* resource_provider, 429 ResourceProvider* resource_provider,
437 bool use_distance_field_text) 430 bool use_distance_field_text)
438 : RasterBuffer(resource, resource_provider), 431 : resource_(resource),
439 surface_generation_id_(0u), 432 resource_provider_(resource_provider),
440 use_distance_field_text_(use_distance_field_text) { 433 use_distance_field_text_(use_distance_field_text) {
434 DCHECK_EQ(GLTexture, resource_->type);
435 DCHECK(resource_->gl_id);
436
437 class GrContext* gr_context = resource_provider_->GrContext();
438 // TODO(alokp): Implement TestContextProvider::GrContext().
439 if (gr_context) {
440 GrBackendTextureDesc desc;
441 desc.fFlags = kRenderTarget_GrBackendTextureFlag;
442 desc.fWidth = resource_->size.width();
443 desc.fHeight = resource_->size.height();
444 desc.fConfig = ToGrPixelConfig(resource_->format);
445 desc.fOrigin = kTopLeft_GrSurfaceOrigin;
446 desc.fTextureHandle = resource_->gl_id;
447 skia::RefPtr<GrTexture> gr_texture =
448 skia::AdoptRef(gr_context->wrapBackendTexture(desc));
449 SkSurface::TextRenderMode text_render_mode =
450 use_distance_field_text_ ? SkSurface::kDistanceField_TextRenderMode
451 : SkSurface::kStandard_TextRenderMode;
452 surface_ = skia::AdoptRef(SkSurface::NewRenderTargetDirect(
453 gr_texture->asRenderTarget(), text_render_mode));
454 }
441 } 455 }
442 456
443 ResourceProvider::GpuRasterBuffer::~GpuRasterBuffer() { 457 ResourceProvider::GpuRasterBuffer::~GpuRasterBuffer() {
444 } 458 }
445 459
446 SkCanvas* ResourceProvider::GpuRasterBuffer::DoLockForWrite() { 460 skia::RefPtr<SkCanvas> ResourceProvider::GpuRasterBuffer::AcquireSkCanvas() {
447 if (!surface_) 461 // Note that this function is called from a worker thread.
448 surface_ = CreateSurface(); 462 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
449 surface_generation_id_ = surface_ ? surface_->generationID() : 0u; 463 "ResourceProvider::GpuRasterBuffer::AcquireSkCanvas");
450 return surface_ ? surface_->getCanvas() : NULL; 464
465 return surface_ ? skia::SharePtr(surface_->getCanvas())
466 : skia::RefPtr<SkCanvas>();
451 } 467 }
452 468
453 bool ResourceProvider::GpuRasterBuffer::DoUnlockForWrite() { 469 void ResourceProvider::GpuRasterBuffer::ReleaseSkCanvas(
454 // generationID returns a non-zero, unique value corresponding to the content 470 const skia::RefPtr<SkCanvas>& canvas) {
455 // of surface. Hence, a change since DoLockForWrite was called means the 471 // Note that this function is called from a worker thread.
456 // surface has changed. 472 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
457 return surface_ ? surface_generation_id_ != surface_->generationID() : false; 473 "ResourceProvider::GpuRasterBuffer::ReleaseSkCanvas");
458 }
459
460 skia::RefPtr<SkSurface> ResourceProvider::GpuRasterBuffer::CreateSurface() {
461 DCHECK_EQ(GLTexture, resource()->type);
462 DCHECK(resource()->gl_id);
463
464 class GrContext* gr_context = resource_provider()->GrContext();
465 // TODO(alokp): Implement TestContextProvider::GrContext().
466 if (!gr_context)
467 return skia::RefPtr<SkSurface>();
468
469 GrBackendTextureDesc desc;
470 desc.fFlags = kRenderTarget_GrBackendTextureFlag;
471 desc.fWidth = resource()->size.width();
472 desc.fHeight = resource()->size.height();
473 desc.fConfig = ToGrPixelConfig(resource()->format);
474 desc.fOrigin = kTopLeft_GrSurfaceOrigin;
475 desc.fTextureHandle = resource()->gl_id;
476 skia::RefPtr<GrTexture> gr_texture =
477 skia::AdoptRef(gr_context->wrapBackendTexture(desc));
478 SkSurface::TextRenderMode text_render_mode =
479 use_distance_field_text_ ? SkSurface::kDistanceField_TextRenderMode
480 : SkSurface::kStandard_TextRenderMode;
481 return skia::AdoptRef(SkSurface::NewRenderTargetDirect(
482 gr_texture->asRenderTarget(), text_render_mode));
483 }
484
485 ResourceProvider::BitmapRasterBuffer::BitmapRasterBuffer(
486 const Resource* resource,
487 ResourceProvider* resource_provider)
488 : RasterBuffer(resource, resource_provider),
489 mapped_buffer_(NULL),
490 raster_bitmap_generation_id_(0u) {}
491
492 ResourceProvider::BitmapRasterBuffer::~BitmapRasterBuffer() {}
493
494 SkCanvas* ResourceProvider::BitmapRasterBuffer::DoLockForWrite() {
495 DCHECK(!mapped_buffer_);
496 DCHECK(!raster_canvas_);
497
498 int stride = 0;
499 mapped_buffer_ = MapBuffer(&stride);
500 if (!mapped_buffer_)
501 return NULL;
502
503 switch (resource()->format) {
504 case RGBA_4444:
505 // Use the default stride if we will eventually convert this
506 // bitmap to 4444.
507 raster_bitmap_.allocN32Pixels(resource()->size.width(),
508 resource()->size.height());
509 break;
510 case RGBA_8888:
511 case BGRA_8888: {
512 SkImageInfo info = SkImageInfo::MakeN32Premul(resource()->size.width(),
513 resource()->size.height());
514 if (0 == stride)
515 stride = info.minRowBytes();
516 raster_bitmap_.installPixels(info, mapped_buffer_, stride);
517 break;
518 }
519 case LUMINANCE_8:
520 case RGB_565:
521 case ETC1:
522 NOTREACHED();
523 break;
524 }
525 raster_canvas_ = skia::AdoptRef(new SkCanvas(raster_bitmap_));
526 raster_bitmap_generation_id_ = raster_bitmap_.getGenerationID();
527 return raster_canvas_.get();
528 }
529
530 bool ResourceProvider::BitmapRasterBuffer::DoUnlockForWrite() {
531 raster_canvas_.clear();
532
533 // getGenerationID returns a non-zero, unique value corresponding to the
534 // pixels in bitmap. Hence, a change since DoLockForWrite was called means the
535 // bitmap has changed.
536 bool raster_bitmap_changed =
537 raster_bitmap_generation_id_ != raster_bitmap_.getGenerationID();
538
539 if (raster_bitmap_changed) {
540 SkColorType buffer_colorType =
541 ResourceFormatToSkColorType(resource()->format);
542 if (mapped_buffer_ && (buffer_colorType != raster_bitmap_.colorType()))
543 CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_colorType);
544 }
545 raster_bitmap_.reset();
546
547 UnmapBuffer();
548 mapped_buffer_ = NULL;
549 return raster_bitmap_changed;
550 } 474 }
551 475
552 ResourceProvider::ImageRasterBuffer::ImageRasterBuffer( 476 ResourceProvider::ImageRasterBuffer::ImageRasterBuffer(
553 const Resource* resource, 477 const Resource* resource,
554 ResourceProvider* resource_provider) 478 ResourceProvider* resource_provider)
555 : BitmapRasterBuffer(resource, resource_provider) {} 479 : resource_(resource),
556 480 resource_provider_(resource_provider),
557 ResourceProvider::ImageRasterBuffer::~ImageRasterBuffer() {} 481 mapped_buffer_(NULL),
558 482 raster_bitmap_changed_(false),
559 uint8_t* ResourceProvider::ImageRasterBuffer::MapBuffer(int* stride) { 483 stride_(0) {
560 return resource_provider()->MapImage(resource(), stride);
561 } 484 }
562 485
563 void ResourceProvider::ImageRasterBuffer::UnmapBuffer() { 486 ResourceProvider::ImageRasterBuffer::~ImageRasterBuffer() {
564 resource_provider()->UnmapImage(resource()); 487 }
488
489 void ResourceProvider::ImageRasterBuffer::MapBuffer() {
490 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
491 "ResourceProvider::ImageRasterBuffer::MapBuffer");
492
493 DCHECK(!mapped_buffer_);
494
495 stride_ = 0;
496 mapped_buffer_ = resource_provider_->MapImage(resource_, &stride_);
497 }
498
499 bool ResourceProvider::ImageRasterBuffer::UnmapBuffer() {
500 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
501 "ResourceProvider::ImageRasterBuffer::UnmapBuffer");
502
503 resource_provider_->UnmapImage(resource_);
reveman 2014/08/14 12:26:36 what if MapImage failed? it seems like it would be
auygun 2014/08/14 15:38:40 I've changed this so that it doesn't call UnmapIma
reveman 2014/08/14 16:14:38 I think the expectation is wrong. If mapImage fail
auygun 2014/08/15 09:20:40 Done.
504 mapped_buffer_ = NULL;
505 return raster_bitmap_changed_;
506 }
507
508 skia::RefPtr<SkCanvas> ResourceProvider::ImageRasterBuffer::AcquireSkCanvas() {
509 // Note that this function is called from a worker thread.
510 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
511 "ResourceProvider::ImageRasterBuffer::AcquireSkCanvas");
512
513 if (!mapped_buffer_)
514 return skia::RefPtr<SkCanvas>();
515
516 MakeBitmap(&raster_bitmap_,
517 mapped_buffer_,
518 resource_->format,
519 resource_->size,
520 stride_);
521 raster_bitmap_changed_ = true;
522 return skia::AdoptRef(new SkCanvas(raster_bitmap_));
523 }
524
525 void ResourceProvider::ImageRasterBuffer::ReleaseSkCanvas(
526 const skia::RefPtr<SkCanvas>& canvas) {
527 // Note that this function is called from a worker thread.
528 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
529 "ResourceProvider::ImageRasterBuffer::ReleaseSkCanvas");
530
531 SkColorType buffer_colorType = ResourceFormatToSkColorType(resource_->format);
532 if (mapped_buffer_ && (buffer_colorType != raster_bitmap_.colorType()))
533 CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_colorType);
534 raster_bitmap_.reset();
565 } 535 }
566 536
567 ResourceProvider::PixelRasterBuffer::PixelRasterBuffer( 537 ResourceProvider::PixelRasterBuffer::PixelRasterBuffer(
568 const Resource* resource, 538 const Resource* resource,
569 ResourceProvider* resource_provider) 539 ResourceProvider* resource_provider)
570 : BitmapRasterBuffer(resource, resource_provider) {} 540 : resource_(resource),
571 541 resource_provider_(resource_provider),
572 ResourceProvider::PixelRasterBuffer::~PixelRasterBuffer() {} 542 mapped_buffer_(NULL),
573 543 raster_bitmap_changed_(false),
574 uint8_t* ResourceProvider::PixelRasterBuffer::MapBuffer(int* stride) { 544 stride_(0) {
575 return resource_provider()->MapPixelBuffer(resource(), stride);
576 } 545 }
577 546
578 void ResourceProvider::PixelRasterBuffer::UnmapBuffer() { 547 ResourceProvider::PixelRasterBuffer::~PixelRasterBuffer() {
579 resource_provider()->UnmapPixelBuffer(resource()); 548 }
549
550 void ResourceProvider::PixelRasterBuffer::MapBuffer() {
551 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
552 "ResourceProvider::PixelRasterBuffer::MapBuffer");
553
554 DCHECK(!mapped_buffer_);
555
556 stride_ = 0;
557 mapped_buffer_ = resource_provider_->MapPixelBuffer(resource_, &stride_);
558 }
559
560 bool ResourceProvider::PixelRasterBuffer::UnmapBuffer() {
561 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
562 "ResourceProvider::PixelRasterBuffer::UnmapBuffer");
563
564 resource_provider_->UnmapPixelBuffer(resource_);
reveman 2014/08/14 12:26:36 Same here. What if MapPixelBuffer failed?
auygun 2014/08/15 09:20:40 Done.
565 mapped_buffer_ = NULL;
566 return raster_bitmap_changed_;
567 }
568
569 skia::RefPtr<SkCanvas> ResourceProvider::PixelRasterBuffer::AcquireSkCanvas() {
570 // Note that this function is called from a worker thread.
571 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
572 "ResourceProvider::PixelRasterBuffer::AcquireSkCanvas");
573
574 if (!mapped_buffer_)
575 return skia::RefPtr<SkCanvas>();
576
577 MakeBitmap(&raster_bitmap_,
578 mapped_buffer_,
579 resource_->format,
580 resource_->size,
581 stride_);
582 raster_bitmap_changed_ = true;
583 return skia::AdoptRef(new SkCanvas(raster_bitmap_));
584 }
585
586 void ResourceProvider::PixelRasterBuffer::ReleaseSkCanvas(
587 const skia::RefPtr<SkCanvas>& canvas) {
588 // Note that this function is called from a worker thread.
589 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
590 "ResourceProvider::PixelRasterBuffer::ReleaseSkCanvas");
591
592 SkColorType buffer_colorType = ResourceFormatToSkColorType(resource_->format);
593 if (mapped_buffer_ && (buffer_colorType != raster_bitmap_.colorType()))
594 CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_colorType);
595 raster_bitmap_.reset();
580 } 596 }
581 597
582 ResourceProvider::Child::Child() : marked_for_deletion(false) {} 598 ResourceProvider::Child::Child() : marked_for_deletion(false) {}
583 599
584 ResourceProvider::Child::~Child() {} 600 ResourceProvider::Child::~Child() {}
585 601
586 scoped_ptr<ResourceProvider> ResourceProvider::Create( 602 scoped_ptr<ResourceProvider> ResourceProvider::Create(
587 OutputSurface* output_surface, 603 OutputSurface* output_surface,
588 SharedBitmapManager* shared_bitmap_manager, 604 SharedBitmapManager* shared_bitmap_manager,
589 int highp_threshold_min, 605 int highp_threshold_min,
(...skipping 1130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1720 if (!to_return.empty()) 1736 if (!to_return.empty())
1721 child_info->return_callback.Run(to_return); 1737 child_info->return_callback.Run(to_return);
1722 1738
1723 if (child_info->marked_for_deletion && 1739 if (child_info->marked_for_deletion &&
1724 child_info->parent_to_child_map.empty()) { 1740 child_info->parent_to_child_map.empty()) {
1725 DCHECK(child_info->child_to_parent_map.empty()); 1741 DCHECK(child_info->child_to_parent_map.empty());
1726 children_.erase(child_it); 1742 children_.erase(child_it);
1727 } 1743 }
1728 } 1744 }
1729 1745
1730 SkCanvas* ResourceProvider::MapGpuRasterBuffer(ResourceId id) { 1746 RasterBuffer* ResourceProvider::AcquireGpuRasterBuffer(ResourceId id) {
1731 // Resource needs to be locked for write since GpuRasterBuffer writes 1747 // Resource needs to be locked for write since GpuRasterBuffer writes
1732 // directly to it. 1748 // directly to it.
1733 LockForWrite(id); 1749 LockForWrite(id);
1734 Resource* resource = GetResource(id); 1750 Resource* resource = GetResource(id);
1735 if (!resource->gpu_raster_buffer.get()) { 1751 if (!resource->gpu_raster_buffer.get()) {
1736 resource->gpu_raster_buffer.reset( 1752 resource->gpu_raster_buffer.reset(
1737 new GpuRasterBuffer(resource, this, use_distance_field_text_)); 1753 new GpuRasterBuffer(resource, this, use_distance_field_text_));
1738 } 1754 }
1739 return resource->gpu_raster_buffer->LockForWrite(); 1755 return resource->gpu_raster_buffer.get();
1740 } 1756 }
1741 1757
1742 void ResourceProvider::UnmapGpuRasterBuffer(ResourceId id) { 1758 void ResourceProvider::ReleaseGpuRasterBuffer(ResourceId id) {
1743 Resource* resource = GetResource(id); 1759 Resource* resource = GetResource(id);
1744 DCHECK(resource->gpu_raster_buffer.get()); 1760 DCHECK(resource->gpu_raster_buffer.get());
1745 resource->gpu_raster_buffer->UnlockForWrite();
1746 UnlockForWrite(id); 1761 UnlockForWrite(id);
1747 } 1762 }
1748 1763
1749 SkCanvas* ResourceProvider::MapImageRasterBuffer(ResourceId id) { 1764 RasterBuffer* ResourceProvider::AcquireImageRasterBuffer(ResourceId id) {
1750 Resource* resource = GetResource(id); 1765 Resource* resource = GetResource(id);
1751 AcquireImage(resource); 1766 AcquireImage(resource);
1752 if (!resource->image_raster_buffer.get()) 1767 if (!resource->image_raster_buffer.get())
1753 resource->image_raster_buffer.reset(new ImageRasterBuffer(resource, this)); 1768 resource->image_raster_buffer.reset(new ImageRasterBuffer(resource, this));
1754 return resource->image_raster_buffer->LockForWrite(); 1769 resource->image_raster_buffer->MapBuffer();
1770 return resource->image_raster_buffer.get();
1755 } 1771 }
1756 1772
1757 bool ResourceProvider::UnmapImageRasterBuffer(ResourceId id) { 1773 bool ResourceProvider::ReleaseImageRasterBuffer(ResourceId id) {
1758 Resource* resource = GetResource(id); 1774 Resource* resource = GetResource(id);
1759 resource->dirty_image = true; 1775 resource->dirty_image = true;
1760 return resource->image_raster_buffer->UnlockForWrite(); 1776 return resource->image_raster_buffer->UnmapBuffer();
1761 } 1777 }
1762 1778
1763 void ResourceProvider::AcquirePixelRasterBuffer(ResourceId id) { 1779 RasterBuffer* ResourceProvider::AcquirePixelRasterBuffer(ResourceId id) {
1764 Resource* resource = GetResource(id); 1780 Resource* resource = GetResource(id);
1765 AcquirePixelBuffer(resource); 1781 AcquirePixelBuffer(resource);
1766 resource->pixel_raster_buffer.reset(new PixelRasterBuffer(resource, this)); 1782 resource->pixel_raster_buffer.reset(new PixelRasterBuffer(resource, this));
1783 resource->pixel_raster_buffer->MapBuffer();
1784 return resource->pixel_raster_buffer.get();
1767 } 1785 }
1768 1786
1769 void ResourceProvider::ReleasePixelRasterBuffer(ResourceId id) { 1787 bool ResourceProvider::ReleasePixelRasterBuffer(ResourceId id) {
1770 Resource* resource = GetResource(id); 1788 Resource* resource = GetResource(id);
1789 DCHECK(resource->pixel_raster_buffer.get());
1790 bool raster_bitmap_changed = resource->pixel_raster_buffer->UnmapBuffer();
1771 resource->pixel_raster_buffer.reset(); 1791 resource->pixel_raster_buffer.reset();
1772 ReleasePixelBuffer(resource); 1792 ReleasePixelBuffer(resource);
1773 } 1793 return raster_bitmap_changed;
1774
1775 SkCanvas* ResourceProvider::MapPixelRasterBuffer(ResourceId id) {
1776 Resource* resource = GetResource(id);
1777 DCHECK(resource->pixel_raster_buffer.get());
1778 return resource->pixel_raster_buffer->LockForWrite();
1779 }
1780
1781 bool ResourceProvider::UnmapPixelRasterBuffer(ResourceId id) {
1782 Resource* resource = GetResource(id);
1783 DCHECK(resource->pixel_raster_buffer.get());
1784 return resource->pixel_raster_buffer->UnlockForWrite();
1785 } 1794 }
1786 1795
1787 void ResourceProvider::AcquirePixelBuffer(Resource* resource) { 1796 void ResourceProvider::AcquirePixelBuffer(Resource* resource) {
1788 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 1797 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
1789 "ResourceProvider::AcquirePixelBuffer"); 1798 "ResourceProvider::AcquirePixelBuffer");
1790 1799
1791 DCHECK(resource->origin == Resource::Internal); 1800 DCHECK(resource->origin == Resource::Internal);
1792 DCHECK_EQ(resource->exported_count, 0); 1801 DCHECK_EQ(resource->exported_count, 0);
1793 DCHECK(!resource->image_id); 1802 DCHECK(!resource->image_id);
1794 DCHECK_NE(ETC1, resource->format); 1803 DCHECK_NE(ETC1, resource->format);
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
1903 GLC(gl, gl->TexParameteri(target, GL_TEXTURE_MAG_FILTER, filter)); 1912 GLC(gl, gl->TexParameteri(target, GL_TEXTURE_MAG_FILTER, filter));
1904 resource->filter = filter; 1913 resource->filter = filter;
1905 } 1914 }
1906 1915
1907 if (resource->image_id && resource->dirty_image) 1916 if (resource->image_id && resource->dirty_image)
1908 BindImageForSampling(resource); 1917 BindImageForSampling(resource);
1909 1918
1910 return target; 1919 return target;
1911 } 1920 }
1912 1921
1922 bool ResourceProvider::TryBeginSetPixels(ResourceId id) {
1923 Resource* resource = GetResource(id);
1924 DCHECK(!resource->pending_set_pixels);
1925
1926 // Avoid upload if raster bitmap was not modified.
1927 DCHECK(resource->pixel_raster_buffer.get());
1928 if (!resource->pixel_raster_buffer->raster_bitmap_changed())
1929 return false;
1930
1931 BeginSetPixels(id);
1932 return true;
1933 }
1934
1913 void ResourceProvider::BeginSetPixels(ResourceId id) { 1935 void ResourceProvider::BeginSetPixels(ResourceId id) {
1914 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 1936 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
1915 "ResourceProvider::BeginSetPixels"); 1937 "ResourceProvider::BeginSetPixels");
1916 1938
1917 Resource* resource = GetResource(id); 1939 Resource* resource = GetResource(id);
1918 DCHECK(!resource->pending_set_pixels); 1940 DCHECK(!resource->pending_set_pixels);
1919 1941
1942 DCHECK(resource->pixel_raster_buffer.get());
1943 resource->pixel_raster_buffer->UnmapBuffer();
1944
1920 LazyCreate(resource); 1945 LazyCreate(resource);
1921 DCHECK(resource->origin == Resource::Internal); 1946 DCHECK(resource->origin == Resource::Internal);
1922 DCHECK(resource->gl_id || resource->allocated); 1947 DCHECK(resource->gl_id || resource->allocated);
1923 DCHECK(ReadLockFenceHasPassed(resource)); 1948 DCHECK(ReadLockFenceHasPassed(resource));
1924 DCHECK(!resource->image_id); 1949 DCHECK(!resource->image_id);
1925 1950
1926 bool allocate = !resource->allocated; 1951 bool allocate = !resource->allocated;
1927 resource->allocated = true; 1952 resource->allocated = true;
1928 LockForWrite(id); 1953 LockForWrite(id);
1929 1954
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1985 } 2010 }
1986 2011
1987 resource->set_pixels_completion_forced = true; 2012 resource->set_pixels_completion_forced = true;
1988 } 2013 }
1989 2014
1990 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { 2015 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) {
1991 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 2016 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
1992 "ResourceProvider::DidSetPixelsComplete"); 2017 "ResourceProvider::DidSetPixelsComplete");
1993 2018
1994 Resource* resource = GetResource(id); 2019 Resource* resource = GetResource(id);
2020
2021 // Upload can be avoided as a result of raster bitmap not being modified.
2022 // Assume the upload was completed in that case.
2023 if (!resource->pending_set_pixels)
2024 return true;
2025
1995 DCHECK(resource->locked_for_write); 2026 DCHECK(resource->locked_for_write);
1996 DCHECK(resource->pending_set_pixels);
1997 2027
1998 if (resource->gl_id) { 2028 if (resource->gl_id) {
1999 GLES2Interface* gl = ContextGL(); 2029 GLES2Interface* gl = ContextGL();
2000 DCHECK(gl); 2030 DCHECK(gl);
2001 DCHECK(resource->gl_upload_query_id); 2031 DCHECK(resource->gl_upload_query_id);
2002 GLuint complete = 1; 2032 GLuint complete = 1;
2003 gl->GetQueryObjectuivEXT( 2033 gl->GetQueryObjectuivEXT(
2004 resource->gl_upload_query_id, GL_QUERY_RESULT_AVAILABLE_EXT, &complete); 2034 resource->gl_upload_query_id, GL_QUERY_RESULT_AVAILABLE_EXT, &complete);
2005 if (!complete) 2035 if (!complete)
2006 return false; 2036 return false;
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
2252 ContextProvider* context_provider = output_surface_->context_provider(); 2282 ContextProvider* context_provider = output_surface_->context_provider();
2253 return context_provider ? context_provider->ContextGL() : NULL; 2283 return context_provider ? context_provider->ContextGL() : NULL;
2254 } 2284 }
2255 2285
2256 class GrContext* ResourceProvider::GrContext() const { 2286 class GrContext* ResourceProvider::GrContext() const {
2257 ContextProvider* context_provider = output_surface_->context_provider(); 2287 ContextProvider* context_provider = output_surface_->context_provider();
2258 return context_provider ? context_provider->GrContext() : NULL; 2288 return context_provider ? context_provider->GrContext() : NULL;
2259 } 2289 }
2260 2290
2261 } // namespace cc 2291 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698