| 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 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 } | 158 } |
| 159 | 159 |
| 160 void DelegatedRendererLayerImpl::SetRenderPasses( | 160 void DelegatedRendererLayerImpl::SetRenderPasses( |
| 161 RenderPassList* render_passes_in_draw_order) { | 161 RenderPassList* render_passes_in_draw_order) { |
| 162 ClearRenderPasses(); | 162 ClearRenderPasses(); |
| 163 | 163 |
| 164 for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { | 164 for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { |
| 165 RenderPassList::iterator to_take = | 165 RenderPassList::iterator to_take = |
| 166 render_passes_in_draw_order->begin() + i; | 166 render_passes_in_draw_order->begin() + i; |
| 167 render_passes_index_by_id_.insert( | 167 render_passes_index_by_id_.insert( |
| 168 std::pair<RenderPass::Id, int>((*to_take)->id, i)); | 168 std::pair<RenderPassId, int>((*to_take)->id, i)); |
| 169 scoped_ptr<RenderPass> taken_render_pass = | 169 scoped_ptr<RenderPass> taken_render_pass = |
| 170 render_passes_in_draw_order->take(to_take); | 170 render_passes_in_draw_order->take(to_take); |
| 171 render_passes_in_draw_order_.push_back(taken_render_pass.Pass()); | 171 render_passes_in_draw_order_.push_back(taken_render_pass.Pass()); |
| 172 } | 172 } |
| 173 | 173 |
| 174 // Give back an empty array instead of nulls. | 174 // Give back an empty array instead of nulls. |
| 175 render_passes_in_draw_order->clear(); | 175 render_passes_in_draw_order->clear(); |
| 176 } | 176 } |
| 177 | 177 |
| 178 void DelegatedRendererLayerImpl::ClearRenderPasses() { | 178 void DelegatedRendererLayerImpl::ClearRenderPasses() { |
| 179 render_passes_index_by_id_.clear(); | 179 render_passes_index_by_id_.clear(); |
| 180 render_passes_in_draw_order_.clear(); | 180 render_passes_in_draw_order_.clear(); |
| 181 } | 181 } |
| 182 | 182 |
| 183 scoped_ptr<LayerImpl> DelegatedRendererLayerImpl::CreateLayerImpl( | 183 scoped_ptr<LayerImpl> DelegatedRendererLayerImpl::CreateLayerImpl( |
| 184 LayerTreeImpl* tree_impl) { | 184 LayerTreeImpl* tree_impl) { |
| 185 return DelegatedRendererLayerImpl::Create( | 185 return DelegatedRendererLayerImpl::Create( |
| 186 tree_impl, id()).PassAs<LayerImpl>(); | 186 tree_impl, id()).PassAs<LayerImpl>(); |
| 187 } | 187 } |
| 188 | 188 |
| 189 void DelegatedRendererLayerImpl::ReleaseResources() { | 189 void DelegatedRendererLayerImpl::ReleaseResources() { |
| 190 ClearRenderPasses(); | 190 ClearRenderPasses(); |
| 191 ClearChildId(); | 191 ClearChildId(); |
| 192 } | 192 } |
| 193 | 193 |
| 194 static inline int IndexToId(int index) { return index + 1; } | 194 static inline int IndexToId(int index) { return index + 1; } |
| 195 static inline int IdToIndex(int id) { return id - 1; } | 195 static inline int IdToIndex(int id) { return id - 1; } |
| 196 | 196 |
| 197 RenderPass::Id DelegatedRendererLayerImpl::FirstContributingRenderPassId() | 197 RenderPassId DelegatedRendererLayerImpl::FirstContributingRenderPassId() const { |
| 198 const { | 198 return RenderPassId(id(), IndexToId(0)); |
| 199 return RenderPass::Id(id(), IndexToId(0)); | |
| 200 } | 199 } |
| 201 | 200 |
| 202 RenderPass::Id DelegatedRendererLayerImpl::NextContributingRenderPassId( | 201 RenderPassId DelegatedRendererLayerImpl::NextContributingRenderPassId( |
| 203 RenderPass::Id previous) const { | 202 RenderPassId previous) const { |
| 204 return RenderPass::Id(previous.layer_id, previous.index + 1); | 203 return RenderPassId(previous.layer_id, previous.index + 1); |
| 205 } | 204 } |
| 206 | 205 |
| 207 bool DelegatedRendererLayerImpl::ConvertDelegatedRenderPassId( | 206 bool DelegatedRendererLayerImpl::ConvertDelegatedRenderPassId( |
| 208 RenderPass::Id delegated_render_pass_id, | 207 RenderPassId delegated_render_pass_id, |
| 209 RenderPass::Id* output_render_pass_id) const { | 208 RenderPassId* output_render_pass_id) const { |
| 210 base::hash_map<RenderPass::Id, int>::const_iterator found = | 209 base::hash_map<RenderPassId, int>::const_iterator found = |
| 211 render_passes_index_by_id_.find(delegated_render_pass_id); | 210 render_passes_index_by_id_.find(delegated_render_pass_id); |
| 212 if (found == render_passes_index_by_id_.end()) { | 211 if (found == render_passes_index_by_id_.end()) { |
| 213 // Be robust against a RenderPass id that isn't part of the frame. | 212 // Be robust against a RenderPass id that isn't part of the frame. |
| 214 return false; | 213 return false; |
| 215 } | 214 } |
| 216 unsigned delegated_render_pass_index = found->second; | 215 unsigned delegated_render_pass_index = found->second; |
| 217 *output_render_pass_id = | 216 *output_render_pass_id = |
| 218 RenderPass::Id(id(), IndexToId(delegated_render_pass_index)); | 217 RenderPassId(id(), IndexToId(delegated_render_pass_index)); |
| 219 return true; | 218 return true; |
| 220 } | 219 } |
| 221 | 220 |
| 222 void DelegatedRendererLayerImpl::AppendContributingRenderPasses( | 221 void DelegatedRendererLayerImpl::AppendContributingRenderPasses( |
| 223 RenderPassSink* render_pass_sink) { | 222 RenderPassSink* render_pass_sink) { |
| 224 DCHECK(HasContributingDelegatedRenderPasses()); | 223 DCHECK(HasContributingDelegatedRenderPasses()); |
| 225 | 224 |
| 226 const RenderPass* root_delegated_render_pass = | 225 const RenderPass* root_delegated_render_pass = |
| 227 render_passes_in_draw_order_.back(); | 226 render_passes_in_draw_order_.back(); |
| 228 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); | 227 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); |
| 229 gfx::Transform delegated_frame_to_root_transform = screen_space_transform(); | 228 gfx::Transform delegated_frame_to_root_transform = screen_space_transform(); |
| 230 delegated_frame_to_root_transform.Scale(inverse_device_scale_factor_, | 229 delegated_frame_to_root_transform.Scale(inverse_device_scale_factor_, |
| 231 inverse_device_scale_factor_); | 230 inverse_device_scale_factor_); |
| 232 | 231 |
| 233 for (size_t i = 0; i < render_passes_in_draw_order_.size() - 1; ++i) { | 232 for (size_t i = 0; i < render_passes_in_draw_order_.size() - 1; ++i) { |
| 234 RenderPass::Id output_render_pass_id(-1, -1); | 233 RenderPassId output_render_pass_id(-1, -1); |
| 235 bool present = | 234 bool present = |
| 236 ConvertDelegatedRenderPassId(render_passes_in_draw_order_[i]->id, | 235 ConvertDelegatedRenderPassId(render_passes_in_draw_order_[i]->id, |
| 237 &output_render_pass_id); | 236 &output_render_pass_id); |
| 238 | 237 |
| 239 // Don't clash with the RenderPass we generate if we own a RenderSurface. | 238 // Don't clash with the RenderPass we generate if we own a RenderSurface. |
| 240 DCHECK(present) << render_passes_in_draw_order_[i]->id.layer_id << ", " | 239 DCHECK(present) << render_passes_in_draw_order_[i]->id.layer_id << ", " |
| 241 << render_passes_in_draw_order_[i]->id.index; | 240 << render_passes_in_draw_order_[i]->id.index; |
| 242 DCHECK_GT(output_render_pass_id.index, 0); | 241 DCHECK_GT(output_render_pass_id.index, 0); |
| 243 | 242 |
| 244 scoped_ptr<RenderPass> copy_pass = | 243 scoped_ptr<RenderPass> copy_pass = |
| (...skipping 14 matching lines...) Expand all Loading... |
| 259 void DelegatedRendererLayerImpl::AppendQuads( | 258 void DelegatedRendererLayerImpl::AppendQuads( |
| 260 RenderPass* render_pass, | 259 RenderPass* render_pass, |
| 261 const OcclusionTracker<LayerImpl>& occlusion_tracker, | 260 const OcclusionTracker<LayerImpl>& occlusion_tracker, |
| 262 AppendQuadsData* append_quads_data) { | 261 AppendQuadsData* append_quads_data) { |
| 263 AppendRainbowDebugBorder(render_pass, append_quads_data); | 262 AppendRainbowDebugBorder(render_pass, append_quads_data); |
| 264 | 263 |
| 265 // This list will be empty after a lost context until a new frame arrives. | 264 // This list will be empty after a lost context until a new frame arrives. |
| 266 if (render_passes_in_draw_order_.empty()) | 265 if (render_passes_in_draw_order_.empty()) |
| 267 return; | 266 return; |
| 268 | 267 |
| 269 RenderPass::Id target_render_pass_id = append_quads_data->render_pass_id; | 268 RenderPassId target_render_pass_id = append_quads_data->render_pass_id; |
| 270 | 269 |
| 271 const RenderPass* root_delegated_render_pass = | 270 const RenderPass* root_delegated_render_pass = |
| 272 render_passes_in_draw_order_.back(); | 271 render_passes_in_draw_order_.back(); |
| 273 | 272 |
| 274 DCHECK(root_delegated_render_pass->output_rect.origin().IsOrigin()); | 273 DCHECK(root_delegated_render_pass->output_rect.origin().IsOrigin()); |
| 275 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); | 274 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); |
| 276 | 275 |
| 277 // If the index of the RenderPassId is 0, then it is a RenderPass generated | 276 // If the index of the RenderPassId is 0, then it is a RenderPass generated |
| 278 // for a layer in this compositor, not the delegating renderer. Then we want | 277 // for a layer in this compositor, not the delegating renderer. Then we want |
| 279 // to merge our root RenderPass with the target RenderPass. Otherwise, it is | 278 // to merge our root RenderPass with the target RenderPass. Otherwise, it is |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 delegated_quad->visible_rect, quad_content_to_delegated_target_space); | 448 delegated_quad->visible_rect, quad_content_to_delegated_target_space); |
| 450 | 449 |
| 451 if (quad_visible_rect.IsEmpty()) | 450 if (quad_visible_rect.IsEmpty()) |
| 452 continue; | 451 continue; |
| 453 | 452 |
| 454 if (delegated_quad->material != DrawQuad::RENDER_PASS) { | 453 if (delegated_quad->material != DrawQuad::RENDER_PASS) { |
| 455 DrawQuad* output_quad = render_pass->CopyFromAndAppendDrawQuad( | 454 DrawQuad* output_quad = render_pass->CopyFromAndAppendDrawQuad( |
| 456 delegated_quad, output_shared_quad_state); | 455 delegated_quad, output_shared_quad_state); |
| 457 output_quad->visible_rect = quad_visible_rect; | 456 output_quad->visible_rect = quad_visible_rect; |
| 458 } else { | 457 } else { |
| 459 RenderPass::Id delegated_contributing_render_pass_id = | 458 RenderPassId delegated_contributing_render_pass_id = |
| 460 RenderPassDrawQuad::MaterialCast(delegated_quad)->render_pass_id; | 459 RenderPassDrawQuad::MaterialCast(delegated_quad)->render_pass_id; |
| 461 RenderPass::Id output_contributing_render_pass_id(-1, -1); | 460 RenderPassId output_contributing_render_pass_id(-1, -1); |
| 462 | 461 |
| 463 bool present = | 462 bool present = |
| 464 ConvertDelegatedRenderPassId(delegated_contributing_render_pass_id, | 463 ConvertDelegatedRenderPassId(delegated_contributing_render_pass_id, |
| 465 &output_contributing_render_pass_id); | 464 &output_contributing_render_pass_id); |
| 466 | 465 |
| 467 // The frame may have a RenderPassDrawQuad that points to a RenderPass not | 466 // The frame may have a RenderPassDrawQuad that points to a RenderPass not |
| 468 // part of the frame. Just ignore these quads. | 467 // part of the frame. Just ignore these quads. |
| 469 if (present) { | 468 if (present) { |
| 470 DCHECK(output_contributing_render_pass_id != | 469 DCHECK(output_contributing_render_pass_id != |
| 471 append_quads_data->render_pass_id); | 470 append_quads_data->render_pass_id); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 492 if (own_child_id_) { | 491 if (own_child_id_) { |
| 493 ResourceProvider* provider = layer_tree_impl()->resource_provider(); | 492 ResourceProvider* provider = layer_tree_impl()->resource_provider(); |
| 494 provider->DestroyChild(child_id_); | 493 provider->DestroyChild(child_id_); |
| 495 } | 494 } |
| 496 | 495 |
| 497 resources_.clear(); | 496 resources_.clear(); |
| 498 child_id_ = 0; | 497 child_id_ = 0; |
| 499 } | 498 } |
| 500 | 499 |
| 501 } // namespace cc | 500 } // namespace cc |
| OLD | NEW |