Chromium Code Reviews| 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 |