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 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 bool ResourceProvider::IsLost(ResourceId id) { | 454 bool ResourceProvider::IsLost(ResourceId id) { |
455 Resource* resource = GetResource(id); | 455 Resource* resource = GetResource(id); |
456 return resource->lost; | 456 return resource->lost; |
457 } | 457 } |
458 | 458 |
459 bool ResourceProvider::AllowOverlay(ResourceId id) { | 459 bool ResourceProvider::AllowOverlay(ResourceId id) { |
460 Resource* resource = GetResource(id); | 460 Resource* resource = GetResource(id); |
461 return resource->allow_overlay; | 461 return resource->allow_overlay; |
462 } | 462 } |
463 | 463 |
464 ResourceProvider::ResourceId ResourceProvider::CreateResource( | 464 ResourceId ResourceProvider::CreateResource(const gfx::Size& size, |
465 const gfx::Size& size, | 465 GLint wrap_mode, |
466 GLint wrap_mode, | 466 TextureHint hint, |
467 TextureHint hint, | 467 ResourceFormat format) { |
468 ResourceFormat format) { | |
469 DCHECK(!size.IsEmpty()); | 468 DCHECK(!size.IsEmpty()); |
470 switch (default_resource_type_) { | 469 switch (default_resource_type_) { |
471 case RESOURCE_TYPE_GL_TEXTURE: | 470 case RESOURCE_TYPE_GL_TEXTURE: |
472 return CreateGLTexture(size, | 471 return CreateGLTexture(size, |
473 GL_TEXTURE_2D, | 472 GL_TEXTURE_2D, |
474 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, | 473 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, |
475 wrap_mode, | 474 wrap_mode, |
476 hint, | 475 hint, |
477 format); | 476 format); |
478 case RESOURCE_TYPE_BITMAP: | 477 case RESOURCE_TYPE_BITMAP: |
479 DCHECK_EQ(RGBA_8888, format); | 478 DCHECK_EQ(RGBA_8888, format); |
480 return CreateBitmap(size, wrap_mode); | 479 return CreateBitmap(size, wrap_mode); |
481 } | 480 } |
482 | 481 |
483 LOG(FATAL) << "Invalid default resource type."; | 482 LOG(FATAL) << "Invalid default resource type."; |
484 return 0; | 483 return 0; |
485 } | 484 } |
486 | 485 |
487 ResourceProvider::ResourceId ResourceProvider::CreateManagedResource( | 486 ResourceId ResourceProvider::CreateManagedResource(const gfx::Size& size, |
488 const gfx::Size& size, | 487 GLenum target, |
489 GLenum target, | 488 GLint wrap_mode, |
490 GLint wrap_mode, | 489 TextureHint hint, |
491 TextureHint hint, | 490 ResourceFormat format) { |
492 ResourceFormat format) { | |
493 DCHECK(!size.IsEmpty()); | 491 DCHECK(!size.IsEmpty()); |
494 switch (default_resource_type_) { | 492 switch (default_resource_type_) { |
495 case RESOURCE_TYPE_GL_TEXTURE: | 493 case RESOURCE_TYPE_GL_TEXTURE: |
496 return CreateGLTexture(size, | 494 return CreateGLTexture(size, |
497 target, | 495 target, |
498 GL_TEXTURE_POOL_MANAGED_CHROMIUM, | 496 GL_TEXTURE_POOL_MANAGED_CHROMIUM, |
499 wrap_mode, | 497 wrap_mode, |
500 hint, | 498 hint, |
501 format); | 499 format); |
502 case RESOURCE_TYPE_BITMAP: | 500 case RESOURCE_TYPE_BITMAP: |
503 DCHECK_EQ(RGBA_8888, format); | 501 DCHECK_EQ(RGBA_8888, format); |
504 return CreateBitmap(size, wrap_mode); | 502 return CreateBitmap(size, wrap_mode); |
505 } | 503 } |
506 | 504 |
507 LOG(FATAL) << "Invalid default resource type."; | 505 LOG(FATAL) << "Invalid default resource type."; |
508 return 0; | 506 return 0; |
509 } | 507 } |
510 | 508 |
511 ResourceProvider::ResourceId ResourceProvider::CreateGLTexture( | 509 ResourceId ResourceProvider::CreateGLTexture(const gfx::Size& size, |
512 const gfx::Size& size, | 510 GLenum target, |
513 GLenum target, | 511 GLenum texture_pool, |
514 GLenum texture_pool, | 512 GLint wrap_mode, |
515 GLint wrap_mode, | 513 TextureHint hint, |
516 TextureHint hint, | 514 ResourceFormat format) { |
517 ResourceFormat format) { | |
518 DCHECK_LE(size.width(), max_texture_size_); | 515 DCHECK_LE(size.width(), max_texture_size_); |
519 DCHECK_LE(size.height(), max_texture_size_); | 516 DCHECK_LE(size.height(), max_texture_size_); |
520 DCHECK(thread_checker_.CalledOnValidThread()); | 517 DCHECK(thread_checker_.CalledOnValidThread()); |
521 | 518 |
522 ResourceId id = next_id_++; | 519 ResourceId id = next_id_++; |
523 Resource* resource = InsertResource( | 520 Resource* resource = InsertResource( |
524 id, Resource(0, size, Resource::INTERNAL, target, GL_LINEAR, texture_pool, | 521 id, Resource(0, size, Resource::INTERNAL, target, GL_LINEAR, texture_pool, |
525 wrap_mode, hint, format)); | 522 wrap_mode, hint, format)); |
526 resource->allocated = false; | 523 resource->allocated = false; |
527 return id; | 524 return id; |
528 } | 525 } |
529 | 526 |
530 ResourceProvider::ResourceId ResourceProvider::CreateBitmap( | 527 ResourceId ResourceProvider::CreateBitmap(const gfx::Size& size, |
531 const gfx::Size& size, GLint wrap_mode) { | 528 GLint wrap_mode) { |
532 DCHECK(thread_checker_.CalledOnValidThread()); | 529 DCHECK(thread_checker_.CalledOnValidThread()); |
533 | 530 |
534 scoped_ptr<SharedBitmap> bitmap = | 531 scoped_ptr<SharedBitmap> bitmap = |
535 shared_bitmap_manager_->AllocateSharedBitmap(size); | 532 shared_bitmap_manager_->AllocateSharedBitmap(size); |
536 uint8_t* pixels = bitmap->pixels(); | 533 uint8_t* pixels = bitmap->pixels(); |
537 DCHECK(pixels); | 534 DCHECK(pixels); |
538 | 535 |
539 ResourceId id = next_id_++; | 536 ResourceId id = next_id_++; |
540 Resource* resource = | 537 Resource* resource = |
541 InsertResource(id, Resource(pixels, bitmap.release(), size, | 538 InsertResource(id, Resource(pixels, bitmap.release(), size, |
542 Resource::INTERNAL, GL_LINEAR, wrap_mode)); | 539 Resource::INTERNAL, GL_LINEAR, wrap_mode)); |
543 resource->allocated = true; | 540 resource->allocated = true; |
544 return id; | 541 return id; |
545 } | 542 } |
546 | 543 |
547 ResourceProvider::ResourceId ResourceProvider::CreateResourceFromIOSurface( | 544 ResourceId ResourceProvider::CreateResourceFromIOSurface( |
548 const gfx::Size& size, | 545 const gfx::Size& size, |
549 unsigned io_surface_id) { | 546 unsigned io_surface_id) { |
550 DCHECK(thread_checker_.CalledOnValidThread()); | 547 DCHECK(thread_checker_.CalledOnValidThread()); |
551 | 548 |
552 ResourceId id = next_id_++; | 549 ResourceId id = next_id_++; |
553 Resource* resource = InsertResource( | 550 Resource* resource = InsertResource( |
554 id, Resource(0, gfx::Size(), Resource::INTERNAL, GL_TEXTURE_RECTANGLE_ARB, | 551 id, Resource(0, gfx::Size(), Resource::INTERNAL, GL_TEXTURE_RECTANGLE_ARB, |
555 GL_LINEAR, GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, | 552 GL_LINEAR, GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, |
556 GL_CLAMP_TO_EDGE, TEXTURE_HINT_IMMUTABLE, RGBA_8888)); | 553 GL_CLAMP_TO_EDGE, TEXTURE_HINT_IMMUTABLE, RGBA_8888)); |
557 LazyCreate(resource); | 554 LazyCreate(resource); |
558 GLES2Interface* gl = ContextGL(); | 555 GLES2Interface* gl = ContextGL(); |
559 DCHECK(gl); | 556 DCHECK(gl); |
560 gl->BindTexture(GL_TEXTURE_RECTANGLE_ARB, resource->gl_id); | 557 gl->BindTexture(GL_TEXTURE_RECTANGLE_ARB, resource->gl_id); |
561 gl->TexImageIOSurface2DCHROMIUM( | 558 gl->TexImageIOSurface2DCHROMIUM( |
562 GL_TEXTURE_RECTANGLE_ARB, size.width(), size.height(), io_surface_id, 0); | 559 GL_TEXTURE_RECTANGLE_ARB, size.width(), size.height(), io_surface_id, 0); |
563 resource->allocated = true; | 560 resource->allocated = true; |
564 return id; | 561 return id; |
565 } | 562 } |
566 | 563 |
567 ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox( | 564 ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
568 const TextureMailbox& mailbox, | 565 const TextureMailbox& mailbox, |
569 scoped_ptr<SingleReleaseCallbackImpl> release_callback_impl) { | 566 scoped_ptr<SingleReleaseCallbackImpl> release_callback_impl) { |
570 DCHECK(thread_checker_.CalledOnValidThread()); | 567 DCHECK(thread_checker_.CalledOnValidThread()); |
571 // Just store the information. Mailbox will be consumed in LockForRead(). | 568 // Just store the information. Mailbox will be consumed in LockForRead(). |
572 ResourceId id = next_id_++; | 569 ResourceId id = next_id_++; |
573 DCHECK(mailbox.IsValid()); | 570 DCHECK(mailbox.IsValid()); |
574 Resource* resource = nullptr; | 571 Resource* resource = nullptr; |
575 if (mailbox.IsTexture()) { | 572 if (mailbox.IsTexture()) { |
576 resource = InsertResource( | 573 resource = InsertResource( |
577 id, Resource(0, gfx::Size(), Resource::EXTERNAL, mailbox.target(), | 574 id, Resource(0, gfx::Size(), Resource::EXTERNAL, mailbox.target(), |
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
956 | 953 |
957 void ResourceProvider::UnlockForWrite(ResourceProvider::Resource* resource) { | 954 void ResourceProvider::UnlockForWrite(ResourceProvider::Resource* resource) { |
958 DCHECK(resource->locked_for_write); | 955 DCHECK(resource->locked_for_write); |
959 DCHECK_EQ(resource->exported_count, 0); | 956 DCHECK_EQ(resource->exported_count, 0); |
960 DCHECK(resource->origin == Resource::INTERNAL); | 957 DCHECK(resource->origin == Resource::INTERNAL); |
961 resource->locked_for_write = false; | 958 resource->locked_for_write = false; |
962 } | 959 } |
963 | 960 |
964 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( | 961 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( |
965 ResourceProvider* resource_provider, | 962 ResourceProvider* resource_provider, |
966 ResourceProvider::ResourceId resource_id) | 963 ResourceId resource_id) |
967 : resource_provider_(resource_provider), | 964 : resource_provider_(resource_provider), |
968 resource_id_(resource_id), | 965 resource_id_(resource_id), |
969 resource_(resource_provider->LockForRead(resource_id)) { | 966 resource_(resource_provider->LockForRead(resource_id)) { |
970 DCHECK(resource_); | 967 DCHECK(resource_); |
971 } | 968 } |
972 | 969 |
973 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { | 970 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { |
974 resource_provider_->UnlockForRead(resource_id_); | 971 resource_provider_->UnlockForRead(resource_id_); |
975 } | 972 } |
976 | 973 |
977 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( | 974 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( |
978 ResourceProvider* resource_provider, | 975 ResourceProvider* resource_provider, |
979 ResourceProvider::ResourceId resource_id, | 976 ResourceId resource_id, |
980 GLenum filter) | 977 GLenum filter) |
981 : ScopedReadLockGL(resource_provider, resource_id), | 978 : ScopedReadLockGL(resource_provider, resource_id), |
982 unit_(GL_TEXTURE0), | 979 unit_(GL_TEXTURE0), |
983 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) { | 980 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) { |
984 } | 981 } |
985 | 982 |
986 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( | 983 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( |
987 ResourceProvider* resource_provider, | 984 ResourceProvider* resource_provider, |
988 ResourceProvider::ResourceId resource_id, | 985 ResourceId resource_id, |
989 GLenum unit, | 986 GLenum unit, |
990 GLenum filter) | 987 GLenum filter) |
991 : ScopedReadLockGL(resource_provider, resource_id), | 988 : ScopedReadLockGL(resource_provider, resource_id), |
992 unit_(unit), | 989 unit_(unit), |
993 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) { | 990 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) { |
994 } | 991 } |
995 | 992 |
996 ResourceProvider::ScopedSamplerGL::~ScopedSamplerGL() { | 993 ResourceProvider::ScopedSamplerGL::~ScopedSamplerGL() { |
997 } | 994 } |
998 | 995 |
999 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL( | 996 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL( |
1000 ResourceProvider* resource_provider, | 997 ResourceProvider* resource_provider, |
1001 ResourceProvider::ResourceId resource_id) | 998 ResourceId resource_id) |
1002 : resource_provider_(resource_provider), | 999 : resource_provider_(resource_provider), |
1003 resource_(resource_provider->LockForWrite(resource_id)) { | 1000 resource_(resource_provider->LockForWrite(resource_id)) { |
1004 resource_provider_->LazyAllocate(resource_); | 1001 resource_provider_->LazyAllocate(resource_); |
1005 texture_id_ = resource_->gl_id; | 1002 texture_id_ = resource_->gl_id; |
1006 DCHECK(texture_id_); | 1003 DCHECK(texture_id_); |
1007 } | 1004 } |
1008 | 1005 |
1009 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { | 1006 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { |
1010 resource_provider_->UnlockForWrite(resource_); | 1007 resource_provider_->UnlockForWrite(resource_); |
1011 } | 1008 } |
1012 | 1009 |
1013 void ResourceProvider::PopulateSkBitmapWithResource( | 1010 void ResourceProvider::PopulateSkBitmapWithResource( |
1014 SkBitmap* sk_bitmap, const Resource* resource) { | 1011 SkBitmap* sk_bitmap, const Resource* resource) { |
1015 DCHECK_EQ(RGBA_8888, resource->format); | 1012 DCHECK_EQ(RGBA_8888, resource->format); |
1016 SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(), | 1013 SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(), |
1017 resource->size.height()); | 1014 resource->size.height()); |
1018 sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes()); | 1015 sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes()); |
1019 } | 1016 } |
1020 | 1017 |
1021 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( | 1018 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( |
1022 ResourceProvider* resource_provider, | 1019 ResourceProvider* resource_provider, |
1023 ResourceProvider::ResourceId resource_id) | 1020 ResourceId resource_id) |
1024 : resource_provider_(resource_provider), | 1021 : resource_provider_(resource_provider), resource_id_(resource_id) { |
1025 resource_id_(resource_id) { | |
1026 const Resource* resource = resource_provider->LockForRead(resource_id); | 1022 const Resource* resource = resource_provider->LockForRead(resource_id); |
1027 wrap_mode_ = resource->wrap_mode; | 1023 wrap_mode_ = resource->wrap_mode; |
1028 ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource); | 1024 ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource); |
1029 } | 1025 } |
1030 | 1026 |
1031 ResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() { | 1027 ResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() { |
1032 resource_provider_->UnlockForRead(resource_id_); | 1028 resource_provider_->UnlockForRead(resource_id_); |
1033 } | 1029 } |
1034 | 1030 |
1035 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( | 1031 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( |
1036 ResourceProvider* resource_provider, | 1032 ResourceProvider* resource_provider, |
1037 ResourceProvider::ResourceId resource_id) | 1033 ResourceId resource_id) |
1038 : resource_provider_(resource_provider), | 1034 : resource_provider_(resource_provider), |
1039 resource_(resource_provider->LockForWrite(resource_id)) { | 1035 resource_(resource_provider->LockForWrite(resource_id)) { |
1040 ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource_); | 1036 ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource_); |
1041 DCHECK(valid()); | 1037 DCHECK(valid()); |
1042 } | 1038 } |
1043 | 1039 |
1044 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { | 1040 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { |
1045 DCHECK(thread_checker_.CalledOnValidThread()); | 1041 DCHECK(thread_checker_.CalledOnValidThread()); |
1046 resource_provider_->UnlockForWrite(resource_); | 1042 resource_provider_->UnlockForWrite(resource_); |
1047 } | 1043 } |
1048 | 1044 |
1049 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: | 1045 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: |
1050 ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider, | 1046 ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider, |
1051 ResourceProvider::ResourceId resource_id) | 1047 ResourceId resource_id) |
1052 : resource_provider_(resource_provider), | 1048 : resource_provider_(resource_provider), |
1053 resource_(resource_provider->LockForWrite(resource_id)), | 1049 resource_(resource_provider->LockForWrite(resource_id)), |
1054 gpu_memory_buffer_manager_(resource_provider->gpu_memory_buffer_manager_), | 1050 gpu_memory_buffer_manager_(resource_provider->gpu_memory_buffer_manager_), |
1055 gpu_memory_buffer_(nullptr), | 1051 gpu_memory_buffer_(nullptr), |
1056 size_(resource_->size), | 1052 size_(resource_->size), |
1057 format_(resource_->format) { | 1053 format_(resource_->format) { |
1058 DCHECK_EQ(RESOURCE_TYPE_GL_TEXTURE, resource_->type); | 1054 DCHECK_EQ(RESOURCE_TYPE_GL_TEXTURE, resource_->type); |
1059 std::swap(gpu_memory_buffer_, resource_->gpu_memory_buffer); | 1055 std::swap(gpu_memory_buffer_, resource_->gpu_memory_buffer); |
1060 } | 1056 } |
1061 | 1057 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1099 gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( | 1095 gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( |
1100 size_, ToGpuMemoryBufferFormat(format_), gfx::GpuMemoryBuffer::MAP); | 1096 size_, ToGpuMemoryBufferFormat(format_), gfx::GpuMemoryBuffer::MAP); |
1101 gpu_memory_buffer_ = gpu_memory_buffer.release(); | 1097 gpu_memory_buffer_ = gpu_memory_buffer.release(); |
1102 } | 1098 } |
1103 | 1099 |
1104 return gpu_memory_buffer_; | 1100 return gpu_memory_buffer_; |
1105 } | 1101 } |
1106 | 1102 |
1107 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( | 1103 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( |
1108 ResourceProvider* resource_provider, | 1104 ResourceProvider* resource_provider, |
1109 ResourceProvider::ResourceId resource_id) | 1105 ResourceId resource_id) |
1110 : resource_provider_(resource_provider), | 1106 : resource_provider_(resource_provider), |
1111 resource_(resource_provider->LockForWrite(resource_id)) { | 1107 resource_(resource_provider->LockForWrite(resource_id)) { |
1112 DCHECK(thread_checker_.CalledOnValidThread()); | 1108 DCHECK(thread_checker_.CalledOnValidThread()); |
1113 resource_provider_->LazyAllocate(resource_); | 1109 resource_provider_->LazyAllocate(resource_); |
1114 } | 1110 } |
1115 | 1111 |
1116 ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() { | 1112 ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() { |
1117 DCHECK(thread_checker_.CalledOnValidThread()); | 1113 DCHECK(thread_checker_.CalledOnValidThread()); |
1118 DCHECK(resource_->locked_for_write); | 1114 DCHECK(resource_->locked_for_write); |
1119 resource_provider_->UnlockForWrite(resource_); | 1115 resource_provider_->UnlockForWrite(resource_); |
(...skipping 936 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2056 } | 2052 } |
2057 | 2053 |
2058 class GrContext* ResourceProvider::GrContext(bool worker_context) const { | 2054 class GrContext* ResourceProvider::GrContext(bool worker_context) const { |
2059 ContextProvider* context_provider = | 2055 ContextProvider* context_provider = |
2060 worker_context ? output_surface_->worker_context_provider() | 2056 worker_context ? output_surface_->worker_context_provider() |
2061 : output_surface_->context_provider(); | 2057 : output_surface_->context_provider(); |
2062 return context_provider ? context_provider->GrContext() : NULL; | 2058 return context_provider ? context_provider->GrContext() : NULL; |
2063 } | 2059 } |
2064 | 2060 |
2065 } // namespace cc | 2061 } // namespace cc |
OLD | NEW |