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

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: compile error fix Created 4 years, 7 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 820 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698