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