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 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 } | 173 } |
174 | 174 |
175 void DelegatedRendererLayerImpl::SetRenderPasses( | 175 void DelegatedRendererLayerImpl::SetRenderPasses( |
176 RenderPassList* render_passes_in_draw_order) { | 176 RenderPassList* render_passes_in_draw_order) { |
177 ClearRenderPasses(); | 177 ClearRenderPasses(); |
178 | 178 |
179 for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { | 179 for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { |
180 RenderPassList::iterator to_take = | 180 RenderPassList::iterator to_take = |
181 render_passes_in_draw_order->begin() + i; | 181 render_passes_in_draw_order->begin() + i; |
182 render_passes_index_by_id_.insert( | 182 render_passes_index_by_id_.insert( |
183 std::pair<RenderPassId, int>((*to_take)->id, i)); | 183 RenderPassToIndexMap::value_type((*to_take)->id, i)); |
184 scoped_ptr<RenderPass> taken_render_pass = | 184 scoped_ptr<RenderPass> taken_render_pass = |
185 render_passes_in_draw_order->take(to_take); | 185 render_passes_in_draw_order->take(to_take); |
186 render_passes_in_draw_order_.push_back(taken_render_pass.Pass()); | 186 render_passes_in_draw_order_.push_back(taken_render_pass.Pass()); |
187 } | 187 } |
188 | 188 |
189 // Give back an empty array instead of nulls. | 189 // Give back an empty array instead of nulls. |
190 render_passes_in_draw_order->clear(); | 190 render_passes_in_draw_order->clear(); |
191 | 191 |
192 // The render passes given here become part of the RenderSurfaceLayerList, so | 192 // The render passes given here become part of the RenderSurfaceLayerList, so |
193 // changing them requires recomputing the RenderSurfaceLayerList. | 193 // changing them requires recomputing the RenderSurfaceLayerList. |
194 layer_tree_impl()->set_needs_update_draw_properties(); | 194 layer_tree_impl()->set_needs_update_draw_properties(); |
195 } | 195 } |
196 | 196 |
197 void DelegatedRendererLayerImpl::ClearRenderPasses() { | 197 void DelegatedRendererLayerImpl::ClearRenderPasses() { |
198 render_passes_index_by_id_.clear(); | 198 render_passes_index_by_id_.clear(); |
199 render_passes_in_draw_order_.clear(); | 199 render_passes_in_draw_order_.clear(); |
200 } | 200 } |
201 | 201 |
202 scoped_ptr<LayerImpl> DelegatedRendererLayerImpl::CreateLayerImpl( | 202 scoped_ptr<LayerImpl> DelegatedRendererLayerImpl::CreateLayerImpl( |
203 LayerTreeImpl* tree_impl) { | 203 LayerTreeImpl* tree_impl) { |
204 return DelegatedRendererLayerImpl::Create(tree_impl, id()); | 204 return DelegatedRendererLayerImpl::Create(tree_impl, id()); |
205 } | 205 } |
206 | 206 |
207 void DelegatedRendererLayerImpl::ReleaseResources() { | 207 void DelegatedRendererLayerImpl::ReleaseResources() { |
208 ClearRenderPasses(); | 208 ClearRenderPasses(); |
209 ClearChildId(); | 209 ClearChildId(); |
210 have_render_passes_to_push_ = false; | 210 have_render_passes_to_push_ = false; |
211 } | 211 } |
212 | 212 |
213 static inline int IndexToId(int index) { return index + 1; } | 213 static inline size_t IndexToId(size_t index) { |
214 static inline int IdToIndex(int id) { return id - 1; } | 214 return index + 1; |
| 215 } |
| 216 static inline size_t IdToIndex(size_t id) { |
| 217 DCHECK_GT(id, 0u); |
| 218 return id - 1; |
| 219 } |
215 | 220 |
216 RenderPassId DelegatedRendererLayerImpl::FirstContributingRenderPassId() const { | 221 RenderPassId DelegatedRendererLayerImpl::FirstContributingRenderPassId() const { |
217 return RenderPassId(id(), IndexToId(0)); | 222 return RenderPassId(id(), IndexToId(0)); |
218 } | 223 } |
219 | 224 |
220 RenderPassId DelegatedRendererLayerImpl::NextContributingRenderPassId( | 225 RenderPassId DelegatedRendererLayerImpl::NextContributingRenderPassId( |
221 RenderPassId previous) const { | 226 RenderPassId previous) const { |
222 return RenderPassId(previous.layer_id, previous.index + 1); | 227 return RenderPassId(previous.layer_id, previous.index + 1); |
223 } | 228 } |
224 | 229 |
225 bool DelegatedRendererLayerImpl::ConvertDelegatedRenderPassId( | 230 bool DelegatedRendererLayerImpl::ConvertDelegatedRenderPassId( |
226 RenderPassId delegated_render_pass_id, | 231 RenderPassId delegated_render_pass_id, |
227 RenderPassId* output_render_pass_id) const { | 232 RenderPassId* output_render_pass_id) const { |
228 base::hash_map<RenderPassId, int>::const_iterator found = | 233 RenderPassToIndexMap::const_iterator found = |
229 render_passes_index_by_id_.find(delegated_render_pass_id); | 234 render_passes_index_by_id_.find(delegated_render_pass_id); |
230 if (found == render_passes_index_by_id_.end()) { | 235 if (found == render_passes_index_by_id_.end()) { |
231 // Be robust against a RenderPass id that isn't part of the frame. | 236 // Be robust against a RenderPass id that isn't part of the frame. |
232 return false; | 237 return false; |
233 } | 238 } |
234 unsigned delegated_render_pass_index = found->second; | 239 size_t delegated_render_pass_index = found->second; |
235 *output_render_pass_id = | 240 *output_render_pass_id = |
236 RenderPassId(id(), IndexToId(delegated_render_pass_index)); | 241 RenderPassId(id(), IndexToId(delegated_render_pass_index)); |
237 return true; | 242 return true; |
238 } | 243 } |
239 | 244 |
240 void DelegatedRendererLayerImpl::AppendContributingRenderPasses( | 245 void DelegatedRendererLayerImpl::AppendContributingRenderPasses( |
241 RenderPassSink* render_pass_sink) { | 246 RenderPassSink* render_pass_sink) { |
242 DCHECK(HasContributingDelegatedRenderPasses()); | 247 DCHECK(HasContributingDelegatedRenderPasses()); |
243 | 248 |
244 const RenderPass* root_delegated_render_pass = | 249 const RenderPass* root_delegated_render_pass = |
245 render_passes_in_draw_order_.back(); | 250 render_passes_in_draw_order_.back(); |
246 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); | 251 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); |
247 gfx::Transform delegated_frame_to_root_transform = screen_space_transform(); | 252 gfx::Transform delegated_frame_to_root_transform = screen_space_transform(); |
248 delegated_frame_to_root_transform.Scale(inverse_device_scale_factor_, | 253 delegated_frame_to_root_transform.Scale(inverse_device_scale_factor_, |
249 inverse_device_scale_factor_); | 254 inverse_device_scale_factor_); |
250 | 255 |
251 for (size_t i = 0; i < render_passes_in_draw_order_.size() - 1; ++i) { | 256 for (size_t i = 0; i < render_passes_in_draw_order_.size() - 1; ++i) { |
252 RenderPassId output_render_pass_id(-1, -1); | 257 RenderPassId output_render_pass_id; |
253 bool present = | 258 bool present = |
254 ConvertDelegatedRenderPassId(render_passes_in_draw_order_[i]->id, | 259 ConvertDelegatedRenderPassId(render_passes_in_draw_order_[i]->id, |
255 &output_render_pass_id); | 260 &output_render_pass_id); |
256 | 261 |
257 // Don't clash with the RenderPass we generate if we own a RenderSurface. | 262 // Don't clash with the RenderPass we generate if we own a RenderSurface. |
258 DCHECK(present) << render_passes_in_draw_order_[i]->id.layer_id << ", " | 263 DCHECK(present) << render_passes_in_draw_order_[i]->id.layer_id << ", " |
259 << render_passes_in_draw_order_[i]->id.index; | 264 << render_passes_in_draw_order_[i]->id.index; |
260 DCHECK_GT(output_render_pass_id.index, 0); | 265 DCHECK_GT(output_render_pass_id.index, 0u); |
261 | 266 |
262 scoped_ptr<RenderPass> copy_pass = | 267 scoped_ptr<RenderPass> copy_pass = |
263 render_passes_in_draw_order_[i]->Copy(output_render_pass_id); | 268 render_passes_in_draw_order_[i]->Copy(output_render_pass_id); |
264 copy_pass->transform_to_root_target.ConcatTransform( | 269 copy_pass->transform_to_root_target.ConcatTransform( |
265 delegated_frame_to_root_transform); | 270 delegated_frame_to_root_transform); |
266 render_pass_sink->AppendRenderPass(copy_pass.Pass()); | 271 render_pass_sink->AppendRenderPass(copy_pass.Pass()); |
267 } | 272 } |
268 } | 273 } |
269 | 274 |
270 bool DelegatedRendererLayerImpl::WillDraw(DrawMode draw_mode, | 275 bool DelegatedRendererLayerImpl::WillDraw(DrawMode draw_mode, |
(...skipping 30 matching lines...) Expand all Loading... |
301 // render_target. | 306 // render_target. |
302 DCHECK(target_render_pass_id.layer_id == render_target()->id()); | 307 DCHECK(target_render_pass_id.layer_id == render_target()->id()); |
303 | 308 |
304 AppendRenderPassQuads(render_pass, | 309 AppendRenderPassQuads(render_pass, |
305 root_delegated_render_pass, | 310 root_delegated_render_pass, |
306 frame_size); | 311 frame_size); |
307 } else { | 312 } else { |
308 // Verify that the RenderPass we are appending to was created by us. | 313 // Verify that the RenderPass we are appending to was created by us. |
309 DCHECK(target_render_pass_id.layer_id == id()); | 314 DCHECK(target_render_pass_id.layer_id == id()); |
310 | 315 |
311 int render_pass_index = IdToIndex(target_render_pass_id.index); | 316 size_t render_pass_index = IdToIndex(target_render_pass_id.index); |
312 const RenderPass* delegated_render_pass = | 317 const RenderPass* delegated_render_pass = |
313 render_passes_in_draw_order_[render_pass_index]; | 318 render_passes_in_draw_order_[render_pass_index]; |
314 AppendRenderPassQuads(render_pass, | 319 AppendRenderPassQuads(render_pass, |
315 delegated_render_pass, | 320 delegated_render_pass, |
316 frame_size); | 321 frame_size); |
317 } | 322 } |
318 } | 323 } |
319 | 324 |
320 void DelegatedRendererLayerImpl::AppendRainbowDebugBorder( | 325 void DelegatedRendererLayerImpl::AppendRainbowDebugBorder( |
321 RenderPass* render_pass) { | 326 RenderPass* render_pass) { |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 continue; | 484 continue; |
480 | 485 |
481 if (delegated_quad->material != DrawQuad::RENDER_PASS) { | 486 if (delegated_quad->material != DrawQuad::RENDER_PASS) { |
482 DrawQuad* output_quad = render_pass->CopyFromAndAppendDrawQuad( | 487 DrawQuad* output_quad = render_pass->CopyFromAndAppendDrawQuad( |
483 delegated_quad, output_shared_quad_state); | 488 delegated_quad, output_shared_quad_state); |
484 output_quad->visible_rect = quad_visible_rect; | 489 output_quad->visible_rect = quad_visible_rect; |
485 ValidateQuadResources(output_quad); | 490 ValidateQuadResources(output_quad); |
486 } else { | 491 } else { |
487 RenderPassId delegated_contributing_render_pass_id = | 492 RenderPassId delegated_contributing_render_pass_id = |
488 RenderPassDrawQuad::MaterialCast(delegated_quad)->render_pass_id; | 493 RenderPassDrawQuad::MaterialCast(delegated_quad)->render_pass_id; |
489 RenderPassId output_contributing_render_pass_id(-1, -1); | 494 RenderPassId output_contributing_render_pass_id; |
490 | 495 |
491 bool present = | 496 bool present = |
492 ConvertDelegatedRenderPassId(delegated_contributing_render_pass_id, | 497 ConvertDelegatedRenderPassId(delegated_contributing_render_pass_id, |
493 &output_contributing_render_pass_id); | 498 &output_contributing_render_pass_id); |
494 // |present| being false means the child compositor sent an invalid frame. | 499 // |present| being false means the child compositor sent an invalid frame. |
495 DCHECK(present); | 500 DCHECK(present); |
496 DCHECK(output_contributing_render_pass_id != render_pass->id); | 501 DCHECK(output_contributing_render_pass_id != render_pass->id); |
497 | 502 |
498 RenderPassDrawQuad* output_quad = | 503 RenderPassDrawQuad* output_quad = |
499 render_pass->CopyFromAndAppendRenderPassDrawQuad( | 504 render_pass->CopyFromAndAppendRenderPassDrawQuad( |
(...skipping 16 matching lines...) Expand all Loading... |
516 if (own_child_id_) { | 521 if (own_child_id_) { |
517 ResourceProvider* provider = layer_tree_impl()->resource_provider(); | 522 ResourceProvider* provider = layer_tree_impl()->resource_provider(); |
518 provider->DestroyChild(child_id_); | 523 provider->DestroyChild(child_id_); |
519 } | 524 } |
520 | 525 |
521 resources_.clear(); | 526 resources_.clear(); |
522 child_id_ = 0; | 527 child_id_ = 0; |
523 } | 528 } |
524 | 529 |
525 } // namespace cc | 530 } // namespace cc |
OLD | NEW |