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  es31cTextureStorageMultisampleSampleMaskiTests.cpp
27 * \brief Implements conformance tests for glSampleMaski() (ES3.1 only)
28 */ /*-------------------------------------------------------------------*/
29
30#include "es31cTextureStorageMultisampleSampleMaskiTests.hpp"
31#include "gluContextInfo.hpp"
32#include "gluDefs.hpp"
33#include "glwEnums.hpp"
34#include "glwFunctions.hpp"
35#include "tcuRenderTarget.hpp"
36#include "tcuTestLog.hpp"
37
38#include <string>
39#include <vector>
40
41namespace glcts
42{
43/** Constructor.
44 *
45 *  @param context Rendering context handle.
46 **/
47MultisampleTextureSampleMaskiIndexLowerThanGLMaxSampleMaskWordsTest::
48	MultisampleTextureSampleMaskiIndexLowerThanGLMaxSampleMaskWordsTest(Context& context)
49	: TestCase(context, "multisample_texture_sample_maski_index_lower_than_gl_max_sample_mask_words",
50			   "Verifies glSampleMaski() correctly accepts index arguments up to GL_MAX_SAMPLE_MASK_WORDS-1 value")
51{
52	/* Left blank on purpose */
53}
54
55/** Executes test iteration.
56 *
57 *  @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
58 */
59tcu::TestNode::IterateResult MultisampleTextureSampleMaskiIndexLowerThanGLMaxSampleMaskWordsTest::iterate()
60{
61	/* Get GL_MAX_SAMPLE_MASK_WORDS value */
62	const glw::Functions& gl							 = m_context.getRenderContext().getFunctions();
63	glw::GLint			  gl_max_sample_mask_words_value = 0;
64
65	gl.getIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &gl_max_sample_mask_words_value);
66
67	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to retrieve GL_MAX_SAMPLE_MASK_WORDS value");
68
69	/* Issue the calls */
70	for (int sample_mask = 0; sample_mask < gl_max_sample_mask_words_value; ++sample_mask)
71	{
72		gl.sampleMaski(sample_mask, 0);
73
74		GLU_EXPECT_NO_ERROR(gl.getError(), "An error was reported despite a valid glSampleMaski() call.");
75	}
76
77	/* Test case passed */
78	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
79
80	return STOP;
81}
82
83/** Constructor.
84 *
85 *  @param context Rendering context handle.
86 **/
87MultisampleTextureSampleMaskiIndexEqualToGLMaxSampleMaskWordsTest::
88	MultisampleTextureSampleMaskiIndexEqualToGLMaxSampleMaskWordsTest(Context& context)
89	: TestCase(context, "multisample_texture_sample_maski_index_equal_gl_max_sample_mask_words",
90			   "Verifies glSampleMaski() rejects index equal to GL_MAX_SAMPLE_MASK_WORDS value")
91{
92	/* Left blank on purpose */
93}
94
95/** Executes test iteration.
96 *
97 *  @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
98 */
99tcu::TestNode::IterateResult MultisampleTextureSampleMaskiIndexEqualToGLMaxSampleMaskWordsTest::iterate()
100{
101	/* Get GL_MAX_SAMPLE_MASK_WORDS value */
102	const glw::Functions& gl							 = m_context.getRenderContext().getFunctions();
103	glw::GLint			  gl_max_sample_mask_words_value = 0;
104
105	gl.getIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &gl_max_sample_mask_words_value);
106
107	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to retrieve GL_MAX_SAMPLE_MASK_WORDS value");
108
109	/* Issue call with valid parameters, but invalid index equal to GL_MAX_SAMPLE_MASK_WORDS value */
110	gl.sampleMaski(gl_max_sample_mask_words_value, 0);
111
112	if (gl.getError() != GL_INVALID_VALUE)
113	{
114		TCU_FAIL("Invalid error code reported");
115	}
116
117	/* Test case passed */
118	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
119
120	return STOP;
121}
122
123/** Constructor.
124 *
125 *  @param context Rendering context handle.
126 **/
127MultisampleTextureSampleMaskiGettersTest::MultisampleTextureSampleMaskiGettersTest(Context& context)
128	: TestCase(context, "multisample_texture_sample_maski_getters",
129			   "Verifies valid glSampleMaski() calls modify GL_SAMPLE_MASK_VALUE "
130			   "property value reported by glGetIntegeri_v()")
131{
132	/* Left blank on purpose */
133}
134
135/** Executes test iteration.
136 *
137 *  @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
138 */
139tcu::TestNode::IterateResult MultisampleTextureSampleMaskiGettersTest::iterate()
140{
141	/* Get GL_MAX_SAMPLE_MASK_WORDS value */
142	const glw::Functions& gl							 = m_context.getRenderContext().getFunctions();
143	glw::GLint			  gl_max_sample_mask_words_value = 0;
144
145	gl.getIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &gl_max_sample_mask_words_value);
146
147	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to retrieve GL_MAX_SAMPLE_MASK_WORDS value");
148
149	/* Iterate over valid index & mask values */
150	const glw::GLuint  valid_masks[] = { 0, 0xFFFFFFFF, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF };
151	const unsigned int n_valid_masks = sizeof(valid_masks) / sizeof(valid_masks[0]);
152
153	for (int index = 0; index < gl_max_sample_mask_words_value; ++index)
154	{
155		for (unsigned int n_mask = 0; n_mask < n_valid_masks; ++n_mask)
156		{
157			glw::GLint mask = valid_masks[n_mask];
158
159			/* Make sure a valid glSampleMaski() call does not result in an error */
160			gl.sampleMaski(index, mask);
161
162			GLU_EXPECT_NO_ERROR(gl.getError(), "A valid glSampleMaski() call resulted in an error");
163
164			/* Check the property value as reported by implementation */
165			glw::GLint int_value = -1;
166
167			gl.getIntegeri_v(GL_SAMPLE_MASK_VALUE, index, &int_value);
168			GLU_EXPECT_NO_ERROR(gl.getError(), "A valid glGetIntegeri_v() call resulted in an error");
169
170			if (int_value != mask)
171			{
172				TCU_FAIL("Invalid sample mask reported");
173			}
174		} /* for (all masks) */
175	}	 /* for (all valid index argument values) */
176
177	/* Test case passed */
178	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
179
180	return STOP;
181}
182
183/** Constructor.
184 *
185 *  @param context Rendering context handle.
186 **/
187MultisampleTextureSampleMaskiIndexGreaterGLMaxSampleMaskWordsTest::
188	MultisampleTextureSampleMaskiIndexGreaterGLMaxSampleMaskWordsTest(Context& context)
189	: TestCase(context, "multisample_texture_sample_maski_index_greater_gl_max_sample_mask_words",
190			   "Verifies glSampleMaski() rejects index greater than GL_MAX_SAMPLE_MASK_WORDS value")
191{
192	/* Left blank on purpose */
193}
194
195/** Executes test iteration.
196 *
197 *  @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
198 */
199tcu::TestNode::IterateResult MultisampleTextureSampleMaskiIndexGreaterGLMaxSampleMaskWordsTest::iterate()
200{
201	/* Get GL_MAX_SAMPLE_MASK_WORDS value */
202	const glw::Functions& gl							 = m_context.getRenderContext().getFunctions();
203	glw::GLint			  gl_max_sample_mask_words_value = 0;
204
205	gl.getIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &gl_max_sample_mask_words_value);
206
207	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to retrieve GL_MAX_SAMPLE_MASK_WORDS value");
208
209	/* Issue call with valid parameters, but invalid index greater than GL_MAX_SAMPLE_MASK_WORDS value */
210	gl.sampleMaski(gl_max_sample_mask_words_value + 1, 0);
211
212	if (gl.getError() != GL_INVALID_VALUE)
213	{
214		TCU_FAIL("Invalid error code reported");
215	}
216
217	/* Test case passed */
218	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
219
220	return STOP;
221}
222} /* glcts namespace */
223