OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "cc/resources/prioritized_resource.h" | |
6 | |
7 #include <algorithm> | |
8 | |
9 #include "cc/resources/platform_color.h" | |
10 #include "cc/resources/prioritized_resource_manager.h" | |
11 #include "cc/resources/priority_calculator.h" | |
12 #include "cc/trees/proxy.h" | |
13 | |
14 namespace cc { | |
15 | |
16 PrioritizedResource::PrioritizedResource(PrioritizedResourceManager* manager, | |
17 const gfx::Size& size, | |
18 ResourceFormat format) | |
19 : size_(size), | |
20 format_(format), | |
21 bytes_(0), | |
22 contents_swizzled_(false), | |
23 priority_(PriorityCalculator::LowestPriority()), | |
24 is_above_priority_cutoff_(false), | |
25 is_self_managed_(false), | |
26 backing_(NULL), | |
27 manager_(NULL) { | |
28 bytes_ = Resource::MemorySizeBytes(size, format); | |
29 if (manager) | |
30 manager->RegisterTexture(this); | |
31 } | |
32 | |
33 PrioritizedResource::~PrioritizedResource() { | |
34 if (manager_) | |
35 manager_->UnregisterTexture(this); | |
36 } | |
37 | |
38 void PrioritizedResource::SetTextureManager( | |
39 PrioritizedResourceManager* manager) { | |
40 if (manager_ == manager) | |
41 return; | |
42 if (manager_) | |
43 manager_->UnregisterTexture(this); | |
44 if (manager) | |
45 manager->RegisterTexture(this); | |
46 } | |
47 | |
48 void PrioritizedResource::SetDimensions(const gfx::Size& size, | |
49 ResourceFormat format) { | |
50 if (format_ != format || size_ != size) { | |
51 is_above_priority_cutoff_ = false; | |
52 format_ = format; | |
53 size_ = size; | |
54 bytes_ = Resource::MemorySizeBytes(size, format); | |
55 DCHECK(manager_ || !backing_); | |
56 if (manager_) | |
57 manager_->ReturnBackingTexture(this); | |
58 } | |
59 } | |
60 | |
61 bool PrioritizedResource::RequestLate() { | |
62 if (!manager_) | |
63 return false; | |
64 return manager_->RequestLate(this); | |
65 } | |
66 | |
67 bool PrioritizedResource::BackingResourceWasEvicted() const { | |
68 return backing_ ? backing_->ResourceHasBeenDeleted() : false; | |
69 } | |
70 | |
71 void PrioritizedResource::AcquireBackingTexture( | |
72 ResourceProvider* resource_provider) { | |
73 DCHECK(is_above_priority_cutoff_); | |
74 if (is_above_priority_cutoff_) | |
75 manager_->AcquireBackingTextureIfNeeded(this, resource_provider); | |
76 } | |
77 | |
78 void PrioritizedResource::SetPixels(ResourceProvider* resource_provider, | |
79 const uint8_t* image, | |
80 const gfx::Rect& image_rect, | |
81 const gfx::Rect& source_rect, | |
82 const gfx::Vector2d& dest_offset) { | |
83 DCHECK(is_above_priority_cutoff_); | |
84 if (is_above_priority_cutoff_) | |
85 AcquireBackingTexture(resource_provider); | |
86 DCHECK(backing_); | |
87 resource_provider->SetPixels( | |
88 resource_id(), image, image_rect, source_rect, dest_offset); | |
89 | |
90 // The component order may be bgra if we uploaded bgra pixels to rgba | |
91 // texture. Mark contents as swizzled if image component order is | |
92 // different than texture format. | |
93 contents_swizzled_ = !PlatformColor::SameComponentOrder(format_); | |
94 } | |
95 | |
96 void PrioritizedResource::Link(Backing* backing) { | |
97 DCHECK(backing); | |
98 DCHECK(!backing->owner_); | |
99 DCHECK(!backing_); | |
100 | |
101 backing_ = backing; | |
102 backing_->owner_ = this; | |
103 } | |
104 | |
105 void PrioritizedResource::Unlink() { | |
106 DCHECK(backing_); | |
107 DCHECK(backing_->owner_ == this); | |
108 | |
109 backing_->owner_ = NULL; | |
110 backing_ = NULL; | |
111 } | |
112 | |
113 void PrioritizedResource::SetToSelfManagedMemoryPlaceholder(size_t bytes) { | |
114 SetDimensions(gfx::Size(), RGBA_8888); | |
115 set_is_self_managed(true); | |
116 bytes_ = bytes; | |
117 } | |
118 | |
119 PrioritizedResource::Backing::Backing(unsigned id, | |
120 ResourceProvider* resource_provider, | |
121 const gfx::Size& size, | |
122 ResourceFormat format) | |
123 : Resource(id, size, format), | |
124 owner_(NULL), | |
125 priority_at_last_priority_update_(PriorityCalculator::LowestPriority()), | |
126 was_above_priority_cutoff_at_last_priority_update_(false), | |
127 in_drawing_impl_tree_(false), | |
128 in_parent_compositor_(false), | |
129 #if !DCHECK_IS_ON() | |
130 resource_has_been_deleted_(false) { | |
131 #else | |
132 resource_has_been_deleted_(false), | |
133 resource_provider_(resource_provider) { | |
134 #endif | |
135 } | |
136 | |
137 PrioritizedResource::Backing::~Backing() { | |
138 DCHECK(!owner_); | |
139 DCHECK(resource_has_been_deleted_); | |
140 } | |
141 | |
142 void PrioritizedResource::Backing::DeleteResource( | |
143 ResourceProvider* resource_provider) { | |
144 DCHECK(!proxy() || proxy()->IsImplThread()); | |
145 DCHECK(!resource_has_been_deleted_); | |
146 #if DCHECK_IS_ON() | |
147 DCHECK(resource_provider == resource_provider_); | |
148 #endif | |
149 | |
150 resource_provider->DeleteResource(id()); | |
151 set_id(0); | |
152 resource_has_been_deleted_ = true; | |
153 } | |
154 | |
155 bool PrioritizedResource::Backing::ResourceHasBeenDeleted() const { | |
156 DCHECK(!proxy() || proxy()->IsImplThread()); | |
157 return resource_has_been_deleted_; | |
158 } | |
159 | |
160 bool PrioritizedResource::Backing::CanBeRecycledIfNotInExternalUse() const { | |
161 DCHECK(!proxy() || proxy()->IsImplThread()); | |
162 return !was_above_priority_cutoff_at_last_priority_update_ && | |
163 !in_drawing_impl_tree_; | |
164 } | |
165 | |
166 void PrioritizedResource::Backing::UpdatePriority() { | |
167 DCHECK(!proxy() || | |
168 (proxy()->IsImplThread() && proxy()->IsMainThreadBlocked())); | |
169 if (owner_) { | |
170 priority_at_last_priority_update_ = owner_->request_priority(); | |
171 was_above_priority_cutoff_at_last_priority_update_ = | |
172 owner_->is_above_priority_cutoff(); | |
173 } else { | |
174 priority_at_last_priority_update_ = PriorityCalculator::LowestPriority(); | |
175 was_above_priority_cutoff_at_last_priority_update_ = false; | |
176 } | |
177 } | |
178 | |
179 void PrioritizedResource::Backing::UpdateState( | |
180 ResourceProvider* resource_provider) { | |
181 DCHECK(!proxy() || | |
182 (proxy()->IsImplThread() && proxy()->IsMainThreadBlocked())); | |
183 in_drawing_impl_tree_ = !!owner(); | |
184 in_parent_compositor_ = resource_provider->InUseByConsumer(id()); | |
185 if (!in_drawing_impl_tree_) { | |
186 DCHECK_EQ(priority_at_last_priority_update_, | |
187 PriorityCalculator::LowestPriority()); | |
188 } | |
189 } | |
190 | |
191 void PrioritizedResource::ReturnBackingTexture() { | |
192 DCHECK(manager_ || !backing_); | |
193 if (manager_) | |
194 manager_->ReturnBackingTexture(this); | |
195 } | |
196 | |
197 const Proxy* PrioritizedResource::Backing::proxy() const { | |
198 if (!owner_ || !owner_->resource_manager()) | |
199 return NULL; | |
200 return owner_->resource_manager()->ProxyForDebug(); | |
201 } | |
202 | |
203 } // namespace cc | |
OLD | NEW |