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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 scoped_ptr<ResourceProvider> ResourceProvider::create(OutputSurface* context) | 141 scoped_ptr<ResourceProvider> ResourceProvider::create(OutputSurface* context) |
142 { | 142 { |
143 scoped_ptr<ResourceProvider> resourceProvider(new ResourceProvider(context))
; | 143 scoped_ptr<ResourceProvider> resourceProvider(new ResourceProvider(context))
; |
144 if (!resourceProvider->initialize()) | 144 if (!resourceProvider->initialize()) |
145 return scoped_ptr<ResourceProvider>(); | 145 return scoped_ptr<ResourceProvider>(); |
146 return resourceProvider.Pass(); | 146 return resourceProvider.Pass(); |
147 } | 147 } |
148 | 148 |
149 ResourceProvider::~ResourceProvider() | 149 ResourceProvider::~ResourceProvider() |
150 { | 150 { |
151 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 151 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
152 if (!context3d || !context3d->makeContextCurrent()) | 152 if (!context3d || !context3d->makeContextCurrent()) |
153 return; | 153 return; |
154 m_textureUploader.reset(); | 154 m_textureUploader.reset(); |
155 m_textureCopier.reset(); | 155 m_textureCopier.reset(); |
156 } | 156 } |
157 | 157 |
158 WebGraphicsContext3D* ResourceProvider::graphicsContext3D() | 158 WebGraphicsContext3D* ResourceProvider::graphicsContext3D() |
159 { | 159 { |
160 DCHECK(m_threadChecker.CalledOnValidThread()); | 160 DCHECK(m_threadChecker.CalledOnValidThread()); |
161 return m_outputSurface->Context3D(); | 161 return m_outputSurface->context3d(); |
162 } | 162 } |
163 | 163 |
164 bool ResourceProvider::inUseByConsumer(ResourceId id) | 164 bool ResourceProvider::inUseByConsumer(ResourceId id) |
165 { | 165 { |
166 DCHECK(m_threadChecker.CalledOnValidThread()); | 166 DCHECK(m_threadChecker.CalledOnValidThread()); |
167 ResourceMap::iterator it = m_resources.find(id); | 167 ResourceMap::iterator it = m_resources.find(id); |
168 CHECK(it != m_resources.end()); | 168 CHECK(it != m_resources.end()); |
169 Resource* resource = &it->second; | 169 Resource* resource = &it->second; |
170 return !!resource->lockForReadCount || resource->exported; | 170 return !!resource->lockForReadCount || resource->exported; |
171 } | 171 } |
(...skipping 25 matching lines...) Expand all Loading... |
197 LOG(FATAL) << "Invalid default resource type."; | 197 LOG(FATAL) << "Invalid default resource type."; |
198 return 0; | 198 return 0; |
199 } | 199 } |
200 | 200 |
201 ResourceProvider::ResourceId ResourceProvider::createGLTexture(const gfx::Size&
size, GLenum format, GLenum texturePool, TextureUsageHint hint) | 201 ResourceProvider::ResourceId ResourceProvider::createGLTexture(const gfx::Size&
size, GLenum format, GLenum texturePool, TextureUsageHint hint) |
202 { | 202 { |
203 DCHECK_LE(size.width(), m_maxTextureSize); | 203 DCHECK_LE(size.width(), m_maxTextureSize); |
204 DCHECK_LE(size.height(), m_maxTextureSize); | 204 DCHECK_LE(size.height(), m_maxTextureSize); |
205 | 205 |
206 DCHECK(m_threadChecker.CalledOnValidThread()); | 206 DCHECK(m_threadChecker.CalledOnValidThread()); |
207 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 207 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
208 DCHECK(context3d); | 208 DCHECK(context3d); |
209 | 209 |
210 // Create and set texture properties. Allocation is delayed until needed. | 210 // Create and set texture properties. Allocation is delayed until needed. |
211 unsigned textureId = createTextureId(context3d); | 211 unsigned textureId = createTextureId(context3d); |
212 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROM
IUM, texturePool)); | 212 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROM
IUM, texturePool)); |
213 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) | 213 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) |
214 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_
ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); | 214 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_
ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); |
215 | 215 |
216 ResourceId id = m_nextId++; | 216 ResourceId id = m_nextId++; |
217 Resource resource(textureId, size, format, GL_LINEAR); | 217 Resource resource(textureId, size, format, GL_LINEAR); |
(...skipping 12 matching lines...) Expand all Loading... |
230 Resource resource(pixels, size, GL_RGBA, GL_LINEAR); | 230 Resource resource(pixels, size, GL_RGBA, GL_LINEAR); |
231 resource.allocated = true; | 231 resource.allocated = true; |
232 m_resources[id] = resource; | 232 m_resources[id] = resource; |
233 return id; | 233 return id; |
234 } | 234 } |
235 | 235 |
236 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture
(unsigned textureId) | 236 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture
(unsigned textureId) |
237 { | 237 { |
238 DCHECK(m_threadChecker.CalledOnValidThread()); | 238 DCHECK(m_threadChecker.CalledOnValidThread()); |
239 | 239 |
240 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 240 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
241 DCHECK(context3d); | 241 DCHECK(context3d); |
242 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 242 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
243 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); | 243 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); |
244 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); | 244 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); |
245 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); | 245 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_T, GL
_CLAMP_TO_EDGE)); | 246 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); |
247 | 247 |
248 ResourceId id = m_nextId++; | 248 ResourceId id = m_nextId++; |
249 Resource resource(textureId, gfx::Size(), 0, GL_LINEAR); | 249 Resource resource(textureId, gfx::Size(), 0, GL_LINEAR); |
250 resource.external = true; | 250 resource.external = true; |
(...skipping 30 matching lines...) Expand all Loading... |
281 resource->markedForDeletion = true; | 281 resource->markedForDeletion = true; |
282 return; | 282 return; |
283 } else | 283 } else |
284 deleteResourceInternal(it); | 284 deleteResourceInternal(it); |
285 } | 285 } |
286 | 286 |
287 void ResourceProvider::deleteResourceInternal(ResourceMap::iterator it) | 287 void ResourceProvider::deleteResourceInternal(ResourceMap::iterator it) |
288 { | 288 { |
289 Resource* resource = &it->second; | 289 Resource* resource = &it->second; |
290 if (resource->glId && !resource->external) { | 290 if (resource->glId && !resource->external) { |
291 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 291 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
292 DCHECK(context3d); | 292 DCHECK(context3d); |
293 GLC(context3d, context3d->deleteTexture(resource->glId)); | 293 GLC(context3d, context3d->deleteTexture(resource->glId)); |
294 } | 294 } |
295 if (resource->glUploadQueryId) { | 295 if (resource->glUploadQueryId) { |
296 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 296 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
297 DCHECK(context3d); | 297 DCHECK(context3d); |
298 GLC(context3d, context3d->deleteQueryEXT(resource->glUploadQueryId)); | 298 GLC(context3d, context3d->deleteQueryEXT(resource->glUploadQueryId)); |
299 } | 299 } |
300 if (resource->glPixelBufferId) { | 300 if (resource->glPixelBufferId) { |
301 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 301 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
302 DCHECK(context3d); | 302 DCHECK(context3d); |
303 GLC(context3d, context3d->deleteBuffer(resource->glPixelBufferId)); | 303 GLC(context3d, context3d->deleteBuffer(resource->glPixelBufferId)); |
304 } | 304 } |
305 if (!resource->mailbox.IsEmpty() && resource->external) { | 305 if (!resource->mailbox.IsEmpty() && resource->external) { |
306 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 306 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
307 DCHECK(context3d); | 307 DCHECK(context3d); |
308 unsigned syncPoint = resource->mailbox.sync_point(); | 308 unsigned syncPoint = resource->mailbox.sync_point(); |
309 if (resource->glId) { | 309 if (resource->glId) { |
310 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)
); | 310 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)
); |
311 GLC(context3d, context3d->produceTextureCHROMIUM(GL_TEXTURE_2D, reso
urce->mailbox.data())); | 311 GLC(context3d, context3d->produceTextureCHROMIUM(GL_TEXTURE_2D, reso
urce->mailbox.data())); |
312 GLC(context3d, context3d->deleteTexture(resource->glId)); | 312 GLC(context3d, context3d->deleteTexture(resource->glId)); |
313 syncPoint = context3d->insertSyncPoint(); | 313 syncPoint = context3d->insertSyncPoint(); |
314 } | 314 } |
315 resource->mailbox.RunReleaseCallback(syncPoint); | 315 resource->mailbox.RunReleaseCallback(syncPoint); |
316 } | 316 } |
(...skipping 21 matching lines...) Expand all Loading... |
338 Resource* resource = &it->second; | 338 Resource* resource = &it->second; |
339 DCHECK(!resource->lockedForWrite); | 339 DCHECK(!resource->lockedForWrite); |
340 DCHECK(!resource->lockForReadCount); | 340 DCHECK(!resource->lockForReadCount); |
341 DCHECK(!resource->external); | 341 DCHECK(!resource->external); |
342 DCHECK(!resource->exported); | 342 DCHECK(!resource->exported); |
343 DCHECK(readLockFenceHasPassed(resource)); | 343 DCHECK(readLockFenceHasPassed(resource)); |
344 lazyAllocate(resource); | 344 lazyAllocate(resource); |
345 | 345 |
346 if (resource->glId) { | 346 if (resource->glId) { |
347 DCHECK(!resource->pendingSetPixels); | 347 DCHECK(!resource->pendingSetPixels); |
348 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 348 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
349 DCHECK(context3d); | 349 DCHECK(context3d); |
350 DCHECK(m_textureUploader.get()); | 350 DCHECK(m_textureUploader.get()); |
351 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); | 351 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); |
352 m_textureUploader->upload(image, | 352 m_textureUploader->upload(image, |
353 imageRect, | 353 imageRect, |
354 sourceRect, | 354 sourceRect, |
355 destOffset, | 355 destOffset, |
356 resource->format, | 356 resource->format, |
357 resource->size); | 357 resource->size); |
358 } | 358 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
402 { | 402 { |
403 if (!m_textureUploader) | 403 if (!m_textureUploader) |
404 return; | 404 return; |
405 | 405 |
406 m_textureUploader->flush(); | 406 m_textureUploader->flush(); |
407 } | 407 } |
408 | 408 |
409 void ResourceProvider::flush() | 409 void ResourceProvider::flush() |
410 { | 410 { |
411 DCHECK(m_threadChecker.CalledOnValidThread()); | 411 DCHECK(m_threadChecker.CalledOnValidThread()); |
412 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 412 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
413 if (context3d) | 413 if (context3d) |
414 context3d->flush(); | 414 context3d->flush(); |
415 } | 415 } |
416 | 416 |
417 bool ResourceProvider::shallowFlushIfSupported() | 417 bool ResourceProvider::shallowFlushIfSupported() |
418 { | 418 { |
419 DCHECK(m_threadChecker.CalledOnValidThread()); | 419 DCHECK(m_threadChecker.CalledOnValidThread()); |
420 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 420 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
421 if (!context3d || !m_useShallowFlush) | 421 if (!context3d || !m_useShallowFlush) |
422 return false; | 422 return false; |
423 | 423 |
424 context3d->shallowFlushCHROMIUM(); | 424 context3d->shallowFlushCHROMIUM(); |
425 return true; | 425 return true; |
426 } | 426 } |
427 | 427 |
428 const ResourceProvider::Resource* ResourceProvider::lockForRead(ResourceId id) | 428 const ResourceProvider::Resource* ResourceProvider::lockForRead(ResourceId id) |
429 { | 429 { |
430 DCHECK(m_threadChecker.CalledOnValidThread()); | 430 DCHECK(m_threadChecker.CalledOnValidThread()); |
431 ResourceMap::iterator it = m_resources.find(id); | 431 ResourceMap::iterator it = m_resources.find(id); |
432 CHECK(it != m_resources.end()); | 432 CHECK(it != m_resources.end()); |
433 Resource* resource = &it->second; | 433 Resource* resource = &it->second; |
434 DCHECK(!resource->lockedForWrite); | 434 DCHECK(!resource->lockedForWrite); |
435 DCHECK(!resource->exported); | 435 DCHECK(!resource->exported); |
436 DCHECK(resource->allocated); // Uninitialized! Call setPixels or lockForWrit
e first. | 436 DCHECK(resource->allocated); // Uninitialized! Call setPixels or lockForWrit
e first. |
437 | 437 |
438 if (!resource->glId && resource->external && !resource->mailbox.IsEmpty()) { | 438 if (!resource->glId && resource->external && !resource->mailbox.IsEmpty()) { |
439 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 439 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
440 DCHECK(context3d); | 440 DCHECK(context3d); |
441 if (resource->mailbox.sync_point()) { | 441 if (resource->mailbox.sync_point()) { |
442 GLC(context3d, context3d->waitSyncPoint(resource->mailbox.sync_point
())); | 442 GLC(context3d, context3d->waitSyncPoint(resource->mailbox.sync_point
())); |
443 resource->mailbox.ResetSyncPoint(); | 443 resource->mailbox.ResetSyncPoint(); |
444 } | 444 } |
445 resource->glId = context3d->createTexture(); | 445 resource->glId = context3d->createTexture(); |
446 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)); | 446 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)); |
447 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, resource
->mailbox.data())); | 447 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, resource
->mailbox.data())); |
448 } | 448 } |
449 | 449 |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 , m_useTextureUsageHint(false) | 581 , m_useTextureUsageHint(false) |
582 , m_useShallowFlush(false) | 582 , m_useShallowFlush(false) |
583 , m_maxTextureSize(0) | 583 , m_maxTextureSize(0) |
584 , m_bestTextureFormat(0) | 584 , m_bestTextureFormat(0) |
585 { | 585 { |
586 } | 586 } |
587 | 587 |
588 bool ResourceProvider::initialize() | 588 bool ResourceProvider::initialize() |
589 { | 589 { |
590 DCHECK(m_threadChecker.CalledOnValidThread()); | 590 DCHECK(m_threadChecker.CalledOnValidThread()); |
591 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 591 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
592 if (!context3d) { | 592 if (!context3d) { |
593 m_maxTextureSize = INT_MAX / 2; | 593 m_maxTextureSize = INT_MAX / 2; |
594 m_bestTextureFormat = GL_RGBA; | 594 m_bestTextureFormat = GL_RGBA; |
595 return true; | 595 return true; |
596 } | 596 } |
597 if (!context3d->makeContextCurrent()) | 597 if (!context3d->makeContextCurrent()) |
598 return false; | 598 return false; |
599 | 599 |
600 std::string extensionsString = UTF16ToASCII(context3d->getString(GL_EXTENSIO
NS)); | 600 std::string extensionsString = UTF16ToASCII(context3d->getString(GL_EXTENSIO
NS)); |
601 std::vector<std::string> extensions; | 601 std::vector<std::string> extensions; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
652 ChildMap::const_iterator it = m_children.find(child); | 652 ChildMap::const_iterator it = m_children.find(child); |
653 DCHECK(it != m_children.end()); | 653 DCHECK(it != m_children.end()); |
654 return it->second.childToParentMap; | 654 return it->second.childToParentMap; |
655 } | 655 } |
656 | 656 |
657 void ResourceProvider::prepareSendToParent(const ResourceIdArray& resources, Tra
nsferableResourceList* list) | 657 void ResourceProvider::prepareSendToParent(const ResourceIdArray& resources, Tra
nsferableResourceList* list) |
658 { | 658 { |
659 DCHECK(m_threadChecker.CalledOnValidThread()); | 659 DCHECK(m_threadChecker.CalledOnValidThread()); |
660 list->sync_point = 0; | 660 list->sync_point = 0; |
661 list->resources.clear(); | 661 list->resources.clear(); |
662 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 662 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
663 if (!context3d || !context3d->makeContextCurrent()) { | 663 if (!context3d || !context3d->makeContextCurrent()) { |
664 // FIXME: Implement this path for software compositing. | 664 // FIXME: Implement this path for software compositing. |
665 return; | 665 return; |
666 } | 666 } |
667 for (ResourceIdArray::const_iterator it = resources.begin(); it != resources
.end(); ++it) { | 667 for (ResourceIdArray::const_iterator it = resources.begin(); it != resources
.end(); ++it) { |
668 TransferableResource resource; | 668 TransferableResource resource; |
669 if (transferResource(context3d, *it, &resource)) { | 669 if (transferResource(context3d, *it, &resource)) { |
670 m_resources.find(*it)->second.exported = true; | 670 m_resources.find(*it)->second.exported = true; |
671 list->resources.push_back(resource); | 671 list->resources.push_back(resource); |
672 } | 672 } |
673 } | 673 } |
674 if (list->resources.size()) | 674 if (list->resources.size()) |
675 list->sync_point = context3d->insertSyncPoint(); | 675 list->sync_point = context3d->insertSyncPoint(); |
676 } | 676 } |
677 | 677 |
678 void ResourceProvider::prepareSendToChild(int child, const ResourceIdArray& reso
urces, TransferableResourceList* list) | 678 void ResourceProvider::prepareSendToChild(int child, const ResourceIdArray& reso
urces, TransferableResourceList* list) |
679 { | 679 { |
680 DCHECK(m_threadChecker.CalledOnValidThread()); | 680 DCHECK(m_threadChecker.CalledOnValidThread()); |
681 list->sync_point = 0; | 681 list->sync_point = 0; |
682 list->resources.clear(); | 682 list->resources.clear(); |
683 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 683 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
684 if (!context3d || !context3d->makeContextCurrent()) { | 684 if (!context3d || !context3d->makeContextCurrent()) { |
685 // FIXME: Implement this path for software compositing. | 685 // FIXME: Implement this path for software compositing. |
686 return; | 686 return; |
687 } | 687 } |
688 Child& childInfo = m_children.find(child)->second; | 688 Child& childInfo = m_children.find(child)->second; |
689 for (ResourceIdArray::const_iterator it = resources.begin(); it != resources
.end(); ++it) { | 689 for (ResourceIdArray::const_iterator it = resources.begin(); it != resources
.end(); ++it) { |
690 TransferableResource resource; | 690 TransferableResource resource; |
691 if (!transferResource(context3d, *it, &resource)) | 691 if (!transferResource(context3d, *it, &resource)) |
692 NOTREACHED(); | 692 NOTREACHED(); |
693 DCHECK(childInfo.parentToChildMap.find(*it) != childInfo.parentToChildMa
p.end()); | 693 DCHECK(childInfo.parentToChildMap.find(*it) != childInfo.parentToChildMa
p.end()); |
694 resource.id = childInfo.parentToChildMap[*it]; | 694 resource.id = childInfo.parentToChildMap[*it]; |
695 childInfo.parentToChildMap.erase(*it); | 695 childInfo.parentToChildMap.erase(*it); |
696 childInfo.childToParentMap.erase(resource.id); | 696 childInfo.childToParentMap.erase(resource.id); |
697 list->resources.push_back(resource); | 697 list->resources.push_back(resource); |
698 deleteResource(*it); | 698 deleteResource(*it); |
699 } | 699 } |
700 if (list->resources.size()) | 700 if (list->resources.size()) |
701 list->sync_point = context3d->insertSyncPoint(); | 701 list->sync_point = context3d->insertSyncPoint(); |
702 } | 702 } |
703 | 703 |
704 void ResourceProvider::receiveFromChild(int child, const TransferableResourceLis
t& resources) | 704 void ResourceProvider::receiveFromChild(int child, const TransferableResourceLis
t& resources) |
705 { | 705 { |
706 DCHECK(m_threadChecker.CalledOnValidThread()); | 706 DCHECK(m_threadChecker.CalledOnValidThread()); |
707 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 707 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
708 if (!context3d || !context3d->makeContextCurrent()) { | 708 if (!context3d || !context3d->makeContextCurrent()) { |
709 // FIXME: Implement this path for software compositing. | 709 // FIXME: Implement this path for software compositing. |
710 return; | 710 return; |
711 } | 711 } |
712 if (resources.sync_point) { | 712 if (resources.sync_point) { |
713 // NOTE: If the parent is a browser and the child a renderer, the parent | 713 // NOTE: If the parent is a browser and the child a renderer, the parent |
714 // is not supposed to have its context wait, because that could induce | 714 // is not supposed to have its context wait, because that could induce |
715 // deadlocks and/or security issues. The caller is responsible for | 715 // deadlocks and/or security issues. The caller is responsible for |
716 // waiting asynchronously, and resetting sync_point before calling this. | 716 // waiting asynchronously, and resetting sync_point before calling this. |
717 // However if the parent is a renderer (e.g. browser tag), it may be ok | 717 // However if the parent is a renderer (e.g. browser tag), it may be ok |
(...skipping 13 matching lines...) Expand all Loading... |
731 resource.allocated = true; | 731 resource.allocated = true; |
732 m_resources[id] = resource; | 732 m_resources[id] = resource; |
733 childInfo.parentToChildMap[id] = it->id; | 733 childInfo.parentToChildMap[id] = it->id; |
734 childInfo.childToParentMap[it->id] = id; | 734 childInfo.childToParentMap[it->id] = id; |
735 } | 735 } |
736 } | 736 } |
737 | 737 |
738 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc
es) | 738 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc
es) |
739 { | 739 { |
740 DCHECK(m_threadChecker.CalledOnValidThread()); | 740 DCHECK(m_threadChecker.CalledOnValidThread()); |
741 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 741 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
742 if (!context3d || !context3d->makeContextCurrent()) { | 742 if (!context3d || !context3d->makeContextCurrent()) { |
743 // FIXME: Implement this path for software compositing. | 743 // FIXME: Implement this path for software compositing. |
744 return; | 744 return; |
745 } | 745 } |
746 if (resources.sync_point) | 746 if (resources.sync_point) |
747 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); | 747 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); |
748 for (TransferableResourceArray::const_iterator it = resources.resources.begi
n(); it != resources.resources.end(); ++it) { | 748 for (TransferableResourceArray::const_iterator it = resources.resources.begi
n(); it != resources.resources.end(); ++it) { |
749 ResourceMap::iterator mapIterator = m_resources.find(it->id); | 749 ResourceMap::iterator mapIterator = m_resources.find(it->id); |
750 DCHECK(mapIterator != m_resources.end()); | 750 DCHECK(mapIterator != m_resources.end()); |
751 Resource* resource = &mapIterator->second; | 751 Resource* resource = &mapIterator->second; |
752 DCHECK(resource->exported); | 752 DCHECK(resource->exported); |
753 resource->exported = false; | 753 resource->exported = false; |
754 DCHECK(resource->mailbox.Equals(it->mailbox)); | 754 DCHECK(resource->mailbox.Equals(it->mailbox)); |
755 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)); | 755 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)); |
756 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail
box.name)); | 756 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail
box.name)); |
757 if (resource->markedForDeletion) | 757 if (resource->markedForDeletion) |
758 deleteResourceInternal(mapIterator); | 758 deleteResourceInternal(mapIterator); |
759 } | 759 } |
760 } | 760 } |
761 | 761 |
762 bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI
d id, TransferableResource* resource) | 762 bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI
d id, TransferableResource* resource) |
763 { | 763 { |
764 DCHECK(m_threadChecker.CalledOnValidThread()); | 764 DCHECK(m_threadChecker.CalledOnValidThread()); |
765 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 765 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
766 ResourceMap::iterator it = m_resources.find(id); | 766 ResourceMap::iterator it = m_resources.find(id); |
767 CHECK(it != m_resources.end()); | 767 CHECK(it != m_resources.end()); |
768 Resource* source = &it->second; | 768 Resource* source = &it->second; |
769 DCHECK(!source->lockedForWrite); | 769 DCHECK(!source->lockedForWrite); |
770 DCHECK(!source->lockForReadCount); | 770 DCHECK(!source->lockForReadCount); |
771 DCHECK(!source->external || (source->external && !source->mailbox.IsEmpty())
); | 771 DCHECK(!source->external || (source->external && !source->mailbox.IsEmpty())
); |
772 DCHECK(source->allocated); | 772 DCHECK(source->allocated); |
773 if (source->exported) | 773 if (source->exported) |
774 return false; | 774 return false; |
775 resource->id = id; | 775 resource->id = id; |
(...skipping 15 matching lines...) Expand all Loading... |
791 void ResourceProvider::acquirePixelBuffer(ResourceId id) | 791 void ResourceProvider::acquirePixelBuffer(ResourceId id) |
792 { | 792 { |
793 DCHECK(m_threadChecker.CalledOnValidThread()); | 793 DCHECK(m_threadChecker.CalledOnValidThread()); |
794 ResourceMap::iterator it = m_resources.find(id); | 794 ResourceMap::iterator it = m_resources.find(id); |
795 CHECK(it != m_resources.end()); | 795 CHECK(it != m_resources.end()); |
796 Resource* resource = &it->second; | 796 Resource* resource = &it->second; |
797 DCHECK(!resource->external); | 797 DCHECK(!resource->external); |
798 DCHECK(!resource->exported); | 798 DCHECK(!resource->exported); |
799 | 799 |
800 if (resource->glId) { | 800 if (resource->glId) { |
801 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 801 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
802 DCHECK(context3d); | 802 DCHECK(context3d); |
803 if (!resource->glPixelBufferId) | 803 if (!resource->glPixelBufferId) |
804 resource->glPixelBufferId = context3d->createBuffer(); | 804 resource->glPixelBufferId = context3d->createBuffer(); |
805 context3d->bindBuffer( | 805 context3d->bindBuffer( |
806 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 806 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
807 resource->glPixelBufferId); | 807 resource->glPixelBufferId); |
808 context3d->bufferData( | 808 context3d->bufferData( |
809 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 809 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
810 resource->size.width() * resource->size.height() * 4, | 810 resource->size.width() * resource->size.height() * 4, |
811 NULL, | 811 NULL, |
(...skipping 14 matching lines...) Expand all Loading... |
826 { | 826 { |
827 DCHECK(m_threadChecker.CalledOnValidThread()); | 827 DCHECK(m_threadChecker.CalledOnValidThread()); |
828 ResourceMap::iterator it = m_resources.find(id); | 828 ResourceMap::iterator it = m_resources.find(id); |
829 CHECK(it != m_resources.end()); | 829 CHECK(it != m_resources.end()); |
830 Resource* resource = &it->second; | 830 Resource* resource = &it->second; |
831 DCHECK(!resource->external); | 831 DCHECK(!resource->external); |
832 DCHECK(!resource->exported); | 832 DCHECK(!resource->exported); |
833 | 833 |
834 if (resource->glId) { | 834 if (resource->glId) { |
835 DCHECK(resource->glPixelBufferId); | 835 DCHECK(resource->glPixelBufferId); |
836 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 836 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
837 DCHECK(context3d); | 837 DCHECK(context3d); |
838 context3d->bindBuffer( | 838 context3d->bindBuffer( |
839 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 839 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
840 resource->glPixelBufferId); | 840 resource->glPixelBufferId); |
841 context3d->bufferData( | 841 context3d->bufferData( |
842 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 842 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
843 0, | 843 0, |
844 NULL, | 844 NULL, |
845 GL_DYNAMIC_DRAW); | 845 GL_DYNAMIC_DRAW); |
846 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 846 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
(...skipping 10 matching lines...) Expand all Loading... |
857 uint8_t* ResourceProvider::mapPixelBuffer(ResourceId id) | 857 uint8_t* ResourceProvider::mapPixelBuffer(ResourceId id) |
858 { | 858 { |
859 DCHECK(m_threadChecker.CalledOnValidThread()); | 859 DCHECK(m_threadChecker.CalledOnValidThread()); |
860 ResourceMap::iterator it = m_resources.find(id); | 860 ResourceMap::iterator it = m_resources.find(id); |
861 CHECK(it != m_resources.end()); | 861 CHECK(it != m_resources.end()); |
862 Resource* resource = &it->second; | 862 Resource* resource = &it->second; |
863 DCHECK(!resource->external); | 863 DCHECK(!resource->external); |
864 DCHECK(!resource->exported); | 864 DCHECK(!resource->exported); |
865 | 865 |
866 if (resource->glId) { | 866 if (resource->glId) { |
867 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 867 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
868 DCHECK(context3d); | 868 DCHECK(context3d); |
869 DCHECK(resource->glPixelBufferId); | 869 DCHECK(resource->glPixelBufferId); |
870 context3d->bindBuffer( | 870 context3d->bindBuffer( |
871 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 871 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
872 resource->glPixelBufferId); | 872 resource->glPixelBufferId); |
873 uint8_t* image = static_cast<uint8_t*>( | 873 uint8_t* image = static_cast<uint8_t*>( |
874 context3d->mapBufferCHROMIUM( | 874 context3d->mapBufferCHROMIUM( |
875 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); | 875 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); |
876 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 876 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
877 DCHECK(image); | 877 DCHECK(image); |
878 return image; | 878 return image; |
879 } | 879 } |
880 | 880 |
881 if (resource->pixels) | 881 if (resource->pixels) |
882 return resource->pixelBuffer; | 882 return resource->pixelBuffer; |
883 | 883 |
884 return NULL; | 884 return NULL; |
885 } | 885 } |
886 | 886 |
887 void ResourceProvider::unmapPixelBuffer(ResourceId id) | 887 void ResourceProvider::unmapPixelBuffer(ResourceId id) |
888 { | 888 { |
889 DCHECK(m_threadChecker.CalledOnValidThread()); | 889 DCHECK(m_threadChecker.CalledOnValidThread()); |
890 ResourceMap::iterator it = m_resources.find(id); | 890 ResourceMap::iterator it = m_resources.find(id); |
891 CHECK(it != m_resources.end()); | 891 CHECK(it != m_resources.end()); |
892 Resource* resource = &it->second; | 892 Resource* resource = &it->second; |
893 DCHECK(!resource->external); | 893 DCHECK(!resource->external); |
894 DCHECK(!resource->exported); | 894 DCHECK(!resource->exported); |
895 | 895 |
896 if (resource->glId) { | 896 if (resource->glId) { |
897 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 897 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
898 DCHECK(context3d); | 898 DCHECK(context3d); |
899 DCHECK(resource->glPixelBufferId); | 899 DCHECK(resource->glPixelBufferId); |
900 context3d->bindBuffer( | 900 context3d->bindBuffer( |
901 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 901 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
902 resource->glPixelBufferId); | 902 resource->glPixelBufferId); |
903 context3d->unmapBufferCHROMIUM( | 903 context3d->unmapBufferCHROMIUM( |
904 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); | 904 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); |
905 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 905 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
906 } | 906 } |
907 } | 907 } |
908 | 908 |
909 void ResourceProvider::setPixelsFromBuffer(ResourceId id) | 909 void ResourceProvider::setPixelsFromBuffer(ResourceId id) |
910 { | 910 { |
911 DCHECK(m_threadChecker.CalledOnValidThread()); | 911 DCHECK(m_threadChecker.CalledOnValidThread()); |
912 ResourceMap::iterator it = m_resources.find(id); | 912 ResourceMap::iterator it = m_resources.find(id); |
913 CHECK(it != m_resources.end()); | 913 CHECK(it != m_resources.end()); |
914 Resource* resource = &it->second; | 914 Resource* resource = &it->second; |
915 DCHECK(!resource->lockedForWrite); | 915 DCHECK(!resource->lockedForWrite); |
916 DCHECK(!resource->lockForReadCount); | 916 DCHECK(!resource->lockForReadCount); |
917 DCHECK(!resource->external); | 917 DCHECK(!resource->external); |
918 DCHECK(!resource->exported); | 918 DCHECK(!resource->exported); |
919 DCHECK(readLockFenceHasPassed(resource)); | 919 DCHECK(readLockFenceHasPassed(resource)); |
920 lazyAllocate(resource); | 920 lazyAllocate(resource); |
921 | 921 |
922 if (resource->glId) { | 922 if (resource->glId) { |
923 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 923 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
924 DCHECK(context3d); | 924 DCHECK(context3d); |
925 DCHECK(resource->glPixelBufferId); | 925 DCHECK(resource->glPixelBufferId); |
926 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); | 926 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); |
927 context3d->bindBuffer( | 927 context3d->bindBuffer( |
928 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 928 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
929 resource->glPixelBufferId); | 929 resource->glPixelBufferId); |
930 context3d->texSubImage2D(GL_TEXTURE_2D, | 930 context3d->texSubImage2D(GL_TEXTURE_2D, |
931 0, /* level */ | 931 0, /* level */ |
932 0, /* x */ | 932 0, /* x */ |
933 0, /* y */ | 933 0, /* y */ |
(...skipping 16 matching lines...) Expand all Loading... |
950 | 950 |
951 ScopedWriteLockSoftware lock(this, id); | 951 ScopedWriteLockSoftware lock(this, id); |
952 SkCanvas* dest = lock.skCanvas(); | 952 SkCanvas* dest = lock.skCanvas(); |
953 dest->writePixels(src, 0, 0); | 953 dest->writePixels(src, 0, 0); |
954 } | 954 } |
955 } | 955 } |
956 | 956 |
957 void ResourceProvider::bindForSampling(ResourceProvider::ResourceId resourceId,
GLenum target, GLenum filter) | 957 void ResourceProvider::bindForSampling(ResourceProvider::ResourceId resourceId,
GLenum target, GLenum filter) |
958 { | 958 { |
959 DCHECK(m_threadChecker.CalledOnValidThread()); | 959 DCHECK(m_threadChecker.CalledOnValidThread()); |
960 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 960 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
961 ResourceMap::iterator it = m_resources.find(resourceId); | 961 ResourceMap::iterator it = m_resources.find(resourceId); |
962 DCHECK(it != m_resources.end()); | 962 DCHECK(it != m_resources.end()); |
963 Resource* resource = &it->second; | 963 Resource* resource = &it->second; |
964 DCHECK(resource->lockForReadCount); | 964 DCHECK(resource->lockForReadCount); |
965 DCHECK(!resource->lockedForWrite); | 965 DCHECK(!resource->lockedForWrite); |
966 | 966 |
967 GLC(context3d, context3d->bindTexture(target, resource->glId)); | 967 GLC(context3d, context3d->bindTexture(target, resource->glId)); |
968 if (filter != resource->filter) { | 968 if (filter != resource->filter) { |
969 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MIN_FILTER, f
ilter)); | 969 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MIN_FILTER, f
ilter)); |
970 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MAG_FILTER, f
ilter)); | 970 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MAG_FILTER, f
ilter)); |
971 resource->filter = filter; | 971 resource->filter = filter; |
972 } | 972 } |
973 } | 973 } |
974 | 974 |
975 void ResourceProvider::beginSetPixels(ResourceId id) | 975 void ResourceProvider::beginSetPixels(ResourceId id) |
976 { | 976 { |
977 DCHECK(m_threadChecker.CalledOnValidThread()); | 977 DCHECK(m_threadChecker.CalledOnValidThread()); |
978 ResourceMap::iterator it = m_resources.find(id); | 978 ResourceMap::iterator it = m_resources.find(id); |
979 CHECK(it != m_resources.end()); | 979 CHECK(it != m_resources.end()); |
980 Resource* resource = &it->second; | 980 Resource* resource = &it->second; |
981 DCHECK(!resource->pendingSetPixels); | 981 DCHECK(!resource->pendingSetPixels); |
982 DCHECK(resource->glId || resource->allocated); | 982 DCHECK(resource->glId || resource->allocated); |
983 DCHECK(readLockFenceHasPassed(resource)); | 983 DCHECK(readLockFenceHasPassed(resource)); |
984 | 984 |
985 bool allocate = !resource->allocated; | 985 bool allocate = !resource->allocated; |
986 resource->allocated = true; | 986 resource->allocated = true; |
987 lockForWrite(id); | 987 lockForWrite(id); |
988 | 988 |
989 if (resource->glId) { | 989 if (resource->glId) { |
990 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 990 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
991 DCHECK(context3d); | 991 DCHECK(context3d); |
992 DCHECK(resource->glPixelBufferId); | 992 DCHECK(resource->glPixelBufferId); |
993 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); | 993 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); |
994 context3d->bindBuffer( | 994 context3d->bindBuffer( |
995 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 995 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
996 resource->glPixelBufferId); | 996 resource->glPixelBufferId); |
997 if (!resource->glUploadQueryId) | 997 if (!resource->glUploadQueryId) |
998 resource->glUploadQueryId = context3d->createQueryEXT(); | 998 resource->glUploadQueryId = context3d->createQueryEXT(); |
999 context3d->beginQueryEXT( | 999 context3d->beginQueryEXT( |
1000 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, | 1000 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1032 | 1032 |
1033 bool ResourceProvider::didSetPixelsComplete(ResourceId id) { | 1033 bool ResourceProvider::didSetPixelsComplete(ResourceId id) { |
1034 DCHECK(m_threadChecker.CalledOnValidThread()); | 1034 DCHECK(m_threadChecker.CalledOnValidThread()); |
1035 ResourceMap::iterator it = m_resources.find(id); | 1035 ResourceMap::iterator it = m_resources.find(id); |
1036 CHECK(it != m_resources.end()); | 1036 CHECK(it != m_resources.end()); |
1037 Resource* resource = &it->second; | 1037 Resource* resource = &it->second; |
1038 DCHECK(resource->lockedForWrite); | 1038 DCHECK(resource->lockedForWrite); |
1039 DCHECK(resource->pendingSetPixels); | 1039 DCHECK(resource->pendingSetPixels); |
1040 | 1040 |
1041 if (resource->glId) { | 1041 if (resource->glId) { |
1042 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 1042 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
1043 DCHECK(context3d); | 1043 DCHECK(context3d); |
1044 DCHECK(resource->glUploadQueryId); | 1044 DCHECK(resource->glUploadQueryId); |
1045 unsigned complete = 1; | 1045 unsigned complete = 1; |
1046 context3d->getQueryObjectuivEXT( | 1046 context3d->getQueryObjectuivEXT( |
1047 resource->glUploadQueryId, | 1047 resource->glUploadQueryId, |
1048 GL_QUERY_RESULT_AVAILABLE_EXT, | 1048 GL_QUERY_RESULT_AVAILABLE_EXT, |
1049 &complete); | 1049 &complete); |
1050 if (!complete) | 1050 if (!complete) |
1051 return false; | 1051 return false; |
1052 } | 1052 } |
1053 | 1053 |
1054 resource->pendingSetPixels = false; | 1054 resource->pendingSetPixels = false; |
1055 unlockForWrite(id); | 1055 unlockForWrite(id); |
1056 | 1056 |
1057 return true; | 1057 return true; |
1058 } | 1058 } |
1059 | 1059 |
1060 void ResourceProvider::abortSetPixels(ResourceId id) { | 1060 void ResourceProvider::abortSetPixels(ResourceId id) { |
1061 DCHECK(m_threadChecker.CalledOnValidThread()); | 1061 DCHECK(m_threadChecker.CalledOnValidThread()); |
1062 ResourceMap::iterator it = m_resources.find(id); | 1062 ResourceMap::iterator it = m_resources.find(id); |
1063 CHECK(it != m_resources.end()); | 1063 CHECK(it != m_resources.end()); |
1064 Resource* resource = &it->second; | 1064 Resource* resource = &it->second; |
1065 DCHECK(resource->lockedForWrite); | 1065 DCHECK(resource->lockedForWrite); |
1066 DCHECK(resource->pendingSetPixels); | 1066 DCHECK(resource->pendingSetPixels); |
1067 | 1067 |
1068 if (resource->glId) { | 1068 if (resource->glId) { |
1069 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 1069 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
1070 DCHECK(context3d); | 1070 DCHECK(context3d); |
1071 DCHECK(resource->glUploadQueryId); | 1071 DCHECK(resource->glUploadQueryId); |
1072 // CHROMIUM_async_pixel_transfers currently doesn't have a way to | 1072 // CHROMIUM_async_pixel_transfers currently doesn't have a way to |
1073 // abort an upload. The best we can do is delete the query and | 1073 // abort an upload. The best we can do is delete the query and |
1074 // the texture. | 1074 // the texture. |
1075 context3d->deleteQueryEXT(resource->glUploadQueryId); | 1075 context3d->deleteQueryEXT(resource->glUploadQueryId); |
1076 resource->glUploadQueryId = 0; | 1076 resource->glUploadQueryId = 0; |
1077 context3d->deleteTexture(resource->glId); | 1077 context3d->deleteTexture(resource->glId); |
1078 resource->glId = createTextureId(context3d); | 1078 resource->glId = createTextureId(context3d); |
1079 resource->allocated = false; | 1079 resource->allocated = false; |
(...skipping 10 matching lines...) Expand all Loading... |
1090 lazyAllocate(resource); | 1090 lazyAllocate(resource); |
1091 } | 1091 } |
1092 | 1092 |
1093 void ResourceProvider::lazyAllocate(Resource* resource) { | 1093 void ResourceProvider::lazyAllocate(Resource* resource) { |
1094 DCHECK(resource); | 1094 DCHECK(resource); |
1095 DCHECK(resource->glId || resource->allocated); | 1095 DCHECK(resource->glId || resource->allocated); |
1096 | 1096 |
1097 if (resource->allocated || !resource->glId) | 1097 if (resource->allocated || !resource->glId) |
1098 return; | 1098 return; |
1099 resource->allocated = true; | 1099 resource->allocated = true; |
1100 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); | 1100 WebGraphicsContext3D* context3d = m_outputSurface->context3d(); |
1101 gfx::Size& size = resource->size; | 1101 gfx::Size& size = resource->size; |
1102 GLenum format = resource->format; | 1102 GLenum format = resource->format; |
1103 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)); | 1103 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)); |
1104 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { | 1104 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { |
1105 GLenum storageFormat = textureToStorageFormat(format); | 1105 GLenum storageFormat = textureToStorageFormat(format); |
1106 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma
t, size.width(), size.height())); | 1106 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma
t, size.width(), size.height())); |
1107 } else | 1107 } else |
1108 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt
h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); | 1108 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt
h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); |
1109 } | 1109 } |
1110 | 1110 |
1111 void ResourceProvider::enableReadLockFences(ResourceProvider::ResourceId id, boo
l enable) { | 1111 void ResourceProvider::enableReadLockFences(ResourceProvider::ResourceId id, boo
l enable) { |
1112 DCHECK(m_threadChecker.CalledOnValidThread()); | 1112 DCHECK(m_threadChecker.CalledOnValidThread()); |
1113 ResourceMap::iterator it = m_resources.find(id); | 1113 ResourceMap::iterator it = m_resources.find(id); |
1114 CHECK(it != m_resources.end()); | 1114 CHECK(it != m_resources.end()); |
1115 Resource* resource = &it->second; | 1115 Resource* resource = &it->second; |
1116 resource->enableReadLockFences = enable; | 1116 resource->enableReadLockFences = enable; |
1117 } | 1117 } |
1118 | 1118 |
1119 } // namespace cc | 1119 } // namespace cc |
OLD | NEW |