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/layers/delegated_renderer_layer_impl.h" | 5 #include "cc/layers/delegated_renderer_layer_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 } | 183 } |
184 | 184 |
185 void DelegatedRendererLayerImpl::SetRenderPasses( | 185 void DelegatedRendererLayerImpl::SetRenderPasses( |
186 RenderPassList* render_passes_in_draw_order) { | 186 RenderPassList* render_passes_in_draw_order) { |
187 ClearRenderPasses(); | 187 ClearRenderPasses(); |
188 | 188 |
189 for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { | 189 for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { |
190 RenderPassList::iterator to_take = | 190 RenderPassList::iterator to_take = |
191 render_passes_in_draw_order->begin() + i; | 191 render_passes_in_draw_order->begin() + i; |
192 render_passes_index_by_id_.insert( | 192 render_passes_index_by_id_.insert( |
193 std::pair<RenderPassId, int>((*to_take)->id, i)); | 193 RenderPassToIndexMap::value_type((*to_take)->id, i)); |
194 scoped_ptr<RenderPass> taken_render_pass = | 194 scoped_ptr<RenderPass> taken_render_pass = |
195 render_passes_in_draw_order->take(to_take); | 195 render_passes_in_draw_order->take(to_take); |
196 render_passes_in_draw_order_.push_back(taken_render_pass.Pass()); | 196 render_passes_in_draw_order_.push_back(taken_render_pass.Pass()); |
197 } | 197 } |
198 | 198 |
199 // Give back an empty array instead of nulls. | 199 // Give back an empty array instead of nulls. |
200 render_passes_in_draw_order->clear(); | 200 render_passes_in_draw_order->clear(); |
201 | 201 |
202 // The render passes given here become part of the RenderSurfaceLayerList, so | 202 // The render passes given here become part of the RenderSurfaceLayerList, so |
203 // changing them requires recomputing the RenderSurfaceLayerList. | 203 // changing them requires recomputing the RenderSurfaceLayerList. |
204 layer_tree_impl()->set_needs_update_draw_properties(); | 204 layer_tree_impl()->set_needs_update_draw_properties(); |
205 } | 205 } |
206 | 206 |
207 void DelegatedRendererLayerImpl::ClearRenderPasses() { | 207 void DelegatedRendererLayerImpl::ClearRenderPasses() { |
208 render_passes_index_by_id_.clear(); | 208 render_passes_index_by_id_.clear(); |
209 render_passes_in_draw_order_.clear(); | 209 render_passes_in_draw_order_.clear(); |
210 } | 210 } |
211 | 211 |
212 scoped_ptr<LayerImpl> DelegatedRendererLayerImpl::CreateLayerImpl( | 212 scoped_ptr<LayerImpl> DelegatedRendererLayerImpl::CreateLayerImpl( |
213 LayerTreeImpl* tree_impl) { | 213 LayerTreeImpl* tree_impl) { |
214 return DelegatedRendererLayerImpl::Create(tree_impl, id()); | 214 return DelegatedRendererLayerImpl::Create(tree_impl, id()); |
215 } | 215 } |
216 | 216 |
217 void DelegatedRendererLayerImpl::ReleaseResources() { | 217 void DelegatedRendererLayerImpl::ReleaseResources() { |
218 ClearRenderPasses(); | 218 ClearRenderPasses(); |
219 ClearChildId(); | 219 ClearChildId(); |
220 have_render_passes_to_push_ = false; | 220 have_render_passes_to_push_ = false; |
221 } | 221 } |
222 | 222 |
223 static inline int IndexToId(int index) { return index + 1; } | 223 static inline size_t IndexToId(size_t index) { |
224 static inline int IdToIndex(int id) { return id - 1; } | 224 return index + 1; |
| 225 } |
| 226 static inline size_t IdToIndex(size_t id) { |
| 227 DCHECK_GT(id, 0u); |
| 228 return id - 1; |
| 229 } |
225 | 230 |
226 RenderPassId DelegatedRendererLayerImpl::FirstContributingRenderPassId() const { | 231 RenderPassId DelegatedRendererLayerImpl::FirstContributingRenderPassId() const { |
227 return RenderPassId(id(), IndexToId(0)); | 232 return RenderPassId(id(), IndexToId(0)); |
228 } | 233 } |
229 | 234 |
230 RenderPassId DelegatedRendererLayerImpl::NextContributingRenderPassId( | 235 RenderPassId DelegatedRendererLayerImpl::NextContributingRenderPassId( |
231 RenderPassId previous) const { | 236 RenderPassId previous) const { |
232 return RenderPassId(previous.layer_id, previous.index + 1); | 237 return RenderPassId(previous.layer_id, previous.index + 1); |
233 } | 238 } |
234 | 239 |
235 bool DelegatedRendererLayerImpl::ConvertDelegatedRenderPassId( | 240 bool DelegatedRendererLayerImpl::ConvertDelegatedRenderPassId( |
236 RenderPassId delegated_render_pass_id, | 241 RenderPassId delegated_render_pass_id, |
237 RenderPassId* output_render_pass_id) const { | 242 RenderPassId* output_render_pass_id) const { |
238 base::hash_map<RenderPassId, int>::const_iterator found = | 243 RenderPassToIndexMap::const_iterator found = |
239 render_passes_index_by_id_.find(delegated_render_pass_id); | 244 render_passes_index_by_id_.find(delegated_render_pass_id); |
240 if (found == render_passes_index_by_id_.end()) { | 245 if (found == render_passes_index_by_id_.end()) { |
241 // Be robust against a RenderPass id that isn't part of the frame. | 246 // Be robust against a RenderPass id that isn't part of the frame. |
242 return false; | 247 return false; |
243 } | 248 } |
244 unsigned delegated_render_pass_index = found->second; | 249 size_t delegated_render_pass_index = found->second; |
245 *output_render_pass_id = | 250 *output_render_pass_id = |
246 RenderPassId(id(), IndexToId(delegated_render_pass_index)); | 251 RenderPassId(id(), IndexToId(delegated_render_pass_index)); |
247 return true; | 252 return true; |
248 } | 253 } |
249 | 254 |
250 void DelegatedRendererLayerImpl::AppendContributingRenderPasses( | 255 void DelegatedRendererLayerImpl::AppendContributingRenderPasses( |
251 RenderPassSink* render_pass_sink) { | 256 RenderPassSink* render_pass_sink) { |
252 DCHECK(HasContributingDelegatedRenderPasses()); | 257 DCHECK(HasContributingDelegatedRenderPasses()); |
253 | 258 |
254 const RenderPass* root_delegated_render_pass = | 259 const RenderPass* root_delegated_render_pass = |
255 render_passes_in_draw_order_.back(); | 260 render_passes_in_draw_order_.back(); |
256 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); | 261 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); |
257 gfx::Transform delegated_frame_to_root_transform = screen_space_transform(); | 262 gfx::Transform delegated_frame_to_root_transform = screen_space_transform(); |
258 delegated_frame_to_root_transform.Scale(inverse_device_scale_factor_, | 263 delegated_frame_to_root_transform.Scale(inverse_device_scale_factor_, |
259 inverse_device_scale_factor_); | 264 inverse_device_scale_factor_); |
260 | 265 |
261 for (size_t i = 0; i < render_passes_in_draw_order_.size() - 1; ++i) { | 266 for (size_t i = 0; i < render_passes_in_draw_order_.size() - 1; ++i) { |
262 RenderPassId output_render_pass_id(-1, -1); | 267 RenderPassId output_render_pass_id(-1, -1); |
263 bool present = | 268 bool present = |
264 ConvertDelegatedRenderPassId(render_passes_in_draw_order_[i]->id, | 269 ConvertDelegatedRenderPassId(render_passes_in_draw_order_[i]->id, |
265 &output_render_pass_id); | 270 &output_render_pass_id); |
266 | 271 |
267 // Don't clash with the RenderPass we generate if we own a RenderSurface. | 272 // Don't clash with the RenderPass we generate if we own a RenderSurface. |
268 DCHECK(present) << render_passes_in_draw_order_[i]->id.layer_id << ", " | 273 DCHECK(present) << render_passes_in_draw_order_[i]->id.layer_id << ", " |
269 << render_passes_in_draw_order_[i]->id.index; | 274 << render_passes_in_draw_order_[i]->id.index; |
270 DCHECK_GT(output_render_pass_id.index, 0); | 275 DCHECK_GT(output_render_pass_id.index, 0u); |
271 | 276 |
272 scoped_ptr<RenderPass> copy_pass = | 277 scoped_ptr<RenderPass> copy_pass = |
273 render_passes_in_draw_order_[i]->Copy(output_render_pass_id); | 278 render_passes_in_draw_order_[i]->Copy(output_render_pass_id); |
274 copy_pass->transform_to_root_target.ConcatTransform( | 279 copy_pass->transform_to_root_target.ConcatTransform( |
275 delegated_frame_to_root_transform); | 280 delegated_frame_to_root_transform); |
276 render_pass_sink->AppendRenderPass(copy_pass.Pass()); | 281 render_pass_sink->AppendRenderPass(copy_pass.Pass()); |
277 } | 282 } |
278 } | 283 } |
279 | 284 |
280 bool DelegatedRendererLayerImpl::WillDraw(DrawMode draw_mode, | 285 bool DelegatedRendererLayerImpl::WillDraw(DrawMode draw_mode, |
(...skipping 30 matching lines...) Expand all Loading... |
311 // render_target. | 316 // render_target. |
312 DCHECK(target_render_pass_id.layer_id == render_target()->id()); | 317 DCHECK(target_render_pass_id.layer_id == render_target()->id()); |
313 | 318 |
314 AppendRenderPassQuads(render_pass, | 319 AppendRenderPassQuads(render_pass, |
315 root_delegated_render_pass, | 320 root_delegated_render_pass, |
316 frame_size); | 321 frame_size); |
317 } else { | 322 } else { |
318 // Verify that the RenderPass we are appending to was created by us. | 323 // Verify that the RenderPass we are appending to was created by us. |
319 DCHECK(target_render_pass_id.layer_id == id()); | 324 DCHECK(target_render_pass_id.layer_id == id()); |
320 | 325 |
321 int render_pass_index = IdToIndex(target_render_pass_id.index); | 326 size_t render_pass_index = IdToIndex(target_render_pass_id.index); |
322 const RenderPass* delegated_render_pass = | 327 const RenderPass* delegated_render_pass = |
323 render_passes_in_draw_order_[render_pass_index]; | 328 render_passes_in_draw_order_[render_pass_index]; |
324 AppendRenderPassQuads(render_pass, | 329 AppendRenderPassQuads(render_pass, |
325 delegated_render_pass, | 330 delegated_render_pass, |
326 frame_size); | 331 frame_size); |
327 } | 332 } |
328 } | 333 } |
329 | 334 |
330 void DelegatedRendererLayerImpl::AppendRainbowDebugBorder( | 335 void DelegatedRendererLayerImpl::AppendRainbowDebugBorder( |
331 RenderPass* render_pass) { | 336 RenderPass* render_pass) { |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 if (own_child_id_) { | 531 if (own_child_id_) { |
527 ResourceProvider* provider = layer_tree_impl()->resource_provider(); | 532 ResourceProvider* provider = layer_tree_impl()->resource_provider(); |
528 provider->DestroyChild(child_id_); | 533 provider->DestroyChild(child_id_); |
529 } | 534 } |
530 | 535 |
531 resources_.clear(); | 536 resources_.clear(); |
532 child_id_ = 0; | 537 child_id_ = 0; |
533 } | 538 } |
534 | 539 |
535 } // namespace cc | 540 } // namespace cc |
OLD | NEW |