Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(176)

Side by Side Diff: cc/output/direct_renderer.cc

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

Powered by Google App Engine
This is Rietveld 408576698