1ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck/* 2ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * Copyright (C) 2015 The Android Open Source Project 3ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * 4ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * you may not use this file except in compliance with the License. 6ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * You may obtain a copy of the License at 7ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * 8ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * http://www.apache.org/licenses/LICENSE-2.0 9ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * 10ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * Unless required by applicable law or agreed to in writing, software 11ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * distributed under the License is distributed on an "AS IS" BASIS, 12ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * See the License for the specific language governing permissions and 14ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * limitations under the License. 15ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck */ 16ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 17ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckpackage android.view; 18ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 19ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckimport android.annotation.IntDef; 20ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 21ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckimport java.lang.annotation.Retention; 22ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckimport java.lang.annotation.RetentionPolicy; 23ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 24ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck/** 25ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * Class that contains all the timing information for the current frame. This 26ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * is used in conjunction with the hardware renderer to provide 27ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * continous-monitoring jank events 28ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * 29ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * All times in nanoseconds from CLOCK_MONOTONIC/System.nanoTime() 30ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * 31ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * To minimize overhead from System.nanoTime() calls we infer durations of 32ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * things by knowing the ordering of the events. For example, to know how 33ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * long layout & measure took it's displayListRecordStart - performTraversalsStart. 34ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * 35ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * These constants must be kept in sync with FrameInfo.h in libhwui and are 36ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * used for indexing into AttachInfo's mFrameInfo long[], which is intended 37ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * to be quick to pass down to native via JNI, hence a pre-packed format 38ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * 39ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * @hide 40ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck */ 41ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckfinal class FrameInfo { 42ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 43ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck long[] mFrameInfo = new long[9]; 44ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 45ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck // Various flags set to provide extra metadata about the current frame 46ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck private static final int FLAGS = 0; 47ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 48ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck // Is this the first-draw following a window layout? 49ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck public static final long FLAG_WINDOW_LAYOUT_CHANGED = 1; 50ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 51ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck @IntDef(flag = true, value = { 52ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck FLAG_WINDOW_LAYOUT_CHANGED }) 53ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck @Retention(RetentionPolicy.SOURCE) 54ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck public @interface FrameInfoFlags {} 55ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 56ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck // The intended vsync time, unadjusted by jitter 57ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck private static final int INTENDED_VSYNC = 1; 58ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 59ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck // Jitter-adjusted vsync time, this is what was used as input into the 60ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck // animation & drawing system 61ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck private static final int VSYNC = 2; 62ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 63ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck // The time of the oldest input event 64ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck private static final int OLDEST_INPUT_EVENT = 3; 65ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 66ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck // The time of the newest input event 67ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck private static final int NEWEST_INPUT_EVENT = 4; 68ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 69ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck // When input event handling started 70ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck private static final int HANDLE_INPUT_START = 5; 71ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 72ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck // When animation evaluations started 73ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck private static final int ANIMATION_START = 6; 74ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 75ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck // When ViewRootImpl#performTraversals() started 76ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck private static final int PERFORM_TRAVERSALS_START = 7; 77ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 78ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck // When View:draw() started 79ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck private static final int DRAW_START = 8; 80ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 81ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck public void setVsync(long intendedVsync, long usedVsync) { 82ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck mFrameInfo[INTENDED_VSYNC] = intendedVsync; 83ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck mFrameInfo[VSYNC] = usedVsync; 84ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck mFrameInfo[OLDEST_INPUT_EVENT] = Long.MAX_VALUE; 85ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck mFrameInfo[NEWEST_INPUT_EVENT] = 0; 86ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck mFrameInfo[FLAGS] = 0; 87ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 88ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 89ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck public void updateInputEventTime(long inputEventTime, long inputEventOldestTime) { 90ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck if (inputEventOldestTime < mFrameInfo[OLDEST_INPUT_EVENT]) { 91ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck mFrameInfo[OLDEST_INPUT_EVENT] = inputEventOldestTime; 92ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 93ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck if (inputEventTime > mFrameInfo[NEWEST_INPUT_EVENT]) { 94ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck mFrameInfo[NEWEST_INPUT_EVENT] = inputEventTime; 95ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 96ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 97ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 98ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck public void markInputHandlingStart() { 99ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck mFrameInfo[HANDLE_INPUT_START] = System.nanoTime(); 100ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 101ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 102ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck public void markAnimationsStart() { 103ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck mFrameInfo[ANIMATION_START] = System.nanoTime(); 104ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 105ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 106ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck public void markPerformTraversalsStart() { 107ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck mFrameInfo[PERFORM_TRAVERSALS_START] = System.nanoTime(); 108ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 109ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 110ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck public void markDrawStart() { 111ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck mFrameInfo[DRAW_START] = System.nanoTime(); 112ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 113ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 114ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck public void addFlags(@FrameInfoFlags long flags) { 115ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck mFrameInfo[FLAGS] |= flags; 116ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 117ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 118ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck} 119