1e5c31af7Sopenharmony_ci#ifndef _GL4CGLSPIRVTESTS_HPP
2e5c31af7Sopenharmony_ci#define _GL4CGLSPIRVTESTS_HPP
3e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci * OpenGL Conformance Test Suite
5e5c31af7Sopenharmony_ci * -----------------------------
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Copyright (c) 2017 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  gl4cGlSpirvTests.hpp
29e5c31af7Sopenharmony_ci * \brief Conformance tests for the GL_ARB_gl_spirv functionality.
30e5c31af7Sopenharmony_ci */ /*-------------------------------------------------------------------*/
31e5c31af7Sopenharmony_ci
32e5c31af7Sopenharmony_ci#include "../common/glcSpirvUtils.hpp"
33e5c31af7Sopenharmony_ci#include "glcTestCase.hpp"
34e5c31af7Sopenharmony_ci#include "gluShaderProgram.hpp"
35e5c31af7Sopenharmony_ci#include "glwDefs.hpp"
36e5c31af7Sopenharmony_ci#include "tcuDefs.hpp"
37e5c31af7Sopenharmony_ci#include <map>
38e5c31af7Sopenharmony_ci#include <vector>
39e5c31af7Sopenharmony_ci
40e5c31af7Sopenharmony_ciusing namespace glu;
41e5c31af7Sopenharmony_ciusing namespace glw;
42e5c31af7Sopenharmony_ciusing namespace glc;
43e5c31af7Sopenharmony_ci
44e5c31af7Sopenharmony_cinamespace gl4cts
45e5c31af7Sopenharmony_ci{
46e5c31af7Sopenharmony_ci
47e5c31af7Sopenharmony_citypedef std::vector<std::string> CapabilitiesVec;
48e5c31af7Sopenharmony_ci
49e5c31af7Sopenharmony_ci/**  Verifies if using SPIR-V modules for each shader stage works as expected. */
50e5c31af7Sopenharmony_ciclass SpirvModulesPositiveTest : public deqp::TestCase
51e5c31af7Sopenharmony_ci{
52e5c31af7Sopenharmony_cipublic:
53e5c31af7Sopenharmony_ci	/* Public methods */
54e5c31af7Sopenharmony_ci	SpirvModulesPositiveTest(deqp::Context& context);
55e5c31af7Sopenharmony_ci
56e5c31af7Sopenharmony_ci	void init();
57e5c31af7Sopenharmony_ci	void deinit();
58e5c31af7Sopenharmony_ci
59e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
60e5c31af7Sopenharmony_ci
61e5c31af7Sopenharmony_ciprivate:
62e5c31af7Sopenharmony_ci	/* Private methods */
63e5c31af7Sopenharmony_ci
64e5c31af7Sopenharmony_ci	/* Private members */
65e5c31af7Sopenharmony_ci	GLuint m_texture;
66e5c31af7Sopenharmony_ci	GLuint m_fbo;
67e5c31af7Sopenharmony_ci
68e5c31af7Sopenharmony_ci	std::string m_vertex;
69e5c31af7Sopenharmony_ci	std::string m_tesselationCtrl;
70e5c31af7Sopenharmony_ci	std::string m_tesselationEval;
71e5c31af7Sopenharmony_ci	std::string m_geometry;
72e5c31af7Sopenharmony_ci	std::string m_fragment;
73e5c31af7Sopenharmony_ci};
74e5c31af7Sopenharmony_ci
75e5c31af7Sopenharmony_ci/**  Verifies if one binary module can be associated with multiple shader objects. */
76e5c31af7Sopenharmony_ciclass SpirvShaderBinaryMultipleShaderObjectsTest : public deqp::TestCase
77e5c31af7Sopenharmony_ci{
78e5c31af7Sopenharmony_cipublic:
79e5c31af7Sopenharmony_ci	/* Public methods */
80e5c31af7Sopenharmony_ci	SpirvShaderBinaryMultipleShaderObjectsTest(deqp::Context& context);
81e5c31af7Sopenharmony_ci
82e5c31af7Sopenharmony_ci	void init();
83e5c31af7Sopenharmony_ci	void deinit();
84e5c31af7Sopenharmony_ci
85e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
86e5c31af7Sopenharmony_ci
87e5c31af7Sopenharmony_ciprivate:
88e5c31af7Sopenharmony_ci	/* Private methods */
89e5c31af7Sopenharmony_ci
90e5c31af7Sopenharmony_ci	/* Private members */
91e5c31af7Sopenharmony_ci	std::string m_spirv;
92e5c31af7Sopenharmony_ci};
93e5c31af7Sopenharmony_ci
94e5c31af7Sopenharmony_ci/**  Verifies if state queries for new features added by ARB_gl_spirv works as expected. */
95e5c31af7Sopenharmony_ciclass SpirvModulesStateQueriesTest : public deqp::TestCase
96e5c31af7Sopenharmony_ci{
97e5c31af7Sopenharmony_cipublic:
98e5c31af7Sopenharmony_ci	/* Public methods */
99e5c31af7Sopenharmony_ci	SpirvModulesStateQueriesTest(deqp::Context& context);
100e5c31af7Sopenharmony_ci
101e5c31af7Sopenharmony_ci	void init();
102e5c31af7Sopenharmony_ci	void deinit();
103e5c31af7Sopenharmony_ci
104e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
105e5c31af7Sopenharmony_ci
106e5c31af7Sopenharmony_ciprivate:
107e5c31af7Sopenharmony_ci	/* Private methods */
108e5c31af7Sopenharmony_ci
109e5c31af7Sopenharmony_ci	/* Private members */
110e5c31af7Sopenharmony_ci	std::string m_vertex;
111e5c31af7Sopenharmony_ci};
112e5c31af7Sopenharmony_ci
113e5c31af7Sopenharmony_ci/**  Verifies if new features added by ARB_gl_spirv generate error messages as expected. */
114e5c31af7Sopenharmony_ciclass SpirvModulesErrorVerificationTest : public deqp::TestCase
115e5c31af7Sopenharmony_ci{
116e5c31af7Sopenharmony_cipublic:
117e5c31af7Sopenharmony_ci	/* Public methods */
118e5c31af7Sopenharmony_ci	SpirvModulesErrorVerificationTest(deqp::Context& context);
119e5c31af7Sopenharmony_ci
120e5c31af7Sopenharmony_ci	void init();
121e5c31af7Sopenharmony_ci	void deinit();
122e5c31af7Sopenharmony_ci
123e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
124e5c31af7Sopenharmony_ci
125e5c31af7Sopenharmony_ciprivate:
126e5c31af7Sopenharmony_ci	/* Private methods */
127e5c31af7Sopenharmony_ci
128e5c31af7Sopenharmony_ci	/* Private members */
129e5c31af7Sopenharmony_ci	std::string m_vertex;
130e5c31af7Sopenharmony_ci
131e5c31af7Sopenharmony_ci	GLuint m_glslShaderId;
132e5c31af7Sopenharmony_ci	GLuint m_spirvShaderId;
133e5c31af7Sopenharmony_ci	GLuint m_programId;
134e5c31af7Sopenharmony_ci	GLuint m_textureId;
135e5c31af7Sopenharmony_ci};
136e5c31af7Sopenharmony_ci
137e5c31af7Sopenharmony_ci/**  Verifies if GLSL to Spir-V converter supports Spir-V features. */
138e5c31af7Sopenharmony_ciclass SpirvGlslToSpirVEnableTest : public deqp::TestCase
139e5c31af7Sopenharmony_ci{
140e5c31af7Sopenharmony_cipublic:
141e5c31af7Sopenharmony_ci	/* Public methods */
142e5c31af7Sopenharmony_ci	SpirvGlslToSpirVEnableTest(deqp::Context& context);
143e5c31af7Sopenharmony_ci
144e5c31af7Sopenharmony_ci	void init();
145e5c31af7Sopenharmony_ci	void deinit();
146e5c31af7Sopenharmony_ci
147e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
148e5c31af7Sopenharmony_ci
149e5c31af7Sopenharmony_ciprivate:
150e5c31af7Sopenharmony_ci	/* Private methods */
151e5c31af7Sopenharmony_ci
152e5c31af7Sopenharmony_ci	/* Private members */
153e5c31af7Sopenharmony_ci	std::string m_vertex;
154e5c31af7Sopenharmony_ci};
155e5c31af7Sopenharmony_ci
156e5c31af7Sopenharmony_ci/**  Verifies if GLSL built-in functions are supported by Spir-V. */
157e5c31af7Sopenharmony_ciclass SpirvGlslToSpirVBuiltInFunctionsTest : public deqp::TestCase
158e5c31af7Sopenharmony_ci{
159e5c31af7Sopenharmony_cipublic:
160e5c31af7Sopenharmony_ci	/* Public methods */
161e5c31af7Sopenharmony_ci	SpirvGlslToSpirVBuiltInFunctionsTest(deqp::Context& context);
162e5c31af7Sopenharmony_ci
163e5c31af7Sopenharmony_ci	void init();
164e5c31af7Sopenharmony_ci	void deinit();
165e5c31af7Sopenharmony_ci
166e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
167e5c31af7Sopenharmony_ci
168e5c31af7Sopenharmony_ciprivate:
169e5c31af7Sopenharmony_ci	/* Private methods */
170e5c31af7Sopenharmony_ci	void initMappings();
171e5c31af7Sopenharmony_ci
172e5c31af7Sopenharmony_ci	/* Private members */
173e5c31af7Sopenharmony_ci	SpirVMapping m_mappings;
174e5c31af7Sopenharmony_ci
175e5c31af7Sopenharmony_ci	std::string				  m_commonVertex;
176e5c31af7Sopenharmony_ci	std::string				  m_commonTessEval;
177e5c31af7Sopenharmony_ci	std::vector<ShaderSource> m_sources;
178e5c31af7Sopenharmony_ci};
179e5c31af7Sopenharmony_ci
180e5c31af7Sopenharmony_ci/**  Verifies if constant specialization feature works as expected. */
181e5c31af7Sopenharmony_ciclass SpirvGlslToSpirVSpecializationConstantsTest : public deqp::TestCase
182e5c31af7Sopenharmony_ci{
183e5c31af7Sopenharmony_cipublic:
184e5c31af7Sopenharmony_ci	/* Public methods */
185e5c31af7Sopenharmony_ci	SpirvGlslToSpirVSpecializationConstantsTest(deqp::Context& context);
186e5c31af7Sopenharmony_ci
187e5c31af7Sopenharmony_ci	void init();
188e5c31af7Sopenharmony_ci	void deinit();
189e5c31af7Sopenharmony_ci
190e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
191e5c31af7Sopenharmony_ci
192e5c31af7Sopenharmony_ciprivate:
193e5c31af7Sopenharmony_ci	/* Private methods */
194e5c31af7Sopenharmony_ci
195e5c31af7Sopenharmony_ci	/* Private members */
196e5c31af7Sopenharmony_ci	GLuint m_texture;
197e5c31af7Sopenharmony_ci	GLuint m_fbo;
198e5c31af7Sopenharmony_ci
199e5c31af7Sopenharmony_ci	std::string m_vertex;
200e5c31af7Sopenharmony_ci	std::string m_fragment;
201e5c31af7Sopenharmony_ci};
202e5c31af7Sopenharmony_ci
203e5c31af7Sopenharmony_ci/**  Verifies if Spir-V built in variable decorations works as expected. */
204e5c31af7Sopenharmony_ciclass SpirvValidationBuiltInVariableDecorationsTest : public deqp::TestCase
205e5c31af7Sopenharmony_ci{
206e5c31af7Sopenharmony_cipublic:
207e5c31af7Sopenharmony_ci	/* Public methods */
208e5c31af7Sopenharmony_ci	SpirvValidationBuiltInVariableDecorationsTest(deqp::Context& context);
209e5c31af7Sopenharmony_ci
210e5c31af7Sopenharmony_ci	void init();
211e5c31af7Sopenharmony_ci	void deinit();
212e5c31af7Sopenharmony_ci
213e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
214e5c31af7Sopenharmony_ci
215e5c31af7Sopenharmony_ciprivate: /* Private structs */
216e5c31af7Sopenharmony_ci	struct ValidationOutputStruct
217e5c31af7Sopenharmony_ci	{
218e5c31af7Sopenharmony_ci		GLubyte x, y, z;
219e5c31af7Sopenharmony_ci		GLuint  value;
220e5c31af7Sopenharmony_ci
221e5c31af7Sopenharmony_ci		ValidationOutputStruct() : x(0), y(0), z(0), value(0)
222e5c31af7Sopenharmony_ci		{
223e5c31af7Sopenharmony_ci		}
224e5c31af7Sopenharmony_ci
225e5c31af7Sopenharmony_ci		ValidationOutputStruct(GLubyte _x, GLubyte _y, GLuint _value) : x(_x), y(_y), z(0), value(_value)
226e5c31af7Sopenharmony_ci		{
227e5c31af7Sopenharmony_ci		}
228e5c31af7Sopenharmony_ci
229e5c31af7Sopenharmony_ci		ValidationOutputStruct(GLubyte _x, GLubyte _y, GLubyte _z, GLuint _value) : x(_x), y(_y), z(_z), value(_value)
230e5c31af7Sopenharmony_ci		{
231e5c31af7Sopenharmony_ci		}
232e5c31af7Sopenharmony_ci	};
233e5c31af7Sopenharmony_ci
234e5c31af7Sopenharmony_ci	typedef std::vector<ValidationOutputStruct> ValidationOutputVec;
235e5c31af7Sopenharmony_ci
236e5c31af7Sopenharmony_ci	typedef bool (SpirvValidationBuiltInVariableDecorationsTest::*ValidationFuncPtr)(ValidationOutputVec& outputs);
237e5c31af7Sopenharmony_ci
238e5c31af7Sopenharmony_ci	struct ValidationStruct
239e5c31af7Sopenharmony_ci	{
240e5c31af7Sopenharmony_ci		std::vector<ShaderSource> shaders;
241e5c31af7Sopenharmony_ci		ValidationOutputVec		  outputs;
242e5c31af7Sopenharmony_ci		ValidationFuncPtr		  validationFuncPtr;
243e5c31af7Sopenharmony_ci
244e5c31af7Sopenharmony_ci		ValidationStruct() : validationFuncPtr(DE_NULL)
245e5c31af7Sopenharmony_ci		{
246e5c31af7Sopenharmony_ci		}
247e5c31af7Sopenharmony_ci
248e5c31af7Sopenharmony_ci		ValidationStruct(ValidationFuncPtr funcPtr) : validationFuncPtr(funcPtr)
249e5c31af7Sopenharmony_ci		{
250e5c31af7Sopenharmony_ci		}
251e5c31af7Sopenharmony_ci	};
252e5c31af7Sopenharmony_ci
253e5c31af7Sopenharmony_ci	/* Private methods */
254e5c31af7Sopenharmony_ci	bool validComputeFunc(ValidationOutputVec& outputs);
255e5c31af7Sopenharmony_ci	bool validPerVertexFragFunc(ValidationOutputVec& outputs);
256e5c31af7Sopenharmony_ci	bool validPerVertexPointFunc(ValidationOutputVec& outputs);
257e5c31af7Sopenharmony_ci	bool validTesselationGeometryFunc(ValidationOutputVec& outputs);
258e5c31af7Sopenharmony_ci	bool validMultiSamplingFunc(ValidationOutputVec& outputs);
259e5c31af7Sopenharmony_ci
260e5c31af7Sopenharmony_ci	/* Private members */
261e5c31af7Sopenharmony_ci	SpirVMapping m_mappings;
262e5c31af7Sopenharmony_ci
263e5c31af7Sopenharmony_ci	std::vector<ValidationStruct> m_validations;
264e5c31af7Sopenharmony_ci
265e5c31af7Sopenharmony_ci	std::string m_compute;
266e5c31af7Sopenharmony_ci	std::string m_vertex;
267e5c31af7Sopenharmony_ci	std::string m_tesselationCtrl;
268e5c31af7Sopenharmony_ci	std::string m_tesselationEval;
269e5c31af7Sopenharmony_ci	std::string m_geometry;
270e5c31af7Sopenharmony_ci	std::string m_fragment;
271e5c31af7Sopenharmony_ci};
272e5c31af7Sopenharmony_ci
273e5c31af7Sopenharmony_ci/**  Verifies if Spir-V capabilities works as expected. */
274e5c31af7Sopenharmony_ciclass SpirvValidationCapabilitiesTest : public deqp::TestCase
275e5c31af7Sopenharmony_ci{
276e5c31af7Sopenharmony_cipublic:
277e5c31af7Sopenharmony_ci	/* Public methods */
278e5c31af7Sopenharmony_ci	SpirvValidationCapabilitiesTest(deqp::Context& context);
279e5c31af7Sopenharmony_ci
280e5c31af7Sopenharmony_ci	void init();
281e5c31af7Sopenharmony_ci	void deinit();
282e5c31af7Sopenharmony_ci
283e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
284e5c31af7Sopenharmony_ci
285e5c31af7Sopenharmony_ci	int spirVCapabilityCutOff(std::string spirVSrcInput, std::string& spirVSrcOutput, CapabilitiesVec& capabilities,
286e5c31af7Sopenharmony_ci							  int& currentCapability);
287e5c31af7Sopenharmony_ci
288e5c31af7Sopenharmony_ciprivate:
289e5c31af7Sopenharmony_ci	typedef std::map<glu::ShaderType, CapabilitiesVec> CapabilitiesMap;
290e5c31af7Sopenharmony_ci
291e5c31af7Sopenharmony_ci	struct ShaderStage
292e5c31af7Sopenharmony_ci	{
293e5c31af7Sopenharmony_ci		std::string		name;
294e5c31af7Sopenharmony_ci		ShaderSource	source;
295e5c31af7Sopenharmony_ci		ShaderBinary	binary;
296e5c31af7Sopenharmony_ci		CapabilitiesVec caps;
297e5c31af7Sopenharmony_ci
298e5c31af7Sopenharmony_ci		ShaderStage()
299e5c31af7Sopenharmony_ci		{
300e5c31af7Sopenharmony_ci		}
301e5c31af7Sopenharmony_ci
302e5c31af7Sopenharmony_ci		ShaderStage(std::string _name) : name(_name)
303e5c31af7Sopenharmony_ci		{
304e5c31af7Sopenharmony_ci		}
305e5c31af7Sopenharmony_ci	};
306e5c31af7Sopenharmony_ci
307e5c31af7Sopenharmony_ci	typedef std::vector<ShaderStage> Pipeline;
308e5c31af7Sopenharmony_ci
309e5c31af7Sopenharmony_ci	/* Private methods */
310e5c31af7Sopenharmony_ci
311e5c31af7Sopenharmony_ci	/* Private members */
312e5c31af7Sopenharmony_ci	std::vector<Pipeline> m_pipelines;
313e5c31af7Sopenharmony_ci};
314e5c31af7Sopenharmony_ci
315e5c31af7Sopenharmony_ci/** Test group which encapsulates all sparse buffer conformance tests */
316e5c31af7Sopenharmony_ciclass GlSpirvTests : public deqp::TestCaseGroup
317e5c31af7Sopenharmony_ci{
318e5c31af7Sopenharmony_cipublic:
319e5c31af7Sopenharmony_ci	/* Public methods */
320e5c31af7Sopenharmony_ci	GlSpirvTests(deqp::Context& context);
321e5c31af7Sopenharmony_ci
322e5c31af7Sopenharmony_ci	void init();
323e5c31af7Sopenharmony_ci
324e5c31af7Sopenharmony_ciprivate:
325e5c31af7Sopenharmony_ci	GlSpirvTests(const GlSpirvTests& other);
326e5c31af7Sopenharmony_ci	GlSpirvTests& operator=(const GlSpirvTests& other);
327e5c31af7Sopenharmony_ci};
328e5c31af7Sopenharmony_ci
329e5c31af7Sopenharmony_ci} /* glcts namespace */
330e5c31af7Sopenharmony_ci
331e5c31af7Sopenharmony_ci#endif // _GL4CGLSPIRVTESTS_HPP
332