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/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 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 lock_for_read_count(0), | 173 lock_for_read_count(0), |
174 imported_count(0), | 174 imported_count(0), |
175 exported_count(0), | 175 exported_count(0), |
176 locked_for_write(false), | 176 locked_for_write(false), |
177 external(false), | 177 external(false), |
178 marked_for_deletion(false), | 178 marked_for_deletion(false), |
179 pending_set_pixels(false), | 179 pending_set_pixels(false), |
180 set_pixels_completion_forced(false), | 180 set_pixels_completion_forced(false), |
181 allocated(false), | 181 allocated(false), |
182 enable_read_lock_fences(false), | 182 enable_read_lock_fences(false), |
| 183 sync_point_is_from_client(false), |
183 read_lock_fence(NULL), | 184 read_lock_fence(NULL), |
184 size(), | 185 size(), |
185 target(0), | 186 target(0), |
186 original_filter(0), | 187 original_filter(0), |
187 filter(0), | 188 filter(0), |
188 image_id(0), | 189 image_id(0), |
189 bound_image_id(0), | 190 bound_image_id(0), |
190 dirty_image(false), | 191 dirty_image(false), |
191 texture_pool(0), | 192 texture_pool(0), |
192 wrap_mode(0), | 193 wrap_mode(0), |
(...skipping 22 matching lines...) Expand all Loading... |
215 lock_for_read_count(0), | 216 lock_for_read_count(0), |
216 imported_count(0), | 217 imported_count(0), |
217 exported_count(0), | 218 exported_count(0), |
218 locked_for_write(false), | 219 locked_for_write(false), |
219 external(false), | 220 external(false), |
220 marked_for_deletion(false), | 221 marked_for_deletion(false), |
221 pending_set_pixels(false), | 222 pending_set_pixels(false), |
222 set_pixels_completion_forced(false), | 223 set_pixels_completion_forced(false), |
223 allocated(false), | 224 allocated(false), |
224 enable_read_lock_fences(false), | 225 enable_read_lock_fences(false), |
| 226 sync_point_is_from_client(false), |
225 read_lock_fence(NULL), | 227 read_lock_fence(NULL), |
226 size(size), | 228 size(size), |
227 target(target), | 229 target(target), |
228 original_filter(filter), | 230 original_filter(filter), |
229 filter(filter), | 231 filter(filter), |
230 image_id(0), | 232 image_id(0), |
231 bound_image_id(0), | 233 bound_image_id(0), |
232 dirty_image(false), | 234 dirty_image(false), |
233 texture_pool(texture_pool), | 235 texture_pool(texture_pool), |
234 wrap_mode(wrap_mode), | 236 wrap_mode(wrap_mode), |
(...skipping 19 matching lines...) Expand all Loading... |
254 lock_for_read_count(0), | 256 lock_for_read_count(0), |
255 imported_count(0), | 257 imported_count(0), |
256 exported_count(0), | 258 exported_count(0), |
257 locked_for_write(false), | 259 locked_for_write(false), |
258 external(false), | 260 external(false), |
259 marked_for_deletion(false), | 261 marked_for_deletion(false), |
260 pending_set_pixels(false), | 262 pending_set_pixels(false), |
261 set_pixels_completion_forced(false), | 263 set_pixels_completion_forced(false), |
262 allocated(false), | 264 allocated(false), |
263 enable_read_lock_fences(false), | 265 enable_read_lock_fences(false), |
| 266 sync_point_is_from_client(false), |
264 read_lock_fence(NULL), | 267 read_lock_fence(NULL), |
265 size(size), | 268 size(size), |
266 target(0), | 269 target(0), |
267 original_filter(filter), | 270 original_filter(filter), |
268 filter(filter), | 271 filter(filter), |
269 image_id(0), | 272 image_id(0), |
270 bound_image_id(0), | 273 bound_image_id(0), |
271 dirty_image(false), | 274 dirty_image(false), |
272 texture_pool(0), | 275 texture_pool(0), |
273 wrap_mode(wrap_mode), | 276 wrap_mode(wrap_mode), |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 } | 477 } |
475 resource = Resource(pixels, | 478 resource = Resource(pixels, |
476 shared_bitmap.release(), | 479 shared_bitmap.release(), |
477 mailbox.shared_memory_size(), | 480 mailbox.shared_memory_size(), |
478 GL_LINEAR, | 481 GL_LINEAR, |
479 GL_CLAMP_TO_EDGE); | 482 GL_CLAMP_TO_EDGE); |
480 } | 483 } |
481 resource.external = true; | 484 resource.external = true; |
482 resource.allocated = true; | 485 resource.allocated = true; |
483 resource.mailbox = mailbox; | 486 resource.mailbox = mailbox; |
| 487 resource.sync_point_is_from_client = true; |
484 resource.release_callback = | 488 resource.release_callback = |
485 base::Bind(&SingleReleaseCallback::Run, | 489 base::Bind(&SingleReleaseCallback::Run, |
486 base::Owned(release_callback.release())); | 490 base::Owned(release_callback.release())); |
487 return id; | 491 return id; |
488 } | 492 } |
489 | 493 |
490 void ResourceProvider::DeleteResource(ResourceId id) { | 494 void ResourceProvider::DeleteResource(ResourceId id) { |
491 DCHECK(thread_checker_.CalledOnValidThread()); | 495 DCHECK(thread_checker_.CalledOnValidThread()); |
492 ResourceMap::iterator it = resources_.find(id); | 496 ResourceMap::iterator it = resources_.find(id); |
493 CHECK(it != resources_.end()); | 497 CHECK(it != resources_.end()); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 DCHECK(context3d); | 535 DCHECK(context3d); |
532 GLC(context3d, context3d->deleteQueryEXT(resource->gl_upload_query_id)); | 536 GLC(context3d, context3d->deleteQueryEXT(resource->gl_upload_query_id)); |
533 } | 537 } |
534 if (resource->gl_pixel_buffer_id) { | 538 if (resource->gl_pixel_buffer_id) { |
535 WebGraphicsContext3D* context3d = Context3d(); | 539 WebGraphicsContext3D* context3d = Context3d(); |
536 DCHECK(context3d); | 540 DCHECK(context3d); |
537 GLC(context3d, context3d->deleteBuffer(resource->gl_pixel_buffer_id)); | 541 GLC(context3d, context3d->deleteBuffer(resource->gl_pixel_buffer_id)); |
538 } | 542 } |
539 if (resource->mailbox.IsValid() && resource->external) { | 543 if (resource->mailbox.IsValid() && resource->external) { |
540 unsigned sync_point = resource->mailbox.sync_point(); | 544 unsigned sync_point = resource->mailbox.sync_point(); |
| 545 if (resource->sync_point_is_from_client) |
| 546 sync_point = 0; |
541 if (resource->mailbox.IsTexture()) { | 547 if (resource->mailbox.IsTexture()) { |
542 lost_resource |= lost_output_surface_; | 548 lost_resource |= lost_output_surface_; |
543 WebGraphicsContext3D* context3d = Context3d(); | 549 WebGraphicsContext3D* context3d = Context3d(); |
544 DCHECK(context3d); | 550 DCHECK(context3d); |
545 if (resource->gl_id) | 551 if (resource->gl_id) |
546 GLC(context3d, context3d->deleteTexture(resource->gl_id)); | 552 GLC(context3d, context3d->deleteTexture(resource->gl_id)); |
547 if (!lost_resource && resource->gl_id) | 553 if (!lost_resource && resource->gl_id) { |
| 554 DCHECK(!sync_point); |
548 sync_point = context3d->insertSyncPoint(); | 555 sync_point = context3d->insertSyncPoint(); |
| 556 } |
549 } else { | 557 } else { |
550 DCHECK(resource->mailbox.IsSharedMemory()); | 558 DCHECK(resource->mailbox.IsSharedMemory()); |
551 base::SharedMemory* shared_memory = resource->mailbox.shared_memory(); | 559 base::SharedMemory* shared_memory = resource->mailbox.shared_memory(); |
552 if (resource->pixels && shared_memory) { | 560 if (resource->pixels && shared_memory) { |
553 DCHECK(shared_memory->memory() == resource->pixels); | 561 DCHECK(shared_memory->memory() == resource->pixels); |
554 resource->pixels = NULL; | 562 resource->pixels = NULL; |
555 delete resource->shared_bitmap; | 563 delete resource->shared_bitmap; |
556 resource->shared_bitmap = NULL; | 564 resource->shared_bitmap = NULL; |
557 } | 565 } |
558 } | 566 } |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { | 710 const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { |
703 Resource* resource = GetResource(id); | 711 Resource* resource = GetResource(id); |
704 DCHECK(!resource->locked_for_write || | 712 DCHECK(!resource->locked_for_write || |
705 resource->set_pixels_completion_forced) << | 713 resource->set_pixels_completion_forced) << |
706 "locked for write: " << resource->locked_for_write << | 714 "locked for write: " << resource->locked_for_write << |
707 " pixels completion forced: " << resource->set_pixels_completion_forced; | 715 " pixels completion forced: " << resource->set_pixels_completion_forced; |
708 DCHECK_EQ(resource->exported_count, 0); | 716 DCHECK_EQ(resource->exported_count, 0); |
709 // Uninitialized! Call SetPixels or LockForWrite first. | 717 // Uninitialized! Call SetPixels or LockForWrite first. |
710 DCHECK(resource->allocated); | 718 DCHECK(resource->allocated); |
711 | 719 |
712 LazyCreate(resource); | 720 if (!resource->gl_id && resource->mailbox.IsTexture()) { |
713 | 721 WebGraphicsContext3D* context3d = Context3d(); |
714 if (resource->external) { | 722 DCHECK(context3d); |
715 if (!resource->gl_id && resource->mailbox.IsTexture()) { | 723 resource->sync_point_is_from_client = false; |
716 WebGraphicsContext3D* context3d = Context3d(); | 724 if (resource->mailbox.sync_point()) { |
717 DCHECK(context3d); | 725 GLC(context3d, context3d->waitSyncPoint(resource->mailbox.sync_point())); |
718 if (resource->mailbox.sync_point()) { | 726 resource->mailbox.ResetSyncPoint(); |
719 GLC(context3d, | |
720 context3d->waitSyncPoint(resource->mailbox.sync_point())); | |
721 resource->mailbox.ResetSyncPoint(); | |
722 } | |
723 resource->gl_id = texture_id_allocator_->NextId(); | |
724 GLC(context3d, context3d->bindTexture(resource->target, resource->gl_id)); | |
725 GLC(context3d, | |
726 context3d->consumeTextureCHROMIUM(resource->target, | |
727 resource->mailbox.data())); | |
728 } | 727 } |
| 728 resource->gl_id = texture_id_allocator_->NextId(); |
| 729 GLC(context3d, context3d->bindTexture(resource->target, resource->gl_id)); |
| 730 GLC(context3d, |
| 731 context3d->consumeTextureCHROMIUM(resource->target, |
| 732 resource->mailbox.data())); |
| 733 } else { |
| 734 LazyCreate(resource); |
729 } | 735 } |
730 | 736 |
731 resource->lock_for_read_count++; | 737 resource->lock_for_read_count++; |
732 if (resource->enable_read_lock_fences) | 738 if (resource->enable_read_lock_fences) |
733 resource->read_lock_fence = current_read_lock_fence_; | 739 resource->read_lock_fence = current_read_lock_fence_; |
734 | 740 |
735 return resource; | 741 return resource; |
736 } | 742 } |
737 | 743 |
738 void ResourceProvider::UnlockForRead(ResourceId id) { | 744 void ResourceProvider::UnlockForRead(ResourceId id) { |
739 Resource* resource = GetResource(id); | 745 Resource* resource = GetResource(id); |
740 DCHECK_GT(resource->lock_for_read_count, 0); | 746 DCHECK_GT(resource->lock_for_read_count, 0); |
741 DCHECK_EQ(resource->exported_count, 0); | 747 DCHECK_EQ(resource->exported_count, 0); |
742 resource->lock_for_read_count--; | 748 resource->lock_for_read_count--; |
743 } | 749 } |
744 | 750 |
745 const ResourceProvider::Resource* ResourceProvider::LockForWrite( | 751 const ResourceProvider::Resource* ResourceProvider::LockForWrite( |
746 ResourceId id) { | 752 ResourceId id) { |
747 Resource* resource = GetResource(id); | 753 Resource* resource = GetResource(id); |
748 DCHECK(!resource->locked_for_write); | 754 DCHECK(!resource->locked_for_write); |
749 DCHECK(!resource->lock_for_read_count); | 755 DCHECK(!resource->lock_for_read_count); |
750 DCHECK_EQ(resource->exported_count, 0); | 756 DCHECK_EQ(resource->exported_count, 0); |
751 DCHECK(!resource->external); | 757 DCHECK(!resource->external); |
752 DCHECK(!resource->lost); | 758 DCHECK(!resource->lost); |
753 DCHECK(ReadLockFenceHasPassed(resource)); | 759 DCHECK(ReadLockFenceHasPassed(resource)); |
754 LazyAllocate(resource); | 760 LazyAllocate(resource); |
755 | 761 |
| 762 resource->mailbox.ResetSyncPoint(); |
756 resource->locked_for_write = true; | 763 resource->locked_for_write = true; |
757 return resource; | 764 return resource; |
758 } | 765 } |
759 | 766 |
760 bool ResourceProvider::CanLockForWrite(ResourceId id) { | 767 bool ResourceProvider::CanLockForWrite(ResourceId id) { |
761 Resource* resource = GetResource(id); | 768 Resource* resource = GetResource(id); |
762 return !resource->locked_for_write && !resource->lock_for_read_count && | 769 return !resource->locked_for_write && !resource->lock_for_read_count && |
763 !resource->exported_count && !resource->external && !resource->lost && | 770 !resource->exported_count && !resource->external && !resource->lost && |
764 ReadLockFenceHasPassed(resource); | 771 ReadLockFenceHasPassed(resource); |
765 } | 772 } |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1064 child_info.return_callback.Run(to_return); | 1071 child_info.return_callback.Run(to_return); |
1065 continue; | 1072 continue; |
1066 } | 1073 } |
1067 | 1074 |
1068 ResourceId local_id = next_id_++; | 1075 ResourceId local_id = next_id_++; |
1069 Resource& resource = resources_[local_id]; | 1076 Resource& resource = resources_[local_id]; |
1070 if (it->is_software) { | 1077 if (it->is_software) { |
1071 resource = Resource( | 1078 resource = Resource( |
1072 pixels, bitmap.release(), it->size, GL_LINEAR, GL_CLAMP_TO_EDGE); | 1079 pixels, bitmap.release(), it->size, GL_LINEAR, GL_CLAMP_TO_EDGE); |
1073 } else { | 1080 } else { |
1074 unsigned texture_id; | 1081 resource = Resource(0, |
1075 // NOTE: If the parent is a browser and the child a renderer, the parent | |
1076 // is not supposed to have its context wait, because that could induce | |
1077 // deadlocks and/or security issues. The caller is responsible for | |
1078 // waiting asynchronously, and resetting sync_point before calling this. | |
1079 // However if the parent is a renderer (e.g. browser tag), it may be ok | |
1080 // (and is simpler) to wait. | |
1081 if (it->sync_point) | |
1082 GLC(context3d, context3d->waitSyncPoint(it->sync_point)); | |
1083 texture_id = texture_id_allocator_->NextId(); | |
1084 GLC(context3d, context3d->bindTexture(it->target, texture_id)); | |
1085 GLC(context3d, | |
1086 context3d->consumeTextureCHROMIUM(it->target, it->mailbox.name)); | |
1087 resource = Resource(texture_id, | |
1088 it->size, | 1082 it->size, |
1089 it->target, | 1083 it->target, |
1090 it->filter, | 1084 it->filter, |
1091 0, | 1085 0, |
1092 GL_CLAMP_TO_EDGE, | 1086 GL_CLAMP_TO_EDGE, |
1093 TextureUsageAny, | 1087 TextureUsageAny, |
1094 it->format); | 1088 it->format); |
1095 resource.mailbox.SetName(it->mailbox); | 1089 resource.mailbox = TextureMailbox(it->mailbox, it->sync_point); |
| 1090 resource.sync_point_is_from_client = true; |
1096 } | 1091 } |
1097 resource.child_id = child; | 1092 resource.child_id = child; |
1098 // Don't allocate a texture for a child. | 1093 // Don't allocate a texture for a child. |
1099 resource.allocated = true; | 1094 resource.allocated = true; |
1100 resource.imported_count = 1; | 1095 resource.imported_count = 1; |
1101 child_info.parent_to_child_map[local_id] = it->id; | 1096 child_info.parent_to_child_map[local_id] = it->id; |
1102 child_info.child_to_parent_map[it->id] = local_id; | 1097 child_info.child_to_parent_map[it->id] = local_id; |
1103 } | 1098 } |
1104 } | 1099 } |
1105 | 1100 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1184 ResourceMap::iterator& map_iterator = sorted_resources[i].second; | 1179 ResourceMap::iterator& map_iterator = sorted_resources[i].second; |
1185 ResourceId local_id = map_iterator->first; | 1180 ResourceId local_id = map_iterator->first; |
1186 Resource* resource = &map_iterator->second; | 1181 Resource* resource = &map_iterator->second; |
1187 | 1182 |
1188 CHECK_GE(resource->exported_count, returned.count); | 1183 CHECK_GE(resource->exported_count, returned.count); |
1189 resource->exported_count -= returned.count; | 1184 resource->exported_count -= returned.count; |
1190 resource->lost |= returned.lost; | 1185 resource->lost |= returned.lost; |
1191 if (resource->exported_count) | 1186 if (resource->exported_count) |
1192 continue; | 1187 continue; |
1193 | 1188 |
1194 if (resource->gl_id) { | 1189 if (returned.sync_point) { |
1195 if (returned.sync_point) | 1190 DCHECK(!resource->shared_bitmap); |
| 1191 resource->sync_point_is_from_client = false; |
| 1192 if (resource->gl_id) { |
1196 GLC(context3d, context3d->waitSyncPoint(returned.sync_point)); | 1193 GLC(context3d, context3d->waitSyncPoint(returned.sync_point)); |
1197 } else if (!resource->shared_bitmap) { | 1194 resource->mailbox.ResetSyncPoint(); |
1198 resource->mailbox = | 1195 } else { |
1199 TextureMailbox(resource->mailbox.name(), returned.sync_point); | 1196 resource->mailbox = |
| 1197 TextureMailbox(resource->mailbox.name(), returned.sync_point); |
| 1198 } |
1200 } | 1199 } |
1201 | 1200 |
1202 if (!resource->marked_for_deletion) | 1201 if (!resource->marked_for_deletion) |
1203 continue; | 1202 continue; |
1204 | 1203 |
1205 if (!resource->child_id) { | 1204 if (!resource->child_id) { |
1206 // The resource belongs to this ResourceProvider, so it can be destroyed. | 1205 // The resource belongs to this ResourceProvider, so it can be destroyed. |
1207 DeleteResourceInternal(map_iterator, Normal); | 1206 DeleteResourceInternal(map_iterator, Normal); |
1208 continue; | 1207 continue; |
1209 } | 1208 } |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1259 GLC(context, | 1258 GLC(context, |
1260 context->produceTextureCHROMIUM(resource->target, | 1259 context->produceTextureCHROMIUM(resource->target, |
1261 resource->mailbox.name)); | 1260 resource->mailbox.name)); |
1262 source->mailbox.SetName(resource->mailbox); | 1261 source->mailbox.SetName(resource->mailbox); |
1263 } else { | 1262 } else { |
1264 DCHECK(source->mailbox.IsTexture()); | 1263 DCHECK(source->mailbox.IsTexture()); |
1265 // This is either an external resource, or a compositor resource that we | 1264 // This is either an external resource, or a compositor resource that we |
1266 // already exported. Make sure to forward the sync point that we were given. | 1265 // already exported. Make sure to forward the sync point that we were given. |
1267 resource->mailbox = source->mailbox.name(); | 1266 resource->mailbox = source->mailbox.name(); |
1268 resource->sync_point = source->mailbox.sync_point(); | 1267 resource->sync_point = source->mailbox.sync_point(); |
1269 source->mailbox.ResetSyncPoint(); | |
1270 } | 1268 } |
1271 } | 1269 } |
1272 | 1270 |
1273 void ResourceProvider::DeleteAndReturnUnusedResourcesToChild( | 1271 void ResourceProvider::DeleteAndReturnUnusedResourcesToChild( |
1274 ChildMap::iterator child_it, | 1272 ChildMap::iterator child_it, |
1275 DeleteStyle style, | 1273 DeleteStyle style, |
1276 const ResourceIdArray& unused) { | 1274 const ResourceIdArray& unused) { |
1277 DCHECK(thread_checker_.CalledOnValidThread()); | 1275 DCHECK(thread_checker_.CalledOnValidThread()); |
1278 DCHECK(child_it != children_.end()); | 1276 DCHECK(child_it != children_.end()); |
1279 Child* child_info = &child_it->second; | 1277 Child* child_info = &child_it->second; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1326 GL_TEXTURE_MIN_FILTER, | 1324 GL_TEXTURE_MIN_FILTER, |
1327 resource.original_filter)); | 1325 resource.original_filter)); |
1328 GLC(context3d, | 1326 GLC(context3d, |
1329 context3d->texParameteri(resource.target, | 1327 context3d->texParameteri(resource.target, |
1330 GL_TEXTURE_MAG_FILTER, | 1328 GL_TEXTURE_MAG_FILTER, |
1331 resource.original_filter)); | 1329 resource.original_filter)); |
1332 } | 1330 } |
1333 | 1331 |
1334 ReturnedResource returned; | 1332 ReturnedResource returned; |
1335 returned.id = child_id; | 1333 returned.id = child_id; |
1336 returned.sync_point = resource.mailbox.sync_point(); | 1334 if (!resource.sync_point_is_from_client) { |
1337 if (!returned.sync_point && !resource.shared_bitmap) | 1335 returned.sync_point = resource.mailbox.sync_point(); |
1338 need_sync_point = true; | 1336 if (!returned.sync_point && !resource.shared_bitmap) |
| 1337 need_sync_point = true; |
| 1338 } |
1339 returned.count = resource.imported_count; | 1339 returned.count = resource.imported_count; |
1340 returned.lost = is_lost; | 1340 returned.lost = is_lost; |
1341 to_return.push_back(returned); | 1341 to_return.push_back(returned); |
1342 | 1342 |
1343 child_info->parent_to_child_map.erase(local_id); | 1343 child_info->parent_to_child_map.erase(local_id); |
1344 child_info->child_to_parent_map.erase(child_id); | 1344 child_info->child_to_parent_map.erase(child_id); |
1345 resource.imported_count = 0; | 1345 resource.imported_count = 0; |
1346 DeleteResourceInternal(it, style); | 1346 DeleteResourceInternal(it, style); |
1347 } | 1347 } |
1348 if (need_sync_point) { | 1348 if (need_sync_point) { |
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1826 context->getIntegerv(GL_ACTIVE_TEXTURE, &active_unit); | 1826 context->getIntegerv(GL_ACTIVE_TEXTURE, &active_unit); |
1827 return active_unit; | 1827 return active_unit; |
1828 } | 1828 } |
1829 | 1829 |
1830 blink::WebGraphicsContext3D* ResourceProvider::Context3d() const { | 1830 blink::WebGraphicsContext3D* ResourceProvider::Context3d() const { |
1831 ContextProvider* context_provider = output_surface_->context_provider(); | 1831 ContextProvider* context_provider = output_surface_->context_provider(); |
1832 return context_provider ? context_provider->Context3d() : NULL; | 1832 return context_provider ? context_provider->Context3d() : NULL; |
1833 } | 1833 } |
1834 | 1834 |
1835 } // namespace cc | 1835 } // namespace cc |
OLD | NEW |