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 , glPixelBufferId(0) | 53 , glPixelBufferId(0) |
54 , glUploadQueryId(0) | 54 , glUploadQueryId(0) |
55 , pixels(0) | 55 , pixels(0) |
56 , pixelBuffer(0) | 56 , pixelBuffer(0) |
57 , lockForReadCount(0) | 57 , lockForReadCount(0) |
58 , lockedForWrite(false) | 58 , lockedForWrite(false) |
59 , external(false) | 59 , external(false) |
60 , exported(false) | 60 , exported(false) |
61 , markedForDeletion(false) | 61 , markedForDeletion(false) |
62 , pendingSetPixels(false) | 62 , pendingSetPixels(false) |
63 , allocated(false) | |
63 , size() | 64 , size() |
64 , format(0) | 65 , format(0) |
65 , filter(0) | 66 , filter(0) |
66 , type(static_cast<ResourceType>(0)) | 67 , type(static_cast<ResourceType>(0)) |
67 { | 68 { |
68 } | 69 } |
69 | 70 |
70 ResourceProvider::Resource::Resource(unsigned textureId, const gfx::Size& size, GLenum format, GLenum filter) | 71 ResourceProvider::Resource::Resource(unsigned textureId, const gfx::Size& size, GLenum format, GLenum filter) |
71 : glId(textureId) | 72 : glId(textureId) |
72 , glPixelBufferId(0) | 73 , glPixelBufferId(0) |
73 , glUploadQueryId(0) | 74 , glUploadQueryId(0) |
74 , pixels(0) | 75 , pixels(0) |
75 , pixelBuffer(0) | 76 , pixelBuffer(0) |
76 , lockForReadCount(0) | 77 , lockForReadCount(0) |
77 , lockedForWrite(false) | 78 , lockedForWrite(false) |
78 , external(false) | 79 , external(false) |
79 , exported(false) | 80 , exported(false) |
80 , markedForDeletion(false) | 81 , markedForDeletion(false) |
81 , pendingSetPixels(false) | 82 , pendingSetPixels(false) |
83 , allocated(false) | |
82 , size(size) | 84 , size(size) |
83 , format(format) | 85 , format(format) |
84 , filter(filter) | 86 , filter(filter) |
85 , type(GLTexture) | 87 , type(GLTexture) |
86 { | 88 { |
87 } | 89 } |
88 | 90 |
89 ResourceProvider::Resource::Resource(uint8_t* pixels, const gfx::Size& size, GLe num format, GLenum filter) | 91 ResourceProvider::Resource::Resource(uint8_t* pixels, const gfx::Size& size, GLe num format, GLenum filter) |
90 : glId(0) | 92 : glId(0) |
91 , glPixelBufferId(0) | 93 , glPixelBufferId(0) |
92 , glUploadQueryId(0) | 94 , glUploadQueryId(0) |
93 , pixels(pixels) | 95 , pixels(pixels) |
94 , pixelBuffer(0) | 96 , pixelBuffer(0) |
95 , lockForReadCount(0) | 97 , lockForReadCount(0) |
96 , lockedForWrite(false) | 98 , lockedForWrite(false) |
97 , external(false) | 99 , external(false) |
98 , exported(false) | 100 , exported(false) |
99 , markedForDeletion(false) | 101 , markedForDeletion(false) |
100 , pendingSetPixels(false) | 102 , pendingSetPixels(false) |
103 , allocated(false) | |
101 , size(size) | 104 , size(size) |
102 , format(format) | 105 , format(format) |
103 , filter(filter) | 106 , filter(filter) |
104 , type(Bitmap) | 107 , type(Bitmap) |
105 { | 108 { |
106 } | 109 } |
107 | 110 |
108 ResourceProvider::Child::Child() | 111 ResourceProvider::Child::Child() |
109 { | 112 { |
110 } | 113 } |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
166 return createGLTexture(size, format, GL_TEXTURE_POOL_MANAGED_CHROMIUM, h int); | 169 return createGLTexture(size, format, GL_TEXTURE_POOL_MANAGED_CHROMIUM, h int); |
167 case Bitmap: | 170 case Bitmap: |
168 DCHECK(format == GL_RGBA); | 171 DCHECK(format == GL_RGBA); |
169 return createBitmap(size); | 172 return createBitmap(size); |
170 } | 173 } |
171 | 174 |
172 LOG(FATAL) << "Invalid default resource type."; | 175 LOG(FATAL) << "Invalid default resource type."; |
173 return 0; | 176 return 0; |
174 } | 177 } |
175 | 178 |
179 ResourceProvider::ResourceId ResourceProvider::createAllocatedResource(const gfx ::Size& size, GLenum format, TextureUsageHint hint) | |
180 { | |
181 ResourceProvider::ResourceId id = createResource(size, format, hint); | |
182 if (id) | |
183 lazyAllocate(id); | |
184 return id; | |
185 } | |
186 | |
187 ResourceProvider::ResourceId ResourceProvider::createAllocatedManagedResource(co nst gfx::Size& size, GLenum format, TextureUsageHint hint) | |
188 { | |
189 ResourceProvider::ResourceId id = createManagedResource(size, format, hint); | |
190 if (id) | |
191 lazyAllocate(id); | |
192 return id; | |
193 } | |
194 | |
195 | |
176 ResourceProvider::ResourceId ResourceProvider::createGLTexture(const gfx::Size& size, GLenum format, GLenum texturePool, TextureUsageHint hint) | 196 ResourceProvider::ResourceId ResourceProvider::createGLTexture(const gfx::Size& size, GLenum format, GLenum texturePool, TextureUsageHint hint) |
177 { | 197 { |
178 DCHECK_LE(size.width(), m_maxTextureSize); | 198 DCHECK_LE(size.width(), m_maxTextureSize); |
179 DCHECK_LE(size.height(), m_maxTextureSize); | 199 DCHECK_LE(size.height(), m_maxTextureSize); |
180 | 200 |
181 DCHECK(m_threadChecker.CalledOnValidThread()); | 201 DCHECK(m_threadChecker.CalledOnValidThread()); |
182 unsigned textureId = 0; | 202 unsigned textureId = 0; |
183 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 203 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
184 DCHECK(context3d); | 204 DCHECK(context3d); |
185 GLC(context3d, textureId = context3d->createTexture()); | 205 GLC(context3d, textureId = context3d->createTexture()); |
186 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 206 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
207 | |
208 // Set texture properties. Allocation is delayed until needed. | |
187 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER , GL_LINEAR)); | 209 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER , GL_LINEAR)); |
188 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER , GL_LINEAR)); | 210 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER , GL_LINEAR)); |
189 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL _CLAMP_TO_EDGE)); | 211 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL _CLAMP_TO_EDGE)); |
190 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE)); | 212 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE)); |
191 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROM IUM, texturePool)); | 213 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROM IUM, texturePool)); |
192 | |
193 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) | 214 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) |
194 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_ ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); | 215 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_ ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); |
195 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { | |
196 GLenum storageFormat = textureToStorageFormat(format); | |
197 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma t, size.width(), size.height())); | |
198 } else | |
199 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); | |
200 | 216 |
201 ResourceId id = m_nextId++; | 217 ResourceId id = m_nextId++; |
202 Resource resource(textureId, size, format, GL_LINEAR); | 218 Resource resource(textureId, size, format, GL_LINEAR); |
219 resource.allocated = false; | |
203 m_resources[id] = resource; | 220 m_resources[id] = resource; |
204 return id; | 221 return id; |
205 } | 222 } |
206 | 223 |
207 ResourceProvider::ResourceId ResourceProvider::createBitmap(const gfx::Size& siz e) | 224 ResourceProvider::ResourceId ResourceProvider::createBitmap(const gfx::Size& siz e) |
208 { | 225 { |
209 DCHECK(m_threadChecker.CalledOnValidThread()); | 226 DCHECK(m_threadChecker.CalledOnValidThread()); |
210 | 227 |
211 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; | 228 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; |
212 | 229 |
213 ResourceId id = m_nextId++; | 230 ResourceId id = m_nextId++; |
214 Resource resource(pixels, size, GL_RGBA, GL_LINEAR); | 231 Resource resource(pixels, size, GL_RGBA, GL_LINEAR); |
232 resource.allocated = true; | |
215 m_resources[id] = resource; | 233 m_resources[id] = resource; |
216 return id; | 234 return id; |
217 } | 235 } |
218 | 236 |
219 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture (unsigned textureId) | 237 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture (unsigned textureId) |
220 { | 238 { |
221 DCHECK(m_threadChecker.CalledOnValidThread()); | 239 DCHECK(m_threadChecker.CalledOnValidThread()); |
222 | 240 |
223 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 241 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
224 DCHECK(context3d); | 242 DCHECK(context3d); |
225 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 243 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
226 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER , GL_LINEAR)); | 244 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER , GL_LINEAR)); |
227 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER , GL_LINEAR)); | 245 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER , GL_LINEAR)); |
228 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL _CLAMP_TO_EDGE)); | 246 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL _CLAMP_TO_EDGE)); |
229 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE)); | 247 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE)); |
230 | 248 |
231 ResourceId id = m_nextId++; | 249 ResourceId id = m_nextId++; |
232 Resource resource(textureId, gfx::Size(), 0, GL_LINEAR); | 250 Resource resource(textureId, gfx::Size(), 0, GL_LINEAR); |
233 resource.external = true; | 251 resource.external = true; |
252 resource.allocated = true; | |
234 m_resources[id] = resource; | 253 m_resources[id] = resource; |
235 return id; | 254 return id; |
236 } | 255 } |
237 | 256 |
238 void ResourceProvider::deleteResource(ResourceId id) | 257 void ResourceProvider::deleteResource(ResourceId id) |
239 { | 258 { |
240 DCHECK(m_threadChecker.CalledOnValidThread()); | 259 DCHECK(m_threadChecker.CalledOnValidThread()); |
241 ResourceMap::iterator it = m_resources.find(id); | 260 ResourceMap::iterator it = m_resources.find(id); |
242 CHECK(it != m_resources.end()); | 261 CHECK(it != m_resources.end()); |
243 Resource* resource = &it->second; | 262 Resource* resource = &it->second; |
244 DCHECK(!resource->lockedForWrite); | |
245 DCHECK(!resource->lockForReadCount); | 263 DCHECK(!resource->lockForReadCount); |
246 DCHECK(!resource->markedForDeletion); | 264 DCHECK(!resource->markedForDeletion); |
265 DCHECK(resource->pendingSetPixels || !resource->lockedForWrite); | |
247 | 266 |
248 if (resource->exported) { | 267 if (resource->exported) { |
249 resource->markedForDeletion = true; | 268 resource->markedForDeletion = true; |
250 return; | 269 return; |
251 } else | 270 } else |
252 deleteResourceInternal(it); | 271 deleteResourceInternal(it); |
253 } | 272 } |
254 | 273 |
255 void ResourceProvider::deleteResourceInternal(ResourceMap::iterator it) | 274 void ResourceProvider::deleteResourceInternal(ResourceMap::iterator it) |
256 { | 275 { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
289 void ResourceProvider::setPixels(ResourceId id, const uint8_t* image, const gfx: :Rect& imageRect, const gfx::Rect& sourceRect, const gfx::Vector2d& destOffset) | 308 void ResourceProvider::setPixels(ResourceId id, const uint8_t* image, const gfx: :Rect& imageRect, const gfx::Rect& sourceRect, const gfx::Vector2d& destOffset) |
290 { | 309 { |
291 DCHECK(m_threadChecker.CalledOnValidThread()); | 310 DCHECK(m_threadChecker.CalledOnValidThread()); |
292 ResourceMap::iterator it = m_resources.find(id); | 311 ResourceMap::iterator it = m_resources.find(id); |
293 CHECK(it != m_resources.end()); | 312 CHECK(it != m_resources.end()); |
294 Resource* resource = &it->second; | 313 Resource* resource = &it->second; |
295 DCHECK(!resource->lockedForWrite); | 314 DCHECK(!resource->lockedForWrite); |
296 DCHECK(!resource->lockForReadCount); | 315 DCHECK(!resource->lockForReadCount); |
297 DCHECK(!resource->external); | 316 DCHECK(!resource->external); |
298 DCHECK(!resource->exported); | 317 DCHECK(!resource->exported); |
318 lazyAllocate(resource); | |
299 | 319 |
300 if (resource->glId) { | 320 if (resource->glId) { |
321 DCHECK(!resource->pendingSetPixels); | |
301 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 322 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
302 DCHECK(context3d); | 323 DCHECK(context3d); |
303 DCHECK(m_textureUploader.get()); | 324 DCHECK(m_textureUploader.get()); |
304 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); | 325 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); |
305 m_textureUploader->upload(image, | 326 m_textureUploader->upload(image, |
306 imageRect, | 327 imageRect, |
307 sourceRect, | 328 sourceRect, |
308 destOffset, | 329 destOffset, |
309 resource->format, | 330 resource->format, |
310 resource->size); | 331 resource->size); |
311 } | 332 } |
312 | 333 |
313 if (resource->pixels) { | 334 if (resource->pixels) { |
335 DCHECK(resource->allocated); | |
314 DCHECK(resource->format == GL_RGBA); | 336 DCHECK(resource->format == GL_RGBA); |
315 SkBitmap srcFull; | 337 SkBitmap srcFull; |
316 srcFull.setConfig(SkBitmap::kARGB_8888_Config, imageRect.width(), imageR ect.height()); | 338 srcFull.setConfig(SkBitmap::kARGB_8888_Config, imageRect.width(), imageR ect.height()); |
317 srcFull.setPixels(const_cast<uint8_t*>(image)); | 339 srcFull.setPixels(const_cast<uint8_t*>(image)); |
318 SkBitmap srcSubset; | 340 SkBitmap srcSubset; |
319 SkIRect skSourceRect = SkIRect::MakeXYWH(sourceRect.x(), sourceRect.y(), sourceRect.width(), sourceRect.height()); | 341 SkIRect skSourceRect = SkIRect::MakeXYWH(sourceRect.x(), sourceRect.y(), sourceRect.width(), sourceRect.height()); |
320 skSourceRect.offset(-imageRect.x(), -imageRect.y()); | 342 skSourceRect.offset(-imageRect.x(), -imageRect.y()); |
321 srcFull.extractSubset(&srcSubset, skSourceRect); | 343 srcFull.extractSubset(&srcSubset, skSourceRect); |
322 | 344 |
323 ScopedWriteLockSoftware lock(this, id); | 345 ScopedWriteLockSoftware lock(this, id); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
378 } | 400 } |
379 | 401 |
380 const ResourceProvider::Resource* ResourceProvider::lockForRead(ResourceId id) | 402 const ResourceProvider::Resource* ResourceProvider::lockForRead(ResourceId id) |
381 { | 403 { |
382 DCHECK(m_threadChecker.CalledOnValidThread()); | 404 DCHECK(m_threadChecker.CalledOnValidThread()); |
383 ResourceMap::iterator it = m_resources.find(id); | 405 ResourceMap::iterator it = m_resources.find(id); |
384 CHECK(it != m_resources.end()); | 406 CHECK(it != m_resources.end()); |
385 Resource* resource = &it->second; | 407 Resource* resource = &it->second; |
386 DCHECK(!resource->lockedForWrite); | 408 DCHECK(!resource->lockedForWrite); |
387 DCHECK(!resource->exported); | 409 DCHECK(!resource->exported); |
410 DCHECK(resource->allocated); // Texture uninitialized! setPixels or lockForW rite first. | |
piman
2012/12/18 22:41:38
nit: 2 spaces before comments
| |
388 resource->lockForReadCount++; | 411 resource->lockForReadCount++; |
389 return resource; | 412 return resource; |
390 } | 413 } |
391 | 414 |
392 void ResourceProvider::unlockForRead(ResourceId id) | 415 void ResourceProvider::unlockForRead(ResourceId id) |
393 { | 416 { |
394 DCHECK(m_threadChecker.CalledOnValidThread()); | 417 DCHECK(m_threadChecker.CalledOnValidThread()); |
395 ResourceMap::iterator it = m_resources.find(id); | 418 ResourceMap::iterator it = m_resources.find(id); |
396 CHECK(it != m_resources.end()); | 419 CHECK(it != m_resources.end()); |
397 Resource* resource = &it->second; | 420 Resource* resource = &it->second; |
398 DCHECK(resource->lockForReadCount > 0); | 421 DCHECK(resource->lockForReadCount > 0); |
399 DCHECK(!resource->exported); | 422 DCHECK(!resource->exported); |
400 resource->lockForReadCount--; | 423 resource->lockForReadCount--; |
401 } | 424 } |
402 | 425 |
403 const ResourceProvider::Resource* ResourceProvider::lockForWrite(ResourceId id) | 426 const ResourceProvider::Resource* ResourceProvider::lockForWrite(ResourceId id) |
404 { | 427 { |
405 DCHECK(m_threadChecker.CalledOnValidThread()); | 428 DCHECK(m_threadChecker.CalledOnValidThread()); |
406 ResourceMap::iterator it = m_resources.find(id); | 429 ResourceMap::iterator it = m_resources.find(id); |
407 CHECK(it != m_resources.end()); | 430 CHECK(it != m_resources.end()); |
408 Resource* resource = &it->second; | 431 Resource* resource = &it->second; |
409 DCHECK(!resource->lockedForWrite); | 432 DCHECK(!resource->lockedForWrite); |
410 DCHECK(!resource->lockForReadCount); | 433 DCHECK(!resource->lockForReadCount); |
411 DCHECK(!resource->exported); | 434 DCHECK(!resource->exported); |
412 DCHECK(!resource->external); | 435 DCHECK(!resource->external); |
436 lazyAllocate(resource); | |
437 | |
413 resource->lockedForWrite = true; | 438 resource->lockedForWrite = true; |
414 return resource; | 439 return resource; |
415 } | 440 } |
416 | 441 |
417 void ResourceProvider::unlockForWrite(ResourceId id) | 442 void ResourceProvider::unlockForWrite(ResourceId id) |
418 { | 443 { |
419 DCHECK(m_threadChecker.CalledOnValidThread()); | 444 DCHECK(m_threadChecker.CalledOnValidThread()); |
420 ResourceMap::iterator it = m_resources.find(id); | 445 ResourceMap::iterator it = m_resources.find(id); |
421 CHECK(it != m_resources.end()); | 446 CHECK(it != m_resources.end()); |
422 Resource* resource = &it->second; | 447 Resource* resource = &it->second; |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
639 } | 664 } |
640 Child& childInfo = m_children.find(child)->second; | 665 Child& childInfo = m_children.find(child)->second; |
641 for (TransferableResourceArray::const_iterator it = resources.resources.begi n(); it != resources.resources.end(); ++it) { | 666 for (TransferableResourceArray::const_iterator it = resources.resources.begi n(); it != resources.resources.end(); ++it) { |
642 unsigned textureId; | 667 unsigned textureId; |
643 GLC(context3d, textureId = context3d->createTexture()); | 668 GLC(context3d, textureId = context3d->createTexture()); |
644 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 669 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
645 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail box.name)); | 670 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail box.name)); |
646 ResourceId id = m_nextId++; | 671 ResourceId id = m_nextId++; |
647 Resource resource(textureId, it->size, it->format, it->filter); | 672 Resource resource(textureId, it->size, it->format, it->filter); |
648 resource.mailbox.setName(it->mailbox.name); | 673 resource.mailbox.setName(it->mailbox.name); |
674 // Don't allocate a texture for a child. | |
675 resource.allocated = true; | |
649 m_resources[id] = resource; | 676 m_resources[id] = resource; |
650 childInfo.parentToChildMap[id] = it->id; | 677 childInfo.parentToChildMap[id] = it->id; |
651 childInfo.childToParentMap[it->id] = id; | 678 childInfo.childToParentMap[it->id] = id; |
652 } | 679 } |
653 } | 680 } |
654 | 681 |
655 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc es) | 682 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc es) |
656 { | 683 { |
657 DCHECK(m_threadChecker.CalledOnValidThread()); | 684 DCHECK(m_threadChecker.CalledOnValidThread()); |
658 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 685 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
(...skipping 20 matching lines...) Expand all Loading... | |
679 bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI d id, TransferableResource* resource) | 706 bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI d id, TransferableResource* resource) |
680 { | 707 { |
681 DCHECK(m_threadChecker.CalledOnValidThread()); | 708 DCHECK(m_threadChecker.CalledOnValidThread()); |
682 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 709 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
683 ResourceMap::iterator it = m_resources.find(id); | 710 ResourceMap::iterator it = m_resources.find(id); |
684 CHECK(it != m_resources.end()); | 711 CHECK(it != m_resources.end()); |
685 Resource* source = &it->second; | 712 Resource* source = &it->second; |
686 DCHECK(!source->lockedForWrite); | 713 DCHECK(!source->lockedForWrite); |
687 DCHECK(!source->lockForReadCount); | 714 DCHECK(!source->lockForReadCount); |
688 DCHECK(!source->external); | 715 DCHECK(!source->external); |
716 DCHECK(source->allocated); | |
689 if (source->exported) | 717 if (source->exported) |
690 return false; | 718 return false; |
691 resource->id = id; | 719 resource->id = id; |
692 resource->format = source->format; | 720 resource->format = source->format; |
693 resource->filter = source->filter; | 721 resource->filter = source->filter; |
694 resource->size = source->size; | 722 resource->size = source->size; |
695 | 723 |
696 if (source->mailbox.isZero()) { | 724 if (source->mailbox.isZero()) { |
697 GLbyte name[GL_MAILBOX_SIZE_CHROMIUM]; | 725 GLbyte name[GL_MAILBOX_SIZE_CHROMIUM]; |
698 GLC(context3d, context3d->genMailboxCHROMIUM(name)); | 726 GLC(context3d, context3d->genMailboxCHROMIUM(name)); |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
826 void ResourceProvider::setPixelsFromBuffer(ResourceId id) | 854 void ResourceProvider::setPixelsFromBuffer(ResourceId id) |
827 { | 855 { |
828 DCHECK(m_threadChecker.CalledOnValidThread()); | 856 DCHECK(m_threadChecker.CalledOnValidThread()); |
829 ResourceMap::iterator it = m_resources.find(id); | 857 ResourceMap::iterator it = m_resources.find(id); |
830 CHECK(it != m_resources.end()); | 858 CHECK(it != m_resources.end()); |
831 Resource* resource = &it->second; | 859 Resource* resource = &it->second; |
832 DCHECK(!resource->lockedForWrite); | 860 DCHECK(!resource->lockedForWrite); |
833 DCHECK(!resource->lockForReadCount); | 861 DCHECK(!resource->lockForReadCount); |
834 DCHECK(!resource->external); | 862 DCHECK(!resource->external); |
835 DCHECK(!resource->exported); | 863 DCHECK(!resource->exported); |
864 lazyAllocate(resource); | |
836 | 865 |
837 if (resource->glId) { | 866 if (resource->glId) { |
838 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 867 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
839 DCHECK(context3d); | 868 DCHECK(context3d); |
840 DCHECK(resource->glPixelBufferId); | 869 DCHECK(resource->glPixelBufferId); |
841 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); | 870 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); |
842 context3d->bindBuffer( | 871 context3d->bindBuffer( |
843 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 872 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
844 resource->glPixelBufferId); | 873 resource->glPixelBufferId); |
845 context3d->texSubImage2D(GL_TEXTURE_2D, | 874 context3d->texSubImage2D(GL_TEXTURE_2D, |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
888 } | 917 } |
889 | 918 |
890 void ResourceProvider::beginSetPixels(ResourceId id) | 919 void ResourceProvider::beginSetPixels(ResourceId id) |
891 { | 920 { |
892 DCHECK(m_threadChecker.CalledOnValidThread()); | 921 DCHECK(m_threadChecker.CalledOnValidThread()); |
893 ResourceMap::iterator it = m_resources.find(id); | 922 ResourceMap::iterator it = m_resources.find(id); |
894 CHECK(it != m_resources.end()); | 923 CHECK(it != m_resources.end()); |
895 Resource* resource = &it->second; | 924 Resource* resource = &it->second; |
896 DCHECK(!resource->pendingSetPixels); | 925 DCHECK(!resource->pendingSetPixels); |
897 | 926 |
927 resource->allocated = true; | |
898 lockForWrite(id); | 928 lockForWrite(id); |
899 | 929 |
900 if (resource->glId) { | 930 if (resource->glId) { |
901 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 931 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
902 DCHECK(context3d); | 932 DCHECK(context3d); |
903 DCHECK(resource->glPixelBufferId); | 933 DCHECK(resource->glPixelBufferId); |
904 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); | 934 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); |
905 context3d->bindBuffer( | 935 context3d->bindBuffer( |
906 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 936 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
907 resource->glPixelBufferId); | 937 resource->glPixelBufferId); |
908 if (!resource->glUploadQueryId) | 938 if (!resource->glUploadQueryId) |
909 resource->glUploadQueryId = context3d->createQueryEXT(); | 939 resource->glUploadQueryId = context3d->createQueryEXT(); |
910 context3d->beginQueryEXT( | 940 context3d->beginQueryEXT( |
911 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, | 941 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, |
912 resource->glUploadQueryId); | 942 resource->glUploadQueryId); |
913 context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D, | 943 if (!resource->allocated) { |
914 0, /* level */ | 944 context3d->asyncTexImage2DCHROMIUM(GL_TEXTURE_2D, |
915 0, /* x */ | 945 0, /* level */ |
916 0, /* y */ | 946 resource->format, |
917 resource->size.width(), | 947 resource->size.width(), |
918 resource->size.height(), | 948 resource->size.height(), |
919 resource->format, | 949 0, /* border */ |
920 GL_UNSIGNED_BYTE, | 950 resource->format, |
921 NULL); | 951 GL_UNSIGNED_BYTE, |
952 NULL); | |
953 } else { | |
954 context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D, | |
955 0, /* level */ | |
956 0, /* x */ | |
957 0, /* y */ | |
958 resource->size.width(), | |
959 resource->size.height(), | |
960 resource->format, | |
961 GL_UNSIGNED_BYTE, | |
962 NULL); | |
963 } | |
922 context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM); | 964 context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM); |
923 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 965 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
924 } | 966 } |
925 | 967 |
926 if (resource->pixels) | 968 if (resource->pixels) |
927 setPixelsFromBuffer(id); | 969 setPixelsFromBuffer(id); |
928 | 970 |
929 resource->pendingSetPixels = true; | 971 resource->pendingSetPixels = true; |
930 } | 972 } |
931 | 973 |
(...skipping 17 matching lines...) Expand all Loading... | |
949 if (!complete) | 991 if (!complete) |
950 return false; | 992 return false; |
951 } | 993 } |
952 | 994 |
953 resource->pendingSetPixels = false; | 995 resource->pendingSetPixels = false; |
954 unlockForWrite(id); | 996 unlockForWrite(id); |
955 | 997 |
956 return true; | 998 return true; |
957 } | 999 } |
958 | 1000 |
1001 void ResourceProvider::lazyAllocate(ResourceId id) { | |
1002 ResourceMap::iterator it = m_resources.find(id); | |
1003 CHECK(it != m_resources.end()); | |
1004 Resource* resource = &it->second; | |
1005 lazyAllocate(resource); | |
1006 } | |
1007 | |
1008 void ResourceProvider::lazyAllocate(Resource* resource) { | |
1009 DCHECK(resource); | |
1010 DCHECK(resource->glId || resource->allocated); | |
1011 | |
1012 if (resource->allocated || !resource->glId) | |
1013 return; | |
1014 | |
1015 resource->allocated = true; | |
1016 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | |
1017 gfx::Size& size = resource->size; | |
1018 GLenum format = resource->format; | |
1019 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { | |
1020 GLenum storageFormat = textureToStorageFormat(format); | |
1021 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma t, size.width(), size.height())); | |
1022 } else | |
1023 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); | |
1024 } | |
1025 | |
1026 | |
959 } // namespace cc | 1027 } // namespace cc |
OLD | NEW |