12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/platform_color.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/priority_calculator.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/proxy.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrioritizedResource::PrioritizedResource(PrioritizedResourceManager* manager, 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size size, 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceFormat format) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : size_(size), 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) format_(format), 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bytes_(0), 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_swizzled_(false), 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) priority_(PriorityCalculator::LowestPriority()), 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_above_priority_cutoff_(false), 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_self_managed_(false), 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backing_(NULL), 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager_(NULL) { 28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bytes_ = Resource::MemorySizeBytes(size, format); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (manager) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager->RegisterTexture(this); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrioritizedResource::~PrioritizedResource() { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (manager_) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager_->UnregisterTexture(this); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrioritizedResource::SetTextureManager( 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrioritizedResourceManager* manager) { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (manager_ == manager) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (manager_) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager_->UnregisterTexture(this); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (manager) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager->RegisterTexture(this); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void PrioritizedResource::SetDimensions(gfx::Size size, ResourceFormat format) { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (format_ != format || size_ != size) { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_above_priority_cutoff_ = false; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) format_ = format; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_ = size; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bytes_ = Resource::MemorySizeBytes(size, format); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(manager_ || !backing_); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (manager_) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager_->ReturnBackingTexture(this); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrioritizedResource::RequestLate() { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!manager_) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return manager_->RequestLate(this); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrioritizedResource::BackingResourceWasEvicted() const { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return backing_ ? backing_->ResourceHasBeenDeleted() : false; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrioritizedResource::AcquireBackingTexture( 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider* resource_provider) { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(is_above_priority_cutoff_); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_above_priority_cutoff_) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager_->AcquireBackingTextureIfNeeded(this, resource_provider); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrioritizedResource::SetPixels(ResourceProvider* resource_provider, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const uint8_t* image, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect image_rect, 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect source_rect, 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2d dest_offset) { 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(is_above_priority_cutoff_); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_above_priority_cutoff_) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AcquireBackingTexture(resource_provider); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(backing_); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource_provider->SetPixels( 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource_id(), image, image_rect, source_rect, dest_offset); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The component order may be bgra if we uploaded bgra pixels to rgba 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // texture. Mark contents as swizzled if image component order is 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // different than texture format. 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_swizzled_ = !PlatformColor::SameComponentOrder(format_); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrioritizedResource::Link(Backing* backing) { 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(backing); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!backing->owner_); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!backing_); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backing_ = backing; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backing_->owner_ = this; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrioritizedResource::Unlink() { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(backing_); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(backing_->owner_ == this); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backing_->owner_ = NULL; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backing_ = NULL; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrioritizedResource::SetToSelfManagedMemoryPlaceholder(size_t bytes) { 113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SetDimensions(gfx::Size(), RGBA_8888); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_is_self_managed(true); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bytes_ = bytes; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrioritizedResource::Backing::Backing(unsigned id, 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider* resource_provider, 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size size, 121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceFormat format) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Resource(id, size, format), 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owner_(NULL), 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) priority_at_last_priority_update_(PriorityCalculator::LowestPriority()), 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) was_above_priority_cutoff_at_last_priority_update_(false), 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) in_drawing_impl_tree_(false), 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) in_parent_compositor_(false), 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifdef NDEBUG 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resource_has_been_deleted_(false) {} 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resource_has_been_deleted_(false), 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resource_provider_(resource_provider) {} 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrioritizedResource::Backing::~Backing() { 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!owner_); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(resource_has_been_deleted_); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrioritizedResource::Backing::DeleteResource( 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider* resource_provider) { 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsImplThread()); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!resource_has_been_deleted_); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef NDEBUG 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(resource_provider == resource_provider_); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource_provider->DeleteResource(id()); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_id(0); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource_has_been_deleted_ = true; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrioritizedResource::Backing::ResourceHasBeenDeleted() const { 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsImplThread()); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return resource_has_been_deleted_; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrioritizedResource::Backing::CanBeRecycledIfNotInExternalUse() const { 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!proxy() || proxy()->IsImplThread()); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !was_above_priority_cutoff_at_last_priority_update_ && 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !in_drawing_impl_tree_; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrioritizedResource::Backing::UpdatePriority() { 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!proxy() || 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (proxy()->IsImplThread() && proxy()->IsMainThreadBlocked())); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (owner_) { 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) priority_at_last_priority_update_ = owner_->request_priority(); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) was_above_priority_cutoff_at_last_priority_update_ = 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owner_->is_above_priority_cutoff(); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) priority_at_last_priority_update_ = PriorityCalculator::LowestPriority(); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) was_above_priority_cutoff_at_last_priority_update_ = false; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void PrioritizedResource::Backing::UpdateState( 1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ResourceProvider* resource_provider) { 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!proxy() || 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (proxy()->IsImplThread() && proxy()->IsMainThreadBlocked())); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) in_drawing_impl_tree_ = !!owner(); 1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) in_parent_compositor_ = resource_provider->InUseByConsumer(id()); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!in_drawing_impl_tree_) { 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(priority_at_last_priority_update_, 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PriorityCalculator::LowestPriority()); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrioritizedResource::ReturnBackingTexture() { 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(manager_ || !backing_); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (manager_) 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager_->ReturnBackingTexture(this); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const Proxy* PrioritizedResource::Backing::proxy() const { 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!owner_ || !owner_->resource_manager()) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return owner_->resource_manager()->ProxyForDebug(); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 202