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

Side by Side Diff: cc/resource_provider.cc

Issue 12197004: cc: Enforce correct recycling in resource pool. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/resource_provider.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/resource_provider.h" 5 #include "cc/resource_provider.h"
6 6
7 #include <limits.h> 7 #include <limits.h>
8 8
9 #include "base/debug/alias.h" 9 #include "base/debug/alias.h"
10 #include "base/hash_tables.h" 10 #include "base/hash_tables.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 , glUploadQueryId(0) 54 , glUploadQueryId(0)
55 , pixels(0) 55 , pixels(0)
56 , pixelBuffer(0) 56 , pixelBuffer(0)
57 , lockForReadCount(0) 57 , lockForReadCount(0)
58 , lockedForWrite(false) 58 , lockedForWrite(false)
59 , external(false) 59 , external(false)
60 , exported(false) 60 , exported(false)
61 , markedForDeletion(false) 61 , markedForDeletion(false)
62 , pendingSetPixels(false) 62 , pendingSetPixels(false)
63 , allocated(false) 63 , allocated(false)
64 , enableReadLockFences(false)
65 , readLockFence(NULL)
64 , size() 66 , size()
65 , format(0) 67 , format(0)
66 , filter(0) 68 , filter(0)
67 , type(static_cast<ResourceType>(0)) 69 , type(static_cast<ResourceType>(0))
68 { 70 {
69 } 71 }
70 72
71 ResourceProvider::Resource::~Resource() 73 ResourceProvider::Resource::~Resource()
72 { 74 {
73 } 75 }
74 76
75 ResourceProvider::Resource::Resource(unsigned textureId, const gfx::Size& size, GLenum format, GLenum filter) 77 ResourceProvider::Resource::Resource(unsigned textureId, const gfx::Size& size, GLenum format, GLenum filter)
76 : glId(textureId) 78 : glId(textureId)
77 , glPixelBufferId(0) 79 , glPixelBufferId(0)
78 , glUploadQueryId(0) 80 , glUploadQueryId(0)
79 , pixels(0) 81 , pixels(0)
80 , pixelBuffer(0) 82 , pixelBuffer(0)
81 , lockForReadCount(0) 83 , lockForReadCount(0)
82 , lockedForWrite(false) 84 , lockedForWrite(false)
83 , external(false) 85 , external(false)
84 , exported(false) 86 , exported(false)
85 , markedForDeletion(false) 87 , markedForDeletion(false)
86 , pendingSetPixels(false) 88 , pendingSetPixels(false)
87 , allocated(false) 89 , allocated(false)
90 , enableReadLockFences(false)
91 , readLockFence(NULL)
88 , size(size) 92 , size(size)
89 , format(format) 93 , format(format)
90 , filter(filter) 94 , filter(filter)
91 , type(GLTexture) 95 , type(GLTexture)
92 { 96 {
93 } 97 }
94 98
95 ResourceProvider::Resource::Resource(uint8_t* pixels, const gfx::Size& size, GLe num format, GLenum filter) 99 ResourceProvider::Resource::Resource(uint8_t* pixels, const gfx::Size& size, GLe num format, GLenum filter)
96 : glId(0) 100 : glId(0)
97 , glPixelBufferId(0) 101 , glPixelBufferId(0)
98 , glUploadQueryId(0) 102 , glUploadQueryId(0)
99 , pixels(pixels) 103 , pixels(pixels)
100 , pixelBuffer(0) 104 , pixelBuffer(0)
101 , lockForReadCount(0) 105 , lockForReadCount(0)
102 , lockedForWrite(false) 106 , lockedForWrite(false)
103 , external(false) 107 , external(false)
104 , exported(false) 108 , exported(false)
105 , markedForDeletion(false) 109 , markedForDeletion(false)
106 , pendingSetPixels(false) 110 , pendingSetPixels(false)
107 , allocated(false) 111 , allocated(false)
112 , enableReadLockFences(false)
113 , readLockFence(NULL)
108 , size(size) 114 , size(size)
109 , format(format) 115 , format(format)
110 , filter(filter) 116 , filter(filter)
111 , type(Bitmap) 117 , type(Bitmap)
112 { 118 {
113 } 119 }
114 120
115 ResourceProvider::Child::Child() 121 ResourceProvider::Child::Child()
116 { 122 {
117 } 123 }
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 void ResourceProvider::setPixels(ResourceId id, const uint8_t* image, const gfx: :Rect& imageRect, const gfx::Rect& sourceRect, const gfx::Vector2d& destOffset) 327 void ResourceProvider::setPixels(ResourceId id, const uint8_t* image, const gfx: :Rect& imageRect, const gfx::Rect& sourceRect, const gfx::Vector2d& destOffset)
322 { 328 {
323 DCHECK(m_threadChecker.CalledOnValidThread()); 329 DCHECK(m_threadChecker.CalledOnValidThread());
324 ResourceMap::iterator it = m_resources.find(id); 330 ResourceMap::iterator it = m_resources.find(id);
325 CHECK(it != m_resources.end()); 331 CHECK(it != m_resources.end());
326 Resource* resource = &it->second; 332 Resource* resource = &it->second;
327 DCHECK(!resource->lockedForWrite); 333 DCHECK(!resource->lockedForWrite);
328 DCHECK(!resource->lockForReadCount); 334 DCHECK(!resource->lockForReadCount);
329 DCHECK(!resource->external); 335 DCHECK(!resource->external);
330 DCHECK(!resource->exported); 336 DCHECK(!resource->exported);
337 DCHECK(readLockFenceHasPassed(resource));
331 lazyAllocate(resource); 338 lazyAllocate(resource);
332 339
333 if (resource->glId) { 340 if (resource->glId) {
334 DCHECK(!resource->pendingSetPixels); 341 DCHECK(!resource->pendingSetPixels);
335 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); 342 WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
336 DCHECK(context3d); 343 DCHECK(context3d);
337 DCHECK(m_textureUploader.get()); 344 DCHECK(m_textureUploader.get());
338 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); 345 context3d->bindTexture(GL_TEXTURE_2D, resource->glId);
339 m_textureUploader->upload(image, 346 m_textureUploader->upload(image,
340 imageRect, 347 imageRect,
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 if (resource->mailbox.sync_point()) { 435 if (resource->mailbox.sync_point()) {
429 GLC(context3d, context3d->waitSyncPoint(resource->mailbox.sync_point ())); 436 GLC(context3d, context3d->waitSyncPoint(resource->mailbox.sync_point ()));
430 resource->mailbox.ResetSyncPoint(); 437 resource->mailbox.ResetSyncPoint();
431 } 438 }
432 resource->glId = context3d->createTexture(); 439 resource->glId = context3d->createTexture();
433 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)); 440 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId));
434 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, resource ->mailbox.data())); 441 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, resource ->mailbox.data()));
435 } 442 }
436 443
437 resource->lockForReadCount++; 444 resource->lockForReadCount++;
445 if (resource->enableReadLockFences)
446 resource->readLockFence = m_currentReadLockFence;
447
438 return resource; 448 return resource;
439 } 449 }
440 450
441 void ResourceProvider::unlockForRead(ResourceId id) 451 void ResourceProvider::unlockForRead(ResourceId id)
442 { 452 {
443 DCHECK(m_threadChecker.CalledOnValidThread()); 453 DCHECK(m_threadChecker.CalledOnValidThread());
444 ResourceMap::iterator it = m_resources.find(id); 454 ResourceMap::iterator it = m_resources.find(id);
445 CHECK(it != m_resources.end()); 455 CHECK(it != m_resources.end());
446 Resource* resource = &it->second; 456 Resource* resource = &it->second;
447 DCHECK(resource->lockForReadCount > 0); 457 DCHECK(resource->lockForReadCount > 0);
448 DCHECK(!resource->exported); 458 DCHECK(!resource->exported);
449 resource->lockForReadCount--; 459 resource->lockForReadCount--;
450 } 460 }
451 461
452 const ResourceProvider::Resource* ResourceProvider::lockForWrite(ResourceId id) 462 const ResourceProvider::Resource* ResourceProvider::lockForWrite(ResourceId id)
453 { 463 {
454 DCHECK(m_threadChecker.CalledOnValidThread()); 464 DCHECK(m_threadChecker.CalledOnValidThread());
455 ResourceMap::iterator it = m_resources.find(id); 465 ResourceMap::iterator it = m_resources.find(id);
456 CHECK(it != m_resources.end()); 466 CHECK(it != m_resources.end());
457 Resource* resource = &it->second; 467 Resource* resource = &it->second;
458 DCHECK(!resource->lockedForWrite); 468 DCHECK(!resource->lockedForWrite);
459 DCHECK(!resource->lockForReadCount); 469 DCHECK(!resource->lockForReadCount);
460 DCHECK(!resource->exported); 470 DCHECK(!resource->exported);
461 DCHECK(!resource->external); 471 DCHECK(!resource->external);
472 DCHECK(readLockFenceHasPassed(resource));
462 lazyAllocate(resource); 473 lazyAllocate(resource);
463 474
464 resource->lockedForWrite = true; 475 resource->lockedForWrite = true;
465 return resource; 476 return resource;
466 } 477 }
467 478
479 bool ResourceProvider::canLockForWrite(ResourceId id)
480 {
481 DCHECK(m_threadChecker.CalledOnValidThread());
482 ResourceMap::iterator it = m_resources.find(id);
483 CHECK(it != m_resources.end());
484 Resource* resource = &it->second;
485 return !resource->lockedForWrite &&
486 !resource->lockForReadCount &&
487 !resource->exported &&
488 !resource->external &&
489 readLockFenceHasPassed(resource);
490 }
491
468 void ResourceProvider::unlockForWrite(ResourceId id) 492 void ResourceProvider::unlockForWrite(ResourceId id)
469 { 493 {
470 DCHECK(m_threadChecker.CalledOnValidThread()); 494 DCHECK(m_threadChecker.CalledOnValidThread());
471 ResourceMap::iterator it = m_resources.find(id); 495 ResourceMap::iterator it = m_resources.find(id);
472 CHECK(it != m_resources.end()); 496 CHECK(it != m_resources.end());
473 Resource* resource = &it->second; 497 Resource* resource = &it->second;
474 DCHECK(resource->lockedForWrite); 498 DCHECK(resource->lockedForWrite);
475 DCHECK(!resource->exported); 499 DCHECK(!resource->exported);
476 DCHECK(!resource->external); 500 DCHECK(!resource->external);
477 resource->lockedForWrite = false; 501 resource->lockedForWrite = false;
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
879 void ResourceProvider::setPixelsFromBuffer(ResourceId id) 903 void ResourceProvider::setPixelsFromBuffer(ResourceId id)
880 { 904 {
881 DCHECK(m_threadChecker.CalledOnValidThread()); 905 DCHECK(m_threadChecker.CalledOnValidThread());
882 ResourceMap::iterator it = m_resources.find(id); 906 ResourceMap::iterator it = m_resources.find(id);
883 CHECK(it != m_resources.end()); 907 CHECK(it != m_resources.end());
884 Resource* resource = &it->second; 908 Resource* resource = &it->second;
885 DCHECK(!resource->lockedForWrite); 909 DCHECK(!resource->lockedForWrite);
886 DCHECK(!resource->lockForReadCount); 910 DCHECK(!resource->lockForReadCount);
887 DCHECK(!resource->external); 911 DCHECK(!resource->external);
888 DCHECK(!resource->exported); 912 DCHECK(!resource->exported);
913 DCHECK(readLockFenceHasPassed(resource));
889 lazyAllocate(resource); 914 lazyAllocate(resource);
890 915
891 if (resource->glId) { 916 if (resource->glId) {
892 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); 917 WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
893 DCHECK(context3d); 918 DCHECK(context3d);
894 DCHECK(resource->glPixelBufferId); 919 DCHECK(resource->glPixelBufferId);
895 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); 920 context3d->bindTexture(GL_TEXTURE_2D, resource->glId);
896 context3d->bindBuffer( 921 context3d->bindBuffer(
897 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 922 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
898 resource->glPixelBufferId); 923 resource->glPixelBufferId);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
942 } 967 }
943 968
944 void ResourceProvider::beginSetPixels(ResourceId id) 969 void ResourceProvider::beginSetPixels(ResourceId id)
945 { 970 {
946 DCHECK(m_threadChecker.CalledOnValidThread()); 971 DCHECK(m_threadChecker.CalledOnValidThread());
947 ResourceMap::iterator it = m_resources.find(id); 972 ResourceMap::iterator it = m_resources.find(id);
948 CHECK(it != m_resources.end()); 973 CHECK(it != m_resources.end());
949 Resource* resource = &it->second; 974 Resource* resource = &it->second;
950 DCHECK(!resource->pendingSetPixels); 975 DCHECK(!resource->pendingSetPixels);
951 DCHECK(resource->glId || resource->allocated); 976 DCHECK(resource->glId || resource->allocated);
977 DCHECK(readLockFenceHasPassed(resource));
952 978
953 bool allocate = !resource->allocated; 979 bool allocate = !resource->allocated;
954 resource->allocated = true; 980 resource->allocated = true;
955 lockForWrite(id); 981 lockForWrite(id);
956 982
957 if (resource->glId) { 983 if (resource->glId) {
958 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); 984 WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
959 DCHECK(context3d); 985 DCHECK(context3d);
960 DCHECK(resource->glPixelBufferId); 986 DCHECK(resource->glPixelBufferId);
961 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); 987 context3d->bindTexture(GL_TEXTURE_2D, resource->glId);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1031 Resource* resource = &it->second; 1057 Resource* resource = &it->second;
1032 lazyAllocate(resource); 1058 lazyAllocate(resource);
1033 } 1059 }
1034 1060
1035 void ResourceProvider::lazyAllocate(Resource* resource) { 1061 void ResourceProvider::lazyAllocate(Resource* resource) {
1036 DCHECK(resource); 1062 DCHECK(resource);
1037 DCHECK(resource->glId || resource->allocated); 1063 DCHECK(resource->glId || resource->allocated);
1038 1064
1039 if (resource->allocated || !resource->glId) 1065 if (resource->allocated || !resource->glId)
1040 return; 1066 return;
1041
1042 resource->allocated = true; 1067 resource->allocated = true;
1043 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); 1068 WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
1044 gfx::Size& size = resource->size; 1069 gfx::Size& size = resource->size;
1045 GLenum format = resource->format; 1070 GLenum format = resource->format;
1046 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)); 1071 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId));
1047 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { 1072 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) {
1048 GLenum storageFormat = textureToStorageFormat(format); 1073 GLenum storageFormat = textureToStorageFormat(format);
1049 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma t, size.width(), size.height())); 1074 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma t, size.width(), size.height()));
1050 } else 1075 } else
1051 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); 1076 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0));
1052 } 1077 }
1053 1078
1079 void ResourceProvider::enableReadLockFences(ResourceProvider::ResourceId id, boo l enable) {
1080 DCHECK(m_threadChecker.CalledOnValidThread());
1081 ResourceMap::iterator it = m_resources.find(id);
1082 CHECK(it != m_resources.end());
1083 Resource* resource = &it->second;
1084 resource->enableReadLockFences = enable;
1085 }
1054 1086
1055 } // namespace cc 1087 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resource_provider.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698