| 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 910 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 921 image_bytes, image); | 921 image_bytes, image); |
| 922 } else { | 922 } else { |
| 923 gl->TexSubImage2D(resource->target, 0, 0, 0, image_size.width(), | 923 gl->TexSubImage2D(resource->target, 0, 0, 0, image_size.width(), |
| 924 image_size.height(), GLDataFormat(resource->format), | 924 image_size.height(), GLDataFormat(resource->format), |
| 925 GLDataType(resource->format), image); | 925 GLDataType(resource->format), image); |
| 926 } | 926 } |
| 927 const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); | 927 const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); |
| 928 gl->OrderingBarrierCHROMIUM(); | 928 gl->OrderingBarrierCHROMIUM(); |
| 929 gpu::SyncToken sync_token; | 929 gpu::SyncToken sync_token; |
| 930 gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); | 930 gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); |
| 931 lock.set_sync_token(sync_token); | 931 lock.UpdateSyncToken(sync_token); |
| 932 lock.set_synchronized(true); | |
| 933 } | 932 } |
| 934 } | 933 } |
| 935 | 934 |
| 936 void ResourceProvider::GenerateSyncTokenForResource(ResourceId resource_id) { | 935 void ResourceProvider::GenerateSyncTokenForResource(ResourceId resource_id) { |
| 937 Resource* resource = GetResource(resource_id); | 936 Resource* resource = GetResource(resource_id); |
| 938 if (!resource->needs_sync_token()) | 937 if (!resource->needs_sync_token()) |
| 939 return; | 938 return; |
| 940 | 939 |
| 941 gpu::SyncToken sync_token; | 940 gpu::SyncToken sync_token; |
| 942 GLES2Interface* gl = ContextGL(); | 941 GLES2Interface* gl = ContextGL(); |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1124 | 1123 |
| 1125 void ResourceProvider::EnableReadLockFencesForTesting(ResourceId id) { | 1124 void ResourceProvider::EnableReadLockFencesForTesting(ResourceId id) { |
| 1126 Resource* resource = GetResource(id); | 1125 Resource* resource = GetResource(id); |
| 1127 DCHECK(resource); | 1126 DCHECK(resource); |
| 1128 resource->read_lock_fences_enabled = true; | 1127 resource->read_lock_fences_enabled = true; |
| 1129 } | 1128 } |
| 1130 | 1129 |
| 1131 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( | 1130 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( |
| 1132 ResourceProvider* resource_provider, | 1131 ResourceProvider* resource_provider, |
| 1133 ResourceId resource_id) | 1132 ResourceId resource_id) |
| 1134 : resource_provider_(resource_provider), resource_id_(resource_id) { | 1133 : resource_provider_(resource_provider), |
| 1135 const Resource* resource = resource_provider->LockForRead(resource_id); | 1134 resource_id_(resource_id), |
| 1136 texture_id_ = resource->gl_id; | 1135 resource_(resource_provider->LockForRead(resource_id)) {} |
| 1137 target_ = resource->target; | |
| 1138 size_ = resource->size; | |
| 1139 color_space_ = resource->color_space; | |
| 1140 } | |
| 1141 | 1136 |
| 1142 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { | 1137 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { |
| 1143 resource_provider_->UnlockForRead(resource_id_); | 1138 resource_provider_->UnlockForRead(resource_id_); |
| 1144 } | 1139 } |
| 1145 | 1140 |
| 1146 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( | 1141 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( |
| 1147 ResourceProvider* resource_provider, | 1142 ResourceProvider* resource_provider, |
| 1148 ResourceId resource_id, | 1143 ResourceId resource_id, |
| 1149 GLenum filter) | 1144 GLenum filter) |
| 1150 : resource_lock_(resource_provider, resource_id), | 1145 : resource_lock_(resource_provider, resource_id), |
| 1151 unit_(GL_TEXTURE0), | 1146 unit_(GL_TEXTURE0), |
| 1152 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {} | 1147 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {} |
| 1153 | 1148 |
| 1154 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( | 1149 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( |
| 1155 ResourceProvider* resource_provider, | 1150 ResourceProvider* resource_provider, |
| 1156 ResourceId resource_id, | 1151 ResourceId resource_id, |
| 1157 GLenum unit, | 1152 GLenum unit, |
| 1158 GLenum filter) | 1153 GLenum filter) |
| 1159 : resource_lock_(resource_provider, resource_id), | 1154 : resource_lock_(resource_provider, resource_id), |
| 1160 unit_(unit), | 1155 unit_(unit), |
| 1161 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {} | 1156 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {} |
| 1162 | 1157 |
| 1163 ResourceProvider::ScopedSamplerGL::~ScopedSamplerGL() {} | 1158 ResourceProvider::ScopedSamplerGL::~ScopedSamplerGL() {} |
| 1164 | 1159 |
| 1165 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL( | 1160 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL( |
| 1166 ResourceProvider* resource_provider, | 1161 ResourceProvider* resource_provider, |
| 1167 ResourceId resource_id, | 1162 ResourceId resource_id, |
| 1168 bool create_mailbox) | 1163 bool async_worker_context_enabled) |
| 1169 : resource_provider_(resource_provider), | 1164 : resource_provider_(resource_provider), |
| 1170 resource_id_(resource_id), | 1165 resource_(resource_provider->LockForWrite(resource_id)) { |
| 1171 has_sync_token_(false), | |
| 1172 synchronized_(false) { | |
| 1173 DCHECK(thread_checker_.CalledOnValidThread()); | 1166 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1174 Resource* resource = resource_provider->LockForWrite(resource_id); | 1167 resource_provider_->LazyCreate(resource_); |
| 1175 resource_provider_->LazyAllocate(resource); | 1168 if (async_worker_context_enabled) { |
| 1176 if (resource->image_id && resource->dirty_image) | 1169 resource_provider_->LazyCreateMailbox(resource_); |
| 1177 resource_provider_->BindImageForSampling(resource); | 1170 } else { |
| 1178 if (create_mailbox) { | 1171 resource_provider_->LazyAllocate(resource_, resource_provider_->ContextGL(), |
| 1179 resource_provider_->CreateMailboxAndBindResource( | 1172 resource_->gl_id); |
| 1180 resource_provider_->ContextGL(), resource); | |
| 1181 } | 1173 } |
| 1182 texture_id_ = resource->gl_id; | 1174 if (resource_->image_id && resource_->dirty_image) { |
| 1183 target_ = resource->target; | 1175 resource_provider_->BindImageForSampling( |
| 1184 format_ = resource->format; | 1176 resource_, resource_provider_->ContextGL(), resource_->gl_id); |
| 1185 size_ = resource->size; | 1177 } |
| 1186 mailbox_ = resource->mailbox(); | |
| 1187 color_space_ = resource_provider->GetResourceColorSpaceForRaster(resource); | |
| 1188 } | 1178 } |
| 1189 | 1179 |
| 1190 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { | 1180 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { |
| 1191 DCHECK(thread_checker_.CalledOnValidThread()); | 1181 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1192 Resource* resource = resource_provider_->GetResource(resource_id_); | 1182 DCHECK(resource_->locked_for_write); |
| 1193 DCHECK(resource->locked_for_write); | 1183 if (resource_->synchronization_state() == Resource::LOCALLY_USED) |
| 1194 // It's not sufficient to check sync_token_.HasData() here because the sync | 1184 resource_->SetSynchronized(); |
| 1195 // might be null because of context loss. Even in that case we want to set the | 1185 resource_provider_->UnlockForWrite(resource_); |
| 1196 // sync token because it's checked in PrepareSendToParent while drawing. | 1186 } |
| 1197 if (has_sync_token_) | 1187 |
| 1198 resource->UpdateSyncToken(sync_token_); | 1188 void ResourceProvider::ScopedWriteLockGL::LazyAllocate( |
| 1199 if (synchronized_) | 1189 gpu::gles2::GLES2Interface* gl, |
| 1200 resource->SetSynchronized(); | 1190 unsigned gl_id) { |
| 1201 resource_provider_->UnlockForWrite(resource); | 1191 resource_provider_->LazyAllocate(resource_, gl, gl_id); |
| 1192 } |
| 1193 |
| 1194 void ResourceProvider::ScopedWriteLockGL::UpdateSyncToken( |
| 1195 const gpu::SyncToken& sync_token) { |
| 1196 resource_->UpdateSyncToken(sync_token); |
| 1202 } | 1197 } |
| 1203 | 1198 |
| 1204 ResourceProvider::ScopedTextureProvider::ScopedTextureProvider( | 1199 ResourceProvider::ScopedTextureProvider::ScopedTextureProvider( |
| 1205 gpu::gles2::GLES2Interface* gl, | 1200 gpu::gles2::GLES2Interface* gl, |
| 1206 ScopedWriteLockGL* resource_lock, | 1201 ScopedWriteLockGL* resource_lock, |
| 1207 bool use_mailbox) | 1202 bool async_worker_context_enabled) |
| 1208 : gl_(gl), use_mailbox_(use_mailbox) { | 1203 : gl_(gl), async_worker_context_enabled_(async_worker_context_enabled) { |
| 1209 if (use_mailbox_) { | 1204 if (async_worker_context_enabled) { |
| 1205 DCHECK(resource_lock->mailbox().IsValid()); |
| 1210 texture_id_ = gl_->CreateAndConsumeTextureCHROMIUM( | 1206 texture_id_ = gl_->CreateAndConsumeTextureCHROMIUM( |
| 1211 resource_lock->target(), resource_lock->mailbox().name()); | 1207 resource_lock->target(), resource_lock->mailbox().name()); |
| 1208 resource_lock->LazyAllocate(gl, texture_id_); |
| 1212 } else { | 1209 } else { |
| 1213 texture_id_ = resource_lock->texture_id(); | 1210 texture_id_ = resource_lock->texture_id(); |
| 1214 } | 1211 } |
| 1215 DCHECK(texture_id_); | 1212 DCHECK(texture_id_); |
| 1216 } | 1213 } |
| 1217 | 1214 |
| 1218 ResourceProvider::ScopedTextureProvider::~ScopedTextureProvider() { | 1215 ResourceProvider::ScopedTextureProvider::~ScopedTextureProvider() { |
| 1219 if (use_mailbox_) | 1216 if (async_worker_context_enabled_) |
| 1220 gl_->DeleteTextures(1, &texture_id_); | 1217 gl_->DeleteTextures(1, &texture_id_); |
| 1221 } | 1218 } |
| 1222 | 1219 |
| 1223 ResourceProvider::ScopedSkSurfaceProvider::ScopedSkSurfaceProvider( | 1220 ResourceProvider::ScopedSkSurfaceProvider::ScopedSkSurfaceProvider( |
| 1224 ContextProvider* context_provider, | 1221 ContextProvider* context_provider, |
| 1225 ScopedWriteLockGL* resource_lock, | 1222 ScopedWriteLockGL* resource_lock, |
| 1226 bool use_mailbox, | 1223 bool async_worker_context_enabled, |
| 1227 bool use_distance_field_text, | 1224 bool use_distance_field_text, |
| 1228 bool can_use_lcd_text, | 1225 bool can_use_lcd_text, |
| 1229 int msaa_sample_count) | 1226 int msaa_sample_count) |
| 1230 : texture_provider_(context_provider->ContextGL(), | 1227 : texture_provider_(context_provider->ContextGL(), |
| 1231 resource_lock, | 1228 resource_lock, |
| 1232 use_mailbox) { | 1229 async_worker_context_enabled) { |
| 1233 GrGLTextureInfo texture_info; | 1230 GrGLTextureInfo texture_info; |
| 1234 texture_info.fID = texture_provider_.texture_id(); | 1231 texture_info.fID = texture_provider_.texture_id(); |
| 1235 texture_info.fTarget = resource_lock->target(); | 1232 texture_info.fTarget = resource_lock->target(); |
| 1236 GrBackendTextureDesc desc; | 1233 GrBackendTextureDesc desc; |
| 1237 desc.fFlags = kRenderTarget_GrBackendTextureFlag; | 1234 desc.fFlags = kRenderTarget_GrBackendTextureFlag; |
| 1238 desc.fWidth = resource_lock->size().width(); | 1235 desc.fWidth = resource_lock->size().width(); |
| 1239 desc.fHeight = resource_lock->size().height(); | 1236 desc.fHeight = resource_lock->size().height(); |
| 1240 desc.fConfig = ToGrPixelConfig(resource_lock->format()); | 1237 desc.fConfig = ToGrPixelConfig(resource_lock->format()); |
| 1241 desc.fOrigin = kTopLeft_GrSurfaceOrigin; | 1238 desc.fOrigin = kTopLeft_GrSurfaceOrigin; |
| 1242 desc.fTextureHandle = skia::GrGLTextureInfoToGrBackendObject(texture_info); | 1239 desc.fTextureHandle = skia::GrGLTextureInfoToGrBackendObject(texture_info); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1316 } | 1313 } |
| 1317 } | 1314 } |
| 1318 | 1315 |
| 1319 ResourceProvider::ScopedReadLockSkImage::~ScopedReadLockSkImage() { | 1316 ResourceProvider::ScopedReadLockSkImage::~ScopedReadLockSkImage() { |
| 1320 resource_provider_->UnlockForRead(resource_id_); | 1317 resource_provider_->UnlockForRead(resource_id_); |
| 1321 } | 1318 } |
| 1322 | 1319 |
| 1323 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( | 1320 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( |
| 1324 ResourceProvider* resource_provider, | 1321 ResourceProvider* resource_provider, |
| 1325 ResourceId resource_id) | 1322 ResourceId resource_id) |
| 1326 : resource_provider_(resource_provider), resource_id_(resource_id) { | 1323 : resource_provider_(resource_provider), |
| 1327 Resource* resource = resource_provider->LockForWrite(resource_id); | 1324 resource_(resource_provider->LockForWrite(resource_id)), |
| 1328 resource_provider->PopulateSkBitmapWithResource(&sk_bitmap_, resource); | 1325 color_space_( |
| 1329 color_space_ = resource_provider->GetResourceColorSpaceForRaster(resource); | 1326 resource_provider->GetResourceColorSpaceForRaster(resource_)) { |
| 1327 resource_provider->PopulateSkBitmapWithResource(&sk_bitmap_, resource_); |
| 1330 DCHECK(valid()); | 1328 DCHECK(valid()); |
| 1331 } | 1329 } |
| 1332 | 1330 |
| 1333 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { | 1331 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { |
| 1334 DCHECK(thread_checker_.CalledOnValidThread()); | 1332 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1335 Resource* resource = resource_provider_->GetResource(resource_id_); | 1333 resource_->SetSynchronized(); |
| 1336 DCHECK(resource); | 1334 resource_provider_->UnlockForWrite(resource_); |
| 1337 resource->SetSynchronized(); | |
| 1338 resource_provider_->UnlockForWrite(resource); | |
| 1339 } | 1335 } |
| 1340 | 1336 |
| 1341 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: | 1337 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: |
| 1342 ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider, | 1338 ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider, |
| 1343 ResourceId resource_id) | 1339 ResourceId resource_id) |
| 1344 : resource_provider_(resource_provider), resource_id_(resource_id) { | 1340 : resource_provider_(resource_provider), |
| 1345 Resource* resource = resource_provider->LockForWrite(resource_id); | 1341 resource_(resource_provider->LockForWrite(resource_id)), |
| 1346 DCHECK(IsGpuResourceType(resource->type)); | 1342 color_space_( |
| 1347 format_ = resource->format; | 1343 resource_provider->GetResourceColorSpaceForRaster(resource_)) { |
| 1348 size_ = resource->size; | 1344 DCHECK(IsGpuResourceType(resource_->type)); |
| 1349 usage_ = resource->usage; | |
| 1350 gpu_memory_buffer_ = std::move(resource->gpu_memory_buffer); | |
| 1351 resource->gpu_memory_buffer = nullptr; | |
| 1352 color_space_ = resource_provider->GetResourceColorSpaceForRaster(resource); | |
| 1353 } | 1345 } |
| 1354 | 1346 |
| 1355 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: | 1347 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: |
| 1356 ~ScopedWriteLockGpuMemoryBuffer() { | 1348 ~ScopedWriteLockGpuMemoryBuffer() { |
| 1357 DCHECK(thread_checker_.CalledOnValidThread()); | 1349 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1358 Resource* resource = resource_provider_->GetResource(resource_id_); | 1350 if (resource_->gpu_memory_buffer) { |
| 1359 DCHECK(resource); | 1351 resource_provider_->LazyCreate(resource_); |
| 1360 if (gpu_memory_buffer_) { | 1352 resource_provider_->LazyCreateImage(resource_, |
| 1361 // Note that this impacts overlay compositing, not rasterization. | 1353 resource_provider_->ContextGL()); |
| 1362 if (resource_provider_->settings_.enable_color_correct_rasterization) | 1354 resource_provider_->BindImageForSampling( |
| 1363 gpu_memory_buffer_->SetColorSpaceForScanout(resource->color_space); | 1355 resource_, resource_provider_->ContextGL(), resource_->gl_id); |
| 1364 DCHECK(!resource->gpu_memory_buffer); | |
| 1365 resource_provider_->LazyCreate(resource); | |
| 1366 resource->gpu_memory_buffer = std::move(gpu_memory_buffer_); | |
| 1367 resource->allocated = true; | |
| 1368 resource_provider_->LazyCreateImage(resource); | |
| 1369 resource->dirty_image = true; | |
| 1370 resource->is_overlay_candidate = true; | |
| 1371 // GpuMemoryBuffer provides direct access to the memory used by the GPU. | |
| 1372 // Read lock fences are required to ensure that we're not trying to map a | |
| 1373 // buffer that is currently in-use by the GPU. | |
| 1374 resource->read_lock_fences_enabled = true; | |
| 1375 } | 1356 } |
| 1376 resource->SetSynchronized(); | 1357 resource_->SetSynchronized(); |
| 1377 resource_provider_->UnlockForWrite(resource); | 1358 resource_provider_->UnlockForWrite(resource_); |
| 1378 } | 1359 } |
| 1379 | 1360 |
| 1380 gfx::GpuMemoryBuffer* | 1361 gfx::GpuMemoryBuffer* |
| 1381 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { | 1362 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { |
| 1382 if (!gpu_memory_buffer_) { | 1363 resource_provider_->LazyAllocateGpuMemoryBuffer(resource_); |
| 1383 gpu_memory_buffer_ = | 1364 return resource_->gpu_memory_buffer.get(); |
| 1384 resource_provider_->gpu_memory_buffer_manager_->CreateGpuMemoryBuffer( | |
| 1385 size_, BufferFormat(format_), usage_, gpu::kNullSurfaceHandle); | |
| 1386 } | |
| 1387 return gpu_memory_buffer_.get(); | |
| 1388 } | 1365 } |
| 1389 | 1366 |
| 1390 ResourceProvider::ScopedBatchReturnResources::ScopedBatchReturnResources( | 1367 ResourceProvider::ScopedBatchReturnResources::ScopedBatchReturnResources( |
| 1391 ResourceProvider* resource_provider) | 1368 ResourceProvider* resource_provider) |
| 1392 : resource_provider_(resource_provider) { | 1369 : resource_provider_(resource_provider) { |
| 1393 resource_provider_->SetBatchReturnResources(true); | 1370 resource_provider_->SetBatchReturnResources(true); |
| 1394 } | 1371 } |
| 1395 | 1372 |
| 1396 ResourceProvider::ScopedBatchReturnResources::~ScopedBatchReturnResources() { | 1373 ResourceProvider::ScopedBatchReturnResources::~ScopedBatchReturnResources() { |
| 1397 resource_provider_->SetBatchReturnResources(false); | 1374 resource_provider_->SetBatchReturnResources(false); |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1502 resources.push_back(resource); | 1479 resources.push_back(resource); |
| 1503 } | 1480 } |
| 1504 | 1481 |
| 1505 // Lazily create any mailboxes and verify all unverified sync tokens. | 1482 // Lazily create any mailboxes and verify all unverified sync tokens. |
| 1506 std::vector<GLbyte*> unverified_sync_tokens; | 1483 std::vector<GLbyte*> unverified_sync_tokens; |
| 1507 std::vector<Resource*> need_synchronization_resources; | 1484 std::vector<Resource*> need_synchronization_resources; |
| 1508 for (Resource* resource : resources) { | 1485 for (Resource* resource : resources) { |
| 1509 if (!IsGpuResourceType(resource->type)) | 1486 if (!IsGpuResourceType(resource->type)) |
| 1510 continue; | 1487 continue; |
| 1511 | 1488 |
| 1512 CreateMailboxAndBindResource(gl, resource); | 1489 // Texture must already be bound to image. |
| 1490 DCHECK(!resource->image_id || !resource->dirty_image); |
| 1491 |
| 1492 LazyCreateMailbox(resource); |
| 1513 | 1493 |
| 1514 if (settings_.delegated_sync_points_required) { | 1494 if (settings_.delegated_sync_points_required) { |
| 1515 if (resource->needs_sync_token()) { | 1495 if (resource->needs_sync_token()) { |
| 1516 need_synchronization_resources.push_back(resource); | 1496 need_synchronization_resources.push_back(resource); |
| 1517 } else if (resource->mailbox().HasSyncToken() && | 1497 } else if (resource->mailbox().HasSyncToken() && |
| 1518 !resource->mailbox().sync_token().verified_flush()) { | 1498 !resource->mailbox().sync_token().verified_flush()) { |
| 1519 unverified_sync_tokens.push_back(resource->GetSyncTokenData()); | 1499 unverified_sync_tokens.push_back(resource->GetSyncTokenData()); |
| 1520 } | 1500 } |
| 1521 } | 1501 } |
| 1522 } | 1502 } |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1743 bool promotable = iter != promotion_hints.end(); | 1723 bool promotable = iter != promotion_hints.end(); |
| 1744 gl->OverlayPromotionHintCHROMIUM(resource->gl_id, promotable, | 1724 gl->OverlayPromotionHintCHROMIUM(resource->gl_id, promotable, |
| 1745 promotable ? iter->second.x() : 0, | 1725 promotable ? iter->second.x() : 0, |
| 1746 promotable ? iter->second.y() : 0); | 1726 promotable ? iter->second.y() : 0); |
| 1747 } | 1727 } |
| 1748 UnlockForRead(id); | 1728 UnlockForRead(id); |
| 1749 } | 1729 } |
| 1750 } | 1730 } |
| 1751 #endif | 1731 #endif |
| 1752 | 1732 |
| 1753 void ResourceProvider::CreateMailboxAndBindResource( | |
| 1754 gpu::gles2::GLES2Interface* gl, | |
| 1755 Resource* resource) { | |
| 1756 DCHECK(IsGpuResourceType(resource->type)); | |
| 1757 DCHECK(gl); | |
| 1758 | |
| 1759 if (!resource->mailbox().IsValid()) { | |
| 1760 LazyCreate(resource); | |
| 1761 | |
| 1762 gpu::MailboxHolder mailbox_holder; | |
| 1763 mailbox_holder.texture_target = resource->target; | |
| 1764 gl->GenMailboxCHROMIUM(mailbox_holder.mailbox.name); | |
| 1765 gl->ProduceTextureDirectCHROMIUM(resource->gl_id, | |
| 1766 mailbox_holder.texture_target, | |
| 1767 mailbox_holder.mailbox.name); | |
| 1768 resource->set_mailbox(TextureMailbox(mailbox_holder)); | |
| 1769 } | |
| 1770 | |
| 1771 if (resource->image_id && resource->dirty_image) { | |
| 1772 DCHECK(resource->gl_id); | |
| 1773 DCHECK(resource->origin == Resource::INTERNAL); | |
| 1774 BindImageForSampling(resource); | |
| 1775 } | |
| 1776 } | |
| 1777 | |
| 1778 void ResourceProvider::TransferResource(Resource* source, | 1733 void ResourceProvider::TransferResource(Resource* source, |
| 1779 ResourceId id, | 1734 ResourceId id, |
| 1780 TransferableResource* resource) { | 1735 TransferableResource* resource) { |
| 1781 DCHECK(!source->locked_for_write); | 1736 DCHECK(!source->locked_for_write); |
| 1782 DCHECK(!source->lock_for_read_count); | 1737 DCHECK(!source->lock_for_read_count); |
| 1783 DCHECK(source->origin != Resource::EXTERNAL || source->mailbox().IsValid()); | 1738 DCHECK(source->origin != Resource::EXTERNAL || source->mailbox().IsValid()); |
| 1784 DCHECK(source->allocated); | 1739 DCHECK(source->allocated); |
| 1785 resource->id = id; | 1740 resource->id = id; |
| 1786 resource->format = source->format; | 1741 resource->format = source->format; |
| 1787 resource->buffer_format = source->buffer_format; | 1742 resource->buffer_format = source->buffer_format; |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1941 ScopedSetActiveTexture scoped_active_tex(gl, unit); | 1896 ScopedSetActiveTexture scoped_active_tex(gl, unit); |
| 1942 GLenum target = resource->target; | 1897 GLenum target = resource->target; |
| 1943 gl->BindTexture(target, resource->gl_id); | 1898 gl->BindTexture(target, resource->gl_id); |
| 1944 if (filter != resource->filter) { | 1899 if (filter != resource->filter) { |
| 1945 gl->TexParameteri(target, GL_TEXTURE_MIN_FILTER, filter); | 1900 gl->TexParameteri(target, GL_TEXTURE_MIN_FILTER, filter); |
| 1946 gl->TexParameteri(target, GL_TEXTURE_MAG_FILTER, filter); | 1901 gl->TexParameteri(target, GL_TEXTURE_MAG_FILTER, filter); |
| 1947 resource->filter = filter; | 1902 resource->filter = filter; |
| 1948 } | 1903 } |
| 1949 | 1904 |
| 1950 if (resource->image_id && resource->dirty_image) | 1905 if (resource->image_id && resource->dirty_image) |
| 1951 BindImageForSampling(resource); | 1906 BindImageForSampling(resource, gl, resource->gl_id); |
| 1952 | 1907 |
| 1953 return target; | 1908 return target; |
| 1954 } | 1909 } |
| 1955 | 1910 |
| 1956 void ResourceProvider::CreateForTesting(ResourceId id) { | 1911 void ResourceProvider::CreateForTesting(ResourceId id) { |
| 1957 LazyCreate(GetResource(id)); | 1912 LazyCreate(GetResource(id)); |
| 1958 } | 1913 } |
| 1959 | 1914 |
| 1960 void ResourceProvider::LazyCreate(Resource* resource) { | 1915 void ResourceProvider::LazyCreate(Resource* resource) { |
| 1961 if (!IsGpuResourceType(resource->type) || | 1916 if (!IsGpuResourceType(resource->type) || |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1980 resource->original_filter); | 1935 resource->original_filter); |
| 1981 gl->TexParameteri(resource->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 1936 gl->TexParameteri(resource->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 1982 gl->TexParameteri(resource->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 1937 gl->TexParameteri(resource->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 1983 if (settings_.use_texture_usage_hint && | 1938 if (settings_.use_texture_usage_hint && |
| 1984 (resource->hint & TEXTURE_HINT_FRAMEBUFFER)) { | 1939 (resource->hint & TEXTURE_HINT_FRAMEBUFFER)) { |
| 1985 gl->TexParameteri(resource->target, GL_TEXTURE_USAGE_ANGLE, | 1940 gl->TexParameteri(resource->target, GL_TEXTURE_USAGE_ANGLE, |
| 1986 GL_FRAMEBUFFER_ATTACHMENT_ANGLE); | 1941 GL_FRAMEBUFFER_ATTACHMENT_ANGLE); |
| 1987 } | 1942 } |
| 1988 } | 1943 } |
| 1989 | 1944 |
| 1945 void ResourceProvider::LazyCreateMailbox(Resource* resource) { |
| 1946 DCHECK(resource); |
| 1947 DCHECK(resource->gl_id); |
| 1948 |
| 1949 if (!resource->mailbox().IsValid()) { |
| 1950 gpu::gles2::GLES2Interface* gl = ContextGL(); |
| 1951 DCHECK(gl); |
| 1952 |
| 1953 gpu::MailboxHolder mailbox_holder; |
| 1954 mailbox_holder.texture_target = resource->target; |
| 1955 gl->GenMailboxCHROMIUM(mailbox_holder.mailbox.name); |
| 1956 gl->ProduceTextureDirectCHROMIUM(resource->gl_id, |
| 1957 mailbox_holder.texture_target, |
| 1958 mailbox_holder.mailbox.name); |
| 1959 resource->set_mailbox(TextureMailbox(mailbox_holder)); |
| 1960 } |
| 1961 } |
| 1962 |
| 1990 void ResourceProvider::AllocateForTesting(ResourceId id) { | 1963 void ResourceProvider::AllocateForTesting(ResourceId id) { |
| 1991 LazyAllocate(GetResource(id)); | 1964 Resource* resource = GetResource(id); |
| 1965 LazyCreate(resource); |
| 1966 LazyAllocate(resource, ContextGL(), resource->gl_id); |
| 1992 } | 1967 } |
| 1993 | 1968 |
| 1994 void ResourceProvider::LazyAllocate(Resource* resource) { | 1969 void ResourceProvider::LazyAllocate(ResourceProvider::Resource* resource, |
| 1995 DCHECK(resource); | 1970 gpu::gles2::GLES2Interface* gl, |
| 1971 unsigned gl_id) { |
| 1972 DCHECK(resource->locked_for_write); |
| 1973 |
| 1996 if (resource->allocated) | 1974 if (resource->allocated) |
| 1997 return; | 1975 return; |
| 1998 LazyCreate(resource); | |
| 1999 if (!resource->gl_id) | |
| 2000 return; | |
| 2001 resource->allocated = true; | 1976 resource->allocated = true; |
| 2002 GLES2Interface* gl = ContextGL(); | 1977 |
| 1978 GLenum target = resource->target; |
| 2003 gfx::Size& size = resource->size; | 1979 gfx::Size& size = resource->size; |
| 2004 ResourceFormat format = resource->format; | 1980 ResourceFormat format = resource->format; |
| 2005 gl->BindTexture(resource->target, resource->gl_id); | 1981 |
| 1982 gl->BindTexture(target, gl_id); |
| 1983 |
| 2006 if (resource->type == RESOURCE_TYPE_GPU_MEMORY_BUFFER) { | 1984 if (resource->type == RESOURCE_TYPE_GPU_MEMORY_BUFFER) { |
| 2007 resource->gpu_memory_buffer = | 1985 LazyAllocateGpuMemoryBuffer(resource); |
| 2008 gpu_memory_buffer_manager_->CreateGpuMemoryBuffer( | 1986 LazyCreateImage(resource, gl); |
| 2009 size, BufferFormat(format), resource->usage, | 1987 BindImageForSampling(resource, gl, gl_id); |
| 2010 gpu::kNullSurfaceHandle); | |
| 2011 // Note that this impacts overlay compositing, not rasterization. | |
| 2012 if (resource->gpu_memory_buffer && | |
| 2013 settings_.enable_color_correct_rasterization) { | |
| 2014 resource->gpu_memory_buffer->SetColorSpaceForScanout( | |
| 2015 resource->color_space); | |
| 2016 } | |
| 2017 | |
| 2018 LazyCreateImage(resource); | |
| 2019 resource->dirty_image = true; | |
| 2020 resource->is_overlay_candidate = true; | |
| 2021 // GpuMemoryBuffer provides direct access to the memory used by the GPU. | |
| 2022 // Read lock fences are required to ensure that we're not trying to map a | |
| 2023 // buffer that is currently in-use by the GPU. | |
| 2024 resource->read_lock_fences_enabled = true; | |
| 2025 } else if (settings_.use_texture_storage_ext && | 1988 } else if (settings_.use_texture_storage_ext && |
| 2026 IsFormatSupportedForStorage(format, | 1989 IsFormatSupportedForStorage(format, |
| 2027 settings_.use_texture_format_bgra) && | 1990 settings_.use_texture_format_bgra) && |
| 2028 (resource->hint & TEXTURE_HINT_IMMUTABLE)) { | 1991 (resource->hint & TEXTURE_HINT_IMMUTABLE)) { |
| 2029 GLenum storage_format = TextureToStorageFormat(format); | 1992 GLenum storage_format = TextureToStorageFormat(format); |
| 2030 gl->TexStorage2DEXT(resource->target, 1, storage_format, size.width(), | 1993 gl->TexStorage2DEXT(target, 1, storage_format, size.width(), size.height()); |
| 2031 size.height()); | 1994 } else if (format != ETC1) { |
| 2032 } else { | |
| 2033 // ETC1 does not support preallocation. | 1995 // ETC1 does not support preallocation. |
| 2034 if (format != ETC1) { | 1996 gl->TexImage2D(target, 0, GLInternalFormat(format), size.width(), |
| 2035 gl->TexImage2D(resource->target, 0, GLInternalFormat(format), | 1997 size.height(), 0, GLDataFormat(format), GLDataType(format), |
| 2036 size.width(), size.height(), 0, GLDataFormat(format), | 1998 nullptr); |
| 2037 GLDataType(format), nullptr); | |
| 2038 } | |
| 2039 } | 1999 } |
| 2040 } | 2000 } |
| 2041 | 2001 |
| 2042 void ResourceProvider::LazyCreateImage(Resource* resource) { | 2002 void ResourceProvider::LazyAllocateGpuMemoryBuffer(Resource* resource) { |
| 2003 DCHECK(resource->locked_for_write); |
| 2004 |
| 2005 if (resource->allocated) |
| 2006 return; |
| 2007 resource->allocated = true; |
| 2008 |
| 2009 DCHECK(!resource->gpu_memory_buffer); |
| 2010 resource->gpu_memory_buffer = |
| 2011 gpu_memory_buffer_manager_->CreateGpuMemoryBuffer( |
| 2012 resource->size, BufferFormat(resource->format), resource->usage, |
| 2013 gpu::kNullSurfaceHandle); |
| 2014 // Note that this impacts overlay compositing, not rasterization. |
| 2015 if (settings_.enable_color_correct_rasterization) |
| 2016 resource->gpu_memory_buffer->SetColorSpaceForScanout(resource->color_space); |
| 2017 |
| 2018 resource->is_overlay_candidate = true; |
| 2019 |
| 2020 // GpuMemoryBuffer provides direct access to the memory used by the GPU. |
| 2021 // Read lock fences are required to ensure that we're not trying to map a |
| 2022 // buffer that is currently in-use by the GPU. |
| 2023 resource->read_lock_fences_enabled = true; |
| 2024 } |
| 2025 |
| 2026 void ResourceProvider::LazyCreateImage(Resource* resource, |
| 2027 gpu::gles2::GLES2Interface* gl) { |
| 2043 DCHECK(resource->gpu_memory_buffer); | 2028 DCHECK(resource->gpu_memory_buffer); |
| 2044 DCHECK(resource->gl_id); | 2029 DCHECK(resource->gl_id); |
| 2030 DCHECK(resource->locked_for_write); |
| 2045 DCHECK(resource->allocated); | 2031 DCHECK(resource->allocated); |
| 2046 // Avoid crashing in release builds if GpuMemoryBuffer allocation fails. | 2032 // Avoid crashing in release builds if GpuMemoryBuffer allocation fails. |
| 2047 // http://crbug.com/554541 | 2033 // http://crbug.com/554541 |
| 2048 if (!resource->gpu_memory_buffer) | 2034 if (!resource->gpu_memory_buffer) |
| 2049 return; | 2035 return; |
| 2050 if (!resource->image_id) { | 2036 if (!resource->image_id) { |
| 2051 GLES2Interface* gl = ContextGL(); | |
| 2052 DCHECK(gl); | 2037 DCHECK(gl); |
| 2053 | 2038 |
| 2054 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) | 2039 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) |
| 2055 // TODO(reveman): This avoids a performance problem on ARM ChromeOS | 2040 // TODO(reveman): This avoids a performance problem on ARM ChromeOS |
| 2056 // devices. This only works with shared memory backed buffers. | 2041 // devices. This only works with shared memory backed buffers. |
| 2057 // crbug.com/580166 | 2042 // crbug.com/580166 |
| 2058 DCHECK_EQ(resource->gpu_memory_buffer->GetHandle().type, | 2043 DCHECK_EQ(resource->gpu_memory_buffer->GetHandle().type, |
| 2059 gfx::SHARED_MEMORY_BUFFER); | 2044 gfx::SHARED_MEMORY_BUFFER); |
| 2060 #endif | 2045 #endif |
| 2061 resource->image_id = gl->CreateImageCHROMIUM( | 2046 resource->image_id = gl->CreateImageCHROMIUM( |
| 2062 resource->gpu_memory_buffer->AsClientBuffer(), resource->size.width(), | 2047 resource->gpu_memory_buffer->AsClientBuffer(), resource->size.width(), |
| 2063 resource->size.height(), GLInternalFormat(resource->format)); | 2048 resource->size.height(), GLInternalFormat(resource->format)); |
| 2064 DCHECK(resource->image_id || IsGLContextLost()); | 2049 DCHECK(resource->image_id || IsGLContextLost()); |
| 2065 | 2050 |
| 2066 resource->SetLocallyUsed(); | 2051 resource->SetLocallyUsed(); |
| 2052 resource->dirty_image = true; |
| 2067 } | 2053 } |
| 2068 } | 2054 } |
| 2069 | 2055 |
| 2070 void ResourceProvider::BindImageForSampling(Resource* resource) { | 2056 void ResourceProvider::BindImageForSampling(Resource* resource, |
| 2071 GLES2Interface* gl = ContextGL(); | 2057 gpu::gles2::GLES2Interface* gl, |
| 2072 DCHECK(resource->gl_id); | 2058 unsigned gl_id) { |
| 2059 DCHECK(gl_id); |
| 2073 DCHECK(resource->image_id); | 2060 DCHECK(resource->image_id); |
| 2074 | 2061 |
| 2075 // Release image currently bound to texture. | 2062 // Release image currently bound to texture. |
| 2076 gl->BindTexture(resource->target, resource->gl_id); | 2063 gl->BindTexture(resource->target, gl_id); |
| 2077 if (resource->bound_image_id) | 2064 if (resource->bound_image_id) |
| 2078 gl->ReleaseTexImage2DCHROMIUM(resource->target, resource->bound_image_id); | 2065 gl->ReleaseTexImage2DCHROMIUM(resource->target, resource->bound_image_id); |
| 2079 gl->BindTexImage2DCHROMIUM(resource->target, resource->image_id); | 2066 gl->BindTexImage2DCHROMIUM(resource->target, resource->image_id); |
| 2080 resource->bound_image_id = resource->image_id; | 2067 resource->bound_image_id = resource->image_id; |
| 2081 resource->dirty_image = false; | 2068 resource->dirty_image = false; |
| 2082 resource->SetLocallyUsed(); | 2069 resource->SetLocallyUsed(); |
| 2083 } | 2070 } |
| 2084 | 2071 |
| 2085 void ResourceProvider::WaitSyncTokenIfNeeded(ResourceId id) { | 2072 void ResourceProvider::WaitSyncTokenIfNeeded(ResourceId id) { |
| 2086 Resource* resource = GetResource(id); | 2073 Resource* resource = GetResource(id); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2194 | 2181 |
| 2195 const int kImportance = 2; | 2182 const int kImportance = 2; |
| 2196 pmd->CreateSharedGlobalAllocatorDump(guid); | 2183 pmd->CreateSharedGlobalAllocatorDump(guid); |
| 2197 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); | 2184 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); |
| 2198 } | 2185 } |
| 2199 | 2186 |
| 2200 return true; | 2187 return true; |
| 2201 } | 2188 } |
| 2202 | 2189 |
| 2203 } // namespace cc | 2190 } // namespace cc |
| OLD | NEW |