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

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

Issue 1044093005: Preliminary compositor disabling patch. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months 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
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 <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/containers/hash_tables.h" 10 #include "base/containers/hash_tables.h"
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 TRACE_EVENT0("cc", "DirectRenderer::DrawFrame"); 202 TRACE_EVENT0("cc", "DirectRenderer::DrawFrame");
203 UMA_HISTOGRAM_COUNTS("Renderer4.renderPassCount", 203 UMA_HISTOGRAM_COUNTS("Renderer4.renderPassCount",
204 render_passes_in_draw_order->size()); 204 render_passes_in_draw_order->size());
205 205
206 const RenderPass* root_render_pass = render_passes_in_draw_order->back(); 206 const RenderPass* root_render_pass = render_passes_in_draw_order->back();
207 DCHECK(root_render_pass); 207 DCHECK(root_render_pass);
208 208
209 DrawingFrame frame; 209 DrawingFrame frame;
210 frame.render_passes_in_draw_order = render_passes_in_draw_order; 210 frame.render_passes_in_draw_order = render_passes_in_draw_order;
211 frame.root_render_pass = root_render_pass; 211 frame.root_render_pass = root_render_pass;
212
213 overlay_processor_->ProcessForOverlays(render_passes_in_draw_order,
214 &frame.overlay_list);
215
216 // Merge quad damage for the root pass.
217 render_passes_in_draw_order->back()->UnionOverlayDamage();
218
212 frame.root_damage_rect = Capabilities().using_partial_swap 219 frame.root_damage_rect = Capabilities().using_partial_swap
213 ? root_render_pass->damage_rect 220 ? root_render_pass->damage_rect
214 : root_render_pass->output_rect; 221 : root_render_pass->output_rect;
215 frame.root_damage_rect.Intersect(gfx::Rect(device_viewport_rect.size())); 222 frame.root_damage_rect.Intersect(gfx::Rect(device_viewport_rect.size()));
216 frame.device_viewport_rect = device_viewport_rect; 223 frame.device_viewport_rect = device_viewport_rect;
217 frame.device_clip_rect = device_clip_rect; 224 frame.device_clip_rect = device_clip_rect;
218 frame.disable_picture_quad_image_filtering = 225 frame.disable_picture_quad_image_filtering =
219 disable_picture_quad_image_filtering; 226 disable_picture_quad_image_filtering;
220 227
221 overlay_processor_->ProcessForOverlays(render_passes_in_draw_order, 228 if (root_render_pass->damage_rect.IsEmpty()) {
222 &frame.overlay_list); 229 // If we have a scene that is composed of only overlays then we can
230 // potentially avoid drawing anything. However, if there are any copy
231 // requests we must do the drawing.
232 auto copy_pass = std::find_if(
233 render_passes_in_draw_order->begin(),
234 render_passes_in_draw_order->end(),
235 [](const RenderPass* pass) { return !pass->copy_requests.empty(); });
236 if (copy_pass == render_passes_in_draw_order->end()) {
237 ScheduleOverlays(&frame);
238 render_passes_in_draw_order->clear();
239 return;
240 }
241 }
223 242
224 EnsureBackbuffer(); 243 EnsureBackbuffer();
225 244
226 // Only reshape when we know we are going to draw. Otherwise, the reshape 245 // Only reshape when we know we are going to draw. Otherwise, the reshape
227 // can leave the window at the wrong size if we never draw and the proper 246 // can leave the window at the wrong size if we never draw and the proper
228 // viewport size is never set. 247 // viewport size is never set.
229 output_surface_->Reshape(device_viewport_rect.size(), device_scale_factor); 248 output_surface_->Reshape(device_viewport_rect.size(), device_scale_factor);
230 249
231 BeginDrawingFrame(&frame); 250 BeginDrawingFrame(&frame);
232 for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { 251 for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) {
233 RenderPass* pass = render_passes_in_draw_order->at(i); 252 RenderPass* pass = render_passes_in_draw_order->at(i);
234 DrawRenderPass(&frame, pass); 253 DrawRenderPass(&frame, pass);
235 254
236 for (ScopedPtrVector<CopyOutputRequest>::iterator it = 255 for (ScopedPtrVector<CopyOutputRequest>::iterator it =
237 pass->copy_requests.begin(); 256 pass->copy_requests.begin();
238 it != pass->copy_requests.end(); 257 it != pass->copy_requests.end();
239 ++it) { 258 ++it) {
240 if (it != pass->copy_requests.begin()) { 259 if (it != pass->copy_requests.begin()) {
241 // Doing a readback is destructive of our state on Mac, so make sure 260 // Doing a readback is destructive of our state on Mac, so make sure
242 // we restore the state between readbacks. http://crbug.com/99393. 261 // we restore the state between readbacks. http://crbug.com/99393.
243 UseRenderPass(&frame, pass); 262 UseRenderPass(&frame, pass);
244 } 263 }
245 CopyCurrentRenderPassToBitmap(&frame, pass->copy_requests.take(it)); 264 CopyCurrentRenderPassToBitmap(&frame, pass->copy_requests.take(it));
246 } 265 }
247 } 266 }
248 FinishDrawingFrame(&frame); 267 FinishDrawingFrame(&frame);
268 ScheduleOverlays(&frame);
249 269
250 render_passes_in_draw_order->clear(); 270 render_passes_in_draw_order->clear();
251 } 271 }
252 272
253 gfx::Rect DirectRenderer::ComputeScissorRectForRenderPass( 273 gfx::Rect DirectRenderer::ComputeScissorRectForRenderPass(
254 const DrawingFrame* frame) { 274 const DrawingFrame* frame) {
255 gfx::Rect render_pass_scissor = frame->current_render_pass->output_rect; 275 gfx::Rect render_pass_scissor = frame->current_render_pass->output_rect;
256 276
257 if (frame->root_damage_rect == frame->root_render_pass->output_rect || 277 if (frame->root_damage_rect == frame->root_render_pass->output_rect ||
258 !frame->current_render_pass->copy_requests.empty()) 278 !frame->current_render_pass->copy_requests.empty())
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 ScopedResource* texture = render_pass_textures_.get(id); 514 ScopedResource* texture = render_pass_textures_.get(id);
495 return texture && texture->id(); 515 return texture && texture->id();
496 } 516 }
497 517
498 // static 518 // static
499 gfx::Size DirectRenderer::RenderPassTextureSize(const RenderPass* render_pass) { 519 gfx::Size DirectRenderer::RenderPassTextureSize(const RenderPass* render_pass) {
500 return render_pass->output_rect.size(); 520 return render_pass->output_rect.size();
501 } 521 }
502 522
503 } // namespace cc 523 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698