1#ifndef _GLSDRAWTEST_HPP
2#define _GLSDRAWTEST_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 Draw tests
24 *//*--------------------------------------------------------------------*/
25
26#include "tcuTestCase.hpp"
27#include "gluRenderContext.hpp"
28
29namespace sglr
30{
31
32class ReferenceContextBuffers;
33class ReferenceContext;
34class Context;
35
36} // sglr
37
38namespace deqp
39{
40namespace gls
41{
42
43class AttributePack;
44
45struct DrawTestSpec
46{
47	enum Target
48	{
49		TARGET_ELEMENT_ARRAY = 0,
50		TARGET_ARRAY,
51
52		TARGET_LAST
53	};
54
55	enum InputType
56	{
57		INPUTTYPE_FLOAT = 0,
58		INPUTTYPE_FIXED,
59		INPUTTYPE_DOUBLE,
60
61		INPUTTYPE_BYTE,
62		INPUTTYPE_SHORT,
63
64		INPUTTYPE_UNSIGNED_BYTE,
65		INPUTTYPE_UNSIGNED_SHORT,
66
67		INPUTTYPE_INT,
68		INPUTTYPE_UNSIGNED_INT,
69		INPUTTYPE_HALF,
70		INPUTTYPE_UNSIGNED_INT_2_10_10_10,
71		INPUTTYPE_INT_2_10_10_10,
72
73		INPUTTYPE_LAST
74	};
75
76	enum OutputType
77	{
78		OUTPUTTYPE_FLOAT = 0,
79		OUTPUTTYPE_VEC2,
80		OUTPUTTYPE_VEC3,
81		OUTPUTTYPE_VEC4,
82
83		OUTPUTTYPE_INT,
84		OUTPUTTYPE_UINT,
85
86		OUTPUTTYPE_IVEC2,
87		OUTPUTTYPE_IVEC3,
88		OUTPUTTYPE_IVEC4,
89
90		OUTPUTTYPE_UVEC2,
91		OUTPUTTYPE_UVEC3,
92		OUTPUTTYPE_UVEC4,
93
94		OUTPUTTYPE_LAST
95	};
96
97	enum Usage
98	{
99		USAGE_DYNAMIC_DRAW = 0,
100		USAGE_STATIC_DRAW,
101		USAGE_STREAM_DRAW,
102
103		USAGE_STREAM_READ,
104		USAGE_STREAM_COPY,
105
106		USAGE_STATIC_READ,
107		USAGE_STATIC_COPY,
108
109		USAGE_DYNAMIC_READ,
110		USAGE_DYNAMIC_COPY,
111
112		USAGE_LAST
113	};
114
115	enum Storage
116	{
117		STORAGE_USER = 0,
118		STORAGE_BUFFER,
119
120		STORAGE_LAST
121	};
122
123	enum Primitive
124	{
125		PRIMITIVE_POINTS = 0,
126		PRIMITIVE_TRIANGLES,
127		PRIMITIVE_TRIANGLE_FAN,
128		PRIMITIVE_TRIANGLE_STRIP,
129		PRIMITIVE_LINES,
130		PRIMITIVE_LINE_STRIP,
131		PRIMITIVE_LINE_LOOP,
132
133		PRIMITIVE_LINES_ADJACENCY,
134		PRIMITIVE_LINE_STRIP_ADJACENCY,
135		PRIMITIVE_TRIANGLES_ADJACENCY,
136		PRIMITIVE_TRIANGLE_STRIP_ADJACENCY,
137
138		PRIMITIVE_LAST
139	};
140
141	enum IndexType
142	{
143		INDEXTYPE_BYTE = 0,
144		INDEXTYPE_SHORT,
145		INDEXTYPE_INT,
146
147		INDEXTYPE_LAST
148	};
149
150	enum DrawMethod
151	{
152		DRAWMETHOD_DRAWARRAYS = 0,
153		DRAWMETHOD_DRAWARRAYS_INSTANCED,
154		DRAWMETHOD_DRAWARRAYS_INDIRECT,
155		DRAWMETHOD_DRAWELEMENTS,
156		DRAWMETHOD_DRAWELEMENTS_RANGED,
157		DRAWMETHOD_DRAWELEMENTS_INSTANCED,
158		DRAWMETHOD_DRAWELEMENTS_INDIRECT,
159		DRAWMETHOD_DRAWELEMENTS_BASEVERTEX,
160		DRAWMETHOD_DRAWELEMENTS_INSTANCED_BASEVERTEX,
161		DRAWMETHOD_DRAWELEMENTS_RANGED_BASEVERTEX,
162
163		DRAWMETHOD_LAST
164	};
165
166	enum CompatibilityTestType
167	{
168		COMPATIBILITY_NONE = 0,
169		COMPATIBILITY_UNALIGNED_OFFSET,
170		COMPATIBILITY_UNALIGNED_STRIDE,
171
172		COMPATIBILITY_LAST
173	};
174
175	static std::string			targetToString		(Target target);
176	static std::string			inputTypeToString	(InputType type);
177	static std::string			outputTypeToString	(OutputType type);
178	static std::string			usageTypeToString	(Usage usage);
179	static std::string			storageToString		(Storage storage);
180	static std::string			primitiveToString	(Primitive primitive);
181	static std::string			indexTypeToString	(IndexType type);
182	static std::string			drawMethodToString	(DrawMethod method);
183	static int					inputTypeSize		(InputType type);
184	static int					indexTypeSize		(IndexType type);
185
186	struct AttributeSpec
187	{
188		static AttributeSpec	createAttributeArray	(InputType inputType, OutputType outputType, Storage storage, Usage usage, int componentCount, int offset, int stride, bool normalize, int instanceDivisor);
189		static AttributeSpec	createDefaultAttribute	(InputType inputType, OutputType outputType, int componentCount);	//!< allowed inputType values: INPUTTYPE_INT, INPUTTYPE_UNSIGNED_INT, INPUTTYPE_FLOAT
190
191		InputType				inputType;
192		OutputType				outputType;
193		Storage					storage;
194		Usage					usage;
195		int 					componentCount;
196		int						offset;
197		int						stride;
198		bool					normalize;
199		int						instanceDivisor;				//!< used only if drawMethod = Draw*Instanced
200		bool					useDefaultAttribute;
201
202		bool					additionalPositionAttribute;	//!< treat this attribute as position attribute. Attribute at index 0 is alway treated as such. False by default
203		bool					bgraComponentOrder;				//!< component order of this attribute is bgra, valid only for 4-component targets. False by default.
204
205								AttributeSpec			(void);
206
207		int						hash					(void) const;
208		bool					valid					(glu::ApiType apiType) const;
209		bool					isBufferAligned			(void) const;
210		bool					isBufferStrideAligned	(void) const;
211	};
212
213	std::string 				getName				(void) const;
214	std::string					getDesc				(void) const;
215	std::string					getMultilineDesc	(void) const;
216
217	glu::ApiType				apiType;			//!< needed in spec validation
218	Primitive					primitive;
219	int							primitiveCount;		//!< number of primitives to draw (per instance)
220
221	DrawMethod					drawMethod;
222	IndexType					indexType;			//!< used only if drawMethod = DrawElements*
223	int							indexPointerOffset;	//!< used only if drawMethod = DrawElements*
224	Storage						indexStorage;		//!< used only if drawMethod = DrawElements*
225	int							first;				//!< used only if drawMethod = DrawArrays*
226	int							indexMin;			//!< used only if drawMethod = Draw*Ranged
227	int							indexMax;			//!< used only if drawMethod = Draw*Ranged
228	int							instanceCount;		//!< used only if drawMethod = Draw*Instanced or Draw*Indirect
229	int							indirectOffset;		//!< used only if drawMethod = Draw*Indirect
230	int							baseVertex;			//!< used only if drawMethod = DrawElementsIndirect or *BaseVertex
231
232	std::vector<AttributeSpec>	attribs;
233
234								DrawTestSpec		(void);
235
236	int							hash				(void) const;
237	bool						valid				(void) const;
238	CompatibilityTestType		isCompatibilityTest	(void) const;
239};
240
241class DrawTest : public tcu::TestCase
242{
243public:
244									DrawTest				(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const DrawTestSpec& spec, const char* name, const char* desc);
245									DrawTest				(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* desc);
246	virtual							~DrawTest				(void);
247
248	void							addIteration			(const DrawTestSpec& spec, const char* description = DE_NULL);
249
250private:
251	void							init					(void);
252	void							deinit					(void);
253	IterateResult					iterate					(void);
254
255	bool							compare					(gls::DrawTestSpec::Primitive primitiveType);
256	float							getCoordScale			(const DrawTestSpec& spec) const;
257	float							getColorScale			(const DrawTestSpec& spec) const;
258
259	glu::RenderContext&				m_renderCtx;
260
261	sglr::ReferenceContextBuffers*	m_refBuffers;
262	sglr::ReferenceContext*			m_refContext;
263	sglr::Context*					m_glesContext;
264
265	AttributePack*					m_glArrayPack;
266	AttributePack*					m_rrArrayPack;
267
268	int								m_maxDiffRed;
269	int								m_maxDiffGreen;
270	int								m_maxDiffBlue;
271
272	std::vector<DrawTestSpec>		m_specs;
273	std::vector<std::string>		m_iteration_descriptions;
274	int								m_iteration;
275	tcu::ResultCollector			m_result;
276};
277
278} // gls
279} // deqp
280
281#endif // _GLSDRAWTEST_HPP
282