OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "VulkanViewer.h" | 8 #include "VulkanViewer.h" |
9 | 9 |
10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
(...skipping 13 matching lines...) Expand all Loading... | |
24 | 24 |
25 return vv->onKey(key, state, modifiers); | 25 return vv->onKey(key, state, modifiers); |
26 } | 26 } |
27 | 27 |
28 static void on_paint_handler(SkCanvas* canvas, void* userData) { | 28 static void on_paint_handler(SkCanvas* canvas, void* userData) { |
29 VulkanViewer* vv = reinterpret_cast<VulkanViewer*>(userData); | 29 VulkanViewer* vv = reinterpret_cast<VulkanViewer*>(userData); |
30 | 30 |
31 return vv->onPaint(canvas); | 31 return vv->onPaint(canvas); |
32 } | 32 } |
33 | 33 |
34 VulkanViewer::VulkanViewer(int argc, char** argv, void* platformData) : | 34 VulkanViewer::VulkanViewer(int argc, char** argv, void* platformData) |
35 fGMs(skiagm::GMRegistry::Head()){ | 35 : fGMs(skiagm::GMRegistry::Head()) |
36 , fCurrentMeasurement(0) { | |
37 memset(fMeasurements, 0, sizeof(fMeasurements)); | |
36 | 38 |
37 fWindow = Window::CreateNativeWindow(platformData); | 39 fWindow = Window::CreateNativeWindow(platformData); |
38 fWindow->attach(Window::kVulkan_BackendType, 0, nullptr); | 40 fWindow->attach(Window::kVulkan_BackendType, 0, nullptr); |
39 | 41 |
40 // register callbacks | 42 // register callbacks |
41 fWindow->registerKeyFunc(on_key_handler, this); | 43 fWindow->registerKeyFunc(on_key_handler, this); |
42 fWindow->registerPaintFunc(on_paint_handler, this); | 44 fWindow->registerPaintFunc(on_paint_handler, this); |
43 | 45 |
44 fWindow->setTitle("VulkanViewer"); | 46 SkAutoTDelete<skiagm::GM> gm(fGMs->factory()(nullptr)); |
47 SkString title("VulkanViewer: "); | |
48 title.append(gm->getName()); | |
49 fWindow->setTitle(title.c_str()); | |
45 fWindow->show(); | 50 fWindow->show(); |
46 } | 51 } |
47 | 52 |
48 VulkanViewer::~VulkanViewer() { | 53 VulkanViewer::~VulkanViewer() { |
49 fWindow->detach(); | 54 fWindow->detach(); |
50 delete fWindow; | 55 delete fWindow; |
51 } | 56 } |
52 | 57 |
53 bool VulkanViewer::onKey(Window::Key key, Window::InputState state, uint32_t mod ifiers) { | 58 bool VulkanViewer::onKey(Window::Key key, Window::InputState state, uint32_t mod ifiers) { |
54 if (Window::kDown_InputState == state && (modifiers & Window::kFirstPress_Mo difierKey) && | 59 if (Window::kDown_InputState == state && (modifiers & Window::kFirstPress_Mo difierKey) && |
55 key == Window::kRight_Key) { | 60 key == Window::kRight_Key) { |
56 fGMs = fGMs->next(); | 61 fGMs = fGMs->next(); |
57 } | 62 SkAutoTDelete<skiagm::GM> gm(fGMs->factory()(nullptr)); |
63 SkString title("VulkanViewer: "); | |
64 title.append(gm->getName()); | |
65 fWindow->setTitle(title.c_str()); | |
66 } | |
58 | 67 |
59 return true; | 68 return true; |
60 } | 69 } |
61 | 70 |
62 void VulkanViewer::onPaint(SkCanvas* canvas) { | 71 void VulkanViewer::onPaint(SkCanvas* canvas) { |
63 SkAutoTDelete<skiagm::GM> gm(fGMs->factory()(nullptr)); | 72 SkAutoTDelete<skiagm::GM> gm(fGMs->factory()(nullptr)); |
64 | 73 |
65 canvas->save(); | 74 canvas->save(); |
75 gm->draw(canvas); | |
76 canvas->restore(); | |
66 | 77 |
67 gm->draw(canvas); | 78 drawStats(canvas); |
79 } | |
80 | |
81 void VulkanViewer::drawStats(SkCanvas* canvas) { | |
82 static const float kPixelPerMS = 2.0f; | |
83 static const int kDisplayWidth = 130; | |
84 static const int kDisplayHeight = 100; | |
85 static const int kDisplayPadding = 10; | |
86 static const int kGraphPadding = 3; | |
87 static const SkScalar kBaseMS = 1000.f / 60.f; // ms/frame to hit 60 fps | |
88 | |
89 SkISize canvasSize = canvas->getDeviceSize(); | |
90 SkRect rect = SkRect::MakeXYWH(SkIntToScalar(canvasSize.fWidth - kDisplayWid th - kDisplayPadding), | |
egdaniel
2016/04/07 17:03:16
100 chars
jvanverth1
2016/04/07 17:57:03
Done.
| |
91 SkIntToScalar(kDisplayPadding), | |
92 SkIntToScalar(kDisplayWidth), SkIntToScalar(k DisplayHeight)); | |
93 SkPaint paint; | |
94 canvas->save(); | |
95 | |
96 canvas->clipRect(rect); | |
97 paint.setColor(SK_ColorBLACK); | |
98 canvas->drawRect(rect, paint); | |
99 // draw the 16ms line | |
100 paint.setColor(SK_ColorLTGRAY); | |
101 canvas->drawLine(rect.fLeft, rect.fBottom - kBaseMS*kPixelPerMS, | |
102 rect.fRight, rect.fBottom - kBaseMS*kPixelPerMS, paint); | |
103 paint.setColor(SK_ColorRED); | |
104 paint.setStyle(SkPaint::kStroke_Style); | |
105 canvas->drawRect(rect, paint); | |
106 | |
107 int x = SkScalarTruncToInt(rect.fLeft) + kGraphPadding; | |
108 const int xStep = 2; | |
109 const int startY = SkScalarTruncToInt(rect.fBottom); | |
110 int i = fCurrentMeasurement; | |
111 do { | |
112 int endY = startY - (int)(fMeasurements[i] * kPixelPerMS + 0.5); // rou nd to nearest value | |
113 canvas->drawLine(SkIntToScalar(x), SkIntToScalar(startY), | |
114 SkIntToScalar(x), SkIntToScalar(endY), paint); | |
115 i++; | |
116 i &= (kMeasurementCount - 1); // fast mod | |
117 x += xStep; | |
118 } while (i != fCurrentMeasurement); | |
68 | 119 |
69 canvas->restore(); | 120 canvas->restore(); |
70 } | 121 } |
71 | 122 |
72 void VulkanViewer::onIdle(float dt) { | 123 void VulkanViewer::onIdle(double ms) { |
124 // Record measurements | |
125 fMeasurements[fCurrentMeasurement++] = ms; | |
126 fCurrentMeasurement &= (kMeasurementCount - 1); // fast mod | |
127 SkASSERT(fCurrentMeasurement < kMeasurementCount); | |
128 | |
73 fWindow->onPaint(); | 129 fWindow->onPaint(); |
74 } | 130 } |
OLD | NEW |