| #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 |