OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |