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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 | 66 |
67 } // namespace | 67 } // namespace |
68 | 68 |
69 ResourceProvider::Resource::Resource() | 69 ResourceProvider::Resource::Resource() |
70 : gl_id(0), | 70 : gl_id(0), |
71 gl_pixel_buffer_id(0), | 71 gl_pixel_buffer_id(0), |
72 gl_upload_query_id(0), | 72 gl_upload_query_id(0), |
73 pixels(NULL), | 73 pixels(NULL), |
74 pixel_buffer(NULL), | 74 pixel_buffer(NULL), |
75 lock_for_read_count(0), | 75 lock_for_read_count(0), |
| 76 imported_count(0), |
| 77 exported_count(0), |
76 locked_for_write(false), | 78 locked_for_write(false), |
77 external(false), | 79 external(false), |
78 exported(false), | |
79 marked_for_deletion(false), | 80 marked_for_deletion(false), |
80 pending_set_pixels(false), | 81 pending_set_pixels(false), |
81 set_pixels_completion_forced(false), | 82 set_pixels_completion_forced(false), |
82 allocated(false), | 83 allocated(false), |
83 enable_read_lock_fences(false), | 84 enable_read_lock_fences(false), |
84 read_lock_fence(NULL), | 85 read_lock_fence(NULL), |
85 size(), | 86 size(), |
86 format(0), | 87 format(0), |
87 filter(0), | 88 filter(0), |
88 image_id(0), | 89 image_id(0), |
89 texture_pool(0), | 90 texture_pool(0), |
90 hint(TextureUsageAny), | 91 hint(TextureUsageAny), |
91 type(static_cast<ResourceType>(0)) {} | 92 type(static_cast<ResourceType>(0)) {} |
92 | 93 |
93 ResourceProvider::Resource::~Resource() {} | 94 ResourceProvider::Resource::~Resource() {} |
94 | 95 |
95 ResourceProvider::Resource::Resource( | 96 ResourceProvider::Resource::Resource( |
96 unsigned texture_id, | 97 unsigned texture_id, |
97 gfx::Size size, | 98 gfx::Size size, |
98 GLenum format, | 99 GLenum format, |
99 GLenum filter, | 100 GLenum filter, |
100 GLenum texture_pool, | 101 GLenum texture_pool, |
101 TextureUsageHint hint) | 102 TextureUsageHint hint) |
102 : gl_id(texture_id), | 103 : gl_id(texture_id), |
103 gl_pixel_buffer_id(0), | 104 gl_pixel_buffer_id(0), |
104 gl_upload_query_id(0), | 105 gl_upload_query_id(0), |
105 pixels(NULL), | 106 pixels(NULL), |
106 pixel_buffer(NULL), | 107 pixel_buffer(NULL), |
107 lock_for_read_count(0), | 108 lock_for_read_count(0), |
| 109 imported_count(0), |
| 110 exported_count(0), |
108 locked_for_write(false), | 111 locked_for_write(false), |
109 external(false), | 112 external(false), |
110 exported(false), | |
111 marked_for_deletion(false), | 113 marked_for_deletion(false), |
112 pending_set_pixels(false), | 114 pending_set_pixels(false), |
113 set_pixels_completion_forced(false), | 115 set_pixels_completion_forced(false), |
114 allocated(false), | 116 allocated(false), |
115 enable_read_lock_fences(false), | 117 enable_read_lock_fences(false), |
116 read_lock_fence(NULL), | 118 read_lock_fence(NULL), |
117 size(size), | 119 size(size), |
118 format(format), | 120 format(format), |
119 filter(filter), | 121 filter(filter), |
120 image_id(0), | 122 image_id(0), |
121 texture_pool(texture_pool), | 123 texture_pool(texture_pool), |
122 hint(hint), | 124 hint(hint), |
123 type(GLTexture) {} | 125 type(GLTexture) {} |
124 | 126 |
125 ResourceProvider::Resource::Resource( | 127 ResourceProvider::Resource::Resource( |
126 uint8_t* pixels, gfx::Size size, GLenum format, GLenum filter) | 128 uint8_t* pixels, gfx::Size size, GLenum format, GLenum filter) |
127 : gl_id(0), | 129 : gl_id(0), |
128 gl_pixel_buffer_id(0), | 130 gl_pixel_buffer_id(0), |
129 gl_upload_query_id(0), | 131 gl_upload_query_id(0), |
130 pixels(pixels), | 132 pixels(pixels), |
131 pixel_buffer(NULL), | 133 pixel_buffer(NULL), |
132 lock_for_read_count(0), | 134 lock_for_read_count(0), |
| 135 imported_count(0), |
| 136 exported_count(0), |
133 locked_for_write(false), | 137 locked_for_write(false), |
134 external(false), | 138 external(false), |
135 exported(false), | |
136 marked_for_deletion(false), | 139 marked_for_deletion(false), |
137 pending_set_pixels(false), | 140 pending_set_pixels(false), |
138 set_pixels_completion_forced(false), | 141 set_pixels_completion_forced(false), |
139 allocated(false), | 142 allocated(false), |
140 enable_read_lock_fences(false), | 143 enable_read_lock_fences(false), |
141 read_lock_fence(NULL), | 144 read_lock_fence(NULL), |
142 size(size), | 145 size(size), |
143 format(format), | 146 format(format), |
144 filter(filter), | 147 filter(filter), |
145 image_id(0), | 148 image_id(0), |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 WebGraphicsContext3D* ResourceProvider::GraphicsContext3D() { | 185 WebGraphicsContext3D* ResourceProvider::GraphicsContext3D() { |
183 DCHECK(thread_checker_.CalledOnValidThread()); | 186 DCHECK(thread_checker_.CalledOnValidThread()); |
184 return output_surface_->context3d(); | 187 return output_surface_->context3d(); |
185 } | 188 } |
186 | 189 |
187 bool ResourceProvider::InUseByConsumer(ResourceId id) { | 190 bool ResourceProvider::InUseByConsumer(ResourceId id) { |
188 DCHECK(thread_checker_.CalledOnValidThread()); | 191 DCHECK(thread_checker_.CalledOnValidThread()); |
189 ResourceMap::iterator it = resources_.find(id); | 192 ResourceMap::iterator it = resources_.find(id); |
190 CHECK(it != resources_.end()); | 193 CHECK(it != resources_.end()); |
191 Resource* resource = &it->second; | 194 Resource* resource = &it->second; |
192 return !!resource->lock_for_read_count || resource->exported; | 195 return resource->lock_for_read_count > 0 || resource->exported_count > 0; |
193 } | 196 } |
194 | 197 |
195 ResourceProvider::ResourceId ResourceProvider::CreateResource( | 198 ResourceProvider::ResourceId ResourceProvider::CreateResource( |
196 gfx::Size size, GLenum format, TextureUsageHint hint) { | 199 gfx::Size size, GLenum format, TextureUsageHint hint) { |
197 DCHECK(!size.IsEmpty()); | 200 DCHECK(!size.IsEmpty()); |
198 switch (default_resource_type_) { | 201 switch (default_resource_type_) { |
199 case GLTexture: | 202 case GLTexture: |
200 return CreateGLTexture( | 203 return CreateGLTexture( |
201 size, format, GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, hint); | 204 size, format, GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, hint); |
202 case Bitmap: | 205 case Bitmap: |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 return id; | 305 return id; |
303 } | 306 } |
304 | 307 |
305 void ResourceProvider::DeleteResource(ResourceId id) { | 308 void ResourceProvider::DeleteResource(ResourceId id) { |
306 DCHECK(thread_checker_.CalledOnValidThread()); | 309 DCHECK(thread_checker_.CalledOnValidThread()); |
307 ResourceMap::iterator it = resources_.find(id); | 310 ResourceMap::iterator it = resources_.find(id); |
308 CHECK(it != resources_.end()); | 311 CHECK(it != resources_.end()); |
309 Resource* resource = &it->second; | 312 Resource* resource = &it->second; |
310 DCHECK(!resource->lock_for_read_count); | 313 DCHECK(!resource->lock_for_read_count); |
311 DCHECK(!resource->marked_for_deletion); | 314 DCHECK(!resource->marked_for_deletion); |
| 315 DCHECK_EQ(resource->imported_count, 0); |
312 DCHECK(resource->pending_set_pixels || !resource->locked_for_write); | 316 DCHECK(resource->pending_set_pixels || !resource->locked_for_write); |
313 | 317 |
314 if (resource->exported) { | 318 if (resource->exported_count > 0) { |
315 resource->marked_for_deletion = true; | 319 resource->marked_for_deletion = true; |
316 return; | 320 return; |
317 } else { | 321 } else { |
318 DeleteResourceInternal(it, Normal); | 322 DeleteResourceInternal(it, Normal); |
319 } | 323 } |
320 } | 324 } |
321 | 325 |
322 void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, | 326 void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, |
323 DeleteStyle style) { | 327 DeleteStyle style) { |
324 Resource* resource = &it->second; | 328 Resource* resource = &it->second; |
325 bool lost_resource = lost_output_surface_; | 329 bool lost_resource = lost_output_surface_; |
326 | 330 |
327 DCHECK(!resource->exported || style != Normal); | 331 DCHECK(resource->exported_count == 0 || style != Normal); |
328 if (style == ForShutdown && resource->exported) | 332 if (style == ForShutdown && resource->exported_count > 0) |
329 lost_resource = true; | 333 lost_resource = true; |
330 | 334 |
331 if (resource->image_id) { | 335 if (resource->image_id) { |
332 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 336 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
333 DCHECK(context3d); | 337 DCHECK(context3d); |
334 GLC(context3d, context3d->destroyImageCHROMIUM(resource->image_id)); | 338 GLC(context3d, context3d->destroyImageCHROMIUM(resource->image_id)); |
335 } | 339 } |
336 | 340 |
337 if (resource->gl_id && !resource->external) { | 341 if (resource->gl_id && !resource->external) { |
338 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 342 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 gfx::Rect image_rect, | 393 gfx::Rect image_rect, |
390 gfx::Rect source_rect, | 394 gfx::Rect source_rect, |
391 gfx::Vector2d dest_offset) { | 395 gfx::Vector2d dest_offset) { |
392 DCHECK(thread_checker_.CalledOnValidThread()); | 396 DCHECK(thread_checker_.CalledOnValidThread()); |
393 ResourceMap::iterator it = resources_.find(id); | 397 ResourceMap::iterator it = resources_.find(id); |
394 CHECK(it != resources_.end()); | 398 CHECK(it != resources_.end()); |
395 Resource* resource = &it->second; | 399 Resource* resource = &it->second; |
396 DCHECK(!resource->locked_for_write); | 400 DCHECK(!resource->locked_for_write); |
397 DCHECK(!resource->lock_for_read_count); | 401 DCHECK(!resource->lock_for_read_count); |
398 DCHECK(!resource->external); | 402 DCHECK(!resource->external); |
399 DCHECK(!resource->exported); | 403 DCHECK_EQ(resource->exported_count, 0); |
400 DCHECK(ReadLockFenceHasPassed(resource)); | 404 DCHECK(ReadLockFenceHasPassed(resource)); |
401 LazyAllocate(resource); | 405 LazyAllocate(resource); |
402 | 406 |
403 if (resource->gl_id) { | 407 if (resource->gl_id) { |
404 DCHECK(!resource->pending_set_pixels); | 408 DCHECK(!resource->pending_set_pixels); |
405 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 409 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
406 DCHECK(context3d); | 410 DCHECK(context3d); |
407 DCHECK(texture_uploader_.get()); | 411 DCHECK(texture_uploader_.get()); |
408 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); | 412 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); |
409 texture_uploader_->Upload(image, | 413 texture_uploader_->Upload(image, |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 | 500 |
497 const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { | 501 const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { |
498 DCHECK(thread_checker_.CalledOnValidThread()); | 502 DCHECK(thread_checker_.CalledOnValidThread()); |
499 ResourceMap::iterator it = resources_.find(id); | 503 ResourceMap::iterator it = resources_.find(id); |
500 CHECK(it != resources_.end()); | 504 CHECK(it != resources_.end()); |
501 Resource* resource = &it->second; | 505 Resource* resource = &it->second; |
502 DCHECK(!resource->locked_for_write || | 506 DCHECK(!resource->locked_for_write || |
503 resource->set_pixels_completion_forced) << | 507 resource->set_pixels_completion_forced) << |
504 "locked for write: " << resource->locked_for_write << | 508 "locked for write: " << resource->locked_for_write << |
505 " pixels completion forced: " << resource->set_pixels_completion_forced; | 509 " pixels completion forced: " << resource->set_pixels_completion_forced; |
506 DCHECK(!resource->exported); | 510 DCHECK_EQ(resource->exported_count, 0); |
507 // Uninitialized! Call SetPixels or LockForWrite first. | 511 // Uninitialized! Call SetPixels or LockForWrite first. |
508 DCHECK(resource->allocated); | 512 DCHECK(resource->allocated); |
509 | 513 |
510 LazyCreate(resource); | 514 LazyCreate(resource); |
511 | 515 |
512 if (resource->external) { | 516 if (resource->external) { |
513 if (!resource->gl_id && resource->mailbox.IsTexture()) { | 517 if (!resource->gl_id && resource->mailbox.IsTexture()) { |
514 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 518 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
515 DCHECK(context3d); | 519 DCHECK(context3d); |
516 if (resource->mailbox.sync_point()) { | 520 if (resource->mailbox.sync_point()) { |
(...skipping 15 matching lines...) Expand all Loading... |
532 | 536 |
533 return resource; | 537 return resource; |
534 } | 538 } |
535 | 539 |
536 void ResourceProvider::UnlockForRead(ResourceId id) { | 540 void ResourceProvider::UnlockForRead(ResourceId id) { |
537 DCHECK(thread_checker_.CalledOnValidThread()); | 541 DCHECK(thread_checker_.CalledOnValidThread()); |
538 ResourceMap::iterator it = resources_.find(id); | 542 ResourceMap::iterator it = resources_.find(id); |
539 CHECK(it != resources_.end()); | 543 CHECK(it != resources_.end()); |
540 Resource* resource = &it->second; | 544 Resource* resource = &it->second; |
541 DCHECK_GT(resource->lock_for_read_count, 0); | 545 DCHECK_GT(resource->lock_for_read_count, 0); |
542 DCHECK(!resource->exported); | 546 DCHECK_EQ(resource->exported_count, 0); |
543 resource->lock_for_read_count--; | 547 resource->lock_for_read_count--; |
544 } | 548 } |
545 | 549 |
546 const ResourceProvider::Resource* ResourceProvider::LockForWrite( | 550 const ResourceProvider::Resource* ResourceProvider::LockForWrite( |
547 ResourceId id) { | 551 ResourceId id) { |
548 DCHECK(thread_checker_.CalledOnValidThread()); | 552 DCHECK(thread_checker_.CalledOnValidThread()); |
549 ResourceMap::iterator it = resources_.find(id); | 553 ResourceMap::iterator it = resources_.find(id); |
550 CHECK(it != resources_.end()); | 554 CHECK(it != resources_.end()); |
551 Resource* resource = &it->second; | 555 Resource* resource = &it->second; |
552 DCHECK(!resource->locked_for_write); | 556 DCHECK(!resource->locked_for_write); |
553 DCHECK(!resource->lock_for_read_count); | 557 DCHECK(!resource->lock_for_read_count); |
554 DCHECK(!resource->exported); | 558 DCHECK_EQ(resource->exported_count, 0); |
555 DCHECK(!resource->external); | 559 DCHECK(!resource->external); |
556 DCHECK(ReadLockFenceHasPassed(resource)); | 560 DCHECK(ReadLockFenceHasPassed(resource)); |
557 LazyAllocate(resource); | 561 LazyAllocate(resource); |
558 | 562 |
559 resource->locked_for_write = true; | 563 resource->locked_for_write = true; |
560 return resource; | 564 return resource; |
561 } | 565 } |
562 | 566 |
563 bool ResourceProvider::CanLockForWrite(ResourceId id) { | 567 bool ResourceProvider::CanLockForWrite(ResourceId id) { |
564 DCHECK(thread_checker_.CalledOnValidThread()); | 568 DCHECK(thread_checker_.CalledOnValidThread()); |
565 ResourceMap::iterator it = resources_.find(id); | 569 ResourceMap::iterator it = resources_.find(id); |
566 CHECK(it != resources_.end()); | 570 CHECK(it != resources_.end()); |
567 Resource* resource = &it->second; | 571 Resource* resource = &it->second; |
568 return !resource->locked_for_write && | 572 return !resource->locked_for_write && |
569 !resource->lock_for_read_count && | 573 !resource->lock_for_read_count && |
570 !resource->exported && | 574 !resource->exported_count && |
571 !resource->external && | 575 !resource->external && |
572 ReadLockFenceHasPassed(resource); | 576 ReadLockFenceHasPassed(resource); |
573 } | 577 } |
574 | 578 |
575 void ResourceProvider::UnlockForWrite(ResourceId id) { | 579 void ResourceProvider::UnlockForWrite(ResourceId id) { |
576 DCHECK(thread_checker_.CalledOnValidThread()); | 580 DCHECK(thread_checker_.CalledOnValidThread()); |
577 ResourceMap::iterator it = resources_.find(id); | 581 ResourceMap::iterator it = resources_.find(id); |
578 CHECK(it != resources_.end()); | 582 CHECK(it != resources_.end()); |
579 Resource* resource = &it->second; | 583 Resource* resource = &it->second; |
580 DCHECK(resource->locked_for_write); | 584 DCHECK(resource->locked_for_write); |
581 DCHECK(!resource->exported); | 585 DCHECK_EQ(resource->exported_count, 0); |
582 DCHECK(!resource->external); | 586 DCHECK(!resource->external); |
583 resource->locked_for_write = false; | 587 resource->locked_for_write = false; |
584 } | 588 } |
585 | 589 |
586 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( | 590 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( |
587 ResourceProvider* resource_provider, | 591 ResourceProvider* resource_provider, |
588 ResourceProvider::ResourceId resource_id) | 592 ResourceProvider::ResourceId resource_id) |
589 : resource_provider_(resource_provider), | 593 : resource_provider_(resource_provider), |
590 resource_id_(resource_id), | 594 resource_id_(resource_id), |
591 texture_id_(resource_provider->LockForRead(resource_id)->gl_id) { | 595 texture_id_(resource_provider->LockForRead(resource_id)->gl_id) { |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
762 return child; | 766 return child; |
763 } | 767 } |
764 | 768 |
765 void ResourceProvider::DestroyChild(int child_id) { | 769 void ResourceProvider::DestroyChild(int child_id) { |
766 DCHECK(thread_checker_.CalledOnValidThread()); | 770 DCHECK(thread_checker_.CalledOnValidThread()); |
767 ChildMap::iterator it = children_.find(child_id); | 771 ChildMap::iterator it = children_.find(child_id); |
768 DCHECK(it != children_.end()); | 772 DCHECK(it != children_.end()); |
769 Child& child = it->second; | 773 Child& child = it->second; |
770 for (ResourceIdMap::iterator child_it = child.child_to_parent_map.begin(); | 774 for (ResourceIdMap::iterator child_it = child.child_to_parent_map.begin(); |
771 child_it != child.child_to_parent_map.end(); | 775 child_it != child.child_to_parent_map.end(); |
772 ++child_it) | 776 ++child_it) { |
773 DeleteResource(child_it->second); | 777 ResourceId id = child_it->second; |
| 778 // We're abandoning this resource, it will not get recycled. |
| 779 // crbug.com/224062 |
| 780 ResourceMap::iterator resource_it = resources_.find(id); |
| 781 CHECK(resource_it != resources_.end()); |
| 782 resource_it->second.imported_count = 0; |
| 783 DeleteResource(id); |
| 784 } |
774 children_.erase(it); | 785 children_.erase(it); |
775 } | 786 } |
776 | 787 |
777 const ResourceProvider::ResourceIdMap& ResourceProvider::GetChildToParentMap( | 788 const ResourceProvider::ResourceIdMap& ResourceProvider::GetChildToParentMap( |
778 int child) const { | 789 int child) const { |
779 DCHECK(thread_checker_.CalledOnValidThread()); | 790 DCHECK(thread_checker_.CalledOnValidThread()); |
780 ChildMap::const_iterator it = children_.find(child); | 791 ChildMap::const_iterator it = children_.find(child); |
781 DCHECK(it != children_.end()); | 792 DCHECK(it != children_.end()); |
782 return it->second.child_to_parent_map; | 793 return it->second.child_to_parent_map; |
783 } | 794 } |
784 | 795 |
785 void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resources, | 796 void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resources, |
786 TransferableResourceArray* list) { | 797 TransferableResourceArray* list) { |
787 DCHECK(thread_checker_.CalledOnValidThread()); | 798 DCHECK(thread_checker_.CalledOnValidThread()); |
788 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 799 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
789 if (!context3d || !context3d->makeContextCurrent()) { | 800 if (!context3d || !context3d->makeContextCurrent()) { |
790 // TODO(skaslev): Implement this path for software compositing. | 801 // TODO(skaslev): Implement this path for software compositing. |
791 return; | 802 return; |
792 } | 803 } |
793 bool need_sync_point = false; | 804 bool need_sync_point = false; |
794 for (ResourceIdArray::const_iterator it = resources.begin(); | 805 for (ResourceIdArray::const_iterator it = resources.begin(); |
795 it != resources.end(); | 806 it != resources.end(); |
796 ++it) { | 807 ++it) { |
797 TransferableResource resource; | 808 TransferableResource resource; |
798 if (TransferResource(context3d, *it, &resource)) { | 809 TransferResource(context3d, *it, &resource); |
799 if (!resource.sync_point) | 810 if (!resource.sync_point) |
800 need_sync_point = true; | 811 need_sync_point = true; |
801 resources_.find(*it)->second.exported = true; | 812 ++resources_.find(*it)->second.exported_count; |
802 list->push_back(resource); | 813 list->push_back(resource); |
803 } | |
804 } | 814 } |
805 if (need_sync_point) { | 815 if (need_sync_point) { |
806 unsigned int sync_point = context3d->insertSyncPoint(); | 816 unsigned int sync_point = context3d->insertSyncPoint(); |
807 for (TransferableResourceArray::iterator it = list->begin(); | 817 for (TransferableResourceArray::iterator it = list->begin(); |
808 it != list->end(); | 818 it != list->end(); |
809 ++it) { | 819 ++it) { |
810 if (!it->sync_point) | 820 if (!it->sync_point) |
811 it->sync_point = sync_point; | 821 it->sync_point = sync_point; |
812 } | 822 } |
813 } | 823 } |
814 } | 824 } |
815 | 825 |
816 void ResourceProvider::PrepareSendToChild(int child, | 826 void ResourceProvider::PrepareSendToChild(int child, |
817 const ResourceIdArray& resources, | 827 const ResourceIdArray& resources, |
818 TransferableResourceArray* list) { | 828 TransferableResourceArray* list) { |
819 DCHECK(thread_checker_.CalledOnValidThread()); | 829 DCHECK(thread_checker_.CalledOnValidThread()); |
820 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 830 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
821 if (!context3d || !context3d->makeContextCurrent()) { | 831 if (!context3d || !context3d->makeContextCurrent()) { |
822 // TODO(skaslev): Implement this path for software compositing. | 832 // TODO(skaslev): Implement this path for software compositing. |
823 return; | 833 return; |
824 } | 834 } |
825 Child& child_info = children_.find(child)->second; | 835 Child& child_info = children_.find(child)->second; |
826 bool need_sync_point = false; | 836 bool need_sync_point = false; |
827 for (ResourceIdArray::const_iterator it = resources.begin(); | 837 for (ResourceIdArray::const_iterator it = resources.begin(); |
828 it != resources.end(); | 838 it != resources.end(); |
829 ++it) { | 839 ++it) { |
830 TransferableResource resource; | 840 TransferableResource resource; |
831 if (!TransferResource(context3d, *it, &resource)) | 841 TransferResource(context3d, *it, &resource); |
832 NOTREACHED(); | |
833 if (!resource.sync_point) | 842 if (!resource.sync_point) |
834 need_sync_point = true; | 843 need_sync_point = true; |
835 DCHECK(child_info.parent_to_child_map.find(*it) != | 844 DCHECK(child_info.parent_to_child_map.find(*it) != |
836 child_info.parent_to_child_map.end()); | 845 child_info.parent_to_child_map.end()); |
837 resource.id = child_info.parent_to_child_map[*it]; | 846 resource.id = child_info.parent_to_child_map[*it]; |
838 child_info.parent_to_child_map.erase(*it); | 847 child_info.parent_to_child_map.erase(*it); |
839 child_info.child_to_parent_map.erase(resource.id); | 848 child_info.child_to_parent_map.erase(resource.id); |
840 list->push_back(resource); | 849 for (int i = 0; i < resources_[*it].imported_count; ++i) |
| 850 list->push_back(resource); |
| 851 resources_[*it].imported_count = 0; |
841 DeleteResource(*it); | 852 DeleteResource(*it); |
842 } | 853 } |
843 if (need_sync_point) { | 854 if (need_sync_point) { |
844 unsigned int sync_point = context3d->insertSyncPoint(); | 855 unsigned int sync_point = context3d->insertSyncPoint(); |
845 for (TransferableResourceArray::iterator it = list->begin(); | 856 for (TransferableResourceArray::iterator it = list->begin(); |
846 it != list->end(); | 857 it != list->end(); |
847 ++it) { | 858 ++it) { |
848 if (!it->sync_point) | 859 if (!it->sync_point) |
849 it->sync_point = sync_point; | 860 it->sync_point = sync_point; |
850 } | 861 } |
851 } | 862 } |
852 } | 863 } |
853 | 864 |
854 void ResourceProvider::ReceiveFromChild( | 865 void ResourceProvider::ReceiveFromChild( |
855 int child, const TransferableResourceArray& resources) { | 866 int child, const TransferableResourceArray& resources) { |
856 DCHECK(thread_checker_.CalledOnValidThread()); | 867 DCHECK(thread_checker_.CalledOnValidThread()); |
857 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 868 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
858 if (!context3d || !context3d->makeContextCurrent()) { | 869 if (!context3d || !context3d->makeContextCurrent()) { |
859 // TODO(skaslev): Implement this path for software compositing. | 870 // TODO(skaslev): Implement this path for software compositing. |
860 return; | 871 return; |
861 } | 872 } |
862 Child& child_info = children_.find(child)->second; | 873 Child& child_info = children_.find(child)->second; |
863 for (TransferableResourceArray::const_iterator it = resources.begin(); | 874 for (TransferableResourceArray::const_iterator it = resources.begin(); |
864 it != resources.end(); | 875 it != resources.end(); |
865 ++it) { | 876 ++it) { |
| 877 ResourceIdMap::iterator resource_in_map_it = |
| 878 child_info.child_to_parent_map.find(it->id); |
| 879 if (resource_in_map_it != child_info.child_to_parent_map.end()) { |
| 880 resources_[resource_in_map_it->second].imported_count++; |
| 881 continue; |
| 882 } |
866 unsigned texture_id; | 883 unsigned texture_id; |
867 // NOTE: If the parent is a browser and the child a renderer, the parent | 884 // NOTE: If the parent is a browser and the child a renderer, the parent |
868 // is not supposed to have its context wait, because that could induce | 885 // is not supposed to have its context wait, because that could induce |
869 // deadlocks and/or security issues. The caller is responsible for | 886 // deadlocks and/or security issues. The caller is responsible for |
870 // waiting asynchronously, and resetting sync_point before calling this. | 887 // waiting asynchronously, and resetting sync_point before calling this. |
871 // However if the parent is a renderer (e.g. browser tag), it may be ok | 888 // However if the parent is a renderer (e.g. browser tag), it may be ok |
872 // (and is simpler) to wait. | 889 // (and is simpler) to wait. |
873 if (it->sync_point) | 890 if (it->sync_point) |
874 GLC(context3d, context3d->waitSyncPoint(it->sync_point)); | 891 GLC(context3d, context3d->waitSyncPoint(it->sync_point)); |
875 GLC(context3d, texture_id = context3d->createTexture()); | 892 GLC(context3d, texture_id = context3d->createTexture()); |
876 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, texture_id)); | 893 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, texture_id)); |
877 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, | 894 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, |
878 it->mailbox.name)); | 895 it->mailbox.name)); |
879 ResourceId id = next_id_++; | 896 ResourceId id = next_id_++; |
880 Resource resource( | 897 Resource resource( |
881 texture_id, it->size, it->format, it->filter, 0, TextureUsageAny); | 898 texture_id, it->size, it->format, it->filter, 0, TextureUsageAny); |
882 resource.mailbox.SetName(it->mailbox); | 899 resource.mailbox.SetName(it->mailbox); |
883 // Don't allocate a texture for a child. | 900 // Don't allocate a texture for a child. |
884 resource.allocated = true; | 901 resource.allocated = true; |
| 902 resource.imported_count = 1; |
885 resources_[id] = resource; | 903 resources_[id] = resource; |
886 child_info.parent_to_child_map[id] = it->id; | 904 child_info.parent_to_child_map[id] = it->id; |
887 child_info.child_to_parent_map[it->id] = id; | 905 child_info.child_to_parent_map[it->id] = id; |
888 } | 906 } |
889 } | 907 } |
890 | 908 |
891 void ResourceProvider::ReceiveFromParent( | 909 void ResourceProvider::ReceiveFromParent( |
892 const TransferableResourceArray& resources) { | 910 const TransferableResourceArray& resources) { |
893 DCHECK(thread_checker_.CalledOnValidThread()); | 911 DCHECK(thread_checker_.CalledOnValidThread()); |
894 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 912 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
895 if (!context3d || !context3d->makeContextCurrent()) { | 913 if (!context3d || !context3d->makeContextCurrent()) { |
896 // TODO(skaslev): Implement this path for software compositing. | 914 // TODO(skaslev): Implement this path for software compositing. |
897 return; | 915 return; |
898 } | 916 } |
899 for (TransferableResourceArray::const_iterator it = resources.begin(); | 917 for (TransferableResourceArray::const_iterator it = resources.begin(); |
900 it != resources.end(); | 918 it != resources.end(); |
901 ++it) { | 919 ++it) { |
902 ResourceMap::iterator map_iterator = resources_.find(it->id); | 920 ResourceMap::iterator map_iterator = resources_.find(it->id); |
903 DCHECK(map_iterator != resources_.end()); | 921 DCHECK(map_iterator != resources_.end()); |
904 Resource* resource = &map_iterator->second; | 922 Resource* resource = &map_iterator->second; |
905 DCHECK(resource->exported); | 923 DCHECK_GT(resource->exported_count, 0); |
906 resource->exported = false; | 924 --resource->exported_count; |
| 925 if (resource->exported_count) |
| 926 continue; |
907 resource->filter = it->filter; | 927 resource->filter = it->filter; |
908 DCHECK(resource->mailbox.ContainsMailbox(it->mailbox)); | 928 DCHECK(resource->mailbox.ContainsMailbox(it->mailbox)); |
909 if (resource->gl_id) { | 929 if (resource->gl_id) { |
910 if (it->sync_point) | 930 if (it->sync_point) |
911 GLC(context3d, context3d->waitSyncPoint(it->sync_point)); | 931 GLC(context3d, context3d->waitSyncPoint(it->sync_point)); |
912 } else { | 932 } else { |
913 resource->mailbox = TextureMailbox(resource->mailbox.name(), | 933 resource->mailbox = TextureMailbox(resource->mailbox.name(), |
914 resource->mailbox.callback(), | 934 resource->mailbox.callback(), |
915 it->sync_point); | 935 it->sync_point); |
916 } | 936 } |
917 if (resource->marked_for_deletion) | 937 if (resource->marked_for_deletion) |
918 DeleteResourceInternal(map_iterator, Normal); | 938 DeleteResourceInternal(map_iterator, Normal); |
919 } | 939 } |
920 } | 940 } |
921 | 941 |
922 bool ResourceProvider::TransferResource(WebGraphicsContext3D* context, | 942 void ResourceProvider::TransferResource(WebGraphicsContext3D* context, |
923 ResourceId id, | 943 ResourceId id, |
924 TransferableResource* resource) { | 944 TransferableResource* resource) { |
925 DCHECK(thread_checker_.CalledOnValidThread()); | 945 DCHECK(thread_checker_.CalledOnValidThread()); |
926 ResourceMap::iterator it = resources_.find(id); | 946 ResourceMap::iterator it = resources_.find(id); |
927 CHECK(it != resources_.end()); | 947 CHECK(it != resources_.end()); |
928 Resource* source = &it->second; | 948 Resource* source = &it->second; |
929 DCHECK(!source->locked_for_write); | 949 DCHECK(!source->locked_for_write); |
930 DCHECK(!source->lock_for_read_count); | 950 DCHECK(!source->lock_for_read_count); |
931 DCHECK(!source->external || (source->external && source->mailbox.IsValid())); | 951 DCHECK(!source->external || (source->external && source->mailbox.IsValid())); |
932 DCHECK(source->allocated); | 952 DCHECK(source->allocated); |
933 if (source->exported) | |
934 return false; | |
935 resource->id = id; | 953 resource->id = id; |
936 resource->format = source->format; | 954 resource->format = source->format; |
937 resource->filter = source->filter; | 955 resource->filter = source->filter; |
938 resource->size = source->size; | 956 resource->size = source->size; |
939 | 957 |
940 // TODO(skaslev) Implement this path for shared memory resources. | 958 // TODO(skaslev) Implement this path for shared memory resources. |
941 DCHECK(!source->mailbox.IsSharedMemory()); | 959 DCHECK(!source->mailbox.IsSharedMemory()); |
942 | 960 |
943 if (!source->mailbox.IsTexture()) { | 961 if (!source->mailbox.IsTexture()) { |
944 // This is a resource allocated by the compositor, we need to produce it. | 962 // This is a resource allocated by the compositor, we need to produce it. |
945 // Don't set a sync point, the caller will do it. | 963 // Don't set a sync point, the caller will do it. |
946 DCHECK(source->gl_id); | 964 DCHECK(source->gl_id); |
947 GLC(context, context->bindTexture(GL_TEXTURE_2D, source->gl_id)); | 965 GLC(context, context->bindTexture(GL_TEXTURE_2D, source->gl_id)); |
948 GLC(context, context->genMailboxCHROMIUM(resource->mailbox.name)); | 966 GLC(context, context->genMailboxCHROMIUM(resource->mailbox.name)); |
949 GLC(context, context->produceTextureCHROMIUM(GL_TEXTURE_2D, | 967 GLC(context, context->produceTextureCHROMIUM(GL_TEXTURE_2D, |
950 resource->mailbox.name)); | 968 resource->mailbox.name)); |
951 source->mailbox.SetName(resource->mailbox); | 969 source->mailbox.SetName(resource->mailbox); |
952 } else { | 970 } else { |
953 // This is either an external resource, or a compositor resource that we | 971 // This is either an external resource, or a compositor resource that we |
954 // already exported. Make sure to forward the sync point that we were given. | 972 // already exported. Make sure to forward the sync point that we were given. |
955 resource->mailbox = source->mailbox.name(); | 973 resource->mailbox = source->mailbox.name(); |
956 resource->sync_point = source->mailbox.sync_point(); | 974 resource->sync_point = source->mailbox.sync_point(); |
957 source->mailbox.ResetSyncPoint(); | 975 source->mailbox.ResetSyncPoint(); |
958 } | 976 } |
959 | |
960 return true; | |
961 } | 977 } |
962 | 978 |
963 void ResourceProvider::AcquirePixelBuffer(ResourceId id) { | 979 void ResourceProvider::AcquirePixelBuffer(ResourceId id) { |
964 DCHECK(thread_checker_.CalledOnValidThread()); | 980 DCHECK(thread_checker_.CalledOnValidThread()); |
965 ResourceMap::iterator it = resources_.find(id); | 981 ResourceMap::iterator it = resources_.find(id); |
966 CHECK(it != resources_.end()); | 982 CHECK(it != resources_.end()); |
967 Resource* resource = &it->second; | 983 Resource* resource = &it->second; |
968 DCHECK(!resource->external); | 984 DCHECK(!resource->external); |
969 DCHECK(!resource->exported); | 985 DCHECK_EQ(resource->exported_count, 0); |
970 DCHECK(!resource->image_id); | 986 DCHECK(!resource->image_id); |
971 | 987 |
972 if (resource->type == GLTexture) { | 988 if (resource->type == GLTexture) { |
973 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 989 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
974 DCHECK(context3d); | 990 DCHECK(context3d); |
975 if (!resource->gl_pixel_buffer_id) | 991 if (!resource->gl_pixel_buffer_id) |
976 resource->gl_pixel_buffer_id = context3d->createBuffer(); | 992 resource->gl_pixel_buffer_id = context3d->createBuffer(); |
977 context3d->bindBuffer( | 993 context3d->bindBuffer( |
978 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 994 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
979 resource->gl_pixel_buffer_id); | 995 resource->gl_pixel_buffer_id); |
(...skipping 12 matching lines...) Expand all Loading... |
992 resource->pixel_buffer = new uint8_t[4 * resource->size.GetArea()]; | 1008 resource->pixel_buffer = new uint8_t[4 * resource->size.GetArea()]; |
993 } | 1009 } |
994 } | 1010 } |
995 | 1011 |
996 void ResourceProvider::ReleasePixelBuffer(ResourceId id) { | 1012 void ResourceProvider::ReleasePixelBuffer(ResourceId id) { |
997 DCHECK(thread_checker_.CalledOnValidThread()); | 1013 DCHECK(thread_checker_.CalledOnValidThread()); |
998 ResourceMap::iterator it = resources_.find(id); | 1014 ResourceMap::iterator it = resources_.find(id); |
999 CHECK(it != resources_.end()); | 1015 CHECK(it != resources_.end()); |
1000 Resource* resource = &it->second; | 1016 Resource* resource = &it->second; |
1001 DCHECK(!resource->external); | 1017 DCHECK(!resource->external); |
1002 DCHECK(!resource->exported); | 1018 DCHECK_EQ(resource->exported_count, 0); |
1003 DCHECK(!resource->image_id); | 1019 DCHECK(!resource->image_id); |
1004 | 1020 |
1005 // The pixel buffer can be released while there is a pending "set pixels" | 1021 // The pixel buffer can be released while there is a pending "set pixels" |
1006 // if completion has been forced. Any shared memory associated with this | 1022 // if completion has been forced. Any shared memory associated with this |
1007 // pixel buffer will not be freed until the waitAsyncTexImage2DCHROMIUM | 1023 // pixel buffer will not be freed until the waitAsyncTexImage2DCHROMIUM |
1008 // command has been processed on the service side. It is also safe to | 1024 // command has been processed on the service side. It is also safe to |
1009 // reuse any query id associated with this resource before they complete | 1025 // reuse any query id associated with this resource before they complete |
1010 // as each new query has a unique submit count. | 1026 // as each new query has a unique submit count. |
1011 if (resource->pending_set_pixels) { | 1027 if (resource->pending_set_pixels) { |
1012 DCHECK(resource->set_pixels_completion_forced); | 1028 DCHECK(resource->set_pixels_completion_forced); |
(...skipping 24 matching lines...) Expand all Loading... |
1037 resource->pixel_buffer = NULL; | 1053 resource->pixel_buffer = NULL; |
1038 } | 1054 } |
1039 } | 1055 } |
1040 | 1056 |
1041 uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id) { | 1057 uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id) { |
1042 DCHECK(thread_checker_.CalledOnValidThread()); | 1058 DCHECK(thread_checker_.CalledOnValidThread()); |
1043 ResourceMap::iterator it = resources_.find(id); | 1059 ResourceMap::iterator it = resources_.find(id); |
1044 CHECK(it != resources_.end()); | 1060 CHECK(it != resources_.end()); |
1045 Resource* resource = &it->second; | 1061 Resource* resource = &it->second; |
1046 DCHECK(!resource->external); | 1062 DCHECK(!resource->external); |
1047 DCHECK(!resource->exported); | 1063 DCHECK_EQ(resource->exported_count, 0); |
1048 DCHECK(!resource->image_id); | 1064 DCHECK(!resource->image_id); |
1049 | 1065 |
1050 if (resource->type == GLTexture) { | 1066 if (resource->type == GLTexture) { |
1051 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1067 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1052 DCHECK(context3d); | 1068 DCHECK(context3d); |
1053 DCHECK(resource->gl_pixel_buffer_id); | 1069 DCHECK(resource->gl_pixel_buffer_id); |
1054 context3d->bindBuffer( | 1070 context3d->bindBuffer( |
1055 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1071 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
1056 resource->gl_pixel_buffer_id); | 1072 resource->gl_pixel_buffer_id); |
1057 uint8_t* image = static_cast<uint8_t*>( | 1073 uint8_t* image = static_cast<uint8_t*>( |
(...skipping 10 matching lines...) Expand all Loading... |
1068 | 1084 |
1069 return NULL; | 1085 return NULL; |
1070 } | 1086 } |
1071 | 1087 |
1072 void ResourceProvider::UnmapPixelBuffer(ResourceId id) { | 1088 void ResourceProvider::UnmapPixelBuffer(ResourceId id) { |
1073 DCHECK(thread_checker_.CalledOnValidThread()); | 1089 DCHECK(thread_checker_.CalledOnValidThread()); |
1074 ResourceMap::iterator it = resources_.find(id); | 1090 ResourceMap::iterator it = resources_.find(id); |
1075 CHECK(it != resources_.end()); | 1091 CHECK(it != resources_.end()); |
1076 Resource* resource = &it->second; | 1092 Resource* resource = &it->second; |
1077 DCHECK(!resource->external); | 1093 DCHECK(!resource->external); |
1078 DCHECK(!resource->exported); | 1094 DCHECK_EQ(resource->exported_count, 0); |
1079 DCHECK(!resource->image_id); | 1095 DCHECK(!resource->image_id); |
1080 | 1096 |
1081 if (resource->type == GLTexture) { | 1097 if (resource->type == GLTexture) { |
1082 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1098 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1083 DCHECK(context3d); | 1099 DCHECK(context3d); |
1084 DCHECK(resource->gl_pixel_buffer_id); | 1100 DCHECK(resource->gl_pixel_buffer_id); |
1085 context3d->bindBuffer( | 1101 context3d->bindBuffer( |
1086 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1102 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
1087 resource->gl_pixel_buffer_id); | 1103 resource->gl_pixel_buffer_id); |
1088 context3d->unmapBufferCHROMIUM(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); | 1104 context3d->unmapBufferCHROMIUM(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1335 resource->enable_read_lock_fences = enable; | 1351 resource->enable_read_lock_fences = enable; |
1336 } | 1352 } |
1337 | 1353 |
1338 void ResourceProvider::AcquireImage(ResourceId id) { | 1354 void ResourceProvider::AcquireImage(ResourceId id) { |
1339 DCHECK(thread_checker_.CalledOnValidThread()); | 1355 DCHECK(thread_checker_.CalledOnValidThread()); |
1340 ResourceMap::iterator it = resources_.find(id); | 1356 ResourceMap::iterator it = resources_.find(id); |
1341 CHECK(it != resources_.end()); | 1357 CHECK(it != resources_.end()); |
1342 Resource* resource = &it->second; | 1358 Resource* resource = &it->second; |
1343 | 1359 |
1344 DCHECK(!resource->external); | 1360 DCHECK(!resource->external); |
1345 DCHECK(!resource->exported); | 1361 DCHECK_EQ(resource->exported_count, 0); |
1346 | 1362 |
1347 if (resource->type != GLTexture) | 1363 if (resource->type != GLTexture) |
1348 return; | 1364 return; |
1349 | 1365 |
1350 if (resource->image_id) | 1366 if (resource->image_id) |
1351 return; | 1367 return; |
1352 | 1368 |
1353 resource->allocated = true; | 1369 resource->allocated = true; |
1354 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1370 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1355 DCHECK(context3d); | 1371 DCHECK(context3d); |
1356 resource->image_id = context3d->createImageCHROMIUM( | 1372 resource->image_id = context3d->createImageCHROMIUM( |
1357 resource->size.width(), resource->size.height(), GL_RGBA8_OES); | 1373 resource->size.width(), resource->size.height(), GL_RGBA8_OES); |
1358 DCHECK(resource->image_id); | 1374 DCHECK(resource->image_id); |
1359 } | 1375 } |
1360 | 1376 |
1361 void ResourceProvider::ReleaseImage(ResourceId id) { | 1377 void ResourceProvider::ReleaseImage(ResourceId id) { |
1362 DCHECK(thread_checker_.CalledOnValidThread()); | 1378 DCHECK(thread_checker_.CalledOnValidThread()); |
1363 ResourceMap::iterator it = resources_.find(id); | 1379 ResourceMap::iterator it = resources_.find(id); |
1364 CHECK(it != resources_.end()); | 1380 CHECK(it != resources_.end()); |
1365 Resource* resource = &it->second; | 1381 Resource* resource = &it->second; |
1366 | 1382 |
1367 DCHECK(!resource->external); | 1383 DCHECK(!resource->external); |
1368 DCHECK(!resource->exported); | 1384 DCHECK_EQ(resource->exported_count, 0); |
1369 | 1385 |
1370 if (!resource->image_id) | 1386 if (!resource->image_id) |
1371 return; | 1387 return; |
1372 | 1388 |
1373 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1389 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1374 DCHECK(context3d); | 1390 DCHECK(context3d); |
1375 context3d->destroyImageCHROMIUM(resource->image_id); | 1391 context3d->destroyImageCHROMIUM(resource->image_id); |
1376 resource->image_id = 0; | 1392 resource->image_id = 0; |
1377 resource->allocated = false; | 1393 resource->allocated = false; |
1378 } | 1394 } |
1379 | 1395 |
1380 uint8_t* ResourceProvider::MapImage(ResourceId id) { | 1396 uint8_t* ResourceProvider::MapImage(ResourceId id) { |
1381 DCHECK(thread_checker_.CalledOnValidThread()); | 1397 DCHECK(thread_checker_.CalledOnValidThread()); |
1382 ResourceMap::iterator it = resources_.find(id); | 1398 ResourceMap::iterator it = resources_.find(id); |
1383 CHECK(it != resources_.end()); | 1399 CHECK(it != resources_.end()); |
1384 Resource* resource = &it->second; | 1400 Resource* resource = &it->second; |
1385 | 1401 |
1386 DCHECK(ReadLockFenceHasPassed(resource)); | 1402 DCHECK(ReadLockFenceHasPassed(resource)); |
1387 DCHECK(!resource->external); | 1403 DCHECK(!resource->external); |
1388 DCHECK(!resource->exported); | 1404 DCHECK_EQ(resource->exported_count, 0); |
1389 | 1405 |
1390 if (resource->image_id) { | 1406 if (resource->image_id) { |
1391 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1407 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1392 DCHECK(context3d); | 1408 DCHECK(context3d); |
1393 return static_cast<uint8_t*>( | 1409 return static_cast<uint8_t*>( |
1394 context3d->mapImageCHROMIUM(resource->image_id, GL_READ_WRITE)); | 1410 context3d->mapImageCHROMIUM(resource->image_id, GL_READ_WRITE)); |
1395 } | 1411 } |
1396 | 1412 |
1397 if (resource->pixels) | 1413 if (resource->pixels) |
1398 return resource->pixels; | 1414 return resource->pixels; |
1399 | 1415 |
1400 return NULL; | 1416 return NULL; |
1401 } | 1417 } |
1402 | 1418 |
1403 void ResourceProvider::UnmapImage(ResourceId id) { | 1419 void ResourceProvider::UnmapImage(ResourceId id) { |
1404 DCHECK(thread_checker_.CalledOnValidThread()); | 1420 DCHECK(thread_checker_.CalledOnValidThread()); |
1405 ResourceMap::iterator it = resources_.find(id); | 1421 ResourceMap::iterator it = resources_.find(id); |
1406 CHECK(it != resources_.end()); | 1422 CHECK(it != resources_.end()); |
1407 Resource* resource = &it->second; | 1423 Resource* resource = &it->second; |
1408 | 1424 |
1409 DCHECK(!resource->external); | 1425 DCHECK(!resource->external); |
1410 DCHECK(!resource->exported); | 1426 DCHECK_EQ(resource->exported_count, 0); |
1411 | 1427 |
1412 if (resource->image_id) { | 1428 if (resource->image_id) { |
1413 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1429 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1414 DCHECK(context3d); | 1430 DCHECK(context3d); |
1415 context3d->unmapImageCHROMIUM(resource->image_id); | 1431 context3d->unmapImageCHROMIUM(resource->image_id); |
1416 } | 1432 } |
1417 } | 1433 } |
1418 | 1434 |
1419 int ResourceProvider::GetImageStride(ResourceId id) { | 1435 int ResourceProvider::GetImageStride(ResourceId id) { |
1420 DCHECK(thread_checker_.CalledOnValidThread()); | 1436 DCHECK(thread_checker_.CalledOnValidThread()); |
1421 ResourceMap::iterator it = resources_.find(id); | 1437 ResourceMap::iterator it = resources_.find(id); |
1422 CHECK(it != resources_.end()); | 1438 CHECK(it != resources_.end()); |
1423 Resource* resource = &it->second; | 1439 Resource* resource = &it->second; |
1424 | 1440 |
1425 DCHECK(!resource->external); | 1441 DCHECK(!resource->external); |
1426 DCHECK(!resource->exported); | 1442 DCHECK_EQ(resource->exported_count, 0); |
1427 | 1443 |
1428 int stride = 0; | 1444 int stride = 0; |
1429 | 1445 |
1430 if (resource->image_id) { | 1446 if (resource->image_id) { |
1431 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1447 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1432 DCHECK(context3d); | 1448 DCHECK(context3d); |
1433 context3d->getImageParameterivCHROMIUM( | 1449 context3d->getImageParameterivCHROMIUM( |
1434 resource->image_id, GL_IMAGE_ROWBYTES_CHROMIUM, &stride); | 1450 resource->image_id, GL_IMAGE_ROWBYTES_CHROMIUM, &stride); |
1435 } | 1451 } |
1436 | 1452 |
1437 return stride; | 1453 return stride; |
1438 } | 1454 } |
1439 | 1455 |
1440 GLint ResourceProvider::GetActiveTextureUnit(WebGraphicsContext3D* context) { | 1456 GLint ResourceProvider::GetActiveTextureUnit(WebGraphicsContext3D* context) { |
1441 GLint active_unit = 0; | 1457 GLint active_unit = 0; |
1442 context->getIntegerv(GL_ACTIVE_TEXTURE, &active_unit); | 1458 context->getIntegerv(GL_ACTIVE_TEXTURE, &active_unit); |
1443 return active_unit; | 1459 return active_unit; |
1444 } | 1460 } |
1445 | 1461 |
1446 } // namespace cc | 1462 } // namespace cc |
OLD | NEW |