| 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" |
| 11 #include "base/debug/trace_event.h" | 11 #include "base/debug/trace_event.h" |
| 12 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
| 13 #include "base/strings/string_split.h" | 13 #include "base/strings/string_split.h" |
| 14 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
| 15 #include "cc/base/util.h" | 15 #include "cc/base/util.h" |
| 16 #include "cc/output/gl_renderer.h" // For the GLC() macro. | 16 #include "cc/output/gl_renderer.h" // For the GLC() macro. |
| 17 #include "cc/resources/platform_color.h" | 17 #include "cc/resources/platform_color.h" |
| 18 #include "cc/resources/returned_resource.h" | 18 #include "cc/resources/returned_resource.h" |
| 19 #include "cc/resources/shared_bitmap_manager.h" | 19 #include "cc/resources/shared_bitmap_manager.h" |
| 20 #include "cc/resources/texture_uploader.h" | 20 #include "cc/resources/texture_uploader.h" |
| 21 #include "cc/resources/transferable_resource.h" | 21 #include "cc/resources/transferable_resource.h" |
| 22 #include "gpu/GLES2/gl2extchromium.h" | 22 #include "gpu/GLES2/gl2extchromium.h" |
| 23 #include "gpu/command_buffer/client/gles2_interface.h" | 23 #include "gpu/command_buffer/client/gles2_interface.h" |
| 24 #include "third_party/khronos/GLES2/gl2.h" | 24 #include "third_party/khronos/GLES2/gl2.h" |
| 25 #include "third_party/khronos/GLES2/gl2ext.h" | 25 #include "third_party/khronos/GLES2/gl2ext.h" |
| 26 #include "third_party/skia/include/core/SkSurface.h" | 26 #include "third_party/skia/include/core/SkSurface.h" |
| 27 #include "third_party/skia/include/gpu/GrContext.h" | 27 #include "third_party/skia/include/gpu/GrContext.h" |
| 28 #include "third_party/skia/include/utils/SkNullCanvas.h" | |
| 29 #include "ui/gfx/frame_time.h" | 28 #include "ui/gfx/frame_time.h" |
| 30 #include "ui/gfx/rect.h" | 29 #include "ui/gfx/rect.h" |
| 31 #include "ui/gfx/vector2d.h" | 30 #include "ui/gfx/vector2d.h" |
| 32 | 31 |
| 33 using gpu::gles2::GLES2Interface; | 32 using gpu::gles2::GLES2Interface; |
| 34 | 33 |
| 35 namespace cc { | 34 namespace cc { |
| 36 | 35 |
| 37 class IdAllocator { | 36 class IdAllocator { |
| 38 public: | 37 public: |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 return kBGRA_8888_GrPixelConfig; | 104 return kBGRA_8888_GrPixelConfig; |
| 106 case RGBA_4444: | 105 case RGBA_4444: |
| 107 return kRGBA_4444_GrPixelConfig; | 106 return kRGBA_4444_GrPixelConfig; |
| 108 default: | 107 default: |
| 109 break; | 108 break; |
| 110 } | 109 } |
| 111 DCHECK(false) << "Unsupported resource format."; | 110 DCHECK(false) << "Unsupported resource format."; |
| 112 return kSkia8888_GrPixelConfig; | 111 return kSkia8888_GrPixelConfig; |
| 113 } | 112 } |
| 114 | 113 |
| 115 void MakeBitmap(SkBitmap* bitmap, | |
| 116 uint8_t* buffer, | |
| 117 ResourceFormat format, | |
| 118 const gfx::Size& size, | |
| 119 int stride) { | |
| 120 switch (format) { | |
| 121 case RGBA_4444: | |
| 122 // Use the default stride if we will eventually convert this | |
| 123 // bitmap to 4444. | |
| 124 bitmap->allocN32Pixels(size.width(), size.height()); | |
| 125 break; | |
| 126 case RGBA_8888: | |
| 127 case BGRA_8888: { | |
| 128 SkImageInfo info = | |
| 129 SkImageInfo::MakeN32Premul(size.width(), size.height()); | |
| 130 if (0 == stride) | |
| 131 stride = info.minRowBytes(); | |
| 132 bitmap->installPixels(info, buffer, stride); | |
| 133 break; | |
| 134 } | |
| 135 case ALPHA_8: | |
| 136 case LUMINANCE_8: | |
| 137 case RGB_565: | |
| 138 case ETC1: | |
| 139 NOTREACHED(); | |
| 140 break; | |
| 141 } | |
| 142 } | |
| 143 | |
| 144 void CopyBitmap(const SkBitmap& src, uint8_t* dst, SkColorType dst_color_type) { | |
| 145 SkImageInfo dst_info = src.info(); | |
| 146 dst_info.fColorType = dst_color_type; | |
| 147 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the | |
| 148 // bitmap data. There will be no need to call SkAlign4 once crbug.com/293728 | |
| 149 // is fixed. | |
| 150 const size_t dst_row_bytes = SkAlign4(dst_info.minRowBytes()); | |
| 151 CHECK_EQ(0u, dst_row_bytes % 4); | |
| 152 bool success = src.readPixels(dst_info, dst, dst_row_bytes, 0, 0); | |
| 153 CHECK_EQ(true, success); | |
| 154 } | |
| 155 | |
| 156 class ScopedSetActiveTexture { | 114 class ScopedSetActiveTexture { |
| 157 public: | 115 public: |
| 158 ScopedSetActiveTexture(GLES2Interface* gl, GLenum unit) | 116 ScopedSetActiveTexture(GLES2Interface* gl, GLenum unit) |
| 159 : gl_(gl), unit_(unit) { | 117 : gl_(gl), unit_(unit) { |
| 160 DCHECK_EQ(GL_TEXTURE0, ResourceProvider::GetActiveTextureUnit(gl_)); | 118 DCHECK_EQ(GL_TEXTURE0, ResourceProvider::GetActiveTextureUnit(gl_)); |
| 161 | 119 |
| 162 if (unit_ != GL_TEXTURE0) | 120 if (unit_ != GL_TEXTURE0) |
| 163 GLC(gl_, gl_->ActiveTexture(unit_)); | 121 GLC(gl_, gl_->ActiveTexture(unit_)); |
| 164 } | 122 } |
| 165 | 123 |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 texture_pool(0), | 370 texture_pool(0), |
| 413 wrap_mode(wrap_mode), | 371 wrap_mode(wrap_mode), |
| 414 hint(TextureHintImmutable), | 372 hint(TextureHintImmutable), |
| 415 type(Bitmap), | 373 type(Bitmap), |
| 416 format(RGBA_8888), | 374 format(RGBA_8888), |
| 417 shared_bitmap_id(bitmap_id), | 375 shared_bitmap_id(bitmap_id), |
| 418 shared_bitmap(NULL) { | 376 shared_bitmap(NULL) { |
| 419 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); | 377 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); |
| 420 } | 378 } |
| 421 | 379 |
| 422 ResourceProvider::GpuRasterBuffer::GpuRasterBuffer( | |
| 423 const Resource* resource, | |
| 424 ResourceProvider* resource_provider, | |
| 425 bool use_distance_field_text) | |
| 426 : resource_(resource), resource_provider_(resource_provider) { | |
| 427 DCHECK_EQ(GLTexture, resource_->type); | |
| 428 DCHECK(resource_->gl_id); | |
| 429 | |
| 430 class GrContext* gr_context = resource_provider_->GrContext(); | |
| 431 // TODO(alokp): Implement TestContextProvider::GrContext(). | |
| 432 if (gr_context) { | |
| 433 GrBackendTextureDesc desc; | |
| 434 desc.fFlags = kRenderTarget_GrBackendTextureFlag; | |
| 435 desc.fWidth = resource_->size.width(); | |
| 436 desc.fHeight = resource_->size.height(); | |
| 437 desc.fConfig = ToGrPixelConfig(resource_->format); | |
| 438 desc.fOrigin = kTopLeft_GrSurfaceOrigin; | |
| 439 desc.fTextureHandle = resource_->gl_id; | |
| 440 skia::RefPtr<GrTexture> gr_texture = | |
| 441 skia::AdoptRef(gr_context->wrapBackendTexture(desc)); | |
| 442 SkSurface::TextRenderMode text_render_mode = | |
| 443 use_distance_field_text ? SkSurface::kDistanceField_TextRenderMode | |
| 444 : SkSurface::kStandard_TextRenderMode; | |
| 445 surface_ = skia::AdoptRef(SkSurface::NewRenderTargetDirect( | |
| 446 gr_texture->asRenderTarget(), text_render_mode)); | |
| 447 } | |
| 448 } | |
| 449 | |
| 450 ResourceProvider::GpuRasterBuffer::~GpuRasterBuffer() { | |
| 451 } | |
| 452 | |
| 453 skia::RefPtr<SkCanvas> ResourceProvider::GpuRasterBuffer::AcquireSkCanvas() { | |
| 454 // Note that this function is called from a worker thread. | |
| 455 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | |
| 456 "ResourceProvider::GpuRasterBuffer::AcquireSkCanvas"); | |
| 457 | |
| 458 skia::RefPtr<SkCanvas> canvas = surface_ | |
| 459 ? skia::SharePtr(surface_->getCanvas()) | |
| 460 : skia::AdoptRef(SkCreateNullCanvas()); | |
| 461 canvas->save(); | |
| 462 return canvas; | |
| 463 } | |
| 464 | |
| 465 void ResourceProvider::GpuRasterBuffer::ReleaseSkCanvas( | |
| 466 const skia::RefPtr<SkCanvas>& canvas) { | |
| 467 // Note that this function is called from a worker thread. | |
| 468 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | |
| 469 "ResourceProvider::GpuRasterBuffer::ReleaseSkCanvas"); | |
| 470 | |
| 471 canvas->restore(); | |
| 472 } | |
| 473 | |
| 474 ResourceProvider::ImageRasterBuffer::ImageRasterBuffer( | |
| 475 const Resource* resource, | |
| 476 ResourceProvider* resource_provider) | |
| 477 : resource_(resource), | |
| 478 resource_provider_(resource_provider), | |
| 479 mapped_buffer_(NULL), | |
| 480 raster_bitmap_changed_(false), | |
| 481 stride_(0) { | |
| 482 } | |
| 483 | |
| 484 ResourceProvider::ImageRasterBuffer::~ImageRasterBuffer() { | |
| 485 } | |
| 486 | |
| 487 void ResourceProvider::ImageRasterBuffer::MapBuffer() { | |
| 488 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | |
| 489 "ResourceProvider::ImageRasterBuffer::MapBuffer"); | |
| 490 | |
| 491 DCHECK(!mapped_buffer_); | |
| 492 | |
| 493 stride_ = 0; | |
| 494 mapped_buffer_ = resource_provider_->MapImage(resource_, &stride_); | |
| 495 raster_bitmap_changed_ = false; | |
| 496 } | |
| 497 | |
| 498 bool ResourceProvider::ImageRasterBuffer::UnmapBuffer() { | |
| 499 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | |
| 500 "ResourceProvider::ImageRasterBuffer::UnmapBuffer"); | |
| 501 | |
| 502 if (mapped_buffer_) { | |
| 503 resource_provider_->UnmapImage(resource_); | |
| 504 mapped_buffer_ = NULL; | |
| 505 } | |
| 506 return raster_bitmap_changed_; | |
| 507 } | |
| 508 | |
| 509 skia::RefPtr<SkCanvas> ResourceProvider::ImageRasterBuffer::AcquireSkCanvas() { | |
| 510 // Note that this function is called from a worker thread. | |
| 511 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | |
| 512 "ResourceProvider::ImageRasterBuffer::AcquireSkCanvas"); | |
| 513 | |
| 514 if (!mapped_buffer_) | |
| 515 return skia::AdoptRef(SkCreateNullCanvas()); | |
| 516 | |
| 517 MakeBitmap(&raster_bitmap_, | |
| 518 mapped_buffer_, | |
| 519 resource_->format, | |
| 520 resource_->size, | |
| 521 stride_); | |
| 522 raster_bitmap_changed_ = true; | |
| 523 return skia::AdoptRef(new SkCanvas(raster_bitmap_)); | |
| 524 } | |
| 525 | |
| 526 void ResourceProvider::ImageRasterBuffer::ReleaseSkCanvas( | |
| 527 const skia::RefPtr<SkCanvas>& canvas) { | |
| 528 // Note that this function is called from a worker thread. | |
| 529 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | |
| 530 "ResourceProvider::ImageRasterBuffer::ReleaseSkCanvas"); | |
| 531 | |
| 532 SkColorType buffer_colorType = ResourceFormatToSkColorType(resource_->format); | |
| 533 if (mapped_buffer_ && (buffer_colorType != raster_bitmap_.colorType())) | |
| 534 CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_colorType); | |
| 535 raster_bitmap_.reset(); | |
| 536 } | |
| 537 | |
| 538 ResourceProvider::PixelRasterBuffer::PixelRasterBuffer( | |
| 539 const Resource* resource, | |
| 540 ResourceProvider* resource_provider) | |
| 541 : resource_(resource), | |
| 542 resource_provider_(resource_provider), | |
| 543 mapped_buffer_(NULL), | |
| 544 raster_bitmap_changed_(false), | |
| 545 stride_(0) { | |
| 546 } | |
| 547 | |
| 548 ResourceProvider::PixelRasterBuffer::~PixelRasterBuffer() { | |
| 549 } | |
| 550 | |
| 551 void ResourceProvider::PixelRasterBuffer::MapBuffer() { | |
| 552 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | |
| 553 "ResourceProvider::PixelRasterBuffer::MapBuffer"); | |
| 554 | |
| 555 DCHECK(!mapped_buffer_); | |
| 556 | |
| 557 stride_ = 0; | |
| 558 mapped_buffer_ = resource_provider_->MapPixelBuffer(resource_, &stride_); | |
| 559 raster_bitmap_changed_ = false; | |
| 560 } | |
| 561 | |
| 562 bool ResourceProvider::PixelRasterBuffer::UnmapBuffer() { | |
| 563 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | |
| 564 "ResourceProvider::PixelRasterBuffer::UnmapBuffer"); | |
| 565 | |
| 566 if (mapped_buffer_) { | |
| 567 resource_provider_->UnmapPixelBuffer(resource_); | |
| 568 mapped_buffer_ = NULL; | |
| 569 } | |
| 570 return raster_bitmap_changed_; | |
| 571 } | |
| 572 | |
| 573 skia::RefPtr<SkCanvas> ResourceProvider::PixelRasterBuffer::AcquireSkCanvas() { | |
| 574 // Note that this function is called from a worker thread. | |
| 575 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | |
| 576 "ResourceProvider::PixelRasterBuffer::AcquireSkCanvas"); | |
| 577 | |
| 578 if (!mapped_buffer_) | |
| 579 return skia::AdoptRef(SkCreateNullCanvas()); | |
| 580 | |
| 581 MakeBitmap(&raster_bitmap_, | |
| 582 mapped_buffer_, | |
| 583 resource_->format, | |
| 584 resource_->size, | |
| 585 stride_); | |
| 586 raster_bitmap_changed_ = true; | |
| 587 return skia::AdoptRef(new SkCanvas(raster_bitmap_)); | |
| 588 } | |
| 589 | |
| 590 void ResourceProvider::PixelRasterBuffer::ReleaseSkCanvas( | |
| 591 const skia::RefPtr<SkCanvas>& canvas) { | |
| 592 // Note that this function is called from a worker thread. | |
| 593 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | |
| 594 "ResourceProvider::PixelRasterBuffer::ReleaseSkCanvas"); | |
| 595 | |
| 596 SkColorType buffer_colorType = ResourceFormatToSkColorType(resource_->format); | |
| 597 if (mapped_buffer_ && (buffer_colorType != raster_bitmap_.colorType())) | |
| 598 CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_colorType); | |
| 599 raster_bitmap_.reset(); | |
| 600 } | |
| 601 | |
| 602 ResourceProvider::Child::Child() : marked_for_deletion(false) {} | 380 ResourceProvider::Child::Child() : marked_for_deletion(false) {} |
| 603 | 381 |
| 604 ResourceProvider::Child::~Child() {} | 382 ResourceProvider::Child::~Child() {} |
| 605 | 383 |
| 606 scoped_ptr<ResourceProvider> ResourceProvider::Create( | 384 scoped_ptr<ResourceProvider> ResourceProvider::Create( |
| 607 OutputSurface* output_surface, | 385 OutputSurface* output_surface, |
| 608 SharedBitmapManager* shared_bitmap_manager, | 386 SharedBitmapManager* shared_bitmap_manager, |
| 609 BlockingTaskRunner* blocking_main_thread_task_runner, | 387 BlockingTaskRunner* blocking_main_thread_task_runner, |
| 610 int highp_threshold_min, | 388 int highp_threshold_min, |
| 611 bool use_rgba_4444_texture_format, | 389 bool use_rgba_4444_texture_format, |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 847 void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, | 625 void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, |
| 848 DeleteStyle style) { | 626 DeleteStyle style) { |
| 849 TRACE_EVENT0("cc", "ResourceProvider::DeleteResourceInternal"); | 627 TRACE_EVENT0("cc", "ResourceProvider::DeleteResourceInternal"); |
| 850 Resource* resource = &it->second; | 628 Resource* resource = &it->second; |
| 851 bool lost_resource = resource->lost; | 629 bool lost_resource = resource->lost; |
| 852 | 630 |
| 853 DCHECK(resource->exported_count == 0 || style != Normal); | 631 DCHECK(resource->exported_count == 0 || style != Normal); |
| 854 if (style == ForShutdown && resource->exported_count > 0) | 632 if (style == ForShutdown && resource->exported_count > 0) |
| 855 lost_resource = true; | 633 lost_resource = true; |
| 856 | 634 |
| 857 resource->gpu_raster_buffer.reset(); | |
| 858 resource->image_raster_buffer.reset(); | |
| 859 resource->pixel_raster_buffer.reset(); | |
| 860 | |
| 861 if (resource->image_id) { | 635 if (resource->image_id) { |
| 862 DCHECK(resource->origin == Resource::Internal); | 636 DCHECK(resource->origin == Resource::Internal); |
| 863 GLES2Interface* gl = ContextGL(); | 637 GLES2Interface* gl = ContextGL(); |
| 864 DCHECK(gl); | 638 DCHECK(gl); |
| 865 GLC(gl, gl->DestroyImageCHROMIUM(resource->image_id)); | 639 GLC(gl, gl->DestroyImageCHROMIUM(resource->image_id)); |
| 866 } | 640 } |
| 867 if (resource->gl_upload_query_id) { | 641 if (resource->gl_upload_query_id) { |
| 868 DCHECK(resource->origin == Resource::Internal); | 642 DCHECK(resource->origin == Resource::Internal); |
| 869 GLES2Interface* gl = ContextGL(); | 643 GLES2Interface* gl = ContextGL(); |
| 870 DCHECK(gl); | 644 DCHECK(gl); |
| (...skipping 880 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1751 child_info->return_callback.Run(to_return, | 1525 child_info->return_callback.Run(to_return, |
| 1752 blocking_main_thread_task_runner_); | 1526 blocking_main_thread_task_runner_); |
| 1753 | 1527 |
| 1754 if (child_info->marked_for_deletion && | 1528 if (child_info->marked_for_deletion && |
| 1755 child_info->parent_to_child_map.empty()) { | 1529 child_info->parent_to_child_map.empty()) { |
| 1756 DCHECK(child_info->child_to_parent_map.empty()); | 1530 DCHECK(child_info->child_to_parent_map.empty()); |
| 1757 children_.erase(child_it); | 1531 children_.erase(child_it); |
| 1758 } | 1532 } |
| 1759 } | 1533 } |
| 1760 | 1534 |
| 1761 RasterBuffer* ResourceProvider::AcquireGpuRasterBuffer(ResourceId id) { | 1535 void ResourceProvider::AcquirePixelBuffer(ResourceId id) { |
| 1762 // Resource needs to be locked for write since GpuRasterBuffer writes | |
| 1763 // directly to it. | |
| 1764 LockForWrite(id); | |
| 1765 Resource* resource = GetResource(id); | |
| 1766 if (!resource->gpu_raster_buffer.get()) { | |
| 1767 resource->gpu_raster_buffer.reset( | |
| 1768 new GpuRasterBuffer(resource, this, use_distance_field_text_)); | |
| 1769 } | |
| 1770 return resource->gpu_raster_buffer.get(); | |
| 1771 } | |
| 1772 | |
| 1773 void ResourceProvider::ReleaseGpuRasterBuffer(ResourceId id) { | |
| 1774 Resource* resource = GetResource(id); | |
| 1775 DCHECK(resource->gpu_raster_buffer.get()); | |
| 1776 UnlockForWrite(id); | |
| 1777 } | |
| 1778 | |
| 1779 RasterBuffer* ResourceProvider::AcquireImageRasterBuffer(ResourceId id) { | |
| 1780 Resource* resource = GetResource(id); | |
| 1781 AcquireImage(resource); | |
| 1782 if (!resource->image_raster_buffer.get()) | |
| 1783 resource->image_raster_buffer.reset(new ImageRasterBuffer(resource, this)); | |
| 1784 resource->image_raster_buffer->MapBuffer(); | |
| 1785 return resource->image_raster_buffer.get(); | |
| 1786 } | |
| 1787 | |
| 1788 bool ResourceProvider::ReleaseImageRasterBuffer(ResourceId id) { | |
| 1789 Resource* resource = GetResource(id); | |
| 1790 resource->dirty_image = true; | |
| 1791 return resource->image_raster_buffer->UnmapBuffer(); | |
| 1792 } | |
| 1793 | |
| 1794 RasterBuffer* ResourceProvider::AcquirePixelRasterBuffer(ResourceId id) { | |
| 1795 Resource* resource = GetResource(id); | |
| 1796 AcquirePixelBuffer(resource); | |
| 1797 resource->pixel_raster_buffer.reset(new PixelRasterBuffer(resource, this)); | |
| 1798 resource->pixel_raster_buffer->MapBuffer(); | |
| 1799 return resource->pixel_raster_buffer.get(); | |
| 1800 } | |
| 1801 | |
| 1802 bool ResourceProvider::ReleasePixelRasterBuffer(ResourceId id) { | |
| 1803 Resource* resource = GetResource(id); | |
| 1804 DCHECK(resource->pixel_raster_buffer.get()); | |
| 1805 bool raster_bitmap_changed = resource->pixel_raster_buffer->UnmapBuffer(); | |
| 1806 resource->pixel_raster_buffer.reset(); | |
| 1807 ReleasePixelBuffer(resource); | |
| 1808 return raster_bitmap_changed; | |
| 1809 } | |
| 1810 | |
| 1811 void ResourceProvider::AcquirePixelBuffer(Resource* resource) { | |
| 1812 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1536 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1813 "ResourceProvider::AcquirePixelBuffer"); | 1537 "ResourceProvider::AcquirePixelBuffer"); |
| 1814 | 1538 |
| 1539 Resource* resource = GetResource(id); |
| 1815 DCHECK(resource->origin == Resource::Internal); | 1540 DCHECK(resource->origin == Resource::Internal); |
| 1816 DCHECK_EQ(resource->exported_count, 0); | 1541 DCHECK_EQ(resource->exported_count, 0); |
| 1817 DCHECK(!resource->image_id); | 1542 DCHECK(!resource->image_id); |
| 1818 DCHECK_NE(ETC1, resource->format); | 1543 DCHECK_NE(ETC1, resource->format); |
| 1819 | 1544 |
| 1820 DCHECK_EQ(GLTexture, resource->type); | 1545 DCHECK_EQ(GLTexture, resource->type); |
| 1821 GLES2Interface* gl = ContextGL(); | 1546 GLES2Interface* gl = ContextGL(); |
| 1822 DCHECK(gl); | 1547 DCHECK(gl); |
| 1823 if (!resource->gl_pixel_buffer_id) | 1548 if (!resource->gl_pixel_buffer_id) |
| 1824 resource->gl_pixel_buffer_id = buffer_id_allocator_->NextId(); | 1549 resource->gl_pixel_buffer_id = buffer_id_allocator_->NextId(); |
| 1825 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1550 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1826 resource->gl_pixel_buffer_id); | 1551 resource->gl_pixel_buffer_id); |
| 1827 unsigned bytes_per_pixel = BitsPerPixel(resource->format) / 8; | 1552 unsigned bytes_per_pixel = BitsPerPixel(resource->format) / 8; |
| 1828 gl->BufferData(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1553 gl->BufferData(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1829 resource->size.height() * | 1554 resource->size.height() * |
| 1830 RoundUp(bytes_per_pixel * resource->size.width(), 4u), | 1555 RoundUp(bytes_per_pixel * resource->size.width(), 4u), |
| 1831 NULL, | 1556 NULL, |
| 1832 GL_DYNAMIC_DRAW); | 1557 GL_DYNAMIC_DRAW); |
| 1833 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1558 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| 1834 } | 1559 } |
| 1835 | 1560 |
| 1836 void ResourceProvider::ReleasePixelBuffer(Resource* resource) { | 1561 void ResourceProvider::ReleasePixelBuffer(ResourceId id) { |
| 1837 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1562 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1838 "ResourceProvider::ReleasePixelBuffer"); | 1563 "ResourceProvider::ReleasePixelBuffer"); |
| 1839 | 1564 |
| 1565 Resource* resource = GetResource(id); |
| 1840 DCHECK(resource->origin == Resource::Internal); | 1566 DCHECK(resource->origin == Resource::Internal); |
| 1841 DCHECK_EQ(resource->exported_count, 0); | 1567 DCHECK_EQ(resource->exported_count, 0); |
| 1842 DCHECK(!resource->image_id); | 1568 DCHECK(!resource->image_id); |
| 1843 | 1569 |
| 1844 // The pixel buffer can be released while there is a pending "set pixels" | 1570 // The pixel buffer can be released while there is a pending "set pixels" |
| 1845 // if completion has been forced. Any shared memory associated with this | 1571 // if completion has been forced. Any shared memory associated with this |
| 1846 // pixel buffer will not be freed until the waitAsyncTexImage2DCHROMIUM | 1572 // pixel buffer will not be freed until the waitAsyncTexImage2DCHROMIUM |
| 1847 // command has been processed on the service side. It is also safe to | 1573 // command has been processed on the service side. It is also safe to |
| 1848 // reuse any query id associated with this resource before they complete | 1574 // reuse any query id associated with this resource before they complete |
| 1849 // as each new query has a unique submit count. | 1575 // as each new query has a unique submit count. |
| 1850 if (resource->pending_set_pixels) { | 1576 if (resource->pending_set_pixels) { |
| 1851 DCHECK(resource->set_pixels_completion_forced); | 1577 DCHECK(resource->set_pixels_completion_forced); |
| 1852 resource->pending_set_pixels = false; | 1578 resource->pending_set_pixels = false; |
| 1853 resource->locked_for_write = false; | 1579 resource->locked_for_write = false; |
| 1854 } | 1580 } |
| 1855 | 1581 |
| 1856 DCHECK_EQ(GLTexture, resource->type); | 1582 DCHECK_EQ(GLTexture, resource->type); |
| 1857 if (!resource->gl_pixel_buffer_id) | 1583 if (!resource->gl_pixel_buffer_id) |
| 1858 return; | 1584 return; |
| 1859 GLES2Interface* gl = ContextGL(); | 1585 GLES2Interface* gl = ContextGL(); |
| 1860 DCHECK(gl); | 1586 DCHECK(gl); |
| 1861 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1587 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1862 resource->gl_pixel_buffer_id); | 1588 resource->gl_pixel_buffer_id); |
| 1863 gl->BufferData( | 1589 gl->BufferData( |
| 1864 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0, NULL, GL_DYNAMIC_DRAW); | 1590 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0, NULL, GL_DYNAMIC_DRAW); |
| 1865 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1591 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| 1866 } | 1592 } |
| 1867 | 1593 |
| 1868 uint8_t* ResourceProvider::MapPixelBuffer(const Resource* resource, | 1594 uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id, int* stride) { |
| 1869 int* stride) { | |
| 1870 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1595 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1871 "ResourceProvider::MapPixelBuffer"); | 1596 "ResourceProvider::MapPixelBuffer"); |
| 1872 | 1597 |
| 1598 Resource* resource = GetResource(id); |
| 1873 DCHECK(resource->origin == Resource::Internal); | 1599 DCHECK(resource->origin == Resource::Internal); |
| 1874 DCHECK_EQ(resource->exported_count, 0); | 1600 DCHECK_EQ(resource->exported_count, 0); |
| 1875 DCHECK(!resource->image_id); | 1601 DCHECK(!resource->image_id); |
| 1876 | 1602 |
| 1877 *stride = 0; | 1603 *stride = 0; |
| 1878 DCHECK_EQ(GLTexture, resource->type); | 1604 DCHECK_EQ(GLTexture, resource->type); |
| 1879 GLES2Interface* gl = ContextGL(); | 1605 GLES2Interface* gl = ContextGL(); |
| 1880 DCHECK(gl); | 1606 DCHECK(gl); |
| 1881 DCHECK(resource->gl_pixel_buffer_id); | 1607 DCHECK(resource->gl_pixel_buffer_id); |
| 1882 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1608 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1883 resource->gl_pixel_buffer_id); | 1609 resource->gl_pixel_buffer_id); |
| 1884 uint8_t* image = static_cast<uint8_t*>(gl->MapBufferCHROMIUM( | 1610 uint8_t* image = static_cast<uint8_t*>(gl->MapBufferCHROMIUM( |
| 1885 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); | 1611 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); |
| 1886 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1612 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| 1887 // Buffer is required to be 4-byte aligned. | 1613 // Buffer is required to be 4-byte aligned. |
| 1888 CHECK(!(reinterpret_cast<intptr_t>(image) & 3)); | 1614 CHECK(!(reinterpret_cast<intptr_t>(image) & 3)); |
| 1889 return image; | 1615 return image; |
| 1890 } | 1616 } |
| 1891 | 1617 |
| 1892 void ResourceProvider::UnmapPixelBuffer(const Resource* resource) { | 1618 void ResourceProvider::UnmapPixelBuffer(ResourceId id) { |
| 1893 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1619 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1894 "ResourceProvider::UnmapPixelBuffer"); | 1620 "ResourceProvider::UnmapPixelBuffer"); |
| 1895 | 1621 |
| 1622 Resource* resource = GetResource(id); |
| 1896 DCHECK(resource->origin == Resource::Internal); | 1623 DCHECK(resource->origin == Resource::Internal); |
| 1897 DCHECK_EQ(resource->exported_count, 0); | 1624 DCHECK_EQ(resource->exported_count, 0); |
| 1898 DCHECK(!resource->image_id); | 1625 DCHECK(!resource->image_id); |
| 1899 | 1626 |
| 1900 DCHECK_EQ(GLTexture, resource->type); | 1627 DCHECK_EQ(GLTexture, resource->type); |
| 1901 GLES2Interface* gl = ContextGL(); | 1628 GLES2Interface* gl = ContextGL(); |
| 1902 DCHECK(gl); | 1629 DCHECK(gl); |
| 1903 DCHECK(resource->gl_pixel_buffer_id); | 1630 DCHECK(resource->gl_pixel_buffer_id); |
| 1904 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1631 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1905 resource->gl_pixel_buffer_id); | 1632 resource->gl_pixel_buffer_id); |
| 1906 gl->UnmapBufferCHROMIUM(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); | 1633 gl->UnmapBufferCHROMIUM(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); |
| 1907 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1634 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| 1908 } | 1635 } |
| 1909 | 1636 |
| 1910 GLenum ResourceProvider::BindForSampling( | 1637 GLenum ResourceProvider::BindForSampling(ResourceId resource_id, |
| 1911 ResourceProvider::ResourceId resource_id, | 1638 GLenum unit, |
| 1912 GLenum unit, | 1639 GLenum filter) { |
| 1913 GLenum filter) { | |
| 1914 DCHECK(thread_checker_.CalledOnValidThread()); | 1640 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1915 GLES2Interface* gl = ContextGL(); | 1641 GLES2Interface* gl = ContextGL(); |
| 1916 ResourceMap::iterator it = resources_.find(resource_id); | 1642 ResourceMap::iterator it = resources_.find(resource_id); |
| 1917 DCHECK(it != resources_.end()); | 1643 DCHECK(it != resources_.end()); |
| 1918 Resource* resource = &it->second; | 1644 Resource* resource = &it->second; |
| 1919 DCHECK(resource->lock_for_read_count); | 1645 DCHECK(resource->lock_for_read_count); |
| 1920 DCHECK(!resource->locked_for_write || resource->set_pixels_completion_forced); | 1646 DCHECK(!resource->locked_for_write || resource->set_pixels_completion_forced); |
| 1921 | 1647 |
| 1922 ScopedSetActiveTexture scoped_active_tex(gl, unit); | 1648 ScopedSetActiveTexture scoped_active_tex(gl, unit); |
| 1923 GLenum target = resource->target; | 1649 GLenum target = resource->target; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1934 return target; | 1660 return target; |
| 1935 } | 1661 } |
| 1936 | 1662 |
| 1937 void ResourceProvider::BeginSetPixels(ResourceId id) { | 1663 void ResourceProvider::BeginSetPixels(ResourceId id) { |
| 1938 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1664 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1939 "ResourceProvider::BeginSetPixels"); | 1665 "ResourceProvider::BeginSetPixels"); |
| 1940 | 1666 |
| 1941 Resource* resource = GetResource(id); | 1667 Resource* resource = GetResource(id); |
| 1942 DCHECK(!resource->pending_set_pixels); | 1668 DCHECK(!resource->pending_set_pixels); |
| 1943 | 1669 |
| 1944 DCHECK(resource->pixel_raster_buffer.get()); | |
| 1945 bool raster_bitmap_changed = resource->pixel_raster_buffer->UnmapBuffer(); | |
| 1946 if (!raster_bitmap_changed) | |
| 1947 return; | |
| 1948 | |
| 1949 LazyCreate(resource); | 1670 LazyCreate(resource); |
| 1950 DCHECK(resource->origin == Resource::Internal); | 1671 DCHECK(resource->origin == Resource::Internal); |
| 1951 DCHECK(resource->gl_id || resource->allocated); | 1672 DCHECK(resource->gl_id || resource->allocated); |
| 1952 DCHECK(ReadLockFenceHasPassed(resource)); | 1673 DCHECK(ReadLockFenceHasPassed(resource)); |
| 1953 DCHECK(!resource->image_id); | 1674 DCHECK(!resource->image_id); |
| 1954 | 1675 |
| 1955 bool allocate = !resource->allocated; | 1676 bool allocate = !resource->allocated; |
| 1956 resource->allocated = true; | 1677 resource->allocated = true; |
| 1957 LockForWrite(id); | 1678 LockForWrite(id); |
| 1958 | 1679 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1996 resource->pending_set_pixels = true; | 1717 resource->pending_set_pixels = true; |
| 1997 resource->set_pixels_completion_forced = false; | 1718 resource->set_pixels_completion_forced = false; |
| 1998 } | 1719 } |
| 1999 | 1720 |
| 2000 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { | 1721 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { |
| 2001 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1722 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 2002 "ResourceProvider::ForceSetPixelsToComplete"); | 1723 "ResourceProvider::ForceSetPixelsToComplete"); |
| 2003 | 1724 |
| 2004 Resource* resource = GetResource(id); | 1725 Resource* resource = GetResource(id); |
| 2005 | 1726 |
| 2006 if (!resource->pending_set_pixels) | |
| 2007 return; | |
| 2008 | |
| 2009 DCHECK(resource->locked_for_write); | 1727 DCHECK(resource->locked_for_write); |
| 1728 DCHECK(resource->pending_set_pixels); |
| 2010 DCHECK(!resource->set_pixels_completion_forced); | 1729 DCHECK(!resource->set_pixels_completion_forced); |
| 2011 | 1730 |
| 2012 if (resource->gl_id) { | 1731 if (resource->gl_id) { |
| 2013 GLES2Interface* gl = ContextGL(); | 1732 GLES2Interface* gl = ContextGL(); |
| 2014 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); | 1733 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); |
| 2015 GLC(gl, gl->WaitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); | 1734 GLC(gl, gl->WaitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); |
| 2016 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, 0)); | 1735 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, 0)); |
| 2017 } | 1736 } |
| 2018 | 1737 |
| 2019 resource->set_pixels_completion_forced = true; | 1738 resource->set_pixels_completion_forced = true; |
| 2020 } | 1739 } |
| 2021 | 1740 |
| 2022 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { | 1741 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { |
| 2023 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1742 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 2024 "ResourceProvider::DidSetPixelsComplete"); | 1743 "ResourceProvider::DidSetPixelsComplete"); |
| 2025 | 1744 |
| 2026 Resource* resource = GetResource(id); | 1745 Resource* resource = GetResource(id); |
| 2027 | 1746 |
| 2028 // Upload can be avoided as a result of raster bitmap not being modified. | |
| 2029 // Assume the upload was completed in that case. | |
| 2030 if (!resource->pending_set_pixels) | |
| 2031 return true; | |
| 2032 | |
| 2033 DCHECK(resource->locked_for_write); | 1747 DCHECK(resource->locked_for_write); |
| 1748 DCHECK(resource->pending_set_pixels); |
| 2034 | 1749 |
| 2035 if (resource->gl_id) { | 1750 if (resource->gl_id) { |
| 2036 GLES2Interface* gl = ContextGL(); | 1751 GLES2Interface* gl = ContextGL(); |
| 2037 DCHECK(gl); | 1752 DCHECK(gl); |
| 2038 DCHECK(resource->gl_upload_query_id); | 1753 DCHECK(resource->gl_upload_query_id); |
| 2039 GLuint complete = 1; | 1754 GLuint complete = 1; |
| 2040 gl->GetQueryObjectuivEXT( | 1755 gl->GetQueryObjectuivEXT( |
| 2041 resource->gl_upload_query_id, GL_QUERY_RESULT_AVAILABLE_EXT, &complete); | 1756 resource->gl_upload_query_id, GL_QUERY_RESULT_AVAILABLE_EXT, &complete); |
| 2042 if (!complete) | 1757 if (!complete) |
| 2043 return false; | 1758 return false; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2097 GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); | 1812 GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); |
| 2098 } | 1813 } |
| 2099 } | 1814 } |
| 2100 | 1815 |
| 2101 void ResourceProvider::AllocateForTesting(ResourceId id) { | 1816 void ResourceProvider::AllocateForTesting(ResourceId id) { |
| 2102 LazyAllocate(GetResource(id)); | 1817 LazyAllocate(GetResource(id)); |
| 2103 } | 1818 } |
| 2104 | 1819 |
| 2105 void ResourceProvider::LazyAllocate(Resource* resource) { | 1820 void ResourceProvider::LazyAllocate(Resource* resource) { |
| 2106 DCHECK(resource); | 1821 DCHECK(resource); |
| 1822 if (resource->allocated) |
| 1823 return; |
| 2107 LazyCreate(resource); | 1824 LazyCreate(resource); |
| 2108 | 1825 if (!resource->gl_id) |
| 2109 DCHECK(resource->gl_id || resource->allocated); | |
| 2110 if (resource->allocated || !resource->gl_id) | |
| 2111 return; | 1826 return; |
| 2112 resource->allocated = true; | 1827 resource->allocated = true; |
| 2113 GLES2Interface* gl = ContextGL(); | 1828 GLES2Interface* gl = ContextGL(); |
| 2114 gfx::Size& size = resource->size; | 1829 gfx::Size& size = resource->size; |
| 2115 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); | 1830 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); |
| 2116 ResourceFormat format = resource->format; | 1831 ResourceFormat format = resource->format; |
| 2117 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); | 1832 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); |
| 2118 if (use_texture_storage_ext_ && | 1833 if (use_texture_storage_ext_ && |
| 2119 IsFormatSupportedForStorage(format, use_texture_format_bgra_) && | 1834 IsFormatSupportedForStorage(format, use_texture_format_bgra_) && |
| 2120 (resource->hint & TextureHintImmutable)) { | 1835 (resource->hint & TextureHintImmutable)) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2145 DCHECK(resource->image_id); | 1860 DCHECK(resource->image_id); |
| 2146 | 1861 |
| 2147 // Release image currently bound to texture. | 1862 // Release image currently bound to texture. |
| 2148 if (resource->bound_image_id) | 1863 if (resource->bound_image_id) |
| 2149 gl->ReleaseTexImage2DCHROMIUM(resource->target, resource->bound_image_id); | 1864 gl->ReleaseTexImage2DCHROMIUM(resource->target, resource->bound_image_id); |
| 2150 gl->BindTexImage2DCHROMIUM(resource->target, resource->image_id); | 1865 gl->BindTexImage2DCHROMIUM(resource->target, resource->image_id); |
| 2151 resource->bound_image_id = resource->image_id; | 1866 resource->bound_image_id = resource->image_id; |
| 2152 resource->dirty_image = false; | 1867 resource->dirty_image = false; |
| 2153 } | 1868 } |
| 2154 | 1869 |
| 2155 void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id) { | 1870 void ResourceProvider::EnableReadLockFences(ResourceId id) { |
| 2156 Resource* resource = GetResource(id); | 1871 Resource* resource = GetResource(id); |
| 2157 resource->read_lock_fences_enabled = true; | 1872 resource->read_lock_fences_enabled = true; |
| 2158 } | 1873 } |
| 2159 | 1874 |
| 2160 void ResourceProvider::AcquireImage(Resource* resource) { | 1875 void ResourceProvider::AcquireImage(ResourceId id) { |
| 1876 Resource* resource = GetResource(id); |
| 2161 DCHECK(resource->origin == Resource::Internal); | 1877 DCHECK(resource->origin == Resource::Internal); |
| 2162 DCHECK_EQ(resource->exported_count, 0); | 1878 DCHECK_EQ(resource->exported_count, 0); |
| 2163 | 1879 |
| 2164 if (resource->type != GLTexture) | 1880 if (resource->type != GLTexture) |
| 2165 return; | 1881 return; |
| 2166 | 1882 |
| 2167 if (resource->image_id) | 1883 if (resource->image_id) |
| 2168 return; | 1884 return; |
| 2169 | 1885 |
| 2170 resource->allocated = true; | 1886 resource->allocated = true; |
| 2171 GLES2Interface* gl = ContextGL(); | 1887 GLES2Interface* gl = ContextGL(); |
| 2172 DCHECK(gl); | 1888 DCHECK(gl); |
| 2173 resource->image_id = | 1889 resource->image_id = |
| 2174 gl->CreateImageCHROMIUM(resource->size.width(), | 1890 gl->CreateImageCHROMIUM(resource->size.width(), |
| 2175 resource->size.height(), | 1891 resource->size.height(), |
| 2176 TextureToStorageFormat(resource->format), | 1892 TextureToStorageFormat(resource->format), |
| 2177 GL_IMAGE_MAP_CHROMIUM); | 1893 GL_IMAGE_MAP_CHROMIUM); |
| 2178 DCHECK(resource->image_id); | 1894 DCHECK(resource->image_id); |
| 2179 } | 1895 } |
| 2180 | 1896 |
| 2181 void ResourceProvider::ReleaseImage(Resource* resource) { | 1897 void ResourceProvider::ReleaseImage(ResourceId id) { |
| 1898 Resource* resource = GetResource(id); |
| 2182 DCHECK(resource->origin == Resource::Internal); | 1899 DCHECK(resource->origin == Resource::Internal); |
| 2183 DCHECK_EQ(resource->exported_count, 0); | 1900 DCHECK_EQ(resource->exported_count, 0); |
| 2184 | 1901 |
| 2185 if (!resource->image_id) | 1902 if (!resource->image_id) |
| 2186 return; | 1903 return; |
| 2187 | 1904 |
| 2188 GLES2Interface* gl = ContextGL(); | 1905 GLES2Interface* gl = ContextGL(); |
| 2189 DCHECK(gl); | 1906 DCHECK(gl); |
| 2190 gl->DestroyImageCHROMIUM(resource->image_id); | 1907 gl->DestroyImageCHROMIUM(resource->image_id); |
| 2191 resource->image_id = 0; | 1908 resource->image_id = 0; |
| 2192 resource->bound_image_id = 0; | 1909 resource->bound_image_id = 0; |
| 2193 resource->dirty_image = false; | 1910 resource->dirty_image = false; |
| 2194 resource->allocated = false; | 1911 resource->allocated = false; |
| 2195 } | 1912 } |
| 2196 | 1913 |
| 2197 uint8_t* ResourceProvider::MapImage(const Resource* resource, int* stride) { | 1914 uint8_t* ResourceProvider::MapImage(ResourceId id, int* stride) { |
| 1915 Resource* resource = GetResource(id); |
| 2198 DCHECK(ReadLockFenceHasPassed(resource)); | 1916 DCHECK(ReadLockFenceHasPassed(resource)); |
| 2199 DCHECK(resource->origin == Resource::Internal); | 1917 DCHECK(resource->origin == Resource::Internal); |
| 2200 DCHECK_EQ(resource->exported_count, 0); | 1918 DCHECK_EQ(resource->exported_count, 0); |
| 1919 LockForWrite(id); |
| 2201 | 1920 |
| 2202 if (resource->type == GLTexture) { | 1921 if (resource->type == GLTexture) { |
| 2203 DCHECK(resource->image_id); | 1922 DCHECK(resource->image_id); |
| 2204 GLES2Interface* gl = ContextGL(); | 1923 GLES2Interface* gl = ContextGL(); |
| 2205 DCHECK(gl); | 1924 DCHECK(gl); |
| 2206 // MapImageCHROMIUM should be called prior to GetImageParameterivCHROMIUM. | 1925 // MapImageCHROMIUM should be called prior to GetImageParameterivCHROMIUM. |
| 2207 uint8_t* pixels = | 1926 uint8_t* pixels = |
| 2208 static_cast<uint8_t*>(gl->MapImageCHROMIUM(resource->image_id)); | 1927 static_cast<uint8_t*>(gl->MapImageCHROMIUM(resource->image_id)); |
| 2209 gl->GetImageParameterivCHROMIUM( | 1928 gl->GetImageParameterivCHROMIUM( |
| 2210 resource->image_id, GL_IMAGE_ROWBYTES_CHROMIUM, stride); | 1929 resource->image_id, GL_IMAGE_ROWBYTES_CHROMIUM, stride); |
| 2211 return pixels; | 1930 return pixels; |
| 2212 } | 1931 } |
| 2213 DCHECK_EQ(Bitmap, resource->type); | 1932 DCHECK_EQ(Bitmap, resource->type); |
| 2214 *stride = 0; | 1933 *stride = 0; |
| 2215 return resource->pixels; | 1934 return resource->pixels; |
| 2216 } | 1935 } |
| 2217 | 1936 |
| 2218 void ResourceProvider::UnmapImage(const Resource* resource) { | 1937 void ResourceProvider::UnmapImage(ResourceId id) { |
| 1938 Resource* resource = GetResource(id); |
| 2219 DCHECK(resource->origin == Resource::Internal); | 1939 DCHECK(resource->origin == Resource::Internal); |
| 2220 DCHECK_EQ(resource->exported_count, 0); | 1940 DCHECK_EQ(resource->exported_count, 0); |
| 1941 DCHECK(resource->locked_for_write); |
| 2221 | 1942 |
| 2222 if (resource->image_id) { | 1943 if (resource->image_id) { |
| 2223 GLES2Interface* gl = ContextGL(); | 1944 GLES2Interface* gl = ContextGL(); |
| 2224 DCHECK(gl); | 1945 DCHECK(gl); |
| 2225 gl->UnmapImageCHROMIUM(resource->image_id); | 1946 gl->UnmapImageCHROMIUM(resource->image_id); |
| 1947 resource->dirty_image = true; |
| 2226 } | 1948 } |
| 1949 |
| 1950 UnlockForWrite(id); |
| 1951 } |
| 1952 |
| 1953 void ResourceProvider::AcquireSkSurface(ResourceId id) { |
| 1954 Resource* resource = GetResource(id); |
| 1955 DCHECK(resource->origin == Resource::Internal); |
| 1956 DCHECK_EQ(resource->exported_count, 0); |
| 1957 |
| 1958 if (resource->type != GLTexture) |
| 1959 return; |
| 1960 |
| 1961 if (resource->sk_surface) |
| 1962 return; |
| 1963 |
| 1964 class GrContext* gr_context = GrContext(); |
| 1965 // TODO(alokp): Implement TestContextProvider::GrContext(). |
| 1966 if (!gr_context) |
| 1967 return; |
| 1968 |
| 1969 LazyAllocate(resource); |
| 1970 |
| 1971 GrBackendTextureDesc desc; |
| 1972 desc.fFlags = kRenderTarget_GrBackendTextureFlag; |
| 1973 desc.fWidth = resource->size.width(); |
| 1974 desc.fHeight = resource->size.height(); |
| 1975 desc.fConfig = ToGrPixelConfig(resource->format); |
| 1976 desc.fOrigin = kTopLeft_GrSurfaceOrigin; |
| 1977 desc.fTextureHandle = resource->gl_id; |
| 1978 skia::RefPtr<GrTexture> gr_texture = |
| 1979 skia::AdoptRef(gr_context->wrapBackendTexture(desc)); |
| 1980 SkSurface::TextRenderMode text_render_mode = |
| 1981 use_distance_field_text_ ? SkSurface::kDistanceField_TextRenderMode |
| 1982 : SkSurface::kStandard_TextRenderMode; |
| 1983 resource->sk_surface = skia::AdoptRef(SkSurface::NewRenderTargetDirect( |
| 1984 gr_texture->asRenderTarget(), text_render_mode)); |
| 1985 } |
| 1986 |
| 1987 void ResourceProvider::ReleaseSkSurface(ResourceId id) { |
| 1988 Resource* resource = GetResource(id); |
| 1989 DCHECK(resource->origin == Resource::Internal); |
| 1990 DCHECK_EQ(resource->exported_count, 0); |
| 1991 |
| 1992 resource->sk_surface.clear(); |
| 1993 } |
| 1994 |
| 1995 SkSurface* ResourceProvider::LockForWriteToSkSurface(ResourceId id) { |
| 1996 Resource* resource = GetResource(id); |
| 1997 DCHECK(resource->origin == Resource::Internal); |
| 1998 DCHECK_EQ(resource->exported_count, 0); |
| 1999 |
| 2000 LockForWrite(id); |
| 2001 return resource->sk_surface.get(); |
| 2002 } |
| 2003 |
| 2004 void ResourceProvider::UnlockForWriteToSkSurface(ResourceId id) { |
| 2005 UnlockForWrite(id); |
| 2227 } | 2006 } |
| 2228 | 2007 |
| 2229 void ResourceProvider::CopyResource(ResourceId source_id, ResourceId dest_id) { | 2008 void ResourceProvider::CopyResource(ResourceId source_id, ResourceId dest_id) { |
| 2230 TRACE_EVENT0("cc", "ResourceProvider::CopyResource"); | 2009 TRACE_EVENT0("cc", "ResourceProvider::CopyResource"); |
| 2231 | 2010 |
| 2232 Resource* source_resource = GetResource(source_id); | 2011 Resource* source_resource = GetResource(source_id); |
| 2233 DCHECK(!source_resource->lock_for_read_count); | 2012 DCHECK(!source_resource->lock_for_read_count); |
| 2234 DCHECK(source_resource->origin == Resource::Internal); | 2013 DCHECK(source_resource->origin == Resource::Internal); |
| 2235 DCHECK_EQ(source_resource->exported_count, 0); | 2014 DCHECK_EQ(source_resource->exported_count, 0); |
| 2236 DCHECK(source_resource->allocated); | 2015 DCHECK(source_resource->allocated); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2307 ContextProvider* context_provider = output_surface_->context_provider(); | 2086 ContextProvider* context_provider = output_surface_->context_provider(); |
| 2308 return context_provider ? context_provider->ContextGL() : NULL; | 2087 return context_provider ? context_provider->ContextGL() : NULL; |
| 2309 } | 2088 } |
| 2310 | 2089 |
| 2311 class GrContext* ResourceProvider::GrContext() const { | 2090 class GrContext* ResourceProvider::GrContext() const { |
| 2312 ContextProvider* context_provider = output_surface_->context_provider(); | 2091 ContextProvider* context_provider = output_surface_->context_provider(); |
| 2313 return context_provider ? context_provider->GrContext() : NULL; | 2092 return context_provider ? context_provider->GrContext() : NULL; |
| 2314 } | 2093 } |
| 2315 | 2094 |
| 2316 } // namespace cc | 2095 } // namespace cc |
| OLD | NEW |