Unify DrawProfiler/JankStats
Bug: 20822400
Change-Id: I24345c3120440bfce14e8cbe7e880b39f10b744a
diff --git a/libs/hwui/FrameInfoVisualizer.h b/libs/hwui/FrameInfoVisualizer.h
new file mode 100644
index 0000000..f62e34d
--- /dev/null
+++ b/libs/hwui/FrameInfoVisualizer.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef DRAWPROFILER_H
+#define DRAWPROFILER_H
+
+#include "FrameInfo.h"
+#include "Properties.h"
+#include "Rect.h"
+#include "utils/RingBuffer.h"
+
+#include <utils/Timers.h>
+
+#include <memory>
+
+namespace android {
+namespace uirenderer {
+
+class OpenGLRenderer;
+
+// TODO: This is a bit awkward as it needs to match the thing in CanvasContext
+// A better abstraction here would be nice but iterators are painful
+// and RingBuffer having the size baked into the template is also painful
+// But making DrawProfiler also be templated is ALSO painful
+// At least this is a compile failure if this doesn't match, so there's that.
+typedef RingBuffer<FrameInfo, 120> FrameInfoSource;
+
+class FrameInfoVisualizer {
+public:
+ FrameInfoVisualizer(FrameInfoSource& source);
+ ~FrameInfoVisualizer();
+
+ bool consumeProperties();
+ void setDensity(float density);
+
+ void unionDirty(SkRect* dirty);
+ void draw(OpenGLRenderer* canvas);
+
+ void dumpData(int fd);
+
+private:
+ void createData();
+ void destroyData();
+
+ void addRect(Rect& r, float data, float* shapeOutput);
+ void prepareShapes(const int baseline);
+ void drawGraph(OpenGLRenderer* canvas);
+ void drawCurrentFrame(OpenGLRenderer* canvas);
+ void drawThreshold(OpenGLRenderer* canvas);
+
+ static inline float duration(nsecs_t start, nsecs_t end) {
+ float duration = ((end - start) * 0.000001f);
+ return duration > 0.0f ? duration : 0.0f;
+ }
+
+ inline float recordDuration(size_t index) {
+ return duration(
+ mFrameSource[index][FrameInfoIndex::kIntendedVsync],
+ mFrameSource[index][FrameInfoIndex::kSyncStart]);
+ }
+
+ inline float prepareDuration(size_t index) {
+ return duration(
+ mFrameSource[index][FrameInfoIndex::kSyncStart],
+ mFrameSource[index][FrameInfoIndex::kIssueDrawCommandsStart]);
+ }
+
+ inline float issueDrawDuration(size_t index) {
+ return duration(
+ mFrameSource[index][FrameInfoIndex::kIssueDrawCommandsStart],
+ mFrameSource[index][FrameInfoIndex::kSwapBuffers]);
+ }
+
+ inline float swapBuffersDuration(size_t index) {
+ return duration(
+ mFrameSource[index][FrameInfoIndex::kSwapBuffers],
+ mFrameSource[index][FrameInfoIndex::kFrameCompleted]);
+ }
+
+ ProfileType mType = ProfileType::None;
+ float mDensity = 0;
+
+ FrameInfoSource& mFrameSource;
+
+ int mVerticalUnit = 0;
+ int mHorizontalUnit = 0;
+ int mThresholdStroke = 0;
+
+ /*
+ * mRects represents an array of rect shapes, divided into NUM_ELEMENTS
+ * groups such that each group is drawn with the same paint.
+ * For example mRects[0] is the array of rect floats suitable for
+ * OpenGLRenderer:drawRects() that makes up all the FrameTimingData:record
+ * information.
+ */
+ std::unique_ptr<float*> mRects;
+
+ bool mShowDirtyRegions = false;
+ SkRect mDirtyRegion;
+ bool mFlashToggle = false;
+ nsecs_t mLastFrameLogged = 0;
+};
+
+} /* namespace uirenderer */
+} /* namespace android */
+
+#endif /* DRAWPROFILER_H */