1e5c31af7Sopenharmony_ci#ifndef _GL4CSHADERDRAWPARAMETERSTESTS_HPP
2e5c31af7Sopenharmony_ci#define _GL4CSHADERDRAWPARAMETERSTESTS_HPP
3e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci * OpenGL Conformance Test Suite
5e5c31af7Sopenharmony_ci * -----------------------------
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Copyright (c) 2016 The Khronos Group Inc.
8e5c31af7Sopenharmony_ci *
9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci *
15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci * limitations under the License.
20e5c31af7Sopenharmony_ci *
21e5c31af7Sopenharmony_ci */ /*!
22e5c31af7Sopenharmony_ci * \file
23e5c31af7Sopenharmony_ci * \brief
24e5c31af7Sopenharmony_ci */ /*-------------------------------------------------------------------*/
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci/**
27e5c31af7Sopenharmony_ci */ /*!
28e5c31af7Sopenharmony_ci * \file  gl4cShaderDrawParametersTests.hpp
29e5c31af7Sopenharmony_ci * \brief Conformance tests for the GL_ARB_shader_draw_parameters functionality.
30e5c31af7Sopenharmony_ci */ /*-------------------------------------------------------------------*/
31e5c31af7Sopenharmony_ci#include "glcTestCase.hpp"
32e5c31af7Sopenharmony_ci#include "glwDefs.hpp"
33e5c31af7Sopenharmony_ci#include "tcuDefs.hpp"
34e5c31af7Sopenharmony_ci
35e5c31af7Sopenharmony_ciusing namespace glw;
36e5c31af7Sopenharmony_ciusing namespace glu;
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_cinamespace gl4cts
39e5c31af7Sopenharmony_ci{
40e5c31af7Sopenharmony_ci
41e5c31af7Sopenharmony_citypedef struct
42e5c31af7Sopenharmony_ci{
43e5c31af7Sopenharmony_ci	GLuint count;
44e5c31af7Sopenharmony_ci	GLuint instanceCount;
45e5c31af7Sopenharmony_ci	GLuint first;
46e5c31af7Sopenharmony_ci	GLuint baseInstance;
47e5c31af7Sopenharmony_ci} SDPDrawArraysIndirectCommand;
48e5c31af7Sopenharmony_ci
49e5c31af7Sopenharmony_citypedef struct
50e5c31af7Sopenharmony_ci{
51e5c31af7Sopenharmony_ci	GLuint count;
52e5c31af7Sopenharmony_ci	GLuint instanceCount;
53e5c31af7Sopenharmony_ci	GLuint firstIndex;
54e5c31af7Sopenharmony_ci	GLuint baseVertex;
55e5c31af7Sopenharmony_ci	GLuint baseInstance;
56e5c31af7Sopenharmony_ci} SDPDrawElementsIndirectCommand;
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_cistruct ResultPoint
59e5c31af7Sopenharmony_ci{
60e5c31af7Sopenharmony_ci	GLfloat x;
61e5c31af7Sopenharmony_ci	GLfloat y;
62e5c31af7Sopenharmony_ci	GLfloat red;
63e5c31af7Sopenharmony_ci	GLfloat green;
64e5c31af7Sopenharmony_ci	GLfloat blue;
65e5c31af7Sopenharmony_ci
66e5c31af7Sopenharmony_ci	ResultPoint(GLfloat _x, GLfloat _y, GLfloat _red, GLfloat _green, GLfloat _blue)
67e5c31af7Sopenharmony_ci		: x(_x), y(_y), red(_red), green(_green), blue(_blue)
68e5c31af7Sopenharmony_ci	{
69e5c31af7Sopenharmony_ci		// Left blank
70e5c31af7Sopenharmony_ci	}
71e5c31af7Sopenharmony_ci};
72e5c31af7Sopenharmony_ci
73e5c31af7Sopenharmony_ci/** Test verifies if extension is available for GLSL
74e5c31af7Sopenharmony_ci **/
75e5c31af7Sopenharmony_ciclass ShaderDrawParametersExtensionTestCase : public deqp::TestCase
76e5c31af7Sopenharmony_ci{
77e5c31af7Sopenharmony_cipublic:
78e5c31af7Sopenharmony_ci	/* Public methods */
79e5c31af7Sopenharmony_ci	ShaderDrawParametersExtensionTestCase(deqp::Context& context);
80e5c31af7Sopenharmony_ci
81e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
82e5c31af7Sopenharmony_ci
83e5c31af7Sopenharmony_ciprivate:
84e5c31af7Sopenharmony_ci	/* Private members */
85e5c31af7Sopenharmony_ci};
86e5c31af7Sopenharmony_ci
87e5c31af7Sopenharmony_ci/** This is base class for drawing commands tests
88e5c31af7Sopenharmony_ci **/
89e5c31af7Sopenharmony_ciclass ShaderDrawParametersTestBase : public deqp::TestCase
90e5c31af7Sopenharmony_ci{
91e5c31af7Sopenharmony_cipublic:
92e5c31af7Sopenharmony_ci	/* Public methods */
93e5c31af7Sopenharmony_ci	ShaderDrawParametersTestBase(deqp::Context& context, const char* name, const char* description);
94e5c31af7Sopenharmony_ci
95e5c31af7Sopenharmony_ci	virtual void				 init();
96e5c31af7Sopenharmony_ci	virtual void				 deinit();
97e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
98e5c31af7Sopenharmony_ci
99e5c31af7Sopenharmony_ciprivate:
100e5c31af7Sopenharmony_ci	/* Private methods */
101e5c31af7Sopenharmony_ci	bool draw();
102e5c31af7Sopenharmony_ci	bool verify();
103e5c31af7Sopenharmony_ci
104e5c31af7Sopenharmony_ciprotected:
105e5c31af7Sopenharmony_ci	/* Protected members */
106e5c31af7Sopenharmony_ci	GLuint m_vao;
107e5c31af7Sopenharmony_ci	GLuint m_arrayBuffer;
108e5c31af7Sopenharmony_ci	GLuint m_elementBuffer;
109e5c31af7Sopenharmony_ci	GLuint m_drawIndirectBuffer;
110e5c31af7Sopenharmony_ci	GLuint m_parameterBuffer;
111e5c31af7Sopenharmony_ci
112e5c31af7Sopenharmony_ci	std::vector<ResultPoint> m_resultPoints;
113e5c31af7Sopenharmony_ci
114e5c31af7Sopenharmony_ci	/* Protected methods */
115e5c31af7Sopenharmony_ci	virtual void initChild();
116e5c31af7Sopenharmony_ci	virtual void deinitChild();
117e5c31af7Sopenharmony_ci	virtual void drawCommand();
118e5c31af7Sopenharmony_ci};
119e5c31af7Sopenharmony_ci
120e5c31af7Sopenharmony_ciclass ShaderDrawArraysParametersTestCase : public ShaderDrawParametersTestBase
121e5c31af7Sopenharmony_ci{
122e5c31af7Sopenharmony_cipublic:
123e5c31af7Sopenharmony_ci	/* Public methods */
124e5c31af7Sopenharmony_ci	ShaderDrawArraysParametersTestCase(deqp::Context& context)
125e5c31af7Sopenharmony_ci		: ShaderDrawParametersTestBase(context, "ShaderDrawArraysParameters",
126e5c31af7Sopenharmony_ci									   "Verifies shader draw parameters with DrawArrays command")
127e5c31af7Sopenharmony_ci	{
128e5c31af7Sopenharmony_ci	}
129e5c31af7Sopenharmony_ci
130e5c31af7Sopenharmony_ciprivate:
131e5c31af7Sopenharmony_ci	/* Private methods */
132e5c31af7Sopenharmony_ci	virtual void initChild();
133e5c31af7Sopenharmony_ci	virtual void deinitChild();
134e5c31af7Sopenharmony_ci	virtual void drawCommand();
135e5c31af7Sopenharmony_ci};
136e5c31af7Sopenharmony_ci
137e5c31af7Sopenharmony_ciclass ShaderDrawElementsParametersTestCase : public ShaderDrawParametersTestBase
138e5c31af7Sopenharmony_ci{
139e5c31af7Sopenharmony_cipublic:
140e5c31af7Sopenharmony_ci	/* Public methods */
141e5c31af7Sopenharmony_ci	ShaderDrawElementsParametersTestCase(deqp::Context& context)
142e5c31af7Sopenharmony_ci		: ShaderDrawParametersTestBase(context, "ShaderDrawElementsParameters",
143e5c31af7Sopenharmony_ci									   "Verifies shader draw parameters with DrawElements command")
144e5c31af7Sopenharmony_ci	{
145e5c31af7Sopenharmony_ci	}
146e5c31af7Sopenharmony_ci
147e5c31af7Sopenharmony_ciprivate:
148e5c31af7Sopenharmony_ci	/* Private methods */
149e5c31af7Sopenharmony_ci	virtual void initChild();
150e5c31af7Sopenharmony_ci	virtual void deinitChild();
151e5c31af7Sopenharmony_ci	virtual void drawCommand();
152e5c31af7Sopenharmony_ci};
153e5c31af7Sopenharmony_ci
154e5c31af7Sopenharmony_ciclass ShaderDrawArraysIndirectParametersTestCase : public ShaderDrawParametersTestBase
155e5c31af7Sopenharmony_ci{
156e5c31af7Sopenharmony_cipublic:
157e5c31af7Sopenharmony_ci	/* Public methods */
158e5c31af7Sopenharmony_ci	ShaderDrawArraysIndirectParametersTestCase(deqp::Context& context)
159e5c31af7Sopenharmony_ci		: ShaderDrawParametersTestBase(context, "ShaderDrawArraysIndirectParameters",
160e5c31af7Sopenharmony_ci									   "Verifies shader draw parameters with DrawArraysIndirect command")
161e5c31af7Sopenharmony_ci	{
162e5c31af7Sopenharmony_ci	}
163e5c31af7Sopenharmony_ci
164e5c31af7Sopenharmony_ciprivate:
165e5c31af7Sopenharmony_ci	/* Private methods */
166e5c31af7Sopenharmony_ci	virtual void initChild();
167e5c31af7Sopenharmony_ci	virtual void deinitChild();
168e5c31af7Sopenharmony_ci	virtual void drawCommand();
169e5c31af7Sopenharmony_ci};
170e5c31af7Sopenharmony_ci
171e5c31af7Sopenharmony_ciclass ShaderDrawElementsIndirectParametersTestCase : public ShaderDrawParametersTestBase
172e5c31af7Sopenharmony_ci{
173e5c31af7Sopenharmony_cipublic:
174e5c31af7Sopenharmony_ci	/* Public methods */
175e5c31af7Sopenharmony_ci	ShaderDrawElementsIndirectParametersTestCase(deqp::Context& context)
176e5c31af7Sopenharmony_ci		: ShaderDrawParametersTestBase(context, "ShaderDrawElementsIndirectParameters",
177e5c31af7Sopenharmony_ci									   "Verifies shader draw parameters with DrawElementsIndirect command")
178e5c31af7Sopenharmony_ci	{
179e5c31af7Sopenharmony_ci	}
180e5c31af7Sopenharmony_ci
181e5c31af7Sopenharmony_ciprivate:
182e5c31af7Sopenharmony_ci	/* Private methods */
183e5c31af7Sopenharmony_ci	virtual void initChild();
184e5c31af7Sopenharmony_ci	virtual void deinitChild();
185e5c31af7Sopenharmony_ci	virtual void drawCommand();
186e5c31af7Sopenharmony_ci};
187e5c31af7Sopenharmony_ci
188e5c31af7Sopenharmony_ciclass ShaderDrawArraysInstancedParametersTestCase : public ShaderDrawParametersTestBase
189e5c31af7Sopenharmony_ci{
190e5c31af7Sopenharmony_cipublic:
191e5c31af7Sopenharmony_ci	/* Public methods */
192e5c31af7Sopenharmony_ci	ShaderDrawArraysInstancedParametersTestCase(deqp::Context& context)
193e5c31af7Sopenharmony_ci		: ShaderDrawParametersTestBase(context, "ShaderDrawArraysInstancedParameters",
194e5c31af7Sopenharmony_ci									   "Verifies shader draw parameters with DrawArraysInstanced command")
195e5c31af7Sopenharmony_ci	{
196e5c31af7Sopenharmony_ci	}
197e5c31af7Sopenharmony_ci
198e5c31af7Sopenharmony_ciprivate:
199e5c31af7Sopenharmony_ci	/* Private methods */
200e5c31af7Sopenharmony_ci	virtual void initChild();
201e5c31af7Sopenharmony_ci	virtual void deinitChild();
202e5c31af7Sopenharmony_ci	virtual void drawCommand();
203e5c31af7Sopenharmony_ci};
204e5c31af7Sopenharmony_ci
205e5c31af7Sopenharmony_ciclass ShaderDrawElementsInstancedParametersTestCase : public ShaderDrawParametersTestBase
206e5c31af7Sopenharmony_ci{
207e5c31af7Sopenharmony_cipublic:
208e5c31af7Sopenharmony_ci	/* Public methods */
209e5c31af7Sopenharmony_ci	ShaderDrawElementsInstancedParametersTestCase(deqp::Context& context)
210e5c31af7Sopenharmony_ci		: ShaderDrawParametersTestBase(context, "ShaderDrawElementsInstancedParameters",
211e5c31af7Sopenharmony_ci									   "Verifies shader draw parameters with DrawElementsInstanced command")
212e5c31af7Sopenharmony_ci	{
213e5c31af7Sopenharmony_ci	}
214e5c31af7Sopenharmony_ci
215e5c31af7Sopenharmony_ciprivate:
216e5c31af7Sopenharmony_ci	/* Private methods */
217e5c31af7Sopenharmony_ci	virtual void initChild();
218e5c31af7Sopenharmony_ci	virtual void deinitChild();
219e5c31af7Sopenharmony_ci	virtual void drawCommand();
220e5c31af7Sopenharmony_ci};
221e5c31af7Sopenharmony_ci
222e5c31af7Sopenharmony_ciclass ShaderMultiDrawArraysParametersTestCase : public ShaderDrawParametersTestBase
223e5c31af7Sopenharmony_ci{
224e5c31af7Sopenharmony_cipublic:
225e5c31af7Sopenharmony_ci	/* Public methods */
226e5c31af7Sopenharmony_ci	ShaderMultiDrawArraysParametersTestCase(deqp::Context& context)
227e5c31af7Sopenharmony_ci		: ShaderDrawParametersTestBase(context, "ShaderMultiDrawArraysParameters",
228e5c31af7Sopenharmony_ci									   "Verifies shader draw parameters with MultiDrawArrays command")
229e5c31af7Sopenharmony_ci	{
230e5c31af7Sopenharmony_ci	}
231e5c31af7Sopenharmony_ci
232e5c31af7Sopenharmony_ciprivate:
233e5c31af7Sopenharmony_ci	/* Private methods */
234e5c31af7Sopenharmony_ci	virtual void initChild();
235e5c31af7Sopenharmony_ci	virtual void deinitChild();
236e5c31af7Sopenharmony_ci	virtual void drawCommand();
237e5c31af7Sopenharmony_ci};
238e5c31af7Sopenharmony_ci
239e5c31af7Sopenharmony_ciclass ShaderMultiDrawElementsParametersTestCase : public ShaderDrawParametersTestBase
240e5c31af7Sopenharmony_ci{
241e5c31af7Sopenharmony_cipublic:
242e5c31af7Sopenharmony_ci	/* Public methods */
243e5c31af7Sopenharmony_ci	ShaderMultiDrawElementsParametersTestCase(deqp::Context& context)
244e5c31af7Sopenharmony_ci		: ShaderDrawParametersTestBase(context, "ShaderMultiDrawElementsParameters",
245e5c31af7Sopenharmony_ci									   "Verifies shader draw parameters with MultiDrawElements command")
246e5c31af7Sopenharmony_ci	{
247e5c31af7Sopenharmony_ci	}
248e5c31af7Sopenharmony_ci
249e5c31af7Sopenharmony_ciprivate:
250e5c31af7Sopenharmony_ci	/* Private methods */
251e5c31af7Sopenharmony_ci	virtual void initChild();
252e5c31af7Sopenharmony_ci	virtual void deinitChild();
253e5c31af7Sopenharmony_ci	virtual void drawCommand();
254e5c31af7Sopenharmony_ci};
255e5c31af7Sopenharmony_ci
256e5c31af7Sopenharmony_ciclass ShaderMultiDrawArraysIndirectParametersTestCase : public ShaderDrawParametersTestBase
257e5c31af7Sopenharmony_ci{
258e5c31af7Sopenharmony_cipublic:
259e5c31af7Sopenharmony_ci	/* Public methods */
260e5c31af7Sopenharmony_ci	ShaderMultiDrawArraysIndirectParametersTestCase(deqp::Context& context)
261e5c31af7Sopenharmony_ci		: ShaderDrawParametersTestBase(context, "ShaderMultiDrawArraysIndirectParameters",
262e5c31af7Sopenharmony_ci									   "Verifies shader draw parameters with MultiDrawArraysIndirect command")
263e5c31af7Sopenharmony_ci	{
264e5c31af7Sopenharmony_ci	}
265e5c31af7Sopenharmony_ci
266e5c31af7Sopenharmony_ciprivate:
267e5c31af7Sopenharmony_ci	/* Private methods */
268e5c31af7Sopenharmony_ci	virtual void initChild();
269e5c31af7Sopenharmony_ci	virtual void deinitChild();
270e5c31af7Sopenharmony_ci	virtual void drawCommand();
271e5c31af7Sopenharmony_ci};
272e5c31af7Sopenharmony_ci
273e5c31af7Sopenharmony_ciclass ShaderMultiDrawElementsIndirectParametersTestCase : public ShaderDrawParametersTestBase
274e5c31af7Sopenharmony_ci{
275e5c31af7Sopenharmony_cipublic:
276e5c31af7Sopenharmony_ci	/* Public methods */
277e5c31af7Sopenharmony_ci	ShaderMultiDrawElementsIndirectParametersTestCase(deqp::Context& context)
278e5c31af7Sopenharmony_ci		: ShaderDrawParametersTestBase(context, "ShaderMultiDrawElementsIndirectParameters",
279e5c31af7Sopenharmony_ci									   "Verifies shader draw parameters with MultiDrawElementsIndirect command")
280e5c31af7Sopenharmony_ci	{
281e5c31af7Sopenharmony_ci	}
282e5c31af7Sopenharmony_ci
283e5c31af7Sopenharmony_ciprivate:
284e5c31af7Sopenharmony_ci	/* Private methods */
285e5c31af7Sopenharmony_ci	virtual void initChild();
286e5c31af7Sopenharmony_ci	virtual void deinitChild();
287e5c31af7Sopenharmony_ci	virtual void drawCommand();
288e5c31af7Sopenharmony_ci};
289e5c31af7Sopenharmony_ci
290e5c31af7Sopenharmony_ciclass ShaderMultiDrawArraysIndirectCountParametersTestCase : public ShaderDrawParametersTestBase
291e5c31af7Sopenharmony_ci{
292e5c31af7Sopenharmony_cipublic:
293e5c31af7Sopenharmony_ci	/* Public methods */
294e5c31af7Sopenharmony_ci	ShaderMultiDrawArraysIndirectCountParametersTestCase(deqp::Context& context)
295e5c31af7Sopenharmony_ci		: ShaderDrawParametersTestBase(context, "MultiDrawArraysIndirectCountParameters",
296e5c31af7Sopenharmony_ci									   "Verifies shader draw parameters with MultiDrawArraysIndirectCount command")
297e5c31af7Sopenharmony_ci	{
298e5c31af7Sopenharmony_ci	}
299e5c31af7Sopenharmony_ci
300e5c31af7Sopenharmony_ciprivate:
301e5c31af7Sopenharmony_ci	/* Private methods */
302e5c31af7Sopenharmony_ci	virtual void initChild();
303e5c31af7Sopenharmony_ci	virtual void deinitChild();
304e5c31af7Sopenharmony_ci	virtual void drawCommand();
305e5c31af7Sopenharmony_ci};
306e5c31af7Sopenharmony_ci
307e5c31af7Sopenharmony_ciclass ShaderMultiDrawElementsIndirectCountParametersTestCase : public ShaderDrawParametersTestBase
308e5c31af7Sopenharmony_ci{
309e5c31af7Sopenharmony_cipublic:
310e5c31af7Sopenharmony_ci	/* Public methods */
311e5c31af7Sopenharmony_ci	ShaderMultiDrawElementsIndirectCountParametersTestCase(deqp::Context& context)
312e5c31af7Sopenharmony_ci		: ShaderDrawParametersTestBase(context, "MultiDrawElementIndirectCountParameters",
313e5c31af7Sopenharmony_ci									   "Verifies shader draw parameters with MultiDrawElementIndirectCount command")
314e5c31af7Sopenharmony_ci	{
315e5c31af7Sopenharmony_ci	}
316e5c31af7Sopenharmony_ci
317e5c31af7Sopenharmony_ciprivate:
318e5c31af7Sopenharmony_ci	/* Private methods */
319e5c31af7Sopenharmony_ci	virtual void initChild();
320e5c31af7Sopenharmony_ci	virtual void deinitChild();
321e5c31af7Sopenharmony_ci	virtual void drawCommand();
322e5c31af7Sopenharmony_ci};
323e5c31af7Sopenharmony_ci
324e5c31af7Sopenharmony_ci/** Test group which encapsulates all sparse buffer conformance tests */
325e5c31af7Sopenharmony_ciclass ShaderDrawParametersTests : public deqp::TestCaseGroup
326e5c31af7Sopenharmony_ci{
327e5c31af7Sopenharmony_cipublic:
328e5c31af7Sopenharmony_ci	/* Public methods */
329e5c31af7Sopenharmony_ci	ShaderDrawParametersTests(deqp::Context& context);
330e5c31af7Sopenharmony_ci
331e5c31af7Sopenharmony_ci	void init();
332e5c31af7Sopenharmony_ci
333e5c31af7Sopenharmony_ciprivate:
334e5c31af7Sopenharmony_ci	ShaderDrawParametersTests(const ShaderDrawParametersTests& other);
335e5c31af7Sopenharmony_ci	ShaderDrawParametersTests& operator=(const ShaderDrawParametersTests& other);
336e5c31af7Sopenharmony_ci};
337e5c31af7Sopenharmony_ci
338e5c31af7Sopenharmony_ci} /* gl4cts namespace */
339e5c31af7Sopenharmony_ci
340e5c31af7Sopenharmony_ci#endif // _GL4CSHADERDRAWPARAMETERSTESTS_HPP
341