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