1#ifndef _GLSATTRIBUTELOCATIONTESTS_HPP
2#define _GLSATTRIBUTELOCATIONTESTS_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 Attribute location tests
24 *//*--------------------------------------------------------------------*/
25
26#include "tcuDefs.hpp"
27#include "tcuTestCase.hpp"
28
29#include <string>
30#include <vector>
31
32namespace glu
33{
34class ShaderProgram;
35class RenderContext;
36} // glu
37
38namespace deqp
39{
40namespace gls
41{
42namespace AttributeLocationTestUtil
43{
44
45class AttribType
46{
47public:
48						AttribType		(const std::string& name, deUint32 locationSize, deUint32 typeEnum);
49
50	const std::string&	getName			(void) const { return m_name;			}
51	deUint32 			getLocationSize	(void) const { return m_locationSize;	}
52	deUint32			getGLTypeEnum	(void) const { return m_glTypeEnum;		}
53
54private:
55	std::string			m_name;
56	deUint32			m_locationSize;
57	deUint32			m_glTypeEnum;
58};
59
60class Cond
61{
62public:
63	enum ConstCond
64	{
65		COND_ALWAYS,
66		COND_NEVER
67	};
68
69						Cond		(ConstCond cond);
70	explicit			Cond		(const std::string& name, bool negate = true);
71	bool				operator==	(const Cond& other)	const	{ return m_negate == other.m_negate && m_name == other.m_name;	}
72	bool				operator!=	(const Cond& other)	const	{ return !(*this == other);										}
73	const std::string	getName		(void) const				{ return m_name;												}
74	bool				getNegate	(void) const				{ return m_negate;												}
75
76private:
77	bool				m_negate;
78	std::string			m_name;
79};
80
81class Attribute
82{
83public:
84	enum
85	{
86		// Location is not defined
87		LOC_UNDEF = -1
88	};
89
90	enum
91	{
92		// Not an array
93		NOT_ARRAY = -1
94	};
95
96						Attribute			(const AttribType&	type,
97											 const std::string&	name,
98											 deInt32			layoutLocation 	= LOC_UNDEF,
99											 const Cond&		cond			= Cond::COND_ALWAYS,
100											 int				arraySize		= NOT_ARRAY);
101
102	const AttribType	getType				(void) const { return m_type;			}
103	const std::string&	getName				(void) const { return m_name;			}
104	deInt32				getLayoutLocation	(void) const { return m_layoutLocation;	}
105	const Cond&			getCondition		(void) const { return m_cond;			}
106	int					getArraySize		(void) const { return m_arraySize;		}
107
108private:
109	AttribType			m_type;
110	std::string			m_name;
111	deInt32				m_layoutLocation;
112	Cond				m_cond;
113	int					m_arraySize;
114};
115
116class Bind
117{
118public:
119						Bind				(const std::string& attribute, deUint32 location);
120
121	const std::string&	getAttributeName	(void) const { return m_attribute;	}
122	deUint32			getLocation			(void) const { return m_location;	}
123
124private:
125	std::string			m_attribute;
126	deUint32			m_location;
127};
128
129} // AttributeLocationTestUtil
130
131// Simple bind attribute test
132class BindAttributeTest : public tcu::TestCase
133{
134public:
135	typedef AttributeLocationTestUtil::AttribType AttribType;
136
137							BindAttributeTest	(tcu::TestContext&		testCtx,
138												 glu::RenderContext&	renderCtx,
139												 const AttribType&		type,
140												 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);
141
142	virtual IterateResult	iterate				(void);
143
144private:
145	glu::RenderContext&		m_renderCtx;
146	const AttribType		m_type;
147	const int				m_arraySize;
148};
149
150// Bind maximum number of attributes
151class BindMaxAttributesTest : public tcu::TestCase
152{
153public:
154	typedef AttributeLocationTestUtil::AttribType AttribType;
155
156							BindMaxAttributesTest	(tcu::TestContext&		testCtx,
157													 glu::RenderContext&	renderCtx,
158													 const AttribType&		type,
159													 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);
160
161	virtual IterateResult	iterate					(void);
162
163private:
164	glu::RenderContext&		m_renderCtx;
165	const AttribType		m_type;
166	const int				m_arraySize;
167};
168
169class BindAliasingAttributeTest : public tcu::TestCase
170{
171public:
172	typedef AttributeLocationTestUtil::AttribType AttribType;
173
174							BindAliasingAttributeTest	(tcu::TestContext&		testCtx,
175														 glu::RenderContext&	renderCtx,
176														 const AttribType&		type,
177														 int					offset = 0,
178														 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);
179
180	virtual IterateResult	iterate						(void);
181
182private:
183	glu::RenderContext&		m_renderCtx;
184	const AttribType		m_type;
185	const int				m_offset;
186	const int				m_arraySize;
187};
188
189class BindMaxAliasingAttributeTest : public tcu::TestCase
190{
191public:
192	typedef AttributeLocationTestUtil::AttribType AttribType;
193
194							BindMaxAliasingAttributeTest	(tcu::TestContext&	testCtx,
195															glu::RenderContext&	renderCtx,
196															const AttribType&	type,
197															int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);
198
199	virtual IterateResult	iterate							(void);
200
201private:
202	glu::RenderContext&		m_renderCtx;
203	const AttribType		m_type;
204	const int				m_arraySize;
205};
206
207class BindInactiveAliasingAttributeTest : public tcu::TestCase
208{
209public:
210	typedef AttributeLocationTestUtil::AttribType AttribType;
211
212							BindInactiveAliasingAttributeTest	(tcu::TestContext&		testCtx,
213																 glu::RenderContext&	renderCtx,
214																 const AttribType&		type,
215																 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);
216
217	virtual IterateResult	iterate								(void);
218
219private:
220	glu::RenderContext&		m_renderCtx;
221	const AttribType		m_type;
222	const int				m_arraySize;
223};
224
225class BindHoleAttributeTest : public tcu::TestCase
226{
227public:
228	typedef AttributeLocationTestUtil::AttribType AttribType;
229
230							BindHoleAttributeTest		(tcu::TestContext&		testCtx,
231														 glu::RenderContext&	renderCtx,
232														 const AttribType&		type,
233														 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);
234
235	virtual IterateResult	iterate						(void);
236
237private:
238	glu::RenderContext&		m_renderCtx;
239	const AttribType		m_type;
240	const int				m_arraySize;
241};
242
243class PreAttachBindAttributeTest : public tcu::TestCase
244{
245public:
246							PreAttachBindAttributeTest	(tcu::TestContext&		testCtx,
247														 glu::RenderContext&	renderCtx);
248
249	virtual IterateResult	iterate						(void);
250
251private:
252	glu::RenderContext&		m_renderCtx;
253};
254
255class PreLinkBindAttributeTest : public tcu::TestCase
256{
257public:
258	typedef AttributeLocationTestUtil::AttribType AttribType;
259
260							PreLinkBindAttributeTest	(tcu::TestContext&		testCtx,
261														 glu::RenderContext&	renderCtx);
262
263	virtual IterateResult	iterate						(void);
264
265private:
266	glu::RenderContext&		m_renderCtx;
267};
268
269class PostLinkBindAttributeTest : public tcu::TestCase
270{
271public:
272	typedef AttributeLocationTestUtil::AttribType AttribType;
273
274							PostLinkBindAttributeTest	(tcu::TestContext&		testCtx,
275														 glu::RenderContext&	renderCtx);
276
277	virtual IterateResult	iterate						(void);
278
279private:
280	glu::RenderContext&		m_renderCtx;
281};
282
283class BindReattachAttributeTest : public tcu::TestCase
284{
285public:
286	typedef AttributeLocationTestUtil::AttribType AttribType;
287
288							BindReattachAttributeTest	(tcu::TestContext&		testCtx,
289														 glu::RenderContext&	renderCtx);
290
291	virtual IterateResult	iterate						(void);
292
293private:
294	glu::RenderContext&		m_renderCtx;
295};
296
297class LocationAttributeTest : public tcu::TestCase
298{
299public:
300	typedef AttributeLocationTestUtil::AttribType AttribType;
301
302							LocationAttributeTest	(tcu::TestContext&		testCtx,
303													 glu::RenderContext&	renderCtx,
304													 const AttribType&		type,
305													 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);
306
307	virtual IterateResult	iterate					(void);
308
309private:
310	glu::RenderContext&		m_renderCtx;
311	const AttribType		m_type;
312	const int				m_arraySize;
313};
314
315class LocationMaxAttributesTest : public tcu::TestCase
316{
317public:
318	typedef AttributeLocationTestUtil::AttribType AttribType;
319
320							LocationMaxAttributesTest	(tcu::TestContext&		testCtx,
321														 glu::RenderContext&	renderCtx,
322														 const AttribType&		type,
323														 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);
324
325	virtual IterateResult	iterate						(void);
326
327private:
328	glu::RenderContext&		m_renderCtx;
329	const AttribType		m_type;
330	const int				m_arraySize;
331};
332
333class LocationHoleAttributeTest : public tcu::TestCase
334{
335public:
336	typedef AttributeLocationTestUtil::AttribType AttribType;
337
338							LocationHoleAttributeTest	(tcu::TestContext&		testCtx,
339														 glu::RenderContext&	renderCtx,
340														 const AttribType&		type,
341														 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);
342
343	virtual IterateResult	iterate						(void);
344
345private:
346	glu::RenderContext&		m_renderCtx;
347	const AttribType		m_type;
348	const int				m_arraySize;
349};
350
351class MixedAttributeTest : public tcu::TestCase
352{
353public:
354	typedef AttributeLocationTestUtil::AttribType AttribType;
355
356							MixedAttributeTest	(tcu::TestContext&		testCtx,
357												 glu::RenderContext&	renderCtx,
358												 const AttribType&		type,
359												 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);
360
361	virtual IterateResult	iterate				(void);
362
363private:
364	glu::RenderContext&		m_renderCtx;
365	const AttribType		m_type;
366	const int				m_arraySize;
367};
368
369class MixedMaxAttributesTest : public tcu::TestCase
370{
371public:
372	typedef AttributeLocationTestUtil::AttribType AttribType;
373
374							MixedMaxAttributesTest	(tcu::TestContext&		testCtx,
375													 glu::RenderContext&	renderCtx,
376													 const AttribType&		type,
377													 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);
378
379	virtual IterateResult	iterate					(void);
380
381private:
382	glu::RenderContext&		m_renderCtx;
383	const AttribType		m_type;
384	const int				m_arraySize;
385};
386
387class MixedHoleAttributeTest : public tcu::TestCase
388{
389public:
390	typedef AttributeLocationTestUtil::AttribType AttribType;
391
392							MixedHoleAttributeTest	(tcu::TestContext&		testCtx,
393													 glu::RenderContext&	renderCtx,
394													 const AttribType&		type,
395													 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);
396
397	virtual IterateResult	iterate					(void);
398
399private:
400	glu::RenderContext&		m_renderCtx;
401	const AttribType		m_type;
402	const int				m_arraySize;
403};
404
405class BindRelinkAttributeTest : public tcu::TestCase
406{
407public:
408	typedef AttributeLocationTestUtil::AttribType AttribType;
409
410							BindRelinkAttributeTest	(tcu::TestContext&		testCtx,
411													 glu::RenderContext&	renderCtx);
412
413	virtual IterateResult	iterate					(void);
414
415private:
416	glu::RenderContext&		m_renderCtx;
417};
418
419class BindRelinkHoleAttributeTest : public tcu::TestCase
420{
421public:
422	typedef AttributeLocationTestUtil::AttribType AttribType;
423
424							BindRelinkHoleAttributeTest	(tcu::TestContext&		testCtx,
425														 glu::RenderContext&	renderCtx,
426														 const AttribType&		type,
427														 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);
428
429	virtual IterateResult	iterate						(void);
430
431private:
432	glu::RenderContext&		m_renderCtx;
433	const AttribType		m_type;
434	const int				m_arraySize;
435};
436
437class MixedRelinkHoleAttributeTest : public tcu::TestCase
438{
439public:
440	typedef AttributeLocationTestUtil::AttribType AttribType;
441
442							MixedRelinkHoleAttributeTest	(tcu::TestContext&		testCtx,
443															 glu::RenderContext&	renderCtx,
444															 const AttribType&		type,
445															 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);
446
447	virtual IterateResult	iterate							(void);
448
449private:
450	glu::RenderContext&		m_renderCtx;
451	const AttribType		m_type;
452	const int				m_arraySize;
453};
454
455class PreAttachMixedAttributeTest : public tcu::TestCase
456{
457public:
458	typedef AttributeLocationTestUtil::AttribType AttribType;
459
460							PreAttachMixedAttributeTest	(tcu::TestContext&		testCtx,
461														 glu::RenderContext&	renderCtx);
462
463	virtual IterateResult	iterate						(void);
464
465private:
466	glu::RenderContext&		m_renderCtx;
467};
468
469class PreLinkMixedAttributeTest : public tcu::TestCase
470{
471public:
472	typedef AttributeLocationTestUtil::AttribType AttribType;
473
474							PreLinkMixedAttributeTest	(tcu::TestContext&		testCtx,
475														 glu::RenderContext&	renderCtx);
476
477	virtual IterateResult	iterate						(void);
478
479private:
480	glu::RenderContext&		m_renderCtx;
481};
482
483class PostLinkMixedAttributeTest : public tcu::TestCase
484{
485public:
486	typedef AttributeLocationTestUtil::AttribType AttribType;
487
488							PostLinkMixedAttributeTest	(tcu::TestContext&		testCtx,
489														 glu::RenderContext&	renderCtx);
490
491	virtual IterateResult	iterate						(void);
492
493private:
494	glu::RenderContext&		m_renderCtx;
495};
496
497class MixedReattachAttributeTest : public tcu::TestCase
498{
499public:
500	typedef AttributeLocationTestUtil::AttribType AttribType;
501
502							MixedReattachAttributeTest		(tcu::TestContext&		testCtx,
503															 glu::RenderContext&	renderCtx);
504
505	virtual IterateResult	iterate							(void);
506
507private:
508	glu::RenderContext&		m_renderCtx;
509};
510
511class MixedRelinkAttributeTest : public tcu::TestCase
512{
513public:
514	typedef AttributeLocationTestUtil::AttribType AttribType;
515
516							MixedRelinkAttributeTest(tcu::TestContext&		testCtx,
517													 glu::RenderContext&	renderCtx);
518
519	virtual IterateResult	iterate					(void);
520
521private:
522	glu::RenderContext&								m_renderCtx;
523};
524
525} // gls
526} // deqp
527
528#endif // _GLSATTRIBUTELOCATIONTESTS_HPP
529