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