• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES 3.1 Module
3  * -------------------------------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief Shader state query tests
22  *//*--------------------------------------------------------------------*/
23 
24 #include "es31fShaderStateQueryTests.hpp"
25 #include "tcuTestLog.hpp"
26 #include "tcuStringTemplate.hpp"
27 #include "gluShaderProgram.hpp"
28 #include "gluRenderContext.hpp"
29 #include "gluContextInfo.hpp"
30 #include "glwFunctions.hpp"
31 #include "glwEnums.hpp"
32 
33 namespace deqp
34 {
35 namespace gles31
36 {
37 namespace Functional
38 {
39 namespace
40 {
41 
42 class SamplerTypeCase : public TestCase
43 {
44 public:
45 					SamplerTypeCase	(Context& ctx, const char* name, const char* desc);
46 
47 private:
48 	IterateResult	iterate			(void);
49 };
50 
SamplerTypeCase(Context & ctx,const char * name,const char * desc)51 SamplerTypeCase::SamplerTypeCase (Context& ctx, const char* name, const char* desc)
52 	: TestCase(ctx, name, desc)
53 {
54 }
55 
iterate(void)56 SamplerTypeCase::IterateResult SamplerTypeCase::iterate (void)
57 {
58 	static const struct SamplerType
59 	{
60 		glw::GLenum	glType;
61 		const char*	typeStr;
62 		const char*	samplePosStr;
63 		bool		isArray;
64 	} samplerTypes[] =
65 	{
66 		{ GL_SAMPLER_2D_MULTISAMPLE,						"sampler2DMS",			"ivec2(gl_FragCoord.xy)",	false	},
67 		{ GL_INT_SAMPLER_2D_MULTISAMPLE,					"isampler2DMS",			"ivec2(gl_FragCoord.xy)",	false	},
68 		{ GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE,			"usampler2DMS",			"ivec2(gl_FragCoord.xy)",	false	},
69 		{ GL_SAMPLER_2D_MULTISAMPLE_ARRAY,					"sampler2DMSArray",		"ivec3(gl_FragCoord.xyz)",	true	},
70 		{ GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY,				"isampler2DMSArray",	"ivec3(gl_FragCoord.xyz)",	true	},
71 		{ GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY,		"usampler2DMSArray",	"ivec3(gl_FragCoord.xyz)",	true	},
72 	};
73 
74 	static const char* const	vertexSource			=	"#version 310 es\n"
75 															"in highp vec4 a_position;\n"
76 															"void main(void)\n"
77 															"{\n"
78 															"	gl_Position = a_position;\n"
79 															"}\n";
80 	static const char* const	fragmentSourceTemplate	=	"#version 310 es\n"
81 															"${EXTENSIONSTATEMENT}"
82 															"uniform highp ${SAMPLERTYPE} u_sampler;\n"
83 															"layout(location = 0) out highp vec4 dEQP_FragColor;\n"
84 															"void main(void)\n"
85 															"{\n"
86 															"	dEQP_FragColor = vec4(texelFetch(u_sampler, ${POSITION}, 0));\n"
87 															"}\n";
88 	const bool					textureArraySupported	=	m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array");
89 	bool						error					=	false;
90 
91 	for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(samplerTypes); ++typeNdx)
92 	{
93 		const tcu::ScopedLogSection section(m_testCtx.getLog(), std::string(samplerTypes[typeNdx].typeStr), std::string() + "Sampler type " + samplerTypes[typeNdx].typeStr);
94 
95 		if (samplerTypes[typeNdx].isArray && !textureArraySupported)
96 		{
97 			m_testCtx.getLog() << tcu::TestLog::Message << "GL_OES_texture_storage_multisample_2d_array not supported, skipping type " << samplerTypes[typeNdx].typeStr << tcu::TestLog::EndMessage;
98 		}
99 		else
100 		{
101 			std::map<std::string, std::string>	shaderArgs;
102 			shaderArgs["SAMPLERTYPE"]			= samplerTypes[typeNdx].typeStr;
103 			shaderArgs["POSITION"]				= samplerTypes[typeNdx].samplePosStr;
104 			shaderArgs["EXTENSIONSTATEMENT"]	= (samplerTypes[typeNdx].isArray) ? ("#extension GL_OES_texture_storage_multisample_2d_array : require\n") : ("");
105 
106 			{
107 				const std::string			fragmentSource	= tcu::StringTemplate(fragmentSourceTemplate).specialize(shaderArgs);
108 				const glw::Functions&		gl				= m_context.getRenderContext().getFunctions();
109 				glu::ShaderProgram			program			(m_context.getRenderContext(), glu::ProgramSources() << glu::VertexSource(vertexSource) << glu::FragmentSource(fragmentSource));
110 
111 				m_testCtx.getLog() << tcu::TestLog::Message << "Building program with uniform sampler of type " << samplerTypes[typeNdx].typeStr << tcu::TestLog::EndMessage;
112 
113 				if (!program.isOk())
114 				{
115 					m_testCtx.getLog() << program;
116 					throw tcu::TestError("could not build shader");
117 				}
118 
119 				// only one uniform -- uniform at index 0
120 				{
121 					int uniforms = 0;
122 					gl.getProgramiv(program.getProgram(), GL_ACTIVE_UNIFORMS, &uniforms);
123 
124 					if (uniforms != 1)
125 						throw tcu::TestError("Unexpected GL_ACTIVE_UNIFORMS, expected 1");
126 				}
127 
128 				m_testCtx.getLog() << tcu::TestLog::Message << "Verifying uniform type." << tcu::TestLog::EndMessage;
129 
130 				// check type
131 				{
132 					const glw::GLuint	uniformIndex	= 0;
133 					glw::GLint			type			= 0;
134 
135 					gl.getActiveUniformsiv(program.getProgram(), 1, &uniformIndex, GL_UNIFORM_TYPE, &type);
136 
137 					if (type != (glw::GLint)samplerTypes[typeNdx].glType)
138 					{
139 						m_testCtx.getLog() << tcu::TestLog::Message << "Invalid type, expected " << samplerTypes[typeNdx].glType << ", got " << type << tcu::TestLog::EndMessage;
140 						error = true;
141 					}
142 				}
143 
144 				GLU_EXPECT_NO_ERROR(gl.getError(), "");
145 			}
146 		}
147 	}
148 
149 	if (!error)
150 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
151 	else
152 		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid uniform type");
153 
154 	return STOP;
155 }
156 
157 } // anonymous
158 
ShaderStateQueryTests(Context & context)159 ShaderStateQueryTests::ShaderStateQueryTests (Context& context)
160 	: TestCaseGroup(context, "shader", "Shader state query tests")
161 {
162 }
163 
~ShaderStateQueryTests(void)164 ShaderStateQueryTests::~ShaderStateQueryTests (void)
165 {
166 }
167 
init(void)168 void ShaderStateQueryTests::init (void)
169 {
170 	// sampler type query
171 	addChild(new SamplerTypeCase(m_context, "sampler_type", "Sampler type cases"));
172 }
173 
174 } // Functional
175 } // gles31
176 } // deqp
177