1 /*-------------------------------------------------------------------------
2 * OpenGL Conformance Test Suite
3 * -----------------------------
4 *
5 * Copyright (c) 2014-2016 The Khronos Group Inc.
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
22 */ /*-------------------------------------------------------------------*/
23
24 /**
25 */ /*!
26 * \file es31cTextureStorageMultisampleGetMultisamplefvTests.cpp
27 * \brief Implements conformance tests testing whether glGetMultisamplefv()
28 * works correctly. (ES3.1 only)
29 */ /*-------------------------------------------------------------------*/
30
31 #include "es31cTextureStorageMultisampleGetMultisamplefvTests.hpp"
32 #include "gluContextInfo.hpp"
33 #include "gluDefs.hpp"
34 #include "glwEnums.hpp"
35 #include "glwFunctions.hpp"
36 #include "tcuRenderTarget.hpp"
37 #include "tcuTestLog.hpp"
38
39 #include <string>
40 #include <vector>
41
42 namespace glcts
43 {
44 /** Constructor.
45 *
46 * @param context Rendering context handle.
47 **/
48 MultisampleTextureGetMultisamplefvIndexEqualGLSamplesRejectedTest::
MultisampleTextureGetMultisamplefvIndexEqualGLSamplesRejectedTest(Context & context)49 MultisampleTextureGetMultisamplefvIndexEqualGLSamplesRejectedTest(Context& context)
50 : TestCase(context, "multisample_texture_get_multisamplefv_index_equal_gl_samples_rejected",
51 "Verifies GetMultisamplefv() rejects index equal to GL_SAMPLES value")
52 {
53 /* Left blank on purpose */
54 }
55
56 /** Executes test iteration.
57 *
58 * @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
59 */
iterate()60 tcu::TestNode::IterateResult MultisampleTextureGetMultisamplefvIndexEqualGLSamplesRejectedTest::iterate()
61 {
62 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
63 glw::GLint gl_samples_value = 0;
64
65 /* Get GL_SAMPLES value */
66 gl.getIntegerv(GL_SAMPLES, &gl_samples_value);
67
68 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to retrieve GL_SAMPLES value");
69
70 /* Issue call with valid parameters, but invalid index equal to GL_SAMPLES value */
71 glw::GLfloat val[2];
72 gl.getMultisamplefv(GL_SAMPLE_POSITION, gl_samples_value, val);
73
74 /* Check if the expected error code was reported */
75 if (gl.getError() != GL_INVALID_VALUE)
76 {
77 TCU_FAIL("Invalid error code reported");
78 }
79
80 /* Test case passed */
81 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
82
83 return STOP;
84 }
85
86 /** Constructor.
87 *
88 * @param context Rendering context handle.
89 **/
90 MultisampleTextureGetMultisamplefvIndexGreaterGLSamplesRejectedTest::
MultisampleTextureGetMultisamplefvIndexGreaterGLSamplesRejectedTest(Context & context)91 MultisampleTextureGetMultisamplefvIndexGreaterGLSamplesRejectedTest(Context& context)
92 : TestCase(context, "multisample_texture_get_multisamplefv_index_greater_gl_samples_rejected",
93 "Verifies GetMultisamplefv() rejects index greater than GL_SAMPLES value")
94 {
95 /* Left blank on purpose */
96 }
97
98 /** Executes test iteration.
99 *
100 * @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
101 */
iterate()102 tcu::TestNode::IterateResult MultisampleTextureGetMultisamplefvIndexGreaterGLSamplesRejectedTest::iterate()
103 {
104 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
105 glw::GLint gl_samples_value = 0;
106
107 /* Get GL_SAMPLES value */
108 gl.getIntegerv(GL_SAMPLES, &gl_samples_value);
109
110 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to retrieve GL_SAMPLES value");
111
112 /* Issue call with valid parameters, but invalid index greater than GL_SAMPLES value */
113 glw::GLfloat val[2];
114 gl.getMultisamplefv(GL_SAMPLE_POSITION, gl_samples_value + 1, val);
115
116 /* Check if the expected error code was reported */
117 if (gl.getError() != GL_INVALID_VALUE)
118 {
119 TCU_FAIL("Invalid error code reported");
120 }
121
122 /* Test case passed */
123 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
124
125 return STOP;
126 }
127
128 /** Constructor.
129 *
130 * @param context Rendering context handle.
131 **/
MultisampleTextureGetMultisamplefvInvalidPnameRejectedTest(Context & context)132 MultisampleTextureGetMultisamplefvInvalidPnameRejectedTest::MultisampleTextureGetMultisamplefvInvalidPnameRejectedTest(
133 Context& context)
134 : TestCase(context, "multisample_texture_get_multisamplefv_invalid_pname_rejected",
135 "Verifies GetMultisamplefv() rejects invalid pname")
136 {
137 /* Left blank on purpose */
138 }
139
140 /** Executes test iteration.
141 *
142 * @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
143 */
iterate()144 tcu::TestNode::IterateResult MultisampleTextureGetMultisamplefvInvalidPnameRejectedTest::iterate()
145 {
146 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
147
148 /* Issue call with valid parameters, but invalid pname GL_SAMPLES */
149 glw::GLfloat val[2];
150 gl.getMultisamplefv(GL_SAMPLES, 0, val);
151
152 /* Check if the expected error code was reported */
153 glw::GLenum error_code = gl.getError();
154
155 if (error_code != GL_INVALID_ENUM)
156 {
157 TCU_FAIL("Invalid error code reported");
158 }
159
160 /* Test case passed */
161 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
162
163 return STOP;
164 }
165
166 /** Constructor.
167 *
168 * @param context Rendering context handle.
169 **/
170 MultisampleTextureGetMultisamplefvNullValArgumentsAcceptedTest::
MultisampleTextureGetMultisamplefvNullValArgumentsAcceptedTest(Context & context)171 MultisampleTextureGetMultisamplefvNullValArgumentsAcceptedTest(Context& context)
172 : TestCase(context, "multisample_texture_get_multisamplefv_null_val_arguments_accepted",
173 "Verifies NULL val arguments accepted for valid glGetMultisamplefv() calls.")
174 , fbo_id(0)
175 , to_2d_multisample_id(0)
176 {
177 /* Left blank on purpose */
178 }
179
180 /** Executes test iteration.
181 *
182 * @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
183 */
iterate()184 tcu::TestNode::IterateResult MultisampleTextureGetMultisamplefvNullValArgumentsAcceptedTest::iterate()
185 {
186 /* Issue call with valid parameters, but invalid pname GL_SAMPLES */
187 glw::GLenum error_code = GL_NO_ERROR;
188 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
189
190 /* gl.getMultisamplefv(GL_SAMPLES, 0, NULL) is not legal, removed */
191
192 /* Create multisampled FBO, as default framebuffer is not multisampled */
193
194 gl.genTextures(1, &to_2d_multisample_id);
195
196 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() call failed");
197
198 if (to_2d_multisample_id == 0)
199 {
200 TCU_FAIL("Texture object has not been generated properly");
201 }
202
203 glw::GLint samples = 0;
204
205 gl.getInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, /* target */
206 GL_RGBA8, GL_SAMPLES, 1, /* bufSize */
207 &samples);
208
209 GLU_EXPECT_NO_ERROR(gl.getError(), "getInternalformativ() call failed");
210
211 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, to_2d_multisample_id);
212
213 /* Configure the texture object storage */
214 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGBA8, 1, /* width */
215 1, /* height */
216 GL_TRUE); /* fixedsamplelocations */
217
218 GLU_EXPECT_NO_ERROR(gl.getError(), "texStorage2DMultisample() call failed");
219
220 gl.genFramebuffers(1, &fbo_id);
221
222 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers() call failed");
223
224 if (fbo_id == 0)
225 {
226 TCU_FAIL("Framebuffer object has not been generated properly");
227 }
228
229 gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_id);
230
231 gl.framebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, to_2d_multisample_id,
232 0);
233
234 GLU_EXPECT_NO_ERROR(gl.getError(), "Could not set up framebuffer's attachments");
235
236 glw::GLenum fbo_completeness_status = 0;
237
238 fbo_completeness_status = gl.checkFramebufferStatus(GL_DRAW_FRAMEBUFFER);
239
240 if (fbo_completeness_status != GL_FRAMEBUFFER_COMPLETE)
241 {
242 m_testCtx.getLog() << tcu::TestLog::Message << "Source FBO completeness status is: " << fbo_completeness_status
243 << ", expected: GL_FRAMEBUFFER_COMPLETE" << tcu::TestLog::EndMessage;
244
245 TCU_FAIL("Source FBO is considered incomplete which is invalid");
246 }
247
248 gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_id);
249
250 /* Get GL_SAMPLES value */
251 glw::GLint gl_samples_value = 0;
252
253 gl.getIntegerv(GL_SAMPLES, &gl_samples_value);
254
255 error_code = gl.getError();
256 GLU_EXPECT_NO_ERROR(error_code, "Failed to retrieve GL_SAMPLES value");
257
258 glw::GLfloat val[2];
259 gl.getMultisamplefv(GL_SAMPLE_POSITION, 0, val);
260
261 error_code = gl.getError();
262
263 GLU_EXPECT_NO_ERROR(error_code, "glGetMultisamplefv() call failed");
264
265 /* Iterate through valid index values */
266 for (glw::GLint index = 0; index < gl_samples_value; ++index)
267 {
268 /* Execute the test */
269 gl.getMultisamplefv(GL_SAMPLE_POSITION, index, val);
270
271 error_code = gl.getError();
272 GLU_EXPECT_NO_ERROR(error_code, "A valid glGetMultisamplefv() call reported an error");
273 } /* for (all valid index argument values) */
274
275 /* Test case passed */
276 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
277
278 return STOP;
279 }
280
281 /** Deinitializes ES objects created during test execution */
deinit()282 void MultisampleTextureGetMultisamplefvNullValArgumentsAcceptedTest::deinit()
283 {
284 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
285
286 /* Unbind framebuffer object bound to GL_DRAW_FRAMEBUFFER target */
287 gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
288
289 /* Unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE texture target */
290 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
291
292 /* Delete a 2D multisample texture object of id to_2d_multisample_id */
293 if (to_2d_multisample_id != 0)
294 {
295 gl.deleteTextures(1, &to_2d_multisample_id);
296
297 to_2d_multisample_id = 0;
298 }
299
300 /* Delete a framebuffer object of id fbo_id */
301 if (fbo_id != 0)
302 {
303 gl.deleteFramebuffers(1, &fbo_id);
304
305 fbo_id = 0;
306 }
307 }
308
309 /** Constructor.
310 *
311 * @param context Rendering context handle.
312 **/
313 MultisampleTextureGetMultisamplefvSamplePositionValuesValidationTest::
MultisampleTextureGetMultisamplefvSamplePositionValuesValidationTest(Context & context)314 MultisampleTextureGetMultisamplefvSamplePositionValuesValidationTest(Context& context)
315 : TestCase(context, "multisample_texture_get_multisamplefv_sample_position_values_validation",
316 "Verifies spec-wise correct values are reported for valid calls with GL_SAMPLE_POSITION pname")
317 {
318 /* Left blank on purpose */
319 }
320
321 /** Executes test iteration.
322 *
323 * @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
324 */
iterate()325 tcu::TestNode::IterateResult MultisampleTextureGetMultisamplefvSamplePositionValuesValidationTest::iterate()
326 {
327 /* Get GL_SAMPLES value */
328 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
329 glw::GLint gl_samples_value = 0;
330
331 gl.getIntegerv(GL_SAMPLES, &gl_samples_value);
332 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to retrieve GL_SAMPLES value");
333
334 /* Iterate through valid index values */
335 for (glw::GLint index = 0; index < gl_samples_value; ++index)
336 {
337 /* Execute the test */
338 glw::GLfloat val[2] = { -1.0f, -1.0f };
339
340 gl.getMultisamplefv(GL_SAMPLE_POSITION, index, val);
341 GLU_EXPECT_NO_ERROR(gl.getError(), "A valid glGetMultisamplefv() call reported an error");
342
343 if (val[0] < 0.0f || val[0] > 1.0f || val[1] < 0.0f || val[1] > 1.0f)
344 {
345 m_testCtx.getLog() << tcu::TestLog::Message << "One or more coordinates used to describe sample position: "
346 << "(" << val[0] << ", " << val[1] << ") is outside the valid <0, 1> range."
347 << tcu::TestLog::EndMessage;
348
349 TCU_FAIL("Invalid sample position reported");
350 }
351 } /* for (all valid index argument values) */
352
353 /* Test case passed */
354 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
355
356 return STOP;
357 }
358 } /* glcts namespace */
359