| 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/metrics/histogram.h" | 11 #include "base/metrics/histogram.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 "base/trace_event/trace_event.h" | 15 #include "base/trace_event/trace_event.h" |
| 16 #include "cc/base/util.h" | 16 #include "cc/base/util.h" |
| 17 #include "cc/output/gl_renderer.h" // For the GLC() macro. | |
| 18 #include "cc/resources/platform_color.h" | 17 #include "cc/resources/platform_color.h" |
| 19 #include "cc/resources/returned_resource.h" | 18 #include "cc/resources/returned_resource.h" |
| 20 #include "cc/resources/shared_bitmap_manager.h" | 19 #include "cc/resources/shared_bitmap_manager.h" |
| 21 #include "cc/resources/texture_uploader.h" | 20 #include "cc/resources/texture_uploader.h" |
| 22 #include "cc/resources/transferable_resource.h" | 21 #include "cc/resources/transferable_resource.h" |
| 23 #include "gpu/GLES2/gl2extchromium.h" | 22 #include "gpu/GLES2/gl2extchromium.h" |
| 24 #include "gpu/command_buffer/client/gles2_interface.h" | 23 #include "gpu/command_buffer/client/gles2_interface.h" |
| 25 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" | 24 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" |
| 26 #include "third_party/khronos/GLES2/gl2.h" | 25 #include "third_party/khronos/GLES2/gl2.h" |
| 27 #include "third_party/khronos/GLES2/gl2ext.h" | 26 #include "third_party/khronos/GLES2/gl2ext.h" |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 return gfx::GpuMemoryBuffer::Format::RGBA_8888; | 133 return gfx::GpuMemoryBuffer::Format::RGBA_8888; |
| 135 } | 134 } |
| 136 | 135 |
| 137 class ScopedSetActiveTexture { | 136 class ScopedSetActiveTexture { |
| 138 public: | 137 public: |
| 139 ScopedSetActiveTexture(GLES2Interface* gl, GLenum unit) | 138 ScopedSetActiveTexture(GLES2Interface* gl, GLenum unit) |
| 140 : gl_(gl), unit_(unit) { | 139 : gl_(gl), unit_(unit) { |
| 141 DCHECK_EQ(GL_TEXTURE0, ResourceProvider::GetActiveTextureUnit(gl_)); | 140 DCHECK_EQ(GL_TEXTURE0, ResourceProvider::GetActiveTextureUnit(gl_)); |
| 142 | 141 |
| 143 if (unit_ != GL_TEXTURE0) | 142 if (unit_ != GL_TEXTURE0) |
| 144 GLC(gl_, gl_->ActiveTexture(unit_)); | 143 gl_->ActiveTexture(unit_); |
| 145 } | 144 } |
| 146 | 145 |
| 147 ~ScopedSetActiveTexture() { | 146 ~ScopedSetActiveTexture() { |
| 148 // Active unit being GL_TEXTURE0 is effectively the ground state. | 147 // Active unit being GL_TEXTURE0 is effectively the ground state. |
| 149 if (unit_ != GL_TEXTURE0) | 148 if (unit_ != GL_TEXTURE0) |
| 150 GLC(gl_, gl_->ActiveTexture(GL_TEXTURE0)); | 149 gl_->ActiveTexture(GL_TEXTURE0); |
| 151 } | 150 } |
| 152 | 151 |
| 153 private: | 152 private: |
| 154 GLES2Interface* gl_; | 153 GLES2Interface* gl_; |
| 155 GLenum unit_; | 154 GLenum unit_; |
| 156 }; | 155 }; |
| 157 | 156 |
| 158 class TextureIdAllocator : public IdAllocator { | 157 class TextureIdAllocator : public IdAllocator { |
| 159 public: | 158 public: |
| 160 TextureIdAllocator(GLES2Interface* gl, | 159 TextureIdAllocator(GLES2Interface* gl, |
| (...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 635 bool lost_resource = resource->lost; | 634 bool lost_resource = resource->lost; |
| 636 | 635 |
| 637 DCHECK(resource->exported_count == 0 || style != NORMAL); | 636 DCHECK(resource->exported_count == 0 || style != NORMAL); |
| 638 if (style == FOR_SHUTDOWN && resource->exported_count > 0) | 637 if (style == FOR_SHUTDOWN && resource->exported_count > 0) |
| 639 lost_resource = true; | 638 lost_resource = true; |
| 640 | 639 |
| 641 if (resource->image_id) { | 640 if (resource->image_id) { |
| 642 DCHECK(resource->origin == Resource::INTERNAL); | 641 DCHECK(resource->origin == Resource::INTERNAL); |
| 643 GLES2Interface* gl = ContextGL(); | 642 GLES2Interface* gl = ContextGL(); |
| 644 DCHECK(gl); | 643 DCHECK(gl); |
| 645 GLC(gl, gl->DestroyImageCHROMIUM(resource->image_id)); | 644 gl->DestroyImageCHROMIUM(resource->image_id); |
| 646 } | 645 } |
| 647 if (resource->gl_upload_query_id) { | 646 if (resource->gl_upload_query_id) { |
| 648 DCHECK(resource->origin == Resource::INTERNAL); | 647 DCHECK(resource->origin == Resource::INTERNAL); |
| 649 GLES2Interface* gl = ContextGL(); | 648 GLES2Interface* gl = ContextGL(); |
| 650 DCHECK(gl); | 649 DCHECK(gl); |
| 651 GLC(gl, gl->DeleteQueriesEXT(1, &resource->gl_upload_query_id)); | 650 gl->DeleteQueriesEXT(1, &resource->gl_upload_query_id); |
| 652 } | 651 } |
| 653 if (resource->gl_read_lock_query_id) { | 652 if (resource->gl_read_lock_query_id) { |
| 654 DCHECK(resource->origin == Resource::INTERNAL); | 653 DCHECK(resource->origin == Resource::INTERNAL); |
| 655 GLES2Interface* gl = ContextGL(); | 654 GLES2Interface* gl = ContextGL(); |
| 656 DCHECK(gl); | 655 DCHECK(gl); |
| 657 GLC(gl, gl->DeleteQueriesEXT(1, &resource->gl_read_lock_query_id)); | 656 gl->DeleteQueriesEXT(1, &resource->gl_read_lock_query_id); |
| 658 } | 657 } |
| 659 if (resource->gl_pixel_buffer_id) { | 658 if (resource->gl_pixel_buffer_id) { |
| 660 DCHECK(resource->origin == Resource::INTERNAL); | 659 DCHECK(resource->origin == Resource::INTERNAL); |
| 661 GLES2Interface* gl = ContextGL(); | 660 GLES2Interface* gl = ContextGL(); |
| 662 DCHECK(gl); | 661 DCHECK(gl); |
| 663 GLC(gl, gl->DeleteBuffers(1, &resource->gl_pixel_buffer_id)); | 662 gl->DeleteBuffers(1, &resource->gl_pixel_buffer_id); |
| 664 } | 663 } |
| 665 if (resource->origin == Resource::EXTERNAL) { | 664 if (resource->origin == Resource::EXTERNAL) { |
| 666 DCHECK(resource->mailbox.IsValid()); | 665 DCHECK(resource->mailbox.IsValid()); |
| 667 GLuint sync_point = resource->mailbox.sync_point(); | 666 GLuint sync_point = resource->mailbox.sync_point(); |
| 668 if (resource->type == RESOURCE_TYPE_GL_TEXTURE) { | 667 if (resource->type == RESOURCE_TYPE_GL_TEXTURE) { |
| 669 DCHECK(resource->mailbox.IsTexture()); | 668 DCHECK(resource->mailbox.IsTexture()); |
| 670 lost_resource |= lost_output_surface_; | 669 lost_resource |= lost_output_surface_; |
| 671 GLES2Interface* gl = ContextGL(); | 670 GLES2Interface* gl = ContextGL(); |
| 672 DCHECK(gl); | 671 DCHECK(gl); |
| 673 if (resource->gl_id) { | 672 if (resource->gl_id) { |
| 674 GLC(gl, gl->DeleteTextures(1, &resource->gl_id)); | 673 gl->DeleteTextures(1, &resource->gl_id); |
| 675 resource->gl_id = 0; | 674 resource->gl_id = 0; |
| 676 if (!lost_resource) | 675 if (!lost_resource) |
| 677 sync_point = gl->InsertSyncPointCHROMIUM(); | 676 sync_point = gl->InsertSyncPointCHROMIUM(); |
| 678 } | 677 } |
| 679 } else { | 678 } else { |
| 680 DCHECK(resource->mailbox.IsSharedMemory()); | 679 DCHECK(resource->mailbox.IsSharedMemory()); |
| 681 resource->shared_bitmap = nullptr; | 680 resource->shared_bitmap = nullptr; |
| 682 resource->pixels = nullptr; | 681 resource->pixels = nullptr; |
| 683 } | 682 } |
| 684 resource->release_callback_impl.Run( | 683 resource->release_callback_impl.Run( |
| 685 sync_point, lost_resource, blocking_main_thread_task_runner_); | 684 sync_point, lost_resource, blocking_main_thread_task_runner_); |
| 686 } | 685 } |
| 687 if (resource->gl_id) { | 686 if (resource->gl_id) { |
| 688 GLES2Interface* gl = ContextGL(); | 687 GLES2Interface* gl = ContextGL(); |
| 689 DCHECK(gl); | 688 DCHECK(gl); |
| 690 GLC(gl, gl->DeleteTextures(1, &resource->gl_id)); | 689 gl->DeleteTextures(1, &resource->gl_id); |
| 691 resource->gl_id = 0; | 690 resource->gl_id = 0; |
| 692 } | 691 } |
| 693 if (resource->shared_bitmap) { | 692 if (resource->shared_bitmap) { |
| 694 DCHECK(resource->origin != Resource::EXTERNAL); | 693 DCHECK(resource->origin != Resource::EXTERNAL); |
| 695 DCHECK_EQ(RESOURCE_TYPE_BITMAP, resource->type); | 694 DCHECK_EQ(RESOURCE_TYPE_BITMAP, resource->type); |
| 696 delete resource->shared_bitmap; | 695 delete resource->shared_bitmap; |
| 697 resource->pixels = NULL; | 696 resource->pixels = NULL; |
| 698 } | 697 } |
| 699 if (resource->pixels) { | 698 if (resource->pixels) { |
| 700 DCHECK(resource->origin == Resource::INTERNAL); | 699 DCHECK(resource->origin == Resource::INTERNAL); |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 891 if (resource->type == RESOURCE_TYPE_GL_TEXTURE && !resource->gl_id) { | 890 if (resource->type == RESOURCE_TYPE_GL_TEXTURE && !resource->gl_id) { |
| 892 DCHECK(resource->origin != Resource::INTERNAL); | 891 DCHECK(resource->origin != Resource::INTERNAL); |
| 893 DCHECK(resource->mailbox.IsTexture()); | 892 DCHECK(resource->mailbox.IsTexture()); |
| 894 | 893 |
| 895 // Mailbox sync_points must be processed by a call to | 894 // Mailbox sync_points must be processed by a call to |
| 896 // WaitSyncPointIfNeeded() prior to calling LockForRead(). | 895 // WaitSyncPointIfNeeded() prior to calling LockForRead(). |
| 897 DCHECK(!resource->mailbox.sync_point()); | 896 DCHECK(!resource->mailbox.sync_point()); |
| 898 | 897 |
| 899 GLES2Interface* gl = ContextGL(); | 898 GLES2Interface* gl = ContextGL(); |
| 900 DCHECK(gl); | 899 DCHECK(gl); |
| 901 resource->gl_id = | 900 resource->gl_id = gl->CreateAndConsumeTextureCHROMIUM( |
| 902 GLC(gl, gl->CreateAndConsumeTextureCHROMIUM(resource->mailbox.target(), | 901 resource->mailbox.target(), resource->mailbox.name()); |
| 903 resource->mailbox.name())); | |
| 904 } | 902 } |
| 905 | 903 |
| 906 if (!resource->pixels && resource->has_shared_bitmap_id && | 904 if (!resource->pixels && resource->has_shared_bitmap_id && |
| 907 shared_bitmap_manager_) { | 905 shared_bitmap_manager_) { |
| 908 scoped_ptr<SharedBitmap> bitmap = | 906 scoped_ptr<SharedBitmap> bitmap = |
| 909 shared_bitmap_manager_->GetSharedBitmapFromId( | 907 shared_bitmap_manager_->GetSharedBitmapFromId( |
| 910 resource->size, resource->shared_bitmap_id); | 908 resource->size, resource->shared_bitmap_id); |
| 911 if (bitmap) { | 909 if (bitmap) { |
| 912 resource->shared_bitmap = bitmap.release(); | 910 resource->shared_bitmap = bitmap.release(); |
| 913 resource->pixels = resource->shared_bitmap->pixels(); | 911 resource->pixels = resource->shared_bitmap->pixels(); |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1260 use_texture_usage_hint_ = caps.gpu.texture_usage; | 1258 use_texture_usage_hint_ = caps.gpu.texture_usage; |
| 1261 use_compressed_texture_etc1_ = caps.gpu.texture_format_etc1; | 1259 use_compressed_texture_etc1_ = caps.gpu.texture_format_etc1; |
| 1262 yuv_resource_format_ = caps.gpu.texture_rg ? RED_8 : LUMINANCE_8; | 1260 yuv_resource_format_ = caps.gpu.texture_rg ? RED_8 : LUMINANCE_8; |
| 1263 use_sync_query_ = caps.gpu.sync_query; | 1261 use_sync_query_ = caps.gpu.sync_query; |
| 1264 | 1262 |
| 1265 GLES2Interface* gl = ContextGL(); | 1263 GLES2Interface* gl = ContextGL(); |
| 1266 DCHECK(gl); | 1264 DCHECK(gl); |
| 1267 | 1265 |
| 1268 texture_uploader_ = TextureUploader::Create(gl); | 1266 texture_uploader_ = TextureUploader::Create(gl); |
| 1269 max_texture_size_ = 0; // Context expects cleared value. | 1267 max_texture_size_ = 0; // Context expects cleared value. |
| 1270 GLC(gl, gl->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size_)); | 1268 gl->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size_); |
| 1271 best_texture_format_ = PlatformColor::BestTextureFormat(use_bgra); | 1269 best_texture_format_ = PlatformColor::BestTextureFormat(use_bgra); |
| 1272 | 1270 |
| 1273 texture_id_allocator_.reset( | 1271 texture_id_allocator_.reset( |
| 1274 new TextureIdAllocator(gl, id_allocation_chunk_size_)); | 1272 new TextureIdAllocator(gl, id_allocation_chunk_size_)); |
| 1275 buffer_id_allocator_.reset( | 1273 buffer_id_allocator_.reset( |
| 1276 new BufferIdAllocator(gl, id_allocation_chunk_size_)); | 1274 new BufferIdAllocator(gl, id_allocation_chunk_size_)); |
| 1277 } | 1275 } |
| 1278 | 1276 |
| 1279 void ResourceProvider::CleanUpGLIfNeeded() { | 1277 void ResourceProvider::CleanUpGLIfNeeded() { |
| 1280 GLES2Interface* gl = ContextGL(); | 1278 GLES2Interface* gl = ContextGL(); |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1521 if (resource->read_lock_fences_enabled) { | 1519 if (resource->read_lock_fences_enabled) { |
| 1522 if (current_read_lock_fence_.get()) | 1520 if (current_read_lock_fence_.get()) |
| 1523 current_read_lock_fence_->Set(); | 1521 current_read_lock_fence_->Set(); |
| 1524 resource->read_lock_fence = current_read_lock_fence_; | 1522 resource->read_lock_fence = current_read_lock_fence_; |
| 1525 } | 1523 } |
| 1526 | 1524 |
| 1527 if (returned.sync_point) { | 1525 if (returned.sync_point) { |
| 1528 DCHECK(!resource->has_shared_bitmap_id); | 1526 DCHECK(!resource->has_shared_bitmap_id); |
| 1529 if (resource->origin == Resource::INTERNAL) { | 1527 if (resource->origin == Resource::INTERNAL) { |
| 1530 DCHECK(resource->gl_id); | 1528 DCHECK(resource->gl_id); |
| 1531 GLC(gl, gl->WaitSyncPointCHROMIUM(returned.sync_point)); | 1529 gl->WaitSyncPointCHROMIUM(returned.sync_point); |
| 1532 } else { | 1530 } else { |
| 1533 DCHECK(!resource->gl_id); | 1531 DCHECK(!resource->gl_id); |
| 1534 resource->mailbox.set_sync_point(returned.sync_point); | 1532 resource->mailbox.set_sync_point(returned.sync_point); |
| 1535 } | 1533 } |
| 1536 } | 1534 } |
| 1537 | 1535 |
| 1538 if (!resource->marked_for_deletion) | 1536 if (!resource->marked_for_deletion) |
| 1539 continue; | 1537 continue; |
| 1540 | 1538 |
| 1541 if (!resource->child_id) { | 1539 if (!resource->child_id) { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1592 } else if (!source->mailbox.IsValid()) { | 1590 } else if (!source->mailbox.IsValid()) { |
| 1593 LazyCreate(source); | 1591 LazyCreate(source); |
| 1594 DCHECK(source->gl_id); | 1592 DCHECK(source->gl_id); |
| 1595 DCHECK(source->origin == Resource::INTERNAL); | 1593 DCHECK(source->origin == Resource::INTERNAL); |
| 1596 if (source->image_id) { | 1594 if (source->image_id) { |
| 1597 DCHECK(source->dirty_image); | 1595 DCHECK(source->dirty_image); |
| 1598 BindImageForSampling(source); | 1596 BindImageForSampling(source); |
| 1599 } | 1597 } |
| 1600 // This is a resource allocated by the compositor, we need to produce it. | 1598 // This is a resource allocated by the compositor, we need to produce it. |
| 1601 // Don't set a sync point, the caller will do it. | 1599 // Don't set a sync point, the caller will do it. |
| 1602 GLC(gl, gl->GenMailboxCHROMIUM(resource->mailbox_holder.mailbox.name)); | 1600 gl->GenMailboxCHROMIUM(resource->mailbox_holder.mailbox.name); |
| 1603 GLC(gl, gl->ProduceTextureDirectCHROMIUM( | 1601 gl->ProduceTextureDirectCHROMIUM(source->gl_id, |
| 1604 source->gl_id, resource->mailbox_holder.texture_target, | 1602 resource->mailbox_holder.texture_target, |
| 1605 resource->mailbox_holder.mailbox.name)); | 1603 resource->mailbox_holder.mailbox.name); |
| 1606 | 1604 |
| 1607 source->mailbox = TextureMailbox(resource->mailbox_holder); | 1605 source->mailbox = TextureMailbox(resource->mailbox_holder); |
| 1608 } else { | 1606 } else { |
| 1609 DCHECK(source->mailbox.IsTexture()); | 1607 DCHECK(source->mailbox.IsTexture()); |
| 1610 if (source->image_id && source->dirty_image) { | 1608 if (source->image_id && source->dirty_image) { |
| 1611 DCHECK(source->gl_id); | 1609 DCHECK(source->gl_id); |
| 1612 DCHECK(source->origin == Resource::INTERNAL); | 1610 DCHECK(source->origin == Resource::INTERNAL); |
| 1613 GLC(gl, | 1611 gl->BindTexture(resource->mailbox_holder.texture_target, source->gl_id); |
| 1614 gl->BindTexture(resource->mailbox_holder.texture_target, | |
| 1615 source->gl_id)); | |
| 1616 BindImageForSampling(source); | 1612 BindImageForSampling(source); |
| 1617 } | 1613 } |
| 1618 // This is either an external resource, or a compositor resource that we | 1614 // This is either an external resource, or a compositor resource that we |
| 1619 // already exported. Make sure to forward the sync point that we were given. | 1615 // already exported. Make sure to forward the sync point that we were given. |
| 1620 resource->mailbox_holder.mailbox = source->mailbox.mailbox(); | 1616 resource->mailbox_holder.mailbox = source->mailbox.mailbox(); |
| 1621 resource->mailbox_holder.texture_target = source->mailbox.target(); | 1617 resource->mailbox_holder.texture_target = source->mailbox.target(); |
| 1622 resource->mailbox_holder.sync_point = source->mailbox.sync_point(); | 1618 resource->mailbox_holder.sync_point = source->mailbox.sync_point(); |
| 1623 source->mailbox.set_sync_point(0); | 1619 source->mailbox.set_sync_point(0); |
| 1624 } | 1620 } |
| 1625 } | 1621 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1665 } | 1661 } |
| 1666 | 1662 |
| 1667 // We still have an exported_count, so we'll have to lose it. | 1663 // We still have an exported_count, so we'll have to lose it. |
| 1668 is_lost = true; | 1664 is_lost = true; |
| 1669 } | 1665 } |
| 1670 | 1666 |
| 1671 if (gl && resource.filter != resource.original_filter) { | 1667 if (gl && resource.filter != resource.original_filter) { |
| 1672 DCHECK(resource.target); | 1668 DCHECK(resource.target); |
| 1673 DCHECK(resource.gl_id); | 1669 DCHECK(resource.gl_id); |
| 1674 | 1670 |
| 1675 GLC(gl, gl->BindTexture(resource.target, resource.gl_id)); | 1671 gl->BindTexture(resource.target, resource.gl_id); |
| 1676 GLC(gl, | 1672 gl->TexParameteri(resource.target, GL_TEXTURE_MIN_FILTER, |
| 1677 gl->TexParameteri(resource.target, | 1673 resource.original_filter); |
| 1678 GL_TEXTURE_MIN_FILTER, | 1674 gl->TexParameteri(resource.target, GL_TEXTURE_MAG_FILTER, |
| 1679 resource.original_filter)); | 1675 resource.original_filter); |
| 1680 GLC(gl, | |
| 1681 gl->TexParameteri(resource.target, | |
| 1682 GL_TEXTURE_MAG_FILTER, | |
| 1683 resource.original_filter)); | |
| 1684 } | 1676 } |
| 1685 | 1677 |
| 1686 ReturnedResource returned; | 1678 ReturnedResource returned; |
| 1687 returned.id = child_id; | 1679 returned.id = child_id; |
| 1688 returned.sync_point = resource.mailbox.sync_point(); | 1680 returned.sync_point = resource.mailbox.sync_point(); |
| 1689 if (!returned.sync_point && resource.type == RESOURCE_TYPE_GL_TEXTURE) | 1681 if (!returned.sync_point && resource.type == RESOURCE_TYPE_GL_TEXTURE) |
| 1690 need_sync_point = true; | 1682 need_sync_point = true; |
| 1691 returned.count = resource.imported_count; | 1683 returned.count = resource.imported_count; |
| 1692 returned.lost = is_lost; | 1684 returned.lost = is_lost; |
| 1693 to_return.push_back(returned); | 1685 to_return.push_back(returned); |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1825 DCHECK(thread_checker_.CalledOnValidThread()); | 1817 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1826 GLES2Interface* gl = ContextGL(); | 1818 GLES2Interface* gl = ContextGL(); |
| 1827 ResourceMap::iterator it = resources_.find(resource_id); | 1819 ResourceMap::iterator it = resources_.find(resource_id); |
| 1828 DCHECK(it != resources_.end()); | 1820 DCHECK(it != resources_.end()); |
| 1829 Resource* resource = &it->second; | 1821 Resource* resource = &it->second; |
| 1830 DCHECK(resource->lock_for_read_count); | 1822 DCHECK(resource->lock_for_read_count); |
| 1831 DCHECK(!resource->locked_for_write || resource->set_pixels_completion_forced); | 1823 DCHECK(!resource->locked_for_write || resource->set_pixels_completion_forced); |
| 1832 | 1824 |
| 1833 ScopedSetActiveTexture scoped_active_tex(gl, unit); | 1825 ScopedSetActiveTexture scoped_active_tex(gl, unit); |
| 1834 GLenum target = resource->target; | 1826 GLenum target = resource->target; |
| 1835 GLC(gl, gl->BindTexture(target, resource->gl_id)); | 1827 gl->BindTexture(target, resource->gl_id); |
| 1836 if (filter != resource->filter) { | 1828 if (filter != resource->filter) { |
| 1837 GLC(gl, gl->TexParameteri(target, GL_TEXTURE_MIN_FILTER, filter)); | 1829 gl->TexParameteri(target, GL_TEXTURE_MIN_FILTER, filter); |
| 1838 GLC(gl, gl->TexParameteri(target, GL_TEXTURE_MAG_FILTER, filter)); | 1830 gl->TexParameteri(target, GL_TEXTURE_MAG_FILTER, filter); |
| 1839 resource->filter = filter; | 1831 resource->filter = filter; |
| 1840 } | 1832 } |
| 1841 | 1833 |
| 1842 if (resource->image_id && resource->dirty_image) | 1834 if (resource->image_id && resource->dirty_image) |
| 1843 BindImageForSampling(resource); | 1835 BindImageForSampling(resource); |
| 1844 | 1836 |
| 1845 return target; | 1837 return target; |
| 1846 } | 1838 } |
| 1847 | 1839 |
| 1848 void ResourceProvider::BeginSetPixels(ResourceId id) { | 1840 void ResourceProvider::BeginSetPixels(ResourceId id) { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1908 "ResourceProvider::ForceSetPixelsToComplete"); | 1900 "ResourceProvider::ForceSetPixelsToComplete"); |
| 1909 | 1901 |
| 1910 Resource* resource = GetResource(id); | 1902 Resource* resource = GetResource(id); |
| 1911 | 1903 |
| 1912 DCHECK(resource->locked_for_write); | 1904 DCHECK(resource->locked_for_write); |
| 1913 DCHECK(resource->pending_set_pixels); | 1905 DCHECK(resource->pending_set_pixels); |
| 1914 DCHECK(!resource->set_pixels_completion_forced); | 1906 DCHECK(!resource->set_pixels_completion_forced); |
| 1915 | 1907 |
| 1916 if (resource->gl_id) { | 1908 if (resource->gl_id) { |
| 1917 GLES2Interface* gl = ContextGL(); | 1909 GLES2Interface* gl = ContextGL(); |
| 1918 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); | 1910 gl->BindTexture(GL_TEXTURE_2D, resource->gl_id); |
| 1919 GLC(gl, gl->WaitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); | 1911 gl->WaitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D); |
| 1920 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, 0)); | 1912 gl->BindTexture(GL_TEXTURE_2D, 0); |
| 1921 } | 1913 } |
| 1922 | 1914 |
| 1923 resource->set_pixels_completion_forced = true; | 1915 resource->set_pixels_completion_forced = true; |
| 1924 } | 1916 } |
| 1925 | 1917 |
| 1926 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { | 1918 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { |
| 1927 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1919 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1928 "ResourceProvider::DidSetPixelsComplete"); | 1920 "ResourceProvider::DidSetPixelsComplete"); |
| 1929 | 1921 |
| 1930 Resource* resource = GetResource(id); | 1922 Resource* resource = GetResource(id); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1973 | 1965 |
| 1974 DCHECK(resource->texture_pool); | 1966 DCHECK(resource->texture_pool); |
| 1975 DCHECK(resource->origin == Resource::INTERNAL); | 1967 DCHECK(resource->origin == Resource::INTERNAL); |
| 1976 DCHECK(!resource->mailbox.IsValid()); | 1968 DCHECK(!resource->mailbox.IsValid()); |
| 1977 resource->gl_id = texture_id_allocator_->NextId(); | 1969 resource->gl_id = texture_id_allocator_->NextId(); |
| 1978 | 1970 |
| 1979 GLES2Interface* gl = ContextGL(); | 1971 GLES2Interface* gl = ContextGL(); |
| 1980 DCHECK(gl); | 1972 DCHECK(gl); |
| 1981 | 1973 |
| 1982 // Create and set texture properties. Allocation is delayed until needed. | 1974 // Create and set texture properties. Allocation is delayed until needed. |
| 1983 GLC(gl, gl->BindTexture(resource->target, resource->gl_id)); | 1975 gl->BindTexture(resource->target, resource->gl_id); |
| 1984 GLC(gl, | 1976 gl->TexParameteri(resource->target, GL_TEXTURE_MIN_FILTER, |
| 1985 gl->TexParameteri( | 1977 resource->original_filter); |
| 1986 resource->target, GL_TEXTURE_MIN_FILTER, resource->original_filter)); | 1978 gl->TexParameteri(resource->target, GL_TEXTURE_MAG_FILTER, |
| 1987 GLC(gl, | 1979 resource->original_filter); |
| 1988 gl->TexParameteri( | 1980 gl->TexParameteri(resource->target, GL_TEXTURE_WRAP_S, resource->wrap_mode); |
| 1989 resource->target, GL_TEXTURE_MAG_FILTER, resource->original_filter)); | 1981 gl->TexParameteri(resource->target, GL_TEXTURE_WRAP_T, resource->wrap_mode); |
| 1990 GLC(gl, | 1982 gl->TexParameteri(resource->target, GL_TEXTURE_POOL_CHROMIUM, |
| 1991 gl->TexParameteri( | 1983 resource->texture_pool); |
| 1992 resource->target, GL_TEXTURE_WRAP_S, resource->wrap_mode)); | |
| 1993 GLC(gl, | |
| 1994 gl->TexParameteri( | |
| 1995 resource->target, GL_TEXTURE_WRAP_T, resource->wrap_mode)); | |
| 1996 GLC(gl, | |
| 1997 gl->TexParameteri( | |
| 1998 resource->target, GL_TEXTURE_POOL_CHROMIUM, resource->texture_pool)); | |
| 1999 if (use_texture_usage_hint_ && (resource->hint & TEXTURE_HINT_FRAMEBUFFER)) { | 1984 if (use_texture_usage_hint_ && (resource->hint & TEXTURE_HINT_FRAMEBUFFER)) { |
| 2000 GLC(gl, | 1985 gl->TexParameteri(resource->target, GL_TEXTURE_USAGE_ANGLE, |
| 2001 gl->TexParameteri(resource->target, | 1986 GL_FRAMEBUFFER_ATTACHMENT_ANGLE); |
| 2002 GL_TEXTURE_USAGE_ANGLE, | |
| 2003 GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); | |
| 2004 } | 1987 } |
| 2005 } | 1988 } |
| 2006 | 1989 |
| 2007 void ResourceProvider::AllocateForTesting(ResourceId id) { | 1990 void ResourceProvider::AllocateForTesting(ResourceId id) { |
| 2008 LazyAllocate(GetResource(id)); | 1991 LazyAllocate(GetResource(id)); |
| 2009 } | 1992 } |
| 2010 | 1993 |
| 2011 void ResourceProvider::LazyAllocate(Resource* resource) { | 1994 void ResourceProvider::LazyAllocate(Resource* resource) { |
| 2012 DCHECK(resource); | 1995 DCHECK(resource); |
| 2013 if (resource->allocated) | 1996 if (resource->allocated) |
| 2014 return; | 1997 return; |
| 2015 LazyCreate(resource); | 1998 LazyCreate(resource); |
| 2016 if (!resource->gl_id) | 1999 if (!resource->gl_id) |
| 2017 return; | 2000 return; |
| 2018 resource->allocated = true; | 2001 resource->allocated = true; |
| 2019 GLES2Interface* gl = ContextGL(); | 2002 GLES2Interface* gl = ContextGL(); |
| 2020 gfx::Size& size = resource->size; | 2003 gfx::Size& size = resource->size; |
| 2021 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); | 2004 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); |
| 2022 ResourceFormat format = resource->format; | 2005 ResourceFormat format = resource->format; |
| 2023 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); | 2006 gl->BindTexture(GL_TEXTURE_2D, resource->gl_id); |
| 2024 if (use_texture_storage_ext_ && | 2007 if (use_texture_storage_ext_ && |
| 2025 IsFormatSupportedForStorage(format, use_texture_format_bgra_) && | 2008 IsFormatSupportedForStorage(format, use_texture_format_bgra_) && |
| 2026 (resource->hint & TEXTURE_HINT_IMMUTABLE)) { | 2009 (resource->hint & TEXTURE_HINT_IMMUTABLE)) { |
| 2027 GLenum storage_format = TextureToStorageFormat(format); | 2010 GLenum storage_format = TextureToStorageFormat(format); |
| 2028 GLC(gl, | 2011 gl->TexStorage2DEXT(GL_TEXTURE_2D, 1, storage_format, size.width(), |
| 2029 gl->TexStorage2DEXT( | 2012 size.height()); |
| 2030 GL_TEXTURE_2D, 1, storage_format, size.width(), size.height())); | |
| 2031 } else { | 2013 } else { |
| 2032 // ETC1 does not support preallocation. | 2014 // ETC1 does not support preallocation. |
| 2033 if (format != ETC1) { | 2015 if (format != ETC1) { |
| 2034 GLC(gl, | 2016 gl->TexImage2D(GL_TEXTURE_2D, 0, GLInternalFormat(format), size.width(), |
| 2035 gl->TexImage2D(GL_TEXTURE_2D, | 2017 size.height(), 0, GLDataFormat(format), GLDataType(format), |
| 2036 0, | 2018 NULL); |
| 2037 GLInternalFormat(format), | |
| 2038 size.width(), | |
| 2039 size.height(), | |
| 2040 0, | |
| 2041 GLDataFormat(format), | |
| 2042 GLDataType(format), | |
| 2043 NULL)); | |
| 2044 } | 2019 } |
| 2045 } | 2020 } |
| 2046 } | 2021 } |
| 2047 | 2022 |
| 2048 void ResourceProvider::BindImageForSampling(Resource* resource) { | 2023 void ResourceProvider::BindImageForSampling(Resource* resource) { |
| 2049 GLES2Interface* gl = ContextGL(); | 2024 GLES2Interface* gl = ContextGL(); |
| 2050 DCHECK(resource->gl_id); | 2025 DCHECK(resource->gl_id); |
| 2051 DCHECK(resource->image_id); | 2026 DCHECK(resource->image_id); |
| 2052 | 2027 |
| 2053 // Release image currently bound to texture. | 2028 // Release image currently bound to texture. |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2131 Resource* resource = GetResource(id); | 2106 Resource* resource = GetResource(id); |
| 2132 DCHECK_EQ(resource->exported_count, 0); | 2107 DCHECK_EQ(resource->exported_count, 0); |
| 2133 DCHECK(resource->allocated); | 2108 DCHECK(resource->allocated); |
| 2134 if (resource->type != RESOURCE_TYPE_GL_TEXTURE || resource->gl_id) | 2109 if (resource->type != RESOURCE_TYPE_GL_TEXTURE || resource->gl_id) |
| 2135 return; | 2110 return; |
| 2136 if (!resource->mailbox.sync_point()) | 2111 if (!resource->mailbox.sync_point()) |
| 2137 return; | 2112 return; |
| 2138 DCHECK(resource->mailbox.IsValid()); | 2113 DCHECK(resource->mailbox.IsValid()); |
| 2139 GLES2Interface* gl = ContextGL(); | 2114 GLES2Interface* gl = ContextGL(); |
| 2140 DCHECK(gl); | 2115 DCHECK(gl); |
| 2141 GLC(gl, gl->WaitSyncPointCHROMIUM(resource->mailbox.sync_point())); | 2116 gl->WaitSyncPointCHROMIUM(resource->mailbox.sync_point()); |
| 2142 resource->mailbox.set_sync_point(0); | 2117 resource->mailbox.set_sync_point(0); |
| 2143 } | 2118 } |
| 2144 | 2119 |
| 2145 void ResourceProvider::WaitReadLockIfNeeded(ResourceId id) { | 2120 void ResourceProvider::WaitReadLockIfNeeded(ResourceId id) { |
| 2146 Resource* resource = GetResource(id); | 2121 Resource* resource = GetResource(id); |
| 2147 DCHECK_EQ(resource->exported_count, 0); | 2122 DCHECK_EQ(resource->exported_count, 0); |
| 2148 if (!resource->read_lock_fence.get()) | 2123 if (!resource->read_lock_fence.get()) |
| 2149 return; | 2124 return; |
| 2150 | 2125 |
| 2151 resource->read_lock_fence->Wait(); | 2126 resource->read_lock_fence->Wait(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2163 } | 2138 } |
| 2164 | 2139 |
| 2165 class GrContext* ResourceProvider::GrContext(bool worker_context) const { | 2140 class GrContext* ResourceProvider::GrContext(bool worker_context) const { |
| 2166 ContextProvider* context_provider = | 2141 ContextProvider* context_provider = |
| 2167 worker_context ? output_surface_->worker_context_provider() | 2142 worker_context ? output_surface_->worker_context_provider() |
| 2168 : output_surface_->context_provider(); | 2143 : output_surface_->context_provider(); |
| 2169 return context_provider ? context_provider->GrContext() : NULL; | 2144 return context_provider ? context_provider->GrContext() : NULL; |
| 2170 } | 2145 } |
| 2171 | 2146 |
| 2172 } // namespace cc | 2147 } // namespace cc |
| OLD | NEW |