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