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/output/direct_renderer.h" | 5 #include "cc/output/direct_renderer.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <unordered_map> | 9 #include <unordered_map> |
10 #include <utility> | 10 #include <utility> |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 reshape_device_scale_factor_ = device_scale_factor; | 247 reshape_device_scale_factor_ = device_scale_factor; |
248 reshape_device_color_space_ = device_color_space; | 248 reshape_device_color_space_ = device_color_space; |
249 reshape_has_alpha_ = frame.root_render_pass->has_transparent_background; | 249 reshape_has_alpha_ = frame.root_render_pass->has_transparent_background; |
250 output_surface_->Reshape(reshape_surface_size_, | 250 output_surface_->Reshape(reshape_surface_size_, |
251 reshape_device_scale_factor_, | 251 reshape_device_scale_factor_, |
252 reshape_device_color_space_, reshape_has_alpha_); | 252 reshape_device_color_space_, reshape_has_alpha_); |
253 } | 253 } |
254 | 254 |
255 BeginDrawingFrame(&frame); | 255 BeginDrawingFrame(&frame); |
256 | 256 |
| 257 for (const auto& pass : *render_passes_in_draw_order) { |
| 258 if (!pass->filters.IsEmpty()) |
| 259 render_pass_filters_.push_back(std::make_pair(pass->id, &pass->filters)); |
| 260 if (!pass->background_filters.IsEmpty()) { |
| 261 render_pass_background_filters_.push_back( |
| 262 std::make_pair(pass->id, &pass->background_filters)); |
| 263 } |
| 264 std::sort(render_pass_filters_.begin(), render_pass_filters_.end()); |
| 265 std::sort(render_pass_background_filters_.begin(), |
| 266 render_pass_background_filters_.end()); |
| 267 } |
| 268 |
257 // Draw all non-root render passes except for the root render pass. | 269 // Draw all non-root render passes except for the root render pass. |
258 for (const auto& pass : *render_passes_in_draw_order) { | 270 for (const auto& pass : *render_passes_in_draw_order) { |
259 if (pass.get() == root_render_pass) | 271 if (pass.get() == root_render_pass) |
260 break; | 272 break; |
261 DrawRenderPassAndExecuteCopyRequests(&frame, pass.get()); | 273 DrawRenderPassAndExecuteCopyRequests(&frame, pass.get()); |
262 } | 274 } |
263 | 275 |
264 // Create the overlay candidate for the output surface, and mark it as | 276 // Create the overlay candidate for the output surface, and mark it as |
265 // always handled. | 277 // always handled. |
266 if (output_surface_->IsDisplayedAsOverlayPlane()) { | 278 if (output_surface_->IsDisplayedAsOverlayPlane()) { |
267 OverlayCandidate output_surface_plane; | 279 OverlayCandidate output_surface_plane; |
268 output_surface_plane.display_rect = | 280 output_surface_plane.display_rect = |
269 gfx::RectF(root_render_pass->output_rect); | 281 gfx::RectF(root_render_pass->output_rect); |
270 output_surface_plane.quad_rect_in_target_space = | 282 output_surface_plane.quad_rect_in_target_space = |
271 root_render_pass->output_rect; | 283 root_render_pass->output_rect; |
272 output_surface_plane.use_output_surface_for_resource = true; | 284 output_surface_plane.use_output_surface_for_resource = true; |
273 output_surface_plane.overlay_handled = true; | 285 output_surface_plane.overlay_handled = true; |
274 frame.overlay_list.push_back(output_surface_plane); | 286 frame.overlay_list.push_back(output_surface_plane); |
275 } | 287 } |
276 | 288 |
277 // Attempt to replace some or all of the quads of the root render pass with | 289 // Attempt to replace some or all of the quads of the root render pass with |
278 // overlays. | 290 // overlays. |
279 overlay_processor_->ProcessForOverlays( | 291 overlay_processor_->ProcessForOverlays( |
280 resource_provider_, root_render_pass, &frame.overlay_list, | 292 resource_provider_, root_render_pass, render_pass_filters_, |
| 293 render_pass_background_filters_, &frame.overlay_list, |
281 &frame.ca_layer_overlay_list, &frame.root_damage_rect); | 294 &frame.ca_layer_overlay_list, &frame.root_damage_rect); |
282 | 295 |
283 // We can skip all drawing if the damage rect is now empty. | 296 // We can skip all drawing if the damage rect is now empty. |
284 bool skip_drawing_root_render_pass = | 297 bool skip_drawing_root_render_pass = |
285 frame.root_damage_rect.IsEmpty() && allow_empty_swap_; | 298 frame.root_damage_rect.IsEmpty() && allow_empty_swap_; |
286 | 299 |
287 // If we have to draw but don't support partial swap, the whole output should | 300 // If we have to draw but don't support partial swap, the whole output should |
288 // be considered damaged. | 301 // be considered damaged. |
289 if (!skip_drawing_root_render_pass && !use_partial_swap_) | 302 if (!skip_drawing_root_render_pass && !use_partial_swap_) |
290 frame.root_damage_rect = root_render_pass->output_rect; | 303 frame.root_damage_rect = root_render_pass->output_rect; |
291 | 304 |
292 if (skip_drawing_root_render_pass) { | 305 if (skip_drawing_root_render_pass) { |
293 // If any of the overlays is the output surface, then ensure that the | 306 // If any of the overlays is the output surface, then ensure that the |
294 // backbuffer be allocated (allocation of the backbuffer is a side-effect | 307 // backbuffer be allocated (allocation of the backbuffer is a side-effect |
295 // of BindFramebufferToOutputSurface). | 308 // of BindFramebufferToOutputSurface). |
296 for (auto& overlay : frame.overlay_list) { | 309 for (auto& overlay : frame.overlay_list) { |
297 if (overlay.use_output_surface_for_resource) { | 310 if (overlay.use_output_surface_for_resource) { |
298 BindFramebufferToOutputSurface(&frame); | 311 BindFramebufferToOutputSurface(&frame); |
299 break; | 312 break; |
300 } | 313 } |
301 } | 314 } |
302 } else { | 315 } else { |
303 DrawRenderPassAndExecuteCopyRequests(&frame, root_render_pass); | 316 DrawRenderPassAndExecuteCopyRequests(&frame, root_render_pass); |
304 } | 317 } |
305 | 318 |
306 FinishDrawingFrame(&frame); | 319 FinishDrawingFrame(&frame); |
307 render_passes_in_draw_order->clear(); | 320 render_passes_in_draw_order->clear(); |
| 321 render_pass_filters_.clear(); |
| 322 render_pass_background_filters_.clear(); |
308 } | 323 } |
309 | 324 |
310 gfx::Rect DirectRenderer::ComputeScissorRectForRenderPass( | 325 gfx::Rect DirectRenderer::ComputeScissorRectForRenderPass( |
311 const DrawingFrame* frame) { | 326 const DrawingFrame* frame) { |
312 if (frame->current_render_pass == frame->root_render_pass) | 327 if (frame->current_render_pass == frame->root_render_pass) |
313 return frame->root_damage_rect; | 328 return frame->root_damage_rect; |
314 | 329 |
315 // If the root damage rect has been expanded due to overlays, all the other | 330 // If the root damage rect has been expanded due to overlays, all the other |
316 // damage rect calculations are incorrect. | 331 // damage rect calculations are incorrect. |
317 if (!frame->root_render_pass->damage_rect.Contains(frame->root_damage_rect)) | 332 if (!frame->root_render_pass->damage_rect.Contains(frame->root_damage_rect)) |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 return; | 413 return; |
399 } | 414 } |
400 | 415 |
401 std::vector<gfx::QuadF> quads; | 416 std::vector<gfx::QuadF> quads; |
402 poly.ToQuads2D(&quads); | 417 poly.ToQuads2D(&quads); |
403 for (size_t i = 0; i < quads.size(); ++i) { | 418 for (size_t i = 0; i < quads.size(); ++i) { |
404 DoDrawQuad(frame, poly.original_ref(), &quads[i]); | 419 DoDrawQuad(frame, poly.original_ref(), &quads[i]); |
405 } | 420 } |
406 } | 421 } |
407 | 422 |
| 423 const FilterOperations* DirectRenderer::FiltersForPass( |
| 424 const RenderPassId& id) const { |
| 425 auto it = |
| 426 std::lower_bound(render_pass_filters_.begin(), render_pass_filters_.end(), |
| 427 std::pair<RenderPassId, FilterOperations*>(id, nullptr)); |
| 428 if (it != render_pass_filters_.end() && it->first == id) |
| 429 return it->second; |
| 430 return nullptr; |
| 431 } |
| 432 |
| 433 const FilterOperations* DirectRenderer::BackgroundFiltersForPass( |
| 434 const RenderPassId& id) const { |
| 435 auto it = |
| 436 std::lower_bound(render_pass_background_filters_.begin(), |
| 437 render_pass_background_filters_.end(), |
| 438 std::pair<RenderPassId, FilterOperations*>(id, nullptr)); |
| 439 if (it != render_pass_background_filters_.end() && it->first == id) |
| 440 return it->second; |
| 441 return nullptr; |
| 442 } |
| 443 |
408 void DirectRenderer::FlushPolygons( | 444 void DirectRenderer::FlushPolygons( |
409 std::deque<std::unique_ptr<DrawPolygon>>* poly_list, | 445 std::deque<std::unique_ptr<DrawPolygon>>* poly_list, |
410 DrawingFrame* frame, | 446 DrawingFrame* frame, |
411 const gfx::Rect& render_pass_scissor, | 447 const gfx::Rect& render_pass_scissor, |
412 bool use_render_pass_scissor) { | 448 bool use_render_pass_scissor) { |
413 if (poly_list->empty()) { | 449 if (poly_list->empty()) { |
414 return; | 450 return; |
415 } | 451 } |
416 | 452 |
417 BspTree bsp_tree(poly_list); | 453 BspTree bsp_tree(poly_list); |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 auto iter = render_pass_textures_.find(id); | 608 auto iter = render_pass_textures_.find(id); |
573 return iter != render_pass_textures_.end() && iter->second->id(); | 609 return iter != render_pass_textures_.end() && iter->second->id(); |
574 } | 610 } |
575 | 611 |
576 // static | 612 // static |
577 gfx::Size DirectRenderer::RenderPassTextureSize(const RenderPass* render_pass) { | 613 gfx::Size DirectRenderer::RenderPassTextureSize(const RenderPass* render_pass) { |
578 return render_pass->output_rect.size(); | 614 return render_pass->output_rect.size(); |
579 } | 615 } |
580 | 616 |
581 } // namespace cc | 617 } // namespace cc |
OLD | NEW |