| 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 |