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/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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
53 , pixels(0) | 53 , pixels(0) |
54 , pixelBuffer(0) | 54 , pixelBuffer(0) |
55 , pool(0) | 55 , pool(0) |
56 , lockForReadCount(0) | 56 , lockForReadCount(0) |
57 , lockedForWrite(false) | 57 , lockedForWrite(false) |
58 , external(false) | 58 , external(false) |
59 , exported(false) | 59 , exported(false) |
60 , markedForDeletion(false) | 60 , markedForDeletion(false) |
61 , size() | 61 , size() |
62 , format(0) | 62 , format(0) |
63 , filter(0) | |
63 , type(static_cast<ResourceType>(0)) | 64 , type(static_cast<ResourceType>(0)) |
64 { | 65 { |
65 } | 66 } |
66 | 67 |
67 ResourceProvider::Resource::Resource(unsigned textureId, int pool, const gfx::Si ze& size, GLenum format) | 68 ResourceProvider::Resource::Resource(unsigned textureId, int pool, const gfx::Si ze& size, GLenum format, GLenum filter) |
68 : glId(textureId) | 69 : glId(textureId) |
69 , glPixelBufferId(0) | 70 , glPixelBufferId(0) |
70 , pixels(0) | 71 , pixels(0) |
71 , pixelBuffer(0) | 72 , pixelBuffer(0) |
72 , pool(pool) | 73 , pool(pool) |
73 , lockForReadCount(0) | 74 , lockForReadCount(0) |
74 , lockedForWrite(false) | 75 , lockedForWrite(false) |
75 , external(false) | 76 , external(false) |
76 , exported(false) | 77 , exported(false) |
77 , markedForDeletion(false) | 78 , markedForDeletion(false) |
78 , size(size) | 79 , size(size) |
79 , format(format) | 80 , format(format) |
81 , filter(filter) | |
80 , type(GLTexture) | 82 , type(GLTexture) |
81 { | 83 { |
82 } | 84 } |
83 | 85 |
84 ResourceProvider::Resource::Resource(uint8_t* pixels, int pool, const gfx::Size& size, GLenum format) | 86 ResourceProvider::Resource::Resource(uint8_t* pixels, int pool, const gfx::Size& size, GLenum format, GLenum filter) |
85 : glId(0) | 87 : glId(0) |
86 , glPixelBufferId(0) | 88 , glPixelBufferId(0) |
87 , pixels(pixels) | 89 , pixels(pixels) |
88 , pixelBuffer(0) | 90 , pixelBuffer(0) |
89 , pool(pool) | 91 , pool(pool) |
90 , lockForReadCount(0) | 92 , lockForReadCount(0) |
91 , lockedForWrite(false) | 93 , lockedForWrite(false) |
92 , external(false) | 94 , external(false) |
93 , exported(false) | 95 , exported(false) |
94 , markedForDeletion(false) | 96 , markedForDeletion(false) |
95 , size(size) | 97 , size(size) |
96 , format(format) | 98 , format(format) |
99 , filter(filter) | |
97 , type(Bitmap) | 100 , type(Bitmap) |
98 { | 101 { |
99 } | 102 } |
100 | 103 |
101 ResourceProvider::Child::Child() | 104 ResourceProvider::Child::Child() |
102 { | 105 { |
103 } | 106 } |
104 | 107 |
105 ResourceProvider::Child::~Child() | 108 ResourceProvider::Child::~Child() |
106 { | 109 { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
170 | 173 |
171 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) | 174 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) |
172 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_ ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); | 175 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_ ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); |
173 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { | 176 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { |
174 GLenum storageFormat = textureToStorageFormat(format); | 177 GLenum storageFormat = textureToStorageFormat(format); |
175 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma t, size.width(), size.height())); | 178 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma t, size.width(), size.height())); |
176 } else | 179 } else |
177 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); | 180 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); |
178 | 181 |
179 ResourceId id = m_nextId++; | 182 ResourceId id = m_nextId++; |
180 Resource resource(textureId, pool, size, format); | 183 Resource resource(textureId, pool, size, format, GL_LINEAR); |
181 m_resources[id] = resource; | 184 m_resources[id] = resource; |
182 return id; | 185 return id; |
183 } | 186 } |
184 | 187 |
185 ResourceProvider::ResourceId ResourceProvider::createBitmap(int pool, const gfx: :Size& size) | 188 ResourceProvider::ResourceId ResourceProvider::createBitmap(int pool, const gfx: :Size& size) |
186 { | 189 { |
187 DCHECK(m_threadChecker.CalledOnValidThread()); | 190 DCHECK(m_threadChecker.CalledOnValidThread()); |
188 | 191 |
189 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; | 192 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; |
190 | 193 |
191 ResourceId id = m_nextId++; | 194 ResourceId id = m_nextId++; |
192 Resource resource(pixels, pool, size, GL_RGBA); | 195 Resource resource(pixels, pool, size, GL_RGBA, GL_LINEAR); |
193 m_resources[id] = resource; | 196 m_resources[id] = resource; |
194 return id; | 197 return id; |
195 } | 198 } |
196 | 199 |
197 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture (unsigned textureId) | 200 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture (unsigned textureId) |
198 { | 201 { |
199 DCHECK(m_threadChecker.CalledOnValidThread()); | 202 DCHECK(m_threadChecker.CalledOnValidThread()); |
200 | 203 |
201 WebGraphicsContext3D* context3d = m_context->context3D(); | 204 WebGraphicsContext3D* context3d = m_context->context3D(); |
202 DCHECK(context3d); | 205 DCHECK(context3d); |
203 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 206 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
204 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER , GL_LINEAR)); | 207 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER , GL_LINEAR)); |
205 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER , GL_LINEAR)); | 208 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER , GL_LINEAR)); |
206 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL _CLAMP_TO_EDGE)); | 209 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL _CLAMP_TO_EDGE)); |
207 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE)); | 210 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE)); |
208 | 211 |
209 ResourceId id = m_nextId++; | 212 ResourceId id = m_nextId++; |
210 Resource resource(textureId, 0, gfx::Size(), 0); | 213 Resource resource(textureId, 0, gfx::Size(), 0, GL_LINEAR); |
211 resource.external = true; | 214 resource.external = true; |
212 m_resources[id] = resource; | 215 m_resources[id] = resource; |
213 return id; | 216 return id; |
214 } | 217 } |
215 | 218 |
216 void ResourceProvider::deleteResource(ResourceId id) | 219 void ResourceProvider::deleteResource(ResourceId id) |
217 { | 220 { |
218 DCHECK(m_threadChecker.CalledOnValidThread()); | 221 DCHECK(m_threadChecker.CalledOnValidThread()); |
219 ResourceMap::iterator it = m_resources.find(id); | 222 ResourceMap::iterator it = m_resources.find(id); |
220 CHECK(it != m_resources.end()); | 223 CHECK(it != m_resources.end()); |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
417 , m_textureId(resourceProvider->lockForRead(resourceId)->glId) | 420 , m_textureId(resourceProvider->lockForRead(resourceId)->glId) |
418 { | 421 { |
419 DCHECK(m_textureId); | 422 DCHECK(m_textureId); |
420 } | 423 } |
421 | 424 |
422 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() | 425 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() |
423 { | 426 { |
424 m_resourceProvider->unlockForRead(m_resourceId); | 427 m_resourceProvider->unlockForRead(m_resourceId); |
425 } | 428 } |
426 | 429 |
430 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL(ResourceProvider* resourcePro vider, ResourceProvider::ResourceId resourceId, GLenum target, GLenum filter) | |
431 : ScopedReadLockGL(resourceProvider, resourceId) | |
432 { | |
433 resourceProvider->bindForSampling(resourceId, target, filter); | |
434 } | |
435 | |
427 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL(ResourceProvider* resourc eProvider, ResourceProvider::ResourceId resourceId) | 436 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL(ResourceProvider* resourc eProvider, ResourceProvider::ResourceId resourceId) |
428 : m_resourceProvider(resourceProvider) | 437 : m_resourceProvider(resourceProvider) |
429 , m_resourceId(resourceId) | 438 , m_resourceId(resourceId) |
430 , m_textureId(resourceProvider->lockForWrite(resourceId)->glId) | 439 , m_textureId(resourceProvider->lockForWrite(resourceId)->glId) |
431 { | 440 { |
432 DCHECK(m_textureId); | 441 DCHECK(m_textureId); |
433 } | 442 } |
434 | 443 |
435 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() | 444 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() |
436 { | 445 { |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
609 // (and is simpler) to wait. | 618 // (and is simpler) to wait. |
610 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); | 619 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); |
611 } | 620 } |
612 Child& childInfo = m_children.find(child)->second; | 621 Child& childInfo = m_children.find(child)->second; |
613 for (TransferableResourceArray::const_iterator it = resources.resources.begi n(); it != resources.resources.end(); ++it) { | 622 for (TransferableResourceArray::const_iterator it = resources.resources.begi n(); it != resources.resources.end(); ++it) { |
614 unsigned textureId; | 623 unsigned textureId; |
615 GLC(context3d, textureId = context3d->createTexture()); | 624 GLC(context3d, textureId = context3d->createTexture()); |
616 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 625 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
617 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail box.name)); | 626 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail box.name)); |
618 ResourceId id = m_nextId++; | 627 ResourceId id = m_nextId++; |
619 Resource resource(textureId, childInfo.pool, it->size, it->format); | 628 Resource resource(textureId, childInfo.pool, it->size, it->format, it->f ilter); |
620 resource.mailbox.setName(it->mailbox.name); | 629 resource.mailbox.setName(it->mailbox.name); |
621 m_resources[id] = resource; | 630 m_resources[id] = resource; |
622 childInfo.parentToChildMap[id] = it->id; | 631 childInfo.parentToChildMap[id] = it->id; |
623 childInfo.childToParentMap[it->id] = id; | 632 childInfo.childToParentMap[it->id] = id; |
624 } | 633 } |
625 } | 634 } |
626 | 635 |
627 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc es) | 636 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc es) |
628 { | 637 { |
629 DCHECK(m_threadChecker.CalledOnValidThread()); | 638 DCHECK(m_threadChecker.CalledOnValidThread()); |
(...skipping 25 matching lines...) Expand all Loading... | |
655 ResourceMap::iterator it = m_resources.find(id); | 664 ResourceMap::iterator it = m_resources.find(id); |
656 CHECK(it != m_resources.end()); | 665 CHECK(it != m_resources.end()); |
657 Resource* source = &it->second; | 666 Resource* source = &it->second; |
658 DCHECK(!source->lockedForWrite); | 667 DCHECK(!source->lockedForWrite); |
659 DCHECK(!source->lockForReadCount); | 668 DCHECK(!source->lockForReadCount); |
660 DCHECK(!source->external); | 669 DCHECK(!source->external); |
661 if (source->exported) | 670 if (source->exported) |
662 return false; | 671 return false; |
663 resource->id = id; | 672 resource->id = id; |
664 resource->format = source->format; | 673 resource->format = source->format; |
674 resource->filter = source->filter; | |
665 resource->size = source->size; | 675 resource->size = source->size; |
666 | 676 |
667 if (source->mailbox.isZero()) { | 677 if (source->mailbox.isZero()) { |
668 GLbyte name[GL_MAILBOX_SIZE_CHROMIUM]; | 678 GLbyte name[GL_MAILBOX_SIZE_CHROMIUM]; |
669 GLC(context3d, context3d->genMailboxCHROMIUM(name)); | 679 GLC(context3d, context3d->genMailboxCHROMIUM(name)); |
670 source->mailbox.setName(name); | 680 source->mailbox.setName(name); |
671 } | 681 } |
672 | 682 |
673 resource->mailbox = source->mailbox; | 683 resource->mailbox = source->mailbox; |
674 GLC(context, context->bindTexture(GL_TEXTURE_2D, source->glId)); | 684 GLC(context, context->bindTexture(GL_TEXTURE_2D, source->glId)); |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
828 resource->size.width(), | 838 resource->size.width(), |
829 resource->size.height()); | 839 resource->size.height()); |
830 src.setPixels(resource->pixelBuffer); | 840 src.setPixels(resource->pixelBuffer); |
831 | 841 |
832 ScopedWriteLockSoftware lock(this, id); | 842 ScopedWriteLockSoftware lock(this, id); |
833 SkCanvas* dest = lock.skCanvas(); | 843 SkCanvas* dest = lock.skCanvas(); |
834 dest->writePixels(src, 0, 0); | 844 dest->writePixels(src, 0, 0); |
835 } | 845 } |
836 } | 846 } |
837 | 847 |
848 void ResourceProvider::bindForSampling(ResourceProvider::ResourceId resourceId, GLenum target, GLenum filter) | |
849 { | |
850 DCHECK(m_threadChecker.CalledOnValidThread()); | |
851 WebGraphicsContext3D* context3d = m_context->context3D(); | |
852 ResourceMap::iterator it = m_resources.find(resourceId); | |
853 CHECK(it != m_resources.end()); | |
jamesr
2012/12/01 01:50:22
why not DCHECK() ?
Sami
2012/12/03 11:59:21
Most of the other methods here CHECK() for a valid
| |
854 Resource* resource = &it->second; | |
855 DCHECK(resource->lockForReadCount); | |
856 DCHECK(!resource->lockedForWrite); | |
857 | |
858 GLC(context3d, context3d->bindTexture(target, resource->glId)); | |
859 if (filter != resource->filter) { | |
860 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MIN_FILTER, f ilter)); | |
861 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MAG_FILTER, f ilter)); | |
862 resource->filter = filter; | |
863 } | |
864 } | |
865 | |
838 } // namespace cc | 866 } // namespace cc |
OLD | NEW |