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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 | |
143 void CopyBitmap(const SkBitmap& src, uint8_t* dst, SkColorType dst_color_type) { | |
144 SkImageInfo dst_info = src.info(); | |
145 dst_info.fColorType = dst_color_type; | |
146 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the | |
147 // bitmap data. There will be no need to call SkAlign4 once crbug.com/293728 | |
148 // is fixed. | |
149 const size_t dst_row_bytes = SkAlign4(dst_info.minRowBytes()); | |
150 CHECK_EQ(0u, dst_row_bytes % 4); | |
151 bool success = src.readPixels(dst_info, dst, dst_row_bytes, 0, 0); | |
152 CHECK_EQ(true, success); | |
153 } | |
154 | |
155 class ScopedSetActiveTexture { | 114 class ScopedSetActiveTexture { |
156 public: | 115 public: |
157 ScopedSetActiveTexture(GLES2Interface* gl, GLenum unit) | 116 ScopedSetActiveTexture(GLES2Interface* gl, GLenum unit) |
158 : gl_(gl), unit_(unit) { | 117 : gl_(gl), unit_(unit) { |
159 DCHECK_EQ(GL_TEXTURE0, ResourceProvider::GetActiveTextureUnit(gl_)); | 118 DCHECK_EQ(GL_TEXTURE0, ResourceProvider::GetActiveTextureUnit(gl_)); |
160 | 119 |
161 if (unit_ != GL_TEXTURE0) | 120 if (unit_ != GL_TEXTURE0) |
162 GLC(gl_, gl_->ActiveTexture(unit_)); | 121 GLC(gl_, gl_->ActiveTexture(unit_)); |
163 } | 122 } |
164 | 123 |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 texture_pool(0), | 370 texture_pool(0), |
412 wrap_mode(wrap_mode), | 371 wrap_mode(wrap_mode), |
413 hint(TextureHintImmutable), | 372 hint(TextureHintImmutable), |
414 type(Bitmap), | 373 type(Bitmap), |
415 format(RGBA_8888), | 374 format(RGBA_8888), |
416 shared_bitmap_id(bitmap_id), | 375 shared_bitmap_id(bitmap_id), |
417 shared_bitmap(NULL) { | 376 shared_bitmap(NULL) { |
418 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); | 377 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); |
419 } | 378 } |
420 | 379 |
421 ResourceProvider::GpuRasterBuffer::GpuRasterBuffer( | |
422 const Resource* resource, | |
423 ResourceProvider* resource_provider, | |
424 bool use_distance_field_text) | |
425 : resource_(resource), resource_provider_(resource_provider) { | |
426 DCHECK_EQ(GLTexture, resource_->type); | |
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 } | |
447 } | |
448 | |
449 ResourceProvider::GpuRasterBuffer::~GpuRasterBuffer() { | |
450 } | |
451 | |
452 skia::RefPtr<SkCanvas> ResourceProvider::GpuRasterBuffer::AcquireSkCanvas() { | |
453 // Note that this function is called from a worker thread. | |
454 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | |
455 "ResourceProvider::GpuRasterBuffer::AcquireSkCanvas"); | |
456 | |
457 return surface_ ? skia::SharePtr(surface_->getCanvas()) | |
458 : skia::RefPtr<SkCanvas>(); | |
459 } | |
460 | |
461 void ResourceProvider::GpuRasterBuffer::ReleaseSkCanvas( | |
462 const skia::RefPtr<SkCanvas>& canvas) { | |
463 // Note that this function is called from a worker thread. | |
464 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | |
465 "ResourceProvider::GpuRasterBuffer::ReleaseSkCanvas"); | |
466 } | |
467 | |
468 ResourceProvider::ImageRasterBuffer::ImageRasterBuffer( | |
469 const Resource* resource, | |
470 ResourceProvider* resource_provider) | |
471 : resource_(resource), | |
472 resource_provider_(resource_provider), | |
473 mapped_buffer_(NULL), | |
474 raster_bitmap_changed_(false), | |
475 stride_(0) { | |
476 } | |
477 | |
478 ResourceProvider::ImageRasterBuffer::~ImageRasterBuffer() { | |
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(); | |
530 } | |
531 | |
532 ResourceProvider::PixelRasterBuffer::PixelRasterBuffer( | |
533 const Resource* resource, | |
534 ResourceProvider* resource_provider) | |
535 : resource_(resource), | |
536 resource_provider_(resource_provider), | |
537 mapped_buffer_(NULL), | |
538 raster_bitmap_changed_(false), | |
539 stride_(0) { | |
540 } | |
541 | |
542 ResourceProvider::PixelRasterBuffer::~PixelRasterBuffer() { | |
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(); | |
594 } | |
595 | |
596 ResourceProvider::Child::Child() : marked_for_deletion(false) {} | 380 ResourceProvider::Child::Child() : marked_for_deletion(false) {} |
597 | 381 |
598 ResourceProvider::Child::~Child() {} | 382 ResourceProvider::Child::~Child() {} |
599 | 383 |
600 scoped_ptr<ResourceProvider> ResourceProvider::Create( | 384 scoped_ptr<ResourceProvider> ResourceProvider::Create( |
601 OutputSurface* output_surface, | 385 OutputSurface* output_surface, |
602 SharedBitmapManager* shared_bitmap_manager, | 386 SharedBitmapManager* shared_bitmap_manager, |
603 BlockingTaskRunner* blocking_main_thread_task_runner, | 387 BlockingTaskRunner* blocking_main_thread_task_runner, |
604 int highp_threshold_min, | 388 int highp_threshold_min, |
605 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... |
841 void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, | 625 void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, |
842 DeleteStyle style) { | 626 DeleteStyle style) { |
843 TRACE_EVENT0("cc", "ResourceProvider::DeleteResourceInternal"); | 627 TRACE_EVENT0("cc", "ResourceProvider::DeleteResourceInternal"); |
844 Resource* resource = &it->second; | 628 Resource* resource = &it->second; |
845 bool lost_resource = resource->lost; | 629 bool lost_resource = resource->lost; |
846 | 630 |
847 DCHECK(resource->exported_count == 0 || style != Normal); | 631 DCHECK(resource->exported_count == 0 || style != Normal); |
848 if (style == ForShutdown && resource->exported_count > 0) | 632 if (style == ForShutdown && resource->exported_count > 0) |
849 lost_resource = true; | 633 lost_resource = true; |
850 | 634 |
851 resource->gpu_raster_buffer.reset(); | |
852 resource->image_raster_buffer.reset(); | |
853 resource->pixel_raster_buffer.reset(); | |
854 | |
855 if (resource->image_id) { | 635 if (resource->image_id) { |
856 DCHECK(resource->origin == Resource::Internal); | 636 DCHECK(resource->origin == Resource::Internal); |
857 GLES2Interface* gl = ContextGL(); | 637 GLES2Interface* gl = ContextGL(); |
858 DCHECK(gl); | 638 DCHECK(gl); |
859 GLC(gl, gl->DestroyImageCHROMIUM(resource->image_id)); | 639 GLC(gl, gl->DestroyImageCHROMIUM(resource->image_id)); |
860 } | 640 } |
861 if (resource->gl_upload_query_id) { | 641 if (resource->gl_upload_query_id) { |
862 DCHECK(resource->origin == Resource::Internal); | 642 DCHECK(resource->origin == Resource::Internal); |
863 GLES2Interface* gl = ContextGL(); | 643 GLES2Interface* gl = ContextGL(); |
864 DCHECK(gl); | 644 DCHECK(gl); |
(...skipping 880 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1745 child_info->return_callback.Run(to_return, | 1525 child_info->return_callback.Run(to_return, |
1746 blocking_main_thread_task_runner_); | 1526 blocking_main_thread_task_runner_); |
1747 | 1527 |
1748 if (child_info->marked_for_deletion && | 1528 if (child_info->marked_for_deletion && |
1749 child_info->parent_to_child_map.empty()) { | 1529 child_info->parent_to_child_map.empty()) { |
1750 DCHECK(child_info->child_to_parent_map.empty()); | 1530 DCHECK(child_info->child_to_parent_map.empty()); |
1751 children_.erase(child_it); | 1531 children_.erase(child_it); |
1752 } | 1532 } |
1753 } | 1533 } |
1754 | 1534 |
1755 RasterBuffer* ResourceProvider::AcquireGpuRasterBuffer(ResourceId id) { | 1535 void ResourceProvider::AcquirePixelBuffer(ResourceId id) { |
1756 // Resource needs to be locked for write since GpuRasterBuffer writes | |
1757 // directly to it. | |
1758 LockForWrite(id); | |
1759 Resource* resource = GetResource(id); | |
1760 if (!resource->gpu_raster_buffer.get()) { | |
1761 resource->gpu_raster_buffer.reset( | |
1762 new GpuRasterBuffer(resource, this, use_distance_field_text_)); | |
1763 } | |
1764 return resource->gpu_raster_buffer.get(); | |
1765 } | |
1766 | |
1767 void ResourceProvider::ReleaseGpuRasterBuffer(ResourceId id) { | |
1768 Resource* resource = GetResource(id); | |
1769 DCHECK(resource->gpu_raster_buffer.get()); | |
1770 UnlockForWrite(id); | |
1771 } | |
1772 | |
1773 RasterBuffer* ResourceProvider::AcquireImageRasterBuffer(ResourceId id) { | |
1774 Resource* resource = GetResource(id); | |
1775 AcquireImage(resource); | |
1776 if (!resource->image_raster_buffer.get()) | |
1777 resource->image_raster_buffer.reset(new ImageRasterBuffer(resource, this)); | |
1778 resource->image_raster_buffer->MapBuffer(); | |
1779 return resource->image_raster_buffer.get(); | |
1780 } | |
1781 | |
1782 bool ResourceProvider::ReleaseImageRasterBuffer(ResourceId id) { | |
1783 Resource* resource = GetResource(id); | |
1784 resource->dirty_image = true; | |
1785 return resource->image_raster_buffer->UnmapBuffer(); | |
1786 } | |
1787 | |
1788 RasterBuffer* ResourceProvider::AcquirePixelRasterBuffer(ResourceId id) { | |
1789 Resource* resource = GetResource(id); | |
1790 AcquirePixelBuffer(resource); | |
1791 resource->pixel_raster_buffer.reset(new PixelRasterBuffer(resource, this)); | |
1792 resource->pixel_raster_buffer->MapBuffer(); | |
1793 return resource->pixel_raster_buffer.get(); | |
1794 } | |
1795 | |
1796 bool ResourceProvider::ReleasePixelRasterBuffer(ResourceId id) { | |
1797 Resource* resource = GetResource(id); | |
1798 DCHECK(resource->pixel_raster_buffer.get()); | |
1799 bool raster_bitmap_changed = resource->pixel_raster_buffer->UnmapBuffer(); | |
1800 resource->pixel_raster_buffer.reset(); | |
1801 ReleasePixelBuffer(resource); | |
1802 return raster_bitmap_changed; | |
1803 } | |
1804 | |
1805 void ResourceProvider::AcquirePixelBuffer(Resource* resource) { | |
1806 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1536 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
1807 "ResourceProvider::AcquirePixelBuffer"); | 1537 "ResourceProvider::AcquirePixelBuffer"); |
1808 | 1538 |
| 1539 Resource* resource = GetResource(id); |
1809 DCHECK(resource->origin == Resource::Internal); | 1540 DCHECK(resource->origin == Resource::Internal); |
1810 DCHECK_EQ(resource->exported_count, 0); | 1541 DCHECK_EQ(resource->exported_count, 0); |
1811 DCHECK(!resource->image_id); | 1542 DCHECK(!resource->image_id); |
1812 DCHECK_NE(ETC1, resource->format); | 1543 DCHECK_NE(ETC1, resource->format); |
1813 | 1544 |
1814 DCHECK_EQ(GLTexture, resource->type); | 1545 DCHECK_EQ(GLTexture, resource->type); |
1815 GLES2Interface* gl = ContextGL(); | 1546 GLES2Interface* gl = ContextGL(); |
1816 DCHECK(gl); | 1547 DCHECK(gl); |
1817 if (!resource->gl_pixel_buffer_id) | 1548 if (!resource->gl_pixel_buffer_id) |
1818 resource->gl_pixel_buffer_id = buffer_id_allocator_->NextId(); | 1549 resource->gl_pixel_buffer_id = buffer_id_allocator_->NextId(); |
1819 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1550 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
1820 resource->gl_pixel_buffer_id); | 1551 resource->gl_pixel_buffer_id); |
1821 unsigned bytes_per_pixel = BitsPerPixel(resource->format) / 8; | 1552 unsigned bytes_per_pixel = BitsPerPixel(resource->format) / 8; |
1822 gl->BufferData(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1553 gl->BufferData(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
1823 resource->size.height() * | 1554 resource->size.height() * |
1824 RoundUp(bytes_per_pixel * resource->size.width(), 4u), | 1555 RoundUp(bytes_per_pixel * resource->size.width(), 4u), |
1825 NULL, | 1556 NULL, |
1826 GL_DYNAMIC_DRAW); | 1557 GL_DYNAMIC_DRAW); |
1827 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1558 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
1828 } | 1559 } |
1829 | 1560 |
1830 void ResourceProvider::ReleasePixelBuffer(Resource* resource) { | 1561 void ResourceProvider::ReleasePixelBuffer(ResourceId id) { |
1831 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1562 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
1832 "ResourceProvider::ReleasePixelBuffer"); | 1563 "ResourceProvider::ReleasePixelBuffer"); |
1833 | 1564 |
| 1565 Resource* resource = GetResource(id); |
1834 DCHECK(resource->origin == Resource::Internal); | 1566 DCHECK(resource->origin == Resource::Internal); |
1835 DCHECK_EQ(resource->exported_count, 0); | 1567 DCHECK_EQ(resource->exported_count, 0); |
1836 DCHECK(!resource->image_id); | 1568 DCHECK(!resource->image_id); |
1837 | 1569 |
1838 // 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" |
1839 // if completion has been forced. Any shared memory associated with this | 1571 // if completion has been forced. Any shared memory associated with this |
1840 // pixel buffer will not be freed until the waitAsyncTexImage2DCHROMIUM | 1572 // pixel buffer will not be freed until the waitAsyncTexImage2DCHROMIUM |
1841 // 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 |
1842 // reuse any query id associated with this resource before they complete | 1574 // reuse any query id associated with this resource before they complete |
1843 // as each new query has a unique submit count. | 1575 // as each new query has a unique submit count. |
1844 if (resource->pending_set_pixels) { | 1576 if (resource->pending_set_pixels) { |
1845 DCHECK(resource->set_pixels_completion_forced); | 1577 DCHECK(resource->set_pixels_completion_forced); |
1846 resource->pending_set_pixels = false; | 1578 resource->pending_set_pixels = false; |
1847 resource->locked_for_write = false; | 1579 resource->locked_for_write = false; |
1848 } | 1580 } |
1849 | 1581 |
1850 DCHECK_EQ(GLTexture, resource->type); | 1582 DCHECK_EQ(GLTexture, resource->type); |
1851 if (!resource->gl_pixel_buffer_id) | 1583 if (!resource->gl_pixel_buffer_id) |
1852 return; | 1584 return; |
1853 GLES2Interface* gl = ContextGL(); | 1585 GLES2Interface* gl = ContextGL(); |
1854 DCHECK(gl); | 1586 DCHECK(gl); |
1855 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1587 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
1856 resource->gl_pixel_buffer_id); | 1588 resource->gl_pixel_buffer_id); |
1857 gl->BufferData( | 1589 gl->BufferData( |
1858 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0, NULL, GL_DYNAMIC_DRAW); | 1590 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0, NULL, GL_DYNAMIC_DRAW); |
1859 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1591 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
1860 } | 1592 } |
1861 | 1593 |
1862 uint8_t* ResourceProvider::MapPixelBuffer(const Resource* resource, | 1594 uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id, int* stride) { |
1863 int* stride) { | |
1864 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1595 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
1865 "ResourceProvider::MapPixelBuffer"); | 1596 "ResourceProvider::MapPixelBuffer"); |
1866 | 1597 |
| 1598 Resource* resource = GetResource(id); |
1867 DCHECK(resource->origin == Resource::Internal); | 1599 DCHECK(resource->origin == Resource::Internal); |
1868 DCHECK_EQ(resource->exported_count, 0); | 1600 DCHECK_EQ(resource->exported_count, 0); |
1869 DCHECK(!resource->image_id); | 1601 DCHECK(!resource->image_id); |
1870 | 1602 |
1871 *stride = 0; | 1603 *stride = 0; |
1872 DCHECK_EQ(GLTexture, resource->type); | 1604 DCHECK_EQ(GLTexture, resource->type); |
1873 GLES2Interface* gl = ContextGL(); | 1605 GLES2Interface* gl = ContextGL(); |
1874 DCHECK(gl); | 1606 DCHECK(gl); |
1875 DCHECK(resource->gl_pixel_buffer_id); | 1607 DCHECK(resource->gl_pixel_buffer_id); |
1876 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1608 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
1877 resource->gl_pixel_buffer_id); | 1609 resource->gl_pixel_buffer_id); |
1878 uint8_t* image = static_cast<uint8_t*>(gl->MapBufferCHROMIUM( | 1610 uint8_t* image = static_cast<uint8_t*>(gl->MapBufferCHROMIUM( |
1879 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); | 1611 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); |
1880 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1612 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
1881 // Buffer is required to be 4-byte aligned. | 1613 // Buffer is required to be 4-byte aligned. |
1882 CHECK(!(reinterpret_cast<intptr_t>(image) & 3)); | 1614 CHECK(!(reinterpret_cast<intptr_t>(image) & 3)); |
1883 return image; | 1615 return image; |
1884 } | 1616 } |
1885 | 1617 |
1886 void ResourceProvider::UnmapPixelBuffer(const Resource* resource) { | 1618 void ResourceProvider::UnmapPixelBuffer(ResourceId id) { |
1887 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1619 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
1888 "ResourceProvider::UnmapPixelBuffer"); | 1620 "ResourceProvider::UnmapPixelBuffer"); |
1889 | 1621 |
| 1622 Resource* resource = GetResource(id); |
1890 DCHECK(resource->origin == Resource::Internal); | 1623 DCHECK(resource->origin == Resource::Internal); |
1891 DCHECK_EQ(resource->exported_count, 0); | 1624 DCHECK_EQ(resource->exported_count, 0); |
1892 DCHECK(!resource->image_id); | 1625 DCHECK(!resource->image_id); |
1893 | 1626 |
1894 DCHECK_EQ(GLTexture, resource->type); | 1627 DCHECK_EQ(GLTexture, resource->type); |
1895 GLES2Interface* gl = ContextGL(); | 1628 GLES2Interface* gl = ContextGL(); |
1896 DCHECK(gl); | 1629 DCHECK(gl); |
1897 DCHECK(resource->gl_pixel_buffer_id); | 1630 DCHECK(resource->gl_pixel_buffer_id); |
1898 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1631 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
1899 resource->gl_pixel_buffer_id); | 1632 resource->gl_pixel_buffer_id); |
1900 gl->UnmapBufferCHROMIUM(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); | 1633 gl->UnmapBufferCHROMIUM(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); |
1901 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1634 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
1902 } | 1635 } |
1903 | 1636 |
1904 GLenum ResourceProvider::BindForSampling( | 1637 GLenum ResourceProvider::BindForSampling(ResourceId resource_id, |
1905 ResourceProvider::ResourceId resource_id, | 1638 GLenum unit, |
1906 GLenum unit, | 1639 GLenum filter) { |
1907 GLenum filter) { | |
1908 DCHECK(thread_checker_.CalledOnValidThread()); | 1640 DCHECK(thread_checker_.CalledOnValidThread()); |
1909 GLES2Interface* gl = ContextGL(); | 1641 GLES2Interface* gl = ContextGL(); |
1910 ResourceMap::iterator it = resources_.find(resource_id); | 1642 ResourceMap::iterator it = resources_.find(resource_id); |
1911 DCHECK(it != resources_.end()); | 1643 DCHECK(it != resources_.end()); |
1912 Resource* resource = &it->second; | 1644 Resource* resource = &it->second; |
1913 DCHECK(resource->lock_for_read_count); | 1645 DCHECK(resource->lock_for_read_count); |
1914 DCHECK(!resource->locked_for_write || resource->set_pixels_completion_forced); | 1646 DCHECK(!resource->locked_for_write || resource->set_pixels_completion_forced); |
1915 | 1647 |
1916 ScopedSetActiveTexture scoped_active_tex(gl, unit); | 1648 ScopedSetActiveTexture scoped_active_tex(gl, unit); |
1917 GLenum target = resource->target; | 1649 GLenum target = resource->target; |
(...skipping 10 matching lines...) Expand all Loading... |
1928 return target; | 1660 return target; |
1929 } | 1661 } |
1930 | 1662 |
1931 void ResourceProvider::BeginSetPixels(ResourceId id) { | 1663 void ResourceProvider::BeginSetPixels(ResourceId id) { |
1932 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1664 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
1933 "ResourceProvider::BeginSetPixels"); | 1665 "ResourceProvider::BeginSetPixels"); |
1934 | 1666 |
1935 Resource* resource = GetResource(id); | 1667 Resource* resource = GetResource(id); |
1936 DCHECK(!resource->pending_set_pixels); | 1668 DCHECK(!resource->pending_set_pixels); |
1937 | 1669 |
1938 DCHECK(resource->pixel_raster_buffer.get()); | |
1939 bool raster_bitmap_changed = resource->pixel_raster_buffer->UnmapBuffer(); | |
1940 if (!raster_bitmap_changed) | |
1941 return; | |
1942 | |
1943 LazyCreate(resource); | 1670 LazyCreate(resource); |
1944 DCHECK(resource->origin == Resource::Internal); | 1671 DCHECK(resource->origin == Resource::Internal); |
1945 DCHECK(resource->gl_id || resource->allocated); | 1672 DCHECK(resource->gl_id || resource->allocated); |
1946 DCHECK(ReadLockFenceHasPassed(resource)); | 1673 DCHECK(ReadLockFenceHasPassed(resource)); |
1947 DCHECK(!resource->image_id); | 1674 DCHECK(!resource->image_id); |
1948 | 1675 |
1949 bool allocate = !resource->allocated; | 1676 bool allocate = !resource->allocated; |
1950 resource->allocated = true; | 1677 resource->allocated = true; |
1951 LockForWrite(id); | 1678 LockForWrite(id); |
1952 | 1679 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1990 resource->pending_set_pixels = true; | 1717 resource->pending_set_pixels = true; |
1991 resource->set_pixels_completion_forced = false; | 1718 resource->set_pixels_completion_forced = false; |
1992 } | 1719 } |
1993 | 1720 |
1994 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { | 1721 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { |
1995 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1722 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
1996 "ResourceProvider::ForceSetPixelsToComplete"); | 1723 "ResourceProvider::ForceSetPixelsToComplete"); |
1997 | 1724 |
1998 Resource* resource = GetResource(id); | 1725 Resource* resource = GetResource(id); |
1999 | 1726 |
2000 if (!resource->pending_set_pixels) | |
2001 return; | |
2002 | |
2003 DCHECK(resource->locked_for_write); | 1727 DCHECK(resource->locked_for_write); |
| 1728 DCHECK(resource->pending_set_pixels); |
2004 DCHECK(!resource->set_pixels_completion_forced); | 1729 DCHECK(!resource->set_pixels_completion_forced); |
2005 | 1730 |
2006 if (resource->gl_id) { | 1731 if (resource->gl_id) { |
2007 GLES2Interface* gl = ContextGL(); | 1732 GLES2Interface* gl = ContextGL(); |
2008 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); | 1733 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); |
2009 GLC(gl, gl->WaitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); | 1734 GLC(gl, gl->WaitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); |
2010 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, 0)); | 1735 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, 0)); |
2011 } | 1736 } |
2012 | 1737 |
2013 resource->set_pixels_completion_forced = true; | 1738 resource->set_pixels_completion_forced = true; |
2014 } | 1739 } |
2015 | 1740 |
2016 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { | 1741 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { |
2017 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1742 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
2018 "ResourceProvider::DidSetPixelsComplete"); | 1743 "ResourceProvider::DidSetPixelsComplete"); |
2019 | 1744 |
2020 Resource* resource = GetResource(id); | 1745 Resource* resource = GetResource(id); |
2021 | 1746 |
2022 // Upload can be avoided as a result of raster bitmap not being modified. | |
2023 // Assume the upload was completed in that case. | |
2024 if (!resource->pending_set_pixels) | |
2025 return true; | |
2026 | |
2027 DCHECK(resource->locked_for_write); | 1747 DCHECK(resource->locked_for_write); |
| 1748 DCHECK(resource->pending_set_pixels); |
2028 | 1749 |
2029 if (resource->gl_id) { | 1750 if (resource->gl_id) { |
2030 GLES2Interface* gl = ContextGL(); | 1751 GLES2Interface* gl = ContextGL(); |
2031 DCHECK(gl); | 1752 DCHECK(gl); |
2032 DCHECK(resource->gl_upload_query_id); | 1753 DCHECK(resource->gl_upload_query_id); |
2033 GLuint complete = 1; | 1754 GLuint complete = 1; |
2034 gl->GetQueryObjectuivEXT( | 1755 gl->GetQueryObjectuivEXT( |
2035 resource->gl_upload_query_id, GL_QUERY_RESULT_AVAILABLE_EXT, &complete); | 1756 resource->gl_upload_query_id, GL_QUERY_RESULT_AVAILABLE_EXT, &complete); |
2036 if (!complete) | 1757 if (!complete) |
2037 return false; | 1758 return false; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2091 GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); | 1812 GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); |
2092 } | 1813 } |
2093 } | 1814 } |
2094 | 1815 |
2095 void ResourceProvider::AllocateForTesting(ResourceId id) { | 1816 void ResourceProvider::AllocateForTesting(ResourceId id) { |
2096 LazyAllocate(GetResource(id)); | 1817 LazyAllocate(GetResource(id)); |
2097 } | 1818 } |
2098 | 1819 |
2099 void ResourceProvider::LazyAllocate(Resource* resource) { | 1820 void ResourceProvider::LazyAllocate(Resource* resource) { |
2100 DCHECK(resource); | 1821 DCHECK(resource); |
| 1822 if (resource->allocated) |
| 1823 return; |
2101 LazyCreate(resource); | 1824 LazyCreate(resource); |
2102 | 1825 if (!resource->gl_id) |
2103 DCHECK(resource->gl_id || resource->allocated); | |
2104 if (resource->allocated || !resource->gl_id) | |
2105 return; | 1826 return; |
2106 resource->allocated = true; | 1827 resource->allocated = true; |
2107 GLES2Interface* gl = ContextGL(); | 1828 GLES2Interface* gl = ContextGL(); |
2108 gfx::Size& size = resource->size; | 1829 gfx::Size& size = resource->size; |
2109 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); | 1830 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); |
2110 ResourceFormat format = resource->format; | 1831 ResourceFormat format = resource->format; |
2111 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); | 1832 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); |
2112 if (use_texture_storage_ext_ && | 1833 if (use_texture_storage_ext_ && |
2113 IsFormatSupportedForStorage(format, use_texture_format_bgra_) && | 1834 IsFormatSupportedForStorage(format, use_texture_format_bgra_) && |
2114 (resource->hint & TextureHintImmutable)) { | 1835 (resource->hint & TextureHintImmutable)) { |
(...skipping 24 matching lines...) Expand all Loading... |
2139 DCHECK(resource->image_id); | 1860 DCHECK(resource->image_id); |
2140 | 1861 |
2141 // Release image currently bound to texture. | 1862 // Release image currently bound to texture. |
2142 if (resource->bound_image_id) | 1863 if (resource->bound_image_id) |
2143 gl->ReleaseTexImage2DCHROMIUM(resource->target, resource->bound_image_id); | 1864 gl->ReleaseTexImage2DCHROMIUM(resource->target, resource->bound_image_id); |
2144 gl->BindTexImage2DCHROMIUM(resource->target, resource->image_id); | 1865 gl->BindTexImage2DCHROMIUM(resource->target, resource->image_id); |
2145 resource->bound_image_id = resource->image_id; | 1866 resource->bound_image_id = resource->image_id; |
2146 resource->dirty_image = false; | 1867 resource->dirty_image = false; |
2147 } | 1868 } |
2148 | 1869 |
2149 void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id) { | 1870 void ResourceProvider::EnableReadLockFences(ResourceId id) { |
2150 Resource* resource = GetResource(id); | 1871 Resource* resource = GetResource(id); |
2151 resource->read_lock_fences_enabled = true; | 1872 resource->read_lock_fences_enabled = true; |
2152 } | 1873 } |
2153 | 1874 |
2154 void ResourceProvider::AcquireImage(Resource* resource) { | 1875 void ResourceProvider::AcquireImage(ResourceId id) { |
| 1876 Resource* resource = GetResource(id); |
2155 DCHECK(resource->origin == Resource::Internal); | 1877 DCHECK(resource->origin == Resource::Internal); |
2156 DCHECK_EQ(resource->exported_count, 0); | 1878 DCHECK_EQ(resource->exported_count, 0); |
2157 | 1879 |
2158 if (resource->type != GLTexture) | 1880 if (resource->type != GLTexture) |
2159 return; | 1881 return; |
2160 | 1882 |
2161 if (resource->image_id) | 1883 if (resource->image_id) |
2162 return; | 1884 return; |
2163 | 1885 |
2164 resource->allocated = true; | 1886 resource->allocated = true; |
2165 GLES2Interface* gl = ContextGL(); | 1887 GLES2Interface* gl = ContextGL(); |
2166 DCHECK(gl); | 1888 DCHECK(gl); |
2167 resource->image_id = | 1889 resource->image_id = |
2168 gl->CreateImageCHROMIUM(resource->size.width(), | 1890 gl->CreateImageCHROMIUM(resource->size.width(), |
2169 resource->size.height(), | 1891 resource->size.height(), |
2170 TextureToStorageFormat(resource->format), | 1892 TextureToStorageFormat(resource->format), |
2171 GL_IMAGE_MAP_CHROMIUM); | 1893 GL_IMAGE_MAP_CHROMIUM); |
2172 DCHECK(resource->image_id); | 1894 DCHECK(resource->image_id); |
2173 } | 1895 } |
2174 | 1896 |
2175 void ResourceProvider::ReleaseImage(Resource* resource) { | 1897 void ResourceProvider::ReleaseImage(ResourceId id) { |
| 1898 Resource* resource = GetResource(id); |
2176 DCHECK(resource->origin == Resource::Internal); | 1899 DCHECK(resource->origin == Resource::Internal); |
2177 DCHECK_EQ(resource->exported_count, 0); | 1900 DCHECK_EQ(resource->exported_count, 0); |
2178 | 1901 |
2179 if (!resource->image_id) | 1902 if (!resource->image_id) |
2180 return; | 1903 return; |
2181 | 1904 |
2182 GLES2Interface* gl = ContextGL(); | 1905 GLES2Interface* gl = ContextGL(); |
2183 DCHECK(gl); | 1906 DCHECK(gl); |
2184 gl->DestroyImageCHROMIUM(resource->image_id); | 1907 gl->DestroyImageCHROMIUM(resource->image_id); |
2185 resource->image_id = 0; | 1908 resource->image_id = 0; |
2186 resource->bound_image_id = 0; | 1909 resource->bound_image_id = 0; |
2187 resource->dirty_image = false; | 1910 resource->dirty_image = false; |
2188 resource->allocated = false; | 1911 resource->allocated = false; |
2189 } | 1912 } |
2190 | 1913 |
2191 uint8_t* ResourceProvider::MapImage(const Resource* resource, int* stride) { | 1914 uint8_t* ResourceProvider::MapImage(ResourceId id, int* stride) { |
| 1915 Resource* resource = GetResource(id); |
2192 DCHECK(ReadLockFenceHasPassed(resource)); | 1916 DCHECK(ReadLockFenceHasPassed(resource)); |
2193 DCHECK(resource->origin == Resource::Internal); | 1917 DCHECK(resource->origin == Resource::Internal); |
2194 DCHECK_EQ(resource->exported_count, 0); | 1918 DCHECK_EQ(resource->exported_count, 0); |
| 1919 LockForWrite(id); |
2195 | 1920 |
2196 if (resource->type == GLTexture) { | 1921 if (resource->type == GLTexture) { |
2197 DCHECK(resource->image_id); | 1922 DCHECK(resource->image_id); |
2198 GLES2Interface* gl = ContextGL(); | 1923 GLES2Interface* gl = ContextGL(); |
2199 DCHECK(gl); | 1924 DCHECK(gl); |
2200 // MapImageCHROMIUM should be called prior to GetImageParameterivCHROMIUM. | 1925 // MapImageCHROMIUM should be called prior to GetImageParameterivCHROMIUM. |
2201 uint8_t* pixels = | 1926 uint8_t* pixels = |
2202 static_cast<uint8_t*>(gl->MapImageCHROMIUM(resource->image_id)); | 1927 static_cast<uint8_t*>(gl->MapImageCHROMIUM(resource->image_id)); |
2203 gl->GetImageParameterivCHROMIUM( | 1928 gl->GetImageParameterivCHROMIUM( |
2204 resource->image_id, GL_IMAGE_ROWBYTES_CHROMIUM, stride); | 1929 resource->image_id, GL_IMAGE_ROWBYTES_CHROMIUM, stride); |
2205 return pixels; | 1930 return pixels; |
2206 } | 1931 } |
2207 DCHECK_EQ(Bitmap, resource->type); | 1932 DCHECK_EQ(Bitmap, resource->type); |
2208 *stride = 0; | 1933 *stride = 0; |
2209 return resource->pixels; | 1934 return resource->pixels; |
2210 } | 1935 } |
2211 | 1936 |
2212 void ResourceProvider::UnmapImage(const Resource* resource) { | 1937 void ResourceProvider::UnmapImage(ResourceId id) { |
| 1938 Resource* resource = GetResource(id); |
2213 DCHECK(resource->origin == Resource::Internal); | 1939 DCHECK(resource->origin == Resource::Internal); |
2214 DCHECK_EQ(resource->exported_count, 0); | 1940 DCHECK_EQ(resource->exported_count, 0); |
| 1941 DCHECK(resource->locked_for_write); |
2215 | 1942 |
2216 if (resource->image_id) { | 1943 if (resource->image_id) { |
2217 GLES2Interface* gl = ContextGL(); | 1944 GLES2Interface* gl = ContextGL(); |
2218 DCHECK(gl); | 1945 DCHECK(gl); |
2219 gl->UnmapImageCHROMIUM(resource->image_id); | 1946 gl->UnmapImageCHROMIUM(resource->image_id); |
| 1947 resource->dirty_image = true; |
2220 } | 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); |
2221 } | 2006 } |
2222 | 2007 |
2223 void ResourceProvider::CopyResource(ResourceId source_id, ResourceId dest_id) { | 2008 void ResourceProvider::CopyResource(ResourceId source_id, ResourceId dest_id) { |
2224 TRACE_EVENT0("cc", "ResourceProvider::CopyResource"); | 2009 TRACE_EVENT0("cc", "ResourceProvider::CopyResource"); |
2225 | 2010 |
2226 Resource* source_resource = GetResource(source_id); | 2011 Resource* source_resource = GetResource(source_id); |
2227 DCHECK(!source_resource->lock_for_read_count); | 2012 DCHECK(!source_resource->lock_for_read_count); |
2228 DCHECK(source_resource->origin == Resource::Internal); | 2013 DCHECK(source_resource->origin == Resource::Internal); |
2229 DCHECK_EQ(source_resource->exported_count, 0); | 2014 DCHECK_EQ(source_resource->exported_count, 0); |
2230 DCHECK(source_resource->allocated); | 2015 DCHECK(source_resource->allocated); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2301 ContextProvider* context_provider = output_surface_->context_provider(); | 2086 ContextProvider* context_provider = output_surface_->context_provider(); |
2302 return context_provider ? context_provider->ContextGL() : NULL; | 2087 return context_provider ? context_provider->ContextGL() : NULL; |
2303 } | 2088 } |
2304 | 2089 |
2305 class GrContext* ResourceProvider::GrContext() const { | 2090 class GrContext* ResourceProvider::GrContext() const { |
2306 ContextProvider* context_provider = output_surface_->context_provider(); | 2091 ContextProvider* context_provider = output_surface_->context_provider(); |
2307 return context_provider ? context_provider->GrContext() : NULL; | 2092 return context_provider ? context_provider->GrContext() : NULL; |
2308 } | 2093 } |
2309 | 2094 |
2310 } // namespace cc | 2095 } // namespace cc |
OLD | NEW |