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

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

Issue 2885533002: cc: Allocate resources on worker context.
Patch Set: fix tests Created 3 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 910 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698