• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _GLSSHADERLIBRARYCASE_HPP
2 #define _GLSSHADERLIBRARYCASE_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 Shader test case.
24  *//*--------------------------------------------------------------------*/
25 
26 #include "gluDefs.hpp"
27 #include "gluShaderUtil.hpp"
28 #include "gluRenderContext.hpp"
29 #include "gluShaderProgram.hpp"
30 #include "tcuTestCase.hpp"
31 #include "tcuSurface.hpp"
32 
33 #include <string>
34 #include <vector>
35 
36 namespace deqp
37 {
38 namespace gls
39 {
40 namespace sl
41 {
42 
43 // ShaderCase node.
44 
45 class ShaderCase : public tcu::TestCase
46 {
47 public:
48 	enum CaseType
49 	{
50 		CASETYPE_COMPLETE = 0,		//!< Has all shaders specified separately.
51 		CASETYPE_VERTEX_ONLY,		//!< "Both" case, vertex shader sub case.
52 		CASETYPE_FRAGMENT_ONLY,		//!< "Both" case, fragment shader sub case.
53 
54 		CASETYPE_LAST
55 	};
56 
57 	enum ExpectResult
58 	{
59 		EXPECT_PASS = 0,
60 		EXPECT_COMPILE_FAIL,
61 		EXPECT_LINK_FAIL,
62 		EXPECT_COMPILE_LINK_FAIL,
63 		EXPECT_VALIDATION_FAIL,
64 		EXPECT_BUILD_SUCCESSFUL,
65 
66 		EXPECT_LAST
67 	};
68 
69 	struct Value
70 	{
71 		enum StorageType
72 		{
73 			STORAGE_UNIFORM,
74 			STORAGE_INPUT,
75 			STORAGE_OUTPUT,
76 
77 			STORAGE_LAST
78 		};
79 
80 		/* \todo [2010-03-31 petri] Replace with another vector to allow a) arrays, b) compact representation */
81 		union Element
82 		{
83 			float		float32;
84 			deInt32		int32;
85 			deInt32		bool32;
86 		};
87 
88 		StorageType				storageType;
89 		std::string				valueName;
90 		glu::DataType			dataType;
91 		int						arrayLength;	// Number of elements in array (currently always 1).
92 		std::vector<Element>	elements;		// Scalar values (length dataType.scalarSize * arrayLength).
93 	};
94 
95 	struct ValueBlock
96 	{
97 							ValueBlock (void);
98 
99 		int					arrayLength;		// Combined array length of each value (lengths must be same, or one).
100 		std::vector<Value>	values;
101 	};
102 
103 	class CaseRequirement
104 	{
105 	public:
106 		enum RequirementType
107 		{
108 			REQUIREMENTTYPE_EXTENSION = 0,
109 			REQUIREMENTTYPE_IMPLEMENTATION_LIMIT,
110 			REQUIREMENTTYPE_FULL_GLSL_ES_100_SPEC,	//!< Full support (as opposed to limited as specified for GLES 2.0 (See GLSL Appendix A)) cannot be queried
111 
112 			REQUIREMENTTYPE_LAST
113 		};
114 
115 									CaseRequirement								(void);
116 
117 		static CaseRequirement		createAnyExtensionRequirement				(const std::vector<std::string>& requirements, deUint32 effectiveShaderStageFlags);
118 		static CaseRequirement		createLimitRequirement						(deUint32 enumName, int ref);
119 		static CaseRequirement		createFullGLSLES100SpecificationRequirement	(void);
120 		void						checkRequirements							(glu::RenderContext& renderCtx, const glu::ContextInfo& contextInfo);
121 
getType(void) const122 		RequirementType				getType										(void) const { return m_type; };
getSupportedExtension(void) const123 		std::string					getSupportedExtension						(void) const { DE_ASSERT(m_type == REQUIREMENTTYPE_EXTENSION); DE_ASSERT(m_supportedExtensionNdx >= 0); return m_extensions[m_supportedExtensionNdx]; }
getAffectedExtensionStageFlags(void) const124 		deUint32					getAffectedExtensionStageFlags				(void) const { DE_ASSERT(m_type == REQUIREMENTTYPE_EXTENSION); return m_effectiveShaderStageFlags; }
125 
126 	private:
127 		RequirementType				m_type;
128 
129 		// REQUIREMENTTYPE_EXTENSION:
130 		std::vector<std::string>	m_extensions;
131 		int							m_supportedExtensionNdx;
132 		deUint32					m_effectiveShaderStageFlags;
133 
134 		// REQUIREMENTTYPE_IMPLEMENTATION_LIMIT:
135 		deUint32					m_enumName;
136 		int							m_referenceValue;
137 	};
138 
139 	struct ShaderCaseSpecification
140 	{
141 										ShaderCaseSpecification				(void);
142 
143 		static ShaderCaseSpecification	generateSharedSourceVertexCase		(ExpectResult expectResult_, glu::GLSLVersion targetVersion_, const std::vector<ValueBlock>& values, const std::string& sharedSource);
144 		static ShaderCaseSpecification	generateSharedSourceFragmentCase	(ExpectResult expectResult_, glu::GLSLVersion targetVersion_, const std::vector<ValueBlock>& values, const std::string& sharedSource);
145 
146 		ExpectResult					expectResult;
147 		glu::GLSLVersion				targetVersion;
148 		CaseType						caseType;
149 		std::vector<CaseRequirement>	requirements;
150 		std::vector<ValueBlock>			valueBlocks;
151 		std::vector<std::string>		vertexSources;
152 		std::vector<std::string>		fragmentSources;
153 		std::vector<std::string>		tessCtrlSources;
154 		std::vector<std::string>		tessEvalSources;
155 		std::vector<std::string>		geometrySources;
156 	};
157 
158 	struct PipelineProgram
159 	{
160 		deUint32						activeStageBits;
161 		std::vector<CaseRequirement>	requirements;
162 		std::vector<std::string>		vertexSources;
163 		std::vector<std::string>		fragmentSources;
164 		std::vector<std::string>		tessCtrlSources;
165 		std::vector<std::string>		tessEvalSources;
166 		std::vector<std::string>		geometrySources;
167 	};
168 
169 	struct PipelineCaseSpecification
170 	{
171 		ExpectResult					expectResult;
172 		glu::GLSLVersion				targetVersion;
173 		CaseType						caseType;
174 		std::vector<ValueBlock>			valueBlocks;
175 		std::vector<PipelineProgram>	programs;
176 	};
177 
178 	// Methods.
179 									ShaderCase										(tcu::TestContext&				testCtx,
180 																					 glu::RenderContext&			renderCtx,
181 																					 const glu::ContextInfo&		contextInfo,
182 																					 const char*					caseName,
183 																					 const char*					description,
184 																					 const ShaderCaseSpecification&	specification);
185 									ShaderCase										(tcu::TestContext&					testCtx,
186 																					 glu::RenderContext&				renderCtx,
187 																					 const glu::ContextInfo&			contextInfo,
188 																					 const char*						caseName,
189 																					 const char*						description,
190 																					 const PipelineCaseSpecification&	specification);
191 	virtual							~ShaderCase										(void);
192 
193 private:
194 	void							init											(void);
195 	bool							execute											(void);
196 	IterateResult					iterate											(void);
197 
198 									ShaderCase										(const ShaderCase&);		// not allowed!
199 	ShaderCase&						operator=										(const ShaderCase&);		// not allowed!
200 
201 	std::string						genVertexShader									(const ValueBlock& valueBlock) const;
202 	std::string						genFragmentShader								(const ValueBlock& valueBlock) const;
203 	std::string						specializeVertexShader							(const char* src, const ValueBlock& valueBlock) const;
204 	std::string						specializeFragmentShader						(const char* src, const ValueBlock& valueBlock) const;
205 	void							specializeVertexShaders							(glu::ProgramSources& dst, const std::vector<std::string>& sources, const ValueBlock& valueBlock, const std::vector<ShaderCase::CaseRequirement>& requirements) const;
206 	void							specializeFragmentShaders						(glu::ProgramSources& dst, const std::vector<std::string>& sources, const ValueBlock& valueBlock, const std::vector<ShaderCase::CaseRequirement>& requirements) const;
207 	void							specializeGeometryShaders						(glu::ProgramSources& dst, const std::vector<std::string>& sources, const ValueBlock& valueBlock, const std::vector<ShaderCase::CaseRequirement>& requirements) const;
208 	void							specializeTessControlShaders					(glu::ProgramSources& dst, const std::vector<std::string>& sources, const ValueBlock& valueBlock, const std::vector<ShaderCase::CaseRequirement>& requirements) const;
209 	void							specializeTessEvalShaders						(glu::ProgramSources& dst, const std::vector<std::string>& sources, const ValueBlock& valueBlock, const std::vector<ShaderCase::CaseRequirement>& requirements) const;
210 	bool							isTessellationPresent							(void) const;
211 	bool							anyProgramRequiresFullGLSLES100Specification	(void) const;
212 
213 	void							dumpValues										(const ValueBlock& valueBlock, int arrayNdx);
214 
215 	bool 							checkPixels										(tcu::Surface& surface, int minX, int maxX, int minY, int maxY);
216 
217 	struct ProgramObject
218 	{
219 		glu::ProgramSources		programSources;
220 		PipelineProgram			spec;
221 	};
222 
223 	// Member variables.
224 	glu::RenderContext&				m_renderCtx;
225 	const glu::ContextInfo&			m_contextInfo;
226 	const CaseType					m_caseType;
227 	const ExpectResult				m_expectResult;
228 	const glu::GLSLVersion			m_targetVersion;
229 	const bool						m_separatePrograms;
230 	std::vector<ValueBlock>			m_valueBlocks;
231 	std::vector<ProgramObject>		m_programs;
232 };
233 
234 } // sl
235 } // gls
236 } // deqp
237 
238 #endif // _GLSSHADERLIBRARYCASE_HPP
239