Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(270)

Side by Side Diff: cc/resources/resource_provider.cc

Issue 20185002: ContextProvider in OutputSurface (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: contextprovider: don't access Context3d() in OutputSurface contructors, it's not bound yet Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/resources/resource_provider.h ('k') | cc/resources/resource_provider_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/resources/resource_provider.h" 5 #include "cc/resources/resource_provider.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/containers/hash_tables.h" 10 #include "base/containers/hash_tables.h"
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 151
152 ResourceProvider::Child::~Child() {} 152 ResourceProvider::Child::~Child() {}
153 153
154 scoped_ptr<ResourceProvider> ResourceProvider::Create( 154 scoped_ptr<ResourceProvider> ResourceProvider::Create(
155 OutputSurface* output_surface, 155 OutputSurface* output_surface,
156 int highp_threshold_min) { 156 int highp_threshold_min) {
157 scoped_ptr<ResourceProvider> resource_provider( 157 scoped_ptr<ResourceProvider> resource_provider(
158 new ResourceProvider(output_surface, highp_threshold_min)); 158 new ResourceProvider(output_surface, highp_threshold_min));
159 159
160 bool success = false; 160 bool success = false;
161 if (output_surface->context3d()) { 161 if (resource_provider->Context3d()) {
162 success = resource_provider->InitializeGL(); 162 success = resource_provider->InitializeGL();
163 } else { 163 } else {
164 resource_provider->InitializeSoftware(); 164 resource_provider->InitializeSoftware();
165 success = true; 165 success = true;
166 } 166 }
167 167
168 if (!success) 168 if (!success)
169 return scoped_ptr<ResourceProvider>(); 169 return scoped_ptr<ResourceProvider>();
170 170
171 DCHECK_NE(InvalidType, resource_provider->default_resource_type()); 171 DCHECK_NE(InvalidType, resource_provider->default_resource_type());
172 return resource_provider.Pass(); 172 return resource_provider.Pass();
173 } 173 }
174 174
175 ResourceProvider::~ResourceProvider() { 175 ResourceProvider::~ResourceProvider() {
176 while (!resources_.empty()) 176 while (!resources_.empty())
177 DeleteResourceInternal(resources_.begin(), ForShutdown); 177 DeleteResourceInternal(resources_.begin(), ForShutdown);
178 178
179 CleanUpGLIfNeeded(); 179 CleanUpGLIfNeeded();
180 } 180 }
181 181
182 WebGraphicsContext3D* ResourceProvider::GraphicsContext3D() {
183 DCHECK(thread_checker_.CalledOnValidThread());
184 return output_surface_->context3d();
185 }
186
187 bool ResourceProvider::InUseByConsumer(ResourceId id) { 182 bool ResourceProvider::InUseByConsumer(ResourceId id) {
188 DCHECK(thread_checker_.CalledOnValidThread()); 183 DCHECK(thread_checker_.CalledOnValidThread());
189 ResourceMap::iterator it = resources_.find(id); 184 ResourceMap::iterator it = resources_.find(id);
190 CHECK(it != resources_.end()); 185 CHECK(it != resources_.end());
191 Resource* resource = &it->second; 186 Resource* resource = &it->second;
192 return !!resource->lock_for_read_count || resource->exported; 187 return !!resource->lock_for_read_count || resource->exported;
193 } 188 }
194 189
195 ResourceProvider::ResourceId ResourceProvider::CreateResource( 190 ResourceProvider::ResourceId ResourceProvider::CreateResource(
196 gfx::Size size, GLenum format, TextureUsageHint hint) { 191 gfx::Size size, GLenum format, TextureUsageHint hint) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 resources_[id] = resource; 247 resources_[id] = resource;
253 return id; 248 return id;
254 } 249 }
255 250
256 ResourceProvider::ResourceId 251 ResourceProvider::ResourceId
257 ResourceProvider::CreateResourceFromExternalTexture( 252 ResourceProvider::CreateResourceFromExternalTexture(
258 unsigned texture_target, 253 unsigned texture_target,
259 unsigned texture_id) { 254 unsigned texture_id) {
260 DCHECK(thread_checker_.CalledOnValidThread()); 255 DCHECK(thread_checker_.CalledOnValidThread());
261 256
262 WebGraphicsContext3D* context3d = output_surface_->context3d(); 257 WebGraphicsContext3D* context3d = Context3d();
263 DCHECK(context3d); 258 DCHECK(context3d);
264 GLC(context3d, context3d->bindTexture(texture_target, texture_id)); 259 GLC(context3d, context3d->bindTexture(texture_target, texture_id));
265 GLC(context3d, context3d->texParameteri( 260 GLC(context3d, context3d->texParameteri(
266 texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); 261 texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
267 GLC(context3d, context3d->texParameteri( 262 GLC(context3d, context3d->texParameteri(
268 texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); 263 texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
269 GLC(context3d, context3d->texParameteri( 264 GLC(context3d, context3d->texParameteri(
270 texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); 265 texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
271 GLC(context3d, context3d->texParameteri( 266 GLC(context3d, context3d->texParameteri(
272 texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); 267 texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, 317 void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it,
323 DeleteStyle style) { 318 DeleteStyle style) {
324 Resource* resource = &it->second; 319 Resource* resource = &it->second;
325 bool lost_resource = lost_output_surface_; 320 bool lost_resource = lost_output_surface_;
326 321
327 DCHECK(!resource->exported || style != Normal); 322 DCHECK(!resource->exported || style != Normal);
328 if (style == ForShutdown && resource->exported) 323 if (style == ForShutdown && resource->exported)
329 lost_resource = true; 324 lost_resource = true;
330 325
331 if (resource->image_id) { 326 if (resource->image_id) {
332 WebGraphicsContext3D* context3d = output_surface_->context3d(); 327 WebGraphicsContext3D* context3d = Context3d();
333 DCHECK(context3d); 328 DCHECK(context3d);
334 GLC(context3d, context3d->destroyImageCHROMIUM(resource->image_id)); 329 GLC(context3d, context3d->destroyImageCHROMIUM(resource->image_id));
335 } 330 }
336 331
337 if (resource->gl_id && !resource->external) { 332 if (resource->gl_id && !resource->external) {
338 WebGraphicsContext3D* context3d = output_surface_->context3d(); 333 WebGraphicsContext3D* context3d = Context3d();
339 DCHECK(context3d); 334 DCHECK(context3d);
340 GLC(context3d, context3d->deleteTexture(resource->gl_id)); 335 GLC(context3d, context3d->deleteTexture(resource->gl_id));
341 } 336 }
342 if (resource->gl_upload_query_id) { 337 if (resource->gl_upload_query_id) {
343 WebGraphicsContext3D* context3d = output_surface_->context3d(); 338 WebGraphicsContext3D* context3d = Context3d();
344 DCHECK(context3d); 339 DCHECK(context3d);
345 GLC(context3d, context3d->deleteQueryEXT(resource->gl_upload_query_id)); 340 GLC(context3d, context3d->deleteQueryEXT(resource->gl_upload_query_id));
346 } 341 }
347 if (resource->gl_pixel_buffer_id) { 342 if (resource->gl_pixel_buffer_id) {
348 WebGraphicsContext3D* context3d = output_surface_->context3d(); 343 WebGraphicsContext3D* context3d = Context3d();
349 DCHECK(context3d); 344 DCHECK(context3d);
350 GLC(context3d, context3d->deleteBuffer(resource->gl_pixel_buffer_id)); 345 GLC(context3d, context3d->deleteBuffer(resource->gl_pixel_buffer_id));
351 } 346 }
352 if (resource->mailbox.IsValid() && resource->external) { 347 if (resource->mailbox.IsValid() && resource->external) {
353 unsigned sync_point = resource->mailbox.sync_point(); 348 unsigned sync_point = resource->mailbox.sync_point();
354 if (resource->mailbox.IsTexture()) { 349 if (resource->mailbox.IsTexture()) {
355 WebGraphicsContext3D* context3d = output_surface_->context3d(); 350 WebGraphicsContext3D* context3d = Context3d();
356 DCHECK(context3d); 351 DCHECK(context3d);
357 if (resource->gl_id) 352 if (resource->gl_id)
358 GLC(context3d, context3d->deleteTexture(resource->gl_id)); 353 GLC(context3d, context3d->deleteTexture(resource->gl_id));
359 if (!lost_resource && resource->gl_id) 354 if (!lost_resource && resource->gl_id)
360 sync_point = context3d->insertSyncPoint(); 355 sync_point = context3d->insertSyncPoint();
361 } else { 356 } else {
362 DCHECK(resource->mailbox.IsSharedMemory()); 357 DCHECK(resource->mailbox.IsSharedMemory());
363 base::SharedMemory* shared_memory = resource->mailbox.shared_memory(); 358 base::SharedMemory* shared_memory = resource->mailbox.shared_memory();
364 if (resource->pixels && shared_memory) { 359 if (resource->pixels && shared_memory) {
365 DCHECK(shared_memory->memory() == resource->pixels); 360 DCHECK(shared_memory->memory() == resource->pixels);
(...skipping 29 matching lines...) Expand all
395 Resource* resource = &it->second; 390 Resource* resource = &it->second;
396 DCHECK(!resource->locked_for_write); 391 DCHECK(!resource->locked_for_write);
397 DCHECK(!resource->lock_for_read_count); 392 DCHECK(!resource->lock_for_read_count);
398 DCHECK(!resource->external); 393 DCHECK(!resource->external);
399 DCHECK(!resource->exported); 394 DCHECK(!resource->exported);
400 DCHECK(ReadLockFenceHasPassed(resource)); 395 DCHECK(ReadLockFenceHasPassed(resource));
401 LazyAllocate(resource); 396 LazyAllocate(resource);
402 397
403 if (resource->gl_id) { 398 if (resource->gl_id) {
404 DCHECK(!resource->pending_set_pixels); 399 DCHECK(!resource->pending_set_pixels);
405 WebGraphicsContext3D* context3d = output_surface_->context3d(); 400 WebGraphicsContext3D* context3d = Context3d();
406 DCHECK(context3d); 401 DCHECK(context3d);
407 DCHECK(texture_uploader_.get()); 402 DCHECK(texture_uploader_.get());
408 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); 403 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id);
409 texture_uploader_->Upload(image, 404 texture_uploader_->Upload(image,
410 image_rect, 405 image_rect,
411 source_rect, 406 source_rect,
412 dest_offset, 407 dest_offset,
413 resource->format, 408 resource->format,
414 resource->size); 409 resource->size);
415 } 410 }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 460
466 void ResourceProvider::ReleaseCachedData() { 461 void ResourceProvider::ReleaseCachedData() {
467 if (!texture_uploader_) 462 if (!texture_uploader_)
468 return; 463 return;
469 464
470 texture_uploader_->ReleaseCachedQueries(); 465 texture_uploader_->ReleaseCachedQueries();
471 } 466 }
472 467
473 void ResourceProvider::Flush() { 468 void ResourceProvider::Flush() {
474 DCHECK(thread_checker_.CalledOnValidThread()); 469 DCHECK(thread_checker_.CalledOnValidThread());
475 WebGraphicsContext3D* context3d = output_surface_->context3d(); 470 WebGraphicsContext3D* context3d = Context3d();
476 if (context3d) 471 if (context3d)
477 context3d->flush(); 472 context3d->flush();
478 } 473 }
479 474
480 void ResourceProvider::Finish() { 475 void ResourceProvider::Finish() {
481 DCHECK(thread_checker_.CalledOnValidThread()); 476 DCHECK(thread_checker_.CalledOnValidThread());
482 WebGraphicsContext3D* context3d = output_surface_->context3d(); 477 WebGraphicsContext3D* context3d = Context3d();
483 if (context3d) 478 if (context3d)
484 context3d->finish(); 479 context3d->finish();
485 } 480 }
486 481
487 bool ResourceProvider::ShallowFlushIfSupported() { 482 bool ResourceProvider::ShallowFlushIfSupported() {
488 DCHECK(thread_checker_.CalledOnValidThread()); 483 DCHECK(thread_checker_.CalledOnValidThread());
489 WebGraphicsContext3D* context3d = output_surface_->context3d(); 484 WebGraphicsContext3D* context3d = Context3d();
490 if (!context3d || !use_shallow_flush_) 485 if (!context3d || !use_shallow_flush_)
491 return false; 486 return false;
492 487
493 context3d->shallowFlushCHROMIUM(); 488 context3d->shallowFlushCHROMIUM();
494 return true; 489 return true;
495 } 490 }
496 491
497 const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { 492 const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) {
498 DCHECK(thread_checker_.CalledOnValidThread()); 493 DCHECK(thread_checker_.CalledOnValidThread());
499 ResourceMap::iterator it = resources_.find(id); 494 ResourceMap::iterator it = resources_.find(id);
500 CHECK(it != resources_.end()); 495 CHECK(it != resources_.end());
501 Resource* resource = &it->second; 496 Resource* resource = &it->second;
502 DCHECK(!resource->locked_for_write || 497 DCHECK(!resource->locked_for_write ||
503 resource->set_pixels_completion_forced) << 498 resource->set_pixels_completion_forced) <<
504 "locked for write: " << resource->locked_for_write << 499 "locked for write: " << resource->locked_for_write <<
505 " pixels completion forced: " << resource->set_pixels_completion_forced; 500 " pixels completion forced: " << resource->set_pixels_completion_forced;
506 DCHECK(!resource->exported); 501 DCHECK(!resource->exported);
507 // Uninitialized! Call SetPixels or LockForWrite first. 502 // Uninitialized! Call SetPixels or LockForWrite first.
508 DCHECK(resource->allocated); 503 DCHECK(resource->allocated);
509 504
510 LazyCreate(resource); 505 LazyCreate(resource);
511 506
512 if (resource->external) { 507 if (resource->external) {
513 if (!resource->gl_id && resource->mailbox.IsTexture()) { 508 if (!resource->gl_id && resource->mailbox.IsTexture()) {
514 WebGraphicsContext3D* context3d = output_surface_->context3d(); 509 WebGraphicsContext3D* context3d = Context3d();
515 DCHECK(context3d); 510 DCHECK(context3d);
516 if (resource->mailbox.sync_point()) { 511 if (resource->mailbox.sync_point()) {
517 GLC(context3d, 512 GLC(context3d,
518 context3d->waitSyncPoint(resource->mailbox.sync_point())); 513 context3d->waitSyncPoint(resource->mailbox.sync_point()));
519 resource->mailbox.ResetSyncPoint(); 514 resource->mailbox.ResetSyncPoint();
520 } 515 }
521 resource->gl_id = context3d->createTexture(); 516 resource->gl_id = context3d->createTexture();
522 GLC(context3d, context3d->bindTexture( 517 GLC(context3d, context3d->bindTexture(
523 resource->mailbox.target(), resource->gl_id)); 518 resource->mailbox.target(), resource->gl_id));
524 GLC(context3d, context3d->consumeTextureCHROMIUM( 519 GLC(context3d, context3d->consumeTextureCHROMIUM(
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 : output_surface_(output_surface), 673 : output_surface_(output_surface),
679 lost_output_surface_(false), 674 lost_output_surface_(false),
680 highp_threshold_min_(highp_threshold_min), 675 highp_threshold_min_(highp_threshold_min),
681 next_id_(1), 676 next_id_(1),
682 next_child_(1), 677 next_child_(1),
683 default_resource_type_(InvalidType), 678 default_resource_type_(InvalidType),
684 use_texture_storage_ext_(false), 679 use_texture_storage_ext_(false),
685 use_texture_usage_hint_(false), 680 use_texture_usage_hint_(false),
686 use_shallow_flush_(false), 681 use_shallow_flush_(false),
687 max_texture_size_(0), 682 max_texture_size_(0),
688 best_texture_format_(0) {} 683 best_texture_format_(0) {
684 DCHECK(output_surface_->HasClient());
685 }
689 686
690 void ResourceProvider::InitializeSoftware() { 687 void ResourceProvider::InitializeSoftware() {
691 DCHECK(thread_checker_.CalledOnValidThread()); 688 DCHECK(thread_checker_.CalledOnValidThread());
692 DCHECK_NE(Bitmap, default_resource_type_); 689 DCHECK_NE(Bitmap, default_resource_type_);
693 690
694 CleanUpGLIfNeeded(); 691 CleanUpGLIfNeeded();
695 692
696 default_resource_type_ = Bitmap; 693 default_resource_type_ = Bitmap;
697 max_texture_size_ = INT_MAX / 2; 694 max_texture_size_ = INT_MAX / 2;
698 best_texture_format_ = GL_RGBA; 695 best_texture_format_ = GL_RGBA;
699 } 696 }
700 697
701 bool ResourceProvider::InitializeGL() { 698 bool ResourceProvider::InitializeGL() {
702 DCHECK(thread_checker_.CalledOnValidThread()); 699 DCHECK(thread_checker_.CalledOnValidThread());
703 DCHECK(!texture_uploader_); 700 DCHECK(!texture_uploader_);
704 DCHECK_NE(GLTexture, default_resource_type_); 701 DCHECK_NE(GLTexture, default_resource_type_);
705 702
706 WebGraphicsContext3D* context3d = output_surface_->context3d(); 703 WebGraphicsContext3D* context3d = Context3d();
707 DCHECK(context3d); 704 DCHECK(context3d);
708 705
709 if (!context3d->makeContextCurrent()) 706 if (!context3d->makeContextCurrent())
710 return false; 707 return false;
711 708
712 default_resource_type_ = GLTexture; 709 default_resource_type_ = GLTexture;
713 710
714 std::string extensions_string = 711 std::string extensions_string =
715 UTF16ToASCII(context3d->getString(GL_EXTENSIONS)); 712 UTF16ToASCII(context3d->getString(GL_EXTENSIONS));
716 std::vector<std::string> extensions; 713 std::vector<std::string> extensions;
(...skipping 16 matching lines...) Expand all
733 texture_uploader_ = 730 texture_uploader_ =
734 TextureUploader::Create(context3d, use_map_sub, use_shallow_flush_); 731 TextureUploader::Create(context3d, use_map_sub, use_shallow_flush_);
735 GLC(context3d, context3d->getIntegerv(GL_MAX_TEXTURE_SIZE, 732 GLC(context3d, context3d->getIntegerv(GL_MAX_TEXTURE_SIZE,
736 &max_texture_size_)); 733 &max_texture_size_));
737 best_texture_format_ = PlatformColor::BestTextureFormat(use_bgra); 734 best_texture_format_ = PlatformColor::BestTextureFormat(use_bgra);
738 735
739 return true; 736 return true;
740 } 737 }
741 738
742 void ResourceProvider::CleanUpGLIfNeeded() { 739 void ResourceProvider::CleanUpGLIfNeeded() {
743 WebGraphicsContext3D* context3d = output_surface_->context3d(); 740 WebGraphicsContext3D* context3d = Context3d();
744 if (default_resource_type_ != GLTexture) { 741 if (default_resource_type_ != GLTexture) {
745 // We are not in GL mode, but double check before returning. 742 // We are not in GL mode, but double check before returning.
746 DCHECK(!context3d); 743 DCHECK(!context3d);
747 DCHECK(!texture_uploader_); 744 DCHECK(!texture_uploader_);
748 return; 745 return;
749 } 746 }
750 747
751 DCHECK(context3d); 748 DCHECK(context3d);
752 context3d->makeContextCurrent(); 749 context3d->makeContextCurrent();
753 texture_uploader_.reset(); 750 texture_uploader_.reset();
(...skipping 24 matching lines...) Expand all
778 int child) const { 775 int child) const {
779 DCHECK(thread_checker_.CalledOnValidThread()); 776 DCHECK(thread_checker_.CalledOnValidThread());
780 ChildMap::const_iterator it = children_.find(child); 777 ChildMap::const_iterator it = children_.find(child);
781 DCHECK(it != children_.end()); 778 DCHECK(it != children_.end());
782 return it->second.child_to_parent_map; 779 return it->second.child_to_parent_map;
783 } 780 }
784 781
785 void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resources, 782 void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resources,
786 TransferableResourceArray* list) { 783 TransferableResourceArray* list) {
787 DCHECK(thread_checker_.CalledOnValidThread()); 784 DCHECK(thread_checker_.CalledOnValidThread());
788 WebGraphicsContext3D* context3d = output_surface_->context3d(); 785 WebGraphicsContext3D* context3d = Context3d();
789 if (!context3d || !context3d->makeContextCurrent()) { 786 if (!context3d || !context3d->makeContextCurrent()) {
790 // TODO(skaslev): Implement this path for software compositing. 787 // TODO(skaslev): Implement this path for software compositing.
791 return; 788 return;
792 } 789 }
793 bool need_sync_point = false; 790 bool need_sync_point = false;
794 for (ResourceIdArray::const_iterator it = resources.begin(); 791 for (ResourceIdArray::const_iterator it = resources.begin();
795 it != resources.end(); 792 it != resources.end();
796 ++it) { 793 ++it) {
797 TransferableResource resource; 794 TransferableResource resource;
798 if (TransferResource(context3d, *it, &resource)) { 795 if (TransferResource(context3d, *it, &resource)) {
(...skipping 11 matching lines...) Expand all
810 if (!it->sync_point) 807 if (!it->sync_point)
811 it->sync_point = sync_point; 808 it->sync_point = sync_point;
812 } 809 }
813 } 810 }
814 } 811 }
815 812
816 void ResourceProvider::PrepareSendToChild(int child, 813 void ResourceProvider::PrepareSendToChild(int child,
817 const ResourceIdArray& resources, 814 const ResourceIdArray& resources,
818 TransferableResourceArray* list) { 815 TransferableResourceArray* list) {
819 DCHECK(thread_checker_.CalledOnValidThread()); 816 DCHECK(thread_checker_.CalledOnValidThread());
820 WebGraphicsContext3D* context3d = output_surface_->context3d(); 817 WebGraphicsContext3D* context3d = Context3d();
821 if (!context3d || !context3d->makeContextCurrent()) { 818 if (!context3d || !context3d->makeContextCurrent()) {
822 // TODO(skaslev): Implement this path for software compositing. 819 // TODO(skaslev): Implement this path for software compositing.
823 return; 820 return;
824 } 821 }
825 Child& child_info = children_.find(child)->second; 822 Child& child_info = children_.find(child)->second;
826 bool need_sync_point = false; 823 bool need_sync_point = false;
827 for (ResourceIdArray::const_iterator it = resources.begin(); 824 for (ResourceIdArray::const_iterator it = resources.begin();
828 it != resources.end(); 825 it != resources.end();
829 ++it) { 826 ++it) {
830 TransferableResource resource; 827 TransferableResource resource;
(...skipping 16 matching lines...) Expand all
847 ++it) { 844 ++it) {
848 if (!it->sync_point) 845 if (!it->sync_point)
849 it->sync_point = sync_point; 846 it->sync_point = sync_point;
850 } 847 }
851 } 848 }
852 } 849 }
853 850
854 void ResourceProvider::ReceiveFromChild( 851 void ResourceProvider::ReceiveFromChild(
855 int child, const TransferableResourceArray& resources) { 852 int child, const TransferableResourceArray& resources) {
856 DCHECK(thread_checker_.CalledOnValidThread()); 853 DCHECK(thread_checker_.CalledOnValidThread());
857 WebGraphicsContext3D* context3d = output_surface_->context3d(); 854 WebGraphicsContext3D* context3d = Context3d();
858 if (!context3d || !context3d->makeContextCurrent()) { 855 if (!context3d || !context3d->makeContextCurrent()) {
859 // TODO(skaslev): Implement this path for software compositing. 856 // TODO(skaslev): Implement this path for software compositing.
860 return; 857 return;
861 } 858 }
862 Child& child_info = children_.find(child)->second; 859 Child& child_info = children_.find(child)->second;
863 for (TransferableResourceArray::const_iterator it = resources.begin(); 860 for (TransferableResourceArray::const_iterator it = resources.begin();
864 it != resources.end(); 861 it != resources.end();
865 ++it) { 862 ++it) {
866 unsigned texture_id; 863 unsigned texture_id;
867 // NOTE: If the parent is a browser and the child a renderer, the parent 864 // NOTE: If the parent is a browser and the child a renderer, the parent
(...skipping 16 matching lines...) Expand all
884 resource.allocated = true; 881 resource.allocated = true;
885 resources_[id] = resource; 882 resources_[id] = resource;
886 child_info.parent_to_child_map[id] = it->id; 883 child_info.parent_to_child_map[id] = it->id;
887 child_info.child_to_parent_map[it->id] = id; 884 child_info.child_to_parent_map[it->id] = id;
888 } 885 }
889 } 886 }
890 887
891 void ResourceProvider::ReceiveFromParent( 888 void ResourceProvider::ReceiveFromParent(
892 const TransferableResourceArray& resources) { 889 const TransferableResourceArray& resources) {
893 DCHECK(thread_checker_.CalledOnValidThread()); 890 DCHECK(thread_checker_.CalledOnValidThread());
894 WebGraphicsContext3D* context3d = output_surface_->context3d(); 891 WebGraphicsContext3D* context3d = Context3d();
895 if (!context3d || !context3d->makeContextCurrent()) { 892 if (!context3d || !context3d->makeContextCurrent()) {
896 // TODO(skaslev): Implement this path for software compositing. 893 // TODO(skaslev): Implement this path for software compositing.
897 return; 894 return;
898 } 895 }
899 for (TransferableResourceArray::const_iterator it = resources.begin(); 896 for (TransferableResourceArray::const_iterator it = resources.begin();
900 it != resources.end(); 897 it != resources.end();
901 ++it) { 898 ++it) {
902 ResourceMap::iterator map_iterator = resources_.find(it->id); 899 ResourceMap::iterator map_iterator = resources_.find(it->id);
903 DCHECK(map_iterator != resources_.end()); 900 DCHECK(map_iterator != resources_.end());
904 Resource* resource = &map_iterator->second; 901 Resource* resource = &map_iterator->second;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
963 void ResourceProvider::AcquirePixelBuffer(ResourceId id) { 960 void ResourceProvider::AcquirePixelBuffer(ResourceId id) {
964 DCHECK(thread_checker_.CalledOnValidThread()); 961 DCHECK(thread_checker_.CalledOnValidThread());
965 ResourceMap::iterator it = resources_.find(id); 962 ResourceMap::iterator it = resources_.find(id);
966 CHECK(it != resources_.end()); 963 CHECK(it != resources_.end());
967 Resource* resource = &it->second; 964 Resource* resource = &it->second;
968 DCHECK(!resource->external); 965 DCHECK(!resource->external);
969 DCHECK(!resource->exported); 966 DCHECK(!resource->exported);
970 DCHECK(!resource->image_id); 967 DCHECK(!resource->image_id);
971 968
972 if (resource->type == GLTexture) { 969 if (resource->type == GLTexture) {
973 WebGraphicsContext3D* context3d = output_surface_->context3d(); 970 WebGraphicsContext3D* context3d = Context3d();
974 DCHECK(context3d); 971 DCHECK(context3d);
975 if (!resource->gl_pixel_buffer_id) 972 if (!resource->gl_pixel_buffer_id)
976 resource->gl_pixel_buffer_id = context3d->createBuffer(); 973 resource->gl_pixel_buffer_id = context3d->createBuffer();
977 context3d->bindBuffer( 974 context3d->bindBuffer(
978 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 975 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
979 resource->gl_pixel_buffer_id); 976 resource->gl_pixel_buffer_id);
980 context3d->bufferData( 977 context3d->bufferData(
981 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 978 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
982 4 * resource->size.GetArea(), 979 4 * resource->size.GetArea(),
983 NULL, 980 NULL,
(...skipping 26 matching lines...) Expand all
1010 // as each new query has a unique submit count. 1007 // as each new query has a unique submit count.
1011 if (resource->pending_set_pixels) { 1008 if (resource->pending_set_pixels) {
1012 DCHECK(resource->set_pixels_completion_forced); 1009 DCHECK(resource->set_pixels_completion_forced);
1013 resource->pending_set_pixels = false; 1010 resource->pending_set_pixels = false;
1014 UnlockForWrite(id); 1011 UnlockForWrite(id);
1015 } 1012 }
1016 1013
1017 if (resource->type == GLTexture) { 1014 if (resource->type == GLTexture) {
1018 if (!resource->gl_pixel_buffer_id) 1015 if (!resource->gl_pixel_buffer_id)
1019 return; 1016 return;
1020 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1017 WebGraphicsContext3D* context3d = Context3d();
1021 DCHECK(context3d); 1018 DCHECK(context3d);
1022 context3d->bindBuffer( 1019 context3d->bindBuffer(
1023 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 1020 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
1024 resource->gl_pixel_buffer_id); 1021 resource->gl_pixel_buffer_id);
1025 context3d->bufferData( 1022 context3d->bufferData(
1026 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 1023 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
1027 0, 1024 0,
1028 NULL, 1025 NULL,
1029 GL_DYNAMIC_DRAW); 1026 GL_DYNAMIC_DRAW);
1030 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); 1027 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
(...skipping 10 matching lines...) Expand all
1041 uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id) { 1038 uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id) {
1042 DCHECK(thread_checker_.CalledOnValidThread()); 1039 DCHECK(thread_checker_.CalledOnValidThread());
1043 ResourceMap::iterator it = resources_.find(id); 1040 ResourceMap::iterator it = resources_.find(id);
1044 CHECK(it != resources_.end()); 1041 CHECK(it != resources_.end());
1045 Resource* resource = &it->second; 1042 Resource* resource = &it->second;
1046 DCHECK(!resource->external); 1043 DCHECK(!resource->external);
1047 DCHECK(!resource->exported); 1044 DCHECK(!resource->exported);
1048 DCHECK(!resource->image_id); 1045 DCHECK(!resource->image_id);
1049 1046
1050 if (resource->type == GLTexture) { 1047 if (resource->type == GLTexture) {
1051 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1048 WebGraphicsContext3D* context3d = Context3d();
1052 DCHECK(context3d); 1049 DCHECK(context3d);
1053 DCHECK(resource->gl_pixel_buffer_id); 1050 DCHECK(resource->gl_pixel_buffer_id);
1054 context3d->bindBuffer( 1051 context3d->bindBuffer(
1055 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 1052 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
1056 resource->gl_pixel_buffer_id); 1053 resource->gl_pixel_buffer_id);
1057 uint8_t* image = static_cast<uint8_t*>( 1054 uint8_t* image = static_cast<uint8_t*>(
1058 context3d->mapBufferCHROMIUM( 1055 context3d->mapBufferCHROMIUM(
1059 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); 1056 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY));
1060 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); 1057 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
1061 // Buffer is required to be 4-byte aligned. 1058 // Buffer is required to be 4-byte aligned.
(...skipping 10 matching lines...) Expand all
1072 void ResourceProvider::UnmapPixelBuffer(ResourceId id) { 1069 void ResourceProvider::UnmapPixelBuffer(ResourceId id) {
1073 DCHECK(thread_checker_.CalledOnValidThread()); 1070 DCHECK(thread_checker_.CalledOnValidThread());
1074 ResourceMap::iterator it = resources_.find(id); 1071 ResourceMap::iterator it = resources_.find(id);
1075 CHECK(it != resources_.end()); 1072 CHECK(it != resources_.end());
1076 Resource* resource = &it->second; 1073 Resource* resource = &it->second;
1077 DCHECK(!resource->external); 1074 DCHECK(!resource->external);
1078 DCHECK(!resource->exported); 1075 DCHECK(!resource->exported);
1079 DCHECK(!resource->image_id); 1076 DCHECK(!resource->image_id);
1080 1077
1081 if (resource->type == GLTexture) { 1078 if (resource->type == GLTexture) {
1082 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1079 WebGraphicsContext3D* context3d = Context3d();
1083 DCHECK(context3d); 1080 DCHECK(context3d);
1084 DCHECK(resource->gl_pixel_buffer_id); 1081 DCHECK(resource->gl_pixel_buffer_id);
1085 context3d->bindBuffer( 1082 context3d->bindBuffer(
1086 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 1083 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
1087 resource->gl_pixel_buffer_id); 1084 resource->gl_pixel_buffer_id);
1088 context3d->unmapBufferCHROMIUM(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); 1085 context3d->unmapBufferCHROMIUM(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM);
1089 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); 1086 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
1090 } 1087 }
1091 } 1088 }
1092 1089
1093 void ResourceProvider::BindForSampling(ResourceProvider::ResourceId resource_id, 1090 void ResourceProvider::BindForSampling(ResourceProvider::ResourceId resource_id,
1094 GLenum target, 1091 GLenum target,
1095 GLenum unit, 1092 GLenum unit,
1096 GLenum filter) { 1093 GLenum filter) {
1097 DCHECK(thread_checker_.CalledOnValidThread()); 1094 DCHECK(thread_checker_.CalledOnValidThread());
1098 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1095 WebGraphicsContext3D* context3d = Context3d();
1099 ResourceMap::iterator it = resources_.find(resource_id); 1096 ResourceMap::iterator it = resources_.find(resource_id);
1100 DCHECK(it != resources_.end()); 1097 DCHECK(it != resources_.end());
1101 Resource* resource = &it->second; 1098 Resource* resource = &it->second;
1102 DCHECK(resource->lock_for_read_count); 1099 DCHECK(resource->lock_for_read_count);
1103 DCHECK(!resource->locked_for_write || resource->set_pixels_completion_forced); 1100 DCHECK(!resource->locked_for_write || resource->set_pixels_completion_forced);
1104 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(context3d)); 1101 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(context3d));
1105 1102
1106 if (unit != GL_TEXTURE0) 1103 if (unit != GL_TEXTURE0)
1107 GLC(context3d, context3d->activeTexture(unit)); 1104 GLC(context3d, context3d->activeTexture(unit));
1108 GLC(context3d, context3d->bindTexture(target, resource->gl_id)); 1105 GLC(context3d, context3d->bindTexture(target, resource->gl_id));
(...skipping 18 matching lines...) Expand all
1127 void ResourceProvider::UnbindForSampling( 1124 void ResourceProvider::UnbindForSampling(
1128 ResourceProvider::ResourceId resource_id, GLenum target, GLenum unit) { 1125 ResourceProvider::ResourceId resource_id, GLenum target, GLenum unit) {
1129 DCHECK(thread_checker_.CalledOnValidThread()); 1126 DCHECK(thread_checker_.CalledOnValidThread());
1130 ResourceMap::iterator it = resources_.find(resource_id); 1127 ResourceMap::iterator it = resources_.find(resource_id);
1131 DCHECK(it != resources_.end()); 1128 DCHECK(it != resources_.end());
1132 Resource* resource = &it->second; 1129 Resource* resource = &it->second;
1133 1130
1134 if (!resource->image_id) 1131 if (!resource->image_id)
1135 return; 1132 return;
1136 1133
1137 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1134 WebGraphicsContext3D* context3d = Context3d();
1138 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(context3d)); 1135 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(context3d));
1139 if (unit != GL_TEXTURE0) 1136 if (unit != GL_TEXTURE0)
1140 GLC(context3d, context3d->activeTexture(unit)); 1137 GLC(context3d, context3d->activeTexture(unit));
1141 context3d->releaseTexImage2DCHROMIUM(target, resource->image_id); 1138 context3d->releaseTexImage2DCHROMIUM(target, resource->image_id);
1142 // Active unit being GL_TEXTURE0 is effectively the ground state. 1139 // Active unit being GL_TEXTURE0 is effectively the ground state.
1143 if (unit != GL_TEXTURE0) 1140 if (unit != GL_TEXTURE0)
1144 GLC(context3d, context3d->activeTexture(GL_TEXTURE0)); 1141 GLC(context3d, context3d->activeTexture(GL_TEXTURE0));
1145 } 1142 }
1146 1143
1147 void ResourceProvider::BeginSetPixels(ResourceId id) { 1144 void ResourceProvider::BeginSetPixels(ResourceId id) {
1148 DCHECK(thread_checker_.CalledOnValidThread()); 1145 DCHECK(thread_checker_.CalledOnValidThread());
1149 ResourceMap::iterator it = resources_.find(id); 1146 ResourceMap::iterator it = resources_.find(id);
1150 CHECK(it != resources_.end()); 1147 CHECK(it != resources_.end());
1151 Resource* resource = &it->second; 1148 Resource* resource = &it->second;
1152 DCHECK(!resource->pending_set_pixels); 1149 DCHECK(!resource->pending_set_pixels);
1153 1150
1154 LazyCreate(resource); 1151 LazyCreate(resource);
1155 DCHECK(resource->gl_id || resource->allocated); 1152 DCHECK(resource->gl_id || resource->allocated);
1156 DCHECK(ReadLockFenceHasPassed(resource)); 1153 DCHECK(ReadLockFenceHasPassed(resource));
1157 DCHECK(!resource->image_id); 1154 DCHECK(!resource->image_id);
1158 1155
1159 bool allocate = !resource->allocated; 1156 bool allocate = !resource->allocated;
1160 resource->allocated = true; 1157 resource->allocated = true;
1161 LockForWrite(id); 1158 LockForWrite(id);
1162 1159
1163 if (resource->gl_id) { 1160 if (resource->gl_id) {
1164 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1161 WebGraphicsContext3D* context3d = Context3d();
1165 DCHECK(context3d); 1162 DCHECK(context3d);
1166 DCHECK(resource->gl_pixel_buffer_id); 1163 DCHECK(resource->gl_pixel_buffer_id);
1167 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); 1164 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id);
1168 context3d->bindBuffer( 1165 context3d->bindBuffer(
1169 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 1166 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
1170 resource->gl_pixel_buffer_id); 1167 resource->gl_pixel_buffer_id);
1171 if (!resource->gl_upload_query_id) 1168 if (!resource->gl_upload_query_id)
1172 resource->gl_upload_query_id = context3d->createQueryEXT(); 1169 resource->gl_upload_query_id = context3d->createQueryEXT();
1173 context3d->beginQueryEXT( 1170 context3d->beginQueryEXT(
1174 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, 1171 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM,
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1215 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { 1212 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) {
1216 DCHECK(thread_checker_.CalledOnValidThread()); 1213 DCHECK(thread_checker_.CalledOnValidThread());
1217 ResourceMap::iterator it = resources_.find(id); 1214 ResourceMap::iterator it = resources_.find(id);
1218 CHECK(it != resources_.end()); 1215 CHECK(it != resources_.end());
1219 Resource* resource = &it->second; 1216 Resource* resource = &it->second;
1220 DCHECK(resource->locked_for_write); 1217 DCHECK(resource->locked_for_write);
1221 DCHECK(resource->pending_set_pixels); 1218 DCHECK(resource->pending_set_pixels);
1222 DCHECK(!resource->set_pixels_completion_forced); 1219 DCHECK(!resource->set_pixels_completion_forced);
1223 1220
1224 if (resource->gl_id) { 1221 if (resource->gl_id) {
1225 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1222 WebGraphicsContext3D* context3d = Context3d();
1226 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id)); 1223 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id));
1227 GLC(context3d, context3d->waitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); 1224 GLC(context3d, context3d->waitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D));
1228 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, 0)); 1225 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, 0));
1229 } 1226 }
1230 1227
1231 resource->set_pixels_completion_forced = true; 1228 resource->set_pixels_completion_forced = true;
1232 } 1229 }
1233 1230
1234 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { 1231 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) {
1235 DCHECK(thread_checker_.CalledOnValidThread()); 1232 DCHECK(thread_checker_.CalledOnValidThread());
1236 ResourceMap::iterator it = resources_.find(id); 1233 ResourceMap::iterator it = resources_.find(id);
1237 CHECK(it != resources_.end()); 1234 CHECK(it != resources_.end());
1238 Resource* resource = &it->second; 1235 Resource* resource = &it->second;
1239 DCHECK(resource->locked_for_write); 1236 DCHECK(resource->locked_for_write);
1240 DCHECK(resource->pending_set_pixels); 1237 DCHECK(resource->pending_set_pixels);
1241 1238
1242 if (resource->gl_id) { 1239 if (resource->gl_id) {
1243 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1240 WebGraphicsContext3D* context3d = Context3d();
1244 DCHECK(context3d); 1241 DCHECK(context3d);
1245 DCHECK(resource->gl_upload_query_id); 1242 DCHECK(resource->gl_upload_query_id);
1246 unsigned complete = 1; 1243 unsigned complete = 1;
1247 context3d->getQueryObjectuivEXT( 1244 context3d->getQueryObjectuivEXT(
1248 resource->gl_upload_query_id, 1245 resource->gl_upload_query_id,
1249 GL_QUERY_RESULT_AVAILABLE_EXT, 1246 GL_QUERY_RESULT_AVAILABLE_EXT,
1250 &complete); 1247 &complete);
1251 if (!complete) 1248 if (!complete)
1252 return false; 1249 return false;
1253 } 1250 }
(...skipping 12 matching lines...) Expand all
1266 } 1263 }
1267 1264
1268 void ResourceProvider::LazyCreate(Resource* resource) { 1265 void ResourceProvider::LazyCreate(Resource* resource) {
1269 if (resource->type != GLTexture || resource->gl_id != 0) 1266 if (resource->type != GLTexture || resource->gl_id != 0)
1270 return; 1267 return;
1271 1268
1272 // Early out for resources that don't require texture creation. 1269 // Early out for resources that don't require texture creation.
1273 if (resource->texture_pool == 0) 1270 if (resource->texture_pool == 0)
1274 return; 1271 return;
1275 1272
1276 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1273 WebGraphicsContext3D* context3d = Context3d();
1277 DCHECK(context3d); 1274 DCHECK(context3d);
1278 // Create and set texture properties. Allocation is delayed until needed. 1275 // Create and set texture properties. Allocation is delayed until needed.
1279 resource->gl_id = CreateTextureId(context3d); 1276 resource->gl_id = CreateTextureId(context3d);
1280 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, 1277 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D,
1281 GL_TEXTURE_POOL_CHROMIUM, 1278 GL_TEXTURE_POOL_CHROMIUM,
1282 resource->texture_pool)); 1279 resource->texture_pool));
1283 if (use_texture_usage_hint_ && resource->hint == TextureUsageFramebuffer) { 1280 if (use_texture_usage_hint_ && resource->hint == TextureUsageFramebuffer) {
1284 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, 1281 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D,
1285 GL_TEXTURE_USAGE_ANGLE, 1282 GL_TEXTURE_USAGE_ANGLE,
1286 GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); 1283 GL_FRAMEBUFFER_ATTACHMENT_ANGLE));
1287 } 1284 }
1288 } 1285 }
1289 1286
1290 void ResourceProvider::AllocateForTesting(ResourceId id) { 1287 void ResourceProvider::AllocateForTesting(ResourceId id) {
1291 ResourceMap::iterator it = resources_.find(id); 1288 ResourceMap::iterator it = resources_.find(id);
1292 CHECK(it != resources_.end()); 1289 CHECK(it != resources_.end());
1293 Resource* resource = &it->second; 1290 Resource* resource = &it->second;
1294 LazyAllocate(resource); 1291 LazyAllocate(resource);
1295 } 1292 }
1296 1293
1297 void ResourceProvider::LazyAllocate(Resource* resource) { 1294 void ResourceProvider::LazyAllocate(Resource* resource) {
1298 DCHECK(resource); 1295 DCHECK(resource);
1299 LazyCreate(resource); 1296 LazyCreate(resource);
1300 1297
1301 DCHECK(resource->gl_id || resource->allocated); 1298 DCHECK(resource->gl_id || resource->allocated);
1302 if (resource->allocated || !resource->gl_id) 1299 if (resource->allocated || !resource->gl_id)
1303 return; 1300 return;
1304 resource->allocated = true; 1301 resource->allocated = true;
1305 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1302 WebGraphicsContext3D* context3d = Context3d();
1306 gfx::Size& size = resource->size; 1303 gfx::Size& size = resource->size;
1307 GLenum format = resource->format; 1304 GLenum format = resource->format;
1308 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id)); 1305 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id));
1309 if (use_texture_storage_ext_ && IsTextureFormatSupportedForStorage(format)) { 1306 if (use_texture_storage_ext_ && IsTextureFormatSupportedForStorage(format)) {
1310 GLenum storage_format = TextureToStorageFormat(format); 1307 GLenum storage_format = TextureToStorageFormat(format);
1311 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1308 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D,
1312 1, 1309 1,
1313 storage_format, 1310 storage_format,
1314 size.width(), 1311 size.width(),
1315 size.height())); 1312 size.height()));
(...skipping 28 matching lines...) Expand all
1344 DCHECK(!resource->external); 1341 DCHECK(!resource->external);
1345 DCHECK(!resource->exported); 1342 DCHECK(!resource->exported);
1346 1343
1347 if (resource->type != GLTexture) 1344 if (resource->type != GLTexture)
1348 return; 1345 return;
1349 1346
1350 if (resource->image_id) 1347 if (resource->image_id)
1351 return; 1348 return;
1352 1349
1353 resource->allocated = true; 1350 resource->allocated = true;
1354 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1351 WebGraphicsContext3D* context3d = Context3d();
1355 DCHECK(context3d); 1352 DCHECK(context3d);
1356 resource->image_id = context3d->createImageCHROMIUM( 1353 resource->image_id = context3d->createImageCHROMIUM(
1357 resource->size.width(), resource->size.height(), GL_RGBA8_OES); 1354 resource->size.width(), resource->size.height(), GL_RGBA8_OES);
1358 DCHECK(resource->image_id); 1355 DCHECK(resource->image_id);
1359 } 1356 }
1360 1357
1361 void ResourceProvider::ReleaseImage(ResourceId id) { 1358 void ResourceProvider::ReleaseImage(ResourceId id) {
1362 DCHECK(thread_checker_.CalledOnValidThread()); 1359 DCHECK(thread_checker_.CalledOnValidThread());
1363 ResourceMap::iterator it = resources_.find(id); 1360 ResourceMap::iterator it = resources_.find(id);
1364 CHECK(it != resources_.end()); 1361 CHECK(it != resources_.end());
1365 Resource* resource = &it->second; 1362 Resource* resource = &it->second;
1366 1363
1367 DCHECK(!resource->external); 1364 DCHECK(!resource->external);
1368 DCHECK(!resource->exported); 1365 DCHECK(!resource->exported);
1369 1366
1370 if (!resource->image_id) 1367 if (!resource->image_id)
1371 return; 1368 return;
1372 1369
1373 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1370 WebGraphicsContext3D* context3d = Context3d();
1374 DCHECK(context3d); 1371 DCHECK(context3d);
1375 context3d->destroyImageCHROMIUM(resource->image_id); 1372 context3d->destroyImageCHROMIUM(resource->image_id);
1376 resource->image_id = 0; 1373 resource->image_id = 0;
1377 resource->allocated = false; 1374 resource->allocated = false;
1378 } 1375 }
1379 1376
1380 uint8_t* ResourceProvider::MapImage(ResourceId id) { 1377 uint8_t* ResourceProvider::MapImage(ResourceId id) {
1381 DCHECK(thread_checker_.CalledOnValidThread()); 1378 DCHECK(thread_checker_.CalledOnValidThread());
1382 ResourceMap::iterator it = resources_.find(id); 1379 ResourceMap::iterator it = resources_.find(id);
1383 CHECK(it != resources_.end()); 1380 CHECK(it != resources_.end());
1384 Resource* resource = &it->second; 1381 Resource* resource = &it->second;
1385 1382
1386 DCHECK(ReadLockFenceHasPassed(resource)); 1383 DCHECK(ReadLockFenceHasPassed(resource));
1387 DCHECK(!resource->external); 1384 DCHECK(!resource->external);
1388 DCHECK(!resource->exported); 1385 DCHECK(!resource->exported);
1389 1386
1390 if (resource->image_id) { 1387 if (resource->image_id) {
1391 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1388 WebGraphicsContext3D* context3d = Context3d();
1392 DCHECK(context3d); 1389 DCHECK(context3d);
1393 return static_cast<uint8_t*>( 1390 return static_cast<uint8_t*>(
1394 context3d->mapImageCHROMIUM(resource->image_id, GL_READ_WRITE)); 1391 context3d->mapImageCHROMIUM(resource->image_id, GL_READ_WRITE));
1395 } 1392 }
1396 1393
1397 if (resource->pixels) 1394 if (resource->pixels)
1398 return resource->pixels; 1395 return resource->pixels;
1399 1396
1400 return NULL; 1397 return NULL;
1401 } 1398 }
1402 1399
1403 void ResourceProvider::UnmapImage(ResourceId id) { 1400 void ResourceProvider::UnmapImage(ResourceId id) {
1404 DCHECK(thread_checker_.CalledOnValidThread()); 1401 DCHECK(thread_checker_.CalledOnValidThread());
1405 ResourceMap::iterator it = resources_.find(id); 1402 ResourceMap::iterator it = resources_.find(id);
1406 CHECK(it != resources_.end()); 1403 CHECK(it != resources_.end());
1407 Resource* resource = &it->second; 1404 Resource* resource = &it->second;
1408 1405
1409 DCHECK(!resource->external); 1406 DCHECK(!resource->external);
1410 DCHECK(!resource->exported); 1407 DCHECK(!resource->exported);
1411 1408
1412 if (resource->image_id) { 1409 if (resource->image_id) {
1413 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1410 WebGraphicsContext3D* context3d = Context3d();
1414 DCHECK(context3d); 1411 DCHECK(context3d);
1415 context3d->unmapImageCHROMIUM(resource->image_id); 1412 context3d->unmapImageCHROMIUM(resource->image_id);
1416 } 1413 }
1417 } 1414 }
1418 1415
1419 int ResourceProvider::GetImageStride(ResourceId id) { 1416 int ResourceProvider::GetImageStride(ResourceId id) {
1420 DCHECK(thread_checker_.CalledOnValidThread()); 1417 DCHECK(thread_checker_.CalledOnValidThread());
1421 ResourceMap::iterator it = resources_.find(id); 1418 ResourceMap::iterator it = resources_.find(id);
1422 CHECK(it != resources_.end()); 1419 CHECK(it != resources_.end());
1423 Resource* resource = &it->second; 1420 Resource* resource = &it->second;
1424 1421
1425 DCHECK(!resource->external); 1422 DCHECK(!resource->external);
1426 DCHECK(!resource->exported); 1423 DCHECK(!resource->exported);
1427 1424
1428 int stride = 0; 1425 int stride = 0;
1429 1426
1430 if (resource->image_id) { 1427 if (resource->image_id) {
1431 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1428 WebGraphicsContext3D* context3d = Context3d();
1432 DCHECK(context3d); 1429 DCHECK(context3d);
1433 context3d->getImageParameterivCHROMIUM( 1430 context3d->getImageParameterivCHROMIUM(
1434 resource->image_id, GL_IMAGE_ROWBYTES_CHROMIUM, &stride); 1431 resource->image_id, GL_IMAGE_ROWBYTES_CHROMIUM, &stride);
1435 } 1432 }
1436 1433
1437 return stride; 1434 return stride;
1438 } 1435 }
1439 1436
1440 GLint ResourceProvider::GetActiveTextureUnit(WebGraphicsContext3D* context) { 1437 GLint ResourceProvider::GetActiveTextureUnit(WebGraphicsContext3D* context) {
1441 GLint active_unit = 0; 1438 GLint active_unit = 0;
1442 context->getIntegerv(GL_ACTIVE_TEXTURE, &active_unit); 1439 context->getIntegerv(GL_ACTIVE_TEXTURE, &active_unit);
1443 return active_unit; 1440 return active_unit;
1444 } 1441 }
1445 1442
1443 WebKit::WebGraphicsContext3D* ResourceProvider::Context3d() const {
1444 ContextProvider* context_provider = output_surface_->context_provider();
1445 return context_provider ? context_provider->Context3d() : NULL;
1446 }
1447
1446 } // namespace cc 1448 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/resource_provider.h ('k') | cc/resources/resource_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698