| 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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 { | 47 { |
| 48 return (format == GL_RGBA || format == GL_BGRA_EXT); | 48 return (format == GL_RGBA || format == GL_BGRA_EXT); |
| 49 } | 49 } |
| 50 | 50 |
| 51 ResourceProvider::Resource::Resource() | 51 ResourceProvider::Resource::Resource() |
| 52 : glId(0) | 52 : glId(0) |
| 53 , glPixelBufferId(0) | 53 , glPixelBufferId(0) |
| 54 , glUploadQueryId(0) | 54 , glUploadQueryId(0) |
| 55 , pixels(0) | 55 , pixels(0) |
| 56 , pixelBuffer(0) | 56 , pixelBuffer(0) |
| 57 , pool(0) | |
| 58 , lockForReadCount(0) | 57 , lockForReadCount(0) |
| 59 , lockedForWrite(false) | 58 , lockedForWrite(false) |
| 60 , external(false) | 59 , external(false) |
| 61 , exported(false) | 60 , exported(false) |
| 62 , markedForDeletion(false) | 61 , markedForDeletion(false) |
| 63 , pendingSetPixels(false) | 62 , pendingSetPixels(false) |
| 64 , size() | 63 , size() |
| 65 , format(0) | 64 , format(0) |
| 66 , filter(0) | 65 , filter(0) |
| 67 , type(static_cast<ResourceType>(0)) | 66 , type(static_cast<ResourceType>(0)) |
| 68 { | 67 { |
| 69 } | 68 } |
| 70 | 69 |
| 71 ResourceProvider::Resource::Resource(unsigned textureId, int pool, const gfx::Si
ze& size, GLenum format, GLenum filter) | 70 ResourceProvider::Resource::Resource(unsigned textureId, const gfx::Size& size,
GLenum format, GLenum filter) |
| 72 : glId(textureId) | 71 : glId(textureId) |
| 73 , glPixelBufferId(0) | 72 , glPixelBufferId(0) |
| 74 , glUploadQueryId(0) | 73 , glUploadQueryId(0) |
| 75 , pixels(0) | 74 , pixels(0) |
| 76 , pixelBuffer(0) | 75 , pixelBuffer(0) |
| 77 , pool(pool) | |
| 78 , lockForReadCount(0) | 76 , lockForReadCount(0) |
| 79 , lockedForWrite(false) | 77 , lockedForWrite(false) |
| 80 , external(false) | 78 , external(false) |
| 81 , exported(false) | 79 , exported(false) |
| 82 , markedForDeletion(false) | 80 , markedForDeletion(false) |
| 83 , pendingSetPixels(false) | 81 , pendingSetPixels(false) |
| 84 , size(size) | 82 , size(size) |
| 85 , format(format) | 83 , format(format) |
| 86 , filter(filter) | 84 , filter(filter) |
| 87 , type(GLTexture) | 85 , type(GLTexture) |
| 88 { | 86 { |
| 89 } | 87 } |
| 90 | 88 |
| 91 ResourceProvider::Resource::Resource(uint8_t* pixels, int pool, const gfx::Size&
size, GLenum format, GLenum filter) | 89 ResourceProvider::Resource::Resource(uint8_t* pixels, const gfx::Size& size, GLe
num format, GLenum filter) |
| 92 : glId(0) | 90 : glId(0) |
| 93 , glPixelBufferId(0) | 91 , glPixelBufferId(0) |
| 94 , glUploadQueryId(0) | 92 , glUploadQueryId(0) |
| 95 , pixels(pixels) | 93 , pixels(pixels) |
| 96 , pixelBuffer(0) | 94 , pixelBuffer(0) |
| 97 , pool(pool) | |
| 98 , lockForReadCount(0) | 95 , lockForReadCount(0) |
| 99 , lockedForWrite(false) | 96 , lockedForWrite(false) |
| 100 , external(false) | 97 , external(false) |
| 101 , exported(false) | 98 , exported(false) |
| 102 , markedForDeletion(false) | 99 , markedForDeletion(false) |
| 103 , pendingSetPixels(false) | 100 , pendingSetPixels(false) |
| 104 , size(size) | 101 , size(size) |
| 105 , format(format) | 102 , format(format) |
| 106 , filter(filter) | 103 , filter(filter) |
| 107 , type(Bitmap) | 104 , type(Bitmap) |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 | 138 |
| 142 bool ResourceProvider::inUseByConsumer(ResourceId id) | 139 bool ResourceProvider::inUseByConsumer(ResourceId id) |
| 143 { | 140 { |
| 144 DCHECK(m_threadChecker.CalledOnValidThread()); | 141 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 145 ResourceMap::iterator it = m_resources.find(id); | 142 ResourceMap::iterator it = m_resources.find(id); |
| 146 CHECK(it != m_resources.end()); | 143 CHECK(it != m_resources.end()); |
| 147 Resource* resource = &it->second; | 144 Resource* resource = &it->second; |
| 148 return !!resource->lockForReadCount || resource->exported; | 145 return !!resource->lockForReadCount || resource->exported; |
| 149 } | 146 } |
| 150 | 147 |
| 151 ResourceProvider::ResourceId ResourceProvider::createResource(int pool, const gf
x::Size& size, GLenum format, TextureUsageHint hint) | 148 ResourceProvider::ResourceId ResourceProvider::createResource(const gfx::Size& s
ize, GLenum format, TextureUsageHint hint) |
| 152 { | 149 { |
| 153 switch (m_defaultResourceType) { | 150 switch (m_defaultResourceType) { |
| 154 case GLTexture: | 151 case GLTexture: |
| 155 return createGLTexture(pool, size, format, hint); | 152 return createGLTexture(size, format, hint); |
| 156 case Bitmap: | 153 case Bitmap: |
| 157 DCHECK(format == GL_RGBA); | 154 DCHECK(format == GL_RGBA); |
| 158 return createBitmap(pool, size); | 155 return createBitmap(size); |
| 159 } | 156 } |
| 160 | 157 |
| 161 LOG(FATAL) << "Invalid default resource type."; | 158 LOG(FATAL) << "Invalid default resource type."; |
| 162 return 0; | 159 return 0; |
| 163 } | 160 } |
| 164 | 161 |
| 165 ResourceProvider::ResourceId ResourceProvider::createGLTexture(int pool, const g
fx::Size& size, GLenum format, TextureUsageHint hint) | 162 ResourceProvider::ResourceId ResourceProvider::createGLTexture(const gfx::Size&
size, GLenum format, TextureUsageHint hint) |
| 166 { | 163 { |
| 167 DCHECK_LE(size.width(), m_maxTextureSize); | 164 DCHECK_LE(size.width(), m_maxTextureSize); |
| 168 DCHECK_LE(size.height(), m_maxTextureSize); | 165 DCHECK_LE(size.height(), m_maxTextureSize); |
| 169 | 166 |
| 170 DCHECK(m_threadChecker.CalledOnValidThread()); | 167 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 171 unsigned textureId = 0; | 168 unsigned textureId = 0; |
| 172 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 169 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
| 173 DCHECK(context3d); | 170 DCHECK(context3d); |
| 174 GLC(context3d, textureId = context3d->createTexture()); | 171 GLC(context3d, textureId = context3d->createTexture()); |
| 175 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 172 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
| 176 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); | 173 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); |
| 177 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); | 174 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); |
| 178 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); | 175 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); |
| 179 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); | 176 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); |
| 180 | 177 |
| 181 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) | 178 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) |
| 182 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_
ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); | 179 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_
ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); |
| 183 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { | 180 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { |
| 184 GLenum storageFormat = textureToStorageFormat(format); | 181 GLenum storageFormat = textureToStorageFormat(format); |
| 185 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma
t, size.width(), size.height())); | 182 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma
t, size.width(), size.height())); |
| 186 } else | 183 } else |
| 187 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt
h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); | 184 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt
h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); |
| 188 | 185 |
| 189 ResourceId id = m_nextId++; | 186 ResourceId id = m_nextId++; |
| 190 Resource resource(textureId, pool, size, format, GL_LINEAR); | 187 Resource resource(textureId, size, format, GL_LINEAR); |
| 191 m_resources[id] = resource; | 188 m_resources[id] = resource; |
| 192 return id; | 189 return id; |
| 193 } | 190 } |
| 194 | 191 |
| 195 ResourceProvider::ResourceId ResourceProvider::createBitmap(int pool, const gfx:
:Size& size) | 192 ResourceProvider::ResourceId ResourceProvider::createBitmap(const gfx::Size& siz
e) |
| 196 { | 193 { |
| 197 DCHECK(m_threadChecker.CalledOnValidThread()); | 194 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 198 | 195 |
| 199 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; | 196 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; |
| 200 | 197 |
| 201 ResourceId id = m_nextId++; | 198 ResourceId id = m_nextId++; |
| 202 Resource resource(pixels, pool, size, GL_RGBA, GL_LINEAR); | 199 Resource resource(pixels, size, GL_RGBA, GL_LINEAR); |
| 203 m_resources[id] = resource; | 200 m_resources[id] = resource; |
| 204 return id; | 201 return id; |
| 205 } | 202 } |
| 206 | 203 |
| 207 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture
(unsigned textureId) | 204 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture
(unsigned textureId) |
| 208 { | 205 { |
| 209 DCHECK(m_threadChecker.CalledOnValidThread()); | 206 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 210 | 207 |
| 211 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 208 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
| 212 DCHECK(context3d); | 209 DCHECK(context3d); |
| 213 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 210 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
| 214 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); | 211 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); |
| 215 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); | 212 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); |
| 216 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); | 213 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); |
| 217 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); | 214 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); |
| 218 | 215 |
| 219 ResourceId id = m_nextId++; | 216 ResourceId id = m_nextId++; |
| 220 Resource resource(textureId, 0, gfx::Size(), 0, GL_LINEAR); | 217 Resource resource(textureId, gfx::Size(), 0, GL_LINEAR); |
| 221 resource.external = true; | 218 resource.external = true; |
| 222 m_resources[id] = resource; | 219 m_resources[id] = resource; |
| 223 return id; | 220 return id; |
| 224 } | 221 } |
| 225 | 222 |
| 226 void ResourceProvider::deleteResource(ResourceId id) | 223 void ResourceProvider::deleteResource(ResourceId id) |
| 227 { | 224 { |
| 228 DCHECK(m_threadChecker.CalledOnValidThread()); | 225 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 229 ResourceMap::iterator it = m_resources.find(id); | 226 ResourceMap::iterator it = m_resources.find(id); |
| 230 CHECK(it != m_resources.end()); | 227 CHECK(it != m_resources.end()); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 259 GLC(context3d, context3d->deleteBuffer(resource->glPixelBufferId)); | 256 GLC(context3d, context3d->deleteBuffer(resource->glPixelBufferId)); |
| 260 } | 257 } |
| 261 if (resource->pixels) | 258 if (resource->pixels) |
| 262 delete[] resource->pixels; | 259 delete[] resource->pixels; |
| 263 if (resource->pixelBuffer) | 260 if (resource->pixelBuffer) |
| 264 delete[] resource->pixelBuffer; | 261 delete[] resource->pixelBuffer; |
| 265 | 262 |
| 266 m_resources.erase(it); | 263 m_resources.erase(it); |
| 267 } | 264 } |
| 268 | 265 |
| 269 void ResourceProvider::deleteOwnedResources(int pool) | |
| 270 { | |
| 271 DCHECK(m_threadChecker.CalledOnValidThread()); | |
| 272 ResourceIdArray toDelete; | |
| 273 for (ResourceMap::iterator it = m_resources.begin(); it != m_resources.end()
; ++it) { | |
| 274 if (it->second.pool == pool && !it->second.external && !it->second.marke
dForDeletion) | |
| 275 toDelete.push_back(it->first); | |
| 276 } | |
| 277 for (ResourceIdArray::iterator it = toDelete.begin(); it != toDelete.end();
++it) | |
| 278 deleteResource(*it); | |
| 279 } | |
| 280 | |
| 281 ResourceProvider::ResourceType ResourceProvider::resourceType(ResourceId id) | 266 ResourceProvider::ResourceType ResourceProvider::resourceType(ResourceId id) |
| 282 { | 267 { |
| 283 ResourceMap::iterator it = m_resources.find(id); | 268 ResourceMap::iterator it = m_resources.find(id); |
| 284 CHECK(it != m_resources.end()); | 269 CHECK(it != m_resources.end()); |
| 285 Resource* resource = &it->second; | 270 Resource* resource = &it->second; |
| 286 return resource->type; | 271 return resource->type; |
| 287 } | 272 } |
| 288 | 273 |
| 289 void ResourceProvider::setPixels(ResourceId id, const uint8_t* image, const gfx:
:Rect& imageRect, const gfx::Rect& sourceRect, const gfx::Vector2d& destOffset) | 274 void ResourceProvider::setPixels(ResourceId id, const uint8_t* image, const gfx:
:Rect& imageRect, const gfx::Rect& sourceRect, const gfx::Vector2d& destOffset) |
| 290 { | 275 { |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 } | 523 } |
| 539 | 524 |
| 540 m_textureCopier = AcceleratedTextureCopier::create(context3d, useBindUniform
); | 525 m_textureCopier = AcceleratedTextureCopier::create(context3d, useBindUniform
); |
| 541 | 526 |
| 542 m_textureUploader = TextureUploader::create(context3d, useMapSub, m_useShall
owFlush); | 527 m_textureUploader = TextureUploader::create(context3d, useMapSub, m_useShall
owFlush); |
| 543 GLC(context3d, context3d->getIntegerv(GL_MAX_TEXTURE_SIZE, &m_maxTextureSize
)); | 528 GLC(context3d, context3d->getIntegerv(GL_MAX_TEXTURE_SIZE, &m_maxTextureSize
)); |
| 544 m_bestTextureFormat = PlatformColor::bestTextureFormat(context3d, useBGRA); | 529 m_bestTextureFormat = PlatformColor::bestTextureFormat(context3d, useBGRA); |
| 545 return true; | 530 return true; |
| 546 } | 531 } |
| 547 | 532 |
| 548 int ResourceProvider::createChild(int pool) | 533 int ResourceProvider::createChild() |
| 549 { | 534 { |
| 550 DCHECK(m_threadChecker.CalledOnValidThread()); | 535 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 551 Child childInfo; | 536 Child childInfo; |
| 552 childInfo.pool = pool; | |
| 553 int child = m_nextChild++; | 537 int child = m_nextChild++; |
| 554 m_children[child] = childInfo; | 538 m_children[child] = childInfo; |
| 555 return child; | 539 return child; |
| 556 } | 540 } |
| 557 | 541 |
| 558 void ResourceProvider::destroyChild(int child) | 542 void ResourceProvider::destroyChild(int child_id) |
| 559 { | 543 { |
| 560 DCHECK(m_threadChecker.CalledOnValidThread()); | 544 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 561 ChildMap::iterator it = m_children.find(child); | 545 ChildMap::iterator it = m_children.find(child_id); |
| 562 DCHECK(it != m_children.end()); | 546 DCHECK(it != m_children.end()); |
| 563 deleteOwnedResources(it->second.pool); | 547 Child& child = it->second; |
| 548 for (ResourceIdMap::iterator child_it = child.childToParentMap.begin(); chil
d_it != child.childToParentMap.end(); ++child_it) |
| 549 deleteResource(child_it->second); |
| 564 m_children.erase(it); | 550 m_children.erase(it); |
| 565 } | 551 } |
| 566 | 552 |
| 567 const ResourceProvider::ResourceIdMap& ResourceProvider::getChildToParentMap(int
child) const | 553 const ResourceProvider::ResourceIdMap& ResourceProvider::getChildToParentMap(int
child) const |
| 568 { | 554 { |
| 569 DCHECK(m_threadChecker.CalledOnValidThread()); | 555 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 570 ChildMap::const_iterator it = m_children.find(child); | 556 ChildMap::const_iterator it = m_children.find(child); |
| 571 DCHECK(it != m_children.end()); | 557 DCHECK(it != m_children.end()); |
| 572 return it->second.childToParentMap; | 558 return it->second.childToParentMap; |
| 573 } | 559 } |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 // (and is simpler) to wait. | 622 // (and is simpler) to wait. |
| 637 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); | 623 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); |
| 638 } | 624 } |
| 639 Child& childInfo = m_children.find(child)->second; | 625 Child& childInfo = m_children.find(child)->second; |
| 640 for (TransferableResourceArray::const_iterator it = resources.resources.begi
n(); it != resources.resources.end(); ++it) { | 626 for (TransferableResourceArray::const_iterator it = resources.resources.begi
n(); it != resources.resources.end(); ++it) { |
| 641 unsigned textureId; | 627 unsigned textureId; |
| 642 GLC(context3d, textureId = context3d->createTexture()); | 628 GLC(context3d, textureId = context3d->createTexture()); |
| 643 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 629 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
| 644 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail
box.name)); | 630 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail
box.name)); |
| 645 ResourceId id = m_nextId++; | 631 ResourceId id = m_nextId++; |
| 646 Resource resource(textureId, childInfo.pool, it->size, it->format, it->f
ilter); | 632 Resource resource(textureId, it->size, it->format, it->filter); |
| 647 resource.mailbox.setName(it->mailbox.name); | 633 resource.mailbox.setName(it->mailbox.name); |
| 648 m_resources[id] = resource; | 634 m_resources[id] = resource; |
| 649 childInfo.parentToChildMap[id] = it->id; | 635 childInfo.parentToChildMap[id] = it->id; |
| 650 childInfo.childToParentMap[it->id] = id; | 636 childInfo.childToParentMap[it->id] = id; |
| 651 } | 637 } |
| 652 } | 638 } |
| 653 | 639 |
| 654 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc
es) | 640 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc
es) |
| 655 { | 641 { |
| 656 DCHECK(m_threadChecker.CalledOnValidThread()); | 642 DCHECK(m_threadChecker.CalledOnValidThread()); |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 949 return false; | 935 return false; |
| 950 } | 936 } |
| 951 | 937 |
| 952 resource->pendingSetPixels = false; | 938 resource->pendingSetPixels = false; |
| 953 unlockForWrite(id); | 939 unlockForWrite(id); |
| 954 | 940 |
| 955 return true; | 941 return true; |
| 956 } | 942 } |
| 957 | 943 |
| 958 } // namespace cc | 944 } // namespace cc |
| OLD | NEW |