• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*-------------------------------------------------------------------------
2  * OpenGL Conformance Test Suite
3  * -----------------------------
4  *
5  * Copyright (c) 2015-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 esextcDrawBuffersIndexedBase.cpp
26  * \brief Base class for Draw Buffers Indexed extension tests 1-6
27  */ /*-------------------------------------------------------------------*/
28 
29 #include "esextcDrawBuffersIndexedBase.hpp"
30 #include "tcuTestLog.hpp"
31 
32 namespace glcts
33 {
34 
35 /** Base class constructor
36  *
37  *  @param context     Test context
38  *  @param name        Test case's name
39  *  @param description Test case's description
40  **/
DrawBuffersIndexedBase(Context & context,const ExtParameters & extParams,const char * name,const char * description)41 DrawBuffersIndexedBase::DrawBuffersIndexedBase(Context& context, const ExtParameters& extParams, const char* name,
42 											   const char* description)
43 	: TestCaseBase(context, extParams, name, description)
44 {
45 	/* Left blank on purpose */
46 }
47 
init()48 void DrawBuffersIndexedBase::init()
49 {
50 	if (!isExtensionSupported("GL_OES_draw_buffers_indexed"))
51 	{
52 		throw tcu::NotSupportedError(DRAW_BUFFERS_INDEXED_NOT_SUPPORTED);
53 	}
54 }
55 
56 /** Helper class constructors
57  *
58  *  @param context     Test context
59  **/
BlendMaskStateMachine(Context & context,tcu::TestLog & log)60 DrawBuffersIndexedBase::BlendMaskStateMachine::BlendMaskStateMachine(Context& context, tcu::TestLog& log)
61 	: state(4), gl(context.getRenderContext().getFunctions()), testLog(log)
62 {
63 }
64 
BlendMaskStateMachine(Context & context,tcu::TestLog & log,int dbs)65 DrawBuffersIndexedBase::BlendMaskStateMachine::BlendMaskStateMachine(Context& context, tcu::TestLog& log, int dbs)
66 	: state(dbs), gl(context.getRenderContext().getFunctions()), testLog(log)
67 {
68 }
69 
70 /** Helper class member functions
71  *
72  **/
CheckEnumGeneral(glw::GLenum e,glw::GLenum s)73 bool DrawBuffersIndexedBase::BlendMaskStateMachine::CheckEnumGeneral(glw::GLenum e, glw::GLenum s)
74 {
75 	glw::GLint	 i;
76 	glw::GLint64   li;
77 	glw::GLboolean b;
78 	glw::GLfloat   f;
79 
80 	gl.getIntegerv(e, &i);
81 	gl.getInteger64v(e, &li);
82 	gl.getBooleanv(e, &b);
83 	gl.getFloatv(e, &f);
84 	if ((static_cast<glw::GLenum>(i) != s) || (static_cast<glw::GLenum>(li) != s) ||
85 		(static_cast<glw::GLenum>(f) != s) || (b != (s ? GL_TRUE : GL_FALSE)))
86 	{
87 		testLog << tcu::TestLog::Message << "General state should be set to " << s
88 				<< " but found the following values:\n"
89 				<< "int: " << i << "\n"
90 				<< "int64: " << li << "\n"
91 				<< "bool: " << b << tcu::TestLog::EndMessage;
92 		return false;
93 	}
94 	return true;
95 }
96 
CheckEnumForBuffer(int idx,glw::GLenum e,glw::GLenum s)97 bool DrawBuffersIndexedBase::BlendMaskStateMachine::CheckEnumForBuffer(int idx, glw::GLenum e, glw::GLenum s)
98 {
99 	glw::GLint	 i;
100 	glw::GLint64   li;
101 	glw::GLboolean b;
102 
103 	gl.getIntegeri_v(e, idx, &i);
104 	gl.getInteger64i_v(e, idx, &li);
105 	gl.getBooleani_v(e, idx, &b);
106 	if ((static_cast<glw::GLenum>(i) != s) || (static_cast<glw::GLenum>(li) != s) || (b != (s ? GL_TRUE : GL_FALSE)))
107 	{
108 		testLog << tcu::TestLog::Message << "State for " << e << " in buffer #" << idx << " should be set to " << s
109 				<< " but found the following values:\n"
110 				<< "int: " << i << "\n"
111 				<< "int64: " << li << "\n"
112 				<< "bool: " << b << tcu::TestLog::EndMessage;
113 		return false;
114 	}
115 	return true;
116 }
117 
CheckBuffer(int idx)118 bool DrawBuffersIndexedBase::BlendMaskStateMachine::CheckBuffer(int idx)
119 {
120 	if (gl.isEnabledi(GL_BLEND, idx) != state[idx].enable)
121 	{
122 		testLog << tcu::TestLog::Message << "Blending for buffer #" << idx << " set to: " << !state[idx].enable
123 				<< " but should be " << state[idx].enable << "!" << tcu::TestLog::EndMessage;
124 		return false;
125 	}
126 
127 	bool result = true;
128 
129 	result &= CheckEnumForBuffer(idx, GL_BLEND_EQUATION_RGB, state[idx].mode_rgb);
130 	result &= CheckEnumForBuffer(idx, GL_BLEND_EQUATION_ALPHA, state[idx].mode_a);
131 	result &= CheckEnumForBuffer(idx, GL_BLEND_SRC_RGB, state[idx].func_src_rgb);
132 	result &= CheckEnumForBuffer(idx, GL_BLEND_SRC_ALPHA, state[idx].func_src_a);
133 	result &= CheckEnumForBuffer(idx, GL_BLEND_DST_RGB, state[idx].func_dst_rgb);
134 	result &= CheckEnumForBuffer(idx, GL_BLEND_DST_ALPHA, state[idx].func_dst_a);
135 
136 	glw::GLint	 ia[4];
137 	glw::GLint64   lia[4];
138 	glw::GLboolean ba[4];
139 
140 	gl.getIntegeri_v(GL_COLOR_WRITEMASK, idx, ia);
141 	gl.getInteger64i_v(GL_COLOR_WRITEMASK, idx, lia);
142 	gl.getBooleani_v(GL_COLOR_WRITEMASK, idx, ba);
143 	if ((ia[0] != state[idx].mask_r) || (static_cast<int>(lia[0]) != state[idx].mask_r) ||
144 		(static_cast<int>(ba[0]) != state[idx].mask_r) || (ia[1] != state[idx].mask_g) ||
145 		(static_cast<int>(lia[1]) != state[idx].mask_g) || (static_cast<int>(ba[1]) != state[idx].mask_g) ||
146 		(ia[2] != state[idx].mask_b) || (static_cast<int>(lia[2]) != state[idx].mask_b) ||
147 		(static_cast<int>(ba[2]) != state[idx].mask_b) || (ia[3] != state[idx].mask_a) ||
148 		(static_cast<int>(lia[3]) != state[idx].mask_a) || (static_cast<int>(ba[3]) != state[idx].mask_a))
149 	{
150 		testLog << tcu::TestLog::Message << "GL_COLOR_WRITEMASK for buffer #" << idx << " should be set to("
151 				<< state[idx].mask_r << ", " << state[idx].mask_g << ", " << state[idx].mask_b << ", "
152 				<< state[idx].mask_a << ")\n"
153 				<< "but the following values was set:\n"
154 				<< "int: " << ia[0] << ", " << ia[1] << ", " << ia[2] << ", " << ia[3] << "\n"
155 				<< "int64: " << lia[0] << ", " << lia[1] << ", " << lia[2] << ", " << lia[3] << "\n"
156 				<< "bool: " << ba[0] << ", " << ba[1] << ", " << ba[2] << ", " << ba[3] << tcu::TestLog::EndMessage;
157 		result = false;
158 	}
159 	if (idx == 0)
160 	{
161 		result &= CheckEnumGeneral(GL_BLEND_EQUATION_RGB, state[idx].mode_rgb);
162 		result &= CheckEnumGeneral(GL_BLEND_EQUATION_ALPHA, state[idx].mode_a);
163 		result &= CheckEnumGeneral(GL_BLEND_SRC_RGB, state[idx].func_src_rgb);
164 		result &= CheckEnumGeneral(GL_BLEND_SRC_ALPHA, state[idx].func_src_a);
165 		result &= CheckEnumGeneral(GL_BLEND_DST_RGB, state[idx].func_dst_rgb);
166 		result &= CheckEnumGeneral(GL_BLEND_DST_ALPHA, state[idx].func_dst_a);
167 
168 		glw::GLfloat fa[4];
169 
170 		gl.getIntegerv(GL_COLOR_WRITEMASK, ia);
171 		gl.getInteger64v(GL_COLOR_WRITEMASK, lia);
172 		gl.getBooleanv(GL_COLOR_WRITEMASK, ba);
173 		gl.getFloatv(GL_COLOR_WRITEMASK, fa);
174 		if ((ia[0] != state[idx].mask_r) || (static_cast<int>(lia[0]) != state[idx].mask_r) ||
175 			(ia[1] != state[idx].mask_g) || (static_cast<int>(lia[1]) != state[idx].mask_g) ||
176 			(ia[2] != state[idx].mask_b) || (static_cast<int>(lia[2]) != state[idx].mask_b) ||
177 			(ia[3] != state[idx].mask_a) || (static_cast<int>(lia[3]) != state[idx].mask_a) ||
178 			(static_cast<int>(ba[0]) != state[idx].mask_r) || (static_cast<int>(fa[0]) != state[idx].mask_r) ||
179 			(static_cast<int>(ba[1]) != state[idx].mask_g) || (static_cast<int>(fa[1]) != state[idx].mask_g) ||
180 			(static_cast<int>(ba[2]) != state[idx].mask_b) || (static_cast<int>(fa[2]) != state[idx].mask_b) ||
181 			(static_cast<int>(ba[3]) != state[idx].mask_a) || (static_cast<int>(fa[3]) != state[idx].mask_a))
182 		{
183 			testLog << tcu::TestLog::Message << "GL_COLOR_WRITEMASK for buffer #" << idx << " should be set to("
184 					<< state[idx].mask_r << ", " << state[idx].mask_g << ", " << state[idx].mask_b << ", "
185 					<< state[idx].mask_a << ")\n"
186 					<< "but the following values was set:\n"
187 					<< "int: " << ia[0] << ", " << ia[1] << ", " << ia[2] << ", " << ia[3] << "\n"
188 					<< "int64: " << lia[0] << ", " << lia[1] << ", " << lia[2] << ", " << lia[3] << "\n"
189 					<< "bool: " << ba[0] << ", " << ba[1] << ", " << ba[2] << ", " << ba[3] << "\n"
190 					<< "float: " << fa[0] << ", " << fa[1] << ", " << fa[2] << ", " << fa[3]
191 					<< tcu::TestLog::EndMessage;
192 			result = false;
193 		}
194 	}
195 	return result;
196 }
197 
CheckAll()198 bool DrawBuffersIndexedBase::BlendMaskStateMachine::CheckAll()
199 {
200 	for (unsigned int i = 0; i < state.size(); ++i)
201 	{
202 		if (!CheckBuffer(i))
203 		{
204 			return false;
205 		}
206 	}
207 	return true;
208 }
209 
SetEnablei(int idx)210 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetEnablei(int idx)
211 {
212 	gl.enablei(GL_BLEND, idx);
213 	state[idx].enable = GL_TRUE;
214 }
215 
SetDisablei(int idx)216 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetDisablei(int idx)
217 {
218 	gl.disablei(GL_BLEND, idx);
219 	state[idx].enable = GL_FALSE;
220 }
221 
SetColorMaski(int idx,glw::GLboolean r,glw::GLboolean g,glw::GLboolean b,glw::GLboolean a)222 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetColorMaski(int idx, glw::GLboolean r, glw::GLboolean g,
223 																  glw::GLboolean b, glw::GLboolean a)
224 {
225 	gl.colorMaski(idx, r, g, b, a);
226 	state[idx].mask_r = r;
227 	state[idx].mask_g = g;
228 	state[idx].mask_b = b;
229 	state[idx].mask_a = a;
230 }
231 
SetBlendEquationi(int idx,glw::GLenum mode)232 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetBlendEquationi(int idx, glw::GLenum mode)
233 {
234 	gl.blendEquationi(idx, mode);
235 	state[idx].mode_rgb = mode;
236 	state[idx].mode_a   = mode;
237 }
238 
SetBlendEquationSeparatei(int idx,glw::GLenum rgb,glw::GLenum a)239 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetBlendEquationSeparatei(int idx, glw::GLenum rgb, glw::GLenum a)
240 {
241 	gl.blendEquationSeparatei(idx, rgb, a);
242 	state[idx].mode_rgb = rgb;
243 	state[idx].mode_a   = a;
244 }
245 
SetBlendFunci(int idx,glw::GLenum src,glw::GLenum dst)246 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetBlendFunci(int idx, glw::GLenum src, glw::GLenum dst)
247 {
248 	gl.blendFunci(idx, src, dst);
249 	state[idx].func_src_rgb = src;
250 	state[idx].func_src_a   = src;
251 	state[idx].func_dst_rgb = dst;
252 	state[idx].func_dst_a   = dst;
253 }
254 
SetBlendFuncSeparatei(int idx,glw::GLenum src_rgb,glw::GLenum dst_rgb,glw::GLenum src_a,glw::GLenum dst_a)255 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetBlendFuncSeparatei(int idx, glw::GLenum src_rgb,
256 																		  glw::GLenum dst_rgb, glw::GLenum src_a,
257 																		  glw::GLenum dst_a)
258 {
259 	gl.blendFuncSeparatei(idx, src_rgb, dst_rgb, src_a, dst_a);
260 	state[idx].func_src_rgb = src_rgb;
261 	state[idx].func_src_a   = src_a;
262 	state[idx].func_dst_rgb = dst_rgb;
263 	state[idx].func_dst_a   = dst_a;
264 }
265 
SetEnable()266 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetEnable()
267 {
268 	// all draw buffers
269 	gl.enable(GL_BLEND);
270 	for (unsigned int i = 0; i < state.size(); ++i)
271 	{
272 		state[i].enable = GL_TRUE;
273 	}
274 }
275 
SetDisable()276 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetDisable()
277 {
278 	// all draw buffers
279 	gl.disable(GL_BLEND);
280 	for (unsigned int i = 0; i < state.size(); ++i)
281 	{
282 		state[i].enable = GL_FALSE;
283 	}
284 }
285 
SetColorMask(glw::GLboolean r,glw::GLboolean g,glw::GLboolean b,glw::GLboolean a)286 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetColorMask(glw::GLboolean r, glw::GLboolean g, glw::GLboolean b,
287 																 glw::GLboolean a)
288 {
289 	// all draw buffers
290 	gl.colorMask(r, g, b, a);
291 	for (unsigned int i = 0; i < state.size(); ++i)
292 	{
293 		state[i].mask_r = r;
294 		state[i].mask_g = g;
295 		state[i].mask_b = b;
296 		state[i].mask_a = a;
297 	}
298 }
299 
SetBlendEquation(glw::GLenum mode)300 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetBlendEquation(glw::GLenum mode)
301 {
302 	// all draw buffers
303 	gl.blendEquation(mode);
304 	for (unsigned int i = 0; i < state.size(); ++i)
305 	{
306 		state[i].mode_rgb = mode;
307 		state[i].mode_a   = mode;
308 	}
309 }
310 
SetBlendEquationSeparate(glw::GLenum rgb,glw::GLenum a)311 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetBlendEquationSeparate(glw::GLenum rgb, glw::GLenum a)
312 {
313 	// all draw buffers
314 	gl.blendEquationSeparate(rgb, a);
315 	for (unsigned int i = 0; i < state.size(); ++i)
316 	{
317 		state[i].mode_rgb = rgb;
318 		state[i].mode_a   = a;
319 	}
320 }
321 
SetBlendFunc(glw::GLenum src,glw::GLenum dst)322 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetBlendFunc(glw::GLenum src, glw::GLenum dst)
323 {
324 	// all draw buffers
325 	gl.blendFunc(src, dst);
326 	for (unsigned int i = 0; i < state.size(); ++i)
327 	{
328 		state[i].func_src_rgb = src;
329 		state[i].func_src_a   = src;
330 		state[i].func_dst_rgb = dst;
331 		state[i].func_dst_a   = dst;
332 	}
333 }
334 
SetBlendFuncSeparate(glw::GLenum src_rgb,glw::GLenum dst_rgb,glw::GLenum src_a,glw::GLenum dst_a)335 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetBlendFuncSeparate(glw::GLenum src_rgb, glw::GLenum dst_rgb,
336 																		 glw::GLenum src_a, glw::GLenum dst_a)
337 {
338 	// all draw buffers
339 	gl.blendFuncSeparate(src_rgb, dst_rgb, src_a, dst_a);
340 	for (unsigned int i = 0; i < state.size(); ++i)
341 	{
342 		state[i].func_src_rgb = src_rgb;
343 		state[i].func_src_a   = src_a;
344 		state[i].func_dst_rgb = dst_rgb;
345 		state[i].func_dst_a   = dst_a;
346 	}
347 }
348 
SetDefaults()349 void DrawBuffersIndexedBase::BlendMaskStateMachine::SetDefaults()
350 {
351 	SetDisable();
352 	SetColorMask(1, 1, 1, 1);
353 	SetBlendEquation(GL_FUNC_ADD);
354 	SetBlendFunc(GL_ONE, GL_ZERO);
355 }
356 
357 } // namespace glcts
358