| 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 <stddef.h> | 7 #include <stddef.h> | 
| 8 #include <stdint.h> | 8 #include <stdint.h> | 
| 9 | 9 | 
| 10 #include <algorithm> | 10 #include <algorithm> | 
| (...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 688     return; | 688     return; | 
| 689   } else { | 689   } else { | 
| 690     DeleteResourceInternal(it, NORMAL); | 690     DeleteResourceInternal(it, NORMAL); | 
| 691   } | 691   } | 
| 692 } | 692 } | 
| 693 | 693 | 
| 694 void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, | 694 void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, | 
| 695                                               DeleteStyle style) { | 695                                               DeleteStyle style) { | 
| 696   TRACE_EVENT0("cc", "ResourceProvider::DeleteResourceInternal"); | 696   TRACE_EVENT0("cc", "ResourceProvider::DeleteResourceInternal"); | 
| 697   Resource* resource = &it->second; | 697   Resource* resource = &it->second; | 
| 698   bool lost_resource = resource->lost; | 698   DCHECK(resource->exported_count == 0 || style != NORMAL); | 
| 699 | 699 | 
| 700   DCHECK(resource->exported_count == 0 || style != NORMAL); | 700   // Exported resources are lost on shutdown. | 
| 701   if (style == FOR_SHUTDOWN && resource->exported_count > 0) | 701   bool exported_resource_lost = | 
| 702     lost_resource = true; | 702       style == FOR_SHUTDOWN && resource->exported_count > 0; | 
|  | 703   // GPU resources are lost when output surface is lost. | 
|  | 704   bool gpu_resource_lost = | 
|  | 705       IsGpuResourceType(resource->type) && lost_output_surface_; | 
|  | 706   bool lost_resource = | 
|  | 707       resource->lost || exported_resource_lost || gpu_resource_lost; | 
|  | 708 | 
|  | 709   if (!lost_resource && | 
|  | 710       resource->synchronization_state() == Resource::NEEDS_WAIT) { | 
|  | 711     DCHECK(resource->allocated); | 
|  | 712     DCHECK(IsGpuResourceType(resource->type)); | 
|  | 713     GLES2Interface* gl = ContextGL(); | 
|  | 714     DCHECK(gl); | 
|  | 715     resource->WaitSyncToken(gl); | 
|  | 716   } | 
| 703 | 717 | 
| 704   if (resource->image_id) { | 718   if (resource->image_id) { | 
| 705     DCHECK(resource->origin == Resource::INTERNAL); | 719     DCHECK(resource->origin == Resource::INTERNAL); | 
| 706     GLES2Interface* gl = ContextGL(); | 720     GLES2Interface* gl = ContextGL(); | 
| 707     DCHECK(gl); | 721     DCHECK(gl); | 
| 708     gl->DestroyImageCHROMIUM(resource->image_id); | 722     gl->DestroyImageCHROMIUM(resource->image_id); | 
| 709   } | 723   } | 
| 710   if (resource->gl_upload_query_id) { | 724   if (resource->gl_upload_query_id) { | 
| 711     DCHECK(resource->origin == Resource::INTERNAL); | 725     DCHECK(resource->origin == Resource::INTERNAL); | 
| 712     GLES2Interface* gl = ContextGL(); | 726     GLES2Interface* gl = ContextGL(); | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 723     DCHECK(resource->origin == Resource::INTERNAL); | 737     DCHECK(resource->origin == Resource::INTERNAL); | 
| 724     GLES2Interface* gl = ContextGL(); | 738     GLES2Interface* gl = ContextGL(); | 
| 725     DCHECK(gl); | 739     DCHECK(gl); | 
| 726     gl->DeleteBuffers(1, &resource->gl_pixel_buffer_id); | 740     gl->DeleteBuffers(1, &resource->gl_pixel_buffer_id); | 
| 727   } | 741   } | 
| 728   if (resource->origin == Resource::EXTERNAL) { | 742   if (resource->origin == Resource::EXTERNAL) { | 
| 729     DCHECK(resource->mailbox().IsValid()); | 743     DCHECK(resource->mailbox().IsValid()); | 
| 730     gpu::SyncToken sync_token = resource->mailbox().sync_token(); | 744     gpu::SyncToken sync_token = resource->mailbox().sync_token(); | 
| 731     if (IsGpuResourceType(resource->type)) { | 745     if (IsGpuResourceType(resource->type)) { | 
| 732       DCHECK(resource->mailbox().IsTexture()); | 746       DCHECK(resource->mailbox().IsTexture()); | 
| 733       lost_resource |= lost_output_surface_; |  | 
| 734       GLES2Interface* gl = ContextGL(); | 747       GLES2Interface* gl = ContextGL(); | 
| 735       DCHECK(gl); | 748       DCHECK(gl); | 
| 736       if (resource->gl_id) { | 749       if (resource->gl_id) { | 
| 737         gl->DeleteTextures(1, &resource->gl_id); | 750         gl->DeleteTextures(1, &resource->gl_id); | 
| 738         resource->gl_id = 0; | 751         resource->gl_id = 0; | 
| 739         if (!lost_resource) { | 752         if (!lost_resource) { | 
| 740           const GLuint64 fence_sync = gl->InsertFenceSyncCHROMIUM(); | 753           const GLuint64 fence_sync = gl->InsertFenceSyncCHROMIUM(); | 
| 741           gl->ShallowFlushCHROMIUM(); | 754           gl->ShallowFlushCHROMIUM(); | 
| 742           gl->GenSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); | 755           gl->GenSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); | 
| 743         } | 756         } | 
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 809     DCHECK(resource->allocated); | 822     DCHECK(resource->allocated); | 
| 810     DCHECK_EQ(RGBA_8888, resource->format); | 823     DCHECK_EQ(RGBA_8888, resource->format); | 
| 811     SkImageInfo source_info = | 824     SkImageInfo source_info = | 
| 812         SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()); | 825         SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()); | 
| 813     size_t image_stride = image_size.width() * 4; | 826     size_t image_stride = image_size.width() * 4; | 
| 814 | 827 | 
| 815     ScopedWriteLockSoftware lock(this, id); | 828     ScopedWriteLockSoftware lock(this, id); | 
| 816     SkCanvas dest(lock.sk_bitmap()); | 829     SkCanvas dest(lock.sk_bitmap()); | 
| 817     dest.writePixels(source_info, image, image_stride, 0, 0); | 830     dest.writePixels(source_info, image, image_stride, 0, 0); | 
| 818   } else { | 831   } else { | 
| 819     ScopedWriteLockGL lock(this, id); | 832     ScopedWriteLockGL lock(this, id, false); | 
| 820     DCHECK(lock.texture_id()); | 833     unsigned resource_texture_id = lock.texture_id(); | 
|  | 834     DCHECK(resource_texture_id); | 
| 821     GLES2Interface* gl = ContextGL(); | 835     GLES2Interface* gl = ContextGL(); | 
| 822     DCHECK(gl); | 836     DCHECK(gl); | 
| 823     gl->BindTexture(resource->target, lock.texture_id()); | 837     gl->BindTexture(resource->target, resource_texture_id); | 
| 824     if (resource->format == ETC1) { | 838     if (resource->format == ETC1) { | 
| 825       DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); | 839       DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); | 
| 826       int image_bytes = ResourceUtil::CheckedSizeInBytes<int>(image_size, ETC1); | 840       int image_bytes = ResourceUtil::CheckedSizeInBytes<int>(image_size, ETC1); | 
| 827       gl->CompressedTexImage2D(resource->target, 0, GLInternalFormat(ETC1), | 841       gl->CompressedTexImage2D(resource->target, 0, GLInternalFormat(ETC1), | 
| 828                                image_size.width(), image_size.height(), 0, | 842                                image_size.width(), image_size.height(), 0, | 
| 829                                image_bytes, image); | 843                                image_bytes, image); | 
| 830     } else { | 844     } else { | 
| 831       gl->TexSubImage2D(resource->target, 0, 0, 0, image_size.width(), | 845       gl->TexSubImage2D(resource->target, 0, 0, 0, image_size.width(), | 
| 832                         image_size.height(), GLDataFormat(resource->format), | 846                         image_size.height(), GLDataFormat(resource->format), | 
| 833                         GLDataType(resource->format), image); | 847                         GLDataType(resource->format), image); | 
| 834     } | 848     } | 
| 835     const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); | 849     const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); | 
| 836     gl->OrderingBarrierCHROMIUM(); | 850     gl->OrderingBarrierCHROMIUM(); | 
| 837     gpu::SyncToken sync_token; | 851     gpu::SyncToken sync_token; | 
| 838     gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); | 852     gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); | 
| 839     lock.UpdateResourceSyncToken(sync_token); | 853     lock.set_sync_token(sync_token); | 
|  | 854     lock.set_synchronized(true); | 
| 840   } | 855   } | 
| 841 } | 856 } | 
| 842 | 857 | 
| 843 void ResourceProvider::GenerateSyncTokenForResource(ResourceId resource_id) { | 858 void ResourceProvider::GenerateSyncTokenForResource(ResourceId resource_id) { | 
| 844   Resource* resource = GetResource(resource_id); | 859   Resource* resource = GetResource(resource_id); | 
| 845   if (!resource->needs_sync_token()) | 860   if (!resource->needs_sync_token()) | 
| 846     return; | 861     return; | 
| 847 | 862 | 
| 848   gpu::SyncToken sync_token; | 863   gpu::SyncToken sync_token; | 
| 849   GLES2Interface* gl = ContextGL(); | 864   GLES2Interface* gl = ContextGL(); | 
| 850   DCHECK(gl); | 865   DCHECK(gl); | 
| 851 | 866 | 
| 852   const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); | 867   const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); | 
| 853   gl->OrderingBarrierCHROMIUM(); | 868   gl->OrderingBarrierCHROMIUM(); | 
| 854   gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); | 869   gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); | 
| 855 | 870 | 
| 856   resource->UpdateSyncToken(sync_token); | 871   resource->UpdateSyncToken(sync_token); | 
|  | 872   resource->SetSynchronized(); | 
| 857 } | 873 } | 
| 858 | 874 | 
| 859 void ResourceProvider::GenerateSyncTokenForResources( | 875 void ResourceProvider::GenerateSyncTokenForResources( | 
| 860     const ResourceIdArray& resource_ids) { | 876     const ResourceIdArray& resource_ids) { | 
| 861   gpu::SyncToken sync_token; | 877   gpu::SyncToken sync_token; | 
| 862   bool created_sync_token = false; | 878   bool created_sync_token = false; | 
| 863   for (ResourceId id : resource_ids) { | 879   for (ResourceId id : resource_ids) { | 
| 864     Resource* resource = GetResource(id); | 880     Resource* resource = GetResource(id); | 
| 865     if (resource->needs_sync_token()) { | 881     if (resource->needs_sync_token()) { | 
| 866       if (!created_sync_token) { | 882       if (!created_sync_token) { | 
| 867         GLES2Interface* gl = ContextGL(); | 883         GLES2Interface* gl = ContextGL(); | 
| 868         DCHECK(gl); | 884         DCHECK(gl); | 
| 869 | 885 | 
| 870         const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); | 886         const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); | 
| 871         gl->OrderingBarrierCHROMIUM(); | 887         gl->OrderingBarrierCHROMIUM(); | 
| 872         gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); | 888         gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); | 
| 873         created_sync_token = true; | 889         created_sync_token = true; | 
| 874       } | 890       } | 
| 875 | 891 | 
| 876       resource->UpdateSyncToken(sync_token); | 892       resource->UpdateSyncToken(sync_token); | 
|  | 893       resource->SetSynchronized(); | 
| 877     } | 894     } | 
| 878   } | 895   } | 
| 879 } | 896 } | 
| 880 | 897 | 
| 881 ResourceProvider::Resource* ResourceProvider::InsertResource( | 898 ResourceProvider::Resource* ResourceProvider::InsertResource( | 
| 882     ResourceId id, | 899     ResourceId id, | 
| 883     Resource resource) { | 900     Resource resource) { | 
| 884   std::pair<ResourceMap::iterator, bool> result = | 901   std::pair<ResourceMap::iterator, bool> result = | 
| 885       resources_.insert(ResourceMap::value_type(id, std::move(resource))); | 902       resources_.insert(ResourceMap::value_type(id, std::move(resource))); | 
| 886   DCHECK(result.second); | 903   DCHECK(result.second); | 
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 975       ResourceIdArray unused; | 992       ResourceIdArray unused; | 
| 976       unused.push_back(id); | 993       unused.push_back(id); | 
| 977       DeleteAndReturnUnusedResourcesToChild(child_it, NORMAL, unused); | 994       DeleteAndReturnUnusedResourcesToChild(child_it, NORMAL, unused); | 
| 978     } | 995     } | 
| 979   } | 996   } | 
| 980 } | 997 } | 
| 981 | 998 | 
| 982 ResourceProvider::Resource* ResourceProvider::LockForWrite(ResourceId id) { | 999 ResourceProvider::Resource* ResourceProvider::LockForWrite(ResourceId id) { | 
| 983   Resource* resource = GetResource(id); | 1000   Resource* resource = GetResource(id); | 
| 984   DCHECK(CanLockForWrite(id)); | 1001   DCHECK(CanLockForWrite(id)); | 
| 985   DCHECK_NE(Resource::NEEDS_WAIT, resource->synchronization_state()); | 1002   if (resource->allocated) | 
|  | 1003     WaitSyncTokenIfNeeded(id); | 
| 986   resource->locked_for_write = true; | 1004   resource->locked_for_write = true; | 
| 987   resource->SetLocallyUsed(); | 1005   resource->SetLocallyUsed(); | 
| 988   return resource; | 1006   return resource; | 
| 989 } | 1007 } | 
| 990 | 1008 | 
| 991 bool ResourceProvider::CanLockForWrite(ResourceId id) { | 1009 bool ResourceProvider::CanLockForWrite(ResourceId id) { | 
| 992   Resource* resource = GetResource(id); | 1010   Resource* resource = GetResource(id); | 
| 993   return !resource->locked_for_write && !resource->lock_for_read_count && | 1011   return !resource->locked_for_write && !resource->lock_for_read_count && | 
| 994          !resource->exported_count && resource->origin == Resource::INTERNAL && | 1012          !resource->exported_count && resource->origin == Resource::INTERNAL && | 
| 995          !resource->lost && ReadLockFenceHasPassed(resource); | 1013          !resource->lost && ReadLockFenceHasPassed(resource); | 
| 996 } | 1014 } | 
| 997 | 1015 | 
| 998 bool ResourceProvider::IsOverlayCandidate(ResourceId id) { | 1016 bool ResourceProvider::IsOverlayCandidate(ResourceId id) { | 
| 999   Resource* resource = GetResource(id); | 1017   Resource* resource = GetResource(id); | 
| 1000   return resource->is_overlay_candidate; | 1018   return resource->is_overlay_candidate; | 
| 1001 } | 1019 } | 
| 1002 | 1020 | 
| 1003 void ResourceProvider::UnlockForWrite(ResourceProvider::Resource* resource) { | 1021 void ResourceProvider::UnlockForWrite(Resource* resource) { | 
| 1004   DCHECK(resource->locked_for_write); | 1022   DCHECK(resource->locked_for_write); | 
| 1005   DCHECK_EQ(resource->exported_count, 0); | 1023   DCHECK_EQ(resource->exported_count, 0); | 
| 1006   DCHECK(resource->origin == Resource::INTERNAL); | 1024   DCHECK(resource->origin == Resource::INTERNAL); | 
| 1007   resource->locked_for_write = false; | 1025   resource->locked_for_write = false; | 
| 1008   resource->SetSynchronized(); |  | 
| 1009 } | 1026 } | 
| 1010 | 1027 | 
| 1011 void ResourceProvider::EnableReadLockFencesForTesting(ResourceId id) { | 1028 void ResourceProvider::EnableReadLockFencesForTesting(ResourceId id) { | 
| 1012   Resource* resource = GetResource(id); | 1029   Resource* resource = GetResource(id); | 
| 1013   DCHECK(resource); | 1030   DCHECK(resource); | 
| 1014   resource->read_lock_fences_enabled = true; | 1031   resource->read_lock_fences_enabled = true; | 
| 1015 } | 1032 } | 
| 1016 | 1033 | 
| 1017 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( | 1034 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( | 
| 1018     ResourceProvider* resource_provider, | 1035     ResourceProvider* resource_provider, | 
| 1019     ResourceId resource_id) | 1036     ResourceId resource_id) | 
| 1020     : resource_provider_(resource_provider), | 1037     : resource_provider_(resource_provider), resource_id_(resource_id) { | 
| 1021       resource_id_(resource_id), | 1038   const Resource* resource = resource_provider->LockForRead(resource_id, false); | 
| 1022       resource_(resource_provider->LockForRead(resource_id, false)) { | 1039   texture_id_ = resource->gl_id; | 
| 1023   DCHECK(resource_); | 1040   target_ = resource->target; | 
|  | 1041   size_ = resource->size; | 
| 1024 } | 1042 } | 
| 1025 | 1043 | 
| 1026 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { | 1044 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { | 
| 1027   resource_provider_->UnlockForRead(resource_id_); | 1045   resource_provider_->UnlockForRead(resource_id_); | 
| 1028 } | 1046 } | 
| 1029 | 1047 | 
| 1030 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( | 1048 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( | 
| 1031     ResourceProvider* resource_provider, | 1049     ResourceProvider* resource_provider, | 
| 1032     ResourceId resource_id, | 1050     ResourceId resource_id, | 
| 1033     GLenum filter) | 1051     GLenum filter) | 
| 1034     : ScopedReadLockGL(resource_provider, resource_id), | 1052     : resource_lock_(resource_provider, resource_id), | 
| 1035       unit_(GL_TEXTURE0), | 1053       unit_(GL_TEXTURE0), | 
| 1036       target_(resource_provider->BindForSampling(resource_id, unit_, filter)) { | 1054       target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {} | 
| 1037 } |  | 
| 1038 | 1055 | 
| 1039 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( | 1056 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( | 
| 1040     ResourceProvider* resource_provider, | 1057     ResourceProvider* resource_provider, | 
| 1041     ResourceId resource_id, | 1058     ResourceId resource_id, | 
| 1042     GLenum unit, | 1059     GLenum unit, | 
| 1043     GLenum filter) | 1060     GLenum filter) | 
| 1044     : ScopedReadLockGL(resource_provider, resource_id), | 1061     : resource_lock_(resource_provider, resource_id), | 
| 1045       unit_(unit), | 1062       unit_(unit), | 
| 1046       target_(resource_provider->BindForSampling(resource_id, unit_, filter)) { | 1063       target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {} | 
| 1047 } |  | 
| 1048 | 1064 | 
| 1049 ResourceProvider::ScopedSamplerGL::~ScopedSamplerGL() { | 1065 ResourceProvider::ScopedSamplerGL::~ScopedSamplerGL() { | 
| 1050 } | 1066 } | 
| 1051 | 1067 | 
| 1052 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL( | 1068 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL( | 
| 1053     ResourceProvider* resource_provider, | 1069     ResourceProvider* resource_provider, | 
| 1054     ResourceId resource_id) | 1070     ResourceId resource_id, | 
|  | 1071     bool create_mailbox) | 
| 1055     : resource_provider_(resource_provider), | 1072     : resource_provider_(resource_provider), | 
| 1056       resource_(resource_provider->LockForWrite(resource_id)), | 1073       resource_id_(resource_id), | 
| 1057       texture_id_(0), | 1074       synchronized_(false) { | 
| 1058       set_sync_token_(false) { | 1075   DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1059   resource_provider_->LazyAllocate(resource_); | 1076   Resource* resource = resource_provider->LockForWrite(resource_id); | 
| 1060   texture_id_ = resource_->gl_id; | 1077   resource_provider_->LazyAllocate(resource); | 
| 1061   DCHECK(texture_id_); | 1078   if (resource->image_id && resource->dirty_image) | 
| 1062   if (resource_->image_id && resource_->dirty_image) | 1079     resource_provider_->BindImageForSampling(resource); | 
| 1063     resource_provider_->BindImageForSampling(resource_); | 1080   if (create_mailbox) { | 
|  | 1081     resource_provider_->CreateMailboxAndBindResource( | 
|  | 1082         resource_provider_->ContextGL(), resource); | 
|  | 1083   } | 
|  | 1084   texture_id_ = resource->gl_id; | 
|  | 1085   target_ = resource->target; | 
|  | 1086   format_ = resource->format; | 
|  | 1087   size_ = resource->size; | 
|  | 1088   mailbox_ = resource->mailbox(); | 
| 1064 } | 1089 } | 
| 1065 | 1090 | 
| 1066 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { | 1091 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { | 
| 1067   if (set_sync_token_) | 1092   DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1068     resource_->UpdateSyncToken(sync_token_); | 1093   Resource* resource = resource_provider_->GetResource(resource_id_); | 
| 1069   resource_provider_->UnlockForWrite(resource_); | 1094   DCHECK(resource->locked_for_write); | 
|  | 1095   if (sync_token_.HasData()) | 
|  | 1096     resource->UpdateSyncToken(sync_token_); | 
|  | 1097   if (synchronized_) | 
|  | 1098     resource->SetSynchronized(); | 
|  | 1099   resource_provider_->UnlockForWrite(resource); | 
|  | 1100 } | 
|  | 1101 | 
|  | 1102 ResourceProvider::ScopedTextureProvider::ScopedTextureProvider( | 
|  | 1103     gpu::gles2::GLES2Interface* gl, | 
|  | 1104     ScopedWriteLockGL* resource_lock, | 
|  | 1105     bool use_mailbox) | 
|  | 1106     : gl_(gl), use_mailbox_(use_mailbox) { | 
|  | 1107   if (use_mailbox_) { | 
|  | 1108     texture_id_ = gl_->CreateAndConsumeTextureCHROMIUM( | 
|  | 1109         resource_lock->target(), resource_lock->mailbox().name()); | 
|  | 1110   } else { | 
|  | 1111     texture_id_ = resource_lock->texture_id(); | 
|  | 1112   } | 
|  | 1113   DCHECK(texture_id_); | 
|  | 1114 } | 
|  | 1115 | 
|  | 1116 ResourceProvider::ScopedTextureProvider::~ScopedTextureProvider() { | 
|  | 1117   if (use_mailbox_) | 
|  | 1118     gl_->DeleteTextures(1, &texture_id_); | 
|  | 1119 } | 
|  | 1120 | 
|  | 1121 ResourceProvider::ScopedSkSurfaceProvider::ScopedSkSurfaceProvider( | 
|  | 1122     ContextProvider* context_provider, | 
|  | 1123     ScopedWriteLockGL* resource_lock, | 
|  | 1124     bool use_mailbox, | 
|  | 1125     bool use_distance_field_text, | 
|  | 1126     bool can_use_lcd_text, | 
|  | 1127     int msaa_sample_count) | 
|  | 1128     : texture_provider_(context_provider->ContextGL(), | 
|  | 1129                         resource_lock, | 
|  | 1130                         use_mailbox) { | 
|  | 1131   GrGLTextureInfo texture_info; | 
|  | 1132   texture_info.fID = texture_provider_.texture_id(); | 
|  | 1133   texture_info.fTarget = resource_lock->target(); | 
|  | 1134   GrBackendTextureDesc desc; | 
|  | 1135   desc.fFlags = kRenderTarget_GrBackendTextureFlag; | 
|  | 1136   desc.fWidth = resource_lock->size().width(); | 
|  | 1137   desc.fHeight = resource_lock->size().height(); | 
|  | 1138   desc.fConfig = ToGrPixelConfig(resource_lock->format()); | 
|  | 1139   desc.fOrigin = kTopLeft_GrSurfaceOrigin; | 
|  | 1140   desc.fTextureHandle = skia::GrGLTextureInfoToGrBackendObject(texture_info); | 
|  | 1141   desc.fSampleCnt = msaa_sample_count; | 
|  | 1142 | 
|  | 1143   uint32_t flags = | 
|  | 1144       use_distance_field_text ? SkSurfaceProps::kUseDistanceFieldFonts_Flag : 0; | 
|  | 1145   // Use unknown pixel geometry to disable LCD text. | 
|  | 1146   SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry); | 
|  | 1147   if (can_use_lcd_text) { | 
|  | 1148     // LegacyFontHost will get LCD text and skia figures out what type to use. | 
|  | 1149     surface_props = | 
|  | 1150         SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType); | 
|  | 1151   } | 
|  | 1152   sk_surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget( | 
|  | 1153       context_provider->GrContext(), desc, &surface_props); | 
|  | 1154 } | 
|  | 1155 | 
|  | 1156 ResourceProvider::ScopedSkSurfaceProvider::~ScopedSkSurfaceProvider() { | 
|  | 1157   if (sk_surface_.get()) { | 
|  | 1158     sk_surface_->prepareForExternalIO(); | 
|  | 1159     sk_surface_.reset(); | 
|  | 1160   } | 
| 1070 } | 1161 } | 
| 1071 | 1162 | 
| 1072 void ResourceProvider::PopulateSkBitmapWithResource( | 1163 void ResourceProvider::PopulateSkBitmapWithResource( | 
| 1073     SkBitmap* sk_bitmap, const Resource* resource) { | 1164     SkBitmap* sk_bitmap, const Resource* resource) { | 
| 1074   DCHECK_EQ(RGBA_8888, resource->format); | 1165   DCHECK_EQ(RGBA_8888, resource->format); | 
| 1075   SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(), | 1166   SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(), | 
| 1076                                                 resource->size.height()); | 1167                                                 resource->size.height()); | 
| 1077   sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes()); | 1168   sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes()); | 
| 1078 } | 1169 } | 
| 1079 | 1170 | 
| 1080 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( | 1171 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( | 
| 1081     ResourceProvider* resource_provider, | 1172     ResourceProvider* resource_provider, | 
| 1082     ResourceId resource_id) | 1173     ResourceId resource_id) | 
| 1083     : resource_provider_(resource_provider), resource_id_(resource_id) { | 1174     : resource_provider_(resource_provider), resource_id_(resource_id) { | 
| 1084   const Resource* resource = resource_provider->LockForRead(resource_id, false); | 1175   const Resource* resource = resource_provider->LockForRead(resource_id, false); | 
| 1085   ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource); | 1176   ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource); | 
| 1086 } | 1177 } | 
| 1087 | 1178 | 
| 1088 ResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() { | 1179 ResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() { | 
| 1089   resource_provider_->UnlockForRead(resource_id_); | 1180   resource_provider_->UnlockForRead(resource_id_); | 
| 1090 } | 1181 } | 
| 1091 | 1182 | 
| 1092 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( | 1183 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( | 
| 1093     ResourceProvider* resource_provider, | 1184     ResourceProvider* resource_provider, | 
| 1094     ResourceId resource_id) | 1185     ResourceId resource_id) | 
| 1095     : resource_provider_(resource_provider), | 1186     : resource_provider_(resource_provider), resource_id_(resource_id) { | 
| 1096       resource_(resource_provider->LockForWrite(resource_id)) { | 1187   ResourceProvider::PopulateSkBitmapWithResource( | 
| 1097   ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource_); | 1188       &sk_bitmap_, resource_provider->LockForWrite(resource_id)); | 
| 1098   DCHECK(valid()); | 1189   DCHECK(valid()); | 
| 1099 } | 1190 } | 
| 1100 | 1191 | 
| 1101 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { | 1192 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { | 
| 1102   DCHECK(thread_checker_.CalledOnValidThread()); | 1193   DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1103   resource_provider_->UnlockForWrite(resource_); | 1194   Resource* resource = resource_provider_->GetResource(resource_id_); | 
|  | 1195   DCHECK(resource); | 
|  | 1196   resource->SetSynchronized(); | 
|  | 1197   resource_provider_->UnlockForWrite(resource); | 
| 1104 } | 1198 } | 
| 1105 | 1199 | 
| 1106 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: | 1200 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: | 
| 1107     ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider, | 1201     ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider, | 
| 1108                                    ResourceId resource_id) | 1202                                    ResourceId resource_id) | 
| 1109     : resource_provider_(resource_provider), | 1203     : resource_provider_(resource_provider), resource_id_(resource_id) { | 
| 1110       resource_(resource_provider->LockForWrite(resource_id)) { | 1204   Resource* resource = resource_provider->LockForWrite(resource_id); | 
| 1111   DCHECK(IsGpuResourceType(resource_->type)); | 1205   DCHECK(IsGpuResourceType(resource->type)); | 
| 1112   gpu_memory_buffer_ = std::move(resource_->gpu_memory_buffer); | 1206   format_ = resource->format; | 
| 1113   resource_->gpu_memory_buffer = nullptr; | 1207   size_ = resource->size; | 
|  | 1208   gpu_memory_buffer_ = std::move(resource->gpu_memory_buffer); | 
|  | 1209   resource->gpu_memory_buffer = nullptr; | 
| 1114 } | 1210 } | 
| 1115 | 1211 | 
| 1116 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: | 1212 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: | 
| 1117     ~ScopedWriteLockGpuMemoryBuffer() { | 1213     ~ScopedWriteLockGpuMemoryBuffer() { | 
| 1118   DCHECK(thread_checker_.CalledOnValidThread()); | 1214   DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1119   resource_provider_->UnlockForWrite(resource_); | 1215   Resource* resource = resource_provider_->GetResource(resource_id_); | 
| 1120   if (!gpu_memory_buffer_) | 1216   DCHECK(resource); | 
| 1121     return; | 1217   if (gpu_memory_buffer_) { | 
| 1122 | 1218     DCHECK(!resource->gpu_memory_buffer); | 
| 1123   DCHECK(!resource_->gpu_memory_buffer); | 1219     resource_provider_->LazyCreate(resource); | 
| 1124   resource_provider_->LazyCreate(resource_); | 1220     resource->gpu_memory_buffer = std::move(gpu_memory_buffer_); | 
| 1125   resource_->gpu_memory_buffer = std::move(gpu_memory_buffer_); | 1221     if (resource->gpu_memory_buffer) | 
| 1126   if (resource_->gpu_memory_buffer) | 1222       resource->gpu_memory_buffer_id = resource->gpu_memory_buffer->GetId(); | 
| 1127     resource_->gpu_memory_buffer_id = resource_->gpu_memory_buffer->GetId(); | 1223     resource->allocated = true; | 
| 1128   resource_->allocated = true; | 1224     resource_provider_->LazyCreateImage(resource); | 
| 1129   resource_provider_->LazyCreateImage(resource_); | 1225     resource->dirty_image = true; | 
| 1130   resource_->dirty_image = true; | 1226     resource->is_overlay_candidate = true; | 
| 1131   resource_->is_overlay_candidate = true; | 1227     // GpuMemoryBuffer provides direct access to the memory used by the GPU. | 
| 1132   resource_->SetSynchronized(); | 1228     // Read lock fences are required to ensure that we're not trying to map a | 
| 1133 | 1229     // buffer that is currently in-use by the GPU. | 
| 1134   // GpuMemoryBuffer provides direct access to the memory used by the GPU. | 1230     resource->read_lock_fences_enabled = true; | 
| 1135   // Read lock fences are required to ensure that we're not trying to map a | 1231   } | 
| 1136   // buffer that is currently in-use by the GPU. | 1232   resource->SetSynchronized(); | 
| 1137   resource_->read_lock_fences_enabled = true; | 1233   resource_provider_->UnlockForWrite(resource); | 
| 1138 } | 1234 } | 
| 1139 | 1235 | 
| 1140 gfx::GpuMemoryBuffer* | 1236 gfx::GpuMemoryBuffer* | 
| 1141 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { | 1237 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { | 
| 1142   if (!gpu_memory_buffer_) { | 1238   if (!gpu_memory_buffer_) { | 
| 1143     gpu_memory_buffer_ = | 1239     gpu_memory_buffer_ = | 
| 1144         resource_provider_->gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( | 1240         resource_provider_->gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( | 
| 1145             resource_->size, BufferFormat(resource_->format), | 1241             size_, BufferFormat(format_), | 
| 1146             gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gpu::kNullSurfaceHandle); | 1242             gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gpu::kNullSurfaceHandle); | 
| 1147   } | 1243   } | 
| 1148   return gpu_memory_buffer_.get(); | 1244   return gpu_memory_buffer_.get(); | 
| 1149 } | 1245 } | 
| 1150 | 1246 | 
| 1151 ResourceProvider::ScopedReadLockGpuMemoryBuffer::ScopedReadLockGpuMemoryBuffer( | 1247 ResourceProvider::ScopedReadLockGpuMemoryBuffer::ScopedReadLockGpuMemoryBuffer( | 
| 1152     ResourceProvider* resource_provider, | 1248     ResourceProvider* resource_provider, | 
| 1153     ResourceId resource_id) | 1249     ResourceId resource_id) | 
| 1154     : resource_provider_(resource_provider), | 1250     : resource_provider_(resource_provider), resource_id_(resource_id) { | 
| 1155       resource_id_(resource_id), | 1251   const Resource* resource = resource_provider->LockForRead(resource_id, true); | 
| 1156       resource_(resource_provider->LockForRead(resource_id, true)) {} | 1252   gpu_memory_buffer_ = resource->gpu_memory_buffer.get(); | 
|  | 1253   texture_id_ = resource->gl_id; | 
|  | 1254 } | 
| 1157 | 1255 | 
| 1158 ResourceProvider::ScopedReadLockGpuMemoryBuffer:: | 1256 ResourceProvider::ScopedReadLockGpuMemoryBuffer:: | 
| 1159     ~ScopedReadLockGpuMemoryBuffer() { | 1257     ~ScopedReadLockGpuMemoryBuffer() { | 
| 1160   DCHECK(thread_checker_.CalledOnValidThread()); | 1258   DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1161   resource_provider_->UnlockForRead(resource_id_); | 1259   resource_provider_->UnlockForRead(resource_id_); | 
| 1162 } | 1260 } | 
| 1163 | 1261 | 
| 1164 gfx::GpuMemoryBuffer* |  | 
| 1165 ResourceProvider::ScopedReadLockGpuMemoryBuffer::GetGpuMemoryBuffer() const { |  | 
| 1166   return resource_->gpu_memory_buffer.get(); |  | 
| 1167 } |  | 
| 1168 |  | 
| 1169 unsigned ResourceProvider::ScopedReadLockGpuMemoryBuffer::GetTextureId() const { |  | 
| 1170   return resource_->gl_id; |  | 
| 1171 } |  | 
| 1172 |  | 
| 1173 ResourceId ResourceProvider::ScopedReadLockGpuMemoryBuffer::GetResourceId() |  | 
| 1174     const { |  | 
| 1175   return resource_id_; |  | 
| 1176 } |  | 
| 1177 |  | 
| 1178 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( |  | 
| 1179     ResourceProvider* resource_provider, |  | 
| 1180     ResourceId resource_id) |  | 
| 1181     : resource_provider_(resource_provider), |  | 
| 1182       resource_(resource_provider->LockForWrite(resource_id)), |  | 
| 1183       set_sync_token_(false) { |  | 
| 1184   DCHECK(thread_checker_.CalledOnValidThread()); |  | 
| 1185   resource_provider_->LazyAllocate(resource_); |  | 
| 1186   if (resource_->image_id && resource_->dirty_image) |  | 
| 1187     resource_provider_->BindImageForSampling(resource_); |  | 
| 1188 } |  | 
| 1189 |  | 
| 1190 ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() { |  | 
| 1191   DCHECK(thread_checker_.CalledOnValidThread()); |  | 
| 1192   DCHECK(resource_->locked_for_write); |  | 
| 1193   if (set_sync_token_) |  | 
| 1194     resource_->UpdateSyncToken(sync_token_); |  | 
| 1195 |  | 
| 1196   resource_provider_->UnlockForWrite(resource_); |  | 
| 1197 } |  | 
| 1198 |  | 
| 1199 void ResourceProvider::ScopedWriteLockGr::InitSkSurface( |  | 
| 1200     GrContext* gr_context, |  | 
| 1201     bool use_distance_field_text, |  | 
| 1202     bool can_use_lcd_text, |  | 
| 1203     int msaa_sample_count) { |  | 
| 1204   DCHECK(resource_->locked_for_write); |  | 
| 1205 |  | 
| 1206   GrGLTextureInfo texture_info; |  | 
| 1207   texture_info.fID = resource_->gl_id; |  | 
| 1208   texture_info.fTarget = resource_->target; |  | 
| 1209   GrBackendTextureDesc desc; |  | 
| 1210   desc.fFlags = kRenderTarget_GrBackendTextureFlag; |  | 
| 1211   desc.fWidth = resource_->size.width(); |  | 
| 1212   desc.fHeight = resource_->size.height(); |  | 
| 1213   desc.fConfig = ToGrPixelConfig(resource_->format); |  | 
| 1214   desc.fOrigin = kTopLeft_GrSurfaceOrigin; |  | 
| 1215   desc.fTextureHandle = skia::GrGLTextureInfoToGrBackendObject(texture_info); |  | 
| 1216   desc.fSampleCnt = msaa_sample_count; |  | 
| 1217 |  | 
| 1218   uint32_t flags = |  | 
| 1219       use_distance_field_text ? SkSurfaceProps::kUseDistanceFieldFonts_Flag : 0; |  | 
| 1220   // Use unknown pixel geometry to disable LCD text. |  | 
| 1221   SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry); |  | 
| 1222   if (can_use_lcd_text) { |  | 
| 1223     // LegacyFontHost will get LCD text and skia figures out what type to use. |  | 
| 1224     surface_props = |  | 
| 1225         SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType); |  | 
| 1226   } |  | 
| 1227   sk_surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget( |  | 
| 1228       gr_context, desc, &surface_props); |  | 
| 1229 } |  | 
| 1230 |  | 
| 1231 void ResourceProvider::ScopedWriteLockGr::ReleaseSkSurface() { |  | 
| 1232   DCHECK(sk_surface_); |  | 
| 1233   sk_surface_->prepareForExternalIO(); |  | 
| 1234   sk_surface_.reset(); |  | 
| 1235 } |  | 
| 1236 |  | 
| 1237 ResourceProvider::SynchronousFence::SynchronousFence( | 1262 ResourceProvider::SynchronousFence::SynchronousFence( | 
| 1238     gpu::gles2::GLES2Interface* gl) | 1263     gpu::gles2::GLES2Interface* gl) | 
| 1239     : gl_(gl), has_synchronized_(true) { | 1264     : gl_(gl), has_synchronized_(true) { | 
| 1240 } | 1265 } | 
| 1241 | 1266 | 
| 1242 ResourceProvider::SynchronousFence::~SynchronousFence() { | 1267 ResourceProvider::SynchronousFence::~SynchronousFence() { | 
| 1243 } | 1268 } | 
| 1244 | 1269 | 
| 1245 void ResourceProvider::SynchronousFence::Set() { | 1270 void ResourceProvider::SynchronousFence::Set() { | 
| 1246   has_synchronized_ = false; | 1271   has_synchronized_ = false; | 
| (...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1783   if (resource->type == RESOURCE_TYPE_GPU_MEMORY_BUFFER) { | 1808   if (resource->type == RESOURCE_TYPE_GPU_MEMORY_BUFFER) { | 
| 1784     resource->gpu_memory_buffer = | 1809     resource->gpu_memory_buffer = | 
| 1785         gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( | 1810         gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( | 
| 1786             size, BufferFormat(format), | 1811             size, BufferFormat(format), | 
| 1787             gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gpu::kNullSurfaceHandle); | 1812             gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gpu::kNullSurfaceHandle); | 
| 1788     if (resource->gpu_memory_buffer) | 1813     if (resource->gpu_memory_buffer) | 
| 1789       resource->gpu_memory_buffer_id = resource->gpu_memory_buffer->GetId(); | 1814       resource->gpu_memory_buffer_id = resource->gpu_memory_buffer->GetId(); | 
| 1790     LazyCreateImage(resource); | 1815     LazyCreateImage(resource); | 
| 1791     resource->dirty_image = true; | 1816     resource->dirty_image = true; | 
| 1792     resource->is_overlay_candidate = true; | 1817     resource->is_overlay_candidate = true; | 
|  | 1818     // GpuMemoryBuffer provides direct access to the memory used by the GPU. | 
|  | 1819     // Read lock fences are required to ensure that we're not trying to map a | 
|  | 1820     // buffer that is currently in-use by the GPU. | 
|  | 1821     resource->read_lock_fences_enabled = true; | 
| 1793   } else if (use_texture_storage_ext_ && | 1822   } else if (use_texture_storage_ext_ && | 
| 1794              IsFormatSupportedForStorage(format, use_texture_format_bgra_) && | 1823              IsFormatSupportedForStorage(format, use_texture_format_bgra_) && | 
| 1795              (resource->hint & TEXTURE_HINT_IMMUTABLE)) { | 1824              (resource->hint & TEXTURE_HINT_IMMUTABLE)) { | 
| 1796     GLenum storage_format = TextureToStorageFormat(format); | 1825     GLenum storage_format = TextureToStorageFormat(format); | 
| 1797     gl->TexStorage2DEXT(resource->target, 1, storage_format, size.width(), | 1826     gl->TexStorage2DEXT(resource->target, 1, storage_format, size.width(), | 
| 1798                         size.height()); | 1827                         size.height()); | 
| 1799   } else { | 1828   } else { | 
| 1800     // ETC1 does not support preallocation. | 1829     // ETC1 does not support preallocation. | 
| 1801     if (format != ETC1) { | 1830     if (format != ETC1) { | 
| 1802       gl->TexImage2D(resource->target, 0, GLInternalFormat(format), | 1831       gl->TexImage2D(resource->target, 0, GLInternalFormat(format), | 
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1959 | 1988 | 
| 1960     const int kImportance = 2; | 1989     const int kImportance = 2; | 
| 1961     pmd->CreateSharedGlobalAllocatorDump(guid); | 1990     pmd->CreateSharedGlobalAllocatorDump(guid); | 
| 1962     pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); | 1991     pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); | 
| 1963   } | 1992   } | 
| 1964 | 1993 | 
| 1965   return true; | 1994   return true; | 
| 1966 } | 1995 } | 
| 1967 | 1996 | 
| 1968 }  // namespace cc | 1997 }  // namespace cc | 
| OLD | NEW | 
|---|