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