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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 scoped_ptr<ResourceProvider> ResourceProvider::create(OutputSurface* context) | 118 scoped_ptr<ResourceProvider> ResourceProvider::create(OutputSurface* context) |
119 { | 119 { |
120 scoped_ptr<ResourceProvider> resourceProvider(new ResourceProvider(context))
; | 120 scoped_ptr<ResourceProvider> resourceProvider(new ResourceProvider(context))
; |
121 if (!resourceProvider->initialize()) | 121 if (!resourceProvider->initialize()) |
122 return scoped_ptr<ResourceProvider>(); | 122 return scoped_ptr<ResourceProvider>(); |
123 return resourceProvider.Pass(); | 123 return resourceProvider.Pass(); |
124 } | 124 } |
125 | 125 |
126 ResourceProvider::~ResourceProvider() | 126 ResourceProvider::~ResourceProvider() |
127 { | 127 { |
128 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 128 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
129 if (!context3d || !context3d->makeContextCurrent()) | 129 if (!context3d || !context3d->makeContextCurrent()) |
130 return; | 130 return; |
131 m_textureUploader.reset(); | 131 m_textureUploader.reset(); |
132 m_textureCopier.reset(); | 132 m_textureCopier.reset(); |
133 } | 133 } |
134 | 134 |
135 WebGraphicsContext3D* ResourceProvider::graphicsContext3D() | 135 WebGraphicsContext3D* ResourceProvider::graphicsContext3D() |
136 { | 136 { |
137 DCHECK(m_threadChecker.CalledOnValidThread()); | 137 DCHECK(m_threadChecker.CalledOnValidThread()); |
138 return m_outputSurface->context3D(); | 138 return m_outputSurface->Context3D(); |
139 } | 139 } |
140 | 140 |
141 bool ResourceProvider::inUseByConsumer(ResourceId id) | 141 bool ResourceProvider::inUseByConsumer(ResourceId id) |
142 { | 142 { |
143 DCHECK(m_threadChecker.CalledOnValidThread()); | 143 DCHECK(m_threadChecker.CalledOnValidThread()); |
144 ResourceMap::iterator it = m_resources.find(id); | 144 ResourceMap::iterator it = m_resources.find(id); |
145 CHECK(it != m_resources.end()); | 145 CHECK(it != m_resources.end()); |
146 Resource* resource = &it->second; | 146 Resource* resource = &it->second; |
147 return !!resource->lockForReadCount || resource->exported; | 147 return !!resource->lockForReadCount || resource->exported; |
148 } | 148 } |
(...skipping 12 matching lines...) Expand all Loading... |
161 return 0; | 161 return 0; |
162 } | 162 } |
163 | 163 |
164 ResourceProvider::ResourceId ResourceProvider::createGLTexture(int pool, const g
fx::Size& size, GLenum format, TextureUsageHint hint) | 164 ResourceProvider::ResourceId ResourceProvider::createGLTexture(int pool, const g
fx::Size& size, GLenum format, TextureUsageHint hint) |
165 { | 165 { |
166 DCHECK_LE(size.width(), m_maxTextureSize); | 166 DCHECK_LE(size.width(), m_maxTextureSize); |
167 DCHECK_LE(size.height(), m_maxTextureSize); | 167 DCHECK_LE(size.height(), m_maxTextureSize); |
168 | 168 |
169 DCHECK(m_threadChecker.CalledOnValidThread()); | 169 DCHECK(m_threadChecker.CalledOnValidThread()); |
170 unsigned textureId = 0; | 170 unsigned textureId = 0; |
171 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 171 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
172 DCHECK(context3d); | 172 DCHECK(context3d); |
173 GLC(context3d, textureId = context3d->createTexture()); | 173 GLC(context3d, textureId = context3d->createTexture()); |
174 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 174 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
175 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); | 175 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); |
176 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); | 176 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); |
177 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); | 177 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); |
178 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); | 178 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); |
179 | 179 |
180 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) | 180 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) |
181 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_
ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); | 181 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_
ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); |
(...skipping 18 matching lines...) Expand all Loading... |
200 ResourceId id = m_nextId++; | 200 ResourceId id = m_nextId++; |
201 Resource resource(pixels, pool, size, GL_RGBA, GL_LINEAR); | 201 Resource resource(pixels, pool, size, GL_RGBA, GL_LINEAR); |
202 m_resources[id] = resource; | 202 m_resources[id] = resource; |
203 return id; | 203 return id; |
204 } | 204 } |
205 | 205 |
206 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture
(unsigned textureId) | 206 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture
(unsigned textureId) |
207 { | 207 { |
208 DCHECK(m_threadChecker.CalledOnValidThread()); | 208 DCHECK(m_threadChecker.CalledOnValidThread()); |
209 | 209 |
210 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 210 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
211 DCHECK(context3d); | 211 DCHECK(context3d); |
212 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 212 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
213 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); | 213 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, GL_LINEAR)); |
214 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); | 214 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, GL_LINEAR)); |
215 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); | 215 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL
_CLAMP_TO_EDGE)); |
216 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); | 216 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL
_CLAMP_TO_EDGE)); |
217 | 217 |
218 ResourceId id = m_nextId++; | 218 ResourceId id = m_nextId++; |
219 Resource resource(textureId, 0, gfx::Size(), 0, GL_LINEAR); | 219 Resource resource(textureId, 0, gfx::Size(), 0, GL_LINEAR); |
220 resource.external = true; | 220 resource.external = true; |
(...skipping 15 matching lines...) Expand all Loading... |
236 resource->markedForDeletion = true; | 236 resource->markedForDeletion = true; |
237 return; | 237 return; |
238 } else | 238 } else |
239 deleteResourceInternal(it); | 239 deleteResourceInternal(it); |
240 } | 240 } |
241 | 241 |
242 void ResourceProvider::deleteResourceInternal(ResourceMap::iterator it) | 242 void ResourceProvider::deleteResourceInternal(ResourceMap::iterator it) |
243 { | 243 { |
244 Resource* resource = &it->second; | 244 Resource* resource = &it->second; |
245 if (resource->glId && !resource->external) { | 245 if (resource->glId && !resource->external) { |
246 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 246 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
247 DCHECK(context3d); | 247 DCHECK(context3d); |
248 GLC(context3d, context3d->deleteTexture(resource->glId)); | 248 GLC(context3d, context3d->deleteTexture(resource->glId)); |
249 } | 249 } |
250 if (resource->glUploadQueryId) { | 250 if (resource->glUploadQueryId) { |
251 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 251 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
252 DCHECK(context3d); | 252 DCHECK(context3d); |
253 GLC(context3d, context3d->deleteQueryEXT(resource->glUploadQueryId)); | 253 GLC(context3d, context3d->deleteQueryEXT(resource->glUploadQueryId)); |
254 } | 254 } |
255 if (resource->glPixelBufferId) { | 255 if (resource->glPixelBufferId) { |
256 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 256 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
257 DCHECK(context3d); | 257 DCHECK(context3d); |
258 GLC(context3d, context3d->deleteBuffer(resource->glPixelBufferId)); | 258 GLC(context3d, context3d->deleteBuffer(resource->glPixelBufferId)); |
259 } | 259 } |
260 if (resource->pixels) | 260 if (resource->pixels) |
261 delete[] resource->pixels; | 261 delete[] resource->pixels; |
262 if (resource->pixelBuffer) | 262 if (resource->pixelBuffer) |
263 delete[] resource->pixelBuffer; | 263 delete[] resource->pixelBuffer; |
264 | 264 |
265 m_resources.erase(it); | 265 m_resources.erase(it); |
266 } | 266 } |
(...skipping 23 matching lines...) Expand all Loading... |
290 DCHECK(m_threadChecker.CalledOnValidThread()); | 290 DCHECK(m_threadChecker.CalledOnValidThread()); |
291 ResourceMap::iterator it = m_resources.find(id); | 291 ResourceMap::iterator it = m_resources.find(id); |
292 CHECK(it != m_resources.end()); | 292 CHECK(it != m_resources.end()); |
293 Resource* resource = &it->second; | 293 Resource* resource = &it->second; |
294 DCHECK(!resource->lockedForWrite); | 294 DCHECK(!resource->lockedForWrite); |
295 DCHECK(!resource->lockForReadCount); | 295 DCHECK(!resource->lockForReadCount); |
296 DCHECK(!resource->external); | 296 DCHECK(!resource->external); |
297 DCHECK(!resource->exported); | 297 DCHECK(!resource->exported); |
298 | 298 |
299 if (resource->glId) { | 299 if (resource->glId) { |
300 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 300 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
301 DCHECK(context3d); | 301 DCHECK(context3d); |
302 DCHECK(m_textureUploader.get()); | 302 DCHECK(m_textureUploader.get()); |
303 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); | 303 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); |
304 m_textureUploader->upload(image, | 304 m_textureUploader->upload(image, |
305 imageRect, | 305 imageRect, |
306 sourceRect, | 306 sourceRect, |
307 destOffset, | 307 destOffset, |
308 resource->format, | 308 resource->format, |
309 resource->size); | 309 resource->size); |
310 } | 310 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 { | 353 { |
354 if (!m_textureUploader) | 354 if (!m_textureUploader) |
355 return; | 355 return; |
356 | 356 |
357 m_textureUploader->flush(); | 357 m_textureUploader->flush(); |
358 } | 358 } |
359 | 359 |
360 void ResourceProvider::flush() | 360 void ResourceProvider::flush() |
361 { | 361 { |
362 DCHECK(m_threadChecker.CalledOnValidThread()); | 362 DCHECK(m_threadChecker.CalledOnValidThread()); |
363 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 363 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
364 if (context3d) | 364 if (context3d) |
365 context3d->flush(); | 365 context3d->flush(); |
366 } | 366 } |
367 | 367 |
368 bool ResourceProvider::shallowFlushIfSupported() | 368 bool ResourceProvider::shallowFlushIfSupported() |
369 { | 369 { |
370 DCHECK(m_threadChecker.CalledOnValidThread()); | 370 DCHECK(m_threadChecker.CalledOnValidThread()); |
371 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 371 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
372 if (!context3d || !m_useShallowFlush) | 372 if (!context3d || !m_useShallowFlush) |
373 return false; | 373 return false; |
374 | 374 |
375 context3d->shallowFlushCHROMIUM(); | 375 context3d->shallowFlushCHROMIUM(); |
376 return true; | 376 return true; |
377 } | 377 } |
378 | 378 |
379 const ResourceProvider::Resource* ResourceProvider::lockForRead(ResourceId id) | 379 const ResourceProvider::Resource* ResourceProvider::lockForRead(ResourceId id) |
380 { | 380 { |
381 DCHECK(m_threadChecker.CalledOnValidThread()); | 381 DCHECK(m_threadChecker.CalledOnValidThread()); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 , m_useTextureStorageExt(false) | 498 , m_useTextureStorageExt(false) |
499 , m_useTextureUsageHint(false) | 499 , m_useTextureUsageHint(false) |
500 , m_useShallowFlush(false) | 500 , m_useShallowFlush(false) |
501 , m_maxTextureSize(0) | 501 , m_maxTextureSize(0) |
502 { | 502 { |
503 } | 503 } |
504 | 504 |
505 bool ResourceProvider::initialize() | 505 bool ResourceProvider::initialize() |
506 { | 506 { |
507 DCHECK(m_threadChecker.CalledOnValidThread()); | 507 DCHECK(m_threadChecker.CalledOnValidThread()); |
508 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 508 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
509 if (!context3d) { | 509 if (!context3d) { |
510 m_maxTextureSize = INT_MAX / 2; | 510 m_maxTextureSize = INT_MAX / 2; |
511 return true; | 511 return true; |
512 } | 512 } |
513 if (!context3d->makeContextCurrent()) | 513 if (!context3d->makeContextCurrent()) |
514 return false; | 514 return false; |
515 | 515 |
516 std::string extensionsString = UTF16ToASCII(context3d->getString(GL_EXTENSIO
NS)); | 516 std::string extensionsString = UTF16ToASCII(context3d->getString(GL_EXTENSIO
NS)); |
517 std::vector<std::string> extensions; | 517 std::vector<std::string> extensions; |
518 base::SplitString(extensionsString, ' ', &extensions); | 518 base::SplitString(extensionsString, ' ', &extensions); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
563 ChildMap::const_iterator it = m_children.find(child); | 563 ChildMap::const_iterator it = m_children.find(child); |
564 DCHECK(it != m_children.end()); | 564 DCHECK(it != m_children.end()); |
565 return it->second.childToParentMap; | 565 return it->second.childToParentMap; |
566 } | 566 } |
567 | 567 |
568 void ResourceProvider::prepareSendToParent(const ResourceIdArray& resources, Tra
nsferableResourceList* list) | 568 void ResourceProvider::prepareSendToParent(const ResourceIdArray& resources, Tra
nsferableResourceList* list) |
569 { | 569 { |
570 DCHECK(m_threadChecker.CalledOnValidThread()); | 570 DCHECK(m_threadChecker.CalledOnValidThread()); |
571 list->sync_point = 0; | 571 list->sync_point = 0; |
572 list->resources.clear(); | 572 list->resources.clear(); |
573 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 573 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
574 if (!context3d || !context3d->makeContextCurrent()) { | 574 if (!context3d || !context3d->makeContextCurrent()) { |
575 // FIXME: Implement this path for software compositing. | 575 // FIXME: Implement this path for software compositing. |
576 return; | 576 return; |
577 } | 577 } |
578 for (ResourceIdArray::const_iterator it = resources.begin(); it != resources
.end(); ++it) { | 578 for (ResourceIdArray::const_iterator it = resources.begin(); it != resources
.end(); ++it) { |
579 TransferableResource resource; | 579 TransferableResource resource; |
580 if (transferResource(context3d, *it, &resource)) { | 580 if (transferResource(context3d, *it, &resource)) { |
581 m_resources.find(*it)->second.exported = true; | 581 m_resources.find(*it)->second.exported = true; |
582 list->resources.push_back(resource); | 582 list->resources.push_back(resource); |
583 } | 583 } |
584 } | 584 } |
585 if (list->resources.size()) | 585 if (list->resources.size()) |
586 list->sync_point = context3d->insertSyncPoint(); | 586 list->sync_point = context3d->insertSyncPoint(); |
587 } | 587 } |
588 | 588 |
589 void ResourceProvider::prepareSendToChild(int child, const ResourceIdArray& reso
urces, TransferableResourceList* list) | 589 void ResourceProvider::prepareSendToChild(int child, const ResourceIdArray& reso
urces, TransferableResourceList* list) |
590 { | 590 { |
591 DCHECK(m_threadChecker.CalledOnValidThread()); | 591 DCHECK(m_threadChecker.CalledOnValidThread()); |
592 list->sync_point = 0; | 592 list->sync_point = 0; |
593 list->resources.clear(); | 593 list->resources.clear(); |
594 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 594 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
595 if (!context3d || !context3d->makeContextCurrent()) { | 595 if (!context3d || !context3d->makeContextCurrent()) { |
596 // FIXME: Implement this path for software compositing. | 596 // FIXME: Implement this path for software compositing. |
597 return; | 597 return; |
598 } | 598 } |
599 Child& childInfo = m_children.find(child)->second; | 599 Child& childInfo = m_children.find(child)->second; |
600 for (ResourceIdArray::const_iterator it = resources.begin(); it != resources
.end(); ++it) { | 600 for (ResourceIdArray::const_iterator it = resources.begin(); it != resources
.end(); ++it) { |
601 TransferableResource resource; | 601 TransferableResource resource; |
602 if (!transferResource(context3d, *it, &resource)) | 602 if (!transferResource(context3d, *it, &resource)) |
603 NOTREACHED(); | 603 NOTREACHED(); |
604 DCHECK(childInfo.parentToChildMap.find(*it) != childInfo.parentToChildMa
p.end()); | 604 DCHECK(childInfo.parentToChildMap.find(*it) != childInfo.parentToChildMa
p.end()); |
605 resource.id = childInfo.parentToChildMap[*it]; | 605 resource.id = childInfo.parentToChildMap[*it]; |
606 childInfo.parentToChildMap.erase(*it); | 606 childInfo.parentToChildMap.erase(*it); |
607 childInfo.childToParentMap.erase(resource.id); | 607 childInfo.childToParentMap.erase(resource.id); |
608 list->resources.push_back(resource); | 608 list->resources.push_back(resource); |
609 deleteResource(*it); | 609 deleteResource(*it); |
610 } | 610 } |
611 if (list->resources.size()) | 611 if (list->resources.size()) |
612 list->sync_point = context3d->insertSyncPoint(); | 612 list->sync_point = context3d->insertSyncPoint(); |
613 } | 613 } |
614 | 614 |
615 void ResourceProvider::receiveFromChild(int child, const TransferableResourceLis
t& resources) | 615 void ResourceProvider::receiveFromChild(int child, const TransferableResourceLis
t& resources) |
616 { | 616 { |
617 DCHECK(m_threadChecker.CalledOnValidThread()); | 617 DCHECK(m_threadChecker.CalledOnValidThread()); |
618 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 618 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
619 if (!context3d || !context3d->makeContextCurrent()) { | 619 if (!context3d || !context3d->makeContextCurrent()) { |
620 // FIXME: Implement this path for software compositing. | 620 // FIXME: Implement this path for software compositing. |
621 return; | 621 return; |
622 } | 622 } |
623 if (resources.sync_point) { | 623 if (resources.sync_point) { |
624 // NOTE: If the parent is a browser and the child a renderer, the parent | 624 // NOTE: If the parent is a browser and the child a renderer, the parent |
625 // is not supposed to have its context wait, because that could induce | 625 // is not supposed to have its context wait, because that could induce |
626 // deadlocks and/or security issues. The caller is responsible for | 626 // deadlocks and/or security issues. The caller is responsible for |
627 // waiting asynchronously, and resetting sync_point before calling this. | 627 // waiting asynchronously, and resetting sync_point before calling this. |
628 // However if the parent is a renderer (e.g. browser tag), it may be ok | 628 // However if the parent is a renderer (e.g. browser tag), it may be ok |
(...skipping 11 matching lines...) Expand all Loading... |
640 resource.mailbox.setName(it->mailbox.name); | 640 resource.mailbox.setName(it->mailbox.name); |
641 m_resources[id] = resource; | 641 m_resources[id] = resource; |
642 childInfo.parentToChildMap[id] = it->id; | 642 childInfo.parentToChildMap[id] = it->id; |
643 childInfo.childToParentMap[it->id] = id; | 643 childInfo.childToParentMap[it->id] = id; |
644 } | 644 } |
645 } | 645 } |
646 | 646 |
647 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc
es) | 647 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc
es) |
648 { | 648 { |
649 DCHECK(m_threadChecker.CalledOnValidThread()); | 649 DCHECK(m_threadChecker.CalledOnValidThread()); |
650 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 650 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
651 if (!context3d || !context3d->makeContextCurrent()) { | 651 if (!context3d || !context3d->makeContextCurrent()) { |
652 // FIXME: Implement this path for software compositing. | 652 // FIXME: Implement this path for software compositing. |
653 return; | 653 return; |
654 } | 654 } |
655 if (resources.sync_point) | 655 if (resources.sync_point) |
656 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); | 656 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); |
657 for (TransferableResourceArray::const_iterator it = resources.resources.begi
n(); it != resources.resources.end(); ++it) { | 657 for (TransferableResourceArray::const_iterator it = resources.resources.begi
n(); it != resources.resources.end(); ++it) { |
658 ResourceMap::iterator mapIterator = m_resources.find(it->id); | 658 ResourceMap::iterator mapIterator = m_resources.find(it->id); |
659 DCHECK(mapIterator != m_resources.end()); | 659 DCHECK(mapIterator != m_resources.end()); |
660 Resource* resource = &mapIterator->second; | 660 Resource* resource = &mapIterator->second; |
661 DCHECK(resource->exported); | 661 DCHECK(resource->exported); |
662 resource->exported = false; | 662 resource->exported = false; |
663 resource->mailbox.setName(it->mailbox.name); | 663 resource->mailbox.setName(it->mailbox.name); |
664 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)); | 664 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)); |
665 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail
box.name)); | 665 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail
box.name)); |
666 if (resource->markedForDeletion) | 666 if (resource->markedForDeletion) |
667 deleteResourceInternal(mapIterator); | 667 deleteResourceInternal(mapIterator); |
668 } | 668 } |
669 } | 669 } |
670 | 670 |
671 bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI
d id, TransferableResource* resource) | 671 bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI
d id, TransferableResource* resource) |
672 { | 672 { |
673 DCHECK(m_threadChecker.CalledOnValidThread()); | 673 DCHECK(m_threadChecker.CalledOnValidThread()); |
674 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 674 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
675 ResourceMap::iterator it = m_resources.find(id); | 675 ResourceMap::iterator it = m_resources.find(id); |
676 CHECK(it != m_resources.end()); | 676 CHECK(it != m_resources.end()); |
677 Resource* source = &it->second; | 677 Resource* source = &it->second; |
678 DCHECK(!source->lockedForWrite); | 678 DCHECK(!source->lockedForWrite); |
679 DCHECK(!source->lockForReadCount); | 679 DCHECK(!source->lockForReadCount); |
680 DCHECK(!source->external); | 680 DCHECK(!source->external); |
681 if (source->exported) | 681 if (source->exported) |
682 return false; | 682 return false; |
683 resource->id = id; | 683 resource->id = id; |
684 resource->format = source->format; | 684 resource->format = source->format; |
(...skipping 15 matching lines...) Expand all Loading... |
700 void ResourceProvider::acquirePixelBuffer(ResourceId id) | 700 void ResourceProvider::acquirePixelBuffer(ResourceId id) |
701 { | 701 { |
702 DCHECK(m_threadChecker.CalledOnValidThread()); | 702 DCHECK(m_threadChecker.CalledOnValidThread()); |
703 ResourceMap::iterator it = m_resources.find(id); | 703 ResourceMap::iterator it = m_resources.find(id); |
704 CHECK(it != m_resources.end()); | 704 CHECK(it != m_resources.end()); |
705 Resource* resource = &it->second; | 705 Resource* resource = &it->second; |
706 DCHECK(!resource->external); | 706 DCHECK(!resource->external); |
707 DCHECK(!resource->exported); | 707 DCHECK(!resource->exported); |
708 | 708 |
709 if (resource->glId) { | 709 if (resource->glId) { |
710 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 710 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
711 DCHECK(context3d); | 711 DCHECK(context3d); |
712 if (!resource->glPixelBufferId) | 712 if (!resource->glPixelBufferId) |
713 resource->glPixelBufferId = context3d->createBuffer(); | 713 resource->glPixelBufferId = context3d->createBuffer(); |
714 context3d->bindBuffer( | 714 context3d->bindBuffer( |
715 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 715 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
716 resource->glPixelBufferId); | 716 resource->glPixelBufferId); |
717 context3d->bufferData( | 717 context3d->bufferData( |
718 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 718 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
719 resource->size.width() * resource->size.height() * 4, | 719 resource->size.width() * resource->size.height() * 4, |
720 NULL, | 720 NULL, |
(...skipping 14 matching lines...) Expand all Loading... |
735 { | 735 { |
736 DCHECK(m_threadChecker.CalledOnValidThread()); | 736 DCHECK(m_threadChecker.CalledOnValidThread()); |
737 ResourceMap::iterator it = m_resources.find(id); | 737 ResourceMap::iterator it = m_resources.find(id); |
738 CHECK(it != m_resources.end()); | 738 CHECK(it != m_resources.end()); |
739 Resource* resource = &it->second; | 739 Resource* resource = &it->second; |
740 DCHECK(!resource->external); | 740 DCHECK(!resource->external); |
741 DCHECK(!resource->exported); | 741 DCHECK(!resource->exported); |
742 | 742 |
743 if (resource->glId) { | 743 if (resource->glId) { |
744 DCHECK(resource->glPixelBufferId); | 744 DCHECK(resource->glPixelBufferId); |
745 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 745 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
746 DCHECK(context3d); | 746 DCHECK(context3d); |
747 context3d->bindBuffer( | 747 context3d->bindBuffer( |
748 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 748 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
749 resource->glPixelBufferId); | 749 resource->glPixelBufferId); |
750 context3d->bufferData( | 750 context3d->bufferData( |
751 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 751 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
752 0, | 752 0, |
753 NULL, | 753 NULL, |
754 GL_DYNAMIC_DRAW); | 754 GL_DYNAMIC_DRAW); |
755 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 755 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
(...skipping 10 matching lines...) Expand all Loading... |
766 uint8_t* ResourceProvider::mapPixelBuffer(ResourceId id) | 766 uint8_t* ResourceProvider::mapPixelBuffer(ResourceId id) |
767 { | 767 { |
768 DCHECK(m_threadChecker.CalledOnValidThread()); | 768 DCHECK(m_threadChecker.CalledOnValidThread()); |
769 ResourceMap::iterator it = m_resources.find(id); | 769 ResourceMap::iterator it = m_resources.find(id); |
770 CHECK(it != m_resources.end()); | 770 CHECK(it != m_resources.end()); |
771 Resource* resource = &it->second; | 771 Resource* resource = &it->second; |
772 DCHECK(!resource->external); | 772 DCHECK(!resource->external); |
773 DCHECK(!resource->exported); | 773 DCHECK(!resource->exported); |
774 | 774 |
775 if (resource->glId) { | 775 if (resource->glId) { |
776 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 776 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
777 DCHECK(context3d); | 777 DCHECK(context3d); |
778 DCHECK(resource->glPixelBufferId); | 778 DCHECK(resource->glPixelBufferId); |
779 context3d->bindBuffer( | 779 context3d->bindBuffer( |
780 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 780 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
781 resource->glPixelBufferId); | 781 resource->glPixelBufferId); |
782 uint8_t* image = static_cast<uint8_t*>( | 782 uint8_t* image = static_cast<uint8_t*>( |
783 context3d->mapBufferCHROMIUM( | 783 context3d->mapBufferCHROMIUM( |
784 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); | 784 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); |
785 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 785 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
786 DCHECK(image); | 786 DCHECK(image); |
787 return image; | 787 return image; |
788 } | 788 } |
789 | 789 |
790 if (resource->pixels) | 790 if (resource->pixels) |
791 return resource->pixelBuffer; | 791 return resource->pixelBuffer; |
792 | 792 |
793 return NULL; | 793 return NULL; |
794 } | 794 } |
795 | 795 |
796 void ResourceProvider::unmapPixelBuffer(ResourceId id) | 796 void ResourceProvider::unmapPixelBuffer(ResourceId id) |
797 { | 797 { |
798 DCHECK(m_threadChecker.CalledOnValidThread()); | 798 DCHECK(m_threadChecker.CalledOnValidThread()); |
799 ResourceMap::iterator it = m_resources.find(id); | 799 ResourceMap::iterator it = m_resources.find(id); |
800 CHECK(it != m_resources.end()); | 800 CHECK(it != m_resources.end()); |
801 Resource* resource = &it->second; | 801 Resource* resource = &it->second; |
802 DCHECK(!resource->external); | 802 DCHECK(!resource->external); |
803 DCHECK(!resource->exported); | 803 DCHECK(!resource->exported); |
804 | 804 |
805 if (resource->glId) { | 805 if (resource->glId) { |
806 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 806 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
807 DCHECK(context3d); | 807 DCHECK(context3d); |
808 DCHECK(resource->glPixelBufferId); | 808 DCHECK(resource->glPixelBufferId); |
809 context3d->bindBuffer( | 809 context3d->bindBuffer( |
810 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 810 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
811 resource->glPixelBufferId); | 811 resource->glPixelBufferId); |
812 context3d->unmapBufferCHROMIUM( | 812 context3d->unmapBufferCHROMIUM( |
813 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); | 813 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); |
814 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 814 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
815 } | 815 } |
816 } | 816 } |
817 | 817 |
818 void ResourceProvider::setPixelsFromBuffer(ResourceId id) | 818 void ResourceProvider::setPixelsFromBuffer(ResourceId id) |
819 { | 819 { |
820 DCHECK(m_threadChecker.CalledOnValidThread()); | 820 DCHECK(m_threadChecker.CalledOnValidThread()); |
821 ResourceMap::iterator it = m_resources.find(id); | 821 ResourceMap::iterator it = m_resources.find(id); |
822 CHECK(it != m_resources.end()); | 822 CHECK(it != m_resources.end()); |
823 Resource* resource = &it->second; | 823 Resource* resource = &it->second; |
824 DCHECK(!resource->lockedForWrite); | 824 DCHECK(!resource->lockedForWrite); |
825 DCHECK(!resource->lockForReadCount); | 825 DCHECK(!resource->lockForReadCount); |
826 DCHECK(!resource->external); | 826 DCHECK(!resource->external); |
827 DCHECK(!resource->exported); | 827 DCHECK(!resource->exported); |
828 | 828 |
829 if (resource->glId) { | 829 if (resource->glId) { |
830 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 830 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
831 DCHECK(context3d); | 831 DCHECK(context3d); |
832 DCHECK(resource->glPixelBufferId); | 832 DCHECK(resource->glPixelBufferId); |
833 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); | 833 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); |
834 context3d->bindBuffer( | 834 context3d->bindBuffer( |
835 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 835 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
836 resource->glPixelBufferId); | 836 resource->glPixelBufferId); |
837 context3d->texSubImage2D(GL_TEXTURE_2D, | 837 context3d->texSubImage2D(GL_TEXTURE_2D, |
838 0, /* level */ | 838 0, /* level */ |
839 0, /* x */ | 839 0, /* x */ |
840 0, /* y */ | 840 0, /* y */ |
(...skipping 16 matching lines...) Expand all Loading... |
857 | 857 |
858 ScopedWriteLockSoftware lock(this, id); | 858 ScopedWriteLockSoftware lock(this, id); |
859 SkCanvas* dest = lock.skCanvas(); | 859 SkCanvas* dest = lock.skCanvas(); |
860 dest->writePixels(src, 0, 0); | 860 dest->writePixels(src, 0, 0); |
861 } | 861 } |
862 } | 862 } |
863 | 863 |
864 void ResourceProvider::bindForSampling(ResourceProvider::ResourceId resourceId,
GLenum target, GLenum filter) | 864 void ResourceProvider::bindForSampling(ResourceProvider::ResourceId resourceId,
GLenum target, GLenum filter) |
865 { | 865 { |
866 DCHECK(m_threadChecker.CalledOnValidThread()); | 866 DCHECK(m_threadChecker.CalledOnValidThread()); |
867 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 867 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
868 ResourceMap::iterator it = m_resources.find(resourceId); | 868 ResourceMap::iterator it = m_resources.find(resourceId); |
869 DCHECK(it != m_resources.end()); | 869 DCHECK(it != m_resources.end()); |
870 Resource* resource = &it->second; | 870 Resource* resource = &it->second; |
871 DCHECK(resource->lockForReadCount); | 871 DCHECK(resource->lockForReadCount); |
872 DCHECK(!resource->lockedForWrite); | 872 DCHECK(!resource->lockedForWrite); |
873 | 873 |
874 GLC(context3d, context3d->bindTexture(target, resource->glId)); | 874 GLC(context3d, context3d->bindTexture(target, resource->glId)); |
875 if (filter != resource->filter) { | 875 if (filter != resource->filter) { |
876 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MIN_FILTER, f
ilter)); | 876 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MIN_FILTER, f
ilter)); |
877 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MAG_FILTER, f
ilter)); | 877 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MAG_FILTER, f
ilter)); |
878 resource->filter = filter; | 878 resource->filter = filter; |
879 } | 879 } |
880 } | 880 } |
881 | 881 |
882 void ResourceProvider::beginSetPixels(ResourceId id) | 882 void ResourceProvider::beginSetPixels(ResourceId id) |
883 { | 883 { |
884 DCHECK(m_threadChecker.CalledOnValidThread()); | 884 DCHECK(m_threadChecker.CalledOnValidThread()); |
885 ResourceMap::iterator it = m_resources.find(id); | 885 ResourceMap::iterator it = m_resources.find(id); |
886 CHECK(it != m_resources.end()); | 886 CHECK(it != m_resources.end()); |
887 Resource* resource = &it->second; | 887 Resource* resource = &it->second; |
888 DCHECK(!resource->pendingSetPixels); | 888 DCHECK(!resource->pendingSetPixels); |
889 | 889 |
890 lockForWrite(id); | 890 lockForWrite(id); |
891 | 891 |
892 if (resource->glId) { | 892 if (resource->glId) { |
893 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 893 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
894 DCHECK(context3d); | 894 DCHECK(context3d); |
895 DCHECK(resource->glPixelBufferId); | 895 DCHECK(resource->glPixelBufferId); |
896 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); | 896 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); |
897 context3d->bindBuffer( | 897 context3d->bindBuffer( |
898 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 898 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
899 resource->glPixelBufferId); | 899 resource->glPixelBufferId); |
900 if (!resource->glUploadQueryId) | 900 if (!resource->glUploadQueryId) |
901 resource->glUploadQueryId = context3d->createQueryEXT(); | 901 resource->glUploadQueryId = context3d->createQueryEXT(); |
902 context3d->beginQueryEXT( | 902 context3d->beginQueryEXT( |
903 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, | 903 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, |
(...skipping 19 matching lines...) Expand all Loading... |
923 | 923 |
924 bool ResourceProvider::didSetPixelsComplete(ResourceId id) { | 924 bool ResourceProvider::didSetPixelsComplete(ResourceId id) { |
925 DCHECK(m_threadChecker.CalledOnValidThread()); | 925 DCHECK(m_threadChecker.CalledOnValidThread()); |
926 ResourceMap::iterator it = m_resources.find(id); | 926 ResourceMap::iterator it = m_resources.find(id); |
927 CHECK(it != m_resources.end()); | 927 CHECK(it != m_resources.end()); |
928 Resource* resource = &it->second; | 928 Resource* resource = &it->second; |
929 DCHECK(resource->lockedForWrite); | 929 DCHECK(resource->lockedForWrite); |
930 DCHECK(resource->pendingSetPixels); | 930 DCHECK(resource->pendingSetPixels); |
931 | 931 |
932 if (resource->glId) { | 932 if (resource->glId) { |
933 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); | 933 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
934 DCHECK(context3d); | 934 DCHECK(context3d); |
935 DCHECK(resource->glUploadQueryId); | 935 DCHECK(resource->glUploadQueryId); |
936 unsigned complete = 1; | 936 unsigned complete = 1; |
937 context3d->getQueryObjectuivEXT( | 937 context3d->getQueryObjectuivEXT( |
938 resource->glUploadQueryId, | 938 resource->glUploadQueryId, |
939 GL_QUERY_RESULT_AVAILABLE_EXT, | 939 GL_QUERY_RESULT_AVAILABLE_EXT, |
940 &complete); | 940 &complete); |
941 if (!complete) | 941 if (!complete) |
942 return false; | 942 return false; |
943 } | 943 } |
944 | 944 |
945 resource->pendingSetPixels = false; | 945 resource->pendingSetPixels = false; |
946 unlockForWrite(id); | 946 unlockForWrite(id); |
947 | 947 |
948 return true; | 948 return true; |
949 } | 949 } |
950 | 950 |
951 } // namespace cc | 951 } // namespace cc |
OLD | NEW |