| 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 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 read_lock_fence(NULL), | 250 read_lock_fence(NULL), |
| 251 size(), | 251 size(), |
| 252 origin(Internal), | 252 origin(Internal), |
| 253 target(0), | 253 target(0), |
| 254 original_filter(0), | 254 original_filter(0), |
| 255 filter(0), | 255 filter(0), |
| 256 image_id(0), | 256 image_id(0), |
| 257 bound_image_id(0), | 257 bound_image_id(0), |
| 258 texture_pool(0), | 258 texture_pool(0), |
| 259 wrap_mode(0), | 259 wrap_mode(0), |
| 260 hint(TextureUsageAny), | 260 hint(TextureHintImmutable), |
| 261 type(InvalidType), | 261 type(InvalidType), |
| 262 format(RGBA_8888), | 262 format(RGBA_8888), |
| 263 shared_bitmap(NULL) { | 263 shared_bitmap(NULL) { |
| 264 } | 264 } |
| 265 | 265 |
| 266 ResourceProvider::Resource::~Resource() {} | 266 ResourceProvider::Resource::~Resource() {} |
| 267 | 267 |
| 268 ResourceProvider::Resource::Resource(GLuint texture_id, | 268 ResourceProvider::Resource::Resource(GLuint texture_id, |
| 269 const gfx::Size& size, | 269 const gfx::Size& size, |
| 270 Origin origin, | 270 Origin origin, |
| 271 GLenum target, | 271 GLenum target, |
| 272 GLenum filter, | 272 GLenum filter, |
| 273 GLenum texture_pool, | 273 GLenum texture_pool, |
| 274 GLint wrap_mode, | 274 GLint wrap_mode, |
| 275 TextureUsageHint hint, | 275 TextureHint hint, |
| 276 ResourceFormat format) | 276 ResourceFormat format) |
| 277 : child_id(0), | 277 : child_id(0), |
| 278 gl_id(texture_id), | 278 gl_id(texture_id), |
| 279 gl_pixel_buffer_id(0), | 279 gl_pixel_buffer_id(0), |
| 280 gl_upload_query_id(0), | 280 gl_upload_query_id(0), |
| 281 gl_read_lock_query_id(0), | 281 gl_read_lock_query_id(0), |
| 282 pixels(NULL), | 282 pixels(NULL), |
| 283 lock_for_read_count(0), | 283 lock_for_read_count(0), |
| 284 imported_count(0), | 284 imported_count(0), |
| 285 exported_count(0), | 285 exported_count(0), |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 read_lock_fence(NULL), | 339 read_lock_fence(NULL), |
| 340 size(size), | 340 size(size), |
| 341 origin(origin), | 341 origin(origin), |
| 342 target(0), | 342 target(0), |
| 343 original_filter(filter), | 343 original_filter(filter), |
| 344 filter(filter), | 344 filter(filter), |
| 345 image_id(0), | 345 image_id(0), |
| 346 bound_image_id(0), | 346 bound_image_id(0), |
| 347 texture_pool(0), | 347 texture_pool(0), |
| 348 wrap_mode(wrap_mode), | 348 wrap_mode(wrap_mode), |
| 349 hint(TextureUsageAny), | 349 hint(TextureHintImmutable), |
| 350 type(Bitmap), | 350 type(Bitmap), |
| 351 format(RGBA_8888), | 351 format(RGBA_8888), |
| 352 shared_bitmap(bitmap) { | 352 shared_bitmap(bitmap) { |
| 353 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); | 353 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); |
| 354 DCHECK(origin == Delegated || pixels); | 354 DCHECK(origin == Delegated || pixels); |
| 355 if (bitmap) | 355 if (bitmap) |
| 356 shared_bitmap_id = bitmap->id(); | 356 shared_bitmap_id = bitmap->id(); |
| 357 } | 357 } |
| 358 | 358 |
| 359 ResourceProvider::Resource::Resource(const SharedBitmapId& bitmap_id, | 359 ResourceProvider::Resource::Resource(const SharedBitmapId& bitmap_id, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 383 read_lock_fence(NULL), | 383 read_lock_fence(NULL), |
| 384 size(size), | 384 size(size), |
| 385 origin(origin), | 385 origin(origin), |
| 386 target(0), | 386 target(0), |
| 387 original_filter(filter), | 387 original_filter(filter), |
| 388 filter(filter), | 388 filter(filter), |
| 389 image_id(0), | 389 image_id(0), |
| 390 bound_image_id(0), | 390 bound_image_id(0), |
| 391 texture_pool(0), | 391 texture_pool(0), |
| 392 wrap_mode(wrap_mode), | 392 wrap_mode(wrap_mode), |
| 393 hint(TextureUsageAny), | 393 hint(TextureHintImmutable), |
| 394 type(Bitmap), | 394 type(Bitmap), |
| 395 format(RGBA_8888), | 395 format(RGBA_8888), |
| 396 shared_bitmap_id(bitmap_id), | 396 shared_bitmap_id(bitmap_id), |
| 397 shared_bitmap(NULL) { | 397 shared_bitmap(NULL) { |
| 398 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); | 398 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); |
| 399 } | 399 } |
| 400 | 400 |
| 401 ResourceProvider::RasterBuffer::RasterBuffer( | 401 ResourceProvider::RasterBuffer::RasterBuffer( |
| 402 const Resource* resource, | 402 const Resource* resource, |
| 403 ResourceProvider* resource_provider) | 403 ResourceProvider* resource_provider) |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 } | 631 } |
| 632 | 632 |
| 633 bool ResourceProvider::AllowOverlay(ResourceId id) { | 633 bool ResourceProvider::AllowOverlay(ResourceId id) { |
| 634 Resource* resource = GetResource(id); | 634 Resource* resource = GetResource(id); |
| 635 return resource->allow_overlay; | 635 return resource->allow_overlay; |
| 636 } | 636 } |
| 637 | 637 |
| 638 ResourceProvider::ResourceId ResourceProvider::CreateResource( | 638 ResourceProvider::ResourceId ResourceProvider::CreateResource( |
| 639 const gfx::Size& size, | 639 const gfx::Size& size, |
| 640 GLint wrap_mode, | 640 GLint wrap_mode, |
| 641 TextureUsageHint hint, | 641 TextureHint hint, |
| 642 ResourceFormat format) { | 642 ResourceFormat format) { |
| 643 DCHECK(!size.IsEmpty()); | 643 DCHECK(!size.IsEmpty()); |
| 644 switch (default_resource_type_) { | 644 switch (default_resource_type_) { |
| 645 case GLTexture: | 645 case GLTexture: |
| 646 return CreateGLTexture(size, | 646 return CreateGLTexture(size, |
| 647 GL_TEXTURE_2D, | 647 GL_TEXTURE_2D, |
| 648 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, | 648 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, |
| 649 wrap_mode, | 649 wrap_mode, |
| 650 hint, | 650 hint, |
| 651 format); | 651 format); |
| 652 case Bitmap: | 652 case Bitmap: |
| 653 DCHECK_EQ(RGBA_8888, format); | 653 DCHECK_EQ(RGBA_8888, format); |
| 654 return CreateBitmap(size, wrap_mode); | 654 return CreateBitmap(size, wrap_mode); |
| 655 case InvalidType: | 655 case InvalidType: |
| 656 break; | 656 break; |
| 657 } | 657 } |
| 658 | 658 |
| 659 LOG(FATAL) << "Invalid default resource type."; | 659 LOG(FATAL) << "Invalid default resource type."; |
| 660 return 0; | 660 return 0; |
| 661 } | 661 } |
| 662 | 662 |
| 663 ResourceProvider::ResourceId ResourceProvider::CreateManagedResource( | 663 ResourceProvider::ResourceId ResourceProvider::CreateManagedResource( |
| 664 const gfx::Size& size, | 664 const gfx::Size& size, |
| 665 GLenum target, | 665 GLenum target, |
| 666 GLint wrap_mode, | 666 GLint wrap_mode, |
| 667 TextureUsageHint hint, | 667 TextureHint hint, |
| 668 ResourceFormat format) { | 668 ResourceFormat format) { |
| 669 DCHECK(!size.IsEmpty()); | 669 DCHECK(!size.IsEmpty()); |
| 670 switch (default_resource_type_) { | 670 switch (default_resource_type_) { |
| 671 case GLTexture: | 671 case GLTexture: |
| 672 return CreateGLTexture(size, | 672 return CreateGLTexture(size, |
| 673 target, | 673 target, |
| 674 GL_TEXTURE_POOL_MANAGED_CHROMIUM, | 674 GL_TEXTURE_POOL_MANAGED_CHROMIUM, |
| 675 wrap_mode, | 675 wrap_mode, |
| 676 hint, | 676 hint, |
| 677 format); | 677 format); |
| 678 case Bitmap: | 678 case Bitmap: |
| 679 DCHECK_EQ(RGBA_8888, format); | 679 DCHECK_EQ(RGBA_8888, format); |
| 680 return CreateBitmap(size, wrap_mode); | 680 return CreateBitmap(size, wrap_mode); |
| 681 case InvalidType: | 681 case InvalidType: |
| 682 break; | 682 break; |
| 683 } | 683 } |
| 684 | 684 |
| 685 LOG(FATAL) << "Invalid default resource type."; | 685 LOG(FATAL) << "Invalid default resource type."; |
| 686 return 0; | 686 return 0; |
| 687 } | 687 } |
| 688 | 688 |
| 689 ResourceProvider::ResourceId ResourceProvider::CreateGLTexture( | 689 ResourceProvider::ResourceId ResourceProvider::CreateGLTexture( |
| 690 const gfx::Size& size, | 690 const gfx::Size& size, |
| 691 GLenum target, | 691 GLenum target, |
| 692 GLenum texture_pool, | 692 GLenum texture_pool, |
| 693 GLint wrap_mode, | 693 GLint wrap_mode, |
| 694 TextureUsageHint hint, | 694 TextureHint hint, |
| 695 ResourceFormat format) { | 695 ResourceFormat format) { |
| 696 DCHECK_LE(size.width(), max_texture_size_); | 696 DCHECK_LE(size.width(), max_texture_size_); |
| 697 DCHECK_LE(size.height(), max_texture_size_); | 697 DCHECK_LE(size.height(), max_texture_size_); |
| 698 DCHECK(thread_checker_.CalledOnValidThread()); | 698 DCHECK(thread_checker_.CalledOnValidThread()); |
| 699 | 699 |
| 700 ResourceId id = next_id_++; | 700 ResourceId id = next_id_++; |
| 701 Resource resource(0, | 701 Resource resource(0, |
| 702 size, | 702 size, |
| 703 Resource::Internal, | 703 Resource::Internal, |
| 704 target, | 704 target, |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 743 DCHECK(thread_checker_.CalledOnValidThread()); | 743 DCHECK(thread_checker_.CalledOnValidThread()); |
| 744 | 744 |
| 745 ResourceId id = next_id_++; | 745 ResourceId id = next_id_++; |
| 746 Resource resource(0, | 746 Resource resource(0, |
| 747 gfx::Size(), | 747 gfx::Size(), |
| 748 Resource::Internal, | 748 Resource::Internal, |
| 749 GL_TEXTURE_RECTANGLE_ARB, | 749 GL_TEXTURE_RECTANGLE_ARB, |
| 750 GL_LINEAR, | 750 GL_LINEAR, |
| 751 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, | 751 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, |
| 752 GL_CLAMP_TO_EDGE, | 752 GL_CLAMP_TO_EDGE, |
| 753 TextureUsageAny, | 753 TextureHintImmutable, |
| 754 RGBA_8888); | 754 RGBA_8888); |
| 755 LazyCreate(&resource); | 755 LazyCreate(&resource); |
| 756 GLES2Interface* gl = ContextGL(); | 756 GLES2Interface* gl = ContextGL(); |
| 757 DCHECK(gl); | 757 DCHECK(gl); |
| 758 gl->BindTexture(GL_TEXTURE_RECTANGLE_ARB, resource.gl_id); | 758 gl->BindTexture(GL_TEXTURE_RECTANGLE_ARB, resource.gl_id); |
| 759 gl->TexImageIOSurface2DCHROMIUM( | 759 gl->TexImageIOSurface2DCHROMIUM( |
| 760 GL_TEXTURE_RECTANGLE_ARB, size.width(), size.height(), io_surface_id, 0); | 760 GL_TEXTURE_RECTANGLE_ARB, size.width(), size.height(), io_surface_id, 0); |
| 761 resource.allocated = true; | 761 resource.allocated = true; |
| 762 resources_[id] = resource; | 762 resources_[id] = resource; |
| 763 return id; | 763 return id; |
| 764 } | 764 } |
| 765 | 765 |
| 766 ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox( | 766 ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
| 767 const TextureMailbox& mailbox, | 767 const TextureMailbox& mailbox, |
| 768 scoped_ptr<SingleReleaseCallback> release_callback) { | 768 scoped_ptr<SingleReleaseCallback> release_callback) { |
| 769 DCHECK(thread_checker_.CalledOnValidThread()); | 769 DCHECK(thread_checker_.CalledOnValidThread()); |
| 770 // Just store the information. Mailbox will be consumed in LockForRead(). | 770 // Just store the information. Mailbox will be consumed in LockForRead(). |
| 771 ResourceId id = next_id_++; | 771 ResourceId id = next_id_++; |
| 772 DCHECK(mailbox.IsValid()); | 772 DCHECK(mailbox.IsValid()); |
| 773 Resource& resource = resources_[id]; | 773 Resource& resource = resources_[id]; |
| 774 if (mailbox.IsTexture()) { | 774 if (mailbox.IsTexture()) { |
| 775 resource = Resource(0, | 775 resource = Resource(0, |
| 776 gfx::Size(), | 776 gfx::Size(), |
| 777 Resource::External, | 777 Resource::External, |
| 778 mailbox.target(), | 778 mailbox.target(), |
| 779 GL_LINEAR, | 779 GL_LINEAR, |
| 780 0, | 780 0, |
| 781 GL_CLAMP_TO_EDGE, | 781 GL_CLAMP_TO_EDGE, |
| 782 TextureUsageAny, | 782 TextureHintImmutable, |
| 783 RGBA_8888); | 783 RGBA_8888); |
| 784 } else { | 784 } else { |
| 785 DCHECK(mailbox.IsSharedMemory()); | 785 DCHECK(mailbox.IsSharedMemory()); |
| 786 base::SharedMemory* shared_memory = mailbox.shared_memory(); | 786 base::SharedMemory* shared_memory = mailbox.shared_memory(); |
| 787 DCHECK(shared_memory->memory()); | 787 DCHECK(shared_memory->memory()); |
| 788 uint8_t* pixels = reinterpret_cast<uint8_t*>(shared_memory->memory()); | 788 uint8_t* pixels = reinterpret_cast<uint8_t*>(shared_memory->memory()); |
| 789 DCHECK(pixels); | 789 DCHECK(pixels); |
| 790 scoped_ptr<SharedBitmap> shared_bitmap; | 790 scoped_ptr<SharedBitmap> shared_bitmap; |
| 791 if (shared_bitmap_manager_) { | 791 if (shared_bitmap_manager_) { |
| 792 shared_bitmap = | 792 shared_bitmap = |
| (...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1420 GL_LINEAR, | 1420 GL_LINEAR, |
| 1421 it->is_repeated ? GL_REPEAT : GL_CLAMP_TO_EDGE); | 1421 it->is_repeated ? GL_REPEAT : GL_CLAMP_TO_EDGE); |
| 1422 } else { | 1422 } else { |
| 1423 resource = Resource(0, | 1423 resource = Resource(0, |
| 1424 it->size, | 1424 it->size, |
| 1425 Resource::Delegated, | 1425 Resource::Delegated, |
| 1426 it->mailbox_holder.texture_target, | 1426 it->mailbox_holder.texture_target, |
| 1427 it->filter, | 1427 it->filter, |
| 1428 0, | 1428 0, |
| 1429 it->is_repeated ? GL_REPEAT : GL_CLAMP_TO_EDGE, | 1429 it->is_repeated ? GL_REPEAT : GL_CLAMP_TO_EDGE, |
| 1430 TextureUsageAny, | 1430 TextureHintImmutable, |
| 1431 it->format); | 1431 it->format); |
| 1432 resource.mailbox = TextureMailbox(it->mailbox_holder.mailbox, | 1432 resource.mailbox = TextureMailbox(it->mailbox_holder.mailbox, |
| 1433 it->mailbox_holder.texture_target, | 1433 it->mailbox_holder.texture_target, |
| 1434 it->mailbox_holder.sync_point); | 1434 it->mailbox_holder.sync_point); |
| 1435 } | 1435 } |
| 1436 resource.child_id = child; | 1436 resource.child_id = child; |
| 1437 // Don't allocate a texture for a child. | 1437 // Don't allocate a texture for a child. |
| 1438 resource.allocated = true; | 1438 resource.allocated = true; |
| 1439 resource.imported_count = 1; | 1439 resource.imported_count = 1; |
| 1440 resource.allow_overlay = it->allow_overlay; | 1440 resource.allow_overlay = it->allow_overlay; |
| (...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2048 gl->TexParameteri(resource->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); | 2048 gl->TexParameteri(resource->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); |
| 2049 GLC(gl, | 2049 GLC(gl, |
| 2050 gl->TexParameteri( | 2050 gl->TexParameteri( |
| 2051 resource->target, GL_TEXTURE_WRAP_S, resource->wrap_mode)); | 2051 resource->target, GL_TEXTURE_WRAP_S, resource->wrap_mode)); |
| 2052 GLC(gl, | 2052 GLC(gl, |
| 2053 gl->TexParameteri( | 2053 gl->TexParameteri( |
| 2054 resource->target, GL_TEXTURE_WRAP_T, resource->wrap_mode)); | 2054 resource->target, GL_TEXTURE_WRAP_T, resource->wrap_mode)); |
| 2055 GLC(gl, | 2055 GLC(gl, |
| 2056 gl->TexParameteri( | 2056 gl->TexParameteri( |
| 2057 resource->target, GL_TEXTURE_POOL_CHROMIUM, resource->texture_pool)); | 2057 resource->target, GL_TEXTURE_POOL_CHROMIUM, resource->texture_pool)); |
| 2058 if (use_texture_usage_hint_ && resource->hint == TextureUsageFramebuffer) { | 2058 if (use_texture_usage_hint_ && resource->hint == TextureHintFramebuffer) { |
| 2059 GLC(gl, | 2059 GLC(gl, |
| 2060 gl->TexParameteri(resource->target, | 2060 gl->TexParameteri(resource->target, |
| 2061 GL_TEXTURE_USAGE_ANGLE, | 2061 GL_TEXTURE_USAGE_ANGLE, |
| 2062 GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); | 2062 GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); |
| 2063 } | 2063 } |
| 2064 } | 2064 } |
| 2065 | 2065 |
| 2066 void ResourceProvider::AllocateForTesting(ResourceId id) { | 2066 void ResourceProvider::AllocateForTesting(ResourceId id) { |
| 2067 LazyAllocate(GetResource(id)); | 2067 LazyAllocate(GetResource(id)); |
| 2068 } | 2068 } |
| 2069 | 2069 |
| 2070 void ResourceProvider::LazyAllocate(Resource* resource) { | 2070 void ResourceProvider::LazyAllocate(Resource* resource) { |
| 2071 DCHECK(resource); | 2071 DCHECK(resource); |
| 2072 LazyCreate(resource); | 2072 LazyCreate(resource); |
| 2073 | 2073 |
| 2074 DCHECK(resource->gl_id || resource->allocated); | 2074 DCHECK(resource->gl_id || resource->allocated); |
| 2075 if (resource->allocated || !resource->gl_id) | 2075 if (resource->allocated || !resource->gl_id) |
| 2076 return; | 2076 return; |
| 2077 resource->allocated = true; | 2077 resource->allocated = true; |
| 2078 GLES2Interface* gl = ContextGL(); | 2078 GLES2Interface* gl = ContextGL(); |
| 2079 gfx::Size& size = resource->size; | 2079 gfx::Size& size = resource->size; |
| 2080 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); | 2080 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); |
| 2081 ResourceFormat format = resource->format; | 2081 ResourceFormat format = resource->format; |
| 2082 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); | 2082 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); |
| 2083 if (use_texture_storage_ext_ && IsFormatSupportedForStorage(format) && | 2083 if (use_texture_storage_ext_ && IsFormatSupportedForStorage(format) && |
| 2084 resource->hint != TextureUsageFramebuffer) { | 2084 resource->hint == TextureHintImmutable) { |
| 2085 GLenum storage_format = TextureToStorageFormat(format); | 2085 GLenum storage_format = TextureToStorageFormat(format); |
| 2086 GLC(gl, | 2086 GLC(gl, |
| 2087 gl->TexStorage2DEXT( | 2087 gl->TexStorage2DEXT( |
| 2088 GL_TEXTURE_2D, 1, storage_format, size.width(), size.height())); | 2088 GL_TEXTURE_2D, 1, storage_format, size.width(), size.height())); |
| 2089 } else { | 2089 } else { |
| 2090 // ETC1 does not support preallocation. | 2090 // ETC1 does not support preallocation. |
| 2091 if (format != ETC1) { | 2091 if (format != ETC1) { |
| 2092 GLC(gl, | 2092 GLC(gl, |
| 2093 gl->TexImage2D(GL_TEXTURE_2D, | 2093 gl->TexImage2D(GL_TEXTURE_2D, |
| 2094 0, | 2094 0, |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2271 ContextProvider* context_provider = output_surface_->context_provider(); | 2271 ContextProvider* context_provider = output_surface_->context_provider(); |
| 2272 return context_provider ? context_provider->ContextGL() : NULL; | 2272 return context_provider ? context_provider->ContextGL() : NULL; |
| 2273 } | 2273 } |
| 2274 | 2274 |
| 2275 class GrContext* ResourceProvider::GrContext() const { | 2275 class GrContext* ResourceProvider::GrContext() const { |
| 2276 ContextProvider* context_provider = output_surface_->context_provider(); | 2276 ContextProvider* context_provider = output_surface_->context_provider(); |
| 2277 return context_provider ? context_provider->GrContext() : NULL; | 2277 return context_provider ? context_provider->GrContext() : NULL; |
| 2278 } | 2278 } |
| 2279 | 2279 |
| 2280 } // namespace cc | 2280 } // namespace cc |
| OLD | NEW |