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