| 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 820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 831 DCHECK(resource->allocated); | 831 DCHECK(resource->allocated); |
| 832 DCHECK_EQ(RGBA_8888, resource->format); | 832 DCHECK_EQ(RGBA_8888, resource->format); |
| 833 SkImageInfo source_info = | 833 SkImageInfo source_info = |
| 834 SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()); | 834 SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()); |
| 835 size_t image_stride = image_size.width() * 4; | 835 size_t image_stride = image_size.width() * 4; |
| 836 | 836 |
| 837 ScopedWriteLockSoftware lock(this, id); | 837 ScopedWriteLockSoftware lock(this, id); |
| 838 SkCanvas dest(lock.sk_bitmap()); | 838 SkCanvas dest(lock.sk_bitmap()); |
| 839 dest.writePixels(source_info, image, image_stride, 0, 0); | 839 dest.writePixels(source_info, image, image_stride, 0, 0); |
| 840 } else { | 840 } else { |
| 841 ScopedWriteLockGL lock(this, id); | 841 ScopedWriteLockGL lock(this, id, false); |
| 842 DCHECK(lock.texture_id()); | 842 unsigned resource_texture_id = lock.texture_id(); |
| 843 DCHECK(resource_texture_id); |
| 843 GLES2Interface* gl = ContextGL(); | 844 GLES2Interface* gl = ContextGL(); |
| 844 DCHECK(gl); | 845 DCHECK(gl); |
| 845 gl->BindTexture(resource->target, lock.texture_id()); | 846 gl->BindTexture(resource->target, resource_texture_id); |
| 846 if (resource->format == ETC1) { | 847 if (resource->format == ETC1) { |
| 847 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); | 848 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); |
| 848 int image_bytes = ResourceUtil::CheckedSizeInBytes<int>(image_size, ETC1); | 849 int image_bytes = ResourceUtil::CheckedSizeInBytes<int>(image_size, ETC1); |
| 849 gl->CompressedTexImage2D(resource->target, 0, GLInternalFormat(ETC1), | 850 gl->CompressedTexImage2D(resource->target, 0, GLInternalFormat(ETC1), |
| 850 image_size.width(), image_size.height(), 0, | 851 image_size.width(), image_size.height(), 0, |
| 851 image_bytes, image); | 852 image_bytes, image); |
| 852 } else { | 853 } else { |
| 853 gl->TexSubImage2D(resource->target, 0, 0, 0, image_size.width(), | 854 gl->TexSubImage2D(resource->target, 0, 0, 0, image_size.width(), |
| 854 image_size.height(), GLDataFormat(resource->format), | 855 image_size.height(), GLDataFormat(resource->format), |
| 855 GLDataType(resource->format), image); | 856 GLDataType(resource->format), image); |
| 856 } | 857 } |
| 857 const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); | 858 const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); |
| 858 gl->OrderingBarrierCHROMIUM(); | 859 gl->OrderingBarrierCHROMIUM(); |
| 859 gpu::SyncToken sync_token; | 860 gpu::SyncToken sync_token; |
| 860 gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); | 861 gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); |
| 861 lock.UpdateResourceSyncToken(sync_token); | 862 lock.set_sync_token(sync_token); |
| 862 } | 863 } |
| 863 } | 864 } |
| 864 | 865 |
| 865 void ResourceProvider::GenerateSyncTokenForResource(ResourceId resource_id) { | 866 void ResourceProvider::GenerateSyncTokenForResource(ResourceId resource_id) { |
| 866 Resource* resource = GetResource(resource_id); | 867 Resource* resource = GetResource(resource_id); |
| 867 if (!resource->needs_sync_token()) | 868 if (!resource->needs_sync_token()) |
| 868 return; | 869 return; |
| 869 | 870 |
| 870 gpu::SyncToken sync_token; | 871 gpu::SyncToken sync_token; |
| 871 GLES2Interface* gl = ContextGL(); | 872 GLES2Interface* gl = ContextGL(); |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1026 Resource* resource = GetResource(id); | 1027 Resource* resource = GetResource(id); |
| 1027 return resource->is_overlay_candidate; | 1028 return resource->is_overlay_candidate; |
| 1028 } | 1029 } |
| 1029 | 1030 |
| 1030 bool ResourceProvider::IsInUseByMacOSWindowServer(ResourceId id) { | 1031 bool ResourceProvider::IsInUseByMacOSWindowServer(ResourceId id) { |
| 1031 Resource* resource = GetResource(id); | 1032 Resource* resource = GetResource(id); |
| 1032 return resource->gpu_memory_buffer && | 1033 return resource->gpu_memory_buffer && |
| 1033 resource->gpu_memory_buffer->IsInUseByMacOSWindowServer(); | 1034 resource->gpu_memory_buffer->IsInUseByMacOSWindowServer(); |
| 1034 } | 1035 } |
| 1035 | 1036 |
| 1036 void ResourceProvider::UnlockForWrite(ResourceProvider::Resource* resource) { | 1037 void ResourceProvider::UnlockForWrite(Resource* resource) { |
| 1037 DCHECK(resource->locked_for_write); | 1038 DCHECK(resource->locked_for_write); |
| 1038 DCHECK_EQ(resource->exported_count, 0); | 1039 DCHECK_EQ(resource->exported_count, 0); |
| 1039 DCHECK(resource->origin == Resource::INTERNAL); | 1040 DCHECK(resource->origin == Resource::INTERNAL); |
| 1040 resource->locked_for_write = false; | 1041 resource->locked_for_write = false; |
| 1041 resource->SetSynchronized(); | 1042 resource->SetSynchronized(); |
| 1042 } | 1043 } |
| 1043 | 1044 |
| 1044 void ResourceProvider::EnableReadLockFencesForTesting(ResourceId id) { | 1045 void ResourceProvider::EnableReadLockFencesForTesting(ResourceId id) { |
| 1045 Resource* resource = GetResource(id); | 1046 Resource* resource = GetResource(id); |
| 1046 DCHECK(resource); | 1047 DCHECK(resource); |
| 1047 resource->read_lock_fences_enabled = true; | 1048 resource->read_lock_fences_enabled = true; |
| 1048 } | 1049 } |
| 1049 | 1050 |
| 1050 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( | 1051 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( |
| 1051 ResourceProvider* resource_provider, | 1052 ResourceProvider* resource_provider, |
| 1052 ResourceId resource_id) | 1053 ResourceId resource_id) |
| 1053 : resource_provider_(resource_provider), | 1054 : resource_provider_(resource_provider), resource_id_(resource_id) { |
| 1054 resource_id_(resource_id), | 1055 const Resource* resource = resource_provider->LockForRead(resource_id, false); |
| 1055 resource_(resource_provider->LockForRead(resource_id, false)) { | 1056 texture_id_ = resource->gl_id; |
| 1056 DCHECK(resource_); | 1057 target_ = resource->target; |
| 1058 size_ = resource->size; |
| 1057 } | 1059 } |
| 1058 | 1060 |
| 1059 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { | 1061 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { |
| 1060 resource_provider_->UnlockForRead(resource_id_); | 1062 resource_provider_->UnlockForRead(resource_id_); |
| 1061 } | 1063 } |
| 1062 | 1064 |
| 1063 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( | 1065 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( |
| 1064 ResourceProvider* resource_provider, | 1066 ResourceProvider* resource_provider, |
| 1065 ResourceId resource_id, | 1067 ResourceId resource_id, |
| 1066 GLenum filter) | 1068 GLenum filter) |
| 1067 : ScopedReadLockGL(resource_provider, resource_id), | 1069 : resource_lock_(resource_provider, resource_id), |
| 1068 unit_(GL_TEXTURE0), | 1070 unit_(GL_TEXTURE0), |
| 1069 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) { | 1071 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {} |
| 1070 } | |
| 1071 | 1072 |
| 1072 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( | 1073 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( |
| 1073 ResourceProvider* resource_provider, | 1074 ResourceProvider* resource_provider, |
| 1074 ResourceId resource_id, | 1075 ResourceId resource_id, |
| 1075 GLenum unit, | 1076 GLenum unit, |
| 1076 GLenum filter) | 1077 GLenum filter) |
| 1077 : ScopedReadLockGL(resource_provider, resource_id), | 1078 : resource_lock_(resource_provider, resource_id), |
| 1078 unit_(unit), | 1079 unit_(unit), |
| 1079 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) { | 1080 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {} |
| 1080 } | |
| 1081 | 1081 |
| 1082 ResourceProvider::ScopedSamplerGL::~ScopedSamplerGL() { | 1082 ResourceProvider::ScopedSamplerGL::~ScopedSamplerGL() { |
| 1083 } | 1083 } |
| 1084 | 1084 |
| 1085 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL( | 1085 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL( |
| 1086 ResourceProvider* resource_provider, | 1086 ResourceProvider* resource_provider, |
| 1087 ResourceId resource_id) | 1087 ResourceId resource_id, |
| 1088 : resource_provider_(resource_provider), | 1088 bool create_mailbox) |
| 1089 resource_(resource_provider->LockForWrite(resource_id)), | 1089 : resource_provider_(resource_provider), resource_id_(resource_id) { |
| 1090 texture_id_(0), | 1090 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1091 set_sync_token_(false) { | 1091 Resource* resource = resource_provider->LockForWrite(resource_id); |
| 1092 resource_provider_->LazyAllocate(resource_); | 1092 resource_provider_->LazyAllocate(resource); |
| 1093 texture_id_ = resource_->gl_id; | 1093 if (resource->image_id && resource->dirty_image) |
| 1094 DCHECK(texture_id_); | 1094 resource_provider_->BindImageForSampling(resource); |
| 1095 if (resource_->image_id && resource_->dirty_image) | 1095 if (create_mailbox) { |
| 1096 resource_provider_->BindImageForSampling(resource_); | 1096 resource_provider_->CreateMailboxAndBindResource( |
| 1097 resource_provider_->ContextGL(), resource); |
| 1098 } |
| 1099 texture_id_ = resource->gl_id; |
| 1100 target_ = resource->target; |
| 1101 format_ = resource->format; |
| 1102 size_ = resource->size; |
| 1103 mailbox_ = resource->mailbox(); |
| 1097 } | 1104 } |
| 1098 | 1105 |
| 1099 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { | 1106 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { |
| 1100 if (set_sync_token_) | 1107 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1101 resource_->UpdateSyncToken(sync_token_); | 1108 Resource* resource = resource_provider_->GetResource(resource_id_); |
| 1102 resource_provider_->UnlockForWrite(resource_); | 1109 DCHECK(resource->locked_for_write); |
| 1110 if (sync_token_.HasData()) |
| 1111 resource->UpdateSyncToken(sync_token_); |
| 1112 resource_provider_->UnlockForWrite(resource); |
| 1113 } |
| 1114 |
| 1115 ResourceProvider::ScopedTextureProvider::ScopedTextureProvider( |
| 1116 gpu::gles2::GLES2Interface* gl, |
| 1117 ScopedWriteLockGL* resource_lock, |
| 1118 bool use_mailbox) |
| 1119 : gl_(gl), use_mailbox_(use_mailbox) { |
| 1120 if (use_mailbox_) { |
| 1121 texture_id_ = gl_->CreateAndConsumeTextureCHROMIUM( |
| 1122 resource_lock->target(), resource_lock->mailbox().name()); |
| 1123 } else { |
| 1124 texture_id_ = resource_lock->texture_id(); |
| 1125 } |
| 1126 DCHECK(texture_id_); |
| 1127 } |
| 1128 |
| 1129 ResourceProvider::ScopedTextureProvider::~ScopedTextureProvider() { |
| 1130 if (use_mailbox_) |
| 1131 gl_->DeleteTextures(1, &texture_id_); |
| 1132 } |
| 1133 |
| 1134 ResourceProvider::ScopedSkSurfaceProvider::ScopedSkSurfaceProvider( |
| 1135 ContextProvider* context_provider, |
| 1136 ScopedWriteLockGL* resource_lock, |
| 1137 bool use_mailbox, |
| 1138 bool use_distance_field_text, |
| 1139 bool can_use_lcd_text, |
| 1140 int msaa_sample_count) |
| 1141 : texture_provider_(context_provider->ContextGL(), |
| 1142 resource_lock, |
| 1143 use_mailbox) { |
| 1144 GrGLTextureInfo texture_info; |
| 1145 texture_info.fID = texture_provider_.texture_id(); |
| 1146 texture_info.fTarget = resource_lock->target(); |
| 1147 GrBackendTextureDesc desc; |
| 1148 desc.fFlags = kRenderTarget_GrBackendTextureFlag; |
| 1149 desc.fWidth = resource_lock->size().width(); |
| 1150 desc.fHeight = resource_lock->size().height(); |
| 1151 desc.fConfig = ToGrPixelConfig(resource_lock->format()); |
| 1152 desc.fOrigin = kTopLeft_GrSurfaceOrigin; |
| 1153 desc.fTextureHandle = skia::GrGLTextureInfoToGrBackendObject(texture_info); |
| 1154 desc.fSampleCnt = msaa_sample_count; |
| 1155 |
| 1156 uint32_t flags = |
| 1157 use_distance_field_text ? SkSurfaceProps::kUseDistanceFieldFonts_Flag : 0; |
| 1158 // Use unknown pixel geometry to disable LCD text. |
| 1159 SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry); |
| 1160 if (can_use_lcd_text) { |
| 1161 // LegacyFontHost will get LCD text and skia figures out what type to use. |
| 1162 surface_props = |
| 1163 SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType); |
| 1164 } |
| 1165 sk_surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget( |
| 1166 context_provider->GrContext(), desc, &surface_props); |
| 1167 } |
| 1168 |
| 1169 ResourceProvider::ScopedSkSurfaceProvider::~ScopedSkSurfaceProvider() { |
| 1170 if (sk_surface_.get()) { |
| 1171 sk_surface_->prepareForExternalIO(); |
| 1172 sk_surface_.reset(); |
| 1173 } |
| 1103 } | 1174 } |
| 1104 | 1175 |
| 1105 void ResourceProvider::PopulateSkBitmapWithResource( | 1176 void ResourceProvider::PopulateSkBitmapWithResource( |
| 1106 SkBitmap* sk_bitmap, const Resource* resource) { | 1177 SkBitmap* sk_bitmap, const Resource* resource) { |
| 1107 DCHECK_EQ(RGBA_8888, resource->format); | 1178 DCHECK_EQ(RGBA_8888, resource->format); |
| 1108 SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(), | 1179 SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(), |
| 1109 resource->size.height()); | 1180 resource->size.height()); |
| 1110 sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes()); | 1181 sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes()); |
| 1111 } | 1182 } |
| 1112 | 1183 |
| 1113 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( | 1184 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( |
| 1114 ResourceProvider* resource_provider, | 1185 ResourceProvider* resource_provider, |
| 1115 ResourceId resource_id) | 1186 ResourceId resource_id) |
| 1116 : resource_provider_(resource_provider), resource_id_(resource_id) { | 1187 : resource_provider_(resource_provider), resource_id_(resource_id) { |
| 1117 const Resource* resource = resource_provider->LockForRead(resource_id, false); | 1188 const Resource* resource = resource_provider->LockForRead(resource_id, false); |
| 1118 ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource); | 1189 ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource); |
| 1119 } | 1190 } |
| 1120 | 1191 |
| 1121 ResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() { | 1192 ResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() { |
| 1122 resource_provider_->UnlockForRead(resource_id_); | 1193 resource_provider_->UnlockForRead(resource_id_); |
| 1123 } | 1194 } |
| 1124 | 1195 |
| 1125 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( | 1196 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( |
| 1126 ResourceProvider* resource_provider, | 1197 ResourceProvider* resource_provider, |
| 1127 ResourceId resource_id) | 1198 ResourceId resource_id) |
| 1128 : resource_provider_(resource_provider), | 1199 : resource_provider_(resource_provider), resource_id_(resource_id) { |
| 1129 resource_(resource_provider->LockForWrite(resource_id)) { | 1200 ResourceProvider::PopulateSkBitmapWithResource( |
| 1130 ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource_); | 1201 &sk_bitmap_, resource_provider->LockForWrite(resource_id)); |
| 1131 DCHECK(valid()); | 1202 DCHECK(valid()); |
| 1132 } | 1203 } |
| 1133 | 1204 |
| 1134 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { | 1205 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { |
| 1135 DCHECK(thread_checker_.CalledOnValidThread()); | 1206 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1136 resource_provider_->UnlockForWrite(resource_); | 1207 resource_provider_->UnlockForWrite( |
| 1208 resource_provider_->GetResource(resource_id_)); |
| 1137 } | 1209 } |
| 1138 | 1210 |
| 1139 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: | 1211 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: |
| 1140 ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider, | 1212 ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider, |
| 1141 ResourceId resource_id) | 1213 ResourceId resource_id) |
| 1142 : resource_provider_(resource_provider), | 1214 : resource_provider_(resource_provider), resource_id_(resource_id) { |
| 1143 resource_(resource_provider->LockForWrite(resource_id)) { | 1215 Resource* resource = resource_provider->LockForWrite(resource_id); |
| 1144 DCHECK(IsGpuResourceType(resource_->type)); | 1216 DCHECK(IsGpuResourceType(resource->type)); |
| 1145 gpu_memory_buffer_ = std::move(resource_->gpu_memory_buffer); | 1217 format_ = resource->format; |
| 1146 resource_->gpu_memory_buffer = nullptr; | 1218 size_ = resource->size; |
| 1219 gpu_memory_buffer_ = std::move(resource->gpu_memory_buffer); |
| 1220 resource->gpu_memory_buffer = nullptr; |
| 1147 } | 1221 } |
| 1148 | 1222 |
| 1149 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: | 1223 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: |
| 1150 ~ScopedWriteLockGpuMemoryBuffer() { | 1224 ~ScopedWriteLockGpuMemoryBuffer() { |
| 1151 DCHECK(thread_checker_.CalledOnValidThread()); | 1225 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1152 resource_provider_->UnlockForWrite(resource_); | 1226 Resource* resource = resource_provider_->GetResource(resource_id_); |
| 1153 if (!gpu_memory_buffer_) | 1227 if (gpu_memory_buffer_) { |
| 1154 return; | 1228 DCHECK(!resource->gpu_memory_buffer); |
| 1155 | 1229 resource_provider_->LazyCreate(resource); |
| 1156 DCHECK(!resource_->gpu_memory_buffer); | 1230 resource->gpu_memory_buffer = std::move(gpu_memory_buffer_); |
| 1157 resource_provider_->LazyCreate(resource_); | 1231 if (resource->gpu_memory_buffer) |
| 1158 resource_->gpu_memory_buffer = std::move(gpu_memory_buffer_); | 1232 resource->gpu_memory_buffer_id = resource->gpu_memory_buffer->GetId(); |
| 1159 if (resource_->gpu_memory_buffer) | 1233 resource->allocated = true; |
| 1160 resource_->gpu_memory_buffer_id = resource_->gpu_memory_buffer->GetId(); | 1234 resource_provider_->LazyCreateImage(resource); |
| 1161 resource_->allocated = true; | 1235 resource->dirty_image = true; |
| 1162 resource_provider_->LazyCreateImage(resource_); | 1236 resource->is_overlay_candidate = true; |
| 1163 resource_->dirty_image = true; | 1237 // GpuMemoryBuffer provides direct access to the memory used by the GPU. |
| 1164 resource_->is_overlay_candidate = true; | 1238 // Read lock fences are required to ensure that we're not trying to map a |
| 1165 resource_->SetSynchronized(); | 1239 // buffer that is currently in-use by the GPU. |
| 1166 | 1240 resource->read_lock_fences_enabled = true; |
| 1167 // GpuMemoryBuffer provides direct access to the memory used by the GPU. | 1241 } |
| 1168 // Read lock fences are required to ensure that we're not trying to map a | 1242 resource_provider_->UnlockForWrite(resource); |
| 1169 // buffer that is currently in-use by the GPU. | |
| 1170 resource_->read_lock_fences_enabled = true; | |
| 1171 } | 1243 } |
| 1172 | 1244 |
| 1173 gfx::GpuMemoryBuffer* | 1245 gfx::GpuMemoryBuffer* |
| 1174 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { | 1246 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { |
| 1175 if (!gpu_memory_buffer_) { | 1247 if (!gpu_memory_buffer_) { |
| 1176 gpu_memory_buffer_ = | 1248 gpu_memory_buffer_ = |
| 1177 resource_provider_->gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( | 1249 resource_provider_->gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( |
| 1178 resource_->size, BufferFormat(resource_->format), | 1250 size_, BufferFormat(format_), |
| 1179 gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gpu::kNullSurfaceHandle); | 1251 gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gpu::kNullSurfaceHandle); |
| 1180 } | 1252 } |
| 1181 return gpu_memory_buffer_.get(); | 1253 return gpu_memory_buffer_.get(); |
| 1182 } | 1254 } |
| 1183 | 1255 |
| 1184 ResourceProvider::ScopedReadLockGpuMemoryBuffer::ScopedReadLockGpuMemoryBuffer( | 1256 ResourceProvider::ScopedReadLockGpuMemoryBuffer::ScopedReadLockGpuMemoryBuffer( |
| 1185 ResourceProvider* resource_provider, | 1257 ResourceProvider* resource_provider, |
| 1186 ResourceId resource_id) | 1258 ResourceId resource_id) |
| 1187 : resource_provider_(resource_provider), | 1259 : resource_provider_(resource_provider), resource_id_(resource_id) { |
| 1188 resource_id_(resource_id), | 1260 const Resource* resource = resource_provider->LockForRead(resource_id, true); |
| 1189 resource_(resource_provider->LockForRead(resource_id, true)) {} | 1261 gpu_memory_buffer_ = resource->gpu_memory_buffer.get(); |
| 1262 texture_id_ = resource->gl_id; |
| 1263 } |
| 1190 | 1264 |
| 1191 ResourceProvider::ScopedReadLockGpuMemoryBuffer:: | 1265 ResourceProvider::ScopedReadLockGpuMemoryBuffer:: |
| 1192 ~ScopedReadLockGpuMemoryBuffer() { | 1266 ~ScopedReadLockGpuMemoryBuffer() { |
| 1193 DCHECK(thread_checker_.CalledOnValidThread()); | 1267 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1194 resource_provider_->UnlockForRead(resource_id_); | 1268 resource_provider_->UnlockForRead(resource_id_); |
| 1195 } | 1269 } |
| 1196 | 1270 |
| 1197 gfx::GpuMemoryBuffer* | |
| 1198 ResourceProvider::ScopedReadLockGpuMemoryBuffer::GetGpuMemoryBuffer() const { | |
| 1199 return resource_->gpu_memory_buffer.get(); | |
| 1200 } | |
| 1201 | |
| 1202 unsigned ResourceProvider::ScopedReadLockGpuMemoryBuffer::GetTextureId() const { | |
| 1203 return resource_->gl_id; | |
| 1204 } | |
| 1205 | |
| 1206 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( | |
| 1207 ResourceProvider* resource_provider, | |
| 1208 ResourceId resource_id) | |
| 1209 : resource_provider_(resource_provider), | |
| 1210 resource_(resource_provider->LockForWrite(resource_id)), | |
| 1211 set_sync_token_(false) { | |
| 1212 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 1213 resource_provider_->LazyAllocate(resource_); | |
| 1214 if (resource_->image_id && resource_->dirty_image) | |
| 1215 resource_provider_->BindImageForSampling(resource_); | |
| 1216 } | |
| 1217 | |
| 1218 ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() { | |
| 1219 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 1220 DCHECK(resource_->locked_for_write); | |
| 1221 if (set_sync_token_) | |
| 1222 resource_->UpdateSyncToken(sync_token_); | |
| 1223 | |
| 1224 resource_provider_->UnlockForWrite(resource_); | |
| 1225 } | |
| 1226 | |
| 1227 void ResourceProvider::ScopedWriteLockGr::InitSkSurface( | |
| 1228 GrContext* gr_context, | |
| 1229 bool use_distance_field_text, | |
| 1230 bool can_use_lcd_text, | |
| 1231 int msaa_sample_count) { | |
| 1232 DCHECK(resource_->locked_for_write); | |
| 1233 | |
| 1234 GrGLTextureInfo texture_info; | |
| 1235 texture_info.fID = resource_->gl_id; | |
| 1236 texture_info.fTarget = resource_->target; | |
| 1237 GrBackendTextureDesc desc; | |
| 1238 desc.fFlags = kRenderTarget_GrBackendTextureFlag; | |
| 1239 desc.fWidth = resource_->size.width(); | |
| 1240 desc.fHeight = resource_->size.height(); | |
| 1241 desc.fConfig = ToGrPixelConfig(resource_->format); | |
| 1242 desc.fOrigin = kTopLeft_GrSurfaceOrigin; | |
| 1243 desc.fTextureHandle = skia::GrGLTextureInfoToGrBackendObject(texture_info); | |
| 1244 desc.fSampleCnt = msaa_sample_count; | |
| 1245 | |
| 1246 uint32_t flags = | |
| 1247 use_distance_field_text ? SkSurfaceProps::kUseDistanceFieldFonts_Flag : 0; | |
| 1248 // Use unknown pixel geometry to disable LCD text. | |
| 1249 SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry); | |
| 1250 if (can_use_lcd_text) { | |
| 1251 // LegacyFontHost will get LCD text and skia figures out what type to use. | |
| 1252 surface_props = | |
| 1253 SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType); | |
| 1254 } | |
| 1255 sk_surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget( | |
| 1256 gr_context, desc, &surface_props); | |
| 1257 } | |
| 1258 | |
| 1259 void ResourceProvider::ScopedWriteLockGr::ReleaseSkSurface() { | |
| 1260 DCHECK(sk_surface_); | |
| 1261 sk_surface_->prepareForExternalIO(); | |
| 1262 sk_surface_.reset(); | |
| 1263 } | |
| 1264 | |
| 1265 ResourceProvider::SynchronousFence::SynchronousFence( | 1271 ResourceProvider::SynchronousFence::SynchronousFence( |
| 1266 gpu::gles2::GLES2Interface* gl) | 1272 gpu::gles2::GLES2Interface* gl) |
| 1267 : gl_(gl), has_synchronized_(true) { | 1273 : gl_(gl), has_synchronized_(true) { |
| 1268 } | 1274 } |
| 1269 | 1275 |
| 1270 ResourceProvider::SynchronousFence::~SynchronousFence() { | 1276 ResourceProvider::SynchronousFence::~SynchronousFence() { |
| 1271 } | 1277 } |
| 1272 | 1278 |
| 1273 void ResourceProvider::SynchronousFence::Set() { | 1279 void ResourceProvider::SynchronousFence::Set() { |
| 1274 has_synchronized_ = false; | 1280 has_synchronized_ = false; |
| (...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1811 if (resource->type == RESOURCE_TYPE_GPU_MEMORY_BUFFER) { | 1817 if (resource->type == RESOURCE_TYPE_GPU_MEMORY_BUFFER) { |
| 1812 resource->gpu_memory_buffer = | 1818 resource->gpu_memory_buffer = |
| 1813 gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( | 1819 gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( |
| 1814 size, BufferFormat(format), | 1820 size, BufferFormat(format), |
| 1815 gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gpu::kNullSurfaceHandle); | 1821 gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gpu::kNullSurfaceHandle); |
| 1816 if (resource->gpu_memory_buffer) | 1822 if (resource->gpu_memory_buffer) |
| 1817 resource->gpu_memory_buffer_id = resource->gpu_memory_buffer->GetId(); | 1823 resource->gpu_memory_buffer_id = resource->gpu_memory_buffer->GetId(); |
| 1818 LazyCreateImage(resource); | 1824 LazyCreateImage(resource); |
| 1819 resource->dirty_image = true; | 1825 resource->dirty_image = true; |
| 1820 resource->is_overlay_candidate = true; | 1826 resource->is_overlay_candidate = true; |
| 1827 // GpuMemoryBuffer provides direct access to the memory used by the GPU. |
| 1828 // Read lock fences are required to ensure that we're not trying to map a |
| 1829 // buffer that is currently in-use by the GPU. |
| 1830 resource->read_lock_fences_enabled = true; |
| 1821 } else if (use_texture_storage_ext_ && | 1831 } else if (use_texture_storage_ext_ && |
| 1822 IsFormatSupportedForStorage(format, use_texture_format_bgra_) && | 1832 IsFormatSupportedForStorage(format, use_texture_format_bgra_) && |
| 1823 (resource->hint & TEXTURE_HINT_IMMUTABLE)) { | 1833 (resource->hint & TEXTURE_HINT_IMMUTABLE)) { |
| 1824 GLenum storage_format = TextureToStorageFormat(format); | 1834 GLenum storage_format = TextureToStorageFormat(format); |
| 1825 gl->TexStorage2DEXT(resource->target, 1, storage_format, size.width(), | 1835 gl->TexStorage2DEXT(resource->target, 1, storage_format, size.width(), |
| 1826 size.height()); | 1836 size.height()); |
| 1827 } else { | 1837 } else { |
| 1828 // ETC1 does not support preallocation. | 1838 // ETC1 does not support preallocation. |
| 1829 if (format != ETC1) { | 1839 if (format != ETC1) { |
| 1830 gl->TexImage2D(resource->target, 0, GLInternalFormat(format), | 1840 gl->TexImage2D(resource->target, 0, GLInternalFormat(format), |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1987 | 1997 |
| 1988 const int kImportance = 2; | 1998 const int kImportance = 2; |
| 1989 pmd->CreateSharedGlobalAllocatorDump(guid); | 1999 pmd->CreateSharedGlobalAllocatorDump(guid); |
| 1990 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); | 2000 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); |
| 1991 } | 2001 } |
| 1992 | 2002 |
| 1993 return true; | 2003 return true; |
| 1994 } | 2004 } |
| 1995 | 2005 |
| 1996 } // namespace cc | 2006 } // namespace cc |
| OLD | NEW |