Chromium Code Reviews| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
| (...skipping 1176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1187 ResourceMap::iterator& map_iterator = sorted_resources[i].second; | 1187 ResourceMap::iterator& map_iterator = sorted_resources[i].second; |
| 1188 ResourceId local_id = map_iterator->first; | 1188 ResourceId local_id = map_iterator->first; |
| 1189 Resource* resource = &map_iterator->second; | 1189 Resource* resource = &map_iterator->second; |
| 1190 | 1190 |
| 1191 CHECK_GE(resource->exported_count, returned.count); | 1191 CHECK_GE(resource->exported_count, returned.count); |
| 1192 resource->exported_count -= returned.count; | 1192 resource->exported_count -= returned.count; |
| 1193 resource->lost |= returned.lost; | 1193 resource->lost |= returned.lost; |
| 1194 if (resource->exported_count) | 1194 if (resource->exported_count) |
| 1195 continue; | 1195 continue; |
| 1196 | 1196 |
| 1197 // Need to wait for the current read lock fence to pass before we can | |
| 1198 // recycle this resource. | |
| 1199 if (resource->enable_read_lock_fences) | |
| 1200 resource->read_lock_fence = current_read_lock_fence_; | |
| 1201 | |
| 1197 if (resource->gl_id) { | 1202 if (resource->gl_id) { |
| 1198 if (returned.sync_point) | 1203 if (returned.sync_point) |
| 1199 GLC(gl, gl->WaitSyncPointCHROMIUM(returned.sync_point)); | 1204 GLC(gl, gl->WaitSyncPointCHROMIUM(returned.sync_point)); |
| 1200 } else if (!resource->shared_bitmap) { | 1205 } else if (!resource->shared_bitmap) { |
| 1201 resource->mailbox = | 1206 resource->mailbox = |
| 1202 TextureMailbox(resource->mailbox.name(), returned.sync_point); | 1207 TextureMailbox(resource->mailbox.name(), returned.sync_point); |
| 1203 } | 1208 } |
| 1204 | 1209 |
| 1205 if (!resource->marked_for_deletion) | 1210 if (!resource->marked_for_deletion) |
| 1206 continue; | 1211 continue; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1244 DCHECK(!source->lock_for_read_count); | 1249 DCHECK(!source->lock_for_read_count); |
| 1245 DCHECK(!source->external || (source->external && source->mailbox.IsValid())); | 1250 DCHECK(!source->external || (source->external && source->mailbox.IsValid())); |
| 1246 DCHECK(source->allocated); | 1251 DCHECK(source->allocated); |
| 1247 DCHECK_EQ(source->wrap_mode, GL_CLAMP_TO_EDGE); | 1252 DCHECK_EQ(source->wrap_mode, GL_CLAMP_TO_EDGE); |
| 1248 resource->id = id; | 1253 resource->id = id; |
| 1249 resource->format = source->format; | 1254 resource->format = source->format; |
| 1250 resource->target = source->target; | 1255 resource->target = source->target; |
| 1251 resource->filter = source->filter; | 1256 resource->filter = source->filter; |
| 1252 resource->size = source->size; | 1257 resource->size = source->size; |
| 1253 | 1258 |
| 1259 LazyCreate(source); | |
|
danakj
2014/01/16 17:55:52
Why this? You're transferring a resource that has
piman
2014/01/16 21:54:34
I don't think it's correct here, actually.
This wo
reveman
2014/01/17 01:38:39
We've created and written to the GLImage but it ha
reveman
2014/01/17 01:38:39
Hm, is texture_pool not 0 in those cases? Makes se
| |
| 1260 | |
| 1254 if (source->shared_bitmap) { | 1261 if (source->shared_bitmap) { |
| 1255 resource->mailbox = source->shared_bitmap->id(); | 1262 resource->mailbox = source->shared_bitmap->id(); |
| 1256 resource->is_software = true; | 1263 resource->is_software = true; |
| 1257 } else if (!source->mailbox.IsValid()) { | 1264 } else if (!source->mailbox.IsValid()) { |
| 1258 // This is a resource allocated by the compositor, we need to produce it. | 1265 // This is a resource allocated by the compositor, we need to produce it. |
| 1259 // Don't set a sync point, the caller will do it. | 1266 // Don't set a sync point, the caller will do it. |
| 1260 DCHECK(source->gl_id); | 1267 DCHECK(source->gl_id); |
| 1261 GLC(gl, gl->BindTexture(resource->target, source->gl_id)); | 1268 GLC(gl, gl->BindTexture(resource->target, source->gl_id)); |
| 1269 if (source->image_id) { | |
| 1270 DCHECK(source->dirty_image); | |
| 1271 BindImageForSampling(source); | |
| 1272 } | |
| 1262 GLC(gl, gl->GenMailboxCHROMIUM(resource->mailbox.name)); | 1273 GLC(gl, gl->GenMailboxCHROMIUM(resource->mailbox.name)); |
| 1263 GLC(gl, | 1274 GLC(gl, |
| 1264 gl->ProduceTextureCHROMIUM(resource->target, resource->mailbox.name)); | 1275 gl->ProduceTextureCHROMIUM(resource->target, resource->mailbox.name)); |
| 1265 source->mailbox.SetName(resource->mailbox); | 1276 source->mailbox.SetName(resource->mailbox); |
| 1266 } else { | 1277 } else { |
| 1267 DCHECK(source->mailbox.IsTexture()); | 1278 DCHECK(source->mailbox.IsTexture()); |
| 1279 if (source->image_id && source->dirty_image) { | |
|
piman
2014/01/16 21:54:34
Add a DCHECK(source->gl_id);
The only reason we'd
reveman
2014/01/17 01:38:39
Done.
| |
| 1280 GLC(gl, gl->BindTexture(resource->target, source->gl_id)); | |
| 1281 BindImageForSampling(source); | |
| 1282 } | |
| 1268 // This is either an external resource, or a compositor resource that we | 1283 // This is either an external resource, or a compositor resource that we |
| 1269 // already exported. Make sure to forward the sync point that we were given. | 1284 // already exported. Make sure to forward the sync point that we were given. |
| 1270 resource->mailbox = source->mailbox.name(); | 1285 resource->mailbox = source->mailbox.name(); |
| 1271 resource->sync_point = source->mailbox.sync_point(); | 1286 resource->sync_point = source->mailbox.sync_point(); |
| 1272 source->mailbox.ResetSyncPoint(); | 1287 source->mailbox.ResetSyncPoint(); |
| 1273 } | 1288 } |
| 1274 } | 1289 } |
| 1275 | 1290 |
| 1276 void ResourceProvider::DeleteAndReturnUnusedResourcesToChild( | 1291 void ResourceProvider::DeleteAndReturnUnusedResourcesToChild( |
| 1277 ChildMap::iterator child_it, | 1292 ChildMap::iterator child_it, |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1490 | 1505 |
| 1491 ScopedSetActiveTexture scoped_active_tex(gl, unit); | 1506 ScopedSetActiveTexture scoped_active_tex(gl, unit); |
| 1492 GLenum target = resource->target; | 1507 GLenum target = resource->target; |
| 1493 GLC(gl, gl->BindTexture(target, resource->gl_id)); | 1508 GLC(gl, gl->BindTexture(target, resource->gl_id)); |
| 1494 if (filter != resource->filter) { | 1509 if (filter != resource->filter) { |
| 1495 GLC(gl, gl->TexParameteri(target, GL_TEXTURE_MIN_FILTER, filter)); | 1510 GLC(gl, gl->TexParameteri(target, GL_TEXTURE_MIN_FILTER, filter)); |
| 1496 GLC(gl, gl->TexParameteri(target, GL_TEXTURE_MAG_FILTER, filter)); | 1511 GLC(gl, gl->TexParameteri(target, GL_TEXTURE_MAG_FILTER, filter)); |
| 1497 resource->filter = filter; | 1512 resource->filter = filter; |
| 1498 } | 1513 } |
| 1499 | 1514 |
| 1500 if (resource->image_id && resource->dirty_image) { | 1515 if (resource->image_id && resource->dirty_image) |
| 1501 // Release image currently bound to texture. | 1516 BindImageForSampling(resource); |
| 1502 if (resource->bound_image_id) | |
| 1503 gl->ReleaseTexImage2DCHROMIUM(target, resource->bound_image_id); | |
| 1504 gl->BindTexImage2DCHROMIUM(target, resource->image_id); | |
| 1505 resource->bound_image_id = resource->image_id; | |
| 1506 resource->dirty_image = false; | |
| 1507 } | |
| 1508 | 1517 |
| 1509 return target; | 1518 return target; |
| 1510 } | 1519 } |
| 1511 | 1520 |
| 1512 void ResourceProvider::BeginSetPixels(ResourceId id) { | 1521 void ResourceProvider::BeginSetPixels(ResourceId id) { |
| 1513 Resource* resource = GetResource(id); | 1522 Resource* resource = GetResource(id); |
| 1514 DCHECK(!resource->pending_set_pixels); | 1523 DCHECK(!resource->pending_set_pixels); |
| 1515 | 1524 |
| 1516 LazyCreate(resource); | 1525 LazyCreate(resource); |
| 1517 DCHECK(resource->gl_id || resource->allocated); | 1526 DCHECK(resource->gl_id || resource->allocated); |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1689 size.width(), | 1698 size.width(), |
| 1690 size.height(), | 1699 size.height(), |
| 1691 0, | 1700 0, |
| 1692 GLDataFormat(format), | 1701 GLDataFormat(format), |
| 1693 GLDataType(format), | 1702 GLDataType(format), |
| 1694 NULL)); | 1703 NULL)); |
| 1695 } | 1704 } |
| 1696 } | 1705 } |
| 1697 } | 1706 } |
| 1698 | 1707 |
| 1708 void ResourceProvider::BindImageForSampling(Resource* resource) { | |
| 1709 GLES2Interface* gl = ContextGL(); | |
| 1710 DCHECK(resource->gl_id); | |
| 1711 DCHECK(resource->image_id); | |
| 1712 | |
| 1713 // Release image currently bound to texture. | |
| 1714 if (resource->bound_image_id) | |
| 1715 gl->ReleaseTexImage2DCHROMIUM(resource->target, resource->bound_image_id); | |
| 1716 gl->BindTexImage2DCHROMIUM(resource->target, resource->image_id); | |
| 1717 resource->bound_image_id = resource->image_id; | |
| 1718 resource->dirty_image = false; | |
| 1719 } | |
| 1720 | |
| 1699 void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, | 1721 void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, |
| 1700 bool enable) { | 1722 bool enable) { |
| 1701 Resource* resource = GetResource(id); | 1723 Resource* resource = GetResource(id); |
| 1702 resource->enable_read_lock_fences = enable; | 1724 resource->enable_read_lock_fences = enable; |
| 1703 } | 1725 } |
| 1704 | 1726 |
| 1705 void ResourceProvider::AcquireImage(ResourceId id) { | 1727 void ResourceProvider::AcquireImage(ResourceId id) { |
| 1706 Resource* resource = GetResource(id); | 1728 Resource* resource = GetResource(id); |
| 1707 DCHECK(!resource->external); | 1729 DCHECK(!resource->external); |
| 1708 DCHECK_EQ(resource->exported_count, 0); | 1730 DCHECK_EQ(resource->exported_count, 0); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1804 gl->GetIntegerv(GL_ACTIVE_TEXTURE, &active_unit); | 1826 gl->GetIntegerv(GL_ACTIVE_TEXTURE, &active_unit); |
| 1805 return active_unit; | 1827 return active_unit; |
| 1806 } | 1828 } |
| 1807 | 1829 |
| 1808 GLES2Interface* ResourceProvider::ContextGL() const { | 1830 GLES2Interface* ResourceProvider::ContextGL() const { |
| 1809 ContextProvider* context_provider = output_surface_->context_provider(); | 1831 ContextProvider* context_provider = output_surface_->context_provider(); |
| 1810 return context_provider ? context_provider->ContextGL() : NULL; | 1832 return context_provider ? context_provider->ContextGL() : NULL; |
| 1811 } | 1833 } |
| 1812 | 1834 |
| 1813 } // namespace cc | 1835 } // namespace cc |
| OLD | NEW |