blob: c0c955863c51c16a3f2a6eea963f3f7ff3fc34c9 [file] [log] [blame]
#ifndef _GLSCALIBRATION_HPP
#define _GLSCALIBRATION_HPP
/*-------------------------------------------------------------------------
* drawElements Quality Program OpenGL (ES) Module
* -----------------------------------------------
*
* Copyright 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*//*!
* \file
* \brief Calibration tools.
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
#include "tcuTestCase.hpp"
#include "tcuTestLog.hpp"
#include "tcuVector.hpp"
#include "gluRenderContext.hpp"
#include <limits>
namespace deqp
{
namespace gls
{
struct LineParameters
{
float offset;
float coefficient;
LineParameters (float offset_, float coefficient_) : offset(offset_), coefficient(coefficient_) {}
};
// Basic Theil-Sen linear estimate. Calculates median of all possible slope coefficients through two of the data points
// and median of offsets corresponding with the median slope
LineParameters theilSenLinearRegression (const std::vector<tcu::Vec2>& dataPoints);
struct LineParametersWithConfidence
{
float offset;
float offsetConfidenceUpper;
float offsetConfidenceLower;
float coefficient;
float coefficientConfidenceUpper;
float coefficientConfidenceLower;
float confidence;
};
// Median-of-medians version of Theil-Sen estimate. Calculates median of medians of slopes through a point and all other points.
// Confidence interval is given as the range that contains the given fraction of all slopes/offsets
LineParametersWithConfidence theilSenSiegelLinearRegression (const std::vector<tcu::Vec2>& dataPoints, float reportedConfidence);
struct MeasureState
{
MeasureState (void)
: maxNumFrames (0)
, frameShortcutTime (std::numeric_limits<float>::infinity())
, numDrawCalls (0)
{
}
void clear (void);
void start (int maxNumFrames, float frameShortcutTime, int numDrawCalls);
bool isDone (void) const;
deUint64 getTotalTime (void) const;
int maxNumFrames;
float frameShortcutTime;
int numDrawCalls;
std::vector<deUint64> frameTimes;
};
struct CalibrateIteration
{
CalibrateIteration (int numDrawCalls_, float frameTime_)
: numDrawCalls (numDrawCalls_)
, frameTime (frameTime_)
{
}
CalibrateIteration (void)
: numDrawCalls (0)
, frameTime (0.0f)
{
}
int numDrawCalls;
float frameTime;
};
struct CalibratorParameters
{
CalibratorParameters (int numInitialCalls_,
int maxCalibrateIterationFrames_, //!< Maximum (and default) number of frames per one calibrate iteration.
float calibrateIterationShortcutThresholdMs_, //!< If the times of two consecutive frames exceed this, stop the iteration even if maxCalibrateIterationFrames isn't reached.
int maxCalibrateIterations_,
float targetFrameTimeMs_,
float frameTimeCapMs_,
float targetMeasureDurationMs_)
: numInitialCalls (numInitialCalls_)
, maxCalibrateIterationFrames (maxCalibrateIterationFrames_)
, calibrateIterationShortcutThreshold (1000.0f*calibrateIterationShortcutThresholdMs_)
, maxCalibrateIterations (maxCalibrateIterations_)
, targetFrameTimeUs (1000.0f*targetFrameTimeMs_)
, frameTimeCapUs (1000.0f*frameTimeCapMs_)
, targetMeasureDurationUs (1000.0f*targetMeasureDurationMs_)
{
}
int numInitialCalls;
int maxCalibrateIterationFrames;
float calibrateIterationShortcutThreshold;
int maxCalibrateIterations;
float targetFrameTimeUs;
float frameTimeCapUs;
float targetMeasureDurationUs;
};
class TheilSenCalibrator
{
public:
enum State
{
STATE_RECOMPUTE_PARAMS = 0,
STATE_MEASURE,
STATE_FINISHED,
STATE_LAST
};
TheilSenCalibrator (void);
TheilSenCalibrator (const CalibratorParameters& params);
~TheilSenCalibrator (void);
void clear (void);
void clear (const CalibratorParameters& params);
State getState (void) const;
int getCallCount (void) const { return m_measureState.numDrawCalls; }
// Should be called when getState() returns STATE_RECOMPUTE_PARAMS
void recomputeParameters (void);
// Should be called when getState() returns STATE_MEASURE
void recordIteration (deUint64 frameTime);
const CalibratorParameters& getParameters (void) const { return m_params; }
const MeasureState& getMeasureState (void) const { return m_measureState; }
const std::vector<CalibrateIteration>& getCalibrationInfo (void) const { return m_calibrateIterations; }
private:
enum InternalState
{
INTERNALSTATE_CALIBRATING = 0,
INTERNALSTATE_RUNNING,
INTERNALSTATE_FINISHED,
INTERNALSTATE_LAST
};
CalibratorParameters m_params;
InternalState m_state;
MeasureState m_measureState;
std::vector<CalibrateIteration> m_calibrateIterations;
};
void logCalibrationInfo (tcu::TestLog& log, const TheilSenCalibrator& calibrator);
} // gls
} // deqp
#endif // _GLSCALIBRATION_HPP