| 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 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 imported_count(0), | 229 imported_count(0), |
| 230 exported_count(0), | 230 exported_count(0), |
| 231 dirty_image(false), | 231 dirty_image(false), |
| 232 locked_for_write(false), | 232 locked_for_write(false), |
| 233 lost(false), | 233 lost(false), |
| 234 marked_for_deletion(false), | 234 marked_for_deletion(false), |
| 235 allocated(false), | 235 allocated(false), |
| 236 read_lock_fences_enabled(false), | 236 read_lock_fences_enabled(false), |
| 237 has_shared_bitmap_id(false), | 237 has_shared_bitmap_id(false), |
| 238 is_overlay_candidate(false), | 238 is_overlay_candidate(false), |
| 239 #if defined(OS_ANDROID) |
| 240 is_backed_by_surface_texture(false), |
| 241 #endif |
| 239 read_lock_fence(nullptr), | 242 read_lock_fence(nullptr), |
| 240 size(size), | 243 size(size), |
| 241 origin(origin), | 244 origin(origin), |
| 242 target(target), | 245 target(target), |
| 243 original_filter(filter), | 246 original_filter(filter), |
| 244 filter(filter), | 247 filter(filter), |
| 245 image_id(0), | 248 image_id(0), |
| 246 bound_image_id(0), | 249 bound_image_id(0), |
| 247 hint(hint), | 250 hint(hint), |
| 248 type(type), | 251 type(type), |
| 249 usage(gfx::BufferUsage::GPU_READ_CPU_READ_WRITE), | 252 usage(gfx::BufferUsage::GPU_READ_CPU_READ_WRITE), |
| 250 format(format), | 253 format(format), |
| 251 shared_bitmap(nullptr) {} | 254 shared_bitmap(nullptr) { |
| 255 } |
| 252 | 256 |
| 253 ResourceProvider::Resource::Resource(uint8_t* pixels, | 257 ResourceProvider::Resource::Resource(uint8_t* pixels, |
| 254 SharedBitmap* bitmap, | 258 SharedBitmap* bitmap, |
| 255 const gfx::Size& size, | 259 const gfx::Size& size, |
| 256 Origin origin, | 260 Origin origin, |
| 257 GLenum filter) | 261 GLenum filter) |
| 258 : child_id(0), | 262 : child_id(0), |
| 259 gl_id(0), | 263 gl_id(0), |
| 260 gl_pixel_buffer_id(0), | 264 gl_pixel_buffer_id(0), |
| 261 gl_upload_query_id(0), | 265 gl_upload_query_id(0), |
| 262 gl_read_lock_query_id(0), | 266 gl_read_lock_query_id(0), |
| 263 pixels(pixels), | 267 pixels(pixels), |
| 264 lock_for_read_count(0), | 268 lock_for_read_count(0), |
| 265 imported_count(0), | 269 imported_count(0), |
| 266 exported_count(0), | 270 exported_count(0), |
| 267 dirty_image(false), | 271 dirty_image(false), |
| 268 locked_for_write(false), | 272 locked_for_write(false), |
| 269 lost(false), | 273 lost(false), |
| 270 marked_for_deletion(false), | 274 marked_for_deletion(false), |
| 271 allocated(false), | 275 allocated(false), |
| 272 read_lock_fences_enabled(false), | 276 read_lock_fences_enabled(false), |
| 273 has_shared_bitmap_id(!!bitmap), | 277 has_shared_bitmap_id(!!bitmap), |
| 274 is_overlay_candidate(false), | 278 is_overlay_candidate(false), |
| 279 #if defined(OS_ANDROID) |
| 280 is_backed_by_surface_texture(false), |
| 281 #endif |
| 275 read_lock_fence(nullptr), | 282 read_lock_fence(nullptr), |
| 276 size(size), | 283 size(size), |
| 277 origin(origin), | 284 origin(origin), |
| 278 target(0), | 285 target(0), |
| 279 original_filter(filter), | 286 original_filter(filter), |
| 280 filter(filter), | 287 filter(filter), |
| 281 image_id(0), | 288 image_id(0), |
| 282 bound_image_id(0), | 289 bound_image_id(0), |
| 283 hint(TEXTURE_HINT_IMMUTABLE), | 290 hint(TEXTURE_HINT_IMMUTABLE), |
| 284 type(RESOURCE_TYPE_BITMAP), | 291 type(RESOURCE_TYPE_BITMAP), |
| (...skipping 18 matching lines...) Expand all Loading... |
| 303 imported_count(0), | 310 imported_count(0), |
| 304 exported_count(0), | 311 exported_count(0), |
| 305 dirty_image(false), | 312 dirty_image(false), |
| 306 locked_for_write(false), | 313 locked_for_write(false), |
| 307 lost(false), | 314 lost(false), |
| 308 marked_for_deletion(false), | 315 marked_for_deletion(false), |
| 309 allocated(false), | 316 allocated(false), |
| 310 read_lock_fences_enabled(false), | 317 read_lock_fences_enabled(false), |
| 311 has_shared_bitmap_id(true), | 318 has_shared_bitmap_id(true), |
| 312 is_overlay_candidate(false), | 319 is_overlay_candidate(false), |
| 320 #if defined(OS_ANDROID) |
| 321 is_backed_by_surface_texture(false), |
| 322 #endif |
| 313 read_lock_fence(nullptr), | 323 read_lock_fence(nullptr), |
| 314 size(size), | 324 size(size), |
| 315 origin(origin), | 325 origin(origin), |
| 316 target(0), | 326 target(0), |
| 317 original_filter(filter), | 327 original_filter(filter), |
| 318 filter(filter), | 328 filter(filter), |
| 319 image_id(0), | 329 image_id(0), |
| 320 bound_image_id(0), | 330 bound_image_id(0), |
| 321 hint(TEXTURE_HINT_IMMUTABLE), | 331 hint(TEXTURE_HINT_IMMUTABLE), |
| 322 type(RESOURCE_TYPE_BITMAP), | 332 type(RESOURCE_TYPE_BITMAP), |
| 323 format(RGBA_8888), | 333 format(RGBA_8888), |
| 324 shared_bitmap_id(bitmap_id), | 334 shared_bitmap_id(bitmap_id), |
| 325 shared_bitmap(nullptr) {} | 335 shared_bitmap(nullptr) { |
| 336 } |
| 326 | 337 |
| 327 ResourceProvider::Resource::Resource(Resource&& other) = default; | 338 ResourceProvider::Resource::Resource(Resource&& other) = default; |
| 328 | 339 |
| 329 void ResourceProvider::Resource::set_mailbox(const TextureMailbox& mailbox) { | 340 void ResourceProvider::Resource::set_mailbox(const TextureMailbox& mailbox) { |
| 330 mailbox_ = mailbox; | 341 mailbox_ = mailbox; |
| 331 if (IsGpuResourceType(type)) { | 342 if (IsGpuResourceType(type)) { |
| 332 synchronization_state_ = | 343 synchronization_state_ = |
| 333 (mailbox.sync_token().HasData() ? NEEDS_WAIT : LOCALLY_USED); | 344 (mailbox.sync_token().HasData() ? NEEDS_WAIT : LOCALLY_USED); |
| 334 needs_sync_token_ = !mailbox.sync_token().HasData(); | 345 needs_sync_token_ = !mailbox.sync_token().HasData(); |
| 335 } else { | 346 } else { |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 Resource::EXTERNAL, GL_LINEAR)); | 691 Resource::EXTERNAL, GL_LINEAR)); |
| 681 } | 692 } |
| 682 resource->allocated = true; | 693 resource->allocated = true; |
| 683 resource->set_mailbox(mailbox); | 694 resource->set_mailbox(mailbox); |
| 684 resource->color_space = mailbox.color_space(); | 695 resource->color_space = mailbox.color_space(); |
| 685 resource->release_callback_impl = | 696 resource->release_callback_impl = |
| 686 base::Bind(&SingleReleaseCallbackImpl::Run, | 697 base::Bind(&SingleReleaseCallbackImpl::Run, |
| 687 base::Owned(release_callback_impl.release())); | 698 base::Owned(release_callback_impl.release())); |
| 688 resource->read_lock_fences_enabled = read_lock_fences_enabled; | 699 resource->read_lock_fences_enabled = read_lock_fences_enabled; |
| 689 resource->is_overlay_candidate = mailbox.is_overlay_candidate(); | 700 resource->is_overlay_candidate = mailbox.is_overlay_candidate(); |
| 701 #if defined(OS_ANDROID) |
| 702 resource->is_backed_by_surface_texture = |
| 703 mailbox.is_backed_by_surface_texture(); |
| 704 #endif |
| 690 resource->color_space = mailbox.color_space(); | 705 resource->color_space = mailbox.color_space(); |
| 691 | 706 |
| 692 return id; | 707 return id; |
| 693 } | 708 } |
| 694 | 709 |
| 695 ResourceId ResourceProvider::CreateResourceFromTextureMailbox( | 710 ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
| 696 const TextureMailbox& mailbox, | 711 const TextureMailbox& mailbox, |
| 697 std::unique_ptr<SingleReleaseCallbackImpl> release_callback_impl) { | 712 std::unique_ptr<SingleReleaseCallbackImpl> release_callback_impl) { |
| 698 return CreateResourceFromTextureMailbox( | 713 return CreateResourceFromTextureMailbox( |
| 699 mailbox, std::move(release_callback_impl), false); | 714 mailbox, std::move(release_callback_impl), false); |
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1041 return !resource->locked_for_write && !resource->lock_for_read_count && | 1056 return !resource->locked_for_write && !resource->lock_for_read_count && |
| 1042 !resource->exported_count && resource->origin == Resource::INTERNAL && | 1057 !resource->exported_count && resource->origin == Resource::INTERNAL && |
| 1043 !resource->lost && ReadLockFenceHasPassed(resource); | 1058 !resource->lost && ReadLockFenceHasPassed(resource); |
| 1044 } | 1059 } |
| 1045 | 1060 |
| 1046 bool ResourceProvider::IsOverlayCandidate(ResourceId id) { | 1061 bool ResourceProvider::IsOverlayCandidate(ResourceId id) { |
| 1047 Resource* resource = GetResource(id); | 1062 Resource* resource = GetResource(id); |
| 1048 return resource->is_overlay_candidate; | 1063 return resource->is_overlay_candidate; |
| 1049 } | 1064 } |
| 1050 | 1065 |
| 1066 #if defined(OS_ANDROID) |
| 1067 bool ResourceProvider::IsBackedBySurfaceTexture(ResourceId id) { |
| 1068 Resource* resource = GetResource(id); |
| 1069 return resource->is_backed_by_surface_texture; |
| 1070 } |
| 1071 #endif |
| 1072 |
| 1051 void ResourceProvider::UnlockForWrite(Resource* resource) { | 1073 void ResourceProvider::UnlockForWrite(Resource* resource) { |
| 1052 DCHECK(resource->locked_for_write); | 1074 DCHECK(resource->locked_for_write); |
| 1053 DCHECK_EQ(resource->exported_count, 0); | 1075 DCHECK_EQ(resource->exported_count, 0); |
| 1054 DCHECK(resource->origin == Resource::INTERNAL); | 1076 DCHECK(resource->origin == Resource::INTERNAL); |
| 1055 resource->locked_for_write = false; | 1077 resource->locked_for_write = false; |
| 1056 } | 1078 } |
| 1057 | 1079 |
| 1058 void ResourceProvider::EnableReadLockFencesForTesting(ResourceId id) { | 1080 void ResourceProvider::EnableReadLockFencesForTesting(ResourceId id) { |
| 1059 Resource* resource = GetResource(id); | 1081 Resource* resource = GetResource(id); |
| 1060 DCHECK(resource); | 1082 DCHECK(resource); |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1525 resource = InsertResource( | 1547 resource = InsertResource( |
| 1526 local_id, Resource(0, it->size, Resource::DELEGATED, | 1548 local_id, Resource(0, it->size, Resource::DELEGATED, |
| 1527 it->mailbox_holder.texture_target, it->filter, | 1549 it->mailbox_holder.texture_target, it->filter, |
| 1528 TEXTURE_HINT_IMMUTABLE, RESOURCE_TYPE_GL_TEXTURE, | 1550 TEXTURE_HINT_IMMUTABLE, RESOURCE_TYPE_GL_TEXTURE, |
| 1529 it->format)); | 1551 it->format)); |
| 1530 resource->set_mailbox(TextureMailbox(it->mailbox_holder.mailbox, | 1552 resource->set_mailbox(TextureMailbox(it->mailbox_holder.mailbox, |
| 1531 it->mailbox_holder.sync_token, | 1553 it->mailbox_holder.sync_token, |
| 1532 it->mailbox_holder.texture_target)); | 1554 it->mailbox_holder.texture_target)); |
| 1533 resource->read_lock_fences_enabled = it->read_lock_fences_enabled; | 1555 resource->read_lock_fences_enabled = it->read_lock_fences_enabled; |
| 1534 resource->is_overlay_candidate = it->is_overlay_candidate; | 1556 resource->is_overlay_candidate = it->is_overlay_candidate; |
| 1557 #if defined(OS_ANDROID) |
| 1558 resource->is_backed_by_surface_texture = it->is_backed_by_surface_texture; |
| 1559 #endif |
| 1535 resource->color_space = it->color_space; | 1560 resource->color_space = it->color_space; |
| 1536 } | 1561 } |
| 1537 resource->child_id = child; | 1562 resource->child_id = child; |
| 1538 // Don't allocate a texture for a child. | 1563 // Don't allocate a texture for a child. |
| 1539 resource->allocated = true; | 1564 resource->allocated = true; |
| 1540 resource->imported_count = 1; | 1565 resource->imported_count = 1; |
| 1541 child_info.parent_to_child_map[local_id] = it->id; | 1566 child_info.parent_to_child_map[local_id] = it->id; |
| 1542 child_info.child_to_parent_map[it->id] = local_id; | 1567 child_info.child_to_parent_map[it->id] = local_id; |
| 1543 } | 1568 } |
| 1544 } | 1569 } |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1652 DCHECK(!source->lock_for_read_count); | 1677 DCHECK(!source->lock_for_read_count); |
| 1653 DCHECK(source->origin != Resource::EXTERNAL || source->mailbox().IsValid()); | 1678 DCHECK(source->origin != Resource::EXTERNAL || source->mailbox().IsValid()); |
| 1654 DCHECK(source->allocated); | 1679 DCHECK(source->allocated); |
| 1655 resource->id = id; | 1680 resource->id = id; |
| 1656 resource->format = source->format; | 1681 resource->format = source->format; |
| 1657 resource->mailbox_holder.texture_target = source->target; | 1682 resource->mailbox_holder.texture_target = source->target; |
| 1658 resource->filter = source->filter; | 1683 resource->filter = source->filter; |
| 1659 resource->size = source->size; | 1684 resource->size = source->size; |
| 1660 resource->read_lock_fences_enabled = source->read_lock_fences_enabled; | 1685 resource->read_lock_fences_enabled = source->read_lock_fences_enabled; |
| 1661 resource->is_overlay_candidate = source->is_overlay_candidate; | 1686 resource->is_overlay_candidate = source->is_overlay_candidate; |
| 1687 #if defined(OS_ANDROID) |
| 1688 resource->is_backed_by_surface_texture = source->is_backed_by_surface_texture; |
| 1689 #endif |
| 1662 resource->color_space = source->color_space; | 1690 resource->color_space = source->color_space; |
| 1663 | 1691 |
| 1664 if (source->type == RESOURCE_TYPE_BITMAP) { | 1692 if (source->type == RESOURCE_TYPE_BITMAP) { |
| 1665 resource->mailbox_holder.mailbox = source->shared_bitmap_id; | 1693 resource->mailbox_holder.mailbox = source->shared_bitmap_id; |
| 1666 resource->is_software = true; | 1694 resource->is_software = true; |
| 1667 } else { | 1695 } else { |
| 1668 DCHECK(source->mailbox().IsValid()); | 1696 DCHECK(source->mailbox().IsValid()); |
| 1669 DCHECK(source->mailbox().IsTexture()); | 1697 DCHECK(source->mailbox().IsTexture()); |
| 1670 DCHECK(!source->image_id || !source->dirty_image); | 1698 DCHECK(!source->image_id || !source->dirty_image); |
| 1671 // This is either an external resource, or a compositor resource that we | 1699 // This is either an external resource, or a compositor resource that we |
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2058 | 2086 |
| 2059 const int kImportance = 2; | 2087 const int kImportance = 2; |
| 2060 pmd->CreateSharedGlobalAllocatorDump(guid); | 2088 pmd->CreateSharedGlobalAllocatorDump(guid); |
| 2061 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); | 2089 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); |
| 2062 } | 2090 } |
| 2063 | 2091 |
| 2064 return true; | 2092 return true; |
| 2065 } | 2093 } |
| 2066 | 2094 |
| 2067 } // namespace cc | 2095 } // namespace cc |
| OLD | NEW |