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 } // namespace glcts
359