xref: /aosp_15_r20/external/deqp/modules/glshared/glsCalibration.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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 &params);
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 &params);
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