13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.1 Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -------------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Shader state query tests
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es31fShaderStateQueryTests.hpp"
25c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "es31fInfoLogQueryShared.hpp"
26c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "glsStateQueryUtil.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuStringTemplate.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluShaderProgram.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluRenderContext.hpp"
31c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "gluCallLogWrapper.hpp"
328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluContextInfo.hpp"
33c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "gluStrUtil.hpp"
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwFunctions.hpp"
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp"
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles31
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
46dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppestatic inline std::string brokenShaderSource (const glu::ContextType &contextType)
47dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe{
48dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe	const std::string glslVersionDecl = glu::getGLSLVersionDeclaration(glu::getContextTypeGLSLVersion(contextType));
49dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe
50dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe	return	glslVersionDecl + "\n"
51dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe			"broken, this should not compile,\n"
52dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe			"{";
53dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe}
54c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
55c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass BaseTypeCase : public TestCase
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
58c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	struct TestTypeInfo
59c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
60c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		glw::GLenum	glType;
61c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		const char*	declarationStr;
62c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		const char*	accessStr;
63c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	};
64c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
65c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry										BaseTypeCase		(Context& ctx, const char* name, const char* desc, const char* extension);
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
68c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	IterateResult						iterate				(void);
69c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	virtual std::vector<TestTypeInfo>	getInfos			(void) const = 0;
70c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	virtual void						checkRequirements	(void) const;
71c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
72c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	const char* const					m_extension;
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
75c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryBaseTypeCase::BaseTypeCase (Context& ctx, const char* name, const char* desc, const char* extension)
76c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	: TestCase		(ctx, name, desc)
77c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	, m_extension	(extension)
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
81c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryBaseTypeCase::IterateResult BaseTypeCase::iterate (void)
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
83dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe	static const char* const	vertexSourceTemplate	=	"${VERSIONDECL}\n"
848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															"in highp vec4 a_position;\n"
858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															"void main(void)\n"
868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															"{\n"
878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															"	gl_Position = a_position;\n"
888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															"}\n";
89dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe	static const char* const	fragmentSourceTemplate	=	"${VERSIONDECL}\n"
908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															"${EXTENSIONSTATEMENT}"
91c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry															"${DECLARATIONSTR};\n"
928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															"layout(location = 0) out highp vec4 dEQP_FragColor;\n"
938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															"void main(void)\n"
948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															"{\n"
95c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry															"	dEQP_FragColor = vec4(${ACCESSSTR});\n"
968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry															"}\n";
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
98c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	tcu::ResultCollector		result			(m_testCtx.getLog());
99c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	std::vector<TestTypeInfo>	samplerTypes	= getInfos();
100dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe	const bool					supportsES32	= glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
101c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
102dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe	if (m_extension && !m_context.getContextInfo().isExtensionSupported(m_extension) && !supportsES32)
103c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		throw tcu::NotSupportedError("Test requires " + std::string(m_extension));
104c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	checkRequirements();
105c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
106c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	for (int typeNdx = 0; typeNdx < (int)samplerTypes.size(); ++typeNdx)
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
108c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		const tcu::ScopedLogSection			section	(m_testCtx.getLog(),
109c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry													 std::string(glu::getShaderVarTypeStr(samplerTypes[typeNdx].glType).toString()),
110c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry													 "Uniform type " + glu::getShaderVarTypeStr(samplerTypes[typeNdx].glType).toString());
111c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
112c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		std::map<std::string, std::string>	shaderArgs;
113c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		shaderArgs["DECLARATIONSTR"]		= samplerTypes[typeNdx].declarationStr;
114c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		shaderArgs["ACCESSSTR"]				= samplerTypes[typeNdx].accessStr;
115dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe		shaderArgs["EXTENSIONSTATEMENT"]	= (m_extension && !supportsES32) ? (std::string() + "#extension " + m_extension + " : require\n") : ("");
116dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe		shaderArgs["VERSIONDECL"]			= glu::getGLSLVersionDeclaration(glu::getContextTypeGLSLVersion(m_context.getRenderContext().getType()));
117c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
118c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		const std::string					fragmentSource	= tcu::StringTemplate(fragmentSourceTemplate).specialize(shaderArgs);
119dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe		const std::string					vertexSource	= tcu::StringTemplate(vertexSourceTemplate).specialize(shaderArgs);
120c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		const glw::Functions&				gl				= m_context.getRenderContext().getFunctions();
121c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		glu::ShaderProgram					program			(m_context.getRenderContext(), glu::ProgramSources() << glu::VertexSource(vertexSource) << glu::FragmentSource(fragmentSource));
122c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
123c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		m_testCtx.getLog() << tcu::TestLog::Message << "Building program with uniform sampler of type " << glu::getShaderVarTypeStr(samplerTypes[typeNdx].glType) << tcu::TestLog::EndMessage;
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
125c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		if (!program.isOk())
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
127c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			m_testCtx.getLog() << program;
128c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			result.fail("could not build shader");
1298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		}
1308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		else
1318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
132c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			// only one uniform -- uniform at index 0
133c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			int uniforms = 0;
134c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			gl.getProgramiv(program.getProgram(), GL_ACTIVE_UNIFORMS, &uniforms);
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
136c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			if (uniforms != 1)
137c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry				result.fail("Unexpected GL_ACTIVE_UNIFORMS, expected 1");
138c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			else
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
140c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry				// check type
141c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry				const glw::GLuint	uniformIndex	= 0;
142c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry				glw::GLint			type			= 0;
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
144c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry				m_testCtx.getLog() << tcu::TestLog::Message << "Verifying uniform type." << tcu::TestLog::EndMessage;
145c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry				gl.getActiveUniformsiv(program.getProgram(), 1, &uniformIndex, GL_UNIFORM_TYPE, &type);
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
147c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry				if (type != (glw::GLint)samplerTypes[typeNdx].glType)
1488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				{
149c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry					std::ostringstream buf;
150c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry					buf << "Invalid type, expected " << samplerTypes[typeNdx].glType << ", got " << type;
151c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry					result.fail(buf.str());
1528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				}
153c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			}
154c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
156c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.getError(), "");
157c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
159c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	result.setTestContextResult(m_testCtx);
160c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return STOP;
161c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
163c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryvoid BaseTypeCase::checkRequirements (void) const
164c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
165c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
167c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass CoreSamplerTypeCase : public BaseTypeCase
168c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
169c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrypublic:
170c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry								CoreSamplerTypeCase	(Context& ctx, const char* name, const char* desc);
1718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
172c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryprivate:
173c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	std::vector<TestTypeInfo>	getInfos			(void) const;
174c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry};
1758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
176c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryCoreSamplerTypeCase::CoreSamplerTypeCase (Context& ctx, const char* name, const char* desc)
177c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	: BaseTypeCase(ctx, name, desc, DE_NULL)
178c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
179c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
181c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystd::vector<BaseTypeCase::TestTypeInfo> CoreSamplerTypeCase::getInfos (void) const
182c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
183c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	static const TestTypeInfo samplerTypes[] =
184c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
185c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_SAMPLER_2D_MULTISAMPLE,				"uniform highp sampler2DMS u_sampler",	"texelFetch(u_sampler, ivec2(gl_FragCoord.xy), 0)" },
186c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_INT_SAMPLER_2D_MULTISAMPLE,			"uniform highp isampler2DMS u_sampler",	"texelFetch(u_sampler, ivec2(gl_FragCoord.xy), 0)" },
187c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE,	"uniform highp usampler2DMS u_sampler",	"texelFetch(u_sampler, ivec2(gl_FragCoord.xy), 0)" },
188c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	};
189c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
190c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	std::vector<TestTypeInfo> infos;
191c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(samplerTypes); ++ndx)
192c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		infos.push_back(samplerTypes[ndx]);
193c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
194c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return infos;
195c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
196c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
197c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass MSArraySamplerTypeCase : public BaseTypeCase
198c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
199c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrypublic:
200c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry								MSArraySamplerTypeCase	(Context& ctx, const char* name, const char* desc);
201c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
202c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryprivate:
203c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	std::vector<TestTypeInfo>	getInfos				(void) const;
204c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry};
205c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
206c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryMSArraySamplerTypeCase::MSArraySamplerTypeCase (Context& ctx, const char* name, const char* desc)
207c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	: BaseTypeCase(ctx, name, desc, "GL_OES_texture_storage_multisample_2d_array")
208c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
209c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
210c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
211c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystd::vector<BaseTypeCase::TestTypeInfo> MSArraySamplerTypeCase::getInfos (void) const
212c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
213c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	static const TestTypeInfo samplerTypes[] =
214c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
215c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_SAMPLER_2D_MULTISAMPLE_ARRAY,				"uniform highp sampler2DMSArray u_sampler",		"texelFetch(u_sampler, ivec3(gl_FragCoord.xyz), 0)" },
216c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY,			"uniform highp isampler2DMSArray u_sampler",	"texelFetch(u_sampler, ivec3(gl_FragCoord.xyz), 0)" },
217c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY,	"uniform highp usampler2DMSArray u_sampler",	"texelFetch(u_sampler, ivec3(gl_FragCoord.xyz), 0)" },
218c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	};
219c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
220c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	std::vector<TestTypeInfo> infos;
221c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(samplerTypes); ++ndx)
222c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		infos.push_back(samplerTypes[ndx]);
223c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
224c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return infos;
225c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
226c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
227c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass TextureBufferSamplerTypeCase : public BaseTypeCase
228c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
229c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrypublic:
230c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry								TextureBufferSamplerTypeCase	(Context& ctx, const char* name, const char* desc);
231c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
232c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryprivate:
233c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	std::vector<TestTypeInfo>	getInfos						(void) const;
234c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry};
235c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
236c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryTextureBufferSamplerTypeCase::TextureBufferSamplerTypeCase (Context& ctx, const char* name, const char* desc)
237c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	: BaseTypeCase(ctx, name, desc, "GL_EXT_texture_buffer")
238c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
239c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
240c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
241c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystd::vector<BaseTypeCase::TestTypeInfo> TextureBufferSamplerTypeCase::getInfos (void) const
242c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
243c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	static const TestTypeInfo samplerTypes[] =
244c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
245c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_SAMPLER_BUFFER,				"uniform highp samplerBuffer u_sampler",	"texelFetch(u_sampler, int(gl_FragCoord.x))" },
246c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_INT_SAMPLER_BUFFER,			"uniform highp isamplerBuffer u_sampler",	"texelFetch(u_sampler, int(gl_FragCoord.x))" },
247c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_UNSIGNED_INT_SAMPLER_BUFFER,	"uniform highp usamplerBuffer u_sampler",	"texelFetch(u_sampler, int(gl_FragCoord.x))" },
248c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	};
249c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
250c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	std::vector<TestTypeInfo> infos;
251c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(samplerTypes); ++ndx)
252c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		infos.push_back(samplerTypes[ndx]);
253c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
254c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return infos;
255c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
256c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
257c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass TextureBufferImageTypeCase : public BaseTypeCase
258c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
259c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrypublic:
260c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry								TextureBufferImageTypeCase	(Context& ctx, const char* name, const char* desc);
261c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
262c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryprivate:
263c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	std::vector<TestTypeInfo>	getInfos					(void) const;
264c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	void						checkRequirements			(void) const;
265c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry};
266c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
267c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryTextureBufferImageTypeCase::TextureBufferImageTypeCase (Context& ctx, const char* name, const char* desc)
268c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	: BaseTypeCase(ctx, name, desc, "GL_EXT_texture_buffer")
269c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
270c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
271c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
272c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystd::vector<BaseTypeCase::TestTypeInfo> TextureBufferImageTypeCase::getInfos (void) const
273c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
274c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	static const TestTypeInfo samplerTypes[] =
275c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
276c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_IMAGE_BUFFER,				"layout(binding=0, rgba8) readonly uniform highp imageBuffer u_image",	"imageLoad(u_image, int(gl_FragCoord.x))" },
277c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_INT_IMAGE_BUFFER,			"layout(binding=0, r32i) readonly uniform highp iimageBuffer u_image",	"imageLoad(u_image, int(gl_FragCoord.x))" },
278c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_UNSIGNED_INT_IMAGE_BUFFER,	"layout(binding=0, r32ui) readonly uniform highp uimageBuffer u_image",	"imageLoad(u_image, int(gl_FragCoord.x))" },
279c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	};
280c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
281c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	std::vector<TestTypeInfo> infos;
282c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(samplerTypes); ++ndx)
283c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		infos.push_back(samplerTypes[ndx]);
284c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
285c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return infos;
286c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
287c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
288c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryvoid TextureBufferImageTypeCase::checkRequirements (void) const
289c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
290c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	if (m_context.getContextInfo().getInt(GL_MAX_FRAGMENT_IMAGE_UNIFORMS) < 1)
291c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		throw tcu::NotSupportedError("Test requires fragment images");
292c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
293c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
294c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass CubeArraySamplerTypeCase : public BaseTypeCase
295c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
296c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrypublic:
297c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry								CubeArraySamplerTypeCase	(Context& ctx, const char* name, const char* desc);
298c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
299c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryprivate:
300c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	std::vector<TestTypeInfo>	getInfos						(void) const;
301c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry};
302c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
303c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryCubeArraySamplerTypeCase::CubeArraySamplerTypeCase (Context& ctx, const char* name, const char* desc)
304c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	: BaseTypeCase(ctx, name, desc, "GL_EXT_texture_cube_map_array")
305c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
306c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
307c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
308c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystd::vector<BaseTypeCase::TestTypeInfo> CubeArraySamplerTypeCase::getInfos (void) const
309c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
310c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	static const TestTypeInfo samplerTypes[] =
311c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
312c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_SAMPLER_CUBE_MAP_ARRAY,				"uniform highp samplerCubeArray u_sampler",			"texture(u_sampler, gl_FragCoord.xxyz)"			},
313c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW,			"uniform highp samplerCubeArrayShadow u_sampler",	"texture(u_sampler, gl_FragCoord.xxyz, 0.5)"	},
314c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_INT_SAMPLER_CUBE_MAP_ARRAY,			"uniform highp isamplerCubeArray u_sampler",		"texture(u_sampler, gl_FragCoord.xxyz)"			},
315c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY,	"uniform highp usamplerCubeArray u_sampler",		"texture(u_sampler, gl_FragCoord.xxyz)"			},
316c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	};
317c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
318c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	std::vector<TestTypeInfo> infos;
319c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(samplerTypes); ++ndx)
320c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		infos.push_back(samplerTypes[ndx]);
321c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
322c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return infos;
323c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
324c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
325c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass CubeArrayImageTypeCase : public BaseTypeCase
326c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
327c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrypublic:
328c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry								CubeArrayImageTypeCase	(Context& ctx, const char* name, const char* desc);
329c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
330c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryprivate:
331c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	std::vector<TestTypeInfo>	getInfos				(void) const;
332c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	void						checkRequirements		(void) const;
333c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry};
334c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
335c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryCubeArrayImageTypeCase::CubeArrayImageTypeCase (Context& ctx, const char* name, const char* desc)
336c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	: BaseTypeCase(ctx, name, desc, "GL_EXT_texture_cube_map_array")
337c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
338c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
339c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
340c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystd::vector<BaseTypeCase::TestTypeInfo> CubeArrayImageTypeCase::getInfos (void) const
341c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
342c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	static const TestTypeInfo samplerTypes[] =
343c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
344c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_IMAGE_CUBE_MAP_ARRAY,				"layout(binding=0, rgba8) readonly uniform highp imageCubeArray u_image",	"imageLoad(u_image, ivec3(gl_FragCoord.xyx))"	},
345c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_INT_IMAGE_CUBE_MAP_ARRAY,			"layout(binding=0, r32i) readonly uniform highp iimageCubeArray u_image",	"imageLoad(u_image, ivec3(gl_FragCoord.xyx))"	},
346c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY,	"layout(binding=0, r32ui) readonly uniform highp uimageCubeArray u_image",	"imageLoad(u_image, ivec3(gl_FragCoord.xyx))"	},
347c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	};
348c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
349c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	std::vector<TestTypeInfo> infos;
350c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(samplerTypes); ++ndx)
351c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		infos.push_back(samplerTypes[ndx]);
352c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
353c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return infos;
354c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
355c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
356c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryvoid CubeArrayImageTypeCase::checkRequirements (void) const
357c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
358c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	if (m_context.getContextInfo().getInt(GL_MAX_FRAGMENT_IMAGE_UNIFORMS) < 1)
359c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		throw tcu::NotSupportedError("Test requires fragment images");
360c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
361c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
362c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass ShaderLogCase : public TestCase
363c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
364c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrypublic:
365c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry							ShaderLogCase	(Context& ctx, const char* name, const char* desc, glu::ShaderType shaderType);
366c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
367c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryprivate:
368c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	void					init			(void);
369c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	IterateResult			iterate			(void);
370c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
371c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	const glu::ShaderType	m_shaderType;
372c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry};
373c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
374c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryShaderLogCase::ShaderLogCase (Context& ctx, const char* name, const char* desc, glu::ShaderType shaderType)
375c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	: TestCase		(ctx, name, desc)
376c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	, m_shaderType	(shaderType)
377c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
378c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
379c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
380c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryvoid ShaderLogCase::init (void)
381c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
382dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe	const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
383dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe
384c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	switch (m_shaderType)
385c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
386c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case glu::SHADERTYPE_VERTEX:
387c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case glu::SHADERTYPE_FRAGMENT:
388c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case glu::SHADERTYPE_COMPUTE:
389c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			break;
390c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
391c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case glu::SHADERTYPE_GEOMETRY:
392dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe			if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader") && !supportsES32)
393dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe				throw tcu::NotSupportedError("Test requires GL_EXT_geometry_shader extension or an OpenGL ES 3.2 or higher context.");
394c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			break;
395c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
396c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case glu::SHADERTYPE_TESSELLATION_CONTROL:
397c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case glu::SHADERTYPE_TESSELLATION_EVALUATION:
398dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe			if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader") && !supportsES32)
399dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe				throw tcu::NotSupportedError("Test requires GL_EXT_tessellation_shader extension or an OpenGL ES 3.2 or higher context.");
400c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			break;
401c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
402c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		default:
403c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			DE_ASSERT(false);
404c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			break;
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
406c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
407c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
408c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryShaderLogCase::IterateResult ShaderLogCase::iterate (void)
409c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
410c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	using gls::StateQueryUtil::StateQueryMemoryWriteGuard;
411c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
412dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe	tcu::ResultCollector					result			(m_testCtx.getLog());
413dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe	glu::CallLogWrapper						gl				(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
414dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe	deUint32								shader			= 0;
415dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe	const std::string						source			= brokenShaderSource(m_context.getRenderContext().getType());
416dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe	const char* const						brokenSource	= source.c_str();
417c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	StateQueryMemoryWriteGuard<glw::GLint>	logLen;
418c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
419c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	gl.enableLogging(true);
420c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
421c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	m_testCtx.getLog() << tcu::TestLog::Message << "Trying to compile broken shader source." << tcu::TestLog::EndMessage;
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
423c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	shader = gl.glCreateShader(glu::getGLShaderType(m_shaderType));
424c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "create shader");
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
426dec5bc5116040efecd92babd70f2d4699ac66b66Daniel Andrade Groppe	gl.glShaderSource(shader, 1, &brokenSource, DE_NULL);
427c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	gl.glCompileShader(shader);
428c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "compile");
429c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
430c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	gl.glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLen);
431c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	logLen.verifyValidity(result);
432c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
433c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	if (!logLen.isUndefined())
434c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		verifyInfoLogQuery(result, gl, logLen, shader, &glu::CallLogWrapper::glGetShaderInfoLog, "glGetShaderInfoLog");
435c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
436c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	gl.glDeleteShader(shader);
437c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "delete");
438c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
439c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	result.setTestContextResult(m_testCtx);
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return STOP;
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4453c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderStateQueryTests::ShaderStateQueryTests (Context& context)
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup(context, "shader", "Shader state query tests")
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4503c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderStateQueryTests::~ShaderStateQueryTests (void)
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderStateQueryTests::init (void)
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
456c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	addChild(new CoreSamplerTypeCase			(m_context, "sampler_type",						"Sampler type cases"));
457c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	addChild(new MSArraySamplerTypeCase			(m_context, "sampler_type_multisample_array",	"MSAA array sampler type cases"));
458c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	addChild(new TextureBufferSamplerTypeCase	(m_context, "sampler_type_texture_buffer",		"Texture buffer sampler type cases"));
459c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	addChild(new TextureBufferImageTypeCase		(m_context, "image_type_texture_buffer",		"Texture buffer image type cases"));
460c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	addChild(new CubeArraySamplerTypeCase		(m_context, "sampler_type_cube_array",			"Cube array sampler type cases"));
461c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	addChild(new CubeArrayImageTypeCase			(m_context, "image_type_cube_array",			"Cube array image type cases"));
462c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
463c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	// shader info log tests
464c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	// \note, there exists similar tests in gles3 module. However, the gles31 could use a different
465c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	//        shader compiler with different INFO_LOG bugs.
466c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
467c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		static const struct
468c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
469c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			const char*		caseName;
470c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			glu::ShaderType	caseType;
471c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		} shaderTypes[] =
472c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
473c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			{ "info_log_vertex",		glu::SHADERTYPE_VERTEX					},
474c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			{ "info_log_fragment",		glu::SHADERTYPE_FRAGMENT				},
475c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			{ "info_log_geometry",		glu::SHADERTYPE_GEOMETRY				},
476c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			{ "info_log_tess_ctrl",		glu::SHADERTYPE_TESSELLATION_CONTROL	},
477c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			{ "info_log_tess_eval",		glu::SHADERTYPE_TESSELLATION_EVALUATION	},
478c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			{ "info_log_compute",		glu::SHADERTYPE_COMPUTE					},
479c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		};
480c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
481c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(shaderTypes); ++ndx)
482c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			addChild(new ShaderLogCase(m_context, shaderTypes[ndx].caseName, "", shaderTypes[ndx].caseType));
483c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles31
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
489