1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2014 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #pragma once 18*d57664e9SAndroid Build Coastguard Worker 19*d57664e9SAndroid Build Coastguard Worker #include "FrameInfo.h" 20*d57664e9SAndroid Build Coastguard Worker #include "Properties.h" 21*d57664e9SAndroid Build Coastguard Worker #include "Rect.h" 22*d57664e9SAndroid Build Coastguard Worker #include "utils/RingBuffer.h" 23*d57664e9SAndroid Build Coastguard Worker 24*d57664e9SAndroid Build Coastguard Worker #include <utils/Timers.h> 25*d57664e9SAndroid Build Coastguard Worker 26*d57664e9SAndroid Build Coastguard Worker #include <memory> 27*d57664e9SAndroid Build Coastguard Worker 28*d57664e9SAndroid Build Coastguard Worker namespace android { 29*d57664e9SAndroid Build Coastguard Worker namespace uirenderer { 30*d57664e9SAndroid Build Coastguard Worker 31*d57664e9SAndroid Build Coastguard Worker class IProfileRenderer; 32*d57664e9SAndroid Build Coastguard Worker 33*d57664e9SAndroid Build Coastguard Worker // TODO: This is a bit awkward as it needs to match the thing in CanvasContext 34*d57664e9SAndroid Build Coastguard Worker // A better abstraction here would be nice but iterators are painful 35*d57664e9SAndroid Build Coastguard Worker // and RingBuffer having the size baked into the template is also painful 36*d57664e9SAndroid Build Coastguard Worker // But making DrawProfiler also be templated is ALSO painful 37*d57664e9SAndroid Build Coastguard Worker // At least this is a compile failure if this doesn't match, so there's that. 38*d57664e9SAndroid Build Coastguard Worker typedef RingBuffer<FrameInfo, 120> FrameInfoSource; 39*d57664e9SAndroid Build Coastguard Worker 40*d57664e9SAndroid Build Coastguard Worker class FrameInfoVisualizer { 41*d57664e9SAndroid Build Coastguard Worker public: 42*d57664e9SAndroid Build Coastguard Worker explicit FrameInfoVisualizer(FrameInfoSource& source, nsecs_t frameInterval); 43*d57664e9SAndroid Build Coastguard Worker ~FrameInfoVisualizer(); 44*d57664e9SAndroid Build Coastguard Worker 45*d57664e9SAndroid Build Coastguard Worker bool consumeProperties(); 46*d57664e9SAndroid Build Coastguard Worker void setDensity(float density); 47*d57664e9SAndroid Build Coastguard Worker 48*d57664e9SAndroid Build Coastguard Worker void unionDirty(SkRect* dirty); 49*d57664e9SAndroid Build Coastguard Worker void draw(IProfileRenderer& renderer); 50*d57664e9SAndroid Build Coastguard Worker 51*d57664e9SAndroid Build Coastguard Worker void dumpData(int fd); 52*d57664e9SAndroid Build Coastguard Worker 53*d57664e9SAndroid Build Coastguard Worker private: 54*d57664e9SAndroid Build Coastguard Worker void createData(); 55*d57664e9SAndroid Build Coastguard Worker void destroyData(); 56*d57664e9SAndroid Build Coastguard Worker 57*d57664e9SAndroid Build Coastguard Worker void initializeRects(const int baseline, const int width); 58*d57664e9SAndroid Build Coastguard Worker void nextBarSegment(FrameInfoIndex start, FrameInfoIndex end); 59*d57664e9SAndroid Build Coastguard Worker void drawGraph(IProfileRenderer& renderer); 60*d57664e9SAndroid Build Coastguard Worker void drawThreshold(IProfileRenderer& renderer); 61*d57664e9SAndroid Build Coastguard Worker durationMS(size_t index,FrameInfoIndex start,FrameInfoIndex end)62*d57664e9SAndroid Build Coastguard Worker inline float durationMS(size_t index, FrameInfoIndex start, FrameInfoIndex end) { 63*d57664e9SAndroid Build Coastguard Worker float duration = mFrameSource[index].duration(start, end) * 0.000001f; 64*d57664e9SAndroid Build Coastguard Worker // Clamp to large to avoid spiking off the top of the screen 65*d57664e9SAndroid Build Coastguard Worker duration = duration > 50.0f ? 50.0f : duration; 66*d57664e9SAndroid Build Coastguard Worker return duration > 0.0f ? duration : 0.0f; 67*d57664e9SAndroid Build Coastguard Worker } 68*d57664e9SAndroid Build Coastguard Worker 69*d57664e9SAndroid Build Coastguard Worker ProfileType mType = ProfileType::None; 70*d57664e9SAndroid Build Coastguard Worker float mDensity = 0; 71*d57664e9SAndroid Build Coastguard Worker 72*d57664e9SAndroid Build Coastguard Worker FrameInfoSource& mFrameSource; 73*d57664e9SAndroid Build Coastguard Worker 74*d57664e9SAndroid Build Coastguard Worker nsecs_t mFrameInterval; 75*d57664e9SAndroid Build Coastguard Worker int mVerticalUnit = 0; 76*d57664e9SAndroid Build Coastguard Worker int mThresholdStroke = 0; 77*d57664e9SAndroid Build Coastguard Worker 78*d57664e9SAndroid Build Coastguard Worker int mNumFastRects; 79*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<float[]> mFastRects; 80*d57664e9SAndroid Build Coastguard Worker int mNumJankyRects; 81*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<float[]> mJankyRects; 82*d57664e9SAndroid Build Coastguard Worker 83*d57664e9SAndroid Build Coastguard Worker bool mShowDirtyRegions = false; 84*d57664e9SAndroid Build Coastguard Worker SkRect mDirtyRegion; 85*d57664e9SAndroid Build Coastguard Worker bool mFlashToggle = false; 86*d57664e9SAndroid Build Coastguard Worker nsecs_t mLastFrameLogged = 0; 87*d57664e9SAndroid Build Coastguard Worker }; 88*d57664e9SAndroid Build Coastguard Worker 89*d57664e9SAndroid Build Coastguard Worker } /* namespace uirenderer */ 90*d57664e9SAndroid Build Coastguard Worker } /* namespace android */ 91