Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Side by Side Diff: cc/resources/resource_provider.cc

Issue 1951193002: cc: Add mailbox support to ResourceProvider write locks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@worker_context_stream
Patch Set: cleanup tasks if ordering barrier fails Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698