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/heads_up_display_layer_impl.h" | 5 #include "cc/layers/heads_up_display_layer_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/numerics/safe_conversions.h" | 10 #include "base/numerics/safe_conversions.h" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 #include "base/trace_event/trace_event.h" | 12 #include "base/trace_event/trace_event.h" |
13 #include "base/trace_event/trace_event_argument.h" | 13 #include "base/trace_event/trace_event_argument.h" |
14 #include "cc/debug/debug_colors.h" | 14 #include "cc/debug/debug_colors.h" |
15 #include "cc/debug/frame_rate_counter.h" | 15 #include "cc/debug/frame_rate_counter.h" |
16 #include "cc/debug/paint_time_counter.h" | |
17 #include "cc/output/begin_frame_args.h" | 16 #include "cc/output/begin_frame_args.h" |
18 #include "cc/output/renderer.h" | 17 #include "cc/output/renderer.h" |
19 #include "cc/quads/texture_draw_quad.h" | 18 #include "cc/quads/texture_draw_quad.h" |
20 #include "cc/resources/memory_history.h" | 19 #include "cc/resources/memory_history.h" |
21 #include "cc/trees/layer_tree_host_impl.h" | 20 #include "cc/trees/layer_tree_host_impl.h" |
22 #include "cc/trees/layer_tree_impl.h" | 21 #include "cc/trees/layer_tree_impl.h" |
23 #include "skia/ext/platform_canvas.h" | 22 #include "skia/ext/platform_canvas.h" |
24 #include "third_party/skia/include/core/SkPaint.h" | 23 #include "third_party/skia/include/core/SkPaint.h" |
25 #include "third_party/skia/include/core/SkPath.h" | 24 #include "third_party/skia/include/core/SkPath.h" |
26 #include "third_party/skia/include/core/SkTypeface.h" | 25 #include "third_party/skia/include/core/SkTypeface.h" |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 base::TimeTicks now = layer_tree_impl()->CurrentBeginFrameArgs().frame_time; | 237 base::TimeTicks now = layer_tree_impl()->CurrentBeginFrameArgs().frame_time; |
239 if (base::TimeDelta(now - time_of_last_graph_update_).InSecondsF() > 0.25f) { | 238 if (base::TimeDelta(now - time_of_last_graph_update_).InSecondsF() > 0.25f) { |
240 time_of_last_graph_update_ = now; | 239 time_of_last_graph_update_ = now; |
241 | 240 |
242 if (debug_state.show_fps_counter) { | 241 if (debug_state.show_fps_counter) { |
243 FrameRateCounter* fps_counter = layer_tree_impl()->frame_rate_counter(); | 242 FrameRateCounter* fps_counter = layer_tree_impl()->frame_rate_counter(); |
244 fps_graph_.value = fps_counter->GetAverageFPS(); | 243 fps_graph_.value = fps_counter->GetAverageFPS(); |
245 fps_counter->GetMinAndMaxFPS(&fps_graph_.min, &fps_graph_.max); | 244 fps_counter->GetMinAndMaxFPS(&fps_graph_.min, &fps_graph_.max); |
246 } | 245 } |
247 | 246 |
248 if (debug_state.continuous_painting) { | |
249 PaintTimeCounter* paint_time_counter = | |
250 layer_tree_impl()->paint_time_counter(); | |
251 base::TimeDelta latest, min, max; | |
252 | |
253 if (paint_time_counter->End()) | |
254 latest = **paint_time_counter->End(); | |
255 paint_time_counter->GetMinAndMaxPaintTime(&min, &max); | |
256 | |
257 paint_time_graph_.value = latest.InMillisecondsF(); | |
258 paint_time_graph_.min = min.InMillisecondsF(); | |
259 paint_time_graph_.max = max.InMillisecondsF(); | |
260 } | |
261 | |
262 if (debug_state.ShowMemoryStats()) { | 247 if (debug_state.ShowMemoryStats()) { |
263 MemoryHistory* memory_history = layer_tree_impl()->memory_history(); | 248 MemoryHistory* memory_history = layer_tree_impl()->memory_history(); |
264 if (memory_history->End()) | 249 if (memory_history->End()) |
265 memory_entry_ = **memory_history->End(); | 250 memory_entry_ = **memory_history->End(); |
266 else | 251 else |
267 memory_entry_ = MemoryHistory::Entry(); | 252 memory_entry_ = MemoryHistory::Entry(); |
268 } | 253 } |
269 } | 254 } |
270 | 255 |
271 fps_graph_.UpdateUpperBound(); | 256 fps_graph_.UpdateUpperBound(); |
272 paint_time_graph_.UpdateUpperBound(); | 257 paint_time_graph_.UpdateUpperBound(); |
273 } | 258 } |
274 | 259 |
275 void HeadsUpDisplayLayerImpl::DrawHudContents(SkCanvas* canvas) { | 260 void HeadsUpDisplayLayerImpl::DrawHudContents(SkCanvas* canvas) { |
276 const LayerTreeDebugState& debug_state = layer_tree_impl()->debug_state(); | 261 const LayerTreeDebugState& debug_state = layer_tree_impl()->debug_state(); |
277 | 262 |
278 if (debug_state.ShowHudRects()) { | 263 if (debug_state.ShowHudRects()) { |
279 DrawDebugRects(canvas, layer_tree_impl()->debug_rect_history()); | 264 DrawDebugRects(canvas, layer_tree_impl()->debug_rect_history()); |
280 if (IsAnimatingHUDContents()) { | 265 if (IsAnimatingHUDContents()) { |
281 layer_tree_impl()->SetNeedsRedraw(); | 266 layer_tree_impl()->SetNeedsRedraw(); |
282 } | 267 } |
283 } | 268 } |
284 | 269 |
285 SkRect area = SkRect::MakeEmpty(); | 270 if (!debug_state.show_fps_counter) |
286 if (debug_state.continuous_painting) { | 271 return; |
287 area = DrawPaintTimeDisplay( | |
288 canvas, layer_tree_impl()->paint_time_counter(), 0, 0); | |
289 } else if (debug_state.show_fps_counter) { | |
290 // Don't show the FPS display when continuous painting is enabled, because | |
291 // it would show misleading numbers. | |
292 area = | |
293 DrawFPSDisplay(canvas, layer_tree_impl()->frame_rate_counter(), 0, 0); | |
294 } | |
295 | 272 |
296 if (debug_state.show_fps_counter || debug_state.continuous_painting) { | 273 SkRect area = |
297 area = DrawGpuRasterizationStatus(canvas, 0, area.bottom(), | 274 DrawFPSDisplay(canvas, layer_tree_impl()->frame_rate_counter(), 0, 0); |
298 SkMaxScalar(area.width(), 150)); | 275 DrawGpuRasterizationStatus(canvas, 0, area.bottom(), |
299 } | 276 SkMaxScalar(area.width(), 150)); |
300 | 277 |
301 if (debug_state.ShowMemoryStats()) | 278 if (debug_state.ShowMemoryStats()) |
302 DrawMemoryDisplay(canvas, 0, area.bottom(), SkMaxScalar(area.width(), 150)); | 279 DrawMemoryDisplay(canvas, 0, area.bottom(), SkMaxScalar(area.width(), 150)); |
303 } | 280 } |
304 int HeadsUpDisplayLayerImpl::MeasureText(SkPaint* paint, | 281 int HeadsUpDisplayLayerImpl::MeasureText(SkPaint* paint, |
305 const std::string& text, | 282 const std::string& text, |
306 int size) const { | 283 int size) const { |
307 const bool anti_alias = paint->isAntiAlias(); | 284 const bool anti_alias = paint->isAntiAlias(); |
308 paint->setAntiAlias(true); | 285 paint->setAntiAlias(true); |
309 paint->setTextSize(size); | 286 paint->setTextSize(size); |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
614 | 591 |
615 paint.setColor(color); | 592 paint.setColor(color); |
616 DrawText(canvas, &paint, "GPU raster: ", SkPaint::kLeft_Align, kFontHeight, | 593 DrawText(canvas, &paint, "GPU raster: ", SkPaint::kLeft_Align, kFontHeight, |
617 left + kPadding, top + kFontHeight + kPadding); | 594 left + kPadding, top + kFontHeight + kPadding); |
618 DrawText(canvas, &paint, status, SkPaint::kRight_Align, kFontHeight, | 595 DrawText(canvas, &paint, status, SkPaint::kRight_Align, kFontHeight, |
619 gpu_status_pos); | 596 gpu_status_pos); |
620 | 597 |
621 return area; | 598 return area; |
622 } | 599 } |
623 | 600 |
624 SkRect HeadsUpDisplayLayerImpl::DrawPaintTimeDisplay( | |
625 SkCanvas* canvas, | |
626 const PaintTimeCounter* paint_time_counter, | |
627 int right, | |
628 int top) const { | |
629 const int kPadding = 4; | |
630 const int kFontHeight = 14; | |
631 | |
632 const int kGraphWidth = | |
633 base::saturated_cast<int>(paint_time_counter->HistorySize()); | |
634 const int kGraphHeight = 40; | |
635 | |
636 SkPaint paint = CreatePaint(); | |
637 | |
638 const std::string title = "Compositor frame time (ms)"; | |
639 int title_text_width = MeasureText(&paint, title, kFontHeight); | |
640 int contents_width = std::max(title_text_width, kGraphWidth); | |
641 | |
642 const int width = contents_width + 2 * kPadding; | |
643 const int height = | |
644 kFontHeight + kGraphHeight + 4 * kPadding + 2 + kFontHeight + kPadding; | |
645 const int left = bounds().width() - width - right; | |
646 | |
647 const SkRect area = SkRect::MakeXYWH(left, top, width, height); | |
648 | |
649 DrawGraphBackground(canvas, &paint, area); | |
650 | |
651 SkRect text_bounds = SkRect::MakeXYWH(left + kPadding, top + kPadding, | |
652 contents_width, kFontHeight); | |
653 SkRect text_bounds2 = | |
654 SkRect::MakeXYWH(left + kPadding, text_bounds.bottom() + kPadding, | |
655 contents_width, kFontHeight); | |
656 SkRect graph_bounds = SkRect::MakeXYWH(left + (width - kGraphWidth) / 2, | |
657 text_bounds2.bottom() + 2 * kPadding, | |
658 kGraphWidth, kGraphHeight); | |
659 | |
660 const std::string value_text = | |
661 base::StringPrintf("%.1f", paint_time_graph_.value); | |
662 const std::string min_max_text = base::StringPrintf( | |
663 "%.1f-%.1f", paint_time_graph_.min, paint_time_graph_.max); | |
664 | |
665 paint.setColor(DebugColors::PaintTimeDisplayTextAndGraphColor()); | |
666 DrawText(canvas, &paint, title, SkPaint::kLeft_Align, kFontHeight, | |
667 text_bounds.left(), text_bounds.bottom()); | |
668 DrawText(canvas, | |
669 &paint, | |
670 value_text, | |
671 SkPaint::kLeft_Align, | |
672 kFontHeight, | |
673 text_bounds2.left(), | |
674 text_bounds2.bottom()); | |
675 DrawText(canvas, | |
676 &paint, | |
677 min_max_text, | |
678 SkPaint::kRight_Align, | |
679 kFontHeight, | |
680 text_bounds2.right(), | |
681 text_bounds2.bottom()); | |
682 | |
683 paint.setColor(DebugColors::PaintTimeDisplayTextAndGraphColor()); | |
684 for (PaintTimeCounter::RingBufferType::Iterator it = | |
685 paint_time_counter->End(); | |
686 it; | |
687 --it) { | |
688 double pt = it->InMillisecondsF(); | |
689 | |
690 if (pt == 0.0) | |
691 continue; | |
692 | |
693 double p = pt / paint_time_graph_.current_upper_bound; | |
694 if (p > 1.0) | |
695 p = 1.0; | |
696 | |
697 canvas->drawRect( | |
698 SkRect::MakeXYWH(graph_bounds.left() + it.index(), | |
699 graph_bounds.bottom() - p * graph_bounds.height(), | |
700 1, | |
701 p * graph_bounds.height()), | |
702 paint); | |
703 } | |
704 | |
705 DrawGraphLines(canvas, &paint, graph_bounds, paint_time_graph_); | |
706 | |
707 return area; | |
708 } | |
709 | |
710 void HeadsUpDisplayLayerImpl::DrawDebugRect( | 601 void HeadsUpDisplayLayerImpl::DrawDebugRect( |
711 SkCanvas* canvas, | 602 SkCanvas* canvas, |
712 SkPaint* paint, | 603 SkPaint* paint, |
713 const DebugRect& rect, | 604 const DebugRect& rect, |
714 SkColor stroke_color, | 605 SkColor stroke_color, |
715 SkColor fill_color, | 606 SkColor fill_color, |
716 float stroke_width, | 607 float stroke_width, |
717 const std::string& label_text) const { | 608 const std::string& label_text) const { |
718 gfx::Rect debug_layer_rect = | 609 gfx::Rect debug_layer_rect = |
719 gfx::ScaleToEnclosingRect(rect.rect, 1.0 / internal_contents_scale_, | 610 gfx::ScaleToEnclosingRect(rect.rect, 1.0 / internal_contents_scale_, |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
866 return "cc::HeadsUpDisplayLayerImpl"; | 757 return "cc::HeadsUpDisplayLayerImpl"; |
867 } | 758 } |
868 | 759 |
869 void HeadsUpDisplayLayerImpl::AsValueInto( | 760 void HeadsUpDisplayLayerImpl::AsValueInto( |
870 base::trace_event::TracedValue* dict) const { | 761 base::trace_event::TracedValue* dict) const { |
871 LayerImpl::AsValueInto(dict); | 762 LayerImpl::AsValueInto(dict); |
872 dict->SetString("layer_name", "Heads Up Display Layer"); | 763 dict->SetString("layer_name", "Heads Up Display Layer"); |
873 } | 764 } |
874 | 765 |
875 } // namespace cc | 766 } // namespace cc |
OLD | NEW |