| 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 , glPixelBufferId(0) | 52 , glPixelBufferId(0) |
| 53 , glUploadQueryId(0) | 53 , glUploadQueryId(0) |
| 54 , pixels(0) | 54 , pixels(0) |
| 55 , pixelBuffer(0) | 55 , pixelBuffer(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 , pendingSetPixels(false) | 61 , pendingSetPixels(false) |
| 62 , allocated(false) |
| 62 , size() | 63 , size() |
| 63 , format(0) | 64 , format(0) |
| 64 , filter(0) | 65 , filter(0) |
| 65 , type(static_cast<ResourceType>(0)) | 66 , type(static_cast<ResourceType>(0)) |
| 66 { | 67 { |
| 67 } | 68 } |
| 68 | 69 |
| 69 ResourceProvider::Resource::~Resource() | 70 ResourceProvider::Resource::~Resource() |
| 70 { | 71 { |
| 71 } | 72 } |
| 72 | 73 |
| 73 ResourceProvider::Resource::Resource(unsigned textureId, const gfx::Size& size,
GLenum format, GLenum filter) | 74 ResourceProvider::Resource::Resource(unsigned textureId, const gfx::Size& size,
GLenum format, GLenum filter) |
| 74 : glId(textureId) | 75 : glId(textureId) |
| 75 , glPixelBufferId(0) | 76 , glPixelBufferId(0) |
| 76 , glUploadQueryId(0) | 77 , glUploadQueryId(0) |
| 77 , pixels(0) | 78 , pixels(0) |
| 78 , pixelBuffer(0) | 79 , pixelBuffer(0) |
| 79 , lockForReadCount(0) | 80 , lockForReadCount(0) |
| 80 , lockedForWrite(false) | 81 , lockedForWrite(false) |
| 81 , external(false) | 82 , external(false) |
| 82 , exported(false) | 83 , exported(false) |
| 83 , markedForDeletion(false) | 84 , markedForDeletion(false) |
| 84 , pendingSetPixels(false) | 85 , pendingSetPixels(false) |
| 86 , allocated(false) |
| 85 , size(size) | 87 , size(size) |
| 86 , format(format) | 88 , format(format) |
| 87 , filter(filter) | 89 , filter(filter) |
| 88 , type(GLTexture) | 90 , type(GLTexture) |
| 89 { | 91 { |
| 90 } | 92 } |
| 91 | 93 |
| 92 ResourceProvider::Resource::Resource(uint8_t* pixels, const gfx::Size& size, GLe
num format, GLenum filter) | 94 ResourceProvider::Resource::Resource(uint8_t* pixels, const gfx::Size& size, GLe
num format, GLenum filter) |
| 93 : glId(0) | 95 : glId(0) |
| 94 , glPixelBufferId(0) | 96 , glPixelBufferId(0) |
| 95 , glUploadQueryId(0) | 97 , glUploadQueryId(0) |
| 96 , pixels(pixels) | 98 , pixels(pixels) |
| 97 , pixelBuffer(0) | 99 , pixelBuffer(0) |
| 98 , lockForReadCount(0) | 100 , lockForReadCount(0) |
| 99 , lockedForWrite(false) | 101 , lockedForWrite(false) |
| 100 , external(false) | 102 , external(false) |
| 101 , exported(false) | 103 , exported(false) |
| 102 , markedForDeletion(false) | 104 , markedForDeletion(false) |
| 103 , pendingSetPixels(false) | 105 , pendingSetPixels(false) |
| 106 , allocated(false) |
| 104 , size(size) | 107 , size(size) |
| 105 , format(format) | 108 , format(format) |
| 106 , filter(filter) | 109 , filter(filter) |
| 107 , type(Bitmap) | 110 , type(Bitmap) |
| 108 { | 111 { |
| 109 } | 112 } |
| 110 | 113 |
| 111 ResourceProvider::Child::Child() | 114 ResourceProvider::Child::Child() |
| 112 { | 115 { |
| 113 } | 116 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 { | 183 { |
| 181 DCHECK_LE(size.width(), m_maxTextureSize); | 184 DCHECK_LE(size.width(), m_maxTextureSize); |
| 182 DCHECK_LE(size.height(), m_maxTextureSize); | 185 DCHECK_LE(size.height(), m_maxTextureSize); |
| 183 | 186 |
| 184 DCHECK(m_threadChecker.CalledOnValidThread()); | 187 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 185 unsigned textureId = 0; | 188 unsigned textureId = 0; |
| 186 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 189 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
| 187 DCHECK(context3d); | 190 DCHECK(context3d); |
| 188 GLC(context3d, textureId = context3d->createTexture()); | 191 GLC(context3d, textureId = context3d->createTexture()); |
| 189 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 192 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
| 193 |
| 194 // Set texture properties. Allocation is delayed until needed. |
| 190 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); | 195 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); |
| 191 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); | 196 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); |
| 192 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); | 197 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); |
| 193 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); | 198 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); |
| 194 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROM
IUM, texturePool)); | 199 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROM
IUM, texturePool)); |
| 195 | |
| 196 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) | 200 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) |
| 197 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_
ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); | 201 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_
ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); |
| 198 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { | |
| 199 GLenum storageFormat = textureToStorageFormat(format); | |
| 200 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma
t, size.width(), size.height())); | |
| 201 } else | |
| 202 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt
h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); | |
| 203 | 202 |
| 204 ResourceId id = m_nextId++; | 203 ResourceId id = m_nextId++; |
| 205 Resource resource(textureId, size, format, GL_LINEAR); | 204 Resource resource(textureId, size, format, GL_LINEAR); |
| 205 resource.allocated = false; |
| 206 m_resources[id] = resource; | 206 m_resources[id] = resource; |
| 207 return id; | 207 return id; |
| 208 } | 208 } |
| 209 | 209 |
| 210 ResourceProvider::ResourceId ResourceProvider::createBitmap(const gfx::Size& siz
e) | 210 ResourceProvider::ResourceId ResourceProvider::createBitmap(const gfx::Size& siz
e) |
| 211 { | 211 { |
| 212 DCHECK(m_threadChecker.CalledOnValidThread()); | 212 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 213 | 213 |
| 214 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; | 214 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; |
| 215 | 215 |
| 216 ResourceId id = m_nextId++; | 216 ResourceId id = m_nextId++; |
| 217 Resource resource(pixels, size, GL_RGBA, GL_LINEAR); | 217 Resource resource(pixels, size, GL_RGBA, GL_LINEAR); |
| 218 resource.allocated = true; |
| 218 m_resources[id] = resource; | 219 m_resources[id] = resource; |
| 219 return id; | 220 return id; |
| 220 } | 221 } |
| 221 | 222 |
| 222 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture
(unsigned textureId) | 223 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture
(unsigned textureId) |
| 223 { | 224 { |
| 224 DCHECK(m_threadChecker.CalledOnValidThread()); | 225 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 225 | 226 |
| 226 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 227 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
| 227 DCHECK(context3d); | 228 DCHECK(context3d); |
| 228 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 229 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
| 229 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); | 230 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); |
| 230 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); | 231 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); |
| 231 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); | 232 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); |
| 232 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); | 233 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); |
| 233 | 234 |
| 234 ResourceId id = m_nextId++; | 235 ResourceId id = m_nextId++; |
| 235 Resource resource(textureId, gfx::Size(), 0, GL_LINEAR); | 236 Resource resource(textureId, gfx::Size(), 0, GL_LINEAR); |
| 236 resource.external = true; | 237 resource.external = true; |
| 238 resource.allocated = true; |
| 237 m_resources[id] = resource; | 239 m_resources[id] = resource; |
| 238 return id; | 240 return id; |
| 239 } | 241 } |
| 240 | 242 |
| 241 ResourceProvider::ResourceId ResourceProvider::createResourceFromTextureMailbox(
const std::string& mailbox, const base::Callback<void(unsigned)>& releaseCallbac
k) | 243 ResourceProvider::ResourceId ResourceProvider::createResourceFromTextureMailbox(
const std::string& mailbox, const base::Callback<void(unsigned)>& releaseCallbac
k) |
| 242 { | 244 { |
| 243 DCHECK(m_threadChecker.CalledOnValidThread()); | 245 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 244 | 246 |
| 245 // FIXME: As an optimization, delay consuming the mailbox | 247 // FIXME: As an optimization, delay consuming the mailbox |
| 246 // and creating the texture ID until lockForRead. | 248 // and creating the texture ID until lockForRead. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 259 m_resources[id] = resource; | 261 m_resources[id] = resource; |
| 260 return id; | 262 return id; |
| 261 } | 263 } |
| 262 | 264 |
| 263 void ResourceProvider::deleteResource(ResourceId id) | 265 void ResourceProvider::deleteResource(ResourceId id) |
| 264 { | 266 { |
| 265 DCHECK(m_threadChecker.CalledOnValidThread()); | 267 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 266 ResourceMap::iterator it = m_resources.find(id); | 268 ResourceMap::iterator it = m_resources.find(id); |
| 267 CHECK(it != m_resources.end()); | 269 CHECK(it != m_resources.end()); |
| 268 Resource* resource = &it->second; | 270 Resource* resource = &it->second; |
| 269 DCHECK(!resource->lockedForWrite); | |
| 270 DCHECK(!resource->lockForReadCount); | 271 DCHECK(!resource->lockForReadCount); |
| 271 DCHECK(!resource->markedForDeletion); | 272 DCHECK(!resource->markedForDeletion); |
| 273 DCHECK(resource->pendingSetPixels || !resource->lockedForWrite); |
| 272 | 274 |
| 273 if (resource->exported) { | 275 if (resource->exported) { |
| 274 resource->markedForDeletion = true; | 276 resource->markedForDeletion = true; |
| 275 return; | 277 return; |
| 276 } else | 278 } else |
| 277 deleteResourceInternal(it); | 279 deleteResourceInternal(it); |
| 278 } | 280 } |
| 279 | 281 |
| 280 void ResourceProvider::deleteResourceInternal(ResourceMap::iterator it) | 282 void ResourceProvider::deleteResourceInternal(ResourceMap::iterator it) |
| 281 { | 283 { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 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) |
| 326 { | 328 { |
| 327 DCHECK(m_threadChecker.CalledOnValidThread()); | 329 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 328 ResourceMap::iterator it = m_resources.find(id); | 330 ResourceMap::iterator it = m_resources.find(id); |
| 329 CHECK(it != m_resources.end()); | 331 CHECK(it != m_resources.end()); |
| 330 Resource* resource = &it->second; | 332 Resource* resource = &it->second; |
| 331 DCHECK(!resource->lockedForWrite); | 333 DCHECK(!resource->lockedForWrite); |
| 332 DCHECK(!resource->lockForReadCount); | 334 DCHECK(!resource->lockForReadCount); |
| 333 DCHECK(!resource->external); | 335 DCHECK(!resource->external); |
| 334 DCHECK(!resource->exported); | 336 DCHECK(!resource->exported); |
| 337 lazyAllocate(resource); |
| 335 | 338 |
| 336 if (resource->glId) { | 339 if (resource->glId) { |
| 340 DCHECK(!resource->pendingSetPixels); |
| 337 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 341 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
| 338 DCHECK(context3d); | 342 DCHECK(context3d); |
| 339 DCHECK(m_textureUploader.get()); | 343 DCHECK(m_textureUploader.get()); |
| 340 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); | 344 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); |
| 341 m_textureUploader->upload(image, | 345 m_textureUploader->upload(image, |
| 342 imageRect, | 346 imageRect, |
| 343 sourceRect, | 347 sourceRect, |
| 344 destOffset, | 348 destOffset, |
| 345 resource->format, | 349 resource->format, |
| 346 resource->size); | 350 resource->size); |
| 347 } | 351 } |
| 348 | 352 |
| 349 if (resource->pixels) { | 353 if (resource->pixels) { |
| 354 DCHECK(resource->allocated); |
| 350 DCHECK(resource->format == GL_RGBA); | 355 DCHECK(resource->format == GL_RGBA); |
| 351 SkBitmap srcFull; | 356 SkBitmap srcFull; |
| 352 srcFull.setConfig(SkBitmap::kARGB_8888_Config, imageRect.width(), imageR
ect.height()); | 357 srcFull.setConfig(SkBitmap::kARGB_8888_Config, imageRect.width(), imageR
ect.height()); |
| 353 srcFull.setPixels(const_cast<uint8_t*>(image)); | 358 srcFull.setPixels(const_cast<uint8_t*>(image)); |
| 354 SkBitmap srcSubset; | 359 SkBitmap srcSubset; |
| 355 SkIRect skSourceRect = SkIRect::MakeXYWH(sourceRect.x(), sourceRect.y(),
sourceRect.width(), sourceRect.height()); | 360 SkIRect skSourceRect = SkIRect::MakeXYWH(sourceRect.x(), sourceRect.y(),
sourceRect.width(), sourceRect.height()); |
| 356 skSourceRect.offset(-imageRect.x(), -imageRect.y()); | 361 skSourceRect.offset(-imageRect.x(), -imageRect.y()); |
| 357 srcFull.extractSubset(&srcSubset, skSourceRect); | 362 srcFull.extractSubset(&srcSubset, skSourceRect); |
| 358 | 363 |
| 359 ScopedWriteLockSoftware lock(this, id); | 364 ScopedWriteLockSoftware lock(this, id); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 } | 419 } |
| 415 | 420 |
| 416 const ResourceProvider::Resource* ResourceProvider::lockForRead(ResourceId id) | 421 const ResourceProvider::Resource* ResourceProvider::lockForRead(ResourceId id) |
| 417 { | 422 { |
| 418 DCHECK(m_threadChecker.CalledOnValidThread()); | 423 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 419 ResourceMap::iterator it = m_resources.find(id); | 424 ResourceMap::iterator it = m_resources.find(id); |
| 420 CHECK(it != m_resources.end()); | 425 CHECK(it != m_resources.end()); |
| 421 Resource* resource = &it->second; | 426 Resource* resource = &it->second; |
| 422 DCHECK(!resource->lockedForWrite); | 427 DCHECK(!resource->lockedForWrite); |
| 423 DCHECK(!resource->exported); | 428 DCHECK(!resource->exported); |
| 429 DCHECK(resource->allocated); // Uninitialized! Call setPixels or lockForWrit
e first. |
| 430 |
| 424 resource->lockForReadCount++; | 431 resource->lockForReadCount++; |
| 425 return resource; | 432 return resource; |
| 426 } | 433 } |
| 427 | 434 |
| 428 void ResourceProvider::unlockForRead(ResourceId id) | 435 void ResourceProvider::unlockForRead(ResourceId id) |
| 429 { | 436 { |
| 430 DCHECK(m_threadChecker.CalledOnValidThread()); | 437 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 431 ResourceMap::iterator it = m_resources.find(id); | 438 ResourceMap::iterator it = m_resources.find(id); |
| 432 CHECK(it != m_resources.end()); | 439 CHECK(it != m_resources.end()); |
| 433 Resource* resource = &it->second; | 440 Resource* resource = &it->second; |
| 434 DCHECK(resource->lockForReadCount > 0); | 441 DCHECK(resource->lockForReadCount > 0); |
| 435 DCHECK(!resource->exported); | 442 DCHECK(!resource->exported); |
| 436 resource->lockForReadCount--; | 443 resource->lockForReadCount--; |
| 437 } | 444 } |
| 438 | 445 |
| 439 const ResourceProvider::Resource* ResourceProvider::lockForWrite(ResourceId id) | 446 const ResourceProvider::Resource* ResourceProvider::lockForWrite(ResourceId id) |
| 440 { | 447 { |
| 441 DCHECK(m_threadChecker.CalledOnValidThread()); | 448 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 442 ResourceMap::iterator it = m_resources.find(id); | 449 ResourceMap::iterator it = m_resources.find(id); |
| 443 CHECK(it != m_resources.end()); | 450 CHECK(it != m_resources.end()); |
| 444 Resource* resource = &it->second; | 451 Resource* resource = &it->second; |
| 445 DCHECK(!resource->lockedForWrite); | 452 DCHECK(!resource->lockedForWrite); |
| 446 DCHECK(!resource->lockForReadCount); | 453 DCHECK(!resource->lockForReadCount); |
| 447 DCHECK(!resource->exported); | 454 DCHECK(!resource->exported); |
| 448 DCHECK(!resource->external); | 455 DCHECK(!resource->external); |
| 456 lazyAllocate(resource); |
| 457 |
| 449 resource->lockedForWrite = true; | 458 resource->lockedForWrite = true; |
| 450 return resource; | 459 return resource; |
| 451 } | 460 } |
| 452 | 461 |
| 453 void ResourceProvider::unlockForWrite(ResourceId id) | 462 void ResourceProvider::unlockForWrite(ResourceId id) |
| 454 { | 463 { |
| 455 DCHECK(m_threadChecker.CalledOnValidThread()); | 464 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 456 ResourceMap::iterator it = m_resources.find(id); | 465 ResourceMap::iterator it = m_resources.find(id); |
| 457 CHECK(it != m_resources.end()); | 466 CHECK(it != m_resources.end()); |
| 458 Resource* resource = &it->second; | 467 Resource* resource = &it->second; |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 } | 684 } |
| 676 Child& childInfo = m_children.find(child)->second; | 685 Child& childInfo = m_children.find(child)->second; |
| 677 for (TransferableResourceArray::const_iterator it = resources.resources.begi
n(); it != resources.resources.end(); ++it) { | 686 for (TransferableResourceArray::const_iterator it = resources.resources.begi
n(); it != resources.resources.end(); ++it) { |
| 678 unsigned textureId; | 687 unsigned textureId; |
| 679 GLC(context3d, textureId = context3d->createTexture()); | 688 GLC(context3d, textureId = context3d->createTexture()); |
| 680 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 689 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
| 681 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail
box.name)); | 690 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail
box.name)); |
| 682 ResourceId id = m_nextId++; | 691 ResourceId id = m_nextId++; |
| 683 Resource resource(textureId, it->size, it->format, it->filter); | 692 Resource resource(textureId, it->size, it->format, it->filter); |
| 684 resource.mailbox.setName(it->mailbox.name); | 693 resource.mailbox.setName(it->mailbox.name); |
| 694 // Don't allocate a texture for a child. |
| 695 resource.allocated = true; |
| 685 m_resources[id] = resource; | 696 m_resources[id] = resource; |
| 686 childInfo.parentToChildMap[id] = it->id; | 697 childInfo.parentToChildMap[id] = it->id; |
| 687 childInfo.childToParentMap[it->id] = id; | 698 childInfo.childToParentMap[it->id] = id; |
| 688 } | 699 } |
| 689 } | 700 } |
| 690 | 701 |
| 691 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc
es) | 702 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc
es) |
| 692 { | 703 { |
| 693 DCHECK(m_threadChecker.CalledOnValidThread()); | 704 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 694 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 705 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 715 bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI
d id, TransferableResource* resource) | 726 bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI
d id, TransferableResource* resource) |
| 716 { | 727 { |
| 717 DCHECK(m_threadChecker.CalledOnValidThread()); | 728 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 718 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 729 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
| 719 ResourceMap::iterator it = m_resources.find(id); | 730 ResourceMap::iterator it = m_resources.find(id); |
| 720 CHECK(it != m_resources.end()); | 731 CHECK(it != m_resources.end()); |
| 721 Resource* source = &it->second; | 732 Resource* source = &it->second; |
| 722 DCHECK(!source->lockedForWrite); | 733 DCHECK(!source->lockedForWrite); |
| 723 DCHECK(!source->lockForReadCount); | 734 DCHECK(!source->lockForReadCount); |
| 724 DCHECK(!source->external || (source->external && !source->mailbox.isZero()))
; | 735 DCHECK(!source->external || (source->external && !source->mailbox.isZero()))
; |
| 736 DCHECK(source->allocated); |
| 725 if (source->exported) | 737 if (source->exported) |
| 726 return false; | 738 return false; |
| 727 resource->id = id; | 739 resource->id = id; |
| 728 resource->format = source->format; | 740 resource->format = source->format; |
| 729 resource->filter = source->filter; | 741 resource->filter = source->filter; |
| 730 resource->size = source->size; | 742 resource->size = source->size; |
| 731 | 743 |
| 732 if (source->mailbox.isZero()) { | 744 if (source->mailbox.isZero()) { |
| 733 GLbyte name[GL_MAILBOX_SIZE_CHROMIUM]; | 745 GLbyte name[GL_MAILBOX_SIZE_CHROMIUM]; |
| 734 GLC(context3d, context3d->genMailboxCHROMIUM(name)); | 746 GLC(context3d, context3d->genMailboxCHROMIUM(name)); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 862 void ResourceProvider::setPixelsFromBuffer(ResourceId id) | 874 void ResourceProvider::setPixelsFromBuffer(ResourceId id) |
| 863 { | 875 { |
| 864 DCHECK(m_threadChecker.CalledOnValidThread()); | 876 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 865 ResourceMap::iterator it = m_resources.find(id); | 877 ResourceMap::iterator it = m_resources.find(id); |
| 866 CHECK(it != m_resources.end()); | 878 CHECK(it != m_resources.end()); |
| 867 Resource* resource = &it->second; | 879 Resource* resource = &it->second; |
| 868 DCHECK(!resource->lockedForWrite); | 880 DCHECK(!resource->lockedForWrite); |
| 869 DCHECK(!resource->lockForReadCount); | 881 DCHECK(!resource->lockForReadCount); |
| 870 DCHECK(!resource->external); | 882 DCHECK(!resource->external); |
| 871 DCHECK(!resource->exported); | 883 DCHECK(!resource->exported); |
| 884 lazyAllocate(resource); |
| 872 | 885 |
| 873 if (resource->glId) { | 886 if (resource->glId) { |
| 874 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 887 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
| 875 DCHECK(context3d); | 888 DCHECK(context3d); |
| 876 DCHECK(resource->glPixelBufferId); | 889 DCHECK(resource->glPixelBufferId); |
| 877 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); | 890 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); |
| 878 context3d->bindBuffer( | 891 context3d->bindBuffer( |
| 879 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 892 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 880 resource->glPixelBufferId); | 893 resource->glPixelBufferId); |
| 881 context3d->texSubImage2D(GL_TEXTURE_2D, | 894 context3d->texSubImage2D(GL_TEXTURE_2D, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 923 } | 936 } |
| 924 } | 937 } |
| 925 | 938 |
| 926 void ResourceProvider::beginSetPixels(ResourceId id) | 939 void ResourceProvider::beginSetPixels(ResourceId id) |
| 927 { | 940 { |
| 928 DCHECK(m_threadChecker.CalledOnValidThread()); | 941 DCHECK(m_threadChecker.CalledOnValidThread()); |
| 929 ResourceMap::iterator it = m_resources.find(id); | 942 ResourceMap::iterator it = m_resources.find(id); |
| 930 CHECK(it != m_resources.end()); | 943 CHECK(it != m_resources.end()); |
| 931 Resource* resource = &it->second; | 944 Resource* resource = &it->second; |
| 932 DCHECK(!resource->pendingSetPixels); | 945 DCHECK(!resource->pendingSetPixels); |
| 946 DCHECK(resource->glId || resource->allocated); |
| 933 | 947 |
| 948 bool allocate = !resource->allocated; |
| 949 resource->allocated = true; |
| 934 lockForWrite(id); | 950 lockForWrite(id); |
| 935 | 951 |
| 936 if (resource->glId) { | 952 if (resource->glId) { |
| 937 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 953 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
| 938 DCHECK(context3d); | 954 DCHECK(context3d); |
| 939 DCHECK(resource->glPixelBufferId); | 955 DCHECK(resource->glPixelBufferId); |
| 940 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); | 956 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); |
| 941 context3d->bindBuffer( | 957 context3d->bindBuffer( |
| 942 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 958 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 943 resource->glPixelBufferId); | 959 resource->glPixelBufferId); |
| 944 if (!resource->glUploadQueryId) | 960 if (!resource->glUploadQueryId) |
| 945 resource->glUploadQueryId = context3d->createQueryEXT(); | 961 resource->glUploadQueryId = context3d->createQueryEXT(); |
| 946 context3d->beginQueryEXT( | 962 context3d->beginQueryEXT( |
| 947 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, | 963 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, |
| 948 resource->glUploadQueryId); | 964 resource->glUploadQueryId); |
| 949 context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D, | 965 if (allocate) { |
| 950 0, /* level */ | 966 context3d->asyncTexImage2DCHROMIUM(GL_TEXTURE_2D, |
| 951 0, /* x */ | 967 0, /* level */ |
| 952 0, /* y */ | 968 resource->format, |
| 953 resource->size.width(), | 969 resource->size.width(), |
| 954 resource->size.height(), | 970 resource->size.height(), |
| 955 resource->format, | 971 0, /* border */ |
| 956 GL_UNSIGNED_BYTE, | 972 resource->format, |
| 957 NULL); | 973 GL_UNSIGNED_BYTE, |
| 974 NULL); |
| 975 } else { |
| 976 context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D, |
| 977 0, /* level */ |
| 978 0, /* x */ |
| 979 0, /* y */ |
| 980 resource->size.width(), |
| 981 resource->size.height(), |
| 982 resource->format, |
| 983 GL_UNSIGNED_BYTE, |
| 984 NULL); |
| 985 } |
| 958 context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM); | 986 context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM); |
| 959 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 987 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| 960 } | 988 } |
| 961 | 989 |
| 962 if (resource->pixels) | 990 if (resource->pixels) |
| 963 setPixelsFromBuffer(id); | 991 setPixelsFromBuffer(id); |
| 964 | 992 |
| 965 resource->pendingSetPixels = true; | 993 resource->pendingSetPixels = true; |
| 966 } | 994 } |
| 967 | 995 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 985 if (!complete) | 1013 if (!complete) |
| 986 return false; | 1014 return false; |
| 987 } | 1015 } |
| 988 | 1016 |
| 989 resource->pendingSetPixels = false; | 1017 resource->pendingSetPixels = false; |
| 990 unlockForWrite(id); | 1018 unlockForWrite(id); |
| 991 | 1019 |
| 992 return true; | 1020 return true; |
| 993 } | 1021 } |
| 994 | 1022 |
| 1023 void ResourceProvider::allocateForTesting(ResourceId id) { |
| 1024 ResourceMap::iterator it = m_resources.find(id); |
| 1025 CHECK(it != m_resources.end()); |
| 1026 Resource* resource = &it->second; |
| 1027 lazyAllocate(resource); |
| 1028 } |
| 1029 |
| 1030 void ResourceProvider::lazyAllocate(Resource* resource) { |
| 1031 DCHECK(resource); |
| 1032 DCHECK(resource->glId || resource->allocated); |
| 1033 |
| 1034 if (resource->allocated || !resource->glId) |
| 1035 return; |
| 1036 |
| 1037 resource->allocated = true; |
| 1038 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
| 1039 gfx::Size& size = resource->size; |
| 1040 GLenum format = resource->format; |
| 1041 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)); |
| 1042 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { |
| 1043 GLenum storageFormat = textureToStorageFormat(format); |
| 1044 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma
t, size.width(), size.height())); |
| 1045 } else |
| 1046 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt
h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); |
| 1047 } |
| 1048 |
| 1049 |
| 995 } // namespace cc | 1050 } // namespace cc |
| OLD | NEW |