es31fShaderMultisampleInterpolationStateQueryTests.cpp revision cb82ed72dcbbfd8a6d07736c3259605227bc984f
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 Multisample interpolation state query tests
22 *//*--------------------------------------------------------------------*/
23
24#include "es31fShaderMultisampleInterpolationStateQueryTests.hpp"
25#include "tcuTestLog.hpp"
26#include "gluCallLogWrapper.hpp"
27#include "gluContextInfo.hpp"
28#include "gluRenderContext.hpp"
29#include "glsStateQueryUtil.hpp"
30#include "glwEnums.hpp"
31#include "glwFunctions.hpp"
32
33
34namespace deqp
35{
36namespace gles31
37{
38namespace Functional
39{
40namespace
41{
42
43using namespace gls::StateQueryUtil;
44
45class InterpolationOffsetCase : public TestCase
46{
47public:
48	enum TestType
49	{
50		TEST_MIN_OFFSET = 0,
51		TEST_MAX_OFFSET,
52
53		TEST_LAST
54	};
55
56						InterpolationOffsetCase		(Context& context, const char* name, const char* desc, QueryType verifier, TestType testType);
57						~InterpolationOffsetCase	(void);
58
59	void				init						(void);
60	IterateResult		iterate						(void);
61
62private:
63	const QueryType		m_verifier;
64	const TestType		m_testType;
65};
66
67InterpolationOffsetCase::InterpolationOffsetCase (Context& context, const char* name, const char* desc, QueryType verifier, TestType testType)
68	: TestCase		(context, name, desc)
69	, m_verifier	(verifier)
70	, m_testType	(testType)
71{
72	DE_ASSERT(m_testType < TEST_LAST);
73}
74
75InterpolationOffsetCase::~InterpolationOffsetCase (void)
76{
77}
78
79void InterpolationOffsetCase::init (void)
80{
81	if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
82		throw tcu::NotSupportedError("Test requires GL_OES_shader_multisample_interpolation extension");
83}
84
85InterpolationOffsetCase::IterateResult InterpolationOffsetCase::iterate (void)
86{
87	glu::CallLogWrapper 	gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
88	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
89	gl.enableLogging(true);
90
91	if (m_testType == TEST_MAX_OFFSET)
92		verifyStateFloatMin(result, gl, GL_MAX_FRAGMENT_INTERPOLATION_OFFSET, 0.5, m_verifier);
93	else if (m_testType == TEST_MIN_OFFSET)
94		verifyStateFloatMax(result, gl, GL_MIN_FRAGMENT_INTERPOLATION_OFFSET, -0.5, m_verifier);
95	else
96		DE_ASSERT(false);
97
98	result.setTestContextResult(m_testCtx);
99	return STOP;
100}
101
102class FragmentInterpolationOffsetBitsCase : public TestCase
103{
104public:
105						FragmentInterpolationOffsetBitsCase		(Context& context, const char* name, const char* desc, QueryType verifier);
106						~FragmentInterpolationOffsetBitsCase	(void);
107
108	void				init									(void);
109	IterateResult		iterate									(void);
110
111private:
112	const QueryType		m_verifier;
113};
114
115FragmentInterpolationOffsetBitsCase::FragmentInterpolationOffsetBitsCase (Context& context, const char* name, const char* desc, QueryType verifier)
116	: TestCase		(context, name, desc)
117	, m_verifier	(verifier)
118{
119}
120
121FragmentInterpolationOffsetBitsCase::~FragmentInterpolationOffsetBitsCase (void)
122{
123}
124
125void FragmentInterpolationOffsetBitsCase::init (void)
126{
127	if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
128		throw tcu::NotSupportedError("Test requires GL_OES_shader_multisample_interpolation extension");
129}
130
131FragmentInterpolationOffsetBitsCase::IterateResult FragmentInterpolationOffsetBitsCase::iterate (void)
132{
133	glu::CallLogWrapper 	gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
134	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
135	gl.enableLogging(true);
136
137	verifyStateIntegerMin(result, gl, GL_FRAGMENT_INTERPOLATION_OFFSET_BITS, 4, m_verifier);
138
139	result.setTestContextResult(m_testCtx);
140	return STOP;
141}
142
143} // anonymous
144
145ShaderMultisampleInterpolationStateQueryTests::ShaderMultisampleInterpolationStateQueryTests (Context& context)
146	: TestCaseGroup(context, "multisample_interpolation", "Test multisample interpolation states")
147{
148}
149
150ShaderMultisampleInterpolationStateQueryTests::~ShaderMultisampleInterpolationStateQueryTests (void)
151{
152}
153
154void ShaderMultisampleInterpolationStateQueryTests::init (void)
155{
156	static const struct Verifier
157	{
158		QueryType		verifier;
159		const char*		name;
160		const char*		desc;
161	} verifiers[] =
162	{
163		{ QUERY_BOOLEAN,	"get_boolean",		"Test using getBoolean"		},
164		{ QUERY_INTEGER,	"get_integer",		"Test using getInteger"		},
165		{ QUERY_FLOAT,		"get_float",		"Test using getFloat"		},
166		{ QUERY_INTEGER64,	"get_integer64",	"Test using getInteger64"	},
167	};
168
169	// .min_fragment_interpolation_offset
170	{
171		tcu::TestCaseGroup* const group = new tcu::TestCaseGroup(m_testCtx, "min_fragment_interpolation_offset", "Test MIN_FRAGMENT_INTERPOLATION_OFFSET");
172		addChild(group);
173
174		for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx)
175			group->addChild(new InterpolationOffsetCase(m_context, verifiers[verifierNdx].name, verifiers[verifierNdx].desc, verifiers[verifierNdx].verifier, InterpolationOffsetCase::TEST_MIN_OFFSET));
176	}
177
178	// .max_fragment_interpolation_offset
179	{
180		tcu::TestCaseGroup* const group = new tcu::TestCaseGroup(m_testCtx, "max_fragment_interpolation_offset", "Test MAX_FRAGMENT_INTERPOLATION_OFFSET");
181		addChild(group);
182
183		for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx)
184			group->addChild(new InterpolationOffsetCase(m_context, verifiers[verifierNdx].name, verifiers[verifierNdx].desc, verifiers[verifierNdx].verifier, InterpolationOffsetCase::TEST_MAX_OFFSET));
185	}
186
187	// .fragment_interpolation_offset_bits
188	{
189		tcu::TestCaseGroup* const group = new tcu::TestCaseGroup(m_testCtx, "fragment_interpolation_offset_bits", "Test FRAGMENT_INTERPOLATION_OFFSET_BITS");
190		addChild(group);
191
192		for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx)
193			group->addChild(new FragmentInterpolationOffsetBitsCase(m_context, verifiers[verifierNdx].name, verifiers[verifierNdx].desc, verifiers[verifierNdx].verifier));
194	}
195}
196
197} // Functional
198} // gles31
199} // deqp
200