1*35238bceSAndroid Build Coastguard Worker #ifndef _GLSCALIBRATION_HPP 2*35238bceSAndroid Build Coastguard Worker #define _GLSCALIBRATION_HPP 3*35238bceSAndroid Build Coastguard Worker /*------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL (ES) Module 5*35238bceSAndroid Build Coastguard Worker * ----------------------------------------------- 6*35238bceSAndroid Build Coastguard Worker * 7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project 8*35238bceSAndroid Build Coastguard Worker * 9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at 12*35238bceSAndroid Build Coastguard Worker * 13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 14*35238bceSAndroid Build Coastguard Worker * 15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 19*35238bceSAndroid Build Coastguard Worker * limitations under the License. 20*35238bceSAndroid Build Coastguard Worker * 21*35238bceSAndroid Build Coastguard Worker *//*! 22*35238bceSAndroid Build Coastguard Worker * \file 23*35238bceSAndroid Build Coastguard Worker * \brief Calibration tools. 24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 25*35238bceSAndroid Build Coastguard Worker 26*35238bceSAndroid Build Coastguard Worker #include "tcuDefs.hpp" 27*35238bceSAndroid Build Coastguard Worker #include "tcuTestCase.hpp" 28*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp" 29*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp" 30*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp" 31*35238bceSAndroid Build Coastguard Worker 32*35238bceSAndroid Build Coastguard Worker #include <limits> 33*35238bceSAndroid Build Coastguard Worker 34*35238bceSAndroid Build Coastguard Worker namespace deqp 35*35238bceSAndroid Build Coastguard Worker { 36*35238bceSAndroid Build Coastguard Worker namespace gls 37*35238bceSAndroid Build Coastguard Worker { 38*35238bceSAndroid Build Coastguard Worker 39*35238bceSAndroid Build Coastguard Worker struct LineParameters 40*35238bceSAndroid Build Coastguard Worker { 41*35238bceSAndroid Build Coastguard Worker float offset; 42*35238bceSAndroid Build Coastguard Worker float coefficient; 43*35238bceSAndroid Build Coastguard Worker LineParametersdeqp::gls::LineParameters44*35238bceSAndroid Build Coastguard Worker LineParameters(float offset_, float coefficient_) : offset(offset_), coefficient(coefficient_) 45*35238bceSAndroid Build Coastguard Worker { 46*35238bceSAndroid Build Coastguard Worker } 47*35238bceSAndroid Build Coastguard Worker }; 48*35238bceSAndroid Build Coastguard Worker 49*35238bceSAndroid Build Coastguard Worker // Basic Theil-Sen linear estimate. Calculates median of all possible slope coefficients through two of the data points 50*35238bceSAndroid Build Coastguard Worker // and median of offsets corresponding with the median slope 51*35238bceSAndroid Build Coastguard Worker LineParameters theilSenLinearRegression(const std::vector<tcu::Vec2> &dataPoints); 52*35238bceSAndroid Build Coastguard Worker 53*35238bceSAndroid Build Coastguard Worker struct LineParametersWithConfidence 54*35238bceSAndroid Build Coastguard Worker { 55*35238bceSAndroid Build Coastguard Worker float offset; 56*35238bceSAndroid Build Coastguard Worker float offsetConfidenceUpper; 57*35238bceSAndroid Build Coastguard Worker float offsetConfidenceLower; 58*35238bceSAndroid Build Coastguard Worker 59*35238bceSAndroid Build Coastguard Worker float coefficient; 60*35238bceSAndroid Build Coastguard Worker float coefficientConfidenceUpper; 61*35238bceSAndroid Build Coastguard Worker float coefficientConfidenceLower; 62*35238bceSAndroid Build Coastguard Worker 63*35238bceSAndroid Build Coastguard Worker float confidence; 64*35238bceSAndroid Build Coastguard Worker }; 65*35238bceSAndroid Build Coastguard Worker 66*35238bceSAndroid Build Coastguard Worker // Median-of-medians version of Theil-Sen estimate. Calculates median of medians of slopes through a point and all other points. 67*35238bceSAndroid Build Coastguard Worker // Confidence interval is given as the range that contains the given fraction of all slopes/offsets 68*35238bceSAndroid Build Coastguard Worker LineParametersWithConfidence theilSenSiegelLinearRegression(const std::vector<tcu::Vec2> &dataPoints, 69*35238bceSAndroid Build Coastguard Worker float reportedConfidence); 70*35238bceSAndroid Build Coastguard Worker 71*35238bceSAndroid Build Coastguard Worker struct MeasureState 72*35238bceSAndroid Build Coastguard Worker { MeasureStatedeqp::gls::MeasureState73*35238bceSAndroid Build Coastguard Worker MeasureState(void) : maxNumFrames(0), frameShortcutTime(std::numeric_limits<float>::infinity()), numDrawCalls(0) 74*35238bceSAndroid Build Coastguard Worker { 75*35238bceSAndroid Build Coastguard Worker } 76*35238bceSAndroid Build Coastguard Worker 77*35238bceSAndroid Build Coastguard Worker void clear(void); 78*35238bceSAndroid Build Coastguard Worker void start(int maxNumFrames, float frameShortcutTime, int numDrawCalls); 79*35238bceSAndroid Build Coastguard Worker 80*35238bceSAndroid Build Coastguard Worker bool isDone(void) const; 81*35238bceSAndroid Build Coastguard Worker uint64_t getTotalTime(void) const; 82*35238bceSAndroid Build Coastguard Worker 83*35238bceSAndroid Build Coastguard Worker int maxNumFrames; 84*35238bceSAndroid Build Coastguard Worker float frameShortcutTime; 85*35238bceSAndroid Build Coastguard Worker int numDrawCalls; 86*35238bceSAndroid Build Coastguard Worker std::vector<uint64_t> frameTimes; 87*35238bceSAndroid Build Coastguard Worker }; 88*35238bceSAndroid Build Coastguard Worker 89*35238bceSAndroid Build Coastguard Worker struct CalibrateIteration 90*35238bceSAndroid Build Coastguard Worker { CalibrateIterationdeqp::gls::CalibrateIteration91*35238bceSAndroid Build Coastguard Worker CalibrateIteration(int numDrawCalls_, float frameTime_) : numDrawCalls(numDrawCalls_), frameTime(frameTime_) 92*35238bceSAndroid Build Coastguard Worker { 93*35238bceSAndroid Build Coastguard Worker } 94*35238bceSAndroid Build Coastguard Worker CalibrateIterationdeqp::gls::CalibrateIteration95*35238bceSAndroid Build Coastguard Worker CalibrateIteration(void) : numDrawCalls(0), frameTime(0.0f) 96*35238bceSAndroid Build Coastguard Worker { 97*35238bceSAndroid Build Coastguard Worker } 98*35238bceSAndroid Build Coastguard Worker 99*35238bceSAndroid Build Coastguard Worker int numDrawCalls; 100*35238bceSAndroid Build Coastguard Worker float frameTime; 101*35238bceSAndroid Build Coastguard Worker }; 102*35238bceSAndroid Build Coastguard Worker 103*35238bceSAndroid Build Coastguard Worker struct CalibratorParameters 104*35238bceSAndroid Build Coastguard Worker { CalibratorParametersdeqp::gls::CalibratorParameters105*35238bceSAndroid Build Coastguard Worker CalibratorParameters( 106*35238bceSAndroid Build Coastguard Worker int numInitialCalls_, 107*35238bceSAndroid Build Coastguard Worker int maxCalibrateIterationFrames_, //!< Maximum (and default) number of frames per one calibrate iteration. 108*35238bceSAndroid Build Coastguard Worker float 109*35238bceSAndroid Build Coastguard Worker calibrateIterationShortcutThresholdMs_, //!< If the times of two consecutive frames exceed this, stop the iteration even if maxCalibrateIterationFrames isn't reached. 110*35238bceSAndroid Build Coastguard Worker int maxCalibrateIterations_, float targetFrameTimeMs_, float frameTimeCapMs_, float targetMeasureDurationMs_) 111*35238bceSAndroid Build Coastguard Worker : numInitialCalls(numInitialCalls_) 112*35238bceSAndroid Build Coastguard Worker , maxCalibrateIterationFrames(maxCalibrateIterationFrames_) 113*35238bceSAndroid Build Coastguard Worker , calibrateIterationShortcutThreshold(1000.0f * calibrateIterationShortcutThresholdMs_) 114*35238bceSAndroid Build Coastguard Worker , maxCalibrateIterations(maxCalibrateIterations_) 115*35238bceSAndroid Build Coastguard Worker , targetFrameTimeUs(1000.0f * targetFrameTimeMs_) 116*35238bceSAndroid Build Coastguard Worker , frameTimeCapUs(1000.0f * frameTimeCapMs_) 117*35238bceSAndroid Build Coastguard Worker , targetMeasureDurationUs(1000.0f * targetMeasureDurationMs_) 118*35238bceSAndroid Build Coastguard Worker { 119*35238bceSAndroid Build Coastguard Worker } 120*35238bceSAndroid Build Coastguard Worker 121*35238bceSAndroid Build Coastguard Worker int numInitialCalls; 122*35238bceSAndroid Build Coastguard Worker int maxCalibrateIterationFrames; 123*35238bceSAndroid Build Coastguard Worker float calibrateIterationShortcutThreshold; 124*35238bceSAndroid Build Coastguard Worker int maxCalibrateIterations; 125*35238bceSAndroid Build Coastguard Worker float targetFrameTimeUs; 126*35238bceSAndroid Build Coastguard Worker float frameTimeCapUs; 127*35238bceSAndroid Build Coastguard Worker float targetMeasureDurationUs; 128*35238bceSAndroid Build Coastguard Worker }; 129*35238bceSAndroid Build Coastguard Worker 130*35238bceSAndroid Build Coastguard Worker class TheilSenCalibrator 131*35238bceSAndroid Build Coastguard Worker { 132*35238bceSAndroid Build Coastguard Worker public: 133*35238bceSAndroid Build Coastguard Worker enum State 134*35238bceSAndroid Build Coastguard Worker { 135*35238bceSAndroid Build Coastguard Worker STATE_RECOMPUTE_PARAMS = 0, 136*35238bceSAndroid Build Coastguard Worker STATE_MEASURE, 137*35238bceSAndroid Build Coastguard Worker STATE_FINISHED, 138*35238bceSAndroid Build Coastguard Worker 139*35238bceSAndroid Build Coastguard Worker STATE_LAST 140*35238bceSAndroid Build Coastguard Worker }; 141*35238bceSAndroid Build Coastguard Worker 142*35238bceSAndroid Build Coastguard Worker TheilSenCalibrator(void); 143*35238bceSAndroid Build Coastguard Worker TheilSenCalibrator(const CalibratorParameters ¶ms); 144*35238bceSAndroid Build Coastguard Worker ~TheilSenCalibrator(void); 145*35238bceSAndroid Build Coastguard Worker 146*35238bceSAndroid Build Coastguard Worker void clear(void); 147*35238bceSAndroid Build Coastguard Worker void clear(const CalibratorParameters ¶ms); 148*35238bceSAndroid Build Coastguard Worker 149*35238bceSAndroid Build Coastguard Worker State getState(void) const; getCallCount(void) const150*35238bceSAndroid Build Coastguard Worker int getCallCount(void) const 151*35238bceSAndroid Build Coastguard Worker { 152*35238bceSAndroid Build Coastguard Worker return m_measureState.numDrawCalls; 153*35238bceSAndroid Build Coastguard Worker } 154*35238bceSAndroid Build Coastguard Worker 155*35238bceSAndroid Build Coastguard Worker // Should be called when getState() returns STATE_RECOMPUTE_PARAMS 156*35238bceSAndroid Build Coastguard Worker void recomputeParameters(void); 157*35238bceSAndroid Build Coastguard Worker 158*35238bceSAndroid Build Coastguard Worker // Should be called when getState() returns STATE_MEASURE 159*35238bceSAndroid Build Coastguard Worker void recordIteration(uint64_t frameTime); 160*35238bceSAndroid Build Coastguard Worker getParameters(void) const161*35238bceSAndroid Build Coastguard Worker const CalibratorParameters &getParameters(void) const 162*35238bceSAndroid Build Coastguard Worker { 163*35238bceSAndroid Build Coastguard Worker return m_params; 164*35238bceSAndroid Build Coastguard Worker } getMeasureState(void) const165*35238bceSAndroid Build Coastguard Worker const MeasureState &getMeasureState(void) const 166*35238bceSAndroid Build Coastguard Worker { 167*35238bceSAndroid Build Coastguard Worker return m_measureState; 168*35238bceSAndroid Build Coastguard Worker } getCalibrationInfo(void) const169*35238bceSAndroid Build Coastguard Worker const std::vector<CalibrateIteration> &getCalibrationInfo(void) const 170*35238bceSAndroid Build Coastguard Worker { 171*35238bceSAndroid Build Coastguard Worker return m_calibrateIterations; 172*35238bceSAndroid Build Coastguard Worker } 173*35238bceSAndroid Build Coastguard Worker 174*35238bceSAndroid Build Coastguard Worker private: 175*35238bceSAndroid Build Coastguard Worker enum InternalState 176*35238bceSAndroid Build Coastguard Worker { 177*35238bceSAndroid Build Coastguard Worker INTERNALSTATE_CALIBRATING = 0, 178*35238bceSAndroid Build Coastguard Worker INTERNALSTATE_RUNNING, 179*35238bceSAndroid Build Coastguard Worker INTERNALSTATE_FINISHED, 180*35238bceSAndroid Build Coastguard Worker 181*35238bceSAndroid Build Coastguard Worker INTERNALSTATE_LAST 182*35238bceSAndroid Build Coastguard Worker }; 183*35238bceSAndroid Build Coastguard Worker 184*35238bceSAndroid Build Coastguard Worker CalibratorParameters m_params; 185*35238bceSAndroid Build Coastguard Worker 186*35238bceSAndroid Build Coastguard Worker InternalState m_state; 187*35238bceSAndroid Build Coastguard Worker MeasureState m_measureState; 188*35238bceSAndroid Build Coastguard Worker 189*35238bceSAndroid Build Coastguard Worker std::vector<CalibrateIteration> m_calibrateIterations; 190*35238bceSAndroid Build Coastguard Worker }; 191*35238bceSAndroid Build Coastguard Worker 192*35238bceSAndroid Build Coastguard Worker void logCalibrationInfo(tcu::TestLog &log, const TheilSenCalibrator &calibrator); 193*35238bceSAndroid Build Coastguard Worker 194*35238bceSAndroid Build Coastguard Worker } // namespace gls 195*35238bceSAndroid Build Coastguard Worker } // namespace deqp 196*35238bceSAndroid Build Coastguard Worker 197*35238bceSAndroid Build Coastguard Worker #endif // _GLSCALIBRATION_HPP 198