#ifndef _GLSSHADERPERFORMANCEMEASURER_HPP #define _GLSSHADERPERFORMANCEMEASURER_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 Shader performance measurer; handles calibration and measurement *//*--------------------------------------------------------------------*/ #include "tcuDefs.hpp" #include "tcuTestCase.hpp" #include "tcuVector.hpp" #include "gluRenderContext.hpp" #include "glsCalibration.hpp" namespace deqp { namespace gls { enum PerfCaseType { CASETYPE_VERTEX = 0, CASETYPE_FRAGMENT, CASETYPE_BALANCED, CASETYPE_LAST }; struct AttribSpec { AttribSpec (const char* name_, const tcu::Vec4& p00_, const tcu::Vec4& p01_, const tcu::Vec4& p10_, const tcu::Vec4& p11_) : name (name_) , p00 (p00_) , p01 (p01_) , p10 (p10_) , p11 (p11_) { } AttribSpec (void) {} std::string name; tcu::Vec4 p00; //!< Bottom left. tcu::Vec4 p01; //!< Bottom right. tcu::Vec4 p10; //!< Top left. tcu::Vec4 p11; //!< Top right. }; class ShaderPerformanceMeasurer { public: struct Result { float megaVertPerSec; float megaFragPerSec; Result (float megaVertPerSec_, float megaFragPerSec_) : megaVertPerSec(megaVertPerSec_), megaFragPerSec(megaFragPerSec_) {} }; ShaderPerformanceMeasurer (const glu::RenderContext& renderCtx, PerfCaseType measureType); ~ShaderPerformanceMeasurer (void) { deinit(); } void init (deUint32 program, const std::vector<AttribSpec>& attributes, int calibratorInitialNumCalls); void deinit (void); void iterate (void); void logParameters (tcu::TestLog& log) const; bool isFinished (void) const { return m_state == STATE_FINISHED; } Result getResult (void) const { DE_ASSERT(m_state == STATE_FINISHED); return m_result; } void logMeasurementInfo (tcu::TestLog& log) const; void setGridSize (int gridW, int gridH); void setViewportSize (int width, int height); int getGridWidth (void) const { return m_gridSizeX; } int getGridHeight (void) const { return m_gridSizeY; } int getViewportWidth (void) const { return m_viewportWidth; } int getViewportHeight (void) const { return m_viewportHeight; } int getFinalCallCount (void) const { DE_ASSERT(m_state == STATE_FINISHED); return m_calibrator.getCallCount(); } private: enum State { STATE_UNINITIALIZED = 0, STATE_MEASURING, STATE_FINISHED, STATE_LAST }; void render (int numDrawCalls); const glu::RenderContext& m_renderCtx; int m_gridSizeX; int m_gridSizeY; int m_viewportWidth; int m_viewportHeight; State m_state; bool m_isFirstIteration; deUint64 m_prevRenderStartTime; Result m_result; TheilSenCalibrator m_calibrator; deUint32 m_indexBuffer; std::vector<AttribSpec> m_attributes; std::vector<deUint32> m_attribBuffers; deUint32 m_vao; }; } // gls } // deqp #endif // _GLSSHADERPERFORMANCEMEASURER_HPP