• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  * \file  esextcTextureBufferErrors.hpp
26  * \brief TexBufferEXT and TexBufferRangeEXT errors (Test 7)
27  */ /*-------------------------------------------------------------------*/
28 
29 #include "esextcTextureBufferErrors.hpp"
30 #include "gluContextInfo.hpp"
31 #include "gluDefs.hpp"
32 #include "glwEnums.hpp"
33 #include "glwFunctions.hpp"
34 #include "tcuTestLog.hpp"
35 #include <cstddef>
36 
37 namespace glcts
38 {
39 
40 /* Size of buffer object's data store */
41 const glw::GLint TextureBufferErrors::m_bo_size =
42 	256 /* number of texels */ * 4 /* number of components */ * sizeof(glw::GLint);
43 
44 /** Constructor
45  *
46  * @param context     Test context
47  * @param name        Test case's name
48  * @param description Test case's description
49  **/
TextureBufferErrors(Context & context,const ExtParameters & extParams,const char * name,const char * description)50 TextureBufferErrors::TextureBufferErrors(Context& context, const ExtParameters& extParams, const char* name,
51 										 const char* description)
52 	: TestCaseBase(context, extParams, name, description), m_bo_id(0), m_tex_id(0)
53 {
54 }
55 
56 /** Deinitializes all GLES objects created for the test. */
deinit(void)57 void TextureBufferErrors::deinit(void)
58 {
59 	/* Retrieve GLES entry points. */
60 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
61 
62 	/* Reset GLES state */
63 	gl.bindTexture(m_glExtTokens.TEXTURE_BUFFER, 0);
64 	gl.bindBuffer(m_glExtTokens.TEXTURE_BUFFER, 0);
65 
66 	/* Delete GLES objects */
67 	if (m_tex_id != 0)
68 	{
69 		gl.deleteTextures(1, &m_tex_id);
70 		m_tex_id = 0;
71 	}
72 
73 	if (m_bo_id != 0)
74 	{
75 		gl.deleteBuffers(1, &m_bo_id);
76 		m_bo_id = 0;
77 	}
78 
79 	/* Deinitialize base class */
80 	TestCaseBase::deinit();
81 }
82 
83 /** Initializes all GLES objects and reference values for the test. */
initTest(void)84 void TextureBufferErrors::initTest(void)
85 {
86 	/* Skip if required extensions are not supported. */
87 	if (!m_is_texture_buffer_supported)
88 	{
89 		throw tcu::NotSupportedError(TEXTURE_BUFFER_EXTENSION_NOT_SUPPORTED, "", __FILE__, __LINE__);
90 	}
91 
92 	/* Retrieve GLES entry points. */
93 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
94 
95 	gl.genTextures(1, &m_tex_id);
96 	GLU_EXPECT_NO_ERROR(gl.getError(), "Could not generate texture object!");
97 
98 	gl.bindTexture(m_glExtTokens.TEXTURE_BUFFER, m_tex_id);
99 	GLU_EXPECT_NO_ERROR(gl.getError(), "Could not bind texture object!");
100 
101 	gl.genBuffers(1, &m_bo_id);
102 	GLU_EXPECT_NO_ERROR(gl.getError(), "Could not generate buffer object!");
103 
104 	gl.bindBuffer(m_glExtTokens.TEXTURE_BUFFER, m_bo_id);
105 	GLU_EXPECT_NO_ERROR(gl.getError(), "Could not bind buffer object!");
106 
107 	gl.bufferData(m_glExtTokens.TEXTURE_BUFFER, m_bo_size, DE_NULL, GL_STATIC_READ);
108 	GLU_EXPECT_NO_ERROR(gl.getError(), "Could not allocate buffer object's data store");
109 
110 	m_texture_targets.push_back(GL_TEXTURE_2D);
111 	m_texture_targets.push_back(GL_TEXTURE_2D_ARRAY);
112 	m_texture_targets.push_back(GL_TEXTURE_3D);
113 	m_texture_targets.push_back(GL_TEXTURE_CUBE_MAP);
114 
115 	if (m_is_texture_cube_map_array_supported)
116 	{
117 		m_texture_targets.push_back(GL_TEXTURE_CUBE_MAP_ARRAY);
118 	}
119 
120 	if (m_is_texture_storage_multisample_supported)
121 	{
122 		m_texture_targets.push_back(GL_TEXTURE_2D_MULTISAMPLE);
123 	}
124 
125 	if (m_is_texture_storage_multisample_2d_array_supported)
126 	{
127 		m_texture_targets.push_back(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES);
128 	}
129 }
130 /** Test if the error code returned by glGetError is the same as expected.
131  *  If the error is different from expected description is logged.
132  *
133  * @param expected_error    GLenum error which is expected
134  * @param description       Log message in the case of failure.
135  *
136  * @return true if error is equal to expected, false otherwise.
137  */
verifyError(const glw::GLenum expected_error,const char * description)138 glw::GLboolean TextureBufferErrors::verifyError(const glw::GLenum expected_error, const char* description)
139 {
140 	/* Retrieve GLES entry points. */
141 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
142 
143 	glw::GLboolean test_passed = true;
144 	glw::GLenum	error_code  = gl.getError();
145 
146 	if (error_code != expected_error)
147 	{
148 		test_passed = false;
149 
150 		m_testCtx.getLog() << tcu::TestLog::Message << description << tcu::TestLog::EndMessage;
151 	}
152 
153 	return test_passed;
154 }
155 
156 /** Executes the test.
157  *
158  *  Sets the test result to QP_TEST_RESULT_FAIL if the test failed, QP_TEST_RESULT_PASS otherwise.
159  *
160  *  Note the function throws exception should an error occur!
161  *
162  *  @return STOP if the test has finished, CONTINUE to indicate iterate should be called once again.
163  **/
iterate(void)164 tcu::TestNode::IterateResult TextureBufferErrors::iterate(void)
165 {
166 	/* Initialization */
167 	initTest();
168 
169 	/* Retrieve ES entry/state points. */
170 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
171 
172 	glw::GLboolean test_passed = true;
173 
174 	/*An INVALID_ENUM error should be generated if target parameter is not TEXTURE_BUFFER_EXT.*/
175 	for (TargetsVector::iterator iter = m_texture_targets.begin(); iter != m_texture_targets.end(); ++iter)
176 	{
177 		gl.texBuffer(*iter, GL_RGBA32I, m_bo_id);
178 		test_passed = verifyError(GL_INVALID_ENUM, "Expected GL_INVALID_ENUM was not returned "
179 												   "when wrong texture target was used in glTexBufferEXT.") &&
180 					  test_passed;
181 
182 		gl.texBufferRange(*iter, GL_RGBA32I, m_bo_id, 0, m_bo_size);
183 		test_passed = verifyError(GL_INVALID_ENUM, "Expected GL_INVALID_ENUM was not returned "
184 												   "when wrong texture target was used in glTexBufferRangeEXT.") &&
185 					  test_passed;
186 	}
187 
188 	/* An INVALID_ENUM error should be generated if internal format parameter
189 	 * is not one of the sized internal formats specified in the extension
190 	 * specification. One of the formats that should generate INVALID_ENUM
191 	 * error is GL_DEPTH_COMPONENT32F. */
192 	gl.texBuffer(m_glExtTokens.TEXTURE_BUFFER, GL_DEPTH_COMPONENT32F, m_bo_id);
193 	test_passed = verifyError(GL_INVALID_ENUM, "Expected GL_INVALID_ENUM was not returned "
194 											   "when wrong sized internal format was used "
195 											   "in glTexBufferEXT.") &&
196 				  test_passed;
197 
198 	gl.texBufferRange(m_glExtTokens.TEXTURE_BUFFER, GL_DEPTH_COMPONENT32F, m_bo_id, 0, m_bo_size);
199 	test_passed = verifyError(GL_INVALID_ENUM, "Expected GL_INVALID_ENUM was not returned "
200 											   "when wrong sized internal format was used "
201 											   "in glTexBufferRangeEXT.") &&
202 				  test_passed;
203 
204 	/* An INVALID_OPERATION error should be generated if buffer parameter
205 	 * is non-zero, but is not the name of an existing buffer object. */
206 	gl.texBuffer(m_glExtTokens.TEXTURE_BUFFER, GL_RGBA32I, m_bo_id + 1);
207 	test_passed = verifyError(GL_INVALID_OPERATION, "Expected GL_INVALID_OPERATION was not returned "
208 													"when non-existing buffer object was used in glTexBufferEXT.") &&
209 				  test_passed;
210 
211 	gl.texBufferRange(m_glExtTokens.TEXTURE_BUFFER, GL_RGBA32I, m_bo_id + 1, 0, m_bo_size);
212 	test_passed =
213 		verifyError(GL_INVALID_OPERATION, "Expected GL_INVALID_OPERATION was not returned "
214 										  "when non-existing buffer object was used in glTexBufferRangeEXT.") &&
215 		test_passed;
216 
217 	/* INVALID_VALUE error should be generated if offset parameter is negative */
218 	gl.texBufferRange(m_glExtTokens.TEXTURE_BUFFER, GL_RGBA32I, m_bo_id, -16, m_bo_size);
219 	test_passed = verifyError(GL_INVALID_VALUE, "Expected INVALID_VALUE was not returned "
220 												"when negative offset was used in glTexBufferRangeEXT.") &&
221 				  test_passed;
222 
223 	/* INVALID_VALUE error should be generated if size parameter is less than or equal to zero */
224 	gl.texBufferRange(m_glExtTokens.TEXTURE_BUFFER, GL_RGBA32I, m_bo_id, 0, 0);
225 	test_passed = verifyError(GL_INVALID_VALUE, "Expected INVALID_VALUE was not returned "
226 												"when 0 size was used in glTexBufferRangeEXT.") &&
227 				  test_passed;
228 
229 	gl.texBufferRange(m_glExtTokens.TEXTURE_BUFFER, GL_RGBA32I, m_bo_id, 0, -1);
230 	test_passed = verifyError(GL_INVALID_VALUE, "Expected INVALID_VALUE was not returned "
231 												"when negative size was used in glTexBufferRangeEXT.") &&
232 				  test_passed;
233 
234 	/* INVALID_VALUE error should be generated if offset + size is greater than the value of BUFFER_SIZE */
235 	gl.texBufferRange(m_glExtTokens.TEXTURE_BUFFER, GL_RGBA32I, m_bo_id, m_bo_size / 2, m_bo_size);
236 	test_passed = verifyError(GL_INVALID_VALUE, "Expected INVALID_VALUE was not returned "
237 												"when offset + size is greater than BUFFER_SIZE") &&
238 				  test_passed;
239 
240 	/* INVALID_VALUE error should be generated if offset parameter is not an integer multiple of
241 	 * value(TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT). */
242 	glw::GLint texture_buffer_offset_alignment = 0;
243 	gl.getIntegerv(m_glExtTokens.TEXTURE_BUFFER_OFFSET_ALIGNMENT, &texture_buffer_offset_alignment);
244 
245 	if (texture_buffer_offset_alignment > 1)
246 	{
247 		gl.texBufferRange(m_glExtTokens.TEXTURE_BUFFER, GL_RGBA32I, m_bo_id, texture_buffer_offset_alignment / 2,
248 						  m_bo_size - texture_buffer_offset_alignment / 2);
249 		test_passed = verifyError(GL_INVALID_VALUE, "Expected INVALID_VALUE was not returned "
250 													"when improperly aligned offset was used "
251 													"in glTexBufferRangeEXT.") &&
252 					  test_passed;
253 	}
254 
255 	/* All done */
256 	if (test_passed)
257 	{
258 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
259 	}
260 	else
261 	{
262 		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
263 	}
264 
265 	return STOP;
266 }
267 
268 } /* namespace glcts */
269