1e5c31af7Sopenharmony_ci#ifndef _GL4CSHADERBALLOTTESTS_HPP
2e5c31af7Sopenharmony_ci#define _GL4CSHADERBALLOTTESTS_HPP
3e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci* OpenGL Conformance Test Suite
5e5c31af7Sopenharmony_ci* -----------------------------
6e5c31af7Sopenharmony_ci*
7e5c31af7Sopenharmony_ci* Copyright (c) 2014-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  gl4cShaderBallotTests.hpp
23e5c31af7Sopenharmony_ci* \brief Conformance tests for the ARB_shader_ballot functionality.
24e5c31af7Sopenharmony_ci*/ /*-------------------------------------------------------------------*/
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci#include "esextcTestCaseBase.hpp"
27e5c31af7Sopenharmony_ci#include "glcTestCase.hpp"
28e5c31af7Sopenharmony_ci#include "gluShaderProgram.hpp"
29e5c31af7Sopenharmony_ci
30e5c31af7Sopenharmony_ci#include <map>
31e5c31af7Sopenharmony_ci#include <vector>
32e5c31af7Sopenharmony_ci
33e5c31af7Sopenharmony_cinamespace gl4cts
34e5c31af7Sopenharmony_ci{
35e5c31af7Sopenharmony_ciclass ShaderBallotBaseTestCase : public glcts::TestCaseBase
36e5c31af7Sopenharmony_ci{
37e5c31af7Sopenharmony_cipublic:
38e5c31af7Sopenharmony_ci	class ShaderPipeline
39e5c31af7Sopenharmony_ci	{
40e5c31af7Sopenharmony_ci	private:
41e5c31af7Sopenharmony_ci		glu::ShaderProgram* m_programRender;
42e5c31af7Sopenharmony_ci		glu::ShaderProgram* m_programCompute;
43e5c31af7Sopenharmony_ci		glu::ShaderType		m_testedShader;
44e5c31af7Sopenharmony_ci
45e5c31af7Sopenharmony_ci		std::vector<std::string> m_shaders[glu::SHADERTYPE_LAST];
46e5c31af7Sopenharmony_ci		char**					 m_shaderChunks[glu::SHADERTYPE_LAST];
47e5c31af7Sopenharmony_ci
48e5c31af7Sopenharmony_ci		std::map<std::string, std::string> m_specializationMap;
49e5c31af7Sopenharmony_ci
50e5c31af7Sopenharmony_ci		void renderQuad(deqp::Context& context);
51e5c31af7Sopenharmony_ci		void executeComputeShader(deqp::Context& context);
52e5c31af7Sopenharmony_ci
53e5c31af7Sopenharmony_ci	public:
54e5c31af7Sopenharmony_ci		ShaderPipeline(glu::ShaderType testedShader, const std::string& contentSnippet,
55e5c31af7Sopenharmony_ci					   std::map<std::string, std::string> specMap = std::map<std::string, std::string>());
56e5c31af7Sopenharmony_ci		~ShaderPipeline();
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_ci		const char* const* getShaderParts(glu::ShaderType shaderType) const;
59e5c31af7Sopenharmony_ci		unsigned int getShaderPartsCount(glu::ShaderType shaderType) const;
60e5c31af7Sopenharmony_ci
61e5c31af7Sopenharmony_ci		void use(deqp::Context& context);
62e5c31af7Sopenharmony_ci
63e5c31af7Sopenharmony_ci		inline void setShaderPrograms(glu::ShaderProgram* programRender, glu::ShaderProgram* programCompute)
64e5c31af7Sopenharmony_ci		{
65e5c31af7Sopenharmony_ci			m_programRender  = programRender;
66e5c31af7Sopenharmony_ci			m_programCompute = programCompute;
67e5c31af7Sopenharmony_ci		}
68e5c31af7Sopenharmony_ci
69e5c31af7Sopenharmony_ci		inline const std::map<std::string, std::string>& getSpecializationMap() const
70e5c31af7Sopenharmony_ci		{
71e5c31af7Sopenharmony_ci			return m_specializationMap;
72e5c31af7Sopenharmony_ci		}
73e5c31af7Sopenharmony_ci
74e5c31af7Sopenharmony_ci		void test(deqp::Context& context);
75e5c31af7Sopenharmony_ci	};
76e5c31af7Sopenharmony_ci
77e5c31af7Sopenharmony_ciprotected:
78e5c31af7Sopenharmony_ci	/* Protected methods */
79e5c31af7Sopenharmony_ci	void createShaderPrograms(ShaderPipeline& pipeline);
80e5c31af7Sopenharmony_ci
81e5c31af7Sopenharmony_ci	/* Protected members*/
82e5c31af7Sopenharmony_ci	std::vector<ShaderPipeline*> m_shaderPipelines;
83e5c31af7Sopenharmony_ci
84e5c31af7Sopenharmony_ci	typedef std::vector<ShaderPipeline*>::iterator ShaderPipelineIter;
85e5c31af7Sopenharmony_ci
86e5c31af7Sopenharmony_cipublic:
87e5c31af7Sopenharmony_ci	/* Public methods */
88e5c31af7Sopenharmony_ci	ShaderBallotBaseTestCase(deqp::Context& context, const char* name, const char* description)
89e5c31af7Sopenharmony_ci		: TestCaseBase(context, glcts::ExtParameters(glu::GLSL_VERSION_450, glcts::EXTENSIONTYPE_EXT), name,
90e5c31af7Sopenharmony_ci					   description)
91e5c31af7Sopenharmony_ci	{
92e5c31af7Sopenharmony_ci	}
93e5c31af7Sopenharmony_ci
94e5c31af7Sopenharmony_ci	virtual ~ShaderBallotBaseTestCase();
95e5c31af7Sopenharmony_ci
96e5c31af7Sopenharmony_ci	static bool validateScreenPixels(deqp::Context& context, tcu::Vec4 desiredColor, tcu::Vec4 ignoredColor);
97e5c31af7Sopenharmony_ci	static bool validateScreenPixelsSameColor(deqp::Context& context, tcu::Vec4 ignoredColor);
98e5c31af7Sopenharmony_ci	static bool validateColor(tcu::Vec4 testedColor, tcu::Vec4 desiredColor);
99e5c31af7Sopenharmony_ci};
100e5c31af7Sopenharmony_ci
101e5c31af7Sopenharmony_ci/** Test verifies availability of new build-in features
102e5c31af7Sopenharmony_ci**/
103e5c31af7Sopenharmony_ciclass ShaderBallotAvailabilityTestCase : public ShaderBallotBaseTestCase
104e5c31af7Sopenharmony_ci{
105e5c31af7Sopenharmony_cipublic:
106e5c31af7Sopenharmony_ci	/* Public methods */
107e5c31af7Sopenharmony_ci	ShaderBallotAvailabilityTestCase(deqp::Context& context);
108e5c31af7Sopenharmony_ci
109e5c31af7Sopenharmony_ci	void init();
110e5c31af7Sopenharmony_ci
111e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
112e5c31af7Sopenharmony_ci};
113e5c31af7Sopenharmony_ci
114e5c31af7Sopenharmony_ci/** Test verifies values of gl_SubGroup*MaskARB variables
115e5c31af7Sopenharmony_ci**/
116e5c31af7Sopenharmony_ciclass ShaderBallotBitmasksTestCase : public ShaderBallotBaseTestCase
117e5c31af7Sopenharmony_ci{
118e5c31af7Sopenharmony_cipublic:
119e5c31af7Sopenharmony_ci	/* Public methods */
120e5c31af7Sopenharmony_ci	ShaderBallotBitmasksTestCase(deqp::Context& context);
121e5c31af7Sopenharmony_ci
122e5c31af7Sopenharmony_ci	void init();
123e5c31af7Sopenharmony_ci
124e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
125e5c31af7Sopenharmony_ci
126e5c31af7Sopenharmony_ciprotected:
127e5c31af7Sopenharmony_ci	/* Protected members*/
128e5c31af7Sopenharmony_ci	std::map<std::string, std::string> m_maskVars;
129e5c31af7Sopenharmony_ci
130e5c31af7Sopenharmony_ci	typedef std::map<std::string, std::string>::iterator MaskVarIter;
131e5c31af7Sopenharmony_ci};
132e5c31af7Sopenharmony_ci
133e5c31af7Sopenharmony_ci/** Test verifies ballotARB calls and returned results
134e5c31af7Sopenharmony_ci**/
135e5c31af7Sopenharmony_ciclass ShaderBallotFunctionBallotTestCase : public ShaderBallotBaseTestCase
136e5c31af7Sopenharmony_ci{
137e5c31af7Sopenharmony_cipublic:
138e5c31af7Sopenharmony_ci	/* Public methods */
139e5c31af7Sopenharmony_ci	ShaderBallotFunctionBallotTestCase(deqp::Context& context);
140e5c31af7Sopenharmony_ci
141e5c31af7Sopenharmony_ci	void init();
142e5c31af7Sopenharmony_ci
143e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
144e5c31af7Sopenharmony_ci};
145e5c31af7Sopenharmony_ci
146e5c31af7Sopenharmony_ci/** Test verifies readInvocationARB and readFirstInvocationARB function calls
147e5c31af7Sopenharmony_ci**/
148e5c31af7Sopenharmony_ciclass ShaderBallotFunctionReadTestCase : public ShaderBallotBaseTestCase
149e5c31af7Sopenharmony_ci{
150e5c31af7Sopenharmony_cipublic:
151e5c31af7Sopenharmony_ci	/* Public methods */
152e5c31af7Sopenharmony_ci	ShaderBallotFunctionReadTestCase(deqp::Context& context);
153e5c31af7Sopenharmony_ci
154e5c31af7Sopenharmony_ci	void init();
155e5c31af7Sopenharmony_ci
156e5c31af7Sopenharmony_ci	tcu::TestNode::IterateResult iterate();
157e5c31af7Sopenharmony_ci};
158e5c31af7Sopenharmony_ci
159e5c31af7Sopenharmony_ciclass ShaderBallotTests : public deqp::TestCaseGroup
160e5c31af7Sopenharmony_ci{
161e5c31af7Sopenharmony_cipublic:
162e5c31af7Sopenharmony_ci	ShaderBallotTests(deqp::Context& context);
163e5c31af7Sopenharmony_ci	void init(void);
164e5c31af7Sopenharmony_ci
165e5c31af7Sopenharmony_ciprivate:
166e5c31af7Sopenharmony_ci	ShaderBallotTests(const ShaderBallotTests& other);
167e5c31af7Sopenharmony_ci	ShaderBallotTests& operator=(const ShaderBallotTests& other);
168e5c31af7Sopenharmony_ci};
169e5c31af7Sopenharmony_ci
170e5c31af7Sopenharmony_ci} /* gl4cts namespace */
171e5c31af7Sopenharmony_ci
172e5c31af7Sopenharmony_ci#endif // _GL4CSHADERBALLOTTESTS_HPP
173