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

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: Fix. Created 6 years, 3 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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 return kBGRA_8888_GrPixelConfig; 104 return kBGRA_8888_GrPixelConfig;
105 case RGBA_4444: 105 case RGBA_4444:
106 return kRGBA_4444_GrPixelConfig; 106 return kRGBA_4444_GrPixelConfig;
107 default: 107 default:
108 break; 108 break;
109 } 109 }
110 DCHECK(false) << "Unsupported resource format."; 110 DCHECK(false) << "Unsupported resource format.";
111 return kSkia8888_GrPixelConfig; 111 return kSkia8888_GrPixelConfig;
112 } 112 }
113 113
114 void MakeBitmap(SkBitmap* bitmap,
115 uint8_t* buffer,
116 ResourceFormat format,
117 const gfx::Size& size,
118 int stride) {
119 switch (format) {
120 case RGBA_4444:
121 // Use the default stride if we will eventually convert this
122 // bitmap to 4444.
123 bitmap->allocN32Pixels(size.width(), size.height());
124 break;
125 case RGBA_8888:
126 case BGRA_8888: {
127 SkImageInfo info =
128 SkImageInfo::MakeN32Premul(size.width(), size.height());
129 if (0 == stride)
130 stride = info.minRowBytes();
131 bitmap->installPixels(info, buffer, stride);
132 break;
133 }
134 case ALPHA_8:
135 case LUMINANCE_8:
136 case RGB_565:
137 case ETC1:
138 NOTREACHED();
139 break;
140 }
141 }
142
114 void CopyBitmap(const SkBitmap& src, uint8_t* dst, SkColorType dst_color_type) { 143 void CopyBitmap(const SkBitmap& src, uint8_t* dst, SkColorType dst_color_type) {
115 SkImageInfo dst_info = src.info(); 144 SkImageInfo dst_info = src.info();
116 dst_info.fColorType = dst_color_type; 145 dst_info.fColorType = dst_color_type;
117 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the 146 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the
118 // bitmap data. There will be no need to call SkAlign4 once crbug.com/293728 147 // bitmap data. There will be no need to call SkAlign4 once crbug.com/293728
119 // is fixed. 148 // is fixed.
120 const size_t dst_row_bytes = SkAlign4(dst_info.minRowBytes()); 149 const size_t dst_row_bytes = SkAlign4(dst_info.minRowBytes());
121 CHECK_EQ(0u, dst_row_bytes % 4); 150 CHECK_EQ(0u, dst_row_bytes % 4);
122 bool success = src.readPixels(dst_info, dst, dst_row_bytes, 0, 0); 151 bool success = src.readPixels(dst_info, dst, dst_row_bytes, 0, 0);
123 CHECK_EQ(true, success); 152 CHECK_EQ(true, success);
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 texture_pool(0), 411 texture_pool(0),
383 wrap_mode(wrap_mode), 412 wrap_mode(wrap_mode),
384 hint(TextureHintImmutable), 413 hint(TextureHintImmutable),
385 type(Bitmap), 414 type(Bitmap),
386 format(RGBA_8888), 415 format(RGBA_8888),
387 shared_bitmap_id(bitmap_id), 416 shared_bitmap_id(bitmap_id),
388 shared_bitmap(NULL) { 417 shared_bitmap(NULL) {
389 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); 418 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT);
390 } 419 }
391 420
392 ResourceProvider::RasterBuffer::RasterBuffer(
393 const Resource* resource,
394 ResourceProvider* resource_provider)
395 : resource_(resource),
396 resource_provider_(resource_provider),
397 locked_canvas_(NULL),
398 canvas_save_count_(0) {
399 DCHECK(resource_);
400 DCHECK(resource_provider_);
401 }
402
403 ResourceProvider::RasterBuffer::~RasterBuffer() {}
404
405 SkCanvas* ResourceProvider::RasterBuffer::LockForWrite() {
406 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
407 "ResourceProvider::RasterBuffer::LockForWrite");
408
409 DCHECK(!locked_canvas_);
410
411 locked_canvas_ = DoLockForWrite();
412 canvas_save_count_ = locked_canvas_ ? locked_canvas_->save() : 0;
413 return locked_canvas_;
414 }
415
416 bool ResourceProvider::RasterBuffer::UnlockForWrite() {
417 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
418 "ResourceProvider::RasterBuffer::UnlockForWrite");
419
420 if (locked_canvas_) {
421 locked_canvas_->restoreToCount(canvas_save_count_);
422 locked_canvas_ = NULL;
423 }
424 return DoUnlockForWrite();
425 }
426
427 ResourceProvider::GpuRasterBuffer::GpuRasterBuffer( 421 ResourceProvider::GpuRasterBuffer::GpuRasterBuffer(
428 const Resource* resource, 422 const Resource* resource,
429 ResourceProvider* resource_provider, 423 ResourceProvider* resource_provider,
430 bool use_distance_field_text) 424 bool use_distance_field_text)
431 : RasterBuffer(resource, resource_provider), 425 : resource_(resource), resource_provider_(resource_provider) {
432 surface_generation_id_(0u), 426 DCHECK_EQ(GLTexture, resource_->type);
433 use_distance_field_text_(use_distance_field_text) { 427 DCHECK(resource_->gl_id);
428
429 class GrContext* gr_context = resource_provider_->GrContext();
430 // TODO(alokp): Implement TestContextProvider::GrContext().
431 if (gr_context) {
432 GrBackendTextureDesc desc;
433 desc.fFlags = kRenderTarget_GrBackendTextureFlag;
434 desc.fWidth = resource_->size.width();
435 desc.fHeight = resource_->size.height();
436 desc.fConfig = ToGrPixelConfig(resource_->format);
437 desc.fOrigin = kTopLeft_GrSurfaceOrigin;
438 desc.fTextureHandle = resource_->gl_id;
439 skia::RefPtr<GrTexture> gr_texture =
440 skia::AdoptRef(gr_context->wrapBackendTexture(desc));
441 SkSurface::TextRenderMode text_render_mode =
442 use_distance_field_text ? SkSurface::kDistanceField_TextRenderMode
443 : SkSurface::kStandard_TextRenderMode;
444 surface_ = skia::AdoptRef(SkSurface::NewRenderTargetDirect(
445 gr_texture->asRenderTarget(), text_render_mode));
446 }
434 } 447 }
435 448
436 ResourceProvider::GpuRasterBuffer::~GpuRasterBuffer() { 449 ResourceProvider::GpuRasterBuffer::~GpuRasterBuffer() {
437 } 450 }
438 451
439 SkCanvas* ResourceProvider::GpuRasterBuffer::DoLockForWrite() { 452 skia::RefPtr<SkCanvas> ResourceProvider::GpuRasterBuffer::AcquireSkCanvas() {
440 if (!surface_) 453 // Note that this function is called from a worker thread.
441 surface_ = CreateSurface(); 454 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
442 surface_generation_id_ = surface_ ? surface_->generationID() : 0u; 455 "ResourceProvider::GpuRasterBuffer::AcquireSkCanvas");
443 return surface_ ? surface_->getCanvas() : NULL; 456
457 return surface_ ? skia::SharePtr(surface_->getCanvas())
458 : skia::RefPtr<SkCanvas>();
444 } 459 }
445 460
446 bool ResourceProvider::GpuRasterBuffer::DoUnlockForWrite() { 461 void ResourceProvider::GpuRasterBuffer::ReleaseSkCanvas(
447 // generationID returns a non-zero, unique value corresponding to the content 462 const skia::RefPtr<SkCanvas>& canvas) {
448 // of surface. Hence, a change since DoLockForWrite was called means the 463 // Note that this function is called from a worker thread.
449 // surface has changed. 464 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
450 return surface_ ? surface_generation_id_ != surface_->generationID() : false; 465 "ResourceProvider::GpuRasterBuffer::ReleaseSkCanvas");
451 }
452
453 skia::RefPtr<SkSurface> ResourceProvider::GpuRasterBuffer::CreateSurface() {
454 DCHECK_EQ(GLTexture, resource()->type);
455 DCHECK(resource()->gl_id);
456
457 class GrContext* gr_context = resource_provider()->GrContext();
458 // TODO(alokp): Implement TestContextProvider::GrContext().
459 if (!gr_context)
460 return skia::RefPtr<SkSurface>();
461
462 GrBackendTextureDesc desc;
463 desc.fFlags = kRenderTarget_GrBackendTextureFlag;
464 desc.fWidth = resource()->size.width();
465 desc.fHeight = resource()->size.height();
466 desc.fConfig = ToGrPixelConfig(resource()->format);
467 desc.fOrigin = kTopLeft_GrSurfaceOrigin;
468 desc.fTextureHandle = resource()->gl_id;
469 skia::RefPtr<GrTexture> gr_texture =
470 skia::AdoptRef(gr_context->wrapBackendTexture(desc));
471 SkSurface::TextRenderMode text_render_mode =
472 use_distance_field_text_ ? SkSurface::kDistanceField_TextRenderMode
473 : SkSurface::kStandard_TextRenderMode;
474 return skia::AdoptRef(SkSurface::NewRenderTargetDirect(
475 gr_texture->asRenderTarget(), text_render_mode));
476 }
477
478 ResourceProvider::BitmapRasterBuffer::BitmapRasterBuffer(
479 const Resource* resource,
480 ResourceProvider* resource_provider)
481 : RasterBuffer(resource, resource_provider),
482 mapped_buffer_(NULL),
483 raster_bitmap_generation_id_(0u) {}
484
485 ResourceProvider::BitmapRasterBuffer::~BitmapRasterBuffer() {}
486
487 SkCanvas* ResourceProvider::BitmapRasterBuffer::DoLockForWrite() {
488 DCHECK(!mapped_buffer_);
489 DCHECK(!raster_canvas_);
490
491 int stride = 0;
492 mapped_buffer_ = MapBuffer(&stride);
493 if (!mapped_buffer_)
494 return NULL;
495
496 switch (resource()->format) {
497 case RGBA_4444:
498 // Use the default stride if we will eventually convert this
499 // bitmap to 4444.
500 raster_bitmap_.allocN32Pixels(resource()->size.width(),
501 resource()->size.height());
502 break;
503 case RGBA_8888:
504 case BGRA_8888: {
505 SkImageInfo info = SkImageInfo::MakeN32Premul(resource()->size.width(),
506 resource()->size.height());
507 if (0 == stride)
508 stride = info.minRowBytes();
509 raster_bitmap_.installPixels(info, mapped_buffer_, stride);
510 break;
511 }
512 case ALPHA_8:
513 case LUMINANCE_8:
514 case RGB_565:
515 case ETC1:
516 NOTREACHED();
517 break;
518 }
519 raster_canvas_ = skia::AdoptRef(new SkCanvas(raster_bitmap_));
520 raster_bitmap_generation_id_ = raster_bitmap_.getGenerationID();
521 return raster_canvas_.get();
522 }
523
524 bool ResourceProvider::BitmapRasterBuffer::DoUnlockForWrite() {
525 raster_canvas_.clear();
526
527 // getGenerationID returns a non-zero, unique value corresponding to the
528 // pixels in bitmap. Hence, a change since DoLockForWrite was called means the
529 // bitmap has changed.
530 bool raster_bitmap_changed =
531 raster_bitmap_generation_id_ != raster_bitmap_.getGenerationID();
532
533 if (raster_bitmap_changed) {
534 SkColorType buffer_colorType =
535 ResourceFormatToSkColorType(resource()->format);
536 if (mapped_buffer_ && (buffer_colorType != raster_bitmap_.colorType()))
537 CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_colorType);
538 }
539 raster_bitmap_.reset();
540
541 UnmapBuffer();
542 mapped_buffer_ = NULL;
543 return raster_bitmap_changed;
544 } 466 }
545 467
546 ResourceProvider::ImageRasterBuffer::ImageRasterBuffer( 468 ResourceProvider::ImageRasterBuffer::ImageRasterBuffer(
547 const Resource* resource, 469 const Resource* resource,
548 ResourceProvider* resource_provider) 470 ResourceProvider* resource_provider)
549 : BitmapRasterBuffer(resource, resource_provider) {} 471 : resource_(resource),
550 472 resource_provider_(resource_provider),
551 ResourceProvider::ImageRasterBuffer::~ImageRasterBuffer() {} 473 mapped_buffer_(NULL),
552 474 raster_bitmap_changed_(false),
553 uint8_t* ResourceProvider::ImageRasterBuffer::MapBuffer(int* stride) { 475 stride_(0) {
554 return resource_provider()->MapImage(resource(), stride);
555 } 476 }
556 477
557 void ResourceProvider::ImageRasterBuffer::UnmapBuffer() { 478 ResourceProvider::ImageRasterBuffer::~ImageRasterBuffer() {
558 resource_provider()->UnmapImage(resource()); 479 }
480
481 void ResourceProvider::ImageRasterBuffer::MapBuffer() {
482 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
483 "ResourceProvider::ImageRasterBuffer::MapBuffer");
484
485 DCHECK(!mapped_buffer_);
486
487 stride_ = 0;
488 mapped_buffer_ = resource_provider_->MapImage(resource_, &stride_);
489 raster_bitmap_changed_ = false;
490 }
491
492 bool ResourceProvider::ImageRasterBuffer::UnmapBuffer() {
493 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
494 "ResourceProvider::ImageRasterBuffer::UnmapBuffer");
495
496 if (mapped_buffer_) {
497 resource_provider_->UnmapImage(resource_);
498 mapped_buffer_ = NULL;
499 }
500 return raster_bitmap_changed_;
501 }
502
503 skia::RefPtr<SkCanvas> ResourceProvider::ImageRasterBuffer::AcquireSkCanvas() {
504 // Note that this function is called from a worker thread.
505 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
506 "ResourceProvider::ImageRasterBuffer::AcquireSkCanvas");
507
508 if (!mapped_buffer_)
509 return skia::RefPtr<SkCanvas>();
510
511 MakeBitmap(&raster_bitmap_,
512 mapped_buffer_,
513 resource_->format,
514 resource_->size,
515 stride_);
516 raster_bitmap_changed_ = true;
517 return skia::AdoptRef(new SkCanvas(raster_bitmap_));
518 }
519
520 void ResourceProvider::ImageRasterBuffer::ReleaseSkCanvas(
521 const skia::RefPtr<SkCanvas>& canvas) {
522 // Note that this function is called from a worker thread.
523 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
524 "ResourceProvider::ImageRasterBuffer::ReleaseSkCanvas");
525
526 SkColorType buffer_colorType = ResourceFormatToSkColorType(resource_->format);
527 if (mapped_buffer_ && (buffer_colorType != raster_bitmap_.colorType()))
528 CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_colorType);
529 raster_bitmap_.reset();
559 } 530 }
560 531
561 ResourceProvider::PixelRasterBuffer::PixelRasterBuffer( 532 ResourceProvider::PixelRasterBuffer::PixelRasterBuffer(
562 const Resource* resource, 533 const Resource* resource,
563 ResourceProvider* resource_provider) 534 ResourceProvider* resource_provider)
564 : BitmapRasterBuffer(resource, resource_provider) {} 535 : resource_(resource),
565 536 resource_provider_(resource_provider),
566 ResourceProvider::PixelRasterBuffer::~PixelRasterBuffer() {} 537 mapped_buffer_(NULL),
567 538 raster_bitmap_changed_(false),
568 uint8_t* ResourceProvider::PixelRasterBuffer::MapBuffer(int* stride) { 539 stride_(0) {
569 return resource_provider()->MapPixelBuffer(resource(), stride);
570 } 540 }
571 541
572 void ResourceProvider::PixelRasterBuffer::UnmapBuffer() { 542 ResourceProvider::PixelRasterBuffer::~PixelRasterBuffer() {
573 resource_provider()->UnmapPixelBuffer(resource()); 543 }
544
545 void ResourceProvider::PixelRasterBuffer::MapBuffer() {
546 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
547 "ResourceProvider::PixelRasterBuffer::MapBuffer");
548
549 DCHECK(!mapped_buffer_);
550
551 stride_ = 0;
552 mapped_buffer_ = resource_provider_->MapPixelBuffer(resource_, &stride_);
553 raster_bitmap_changed_ = false;
554 }
555
556 bool ResourceProvider::PixelRasterBuffer::UnmapBuffer() {
557 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
558 "ResourceProvider::PixelRasterBuffer::UnmapBuffer");
559
560 if (mapped_buffer_) {
561 resource_provider_->UnmapPixelBuffer(resource_);
562 mapped_buffer_ = NULL;
563 }
564 return raster_bitmap_changed_;
565 }
566
567 skia::RefPtr<SkCanvas> ResourceProvider::PixelRasterBuffer::AcquireSkCanvas() {
568 // Note that this function is called from a worker thread.
569 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
570 "ResourceProvider::PixelRasterBuffer::AcquireSkCanvas");
571
572 if (!mapped_buffer_)
573 return skia::RefPtr<SkCanvas>();
574
575 MakeBitmap(&raster_bitmap_,
576 mapped_buffer_,
577 resource_->format,
578 resource_->size,
579 stride_);
580 raster_bitmap_changed_ = true;
581 return skia::AdoptRef(new SkCanvas(raster_bitmap_));
582 }
583
584 void ResourceProvider::PixelRasterBuffer::ReleaseSkCanvas(
585 const skia::RefPtr<SkCanvas>& canvas) {
586 // Note that this function is called from a worker thread.
587 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
588 "ResourceProvider::PixelRasterBuffer::ReleaseSkCanvas");
589
590 SkColorType buffer_colorType = ResourceFormatToSkColorType(resource_->format);
591 if (mapped_buffer_ && (buffer_colorType != raster_bitmap_.colorType()))
592 CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_colorType);
593 raster_bitmap_.reset();
574 } 594 }
575 595
576 ResourceProvider::Child::Child() : marked_for_deletion(false) {} 596 ResourceProvider::Child::Child() : marked_for_deletion(false) {}
577 597
578 ResourceProvider::Child::~Child() {} 598 ResourceProvider::Child::~Child() {}
579 599
580 scoped_ptr<ResourceProvider> ResourceProvider::Create( 600 scoped_ptr<ResourceProvider> ResourceProvider::Create(
581 OutputSurface* output_surface, 601 OutputSurface* output_surface,
582 SharedBitmapManager* shared_bitmap_manager, 602 SharedBitmapManager* shared_bitmap_manager,
583 int highp_threshold_min, 603 int highp_threshold_min,
(...skipping 1131 matching lines...) Expand 10 before | Expand all | Expand 10 after
1715 if (!to_return.empty()) 1735 if (!to_return.empty())
1716 child_info->return_callback.Run(to_return); 1736 child_info->return_callback.Run(to_return);
1717 1737
1718 if (child_info->marked_for_deletion && 1738 if (child_info->marked_for_deletion &&
1719 child_info->parent_to_child_map.empty()) { 1739 child_info->parent_to_child_map.empty()) {
1720 DCHECK(child_info->child_to_parent_map.empty()); 1740 DCHECK(child_info->child_to_parent_map.empty());
1721 children_.erase(child_it); 1741 children_.erase(child_it);
1722 } 1742 }
1723 } 1743 }
1724 1744
1725 SkCanvas* ResourceProvider::MapGpuRasterBuffer(ResourceId id) { 1745 RasterBuffer* ResourceProvider::AcquireGpuRasterBuffer(ResourceId id) {
1726 // Resource needs to be locked for write since GpuRasterBuffer writes 1746 // Resource needs to be locked for write since GpuRasterBuffer writes
1727 // directly to it. 1747 // directly to it.
1728 LockForWrite(id); 1748 LockForWrite(id);
1729 Resource* resource = GetResource(id); 1749 Resource* resource = GetResource(id);
1730 if (!resource->gpu_raster_buffer.get()) { 1750 if (!resource->gpu_raster_buffer.get()) {
1731 resource->gpu_raster_buffer.reset( 1751 resource->gpu_raster_buffer.reset(
1732 new GpuRasterBuffer(resource, this, use_distance_field_text_)); 1752 new GpuRasterBuffer(resource, this, use_distance_field_text_));
1733 } 1753 }
1734 return resource->gpu_raster_buffer->LockForWrite(); 1754 return resource->gpu_raster_buffer.get();
1735 } 1755 }
1736 1756
1737 void ResourceProvider::UnmapGpuRasterBuffer(ResourceId id) { 1757 void ResourceProvider::ReleaseGpuRasterBuffer(ResourceId id) {
1738 Resource* resource = GetResource(id); 1758 Resource* resource = GetResource(id);
1739 DCHECK(resource->gpu_raster_buffer.get()); 1759 DCHECK(resource->gpu_raster_buffer.get());
1740 resource->gpu_raster_buffer->UnlockForWrite();
1741 UnlockForWrite(id); 1760 UnlockForWrite(id);
1742 } 1761 }
1743 1762
1744 SkCanvas* ResourceProvider::MapImageRasterBuffer(ResourceId id) { 1763 RasterBuffer* ResourceProvider::AcquireImageRasterBuffer(ResourceId id) {
1745 Resource* resource = GetResource(id); 1764 Resource* resource = GetResource(id);
1746 AcquireImage(resource); 1765 AcquireImage(resource);
1747 if (!resource->image_raster_buffer.get()) 1766 if (!resource->image_raster_buffer.get())
1748 resource->image_raster_buffer.reset(new ImageRasterBuffer(resource, this)); 1767 resource->image_raster_buffer.reset(new ImageRasterBuffer(resource, this));
1749 return resource->image_raster_buffer->LockForWrite(); 1768 resource->image_raster_buffer->MapBuffer();
1769 return resource->image_raster_buffer.get();
1750 } 1770 }
1751 1771
1752 bool ResourceProvider::UnmapImageRasterBuffer(ResourceId id) { 1772 bool ResourceProvider::ReleaseImageRasterBuffer(ResourceId id) {
1753 Resource* resource = GetResource(id); 1773 Resource* resource = GetResource(id);
1754 resource->dirty_image = true; 1774 resource->dirty_image = true;
1755 return resource->image_raster_buffer->UnlockForWrite(); 1775 return resource->image_raster_buffer->UnmapBuffer();
1756 } 1776 }
1757 1777
1758 void ResourceProvider::AcquirePixelRasterBuffer(ResourceId id) { 1778 RasterBuffer* ResourceProvider::AcquirePixelRasterBuffer(ResourceId id) {
1759 Resource* resource = GetResource(id); 1779 Resource* resource = GetResource(id);
1760 AcquirePixelBuffer(resource); 1780 AcquirePixelBuffer(resource);
1761 resource->pixel_raster_buffer.reset(new PixelRasterBuffer(resource, this)); 1781 resource->pixel_raster_buffer.reset(new PixelRasterBuffer(resource, this));
1782 resource->pixel_raster_buffer->MapBuffer();
1783 return resource->pixel_raster_buffer.get();
1762 } 1784 }
1763 1785
1764 void ResourceProvider::ReleasePixelRasterBuffer(ResourceId id) { 1786 bool ResourceProvider::ReleasePixelRasterBuffer(ResourceId id) {
1765 Resource* resource = GetResource(id); 1787 Resource* resource = GetResource(id);
1788 DCHECK(resource->pixel_raster_buffer.get());
1789 bool raster_bitmap_changed = resource->pixel_raster_buffer->UnmapBuffer();
1766 resource->pixel_raster_buffer.reset(); 1790 resource->pixel_raster_buffer.reset();
1767 ReleasePixelBuffer(resource); 1791 ReleasePixelBuffer(resource);
1768 } 1792 return raster_bitmap_changed;
1769
1770 SkCanvas* ResourceProvider::MapPixelRasterBuffer(ResourceId id) {
1771 Resource* resource = GetResource(id);
1772 DCHECK(resource->pixel_raster_buffer.get());
1773 return resource->pixel_raster_buffer->LockForWrite();
1774 }
1775
1776 bool ResourceProvider::UnmapPixelRasterBuffer(ResourceId id) {
1777 Resource* resource = GetResource(id);
1778 DCHECK(resource->pixel_raster_buffer.get());
1779 return resource->pixel_raster_buffer->UnlockForWrite();
1780 } 1793 }
1781 1794
1782 void ResourceProvider::AcquirePixelBuffer(Resource* resource) { 1795 void ResourceProvider::AcquirePixelBuffer(Resource* resource) {
1783 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 1796 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
1784 "ResourceProvider::AcquirePixelBuffer"); 1797 "ResourceProvider::AcquirePixelBuffer");
1785 1798
1786 DCHECK(resource->origin == Resource::Internal); 1799 DCHECK(resource->origin == Resource::Internal);
1787 DCHECK_EQ(resource->exported_count, 0); 1800 DCHECK_EQ(resource->exported_count, 0);
1788 DCHECK(!resource->image_id); 1801 DCHECK(!resource->image_id);
1789 DCHECK_NE(ETC1, resource->format); 1802 DCHECK_NE(ETC1, resource->format);
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1905 return target; 1918 return target;
1906 } 1919 }
1907 1920
1908 void ResourceProvider::BeginSetPixels(ResourceId id) { 1921 void ResourceProvider::BeginSetPixels(ResourceId id) {
1909 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 1922 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
1910 "ResourceProvider::BeginSetPixels"); 1923 "ResourceProvider::BeginSetPixels");
1911 1924
1912 Resource* resource = GetResource(id); 1925 Resource* resource = GetResource(id);
1913 DCHECK(!resource->pending_set_pixels); 1926 DCHECK(!resource->pending_set_pixels);
1914 1927
1928 DCHECK(resource->pixel_raster_buffer.get());
1929 bool raster_bitmap_changed = resource->pixel_raster_buffer->UnmapBuffer();
1930 if (!raster_bitmap_changed)
1931 return;
1932
1915 LazyCreate(resource); 1933 LazyCreate(resource);
1916 DCHECK(resource->origin == Resource::Internal); 1934 DCHECK(resource->origin == Resource::Internal);
1917 DCHECK(resource->gl_id || resource->allocated); 1935 DCHECK(resource->gl_id || resource->allocated);
1918 DCHECK(ReadLockFenceHasPassed(resource)); 1936 DCHECK(ReadLockFenceHasPassed(resource));
1919 DCHECK(!resource->image_id); 1937 DCHECK(!resource->image_id);
1920 1938
1921 bool allocate = !resource->allocated; 1939 bool allocate = !resource->allocated;
1922 resource->allocated = true; 1940 resource->allocated = true;
1923 LockForWrite(id); 1941 LockForWrite(id);
1924 1942
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1961 1979
1962 resource->pending_set_pixels = true; 1980 resource->pending_set_pixels = true;
1963 resource->set_pixels_completion_forced = false; 1981 resource->set_pixels_completion_forced = false;
1964 } 1982 }
1965 1983
1966 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { 1984 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) {
1967 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 1985 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
1968 "ResourceProvider::ForceSetPixelsToComplete"); 1986 "ResourceProvider::ForceSetPixelsToComplete");
1969 1987
1970 Resource* resource = GetResource(id); 1988 Resource* resource = GetResource(id);
1989
1990 if (!resource->pending_set_pixels)
1991 return;
1992
1971 DCHECK(resource->locked_for_write); 1993 DCHECK(resource->locked_for_write);
1972 DCHECK(resource->pending_set_pixels);
1973 DCHECK(!resource->set_pixels_completion_forced); 1994 DCHECK(!resource->set_pixels_completion_forced);
1974 1995
1975 if (resource->gl_id) { 1996 if (resource->gl_id) {
1976 GLES2Interface* gl = ContextGL(); 1997 GLES2Interface* gl = ContextGL();
1977 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); 1998 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id));
1978 GLC(gl, gl->WaitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); 1999 GLC(gl, gl->WaitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D));
1979 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, 0)); 2000 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, 0));
1980 } 2001 }
1981 2002
1982 resource->set_pixels_completion_forced = true; 2003 resource->set_pixels_completion_forced = true;
1983 } 2004 }
1984 2005
1985 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { 2006 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) {
1986 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 2007 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
1987 "ResourceProvider::DidSetPixelsComplete"); 2008 "ResourceProvider::DidSetPixelsComplete");
1988 2009
1989 Resource* resource = GetResource(id); 2010 Resource* resource = GetResource(id);
2011
2012 // Upload can be avoided as a result of raster bitmap not being modified.
2013 // Assume the upload was completed in that case.
2014 if (!resource->pending_set_pixels)
2015 return true;
2016
1990 DCHECK(resource->locked_for_write); 2017 DCHECK(resource->locked_for_write);
1991 DCHECK(resource->pending_set_pixels);
1992 2018
1993 if (resource->gl_id) { 2019 if (resource->gl_id) {
1994 GLES2Interface* gl = ContextGL(); 2020 GLES2Interface* gl = ContextGL();
1995 DCHECK(gl); 2021 DCHECK(gl);
1996 DCHECK(resource->gl_upload_query_id); 2022 DCHECK(resource->gl_upload_query_id);
1997 GLuint complete = 1; 2023 GLuint complete = 1;
1998 gl->GetQueryObjectuivEXT( 2024 gl->GetQueryObjectuivEXT(
1999 resource->gl_upload_query_id, GL_QUERY_RESULT_AVAILABLE_EXT, &complete); 2025 resource->gl_upload_query_id, GL_QUERY_RESULT_AVAILABLE_EXT, &complete);
2000 if (!complete) 2026 if (!complete)
2001 return false; 2027 return false;
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
2264 ContextProvider* context_provider = output_surface_->context_provider().get(); 2290 ContextProvider* context_provider = output_surface_->context_provider().get();
2265 return context_provider ? context_provider->ContextGL() : NULL; 2291 return context_provider ? context_provider->ContextGL() : NULL;
2266 } 2292 }
2267 2293
2268 class GrContext* ResourceProvider::GrContext() const { 2294 class GrContext* ResourceProvider::GrContext() const {
2269 ContextProvider* context_provider = output_surface_->context_provider().get(); 2295 ContextProvider* context_provider = output_surface_->context_provider().get();
2270 return context_provider ? context_provider->GrContext() : NULL; 2296 return context_provider ? context_provider->GrContext() : NULL;
2271 } 2297 }
2272 2298
2273 } // namespace cc 2299 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698