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