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
32namespace deqp
33{
34namespace gls
35{
36
37enum PerfCaseType
38{
39	CASETYPE_VERTEX = 0,
40	CASETYPE_FRAGMENT,
41	CASETYPE_BALANCED,
42
43	CASETYPE_LAST
44};
45
46struct 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
66class ShaderPerformanceMeasurer
67{
68public:
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
99private:
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