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 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
181 | 181 |
182 CleanUpGLIfNeeded(); | 182 CleanUpGLIfNeeded(); |
183 } | 183 } |
184 | 184 |
185 WebGraphicsContext3D* ResourceProvider::GraphicsContext3D() { | 185 WebGraphicsContext3D* ResourceProvider::GraphicsContext3D() { |
186 DCHECK(thread_checker_.CalledOnValidThread()); | 186 DCHECK(thread_checker_.CalledOnValidThread()); |
187 return output_surface_->context3d(); | 187 return output_surface_->context3d(); |
188 } | 188 } |
189 | 189 |
190 bool ResourceProvider::InUseByConsumer(ResourceId id) { | 190 bool ResourceProvider::InUseByConsumer(ResourceId id) { |
191 DCHECK(thread_checker_.CalledOnValidThread()); | 191 Resource* resource = GetResource(id); |
192 ResourceMap::iterator it = resources_.find(id); | |
193 CHECK(it != resources_.end()); | |
194 Resource* resource = &it->second; | |
195 return resource->lock_for_read_count > 0 || resource->exported_count > 0; | 192 return resource->lock_for_read_count > 0 || resource->exported_count > 0; |
196 } | 193 } |
197 | 194 |
198 ResourceProvider::ResourceId ResourceProvider::CreateResource( | 195 ResourceProvider::ResourceId ResourceProvider::CreateResource( |
199 gfx::Size size, GLenum format, TextureUsageHint hint) { | 196 gfx::Size size, GLenum format, TextureUsageHint hint) { |
200 DCHECK(!size.IsEmpty()); | 197 DCHECK(!size.IsEmpty()); |
201 switch (default_resource_type_) { | 198 switch (default_resource_type_) { |
202 case GLTexture: | 199 case GLTexture: |
203 return CreateGLTexture( | 200 return CreateGLTexture( |
204 size, format, GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, hint); | 201 size, format, GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, hint); |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
375 if (resource->pixels) | 372 if (resource->pixels) |
376 delete[] resource->pixels; | 373 delete[] resource->pixels; |
377 if (resource->pixel_buffer) | 374 if (resource->pixel_buffer) |
378 delete[] resource->pixel_buffer; | 375 delete[] resource->pixel_buffer; |
379 | 376 |
380 resources_.erase(it); | 377 resources_.erase(it); |
381 } | 378 } |
382 | 379 |
383 ResourceProvider::ResourceType ResourceProvider::GetResourceType( | 380 ResourceProvider::ResourceType ResourceProvider::GetResourceType( |
384 ResourceId id) { | 381 ResourceId id) { |
385 ResourceMap::iterator it = resources_.find(id); | 382 return GetResource(id)->type; |
386 CHECK(it != resources_.end()); | |
387 Resource* resource = &it->second; | |
388 return resource->type; | |
389 } | 383 } |
390 | 384 |
391 void ResourceProvider::SetPixels(ResourceId id, | 385 void ResourceProvider::SetPixels(ResourceId id, |
392 const uint8_t* image, | 386 const uint8_t* image, |
393 gfx::Rect image_rect, | 387 gfx::Rect image_rect, |
394 gfx::Rect source_rect, | 388 gfx::Rect source_rect, |
395 gfx::Vector2d dest_offset) { | 389 gfx::Vector2d dest_offset) { |
396 DCHECK(thread_checker_.CalledOnValidThread()); | 390 Resource* resource = GetResource(id); |
397 ResourceMap::iterator it = resources_.find(id); | |
398 CHECK(it != resources_.end()); | |
399 Resource* resource = &it->second; | |
400 DCHECK(!resource->locked_for_write); | 391 DCHECK(!resource->locked_for_write); |
401 DCHECK(!resource->lock_for_read_count); | 392 DCHECK(!resource->lock_for_read_count); |
402 DCHECK(!resource->external); | 393 DCHECK(!resource->external); |
403 DCHECK_EQ(resource->exported_count, 0); | 394 DCHECK_EQ(resource->exported_count, 0); |
404 DCHECK(ReadLockFenceHasPassed(resource)); | 395 DCHECK(ReadLockFenceHasPassed(resource)); |
405 LazyAllocate(resource); | 396 LazyAllocate(resource); |
406 | 397 |
407 if (resource->gl_id) { | 398 if (resource->gl_id) { |
408 DCHECK(!resource->pending_set_pixels); | 399 DCHECK(!resource->pending_set_pixels); |
409 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 400 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
491 bool ResourceProvider::ShallowFlushIfSupported() { | 482 bool ResourceProvider::ShallowFlushIfSupported() { |
492 DCHECK(thread_checker_.CalledOnValidThread()); | 483 DCHECK(thread_checker_.CalledOnValidThread()); |
493 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 484 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
494 if (!context3d || !use_shallow_flush_) | 485 if (!context3d || !use_shallow_flush_) |
495 return false; | 486 return false; |
496 | 487 |
497 context3d->shallowFlushCHROMIUM(); | 488 context3d->shallowFlushCHROMIUM(); |
498 return true; | 489 return true; |
499 } | 490 } |
500 | 491 |
501 const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { | 492 ResourceProvider::Resource* ResourceProvider::GetResource(ResourceId id) { |
502 DCHECK(thread_checker_.CalledOnValidThread()); | 493 DCHECK(thread_checker_.CalledOnValidThread()); |
503 ResourceMap::iterator it = resources_.find(id); | 494 ResourceMap::iterator it = resources_.find(id); |
504 CHECK(it != resources_.end()); | 495 CHECK(it != resources_.end()); |
505 Resource* resource = &it->second; | 496 return &it->second; |
497 } | |
498 | |
499 const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { | |
500 Resource* resource = GetResource(id); | |
506 DCHECK(!resource->locked_for_write || | 501 DCHECK(!resource->locked_for_write || |
507 resource->set_pixels_completion_forced) << | 502 resource->set_pixels_completion_forced) << |
508 "locked for write: " << resource->locked_for_write << | 503 "locked for write: " << resource->locked_for_write << |
509 " pixels completion forced: " << resource->set_pixels_completion_forced; | 504 " pixels completion forced: " << resource->set_pixels_completion_forced; |
510 DCHECK_EQ(resource->exported_count, 0); | 505 DCHECK_EQ(resource->exported_count, 0); |
511 // Uninitialized! Call SetPixels or LockForWrite first. | 506 // Uninitialized! Call SetPixels or LockForWrite first. |
512 DCHECK(resource->allocated); | 507 DCHECK(resource->allocated); |
513 | 508 |
514 LazyCreate(resource); | 509 LazyCreate(resource); |
515 | 510 |
(...skipping 15 matching lines...) Expand all Loading... | |
531 } | 526 } |
532 | 527 |
533 resource->lock_for_read_count++; | 528 resource->lock_for_read_count++; |
534 if (resource->enable_read_lock_fences) | 529 if (resource->enable_read_lock_fences) |
535 resource->read_lock_fence = current_read_lock_fence_; | 530 resource->read_lock_fence = current_read_lock_fence_; |
536 | 531 |
537 return resource; | 532 return resource; |
538 } | 533 } |
539 | 534 |
540 void ResourceProvider::UnlockForRead(ResourceId id) { | 535 void ResourceProvider::UnlockForRead(ResourceId id) { |
541 DCHECK(thread_checker_.CalledOnValidThread()); | 536 Resource* resource = GetResource(id); |
542 ResourceMap::iterator it = resources_.find(id); | |
543 CHECK(it != resources_.end()); | |
544 Resource* resource = &it->second; | |
545 DCHECK_GT(resource->lock_for_read_count, 0); | 537 DCHECK_GT(resource->lock_for_read_count, 0); |
546 DCHECK_EQ(resource->exported_count, 0); | 538 DCHECK_EQ(resource->exported_count, 0); |
547 resource->lock_for_read_count--; | 539 resource->lock_for_read_count--; |
548 } | 540 } |
549 | 541 |
550 const ResourceProvider::Resource* ResourceProvider::LockForWrite( | 542 const ResourceProvider::Resource* ResourceProvider::LockForWrite( |
551 ResourceId id) { | 543 ResourceId id) { |
552 DCHECK(thread_checker_.CalledOnValidThread()); | 544 Resource* resource = GetResource(id); |
553 ResourceMap::iterator it = resources_.find(id); | |
554 CHECK(it != resources_.end()); | |
555 Resource* resource = &it->second; | |
556 DCHECK(!resource->locked_for_write); | 545 DCHECK(!resource->locked_for_write); |
557 DCHECK(!resource->lock_for_read_count); | 546 DCHECK(!resource->lock_for_read_count); |
558 DCHECK_EQ(resource->exported_count, 0); | 547 DCHECK_EQ(resource->exported_count, 0); |
559 DCHECK(!resource->external); | 548 DCHECK(!resource->external); |
560 DCHECK(ReadLockFenceHasPassed(resource)); | 549 DCHECK(ReadLockFenceHasPassed(resource)); |
561 LazyAllocate(resource); | 550 LazyAllocate(resource); |
562 | 551 |
563 resource->locked_for_write = true; | 552 resource->locked_for_write = true; |
564 return resource; | 553 return resource; |
565 } | 554 } |
566 | 555 |
567 bool ResourceProvider::CanLockForWrite(ResourceId id) { | 556 bool ResourceProvider::CanLockForWrite(ResourceId id) { |
568 DCHECK(thread_checker_.CalledOnValidThread()); | 557 Resource* resource = GetResource(id); |
569 ResourceMap::iterator it = resources_.find(id); | |
570 CHECK(it != resources_.end()); | |
571 Resource* resource = &it->second; | |
572 return !resource->locked_for_write && | 558 return !resource->locked_for_write && |
573 !resource->lock_for_read_count && | 559 !resource->lock_for_read_count && |
574 !resource->exported_count && | 560 !resource->exported_count && |
575 !resource->external && | 561 !resource->external && |
576 ReadLockFenceHasPassed(resource); | 562 ReadLockFenceHasPassed(resource); |
577 } | 563 } |
578 | 564 |
579 void ResourceProvider::UnlockForWrite(ResourceId id) { | 565 void ResourceProvider::UnlockForWrite(ResourceId id) { |
580 DCHECK(thread_checker_.CalledOnValidThread()); | 566 Resource* resource = GetResource(id); |
581 ResourceMap::iterator it = resources_.find(id); | |
582 CHECK(it != resources_.end()); | |
583 Resource* resource = &it->second; | |
584 DCHECK(resource->locked_for_write); | 567 DCHECK(resource->locked_for_write); |
585 DCHECK_EQ(resource->exported_count, 0); | 568 DCHECK_EQ(resource->exported_count, 0); |
586 DCHECK(!resource->external); | 569 DCHECK(!resource->external); |
587 resource->locked_for_write = false; | 570 resource->locked_for_write = false; |
588 } | 571 } |
589 | 572 |
590 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( | 573 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( |
591 ResourceProvider* resource_provider, | 574 ResourceProvider* resource_provider, |
592 ResourceProvider::ResourceId resource_id) | 575 ResourceProvider::ResourceId resource_id) |
593 : resource_provider_(resource_provider), | 576 : resource_provider_(resource_provider), |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
816 unsigned int sync_point = context3d->insertSyncPoint(); | 799 unsigned int sync_point = context3d->insertSyncPoint(); |
817 for (TransferableResourceArray::iterator it = list->begin(); | 800 for (TransferableResourceArray::iterator it = list->begin(); |
818 it != list->end(); | 801 it != list->end(); |
819 ++it) { | 802 ++it) { |
820 if (!it->sync_point) | 803 if (!it->sync_point) |
821 it->sync_point = sync_point; | 804 it->sync_point = sync_point; |
822 } | 805 } |
823 } | 806 } |
824 } | 807 } |
825 | 808 |
826 void ResourceProvider::PrepareSendToChild(int child, | 809 void ResourceProvider::PrepareSendToChild(int child, |
danakj
2013/08/16 23:33:35
Maybe we could rename this to PrepareSendReturnsTo
piman
2013/08/17 01:54:31
Done.
| |
827 const ResourceIdArray& resources, | 810 const ResourceIdArray& resources, |
828 TransferableResourceArray* list) { | 811 ReturnedResourceArray* list) { |
829 DCHECK(thread_checker_.CalledOnValidThread()); | 812 DCHECK(thread_checker_.CalledOnValidThread()); |
830 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 813 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
831 if (!context3d || !context3d->makeContextCurrent()) { | 814 if (!context3d || !context3d->makeContextCurrent()) { |
832 // TODO(skaslev): Implement this path for software compositing. | 815 // TODO(skaslev): Implement this path for software compositing. |
833 return; | 816 return; |
834 } | 817 } |
835 Child& child_info = children_.find(child)->second; | 818 Child& child_info = children_.find(child)->second; |
836 bool need_sync_point = false; | 819 bool need_sync_point = false; |
837 for (ResourceIdArray::const_iterator it = resources.begin(); | 820 for (ResourceIdArray::const_iterator it = resources.begin(); |
838 it != resources.end(); | 821 it != resources.end(); ++it) { |
839 ++it) { | 822 Resource* resource = GetResource(*it); |
840 TransferableResource resource; | 823 DCHECK(!resource->locked_for_write); |
841 TransferResource(context3d, *it, &resource); | 824 DCHECK(!resource->lock_for_read_count); |
842 if (!resource.sync_point) | |
843 need_sync_point = true; | |
844 DCHECK(child_info.parent_to_child_map.find(*it) != | 825 DCHECK(child_info.parent_to_child_map.find(*it) != |
845 child_info.parent_to_child_map.end()); | 826 child_info.parent_to_child_map.end()); |
846 resource.id = child_info.parent_to_child_map[*it]; | 827 |
828 ReturnedResource returned; | |
829 returned.id = child_info.parent_to_child_map[*it]; | |
830 returned.filter = resource->filter; | |
831 returned.sync_point = resource->mailbox.sync_point(); | |
832 if (!returned.sync_point) | |
833 need_sync_point = true; | |
834 returned.count = resource->imported_count; | |
835 list->push_back(returned); | |
836 | |
847 child_info.parent_to_child_map.erase(*it); | 837 child_info.parent_to_child_map.erase(*it); |
848 child_info.child_to_parent_map.erase(resource.id); | 838 child_info.child_to_parent_map.erase(returned.id); |
849 for (int i = 0; i < resources_[*it].imported_count; ++i) | |
850 list->push_back(resource); | |
851 resources_[*it].imported_count = 0; | 839 resources_[*it].imported_count = 0; |
852 DeleteResource(*it); | 840 DeleteResource(*it); |
853 } | 841 } |
854 if (need_sync_point) { | 842 if (need_sync_point) { |
855 unsigned int sync_point = context3d->insertSyncPoint(); | 843 unsigned int sync_point = context3d->insertSyncPoint(); |
856 for (TransferableResourceArray::iterator it = list->begin(); | 844 for (ReturnedResourceArray::iterator it = list->begin(); |
857 it != list->end(); | 845 it != list->end(); ++it) { |
858 ++it) { | |
859 if (!it->sync_point) | 846 if (!it->sync_point) |
860 it->sync_point = sync_point; | 847 it->sync_point = sync_point; |
861 } | 848 } |
862 } | 849 } |
863 } | 850 } |
864 | 851 |
865 void ResourceProvider::ReceiveFromChild( | 852 void ResourceProvider::ReceiveFromChild( |
866 int child, const TransferableResourceArray& resources) { | 853 int child, const TransferableResourceArray& resources) { |
867 DCHECK(thread_checker_.CalledOnValidThread()); | 854 DCHECK(thread_checker_.CalledOnValidThread()); |
868 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 855 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
900 // Don't allocate a texture for a child. | 887 // Don't allocate a texture for a child. |
901 resource.allocated = true; | 888 resource.allocated = true; |
902 resource.imported_count = 1; | 889 resource.imported_count = 1; |
903 resources_[id] = resource; | 890 resources_[id] = resource; |
904 child_info.parent_to_child_map[id] = it->id; | 891 child_info.parent_to_child_map[id] = it->id; |
905 child_info.child_to_parent_map[it->id] = id; | 892 child_info.child_to_parent_map[it->id] = id; |
906 } | 893 } |
907 } | 894 } |
908 | 895 |
909 void ResourceProvider::ReceiveFromParent( | 896 void ResourceProvider::ReceiveFromParent( |
910 const TransferableResourceArray& resources) { | 897 const ReturnedResourceArray& resources) { |
911 DCHECK(thread_checker_.CalledOnValidThread()); | 898 DCHECK(thread_checker_.CalledOnValidThread()); |
912 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 899 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
913 if (!context3d || !context3d->makeContextCurrent()) { | 900 if (!context3d || !context3d->makeContextCurrent()) { |
914 // TODO(skaslev): Implement this path for software compositing. | 901 // TODO(skaslev): Implement this path for software compositing. |
915 return; | 902 return; |
916 } | 903 } |
917 for (TransferableResourceArray::const_iterator it = resources.begin(); | 904 for (ReturnedResourceArray::const_iterator it = resources.begin(); |
918 it != resources.end(); | 905 it != resources.end(); |
919 ++it) { | 906 ++it) { |
920 ResourceMap::iterator map_iterator = resources_.find(it->id); | 907 ResourceMap::iterator map_iterator = resources_.find(it->id); |
921 DCHECK(map_iterator != resources_.end()); | 908 DCHECK(map_iterator != resources_.end()); |
922 Resource* resource = &map_iterator->second; | 909 Resource* resource = &map_iterator->second; |
923 DCHECK_GT(resource->exported_count, 0); | 910 CHECK_GE(resource->exported_count, it->count); |
924 --resource->exported_count; | 911 resource->exported_count -= it->count; |
925 if (resource->exported_count) | 912 if (resource->exported_count) |
926 continue; | 913 continue; |
927 resource->filter = it->filter; | 914 resource->filter = it->filter; |
928 DCHECK(resource->mailbox.ContainsMailbox(it->mailbox)); | |
929 if (resource->gl_id) { | 915 if (resource->gl_id) { |
930 if (it->sync_point) | 916 if (it->sync_point) |
931 GLC(context3d, context3d->waitSyncPoint(it->sync_point)); | 917 GLC(context3d, context3d->waitSyncPoint(it->sync_point)); |
932 } else { | 918 } else { |
933 resource->mailbox = TextureMailbox(resource->mailbox.name(), | 919 resource->mailbox = TextureMailbox(resource->mailbox.name(), |
934 resource->mailbox.callback(), | 920 resource->mailbox.callback(), |
935 it->sync_point); | 921 it->sync_point); |
936 } | 922 } |
937 if (resource->marked_for_deletion) | 923 if (resource->marked_for_deletion) |
938 DeleteResourceInternal(map_iterator, Normal); | 924 DeleteResourceInternal(map_iterator, Normal); |
939 } | 925 } |
940 } | 926 } |
941 | 927 |
942 void ResourceProvider::TransferResource(WebGraphicsContext3D* context, | 928 void ResourceProvider::TransferResource(WebGraphicsContext3D* context, |
943 ResourceId id, | 929 ResourceId id, |
944 TransferableResource* resource) { | 930 TransferableResource* resource) { |
945 DCHECK(thread_checker_.CalledOnValidThread()); | 931 Resource* source = GetResource(id); |
946 ResourceMap::iterator it = resources_.find(id); | |
947 CHECK(it != resources_.end()); | |
948 Resource* source = &it->second; | |
949 DCHECK(!source->locked_for_write); | 932 DCHECK(!source->locked_for_write); |
950 DCHECK(!source->lock_for_read_count); | 933 DCHECK(!source->lock_for_read_count); |
951 DCHECK(!source->external || (source->external && source->mailbox.IsValid())); | 934 DCHECK(!source->external || (source->external && source->mailbox.IsValid())); |
952 DCHECK(source->allocated); | 935 DCHECK(source->allocated); |
953 resource->id = id; | 936 resource->id = id; |
954 resource->format = source->format; | 937 resource->format = source->format; |
955 resource->filter = source->filter; | 938 resource->filter = source->filter; |
956 resource->size = source->size; | 939 resource->size = source->size; |
957 | 940 |
958 // TODO(skaslev) Implement this path for shared memory resources. | 941 // TODO(skaslev) Implement this path for shared memory resources. |
(...skipping 11 matching lines...) Expand all Loading... | |
970 } else { | 953 } else { |
971 // This is either an external resource, or a compositor resource that we | 954 // This is either an external resource, or a compositor resource that we |
972 // already exported. Make sure to forward the sync point that we were given. | 955 // already exported. Make sure to forward the sync point that we were given. |
973 resource->mailbox = source->mailbox.name(); | 956 resource->mailbox = source->mailbox.name(); |
974 resource->sync_point = source->mailbox.sync_point(); | 957 resource->sync_point = source->mailbox.sync_point(); |
975 source->mailbox.ResetSyncPoint(); | 958 source->mailbox.ResetSyncPoint(); |
976 } | 959 } |
977 } | 960 } |
978 | 961 |
979 void ResourceProvider::AcquirePixelBuffer(ResourceId id) { | 962 void ResourceProvider::AcquirePixelBuffer(ResourceId id) { |
980 DCHECK(thread_checker_.CalledOnValidThread()); | 963 Resource* resource = GetResource(id); |
981 ResourceMap::iterator it = resources_.find(id); | |
982 CHECK(it != resources_.end()); | |
983 Resource* resource = &it->second; | |
984 DCHECK(!resource->external); | 964 DCHECK(!resource->external); |
985 DCHECK_EQ(resource->exported_count, 0); | 965 DCHECK_EQ(resource->exported_count, 0); |
986 DCHECK(!resource->image_id); | 966 DCHECK(!resource->image_id); |
987 | 967 |
988 if (resource->type == GLTexture) { | 968 if (resource->type == GLTexture) { |
989 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 969 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
990 DCHECK(context3d); | 970 DCHECK(context3d); |
991 if (!resource->gl_pixel_buffer_id) | 971 if (!resource->gl_pixel_buffer_id) |
992 resource->gl_pixel_buffer_id = context3d->createBuffer(); | 972 resource->gl_pixel_buffer_id = context3d->createBuffer(); |
993 context3d->bindBuffer( | 973 context3d->bindBuffer( |
994 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 974 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
995 resource->gl_pixel_buffer_id); | 975 resource->gl_pixel_buffer_id); |
996 context3d->bufferData( | 976 context3d->bufferData( |
997 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 977 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
998 4 * resource->size.GetArea(), | 978 4 * resource->size.GetArea(), |
999 NULL, | 979 NULL, |
1000 GL_DYNAMIC_DRAW); | 980 GL_DYNAMIC_DRAW); |
1001 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 981 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
1002 } | 982 } |
1003 | 983 |
1004 if (resource->pixels) { | 984 if (resource->pixels) { |
1005 if (resource->pixel_buffer) | 985 if (resource->pixel_buffer) |
1006 return; | 986 return; |
1007 | 987 |
1008 resource->pixel_buffer = new uint8_t[4 * resource->size.GetArea()]; | 988 resource->pixel_buffer = new uint8_t[4 * resource->size.GetArea()]; |
1009 } | 989 } |
1010 } | 990 } |
1011 | 991 |
1012 void ResourceProvider::ReleasePixelBuffer(ResourceId id) { | 992 void ResourceProvider::ReleasePixelBuffer(ResourceId id) { |
1013 DCHECK(thread_checker_.CalledOnValidThread()); | 993 Resource* resource = GetResource(id); |
1014 ResourceMap::iterator it = resources_.find(id); | |
1015 CHECK(it != resources_.end()); | |
1016 Resource* resource = &it->second; | |
1017 DCHECK(!resource->external); | 994 DCHECK(!resource->external); |
1018 DCHECK_EQ(resource->exported_count, 0); | 995 DCHECK_EQ(resource->exported_count, 0); |
1019 DCHECK(!resource->image_id); | 996 DCHECK(!resource->image_id); |
1020 | 997 |
1021 // The pixel buffer can be released while there is a pending "set pixels" | 998 // The pixel buffer can be released while there is a pending "set pixels" |
1022 // if completion has been forced. Any shared memory associated with this | 999 // if completion has been forced. Any shared memory associated with this |
1023 // pixel buffer will not be freed until the waitAsyncTexImage2DCHROMIUM | 1000 // pixel buffer will not be freed until the waitAsyncTexImage2DCHROMIUM |
1024 // command has been processed on the service side. It is also safe to | 1001 // command has been processed on the service side. It is also safe to |
1025 // reuse any query id associated with this resource before they complete | 1002 // reuse any query id associated with this resource before they complete |
1026 // as each new query has a unique submit count. | 1003 // as each new query has a unique submit count. |
(...skipping 21 matching lines...) Expand all Loading... | |
1048 | 1025 |
1049 if (resource->pixels) { | 1026 if (resource->pixels) { |
1050 if (!resource->pixel_buffer) | 1027 if (!resource->pixel_buffer) |
1051 return; | 1028 return; |
1052 delete[] resource->pixel_buffer; | 1029 delete[] resource->pixel_buffer; |
1053 resource->pixel_buffer = NULL; | 1030 resource->pixel_buffer = NULL; |
1054 } | 1031 } |
1055 } | 1032 } |
1056 | 1033 |
1057 uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id) { | 1034 uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id) { |
1058 DCHECK(thread_checker_.CalledOnValidThread()); | 1035 Resource* resource = GetResource(id); |
1059 ResourceMap::iterator it = resources_.find(id); | |
1060 CHECK(it != resources_.end()); | |
1061 Resource* resource = &it->second; | |
1062 DCHECK(!resource->external); | 1036 DCHECK(!resource->external); |
1063 DCHECK_EQ(resource->exported_count, 0); | 1037 DCHECK_EQ(resource->exported_count, 0); |
1064 DCHECK(!resource->image_id); | 1038 DCHECK(!resource->image_id); |
1065 | 1039 |
1066 if (resource->type == GLTexture) { | 1040 if (resource->type == GLTexture) { |
1067 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1041 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1068 DCHECK(context3d); | 1042 DCHECK(context3d); |
1069 DCHECK(resource->gl_pixel_buffer_id); | 1043 DCHECK(resource->gl_pixel_buffer_id); |
1070 context3d->bindBuffer( | 1044 context3d->bindBuffer( |
1071 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1045 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
1072 resource->gl_pixel_buffer_id); | 1046 resource->gl_pixel_buffer_id); |
1073 uint8_t* image = static_cast<uint8_t*>( | 1047 uint8_t* image = static_cast<uint8_t*>( |
1074 context3d->mapBufferCHROMIUM( | 1048 context3d->mapBufferCHROMIUM( |
1075 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); | 1049 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); |
1076 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1050 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
1077 // Buffer is required to be 4-byte aligned. | 1051 // Buffer is required to be 4-byte aligned. |
1078 CHECK(!(reinterpret_cast<intptr_t>(image) & 3)); | 1052 CHECK(!(reinterpret_cast<intptr_t>(image) & 3)); |
1079 return image; | 1053 return image; |
1080 } | 1054 } |
1081 | 1055 |
1082 if (resource->pixels) | 1056 if (resource->pixels) |
1083 return resource->pixel_buffer; | 1057 return resource->pixel_buffer; |
1084 | 1058 |
1085 return NULL; | 1059 return NULL; |
1086 } | 1060 } |
1087 | 1061 |
1088 void ResourceProvider::UnmapPixelBuffer(ResourceId id) { | 1062 void ResourceProvider::UnmapPixelBuffer(ResourceId id) { |
1089 DCHECK(thread_checker_.CalledOnValidThread()); | 1063 Resource* resource = GetResource(id); |
1090 ResourceMap::iterator it = resources_.find(id); | |
1091 CHECK(it != resources_.end()); | |
1092 Resource* resource = &it->second; | |
1093 DCHECK(!resource->external); | 1064 DCHECK(!resource->external); |
1094 DCHECK_EQ(resource->exported_count, 0); | 1065 DCHECK_EQ(resource->exported_count, 0); |
1095 DCHECK(!resource->image_id); | 1066 DCHECK(!resource->image_id); |
1096 | 1067 |
1097 if (resource->type == GLTexture) { | 1068 if (resource->type == GLTexture) { |
1098 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1069 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1099 DCHECK(context3d); | 1070 DCHECK(context3d); |
1100 DCHECK(resource->gl_pixel_buffer_id); | 1071 DCHECK(resource->gl_pixel_buffer_id); |
1101 context3d->bindBuffer( | 1072 context3d->bindBuffer( |
1102 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1073 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1154 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(context3d)); | 1125 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(context3d)); |
1155 if (unit != GL_TEXTURE0) | 1126 if (unit != GL_TEXTURE0) |
1156 GLC(context3d, context3d->activeTexture(unit)); | 1127 GLC(context3d, context3d->activeTexture(unit)); |
1157 context3d->releaseTexImage2DCHROMIUM(target, resource->image_id); | 1128 context3d->releaseTexImage2DCHROMIUM(target, resource->image_id); |
1158 // Active unit being GL_TEXTURE0 is effectively the ground state. | 1129 // Active unit being GL_TEXTURE0 is effectively the ground state. |
1159 if (unit != GL_TEXTURE0) | 1130 if (unit != GL_TEXTURE0) |
1160 GLC(context3d, context3d->activeTexture(GL_TEXTURE0)); | 1131 GLC(context3d, context3d->activeTexture(GL_TEXTURE0)); |
1161 } | 1132 } |
1162 | 1133 |
1163 void ResourceProvider::BeginSetPixels(ResourceId id) { | 1134 void ResourceProvider::BeginSetPixels(ResourceId id) { |
1164 DCHECK(thread_checker_.CalledOnValidThread()); | 1135 Resource* resource = GetResource(id); |
1165 ResourceMap::iterator it = resources_.find(id); | |
1166 CHECK(it != resources_.end()); | |
1167 Resource* resource = &it->second; | |
1168 DCHECK(!resource->pending_set_pixels); | 1136 DCHECK(!resource->pending_set_pixels); |
1169 | 1137 |
1170 LazyCreate(resource); | 1138 LazyCreate(resource); |
1171 DCHECK(resource->gl_id || resource->allocated); | 1139 DCHECK(resource->gl_id || resource->allocated); |
1172 DCHECK(ReadLockFenceHasPassed(resource)); | 1140 DCHECK(ReadLockFenceHasPassed(resource)); |
1173 DCHECK(!resource->image_id); | 1141 DCHECK(!resource->image_id); |
1174 | 1142 |
1175 bool allocate = !resource->allocated; | 1143 bool allocate = !resource->allocated; |
1176 resource->allocated = true; | 1144 resource->allocated = true; |
1177 LockForWrite(id); | 1145 LockForWrite(id); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1222 std::swap(resource->pixels, resource->pixel_buffer); | 1190 std::swap(resource->pixels, resource->pixel_buffer); |
1223 delete[] resource->pixel_buffer; | 1191 delete[] resource->pixel_buffer; |
1224 resource->pixel_buffer = NULL; | 1192 resource->pixel_buffer = NULL; |
1225 } | 1193 } |
1226 | 1194 |
1227 resource->pending_set_pixels = true; | 1195 resource->pending_set_pixels = true; |
1228 resource->set_pixels_completion_forced = false; | 1196 resource->set_pixels_completion_forced = false; |
1229 } | 1197 } |
1230 | 1198 |
1231 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { | 1199 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { |
1232 DCHECK(thread_checker_.CalledOnValidThread()); | 1200 Resource* resource = GetResource(id); |
1233 ResourceMap::iterator it = resources_.find(id); | |
1234 CHECK(it != resources_.end()); | |
1235 Resource* resource = &it->second; | |
1236 DCHECK(resource->locked_for_write); | 1201 DCHECK(resource->locked_for_write); |
1237 DCHECK(resource->pending_set_pixels); | 1202 DCHECK(resource->pending_set_pixels); |
1238 DCHECK(!resource->set_pixels_completion_forced); | 1203 DCHECK(!resource->set_pixels_completion_forced); |
1239 | 1204 |
1240 if (resource->gl_id) { | 1205 if (resource->gl_id) { |
1241 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1206 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1242 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id)); | 1207 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id)); |
1243 GLC(context3d, context3d->waitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); | 1208 GLC(context3d, context3d->waitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); |
1244 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, 0)); | 1209 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, 0)); |
1245 } | 1210 } |
1246 | 1211 |
1247 resource->set_pixels_completion_forced = true; | 1212 resource->set_pixels_completion_forced = true; |
1248 } | 1213 } |
1249 | 1214 |
1250 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { | 1215 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { |
1251 DCHECK(thread_checker_.CalledOnValidThread()); | 1216 Resource* resource = GetResource(id); |
1252 ResourceMap::iterator it = resources_.find(id); | |
1253 CHECK(it != resources_.end()); | |
1254 Resource* resource = &it->second; | |
1255 DCHECK(resource->locked_for_write); | 1217 DCHECK(resource->locked_for_write); |
1256 DCHECK(resource->pending_set_pixels); | 1218 DCHECK(resource->pending_set_pixels); |
1257 | 1219 |
1258 if (resource->gl_id) { | 1220 if (resource->gl_id) { |
1259 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1221 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1260 DCHECK(context3d); | 1222 DCHECK(context3d); |
1261 DCHECK(resource->gl_upload_query_id); | 1223 DCHECK(resource->gl_upload_query_id); |
1262 unsigned complete = 1; | 1224 unsigned complete = 1; |
1263 context3d->getQueryObjectuivEXT( | 1225 context3d->getQueryObjectuivEXT( |
1264 resource->gl_upload_query_id, | 1226 resource->gl_upload_query_id, |
1265 GL_QUERY_RESULT_AVAILABLE_EXT, | 1227 GL_QUERY_RESULT_AVAILABLE_EXT, |
1266 &complete); | 1228 &complete); |
1267 if (!complete) | 1229 if (!complete) |
1268 return false; | 1230 return false; |
1269 } | 1231 } |
1270 | 1232 |
1271 resource->pending_set_pixels = false; | 1233 resource->pending_set_pixels = false; |
1272 UnlockForWrite(id); | 1234 UnlockForWrite(id); |
1273 | 1235 |
1274 return true; | 1236 return true; |
1275 } | 1237 } |
1276 | 1238 |
1277 void ResourceProvider::CreateForTesting(ResourceId id) { | 1239 void ResourceProvider::CreateForTesting(ResourceId id) { |
1278 ResourceMap::iterator it = resources_.find(id); | 1240 LazyCreate(GetResource(id)); |
1279 CHECK(it != resources_.end()); | |
1280 Resource* resource = &it->second; | |
1281 LazyCreate(resource); | |
1282 } | 1241 } |
1283 | 1242 |
1284 void ResourceProvider::LazyCreate(Resource* resource) { | 1243 void ResourceProvider::LazyCreate(Resource* resource) { |
1285 if (resource->type != GLTexture || resource->gl_id != 0) | 1244 if (resource->type != GLTexture || resource->gl_id != 0) |
1286 return; | 1245 return; |
1287 | 1246 |
1288 // Early out for resources that don't require texture creation. | 1247 // Early out for resources that don't require texture creation. |
1289 if (resource->texture_pool == 0) | 1248 if (resource->texture_pool == 0) |
1290 return; | 1249 return; |
1291 | 1250 |
1292 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1251 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1293 DCHECK(context3d); | 1252 DCHECK(context3d); |
1294 // Create and set texture properties. Allocation is delayed until needed. | 1253 // Create and set texture properties. Allocation is delayed until needed. |
1295 resource->gl_id = CreateTextureId(context3d); | 1254 resource->gl_id = CreateTextureId(context3d); |
1296 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, | 1255 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, |
1297 GL_TEXTURE_POOL_CHROMIUM, | 1256 GL_TEXTURE_POOL_CHROMIUM, |
1298 resource->texture_pool)); | 1257 resource->texture_pool)); |
1299 if (use_texture_usage_hint_ && resource->hint == TextureUsageFramebuffer) { | 1258 if (use_texture_usage_hint_ && resource->hint == TextureUsageFramebuffer) { |
1300 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, | 1259 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, |
1301 GL_TEXTURE_USAGE_ANGLE, | 1260 GL_TEXTURE_USAGE_ANGLE, |
1302 GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); | 1261 GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); |
1303 } | 1262 } |
1304 } | 1263 } |
1305 | 1264 |
1306 void ResourceProvider::AllocateForTesting(ResourceId id) { | 1265 void ResourceProvider::AllocateForTesting(ResourceId id) { |
1307 ResourceMap::iterator it = resources_.find(id); | 1266 LazyAllocate(GetResource(id)); |
1308 CHECK(it != resources_.end()); | |
1309 Resource* resource = &it->second; | |
1310 LazyAllocate(resource); | |
1311 } | 1267 } |
1312 | 1268 |
1313 void ResourceProvider::LazyAllocate(Resource* resource) { | 1269 void ResourceProvider::LazyAllocate(Resource* resource) { |
1314 DCHECK(resource); | 1270 DCHECK(resource); |
1315 LazyCreate(resource); | 1271 LazyCreate(resource); |
1316 | 1272 |
1317 DCHECK(resource->gl_id || resource->allocated); | 1273 DCHECK(resource->gl_id || resource->allocated); |
1318 if (resource->allocated || !resource->gl_id) | 1274 if (resource->allocated || !resource->gl_id) |
1319 return; | 1275 return; |
1320 resource->allocated = true; | 1276 resource->allocated = true; |
(...skipping 16 matching lines...) Expand all Loading... | |
1337 size.height(), | 1293 size.height(), |
1338 0, | 1294 0, |
1339 format, | 1295 format, |
1340 GL_UNSIGNED_BYTE, | 1296 GL_UNSIGNED_BYTE, |
1341 NULL)); | 1297 NULL)); |
1342 } | 1298 } |
1343 } | 1299 } |
1344 | 1300 |
1345 void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, | 1301 void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, |
1346 bool enable) { | 1302 bool enable) { |
1347 DCHECK(thread_checker_.CalledOnValidThread()); | 1303 Resource* resource = GetResource(id); |
1348 ResourceMap::iterator it = resources_.find(id); | |
1349 CHECK(it != resources_.end()); | |
1350 Resource* resource = &it->second; | |
1351 resource->enable_read_lock_fences = enable; | 1304 resource->enable_read_lock_fences = enable; |
1352 } | 1305 } |
1353 | 1306 |
1354 void ResourceProvider::AcquireImage(ResourceId id) { | 1307 void ResourceProvider::AcquireImage(ResourceId id) { |
1355 DCHECK(thread_checker_.CalledOnValidThread()); | 1308 Resource* resource = GetResource(id); |
1356 ResourceMap::iterator it = resources_.find(id); | |
1357 CHECK(it != resources_.end()); | |
1358 Resource* resource = &it->second; | |
1359 | |
1360 DCHECK(!resource->external); | 1309 DCHECK(!resource->external); |
1361 DCHECK_EQ(resource->exported_count, 0); | 1310 DCHECK_EQ(resource->exported_count, 0); |
1362 | 1311 |
1363 if (resource->type != GLTexture) | 1312 if (resource->type != GLTexture) |
1364 return; | 1313 return; |
1365 | 1314 |
1366 if (resource->image_id) | 1315 if (resource->image_id) |
1367 return; | 1316 return; |
1368 | 1317 |
1369 resource->allocated = true; | 1318 resource->allocated = true; |
1370 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1319 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1371 DCHECK(context3d); | 1320 DCHECK(context3d); |
1372 resource->image_id = context3d->createImageCHROMIUM( | 1321 resource->image_id = context3d->createImageCHROMIUM( |
1373 resource->size.width(), resource->size.height(), GL_RGBA8_OES); | 1322 resource->size.width(), resource->size.height(), GL_RGBA8_OES); |
1374 DCHECK(resource->image_id); | 1323 DCHECK(resource->image_id); |
1375 } | 1324 } |
1376 | 1325 |
1377 void ResourceProvider::ReleaseImage(ResourceId id) { | 1326 void ResourceProvider::ReleaseImage(ResourceId id) { |
1378 DCHECK(thread_checker_.CalledOnValidThread()); | 1327 Resource* resource = GetResource(id); |
1379 ResourceMap::iterator it = resources_.find(id); | |
1380 CHECK(it != resources_.end()); | |
1381 Resource* resource = &it->second; | |
1382 | |
1383 DCHECK(!resource->external); | 1328 DCHECK(!resource->external); |
1384 DCHECK_EQ(resource->exported_count, 0); | 1329 DCHECK_EQ(resource->exported_count, 0); |
1385 | 1330 |
1386 if (!resource->image_id) | 1331 if (!resource->image_id) |
1387 return; | 1332 return; |
1388 | 1333 |
1389 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1334 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1390 DCHECK(context3d); | 1335 DCHECK(context3d); |
1391 context3d->destroyImageCHROMIUM(resource->image_id); | 1336 context3d->destroyImageCHROMIUM(resource->image_id); |
1392 resource->image_id = 0; | 1337 resource->image_id = 0; |
1393 resource->allocated = false; | 1338 resource->allocated = false; |
1394 } | 1339 } |
1395 | 1340 |
1396 uint8_t* ResourceProvider::MapImage(ResourceId id) { | 1341 uint8_t* ResourceProvider::MapImage(ResourceId id) { |
1397 DCHECK(thread_checker_.CalledOnValidThread()); | 1342 Resource* resource = GetResource(id); |
1398 ResourceMap::iterator it = resources_.find(id); | |
1399 CHECK(it != resources_.end()); | |
1400 Resource* resource = &it->second; | |
1401 | |
1402 DCHECK(ReadLockFenceHasPassed(resource)); | 1343 DCHECK(ReadLockFenceHasPassed(resource)); |
1403 DCHECK(!resource->external); | 1344 DCHECK(!resource->external); |
1404 DCHECK_EQ(resource->exported_count, 0); | 1345 DCHECK_EQ(resource->exported_count, 0); |
1405 | 1346 |
1406 if (resource->image_id) { | 1347 if (resource->image_id) { |
1407 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1348 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1408 DCHECK(context3d); | 1349 DCHECK(context3d); |
1409 return static_cast<uint8_t*>( | 1350 return static_cast<uint8_t*>( |
1410 context3d->mapImageCHROMIUM(resource->image_id, GL_READ_WRITE)); | 1351 context3d->mapImageCHROMIUM(resource->image_id, GL_READ_WRITE)); |
1411 } | 1352 } |
1412 | 1353 |
1413 if (resource->pixels) | 1354 if (resource->pixels) |
1414 return resource->pixels; | 1355 return resource->pixels; |
1415 | 1356 |
1416 return NULL; | 1357 return NULL; |
1417 } | 1358 } |
1418 | 1359 |
1419 void ResourceProvider::UnmapImage(ResourceId id) { | 1360 void ResourceProvider::UnmapImage(ResourceId id) { |
1420 DCHECK(thread_checker_.CalledOnValidThread()); | 1361 Resource* resource = GetResource(id); |
1421 ResourceMap::iterator it = resources_.find(id); | |
1422 CHECK(it != resources_.end()); | |
1423 Resource* resource = &it->second; | |
1424 | |
1425 DCHECK(!resource->external); | 1362 DCHECK(!resource->external); |
1426 DCHECK_EQ(resource->exported_count, 0); | 1363 DCHECK_EQ(resource->exported_count, 0); |
1427 | 1364 |
1428 if (resource->image_id) { | 1365 if (resource->image_id) { |
1429 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1366 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1430 DCHECK(context3d); | 1367 DCHECK(context3d); |
1431 context3d->unmapImageCHROMIUM(resource->image_id); | 1368 context3d->unmapImageCHROMIUM(resource->image_id); |
1432 } | 1369 } |
1433 } | 1370 } |
1434 | 1371 |
1435 int ResourceProvider::GetImageStride(ResourceId id) { | 1372 int ResourceProvider::GetImageStride(ResourceId id) { |
1436 DCHECK(thread_checker_.CalledOnValidThread()); | 1373 Resource* resource = GetResource(id); |
1437 ResourceMap::iterator it = resources_.find(id); | |
1438 CHECK(it != resources_.end()); | |
1439 Resource* resource = &it->second; | |
1440 | |
1441 DCHECK(!resource->external); | 1374 DCHECK(!resource->external); |
1442 DCHECK_EQ(resource->exported_count, 0); | 1375 DCHECK_EQ(resource->exported_count, 0); |
1443 | 1376 |
1444 int stride = 0; | 1377 int stride = 0; |
1445 | 1378 |
1446 if (resource->image_id) { | 1379 if (resource->image_id) { |
1447 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1380 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
1448 DCHECK(context3d); | 1381 DCHECK(context3d); |
1449 context3d->getImageParameterivCHROMIUM( | 1382 context3d->getImageParameterivCHROMIUM( |
1450 resource->image_id, GL_IMAGE_ROWBYTES_CHROMIUM, &stride); | 1383 resource->image_id, GL_IMAGE_ROWBYTES_CHROMIUM, &stride); |
1451 } | 1384 } |
1452 | 1385 |
1453 return stride; | 1386 return stride; |
1454 } | 1387 } |
1455 | 1388 |
1456 GLint ResourceProvider::GetActiveTextureUnit(WebGraphicsContext3D* context) { | 1389 GLint ResourceProvider::GetActiveTextureUnit(WebGraphicsContext3D* context) { |
1457 GLint active_unit = 0; | 1390 GLint active_unit = 0; |
1458 context->getIntegerv(GL_ACTIVE_TEXTURE, &active_unit); | 1391 context->getIntegerv(GL_ACTIVE_TEXTURE, &active_unit); |
1459 return active_unit; | 1392 return active_unit; |
1460 } | 1393 } |
1461 | 1394 |
1462 } // namespace cc | 1395 } // namespace cc |
OLD | NEW |