1/*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES 3.0 Module
3 * -------------------------------------------------
4 *
5 * Copyright 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief State change call performance tests.
22 *//*--------------------------------------------------------------------*/
23
24#include "es3pStateChangeCallTests.hpp"
25#include "glsStateChangePerfTestCases.hpp"
26#include "glwFunctions.hpp"
27#include "glwEnums.hpp"
28
29namespace deqp
30{
31namespace gles3
32{
33namespace Performance
34{
35
36using namespace glw;
37
38StateChangeCallTests::StateChangeCallTests (Context& context)
39	: TestCaseGroup(context, "state_change_only", "Test cost of state change calls without rendering anything")
40{
41}
42
43StateChangeCallTests::~StateChangeCallTests (void)
44{
45}
46
47#define ARG_LIST(...) __VA_ARGS__
48
49#define ADD_ARG_CASE1(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0)\
50do {\
51	class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\
52	{\
53	public:\
54		StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\
55			: gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\
56		{\
57		}\
58		virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\
59		{\
60			const TYPE0 args0[] = ARGS0;\
61			for (int callNdx = 0; callNdx < callCount; callNdx++)\
62			{\
63				const int		baseNdx		= iterNdx*callCount + callNdx;\
64				const TYPE0		arg0		= args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\
65				gl.FUNCNAME(arg0);\
66			}\
67		}\
68	};\
69	addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\
70}while (0);
71
72#define ADD_ARG_CASE2(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0, TYPE1, ARGS1)\
73do {\
74	class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\
75	{\
76	public:\
77		StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\
78			: gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\
79		{\
80		}\
81		virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\
82		{\
83			const TYPE0 args0[] = ARGS0;\
84			const TYPE1 args1[] = ARGS1;\
85			for (int callNdx = 0; callNdx < callCount; callNdx++)\
86			{\
87				const int		baseNdx		= iterNdx*callCount + callNdx;\
88				const TYPE0		arg0		= args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\
89				const TYPE1		arg1		= args1[baseNdx%DE_LENGTH_OF_ARRAY(args1)];\
90				gl.FUNCNAME(arg0, arg1);\
91			}\
92		}\
93	};\
94	addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\
95}while (0);
96
97#define ADD_ARG_CASE3(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0, TYPE1, ARGS1, TYPE2, ARGS2)\
98do {\
99	class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\
100	{\
101	public:\
102		StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\
103			: gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\
104		{\
105		}\
106		virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\
107		{\
108			const TYPE0 args0[] = ARGS0;\
109			const TYPE1 args1[] = ARGS1;\
110			const TYPE2 args2[] = ARGS2;\
111			for (int callNdx = 0; callNdx < callCount; callNdx++)\
112			{\
113				const int		baseNdx		= iterNdx*callCount + callNdx;\
114				const TYPE0		arg0		= args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\
115				const TYPE1		arg1		= args1[baseNdx%DE_LENGTH_OF_ARRAY(args1)];\
116				const TYPE2		arg2		= args2[baseNdx%DE_LENGTH_OF_ARRAY(args2)];\
117				gl.FUNCNAME(arg0, arg1, arg2);\
118			}\
119		}\
120	};\
121	addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\
122}while (0);
123
124#define ADD_ARG_CASE4(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0, TYPE1, ARGS1, TYPE2, ARGS2, TYPE3, ARGS3)\
125do {\
126	class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\
127	{\
128	public:\
129		StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\
130			: gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\
131		{\
132		}\
133		virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\
134		{\
135			const TYPE0 args0[] = ARGS0;\
136			const TYPE1 args1[] = ARGS1;\
137			const TYPE2 args2[] = ARGS2;\
138			const TYPE3 args3[] = ARGS3;\
139			for (int callNdx = 0; callNdx < callCount; callNdx++)\
140			{\
141				const int		baseNdx		= iterNdx*callCount + callNdx;\
142				const TYPE0		arg0		= args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\
143				const TYPE1		arg1		= args1[baseNdx%DE_LENGTH_OF_ARRAY(args1)];\
144				const TYPE2		arg2		= args2[baseNdx%DE_LENGTH_OF_ARRAY(args2)];\
145				const TYPE3		arg3		= args3[baseNdx%DE_LENGTH_OF_ARRAY(args3)];\
146				gl.FUNCNAME(arg0, arg1, arg2, arg3);\
147			}\
148		}\
149	};\
150	addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\
151}while (0);
152
153#define ADD_ARG_CASE5(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0, TYPE1, ARGS1, TYPE2, ARGS2, TYPE3, ARGS3, TYPE4, ARGS4)\
154do {\
155	class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\
156	{\
157	public:\
158		StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\
159			: gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\
160		{\
161		}\
162		virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\
163		{\
164			const TYPE0 args0[] = ARGS0;\
165			const TYPE1 args1[] = ARGS1;\
166			const TYPE2 args2[] = ARGS2;\
167			const TYPE3 args3[] = ARGS3;\
168			const TYPE4 args4[] = ARGS4;\
169			for (int callNdx = 0; callNdx < callCount; callNdx++)\
170			{\
171				const int		baseNdx		= iterNdx*callCount + callNdx;\
172				const TYPE0		arg0		= args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\
173				const TYPE1		arg1		= args1[baseNdx%DE_LENGTH_OF_ARRAY(args1)];\
174				const TYPE2		arg2		= args2[baseNdx%DE_LENGTH_OF_ARRAY(args2)];\
175				const TYPE3		arg3		= args3[baseNdx%DE_LENGTH_OF_ARRAY(args3)];\
176				const TYPE4		arg4		= args4[baseNdx%DE_LENGTH_OF_ARRAY(args4)];\
177				gl.FUNCNAME(arg0, arg1, arg2, arg3, arg4);\
178			}\
179		}\
180	};\
181	addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\
182}while (0);
183
184#define ADD_ARG_CASE6(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0, TYPE1, ARGS1, TYPE2, ARGS2, TYPE3, ARGS3, TYPE4, ARGS4, TYPE5, ARGS5)\
185do {\
186	class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\
187	{\
188	public:\
189		StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\
190			: gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\
191		{\
192		}\
193		virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\
194		{\
195			const TYPE0 args0[] = ARGS0;\
196			const TYPE1 args1[] = ARGS1;\
197			const TYPE2 args2[] = ARGS2;\
198			const TYPE3 args3[] = ARGS3;\
199			const TYPE4 args4[] = ARGS4;\
200			const TYPE5 args5[] = ARGS5;\
201			for (int callNdx = 0; callNdx < callCount; callNdx++)\
202			{\
203				const int		baseNdx		= iterNdx*callCount + callNdx;\
204				const TYPE0		arg0		= args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\
205				const TYPE1		arg1		= args1[baseNdx%DE_LENGTH_OF_ARRAY(args1)];\
206				const TYPE2		arg2		= args2[baseNdx%DE_LENGTH_OF_ARRAY(args2)];\
207				const TYPE3		arg3		= args3[baseNdx%DE_LENGTH_OF_ARRAY(args3)];\
208				const TYPE4		arg4		= args4[baseNdx%DE_LENGTH_OF_ARRAY(args4)];\
209				const TYPE5		arg5		= args5[baseNdx%DE_LENGTH_OF_ARRAY(args5)];\
210				gl.FUNCNAME(arg0, arg1, arg2, arg3, arg4, arg5);\
211			}\
212		}\
213	};\
214	addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\
215}while (0);
216
217void StateChangeCallTests::init (void)
218{
219	ADD_ARG_CASE1(enable, "Test cost of glEnable() calls",
220		enable,
221		GLenum,
222		ARG_LIST({
223			GL_CULL_FACE,
224			GL_POLYGON_OFFSET_FILL,
225			GL_SAMPLE_ALPHA_TO_COVERAGE,
226			GL_SAMPLE_COVERAGE,
227			GL_SCISSOR_TEST,
228			GL_STENCIL_TEST,
229			GL_DEPTH_TEST,
230			GL_BLEND,
231			GL_DITHER,
232			GL_RASTERIZER_DISCARD,
233			GL_PRIMITIVE_RESTART_FIXED_INDEX
234		})
235	);
236
237	ADD_ARG_CASE1(disable, "Test cost of glDisable() calls",
238		disable,
239		GLenum,
240		ARG_LIST({
241			GL_CULL_FACE,
242			GL_POLYGON_OFFSET_FILL,
243			GL_SAMPLE_ALPHA_TO_COVERAGE,
244			GL_SAMPLE_COVERAGE,
245			GL_SCISSOR_TEST,
246			GL_STENCIL_TEST,
247			GL_DEPTH_TEST,
248			GL_BLEND,
249			GL_DITHER,
250			GL_RASTERIZER_DISCARD,
251			GL_PRIMITIVE_RESTART_FIXED_INDEX
252		})
253	);
254
255	ADD_ARG_CASE1(depth_func, "Test cost of glDepthFunc() calls",
256		depthFunc,
257		GLenum,
258		ARG_LIST({
259			GL_NEVER,
260			GL_ALWAYS,
261			GL_LESS,
262			GL_LEQUAL,
263			GL_EQUAL,
264			GL_GREATER,
265			GL_GEQUAL,
266			GL_NOTEQUAL
267		})
268	);
269
270	ADD_ARG_CASE1(depth_mask, "Test cost of glDepthMask() calls",
271		depthMask,
272		GLboolean,
273		ARG_LIST({
274			GL_TRUE,
275			GL_FALSE
276		})
277	);
278
279	ADD_ARG_CASE1(stencil_mask, "Test cost of glStencilMask() calls",
280		stencilMask,
281		GLboolean,
282		ARG_LIST({
283			GL_TRUE,
284			GL_FALSE
285		})
286	);
287
288	ADD_ARG_CASE1(clear_depth, "Test cost of glClearDepth() calls",
289		clearDepthf,
290		GLclampf,
291		ARG_LIST({
292			0.0f,
293			0.5f,
294			1.0f
295		})
296	);
297
298	ADD_ARG_CASE1(clear_stencil, "Test cost of glClearStencil() calls",
299		clearStencil,
300		GLint,
301		ARG_LIST({
302			0,
303			128,
304			28
305		})
306	);
307
308	ADD_ARG_CASE1(line_width, "Test cost of glLineWidth() calls",
309		lineWidth,
310		GLfloat,
311		ARG_LIST({
312			1.0f,
313			0.5f,
314			10.0f
315		})
316	);
317
318	ADD_ARG_CASE1(cull_face, "Test cost of glCullFace() calls",
319		cullFace,
320		GLenum,
321		ARG_LIST({
322			GL_FRONT,
323			GL_BACK,
324			GL_FRONT_AND_BACK
325		})
326	);
327
328	ADD_ARG_CASE1(front_face, "Test cost of glFrontFace() calls",
329		frontFace,
330		GLenum,
331		ARG_LIST({
332			GL_CCW,
333			GL_CW
334		})
335	);
336
337	ADD_ARG_CASE1(blend_equation, "Test cost of glBlendEquation() calls",
338		blendEquation,
339		GLenum,
340		ARG_LIST({
341			GL_FUNC_ADD,
342			GL_FUNC_SUBTRACT,
343			GL_FUNC_REVERSE_SUBTRACT
344		})
345	);
346
347	ADD_ARG_CASE1(enable_vertex_attrib_array, "Test cost of glEnableVertexAttribArray() calls",
348		enableVertexAttribArray,
349		GLuint,
350		ARG_LIST({
351			0,
352			1,
353			2,
354			3,
355			4,
356			5,
357			6,
358			7,
359		})
360	);
361
362	ADD_ARG_CASE1(disable_vertex_attrib_array, "Test cost of glDisableVertexAttribArray() calls",
363		disableVertexAttribArray,
364		GLuint,
365		ARG_LIST({
366			0,
367			1,
368			2,
369			3,
370			4,
371			5,
372			6,
373			7,
374		})
375	);
376
377	ADD_ARG_CASE1(use_program, "Test cost of glUseProgram() calls. Note: Uses only program 0.",
378		useProgram,
379		GLuint,
380		ARG_LIST({
381			0,
382		})
383	);
384
385	ADD_ARG_CASE1(active_texture, "Test cost of glActiveTexture() calls",
386		activeTexture,
387		GLenum,
388		ARG_LIST({
389			GL_TEXTURE0,
390			GL_TEXTURE1,
391			GL_TEXTURE2,
392			GL_TEXTURE3,
393			GL_TEXTURE4,
394			GL_TEXTURE5,
395			GL_TEXTURE6,
396			GL_TEXTURE7
397		})
398	);
399
400	ADD_ARG_CASE2(depth_range, "Test cost of glDepthRangef() calls",
401		depthRangef,
402		GLclampf,
403		ARG_LIST({
404			0.0f,
405			1.0f,
406			0.5f
407		}),
408		GLclampf,
409		ARG_LIST({
410			0.0f,
411			1.0f,
412			0.5f
413		})
414	);
415
416	ADD_ARG_CASE2(polygon_offset, "Test cost of glPolygonOffset() calls",
417		polygonOffset,
418		GLfloat,
419		ARG_LIST({
420			0.0f,
421			1.0f,
422			0.5f,
423			10.0f
424		}),
425		GLfloat,
426		ARG_LIST({
427			0.0f,
428			1.0f,
429			0.5f,
430			1000.0f
431		})
432	);
433
434	ADD_ARG_CASE2(sample_coverage, "Test cost of glSampleCoverage() calls",
435		sampleCoverage,
436		GLclampf,
437		ARG_LIST({
438			0.0f,
439			1.0f,
440			0.5f,
441			0.67f
442		}),
443		GLboolean,
444		ARG_LIST({
445			GL_TRUE,
446			GL_FALSE
447		})
448	);
449
450	ADD_ARG_CASE2(blend_func, "Test cost of glBlendFunc() calls",
451		blendFunc,
452		GLenum,
453		ARG_LIST({
454			GL_ZERO,
455			GL_ONE,
456			GL_SRC_COLOR,
457			GL_ONE_MINUS_SRC_COLOR,
458			GL_DST_COLOR,
459			GL_ONE_MINUS_DST_COLOR,
460			GL_SRC_ALPHA,
461			GL_ONE_MINUS_SRC_ALPHA,
462			GL_DST_ALPHA,
463			GL_ONE_MINUS_DST_ALPHA,
464			GL_CONSTANT_COLOR,
465			GL_ONE_MINUS_CONSTANT_COLOR,
466			GL_CONSTANT_ALPHA,
467			GL_ONE_MINUS_CONSTANT_ALPHA
468		}),
469		GLenum,
470		ARG_LIST({
471			GL_ZERO,
472			GL_ONE,
473			GL_SRC_COLOR,
474			GL_ONE_MINUS_SRC_COLOR,
475			GL_DST_COLOR,
476			GL_ONE_MINUS_DST_COLOR,
477			GL_SRC_ALPHA,
478			GL_ONE_MINUS_SRC_ALPHA,
479			GL_DST_ALPHA,
480			GL_ONE_MINUS_DST_ALPHA,
481			GL_CONSTANT_COLOR,
482			GL_ONE_MINUS_CONSTANT_COLOR,
483			GL_CONSTANT_ALPHA,
484			GL_ONE_MINUS_CONSTANT_ALPHA
485		})
486	);
487
488	ADD_ARG_CASE2(blend_equation_separate, "Test cost of glBlendEquationSeparate() calls",
489		blendEquationSeparate,
490		GLenum,
491		ARG_LIST({
492			GL_FUNC_ADD,
493			GL_FUNC_SUBTRACT,
494			GL_FUNC_REVERSE_SUBTRACT
495		}),
496		GLenum,
497		ARG_LIST({
498			GL_FUNC_ADD,
499			GL_FUNC_SUBTRACT,
500			GL_FUNC_REVERSE_SUBTRACT
501		})
502	);
503
504	ADD_ARG_CASE2(stencil_mask_separate, "Test cost of glStencilMaskSeparate() calls",
505		stencilMaskSeparate,
506		GLenum,
507		ARG_LIST({
508			GL_FRONT,
509			GL_BACK,
510			GL_FRONT_AND_BACK
511		}),
512		GLboolean,
513		ARG_LIST({
514			GL_TRUE,
515			GL_FALSE
516		})
517	);
518
519	ADD_ARG_CASE2(bind_buffer, "Test cost of glBindBuffer() calls. Note: Uses only buffer 0",
520		bindBuffer,
521		GLenum,
522		ARG_LIST({
523			GL_ELEMENT_ARRAY_BUFFER,
524			GL_ARRAY_BUFFER
525		}),
526		GLuint,
527		ARG_LIST({
528			0
529		})
530	);
531
532	ADD_ARG_CASE2(bind_texture, "Test cost of glBindTexture() calls. Note: Uses only texture 0",
533		bindTexture,
534		GLenum,
535		ARG_LIST({
536			GL_TEXTURE_2D,
537			GL_TEXTURE_CUBE_MAP
538		}),
539		GLuint,
540		ARG_LIST({
541			0
542		})
543	);
544
545	ADD_ARG_CASE2(bind_sampler, "Test cost of glBindSampler() calls. Note: Uses only sampler 0",
546		bindSampler,
547		GLuint,
548		ARG_LIST({
549			0,
550			1,
551			2,
552			3,
553			4,
554			5,
555			6,
556			7
557		}),
558		GLuint,
559		ARG_LIST({
560			0
561		})
562	);
563
564	ADD_ARG_CASE1(bind_vertex_array, "Test cost of glBindVertexArray() calls. Note: Uses only VAO 0",
565		bindVertexArray,
566		GLuint,
567		ARG_LIST({
568			0
569		})
570	);
571
572	ADD_ARG_CASE2(hint, "Test cost of glHint() calls",
573		hint,
574		GLenum,
575		ARG_LIST({
576			GL_GENERATE_MIPMAP_HINT
577		}),
578		GLenum,
579		ARG_LIST({
580			GL_FASTEST,
581			GL_NICEST,
582			GL_DONT_CARE
583		})
584	);
585
586	ADD_ARG_CASE3(stencil_func, "Test cost of glStencilFunc() calls",
587		stencilFunc,
588		GLenum,
589		ARG_LIST({
590			GL_NEVER,
591			GL_ALWAYS,
592			GL_LESS,
593			GL_LEQUAL,
594			GL_EQUAL,
595			GL_GEQUAL,
596			GL_GREATER,
597			GL_NOTEQUAL
598		}),
599		GLint,
600		ARG_LIST({
601			0,
602			1,
603			255,
604			128,
605			7
606		}),
607		GLuint,
608		ARG_LIST({
609			0,
610			1,
611			255,
612			128,
613			7,
614			0xFFFFFFFF
615		})
616	);
617
618	ADD_ARG_CASE3(stencil_op, "Test cost of glStencilOp() calls",
619		stencilOp,
620		GLenum,
621		ARG_LIST({
622			GL_KEEP,
623			GL_ZERO,
624			GL_REPLACE,
625			GL_INCR,
626			GL_DECR,
627			GL_INVERT,
628			GL_INCR_WRAP,
629			GL_DECR_WRAP
630		}),
631		GLenum,
632		ARG_LIST({
633			GL_KEEP,
634			GL_ZERO,
635			GL_REPLACE,
636			GL_INCR,
637			GL_DECR,
638			GL_INVERT,
639			GL_INCR_WRAP,
640			GL_DECR_WRAP
641		}),
642		GLenum,
643		ARG_LIST({
644			GL_KEEP,
645			GL_ZERO,
646			GL_REPLACE,
647			GL_INCR,
648			GL_DECR,
649			GL_INVERT,
650			GL_INCR_WRAP,
651			GL_DECR_WRAP
652		})
653	);
654
655	ADD_ARG_CASE4(viewport, "Test cost of glViewport() calls",
656		viewport,
657		GLint,
658		ARG_LIST({
659			0,
660			1,
661			100,
662			1145235
663		}),
664		GLint,
665		ARG_LIST({
666			0,
667			1,
668			100,
669			1145235
670		}),
671		GLint,
672		ARG_LIST({
673			0,
674			1,
675			100,
676			1145235
677		}),
678		GLint,
679		ARG_LIST({
680			0,
681			1,
682			100,
683			1145235
684		})
685	);
686
687	ADD_ARG_CASE4(scissor, "Test cost of glScissor() calls",
688		scissor,
689		GLint,
690		ARG_LIST({
691			0,
692			1,
693			100,
694			1145235
695		}),
696		GLint,
697		ARG_LIST({
698			0,
699			1,
700			100,
701			1145235
702		}),
703		GLint,
704		ARG_LIST({
705			0,
706			1,
707			100,
708			1145235
709		}),
710		GLint,
711		ARG_LIST({
712			0,
713			1,
714			100,
715			1145235
716		})
717	);
718
719	ADD_ARG_CASE4(stencil_func_separate, "Test cost of glStencilFuncSeparate() calls",
720		stencilFuncSeparate,
721		GLenum,
722		ARG_LIST({
723			GL_FRONT,
724			GL_BACK,
725			GL_FRONT_AND_BACK
726		}),
727		GLenum,
728		ARG_LIST({
729			GL_NEVER,
730			GL_ALWAYS,
731			GL_LESS,
732			GL_LEQUAL,
733			GL_EQUAL,
734			GL_GEQUAL,
735			GL_GREATER,
736			GL_NOTEQUAL
737		}),
738		GLint,
739		ARG_LIST({
740			0,
741			1,
742			255,
743			128,
744			7
745		}),
746		GLuint,
747		ARG_LIST({
748			0,
749			1,
750			255,
751			128,
752			7,
753			0xFFFFFFFF
754		})
755	);
756
757	ADD_ARG_CASE4(stencil_op_separatae, "Test cost of glStencilOpSeparate() calls",
758		stencilOpSeparate,
759		GLenum,
760		ARG_LIST({
761			GL_FRONT,
762			GL_BACK,
763			GL_FRONT_AND_BACK
764		}),
765		GLenum,
766		ARG_LIST({
767			GL_KEEP,
768			GL_ZERO,
769			GL_REPLACE,
770			GL_INCR,
771			GL_DECR,
772			GL_INVERT,
773			GL_INCR_WRAP,
774			GL_DECR_WRAP
775		}),
776		GLenum,
777		ARG_LIST({
778			GL_KEEP,
779			GL_ZERO,
780			GL_REPLACE,
781			GL_INCR,
782			GL_DECR,
783			GL_INVERT,
784			GL_INCR_WRAP,
785			GL_DECR_WRAP
786		}),
787		GLenum,
788		ARG_LIST({
789			GL_KEEP,
790			GL_ZERO,
791			GL_REPLACE,
792			GL_INCR,
793			GL_DECR,
794			GL_INVERT,
795			GL_INCR_WRAP,
796			GL_DECR_WRAP
797		})
798	);
799
800	ADD_ARG_CASE4(blend_func_separate, "Test cost of glBlendFuncSeparate() calls",
801		blendFuncSeparate,
802		GLenum,
803		ARG_LIST({
804			GL_ZERO,
805			GL_ONE,
806			GL_SRC_COLOR,
807			GL_ONE_MINUS_SRC_COLOR,
808			GL_DST_COLOR,
809			GL_ONE_MINUS_DST_COLOR,
810			GL_SRC_ALPHA,
811			GL_ONE_MINUS_SRC_ALPHA,
812			GL_DST_ALPHA,
813			GL_ONE_MINUS_DST_ALPHA,
814			GL_CONSTANT_COLOR,
815			GL_ONE_MINUS_CONSTANT_COLOR,
816			GL_CONSTANT_ALPHA,
817			GL_ONE_MINUS_CONSTANT_ALPHA
818		}),
819		GLenum,
820		ARG_LIST({
821			GL_ZERO,
822			GL_ONE,
823			GL_SRC_COLOR,
824			GL_ONE_MINUS_SRC_COLOR,
825			GL_DST_COLOR,
826			GL_ONE_MINUS_DST_COLOR,
827			GL_SRC_ALPHA,
828			GL_ONE_MINUS_SRC_ALPHA,
829			GL_DST_ALPHA,
830			GL_ONE_MINUS_DST_ALPHA,
831			GL_CONSTANT_COLOR,
832			GL_ONE_MINUS_CONSTANT_COLOR,
833			GL_CONSTANT_ALPHA,
834			GL_ONE_MINUS_CONSTANT_ALPHA
835		}),
836		GLenum,
837		ARG_LIST({
838			GL_ZERO,
839			GL_ONE,
840			GL_SRC_COLOR,
841			GL_ONE_MINUS_SRC_COLOR,
842			GL_DST_COLOR,
843			GL_ONE_MINUS_DST_COLOR,
844			GL_SRC_ALPHA,
845			GL_ONE_MINUS_SRC_ALPHA,
846			GL_DST_ALPHA,
847			GL_ONE_MINUS_DST_ALPHA,
848			GL_CONSTANT_COLOR,
849			GL_ONE_MINUS_CONSTANT_COLOR,
850			GL_CONSTANT_ALPHA,
851			GL_ONE_MINUS_CONSTANT_ALPHA
852		}),
853		GLenum,
854		ARG_LIST({
855			GL_ZERO,
856			GL_ONE,
857			GL_SRC_COLOR,
858			GL_ONE_MINUS_SRC_COLOR,
859			GL_DST_COLOR,
860			GL_ONE_MINUS_DST_COLOR,
861			GL_SRC_ALPHA,
862			GL_ONE_MINUS_SRC_ALPHA,
863			GL_DST_ALPHA,
864			GL_ONE_MINUS_DST_ALPHA,
865			GL_CONSTANT_COLOR,
866			GL_ONE_MINUS_CONSTANT_COLOR,
867			GL_CONSTANT_ALPHA,
868			GL_ONE_MINUS_CONSTANT_ALPHA
869		})
870	);
871
872	ADD_ARG_CASE4(color_mask, "Test cost of glColorMask() calls",
873		colorMask,
874		GLboolean,
875		ARG_LIST({
876			GL_TRUE,
877			GL_FALSE
878		}),
879		GLboolean,
880		ARG_LIST({
881			GL_TRUE,
882			GL_FALSE
883		}),
884		GLboolean,
885		ARG_LIST({
886			GL_TRUE,
887			GL_FALSE
888		}),
889		GLboolean,
890		ARG_LIST({
891			GL_TRUE,
892			GL_FALSE
893		})
894	);
895
896	ADD_ARG_CASE4(clear_color, "Test cost of glClearColor() calls",
897		clearColor,
898		GLclampf,
899		ARG_LIST({
900			0.0f,
901			1.0f,
902			0.5f,
903			0.33f
904		}),
905		GLclampf,
906		ARG_LIST({
907			0.0f,
908			1.0f,
909			0.5f,
910			0.33f
911		}),
912		GLclampf,
913		ARG_LIST({
914			0.0f,
915			1.0f,
916			0.5f,
917			0.33f
918		}),
919		GLclampf,
920		ARG_LIST({
921			0.0f,
922			1.0f,
923			0.5f,
924			0.33f
925		})
926	);
927
928	ADD_ARG_CASE6(vertex_attrib_pointer, "Test cost of glVertexAttribPointer() calls",
929		vertexAttribPointer,
930		GLuint,
931		ARG_LIST({
932			0,
933			1,
934			2,
935			3,
936			4,
937			5,
938			6,
939			7
940		}),
941		GLint,
942		ARG_LIST({
943			1,
944			2,
945			3,
946			4
947		}),
948		GLenum,
949		ARG_LIST({
950			GL_UNSIGNED_BYTE,
951			GL_BYTE,
952			GL_UNSIGNED_SHORT,
953			GL_SHORT,
954			GL_FLOAT
955		}),
956		GLboolean,
957		ARG_LIST({
958			GL_FALSE,
959			GL_TRUE
960		}),
961		GLsizei,
962		ARG_LIST({
963			0,
964			2,
965			4
966		}),
967		void*,
968		ARG_LIST({
969			(void*)(deUintptr)(0x0FF),
970			(void*)(deUintptr)(0x0EF)
971		})
972	);
973
974	ADD_ARG_CASE2(vertex_attrib_divisor, "Test cost of glVertexAttribDivisor() calls",
975		vertexAttribDivisor,
976		GLuint,
977		ARG_LIST({
978			0,
979			1,
980			2,
981			3,
982			4,
983			5,
984			6,
985			7
986		}),
987		GLuint,
988		ARG_LIST({
989			0,
990			1,
991			3,
992			7,
993			11,
994			127,
995			256
996		})
997	);
998
999	ADD_ARG_CASE3(bind_buffer_base, "Test cost of glBindBufferBase() calls. Note: uses only buffer 0.",
1000		bindBufferBase,
1001		GLuint,
1002		ARG_LIST({
1003			GL_UNIFORM_BUFFER
1004		}),
1005		GLuint,
1006		ARG_LIST({
1007			0,
1008			1,
1009			2,
1010			3
1011		}),
1012		GLuint,
1013		ARG_LIST({
1014			0
1015		})
1016	);
1017
1018	ADD_ARG_CASE5(bind_buffer_range, "Test cost of glBindBufferRange() calls. Note: uses only buffer 0.",
1019		bindBufferRange,
1020		GLuint,
1021		ARG_LIST({
1022			GL_UNIFORM_BUFFER
1023		}),
1024		GLuint,
1025		ARG_LIST({
1026			0,
1027			1,
1028			2,
1029			3
1030		}),
1031		GLuint,
1032		ARG_LIST({
1033			0
1034		}),
1035		GLintptr,
1036		ARG_LIST({
1037			0
1038		}),
1039		GLsizeiptr,
1040		ARG_LIST({
1041			0
1042		})
1043	);
1044}
1045
1046} // Performance
1047} // gles3
1048} // deqp
1049