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