1 #ifndef _GLSSHADERPERFORMANCEMEASURER_HPP 2 #define _GLSSHADERPERFORMANCEMEASURER_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 Shader performance measurer; handles calibration and measurement 24 *//*--------------------------------------------------------------------*/ 25 26 #include "tcuDefs.hpp" 27 #include "tcuTestCase.hpp" 28 #include "tcuVector.hpp" 29 #include "gluRenderContext.hpp" 30 #include "glsCalibration.hpp" 31 32 namespace deqp 33 { 34 namespace gls 35 { 36 37 enum PerfCaseType 38 { 39 CASETYPE_VERTEX = 0, 40 CASETYPE_FRAGMENT, 41 CASETYPE_BALANCED, 42 43 CASETYPE_LAST 44 }; 45 46 struct AttribSpec 47 { 48 AttribSpec (const char* name_, const tcu::Vec4& p00_, const tcu::Vec4& p01_, const tcu::Vec4& p10_, const tcu::Vec4& p11_) 49 : name (name_) 50 , p00 (p00_) 51 , p01 (p01_) 52 , p10 (p10_) 53 , p11 (p11_) 54 { 55 } 56 57 AttribSpec (void) {} 58 59 std::string name; 60 tcu::Vec4 p00; //!< Bottom left. 61 tcu::Vec4 p01; //!< Bottom right. 62 tcu::Vec4 p10; //!< Top left. 63 tcu::Vec4 p11; //!< Top right. 64 }; 65 66 class ShaderPerformanceMeasurer 67 { 68 public: 69 struct Result 70 { 71 float megaVertPerSec; 72 float megaFragPerSec; 73 74 Result (float megaVertPerSec_, float megaFragPerSec_) : megaVertPerSec(megaVertPerSec_), megaFragPerSec(megaFragPerSec_) {} 75 }; 76 77 ShaderPerformanceMeasurer (const glu::RenderContext& renderCtx, PerfCaseType measureType); 78 ~ShaderPerformanceMeasurer (void) { deinit(); } 79 80 void init (deUint32 program, const std::vector<AttribSpec>& attributes, int calibratorInitialNumCalls); 81 void deinit (void); 82 void iterate (void); 83 84 void logParameters (tcu::TestLog& log) const; 85 bool isFinished (void) const { return m_state == STATE_FINISHED; } 86 Result getResult (void) const { DE_ASSERT(m_state == STATE_FINISHED); return m_result; } 87 void logMeasurementInfo (tcu::TestLog& log) const; 88 89 void setGridSize (int gridW, int gridH); 90 void setViewportSize (int width, int height); 91 92 int getGridWidth (void) const { return m_gridSizeX; } 93 int getGridHeight (void) const { return m_gridSizeY; } 94 int getViewportWidth (void) const { return m_viewportWidth; } 95 int getViewportHeight (void) const { return m_viewportHeight; } 96 97 int getFinalCallCount (void) const { DE_ASSERT(m_state == STATE_FINISHED); return m_calibrator.getCallCount(); } 98 99 private: 100 enum State 101 { 102 STATE_UNINITIALIZED = 0, 103 STATE_MEASURING, 104 STATE_FINISHED, 105 106 STATE_LAST 107 }; 108 109 void render (int numDrawCalls); 110 111 const glu::RenderContext& m_renderCtx; 112 int m_gridSizeX; 113 int m_gridSizeY; 114 int m_viewportWidth; 115 int m_viewportHeight; 116 117 State m_state; 118 bool m_isFirstIteration; 119 deUint64 m_prevRenderStartTime; 120 Result m_result; 121 TheilSenCalibrator m_calibrator; 122 deUint32 m_indexBuffer; 123 std::vector<AttribSpec> m_attributes; 124 std::vector<deUint32> m_attribBuffers; 125 deUint32 m_vao; 126 }; 127 128 } // gls 129 } // deqp 130 131 #endif // _GLSSHADERPERFORMANCEMEASURER_HPP 132