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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 : glId(0) | 51 : glId(0) |
52 , pixels(0) | 52 , pixels(0) |
53 , pool(0) | 53 , pool(0) |
54 , lockForReadCount(0) | 54 , lockForReadCount(0) |
55 , lockedForWrite(false) | 55 , lockedForWrite(false) |
56 , external(false) | 56 , external(false) |
57 , exported(false) | 57 , exported(false) |
58 , markedForDeletion(false) | 58 , markedForDeletion(false) |
59 , size() | 59 , size() |
60 , format(0) | 60 , format(0) |
| 61 , minFilter(0) |
| 62 , magFilter(0) |
61 , type(static_cast<ResourceType>(0)) | 63 , type(static_cast<ResourceType>(0)) |
62 { | 64 { |
63 } | 65 } |
64 | 66 |
65 ResourceProvider::Resource::Resource(unsigned textureId, int pool, const gfx::Si
ze& size, GLenum format) | 67 ResourceProvider::Resource::Resource(unsigned textureId, int pool, const gfx::Si
ze& size, GLenum format, GLenum minFilter, GLenum magFilter) |
66 : glId(textureId) | 68 : glId(textureId) |
67 , pixels(0) | 69 , pixels(0) |
68 , pool(pool) | 70 , pool(pool) |
69 , lockForReadCount(0) | 71 , lockForReadCount(0) |
70 , lockedForWrite(false) | 72 , lockedForWrite(false) |
71 , external(false) | 73 , external(false) |
72 , exported(false) | 74 , exported(false) |
73 , markedForDeletion(false) | 75 , markedForDeletion(false) |
74 , size(size) | 76 , size(size) |
75 , format(format) | 77 , format(format) |
| 78 , minFilter(minFilter) |
| 79 , magFilter(magFilter) |
76 , type(GLTexture) | 80 , type(GLTexture) |
77 { | 81 { |
78 } | 82 } |
79 | 83 |
80 ResourceProvider::Resource::Resource(uint8_t* pixels, int pool, const gfx::Size&
size, GLenum format) | 84 ResourceProvider::Resource::Resource(uint8_t* pixels, int pool, const gfx::Size&
size, GLenum format, GLenum minFilter, GLenum magFilter) |
81 : glId(0) | 85 : glId(0) |
82 , pixels(pixels) | 86 , pixels(pixels) |
83 , pool(pool) | 87 , pool(pool) |
84 , lockForReadCount(0) | 88 , lockForReadCount(0) |
85 , lockedForWrite(false) | 89 , lockedForWrite(false) |
86 , external(false) | 90 , external(false) |
87 , exported(false) | 91 , exported(false) |
88 , markedForDeletion(false) | 92 , markedForDeletion(false) |
89 , size(size) | 93 , size(size) |
90 , format(format) | 94 , format(format) |
| 95 , minFilter(minFilter) |
| 96 , magFilter(magFilter) |
91 , type(Bitmap) | 97 , type(Bitmap) |
92 { | 98 { |
93 } | 99 } |
94 | 100 |
95 ResourceProvider::Child::Child() | 101 ResourceProvider::Child::Child() |
96 { | 102 { |
97 } | 103 } |
98 | 104 |
99 ResourceProvider::Child::~Child() | 105 ResourceProvider::Child::~Child() |
100 { | 106 { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 | 167 |
162 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) | 168 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) |
163 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_
ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); | 169 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_
ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); |
164 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { | 170 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { |
165 GLenum storageFormat = textureToStorageFormat(format); | 171 GLenum storageFormat = textureToStorageFormat(format); |
166 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma
t, size.width(), size.height())); | 172 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma
t, size.width(), size.height())); |
167 } else | 173 } else |
168 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt
h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); | 174 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt
h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); |
169 | 175 |
170 ResourceId id = m_nextId++; | 176 ResourceId id = m_nextId++; |
171 Resource resource(textureId, pool, size, format); | 177 Resource resource(textureId, pool, size, format, GL_LINEAR, GL_LINEAR); |
172 m_resources[id] = resource; | 178 m_resources[id] = resource; |
173 return id; | 179 return id; |
174 } | 180 } |
175 | 181 |
176 ResourceProvider::ResourceId ResourceProvider::createBitmap(int pool, const gfx:
:Size& size) | 182 ResourceProvider::ResourceId ResourceProvider::createBitmap(int pool, const gfx:
:Size& size) |
177 { | 183 { |
178 DCHECK(m_threadChecker.CalledOnValidThread()); | 184 DCHECK(m_threadChecker.CalledOnValidThread()); |
179 | 185 |
180 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; | 186 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; |
181 | 187 |
182 ResourceId id = m_nextId++; | 188 ResourceId id = m_nextId++; |
183 Resource resource(pixels, pool, size, GL_RGBA); | 189 Resource resource(pixels, pool, size, GL_RGBA, GL_LINEAR, GL_LINEAR); |
184 m_resources[id] = resource; | 190 m_resources[id] = resource; |
185 return id; | 191 return id; |
186 } | 192 } |
187 | 193 |
188 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture
(unsigned textureId) | 194 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture
(unsigned textureId) |
189 { | 195 { |
190 DCHECK(m_threadChecker.CalledOnValidThread()); | 196 DCHECK(m_threadChecker.CalledOnValidThread()); |
191 | 197 |
192 WebGraphicsContext3D* context3d = m_context->context3D(); | 198 WebGraphicsContext3D* context3d = m_context->context3D(); |
193 DCHECK(context3d); | 199 DCHECK(context3d); |
194 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 200 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
195 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); | 201 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); |
196 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); | 202 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); |
197 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); | 203 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); |
198 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); | 204 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); |
199 | 205 |
200 ResourceId id = m_nextId++; | 206 ResourceId id = m_nextId++; |
201 Resource resource(textureId, 0, gfx::Size(), 0); | 207 Resource resource(textureId, 0, gfx::Size(), 0, GL_LINEAR, GL_LINEAR); |
202 resource.external = true; | 208 resource.external = true; |
203 m_resources[id] = resource; | 209 m_resources[id] = resource; |
204 return id; | 210 return id; |
205 } | 211 } |
206 | 212 |
207 void ResourceProvider::deleteResource(ResourceId id) | 213 void ResourceProvider::deleteResource(ResourceId id) |
208 { | 214 { |
209 DCHECK(m_threadChecker.CalledOnValidThread()); | 215 DCHECK(m_threadChecker.CalledOnValidThread()); |
210 ResourceMap::iterator it = m_resources.find(id); | 216 ResourceMap::iterator it = m_resources.find(id); |
211 CHECK(it != m_resources.end()); | 217 CHECK(it != m_resources.end()); |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 , m_textureId(resourceProvider->lockForRead(resourceId)->glId) | 407 , m_textureId(resourceProvider->lockForRead(resourceId)->glId) |
402 { | 408 { |
403 DCHECK(m_textureId); | 409 DCHECK(m_textureId); |
404 } | 410 } |
405 | 411 |
406 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() | 412 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() |
407 { | 413 { |
408 m_resourceProvider->unlockForRead(m_resourceId); | 414 m_resourceProvider->unlockForRead(m_resourceId); |
409 } | 415 } |
410 | 416 |
| 417 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL(ResourceProvider* resourcePro
vider, ResourceProvider::ResourceId resourceId, GLenum target, GLenum minFilter,
GLenum magFilter) |
| 418 : ScopedReadLockGL(resourceProvider, resourceId) |
| 419 { |
| 420 resourceProvider->bindForSampling(resourceId, target, minFilter, magFilter); |
| 421 } |
| 422 |
411 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL(ResourceProvider* resourc
eProvider, ResourceProvider::ResourceId resourceId) | 423 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL(ResourceProvider* resourc
eProvider, ResourceProvider::ResourceId resourceId) |
412 : m_resourceProvider(resourceProvider) | 424 : m_resourceProvider(resourceProvider) |
413 , m_resourceId(resourceId) | 425 , m_resourceId(resourceId) |
414 , m_textureId(resourceProvider->lockForWrite(resourceId)->glId) | 426 , m_textureId(resourceProvider->lockForWrite(resourceId)->glId) |
415 { | 427 { |
416 DCHECK(m_textureId); | 428 DCHECK(m_textureId); |
417 } | 429 } |
418 | 430 |
419 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() | 431 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() |
420 { | 432 { |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
593 // (and is simpler) to wait. | 605 // (and is simpler) to wait. |
594 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); | 606 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); |
595 } | 607 } |
596 Child& childInfo = m_children.find(child)->second; | 608 Child& childInfo = m_children.find(child)->second; |
597 for (TransferableResourceArray::const_iterator it = resources.resources.begi
n(); it != resources.resources.end(); ++it) { | 609 for (TransferableResourceArray::const_iterator it = resources.resources.begi
n(); it != resources.resources.end(); ++it) { |
598 unsigned textureId; | 610 unsigned textureId; |
599 GLC(context3d, textureId = context3d->createTexture()); | 611 GLC(context3d, textureId = context3d->createTexture()); |
600 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 612 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
601 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail
box.name)); | 613 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail
box.name)); |
602 ResourceId id = m_nextId++; | 614 ResourceId id = m_nextId++; |
603 Resource resource(textureId, childInfo.pool, it->size, it->format); | 615 Resource resource(textureId, childInfo.pool, it->size, it->format, it->m
inFilter, it->magFilter); |
604 resource.mailbox.setName(it->mailbox.name); | 616 resource.mailbox.setName(it->mailbox.name); |
605 m_resources[id] = resource; | 617 m_resources[id] = resource; |
606 childInfo.parentToChildMap[id] = it->id; | 618 childInfo.parentToChildMap[id] = it->id; |
607 childInfo.childToParentMap[it->id] = id; | 619 childInfo.childToParentMap[it->id] = id; |
608 } | 620 } |
609 } | 621 } |
610 | 622 |
611 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc
es) | 623 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc
es) |
612 { | 624 { |
613 DCHECK(m_threadChecker.CalledOnValidThread()); | 625 DCHECK(m_threadChecker.CalledOnValidThread()); |
(...skipping 25 matching lines...) Expand all Loading... |
639 ResourceMap::iterator it = m_resources.find(id); | 651 ResourceMap::iterator it = m_resources.find(id); |
640 CHECK(it != m_resources.end()); | 652 CHECK(it != m_resources.end()); |
641 Resource* source = &it->second; | 653 Resource* source = &it->second; |
642 DCHECK(!source->lockedForWrite); | 654 DCHECK(!source->lockedForWrite); |
643 DCHECK(!source->lockForReadCount); | 655 DCHECK(!source->lockForReadCount); |
644 DCHECK(!source->external); | 656 DCHECK(!source->external); |
645 if (source->exported) | 657 if (source->exported) |
646 return false; | 658 return false; |
647 resource->id = id; | 659 resource->id = id; |
648 resource->format = source->format; | 660 resource->format = source->format; |
| 661 resource->minFilter = source->minFilter; |
| 662 resource->magFilter = source->magFilter; |
649 resource->size = source->size; | 663 resource->size = source->size; |
650 | 664 |
651 if (source->mailbox.isZero()) { | 665 if (source->mailbox.isZero()) { |
652 GLbyte name[GL_MAILBOX_SIZE_CHROMIUM]; | 666 GLbyte name[GL_MAILBOX_SIZE_CHROMIUM]; |
653 GLC(context3d, context3d->genMailboxCHROMIUM(name)); | 667 GLC(context3d, context3d->genMailboxCHROMIUM(name)); |
654 source->mailbox.setName(name); | 668 source->mailbox.setName(name); |
655 } | 669 } |
656 | 670 |
657 resource->mailbox = source->mailbox; | 671 resource->mailbox = source->mailbox; |
658 GLC(context, context->bindTexture(GL_TEXTURE_2D, source->glId)); | 672 GLC(context, context->bindTexture(GL_TEXTURE_2D, source->glId)); |
659 GLC(context, context->produceTextureCHROMIUM(GL_TEXTURE_2D, resource->mailbo
x.name)); | 673 GLC(context, context->produceTextureCHROMIUM(GL_TEXTURE_2D, resource->mailbo
x.name)); |
660 return true; | 674 return true; |
661 } | 675 } |
662 | 676 |
| 677 void ResourceProvider::bindForSampling(ResourceProvider::ResourceId resourceId,
GLenum target, GLenum minFilter, GLenum magFilter) |
| 678 { |
| 679 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 680 WebGraphicsContext3D* context3d = m_context->context3D(); |
| 681 ResourceMap::iterator it = m_resources.find(resourceId); |
| 682 CHECK(it != m_resources.end()); |
| 683 Resource* resource = &it->second; |
| 684 DCHECK(resource->lockForReadCount); |
| 685 DCHECK(!resource->lockedForWrite); |
| 686 |
| 687 GLC(context3d, context3d->bindTexture(target, resource->glId)); |
| 688 if (minFilter != resource->minFilter) { |
| 689 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MIN_FILTER, m
inFilter)); |
| 690 resource->minFilter = minFilter; |
| 691 } |
| 692 if (magFilter != resource->magFilter) { |
| 693 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MAG_FILTER, m
agFilter)); |
| 694 resource->magFilter = magFilter; |
| 695 } |
| 696 } |
| 697 |
663 } // namespace cc | 698 } // namespace cc |
OLD | NEW |