1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES Utilities
3  * ------------------------------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
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 OpenGL State Reset.
22  *//*--------------------------------------------------------------------*/
23 
24 #include "gluStateReset.hpp"
25 #include "gluContextInfo.hpp"
26 #include "gluRenderContext.hpp"
27 #include "tcuRenderTarget.hpp"
28 #include "glwFunctions.hpp"
29 #include "glwEnums.hpp"
30 #include "deUniquePtr.hpp"
31 
32 namespace glu
33 {
34 namespace
35 {
36 enum
37 {
38 	MAX_ERROR_COUNT = 10
39 };
40 
resetErrors(const glw::Functions & gl)41 void resetErrors (const glw::Functions& gl)
42 {
43 	size_t errorNdx = 0;
44 
45 	for (errorNdx = 0; errorNdx < MAX_ERROR_COUNT; errorNdx++)
46 	{
47 		if (gl.getError() == GL_NONE)
48 			break;
49 	}
50 
51 	if (errorNdx == MAX_ERROR_COUNT)
52 		TCU_FAIL("Couldn't reset error state");
53 }
54 
55 }
56 
resetStateES(const RenderContext & renderCtx,const ContextInfo & ctxInfo)57 void resetStateES (const RenderContext& renderCtx, const ContextInfo& ctxInfo)
58 {
59 	const glw::Functions&	gl	= renderCtx.getFunctions();
60 	const ContextType		type	= renderCtx.getType();
61 
62 	// Reset error state
63 	resetErrors(gl);
64 
65 	DE_ASSERT(isContextTypeES(type));
66 
67 	// Vertex attrib array state.
68 	{
69 		int numVertexAttribArrays = 0;
70 		gl.getIntegerv(GL_MAX_VERTEX_ATTRIBS, &numVertexAttribArrays);
71 
72 		gl.bindBuffer	(GL_ARRAY_BUFFER,			0);
73 		gl.bindBuffer	(GL_ELEMENT_ARRAY_BUFFER,	0);
74 
75 		if (contextSupports(type, ApiType::es(3,0)))
76 		{
77 			gl.bindVertexArray	(0);
78 			gl.disable			(GL_PRIMITIVE_RESTART_FIXED_INDEX);
79 		}
80 
81 		if (contextSupports(type, ApiType::es(3,1)))
82 			gl.bindBuffer(GL_DRAW_INDIRECT_BUFFER, 0);
83 
84 		for (int ndx = 0; ndx < numVertexAttribArrays; ndx++)
85 		{
86 			gl.disableVertexAttribArray	(ndx);
87 			gl.vertexAttribPointer		(ndx, 4, GL_FLOAT, GL_FALSE, 0, DE_NULL);
88 
89 			if (contextSupports(type, ApiType::es(3,0)))
90 				gl.vertexAttribDivisor(ndx, 0);
91 		}
92 
93 		GLU_EXPECT_NO_ERROR(gl.getError(), "Vertex attrib array state reset failed");
94 	}
95 
96 	// Transformation state.
97 	{
98 		const tcu::RenderTarget& renderTarget = renderCtx.getRenderTarget();
99 
100 		gl.viewport		(0, 0, renderTarget.getWidth(), renderTarget.getHeight());
101 		gl.depthRangef	(0.0f, 1.0f);
102 
103 		if (contextSupports(type, ApiType::es(3,0)))
104 			gl.bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
105 
106 		GLU_EXPECT_NO_ERROR(gl.getError(), "Transformation state reset failed");
107 	}
108 
109 	// Rasterization state
110 	{
111 		gl.lineWidth	(1.0f);
112 		gl.disable		(GL_CULL_FACE);
113 		gl.cullFace		(GL_BACK);
114 		gl.frontFace	(GL_CCW);
115 		gl.polygonOffset(0.0f, 0.0f);
116 		gl.disable		(GL_POLYGON_OFFSET_FILL);
117 
118 		if (contextSupports(type, ApiType::es(3,0)))
119 			gl.disable(GL_RASTERIZER_DISCARD);
120 
121 		GLU_EXPECT_NO_ERROR(gl.getError(), "Rasterization state reset failed");
122 	}
123 
124 	// Multisampling state
125 	{
126 		gl.disable			(GL_SAMPLE_ALPHA_TO_COVERAGE);
127 		gl.disable			(GL_SAMPLE_COVERAGE);
128 		gl.sampleCoverage	(1.0f, GL_FALSE);
129 
130 		if (contextSupports(type, ApiType::es(3,1)))
131 		{
132 			int numSampleMaskWords = 0;
133 			gl.getIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &numSampleMaskWords);
134 
135 			gl.disable(GL_SAMPLE_MASK);
136 
137 			for (int ndx = 0; ndx < numSampleMaskWords; ndx++)
138 				gl.sampleMaski(ndx, ~0u);
139 		}
140 
141 		GLU_EXPECT_NO_ERROR(gl.getError(), "Multisampling state reset failed");
142 	}
143 
144 	// Texture state.
145 	// \todo [2013-04-08 pyry] Reset all levels?
146 	{
147 		const float	borderColor[]	= { 0.0f, 0.0f, 0.0f, 0.0f };
148 		int			numTexUnits		= 0;
149 		gl.getIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &numTexUnits);
150 
151 		for (int ndx = 0; ndx < numTexUnits; ndx++)
152 		{
153 			gl.activeTexture(GL_TEXTURE0 + ndx);
154 
155 			// Reset 2D texture.
156 			gl.bindTexture(GL_TEXTURE_2D, 0);
157 			gl.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
158 			gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,		GL_NEAREST_MIPMAP_LINEAR);
159 			gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,		GL_LINEAR);
160 			gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,			GL_REPEAT);
161 			gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,			GL_REPEAT);
162 
163 			if (contextSupports(type, ApiType::es(3,0)))
164 			{
165 				gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R,		GL_RED);
166 				gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G,		GL_GREEN);
167 				gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B,		GL_BLUE);
168 				gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A,		GL_ALPHA);
169 				gl.texParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD,			-1000.0f);
170 				gl.texParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD,			1000.0f);
171 				gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL,		0);
172 				gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL,		1000);
173 				gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE,	GL_NONE);
174 				gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC,	GL_LEQUAL);
175 			}
176 
177 			if (contextSupports(type, ApiType::es(3,1)))
178 				gl.texParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_DEPTH_COMPONENT);
179 
180 			if (ctxInfo.isExtensionSupported("GL_EXT_texture_border_clamp"))
181 				gl.texParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
182 
183 			// Reset cube map texture.
184 			gl.bindTexture(GL_TEXTURE_CUBE_MAP, 0);
185 			gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
186 			gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
187 			gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
188 			gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
189 			gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
190 			gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
191 			gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER,	GL_NEAREST_MIPMAP_LINEAR);
192 			gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER,	GL_LINEAR);
193 			gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S,		GL_REPEAT);
194 			gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T,		GL_REPEAT);
195 
196 			if (contextSupports(type, ApiType::es(3,0)))
197 			{
198 				gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_R,		GL_RED);
199 				gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_G,		GL_GREEN);
200 				gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_B,		GL_BLUE);
201 				gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_A,		GL_ALPHA);
202 				gl.texParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_LOD,		-1000.0f);
203 				gl.texParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LOD,		1000.0f);
204 				gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL,	0);
205 				gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL,		1000);
206 				gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_MODE,	GL_NONE);
207 				gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC,	GL_LEQUAL);
208 			}
209 
210 			if (contextSupports(type, ApiType::es(3,1)))
211 				gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_DEPTH_COMPONENT);
212 
213 			if (ctxInfo.isExtensionSupported("GL_EXT_texture_border_clamp"))
214 				gl.texParameterfv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
215 
216 			if (contextSupports(type, ApiType::es(3,0)))
217 			{
218 				// Reset 2D array texture.
219 				gl.bindTexture(GL_TEXTURE_2D_ARRAY, 0);
220 				gl.texImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
221 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER,	GL_NEAREST_MIPMAP_LINEAR);
222 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER,	GL_LINEAR);
223 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S,		GL_REPEAT);
224 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T,		GL_REPEAT);
225 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_SWIZZLE_R,		GL_RED);
226 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_SWIZZLE_G,		GL_GREEN);
227 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_SWIZZLE_B,		GL_BLUE);
228 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_SWIZZLE_A,		GL_ALPHA);
229 				gl.texParameterf(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_LOD,		-1000.0f);
230 				gl.texParameterf(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LOD,		1000.0f);
231 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL,	0);
232 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL,		1000);
233 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_MODE,	GL_NONE);
234 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_FUNC,	GL_LEQUAL);
235 
236 				if (ctxInfo.isExtensionSupported("GL_EXT_texture_border_clamp"))
237 					gl.texParameterfv(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
238 			}
239 
240 			if (contextSupports(type, ApiType::es(3,1)))
241 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_DEPTH_COMPONENT);
242 
243 			if (contextSupports(type, ApiType::es(3,0)))
244 			{
245 				// Reset 3D texture.
246 				gl.bindTexture(GL_TEXTURE_3D, 0);
247 				gl.texImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
248 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER,		GL_NEAREST_MIPMAP_LINEAR);
249 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER,		GL_LINEAR);
250 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S,			GL_REPEAT);
251 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T,			GL_REPEAT);
252 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R,			GL_REPEAT);
253 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R,		GL_RED);
254 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G,		GL_GREEN);
255 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B,		GL_BLUE);
256 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A,		GL_ALPHA);
257 				gl.texParameterf(GL_TEXTURE_3D, GL_TEXTURE_MIN_LOD,			-1000.0f);
258 				gl.texParameterf(GL_TEXTURE_3D, GL_TEXTURE_MAX_LOD,			1000.0f);
259 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL,		0);
260 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL,		1000);
261 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_COMPARE_MODE,	GL_NONE);
262 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_COMPARE_FUNC,	GL_LEQUAL);
263 
264 				if (ctxInfo.isExtensionSupported("GL_EXT_texture_border_clamp"))
265 					gl.texParameterfv(GL_TEXTURE_3D, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
266 			}
267 
268 			if (contextSupports(type, ApiType::es(3,1)))
269 				gl.texParameteri(GL_TEXTURE_3D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_DEPTH_COMPONENT);
270 
271 			if (contextSupports(type, ApiType::es(3,1)))
272 			{
273 				// Reset multisample textures.
274 				gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
275 				gl.texParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_SWIZZLE_R,	GL_RED);
276 				gl.texParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_SWIZZLE_G,	GL_GREEN);
277 				gl.texParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_SWIZZLE_B,	GL_BLUE);
278 				gl.texParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_SWIZZLE_A,	GL_ALPHA);
279 				gl.texParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BASE_LEVEL,	0);
280 				gl.texParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAX_LEVEL,	1000);
281 			}
282 
283 			if (ctxInfo.isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
284 			{
285 				gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 0);
286 				gl.texParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_SWIZZLE_R,		GL_RED);
287 				gl.texParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_SWIZZLE_G,		GL_GREEN);
288 				gl.texParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_SWIZZLE_B,		GL_BLUE);
289 				gl.texParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_SWIZZLE_A,		GL_ALPHA);
290 				gl.texParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BASE_LEVEL,	0);
291 				gl.texParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_MAX_LEVEL,		1000);
292 			}
293 
294 			if (ctxInfo.isExtensionSupported("GL_EXT_texture_cube_map_array"))
295 			{
296 				// Reset cube array texture.
297 				gl.bindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, 0);
298 				gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER,		GL_NEAREST_MIPMAP_LINEAR);
299 				gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER,		GL_LINEAR);
300 				gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S,			GL_REPEAT);
301 				gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T,			GL_REPEAT);
302 				gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_SWIZZLE_R,		GL_RED);
303 				gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_SWIZZLE_G,		GL_GREEN);
304 				gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_SWIZZLE_B,		GL_BLUE);
305 				gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_SWIZZLE_A,		GL_ALPHA);
306 				gl.texParameterf(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_LOD,			-1000.0f);
307 				gl.texParameterf(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAX_LOD,			1000.0f);
308 				gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_BASE_LEVEL,		0);
309 				gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAX_LEVEL,		1000);
310 				gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_COMPARE_MODE,	GL_NONE);
311 				gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_COMPARE_FUNC,	GL_LEQUAL);
312 
313 				if (ctxInfo.isExtensionSupported("GL_EXT_texture_border_clamp"))
314 					gl.texParameterfv(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
315 			}
316 		}
317 
318 		gl.activeTexture(GL_TEXTURE0);
319 
320 		if (contextSupports(type, ApiType::es(3,0)))
321 		{
322 			for (int ndx = 0; ndx < numTexUnits; ndx++)
323 				gl.bindSampler(ndx, 0);
324 		}
325 
326 		GLU_EXPECT_NO_ERROR(gl.getError(), "Texture state reset failed");
327 	}
328 
329 	// Resetting state using non-indexed variants should be enough, but some
330 	// implementations have bugs so we need to make sure indexed state gets
331 	// set back to initial values.
332 	if (ctxInfo.isExtensionSupported("GL_EXT_draw_buffers_indexed"))
333 	{
334 		int numDrawBuffers = 0;
335 
336 		gl.getIntegerv(GL_MAX_DRAW_BUFFERS, &numDrawBuffers);
337 
338 		for (int drawBufferNdx = 0; drawBufferNdx < numDrawBuffers; drawBufferNdx++)
339 		{
340 			gl.disablei			(GL_BLEND, drawBufferNdx);
341 			gl.blendFunci		(drawBufferNdx, GL_ONE, GL_ZERO);
342 			gl.blendEquationi	(drawBufferNdx, GL_FUNC_ADD);
343 			gl.colorMaski		(drawBufferNdx, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
344 		}
345 
346 		GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to reset indexed draw buffer state");
347 	}
348 
349 	// Pixel operations.
350 	{
351 		const tcu::RenderTarget& renderTarget = renderCtx.getRenderTarget();
352 
353 		gl.disable		(GL_SCISSOR_TEST);
354 		gl.scissor		(0, 0, renderTarget.getWidth(), renderTarget.getHeight());
355 
356 		gl.disable		(GL_STENCIL_TEST);
357 		gl.stencilFunc	(GL_ALWAYS, 0, ~0u);
358 		gl.stencilOp	(GL_KEEP, GL_KEEP, GL_KEEP);
359 
360 		gl.disable		(GL_DEPTH_TEST);
361 		gl.depthFunc	(GL_LESS);
362 
363 		gl.disable		(GL_BLEND);
364 		gl.blendFunc	(GL_ONE, GL_ZERO);
365 		gl.blendEquation(GL_FUNC_ADD);
366 		gl.blendColor	(0.0f, 0.0f, 0.0f, 0.0f);
367 
368 		gl.enable		(GL_DITHER);
369 
370 		GLU_EXPECT_NO_ERROR(gl.getError(), "Pixel operation state reset failed");
371 	}
372 
373 	// Framebuffer control.
374 	{
375 		gl.colorMask		(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
376 		gl.depthMask		(GL_TRUE);
377 		gl.stencilMask		(~0u);
378 
379 		gl.clearColor		(0.0f, 0.0f, 0.0f, 0.0f);
380 		gl.clearDepthf		(1.0f);
381 		gl.clearStencil		(0);
382 
383 		GLU_EXPECT_NO_ERROR(gl.getError(), "Framebuffer control state reset failed");
384 	}
385 
386 	// Framebuffer state.
387 	{
388 		// \note Actually spec explictly says 0 but on some platforms (iOS) no default framebuffer exists.
389 		const deUint32		defaultFbo		= renderCtx.getDefaultFramebuffer();
390 		const deUint32		drawBuffer		= defaultFbo != 0 ? GL_COLOR_ATTACHMENT0 : GL_BACK;
391 		const deUint32		readBuffer		= defaultFbo != 0 ? GL_COLOR_ATTACHMENT0 : GL_BACK;
392 
393 		gl.bindFramebuffer(GL_FRAMEBUFFER, defaultFbo);
394 
395 		if (contextSupports(type, ApiType::es(3,0)))
396 		{
397 			gl.drawBuffers	(1, &drawBuffer);
398 			gl.readBuffer	(readBuffer);
399 		}
400 
401 		GLU_EXPECT_NO_ERROR(gl.getError(), "Framebuffer state reset failed");
402 	}
403 
404 	// Renderbuffer state.
405 	{
406 		gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
407 		GLU_EXPECT_NO_ERROR(gl.getError(), "Renderbuffer state reset failed");
408 	}
409 
410 	// Pixel transfer state.
411 	{
412 		gl.pixelStorei(GL_UNPACK_ALIGNMENT,		4);
413 		gl.pixelStorei(GL_PACK_ALIGNMENT,		4);
414 
415 		if (contextSupports(type, ApiType::es(3,0)))
416 		{
417 			gl.pixelStorei(GL_UNPACK_IMAGE_HEIGHT,	0);
418 			gl.pixelStorei(GL_UNPACK_SKIP_IMAGES,	0);
419 			gl.pixelStorei(GL_UNPACK_ROW_LENGTH,	0);
420 			gl.pixelStorei(GL_UNPACK_SKIP_ROWS,		0);
421 			gl.pixelStorei(GL_UNPACK_SKIP_PIXELS,	0);
422 
423 			gl.pixelStorei(GL_PACK_ROW_LENGTH,		0);
424 			gl.pixelStorei(GL_PACK_SKIP_ROWS,		0);
425 			gl.pixelStorei(GL_PACK_SKIP_PIXELS,		0);
426 
427 			gl.bindBuffer(GL_PIXEL_PACK_BUFFER,		0);
428 			gl.bindBuffer(GL_PIXEL_UNPACK_BUFFER,	0);
429 		}
430 
431 		GLU_EXPECT_NO_ERROR(gl.getError(), "Pixel transfer state reset failed");
432 	}
433 
434 	// Program object state.
435 	{
436 		gl.useProgram(0);
437 
438 		if (contextSupports(type, ApiType::es(3,0)))
439 		{
440 			int maxUniformBufferBindings = 0;
441 			gl.getIntegerv	(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
442 			gl.bindBuffer	(GL_UNIFORM_BUFFER,	0);
443 
444 			for (int ndx = 0; ndx < maxUniformBufferBindings; ndx++)
445 				gl.bindBufferBase(GL_UNIFORM_BUFFER, ndx, 0);
446 		}
447 
448 		if (contextSupports(type, ApiType::es(3,1)))
449 		{
450 			gl.bindProgramPipeline(0);
451 
452 			{
453 				int maxAtomicCounterBufferBindings = 0;
454 				gl.getIntegerv	(GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, &maxAtomicCounterBufferBindings);
455 				gl.bindBuffer	(GL_ATOMIC_COUNTER_BUFFER, 0);
456 
457 				for (int ndx = 0; ndx < maxAtomicCounterBufferBindings; ndx++)
458 					gl.bindBufferBase(GL_ATOMIC_COUNTER_BUFFER, ndx, 0);
459 			}
460 
461 			{
462 				int maxShaderStorageBufferBindings = 0;
463 				gl.getIntegerv	(GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, &maxShaderStorageBufferBindings);
464 				gl.bindBuffer	(GL_SHADER_STORAGE_BUFFER, 0);
465 
466 				for (int ndx = 0; ndx < maxShaderStorageBufferBindings; ndx++)
467 					gl.bindBufferBase(GL_SHADER_STORAGE_BUFFER, ndx, 0);
468 			}
469 		}
470 
471 		GLU_EXPECT_NO_ERROR(gl.getError(), "Program object state reset failed");
472 	}
473 
474 	// Vertex shader state.
475 	{
476 		int numVertexAttribArrays = 0;
477 		gl.getIntegerv(GL_MAX_VERTEX_ATTRIBS, &numVertexAttribArrays);
478 
479 		for (int ndx = 0; ndx < numVertexAttribArrays; ndx++)
480 			gl.vertexAttrib4f(ndx, 0.0f, 0.0f, 0.0f, 1.0f);
481 
482 		GLU_EXPECT_NO_ERROR(gl.getError(), "Vertex shader state reset failed");
483 	}
484 
485 	// Transform feedback state.
486 	if (contextSupports(type, ApiType::es(3,0)))
487 	{
488 		int				numTransformFeedbackSeparateAttribs	= 0;
489 		glw::GLboolean	transformFeedbackActive				= 0;
490 		gl.getIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,	&numTransformFeedbackSeparateAttribs);
491 		gl.getBooleanv(GL_TRANSFORM_FEEDBACK_ACTIVE,				&transformFeedbackActive);
492 
493 		if (transformFeedbackActive)
494 			gl.endTransformFeedback();
495 
496 		gl.bindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0);
497 
498 		for (int ndx = 0; ndx < numTransformFeedbackSeparateAttribs; ndx++)
499 			gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, ndx, 0);
500 
501 		GLU_EXPECT_NO_ERROR(gl.getError(), "Transform feedback state reset failed");
502 	}
503 
504 	// Asynchronous query state.
505 	if (contextSupports(type, ApiType::es(3,0)))
506 	{
507 		static const deUint32 targets[] = { GL_ANY_SAMPLES_PASSED, GL_ANY_SAMPLES_PASSED_CONSERVATIVE, GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN };
508 
509 		for (int i = 0; i < DE_LENGTH_OF_ARRAY(targets); i++)
510 		{
511 			int queryActive = 0;
512 			gl.getQueryiv(targets[i], GL_CURRENT_QUERY, &queryActive);
513 
514 			if (queryActive != 0)
515 				gl.endQuery(targets[i]);
516 		}
517 
518 		GLU_EXPECT_NO_ERROR(gl.getError(), "Asynchronous query state reset failed");
519 	}
520 
521 	// Hints.
522 	{
523 		gl.hint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);
524 
525 		if (contextSupports(type, ApiType::es(3,0)))
526 			gl.hint(GL_FRAGMENT_SHADER_DERIVATIVE_HINT, GL_DONT_CARE);
527 
528 		GLU_EXPECT_NO_ERROR(gl.getError(), "Hints reset failed");
529 	}
530 
531 	// Compute.
532 	if (contextSupports(type, ApiType::es(3,1)))
533 	{
534 		gl.bindBuffer(GL_DISPATCH_INDIRECT_BUFFER, 0);
535 		GLU_EXPECT_NO_ERROR(gl.getError(), "Compute dispatch state reset failed");
536 	}
537 
538 	// Buffer copy state.
539 	if (contextSupports(type, ApiType::es(3,0)))
540 	{
541 		gl.bindBuffer(GL_COPY_READ_BUFFER,	0);
542 		gl.bindBuffer(GL_COPY_WRITE_BUFFER,	0);
543 
544 		GLU_EXPECT_NO_ERROR(gl.getError(), "Buffer copy state reset failed");
545 	}
546 
547 	// Images.
548 	if (contextSupports(type, ApiType::es(3,1)))
549 	{
550 		int numImageUnits = 0;
551 		gl.getIntegerv(GL_MAX_IMAGE_UNITS, &numImageUnits);
552 
553 		for (int ndx = 0; ndx < numImageUnits; ndx++)
554 			gl.bindImageTexture(ndx, 0, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R32UI);
555 
556 		GLU_EXPECT_NO_ERROR(gl.getError(), "Image state reset failed");
557 	}
558 
559 	// Sample shading state.
560 	if (contextSupports(type, ApiType::es(3,1)) && ctxInfo.isExtensionSupported("GL_OES_sample_shading"))
561 	{
562 		gl.minSampleShading(0.0f);
563 		gl.disable(GL_SAMPLE_SHADING);
564 
565 		GLU_EXPECT_NO_ERROR(gl.getError(), "Sample shading state reset failed");
566 	}
567 
568 	// Debug state
569 	if (ctxInfo.isExtensionSupported("GL_KHR_debug"))
570 	{
571 		const bool entrypointsPresent =	gl.debugMessageControl	!= DE_NULL	&&
572 										gl.debugMessageCallback	!= DE_NULL	&&
573 										gl.popDebugGroup		!= DE_NULL;
574 
575 		// some drivers advertise GL_KHR_debug but give out null pointers. Silently ignore.
576 		if (entrypointsPresent)
577 		{
578 			int stackDepth = 0;
579 			gl.getIntegerv(GL_DEBUG_GROUP_STACK_DEPTH, &stackDepth);
580 			for (int ndx = 1; ndx < stackDepth; ++ndx)
581 				gl.popDebugGroup();
582 
583 			gl.debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, DE_NULL, true);
584 			gl.debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, DE_NULL, false);
585 			gl.debugMessageCallback(DE_NULL, DE_NULL);
586 
587 			if (type.getFlags() & glu::CONTEXT_DEBUG)
588 				gl.enable(GL_DEBUG_OUTPUT);
589 			else
590 				gl.disable(GL_DEBUG_OUTPUT);
591 			gl.disable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
592 
593 			GLU_EXPECT_NO_ERROR(gl.getError(), "Debug state reset failed");
594 		}
595 	}
596 
597 	// Primitive bounding box state.
598 	if (ctxInfo.isExtensionSupported("GL_EXT_primitive_bounding_box"))
599 	{
600 		gl.primitiveBoundingBox(-1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
601 		GLU_EXPECT_NO_ERROR(gl.getError(), "Primitive bounding box state reset failed");
602 	}
603 
604 	// Tessellation state
605 	if (ctxInfo.isExtensionSupported("GL_EXT_tessellation_shader"))
606 	{
607 		gl.patchParameteri(GL_PATCH_VERTICES, 3);
608 		GLU_EXPECT_NO_ERROR(gl.getError(), "Tessellation patch vertices state reset failed");
609 	}
610 
611 	// Advanced coherent blending
612 	if (ctxInfo.isExtensionSupported("GL_KHR_blend_equation_advanced_coherent"))
613 	{
614 		gl.enable(GL_BLEND_ADVANCED_COHERENT_KHR);
615 		GLU_EXPECT_NO_ERROR(gl.getError(), "Blend equation advanced coherent state reset failed");
616 	}
617 
618 	// Texture buffer
619 	if (ctxInfo.isExtensionSupported("GL_EXT_texture_buffer"))
620 	{
621 		gl.bindTexture(GL_TEXTURE_BUFFER, 0);
622 		gl.bindBuffer(GL_TEXTURE_BUFFER, 0);
623 		GLU_EXPECT_NO_ERROR(gl.getError(), "Texture buffer state reset failed");
624 	}
625 }
626 
resetStateGLCore(const RenderContext & renderCtx,const ContextInfo & ctxInfo)627 void resetStateGLCore (const RenderContext& renderCtx, const ContextInfo& ctxInfo)
628 {
629 	const glw::Functions&	gl		= renderCtx.getFunctions();
630 	const ContextType		type	= renderCtx.getType();
631 
632 	// Reset error state
633 	resetErrors(gl);
634 
635 	// Vertex attrib array state.
636 	{
637 		gl.bindVertexArray	(0);
638 		gl.bindBuffer		(GL_ARRAY_BUFFER,			0);
639 		gl.bindBuffer		(GL_ELEMENT_ARRAY_BUFFER,	0);
640 
641 		if (contextSupports(type, ApiType::core(3,1)))
642 		{
643 			gl.disable				(GL_PRIMITIVE_RESTART);
644 			gl.primitiveRestartIndex(0);
645 		}
646 
647 		GLU_EXPECT_NO_ERROR(gl.getError(), "Vertex attrib array state reset failed");
648 	}
649 
650 	// Transformation state.
651 	{
652 		const tcu::RenderTarget&	renderTarget		= renderCtx.getRenderTarget();
653 		int							numUserClipPlanes	= 0;
654 
655 		gl.getIntegerv(GL_MAX_CLIP_DISTANCES, &numUserClipPlanes);
656 
657 		gl.viewport		(0, 0, renderTarget.getWidth(), renderTarget.getHeight());
658 		gl.depthRange	(0.0, 1.0);
659 
660 		for (int ndx = 0; ndx < numUserClipPlanes; ndx++)
661 			gl.disable(GL_CLIP_DISTANCE0+ndx);
662 
663 		if (contextSupports(type, ApiType::core(3,2)))
664 			gl.disable(GL_DEPTH_CLAMP);
665 
666 		//gl.bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
667 
668 		GLU_EXPECT_NO_ERROR(gl.getError(), "Transformation state reset failed");
669 	}
670 
671 	// Coloring
672 	{
673 		gl.clampColor(GL_CLAMP_READ_COLOR, GL_FIXED_ONLY);
674 
675 		if (contextSupports(type, ApiType::core(3,2)))
676 			gl.provokingVertex(GL_LAST_VERTEX_CONVENTION);
677 
678 		GLU_EXPECT_NO_ERROR(gl.getError(), "Coloring state reset failed");
679 	}
680 
681 	// Rasterization state
682 	{
683 		gl.disable			(GL_RASTERIZER_DISCARD);
684 		gl.pointSize		(1.0f);
685 		gl.pointParameterf	(GL_POINT_FADE_THRESHOLD_SIZE,	1.0f);
686 		gl.pointParameteri	(GL_POINT_SPRITE_COORD_ORIGIN,	GL_UPPER_LEFT);
687 		gl.lineWidth		(1.0f);
688 		gl.disable			(GL_LINE_SMOOTH);
689 		gl.disable			(GL_CULL_FACE);
690 		gl.cullFace			(GL_BACK);
691 		gl.frontFace		(GL_CCW);
692 		gl.disable			(GL_POLYGON_SMOOTH);
693 		gl.polygonOffset	(0.0f, 0.0f);
694 		gl.disable			(GL_POLYGON_OFFSET_POINT);
695 		gl.disable			(GL_POLYGON_OFFSET_LINE);
696 		gl.disable			(GL_POLYGON_OFFSET_FILL);
697 
698 		GLU_EXPECT_NO_ERROR(gl.getError(), "Rasterization state reset failed");
699 	}
700 
701 	// Multisampling state
702 	{
703 		gl.enable			(GL_MULTISAMPLE);
704 		gl.disable			(GL_SAMPLE_ALPHA_TO_COVERAGE);
705 		gl.disable			(GL_SAMPLE_ALPHA_TO_ONE);
706 		gl.disable			(GL_SAMPLE_COVERAGE);
707 		gl.sampleCoverage	(1.0f, GL_FALSE);
708 
709 		if (contextSupports(type, ApiType::core(3,2)))
710 		{
711 			int numSampleMaskWords = 0;
712 			gl.getIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &numSampleMaskWords);
713 
714 			gl.disable(GL_SAMPLE_MASK);
715 
716 			for (int ndx = 0; ndx < numSampleMaskWords; ndx++)
717 				gl.sampleMaski(ndx, ~0u);
718 		}
719 
720 		GLU_EXPECT_NO_ERROR(gl.getError(), "Multisampling state reset failed");
721 	}
722 
723 	// Texture state.
724 	// \todo [2013-04-08 pyry] Reset all levels?
725 	{
726 		const float	borderColor[]	= { 0.0f, 0.0f, 0.0f, 0.0f };
727 		int			numTexUnits		= 0;
728 		gl.getIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &numTexUnits);
729 
730 		gl.bindBuffer(GL_TEXTURE_BUFFER, 0);
731 
732 		for (int ndx = 0; ndx < numTexUnits; ndx++)
733 		{
734 			gl.activeTexture(GL_TEXTURE0 + ndx);
735 
736 			// Reset 1D texture.
737 			gl.bindTexture		(GL_TEXTURE_1D, 0);
738 			gl.texImage1D		(GL_TEXTURE_1D, 0, GL_RGBA, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
739 			gl.texParameteri	(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER,		GL_LINEAR_MIPMAP_NEAREST);
740 			gl.texParameteri	(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER,		GL_LINEAR);
741 			gl.texParameterfv	(GL_TEXTURE_1D, GL_TEXTURE_BORDER_COLOR,	&borderColor[0]);
742 			gl.texParameteri	(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S,			GL_REPEAT);
743 			gl.texParameterf	(GL_TEXTURE_1D, GL_TEXTURE_MIN_LOD,			-1000.0f);
744 			gl.texParameterf	(GL_TEXTURE_1D, GL_TEXTURE_MAX_LOD,			1000.0f);
745 			gl.texParameteri	(GL_TEXTURE_1D, GL_TEXTURE_BASE_LEVEL,		0);
746 			gl.texParameteri	(GL_TEXTURE_1D, GL_TEXTURE_MAX_LEVEL,		1000);
747 			gl.texParameterf	(GL_TEXTURE_1D, GL_TEXTURE_LOD_BIAS,		0.0f);
748 			gl.texParameteri	(GL_TEXTURE_1D, GL_TEXTURE_COMPARE_MODE,	GL_NONE);
749 			gl.texParameteri	(GL_TEXTURE_1D, GL_TEXTURE_COMPARE_FUNC,	GL_LEQUAL);
750 
751 			if (contextSupports(type, ApiType::core(3,3)))
752 			{
753 				gl.texParameteri(GL_TEXTURE_1D, GL_TEXTURE_SWIZZLE_R,		GL_RED);
754 				gl.texParameteri(GL_TEXTURE_1D, GL_TEXTURE_SWIZZLE_G,		GL_GREEN);
755 				gl.texParameteri(GL_TEXTURE_1D, GL_TEXTURE_SWIZZLE_B,		GL_BLUE);
756 				gl.texParameteri(GL_TEXTURE_1D, GL_TEXTURE_SWIZZLE_A,		GL_ALPHA);
757 			}
758 
759 			// Reset 2D texture.
760 			gl.bindTexture		(GL_TEXTURE_2D, 0);
761 			gl.texImage2D		(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
762 			gl.texParameteri	(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,		GL_LINEAR_MIPMAP_NEAREST);
763 			gl.texParameteri	(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,		GL_LINEAR);
764 			gl.texParameterfv	(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR,	&borderColor[0]);
765 			gl.texParameteri	(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,			GL_REPEAT);
766 			gl.texParameteri	(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,			GL_REPEAT);
767 			gl.texParameterf	(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD,			-1000.0f);
768 			gl.texParameterf	(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD,			1000.0f);
769 			gl.texParameteri	(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL,		0);
770 			gl.texParameteri	(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL,		1000);
771 			gl.texParameterf	(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS,		0.0f);
772 			gl.texParameteri	(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE,	GL_NONE);
773 			gl.texParameteri	(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC,	GL_LEQUAL);
774 
775 			if (contextSupports(type, ApiType::core(3,3)))
776 			{
777 				gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R,		GL_RED);
778 				gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G,		GL_GREEN);
779 				gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B,		GL_BLUE);
780 				gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A,		GL_ALPHA);
781 			}
782 
783 			// Reset cube map texture.
784 			gl.bindTexture		(GL_TEXTURE_CUBE_MAP, 0);
785 			gl.texImage2D		(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
786 			gl.texImage2D		(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
787 			gl.texImage2D		(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
788 			gl.texImage2D		(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
789 			gl.texImage2D		(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
790 			gl.texImage2D		(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
791 			gl.texParameteri	(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER,	GL_LINEAR_MIPMAP_NEAREST);
792 			gl.texParameteri	(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER,	GL_LINEAR);
793 			gl.texParameterfv	(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BORDER_COLOR,	&borderColor[0]);
794 			gl.texParameteri	(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S,		GL_REPEAT);
795 			gl.texParameteri	(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T,		GL_REPEAT);
796 			gl.texParameterf	(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_LOD,		-1000.0f);
797 			gl.texParameterf	(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LOD,		1000.0f);
798 			gl.texParameteri	(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL,	0);
799 			gl.texParameteri	(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL,		1000);
800 			gl.texParameterf	(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_LOD_BIAS,		0.0f);
801 			gl.texParameteri	(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_MODE,	GL_NONE);
802 			gl.texParameteri	(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC,	GL_LEQUAL);
803 
804 			if (contextSupports(type, ApiType::core(3,3)))
805 			{
806 				gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_R,		GL_RED);
807 				gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_G,		GL_GREEN);
808 				gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_B,		GL_BLUE);
809 				gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_A,		GL_ALPHA);
810 			}
811 
812 			// Reset 1D array texture.
813 			gl.bindTexture		(GL_TEXTURE_1D_ARRAY, 0);
814 			gl.texImage2D		(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
815 			gl.texParameteri	(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_FILTER,	GL_LINEAR_MIPMAP_NEAREST);
816 			gl.texParameteri	(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAG_FILTER,	GL_LINEAR);
817 			gl.texParameterfv	(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_BORDER_COLOR,	&borderColor[0]);
818 			gl.texParameteri	(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_WRAP_S,		GL_REPEAT);
819 			gl.texParameterf	(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_LOD,		-1000.0f);
820 			gl.texParameterf	(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAX_LOD,		1000.0f);
821 			gl.texParameteri	(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_BASE_LEVEL,	0);
822 			gl.texParameteri	(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAX_LEVEL,		1000);
823 			gl.texParameterf	(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_LOD_BIAS,		0.0f);
824 			gl.texParameteri	(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_COMPARE_MODE,	GL_NONE);
825 			gl.texParameteri	(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_COMPARE_FUNC,	GL_LEQUAL);
826 
827 			if (contextSupports(type, ApiType::core(3,3)))
828 			{
829 				gl.texParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_SWIZZLE_R,		GL_RED);
830 				gl.texParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_SWIZZLE_G,		GL_GREEN);
831 				gl.texParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_SWIZZLE_B,		GL_BLUE);
832 				gl.texParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_SWIZZLE_A,		GL_ALPHA);
833 			}
834 
835 			// Reset 2D array texture.
836 			gl.bindTexture		(GL_TEXTURE_2D_ARRAY, 0);
837 			gl.texImage3D		(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
838 			gl.texParameteri	(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER,	GL_LINEAR_MIPMAP_NEAREST);
839 			gl.texParameteri	(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER,	GL_LINEAR);
840 			gl.texParameterfv	(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BORDER_COLOR,	&borderColor[0]);
841 			gl.texParameteri	(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S,		GL_REPEAT);
842 			gl.texParameteri	(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T,		GL_REPEAT);
843 			gl.texParameterf	(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_LOD,		-1000.0f);
844 			gl.texParameterf	(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LOD,		1000.0f);
845 			gl.texParameteri	(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL,	0);
846 			gl.texParameteri	(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL,		1000);
847 			gl.texParameterf	(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_LOD_BIAS,		0.0f);
848 			gl.texParameteri	(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_MODE,	GL_NONE);
849 			gl.texParameteri	(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_FUNC,	GL_LEQUAL);
850 
851 			if (contextSupports(type, ApiType::core(3,3)))
852 			{
853 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_SWIZZLE_R,		GL_RED);
854 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_SWIZZLE_G,		GL_GREEN);
855 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_SWIZZLE_B,		GL_BLUE);
856 				gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_SWIZZLE_A,		GL_ALPHA);
857 			}
858 
859 			// Reset 3D texture.
860 			gl.bindTexture		(GL_TEXTURE_3D, 0);
861 			gl.texImage3D		(GL_TEXTURE_3D, 0, GL_RGBA, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
862 			gl.texParameteri	(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER,		GL_LINEAR_MIPMAP_NEAREST);
863 			gl.texParameteri	(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER,		GL_LINEAR);
864 			gl.texParameterfv	(GL_TEXTURE_3D, GL_TEXTURE_BORDER_COLOR,	&borderColor[0]);
865 			gl.texParameteri	(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S,			GL_REPEAT);
866 			gl.texParameteri	(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T,			GL_REPEAT);
867 			gl.texParameteri	(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R,			GL_REPEAT);
868 			gl.texParameterf	(GL_TEXTURE_3D, GL_TEXTURE_MIN_LOD,			-1000.0f);
869 			gl.texParameterf	(GL_TEXTURE_3D, GL_TEXTURE_MAX_LOD,			1000.0f);
870 			gl.texParameteri	(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL,		0);
871 			gl.texParameteri	(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL,		1000);
872 			gl.texParameterf	(GL_TEXTURE_3D, GL_TEXTURE_LOD_BIAS,		0.0f);
873 			gl.texParameteri	(GL_TEXTURE_3D, GL_TEXTURE_COMPARE_MODE,	GL_NONE);
874 			gl.texParameteri	(GL_TEXTURE_3D, GL_TEXTURE_COMPARE_FUNC,	GL_LEQUAL);
875 
876 			if (contextSupports(type, ApiType::core(3,3)))
877 			{
878 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R,		GL_RED);
879 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G,		GL_GREEN);
880 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B,		GL_BLUE);
881 				gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A,		GL_ALPHA);
882 			}
883 
884 			if (contextSupports(type, ApiType::core(3,1)))
885 			{
886 				// Reset rectangle texture.
887 				gl.bindTexture		(GL_TEXTURE_RECTANGLE, 0);
888 				gl.texImage2D		(GL_TEXTURE_RECTANGLE, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
889 				gl.texParameteri	(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER,	GL_LINEAR);
890 				gl.texParameteri	(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER,	GL_LINEAR);
891 				gl.texParameterfv	(GL_TEXTURE_RECTANGLE, GL_TEXTURE_BORDER_COLOR,	&borderColor[0]);
892 				gl.texParameteri	(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S,		GL_CLAMP_TO_EDGE);
893 				gl.texParameteri	(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T,		GL_CLAMP_TO_EDGE);
894 				gl.texParameteri	(GL_TEXTURE_RECTANGLE, GL_TEXTURE_BASE_LEVEL,	0);
895 				gl.texParameteri	(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAX_LEVEL,	1000);
896 				gl.texParameteri	(GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_MODE,	GL_NONE);
897 				gl.texParameteri	(GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_FUNC,	GL_LEQUAL);
898 				// \todo [2013-06-17 pyry] Drivers don't accept GL_MIN_LOD, GL_MAX_LOD for rectangle textures. Is that okay?
899 
900 				if (contextSupports(type, ApiType::core(3,3)))
901 				{
902 					gl.texParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_SWIZZLE_R,	GL_RED);
903 					gl.texParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_SWIZZLE_G,	GL_GREEN);
904 					gl.texParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_SWIZZLE_B,	GL_BLUE);
905 					gl.texParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_SWIZZLE_A,	GL_ALPHA);
906 				}
907 
908 				// Reset buffer texture.
909 				gl.bindTexture	(GL_TEXTURE_BUFFER, 0);
910 				gl.texBuffer	(GL_TEXTURE_BUFFER, GL_R8, 0);
911 				// \todo [2013-05-04 pyry] Which parameters apply to buffer textures?
912 			}
913 
914 			if (contextSupports(type, ApiType::core(3,2)))
915 			{
916 				// Reset 2D multisample texture.
917 				gl.bindTexture				(GL_TEXTURE_2D_MULTISAMPLE, 0);
918 				gl.texImage2DMultisample	(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, 0, 0, GL_TRUE);
919 
920 				// Reset 2D multisample array texture.
921 				gl.bindTexture				(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 0);
922 				gl.texImage3DMultisample	(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 1, GL_RGBA8, 0, 0, 0, GL_TRUE);
923 			}
924 		}
925 
926 		gl.activeTexture(GL_TEXTURE0);
927 
928 		if (contextSupports(type, ApiType::core(3,3)))
929 		{
930 			for (int ndx = 0; ndx < numTexUnits; ndx++)
931 				gl.bindSampler(ndx, 0);
932 
933 			gl.disable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
934 		}
935 
936 		GLU_EXPECT_NO_ERROR(gl.getError(), "Texture state reset failed");
937 	}
938 
939 	// Pixel operations.
940 	{
941 		const tcu::RenderTarget& renderTarget = renderCtx.getRenderTarget();
942 
943 		gl.disable		(GL_SCISSOR_TEST);
944 		gl.scissor		(0, 0, renderTarget.getWidth(), renderTarget.getHeight());
945 
946 		gl.disable		(GL_STENCIL_TEST);
947 		gl.stencilFunc	(GL_ALWAYS, 0, ~0u);
948 		gl.stencilOp	(GL_KEEP, GL_KEEP, GL_KEEP);
949 
950 		gl.disable		(GL_DEPTH_TEST);
951 		gl.depthFunc	(GL_LESS);
952 
953 		gl.disable		(GL_BLEND);
954 		gl.blendFunc	(GL_ONE, GL_ZERO);
955 		gl.blendEquation(GL_FUNC_ADD);
956 		gl.blendColor	(0.0f, 0.0f, 0.0f, 0.0f);
957 
958 		gl.disable		(GL_FRAMEBUFFER_SRGB);
959 		gl.enable		(GL_DITHER);
960 
961 		gl.disable		(GL_COLOR_LOGIC_OP);
962 		gl.logicOp		(GL_COPY);
963 
964 		GLU_EXPECT_NO_ERROR(gl.getError(), "Pixel operation state reset failed");
965 	}
966 
967 	// Framebuffer control.
968 	{
969 		gl.colorMask		(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
970 		gl.depthMask		(GL_TRUE);
971 		gl.stencilMask		(~0u);
972 
973 		gl.clearColor		(0.0f, 0.0f, 0.0f, 0.0f);
974 		gl.clearDepth		(1.0);
975 		gl.clearStencil		(0);
976 
977 		GLU_EXPECT_NO_ERROR(gl.getError(), "Framebuffer control state reset failed");
978 	}
979 
980 	// Framebuffer state.
981 	{
982 		// \todo [2013-04-05 pyry] Single-buffered rendering: use GL_FRONT
983 		deUint32	framebuffer		= renderCtx.getDefaultFramebuffer();
984 		deUint32	drawReadBuffer	= framebuffer == 0 ? GL_BACK : GL_COLOR_ATTACHMENT0;
985 
986 		gl.bindFramebuffer	(GL_FRAMEBUFFER, renderCtx.getDefaultFramebuffer());
987 		gl.drawBuffer		(drawReadBuffer);
988 		gl.readBuffer		(drawReadBuffer);
989 
990 		GLU_EXPECT_NO_ERROR(gl.getError(), "Framebuffer state reset failed");
991 	}
992 
993 	// Renderbuffer state.
994 	{
995 		gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
996 		GLU_EXPECT_NO_ERROR(gl.getError(), "Renderbuffer state reset failed");
997 	}
998 
999 	// Pixel transfer state.
1000 	{
1001 		gl.pixelStorei	(GL_UNPACK_SWAP_BYTES,		GL_FALSE);
1002 		gl.pixelStorei	(GL_UNPACK_LSB_FIRST,		GL_FALSE);
1003 		gl.pixelStorei	(GL_UNPACK_IMAGE_HEIGHT,	0);
1004 		gl.pixelStorei	(GL_UNPACK_SKIP_IMAGES,		0);
1005 		gl.pixelStorei	(GL_UNPACK_ROW_LENGTH,		0);
1006 		gl.pixelStorei	(GL_UNPACK_SKIP_ROWS,		0);
1007 		gl.pixelStorei	(GL_UNPACK_SKIP_PIXELS,		0);
1008 		gl.pixelStorei	(GL_UNPACK_ALIGNMENT,		4);
1009 
1010 		gl.pixelStorei	(GL_PACK_SWAP_BYTES,		GL_FALSE);
1011 		gl.pixelStorei	(GL_PACK_LSB_FIRST,			GL_FALSE);
1012 		gl.pixelStorei	(GL_PACK_IMAGE_HEIGHT,		0);
1013 		gl.pixelStorei	(GL_PACK_SKIP_IMAGES,		0);
1014 		gl.pixelStorei	(GL_PACK_ROW_LENGTH,		0);
1015 		gl.pixelStorei	(GL_PACK_SKIP_ROWS,			0);
1016 		gl.pixelStorei	(GL_PACK_SKIP_PIXELS,		0);
1017 		gl.pixelStorei	(GL_PACK_ALIGNMENT,			4);
1018 
1019 		gl.bindBuffer	(GL_PIXEL_PACK_BUFFER,		0);
1020 		gl.bindBuffer	(GL_PIXEL_UNPACK_BUFFER,	0);
1021 
1022 		GLU_EXPECT_NO_ERROR(gl.getError(), "Pixel transfer state reset failed");
1023 	}
1024 
1025 	// Program object state.
1026 	{
1027 		gl.useProgram(0);
1028 
1029 		if (contextSupports(type, ApiType::core(3,1)))
1030 		{
1031 			int maxUniformBufferBindings = 0;
1032 			gl.getIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
1033 
1034 			gl.bindBuffer(GL_UNIFORM_BUFFER, 0);
1035 
1036 			for (int ndx = 0; ndx < maxUniformBufferBindings; ndx++)
1037 				gl.bindBufferBase(GL_UNIFORM_BUFFER, ndx, 0);
1038 		}
1039 
1040 		GLU_EXPECT_NO_ERROR(gl.getError(), "Program object state reset failed");
1041 	}
1042 
1043 	// Vertex shader state.
1044 	{
1045 		int numVertexAttribArrays = 0;
1046 		gl.getIntegerv(GL_MAX_VERTEX_ATTRIBS, &numVertexAttribArrays);
1047 
1048 		for (int ndx = 0; ndx < numVertexAttribArrays; ndx++)
1049 			gl.vertexAttrib4f(ndx, 0.0f, 0.0f, 0.0f, 1.0f);
1050 
1051 		gl.disable(GL_VERTEX_PROGRAM_POINT_SIZE);
1052 
1053 		GLU_EXPECT_NO_ERROR(gl.getError(), "Vertex shader state reset failed");
1054 	}
1055 
1056 	// Transform feedback state.
1057 	{
1058 		int numTransformFeedbackSeparateAttribs = 0;
1059 		gl.getIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &numTransformFeedbackSeparateAttribs);
1060 
1061 		if (contextSupports(type, ApiType::core(4,0)))
1062 		{
1063 			glw::GLboolean transformFeedbackActive = 0;
1064 			gl.getBooleanv(GL_TRANSFORM_FEEDBACK_ACTIVE, &transformFeedbackActive);
1065 
1066 			if (transformFeedbackActive)
1067 				gl.endTransformFeedback();
1068 		}
1069 
1070 		gl.bindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0);
1071 
1072 		for (int ndx = 0; ndx < numTransformFeedbackSeparateAttribs; ndx++)
1073 			gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, ndx, 0);
1074 
1075 		GLU_EXPECT_NO_ERROR(gl.getError(), "Transform feedback state reset failed");
1076 	}
1077 
1078 	// Asynchronous query state.
1079 	{
1080 		deUint32	queryTargets[8];
1081 		int			numTargets		= 0;
1082 
1083 		queryTargets[numTargets++] = GL_PRIMITIVES_GENERATED;
1084 		queryTargets[numTargets++] = GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN;
1085 		queryTargets[numTargets++] = GL_SAMPLES_PASSED;
1086 
1087 		DE_ASSERT(numTargets <= DE_LENGTH_OF_ARRAY(queryTargets));
1088 
1089 		for (int i = 0; i < numTargets; i++)
1090 		{
1091 			int queryActive = 0;
1092 			gl.getQueryiv(queryTargets[i], GL_CURRENT_QUERY, &queryActive);
1093 
1094 			if (queryActive != 0)
1095 				gl.endQuery(queryTargets[i]);
1096 		}
1097 
1098 		GLU_EXPECT_NO_ERROR(gl.getError(), "Asynchronous query state reset failed");
1099 	}
1100 
1101 	// Hints.
1102 	{
1103 		gl.hint(GL_LINE_SMOOTH_HINT,				GL_DONT_CARE);
1104 		gl.hint(GL_POLYGON_SMOOTH_HINT,				GL_DONT_CARE);
1105 		gl.hint(GL_TEXTURE_COMPRESSION_HINT,		GL_DONT_CARE);
1106 		gl.hint(GL_FRAGMENT_SHADER_DERIVATIVE_HINT,	GL_DONT_CARE);
1107 
1108 		GLU_EXPECT_NO_ERROR(gl.getError(), "Hints reset failed");
1109 	}
1110 
1111 	// Buffer copy state.
1112 	if (contextSupports(type, ApiType::core(3,1)))
1113 	{
1114 		gl.bindBuffer(GL_COPY_READ_BUFFER,	0);
1115 		gl.bindBuffer(GL_COPY_WRITE_BUFFER,	0);
1116 
1117 		GLU_EXPECT_NO_ERROR(gl.getError(), "Buffer copy state reset failed");
1118 	}
1119 
1120 	// Debug state
1121 	if (ctxInfo.isExtensionSupported("GL_KHR_debug"))
1122 	{
1123 		const bool entrypointsPresent =	gl.debugMessageControl	!= DE_NULL	&&
1124 										gl.debugMessageCallback	!= DE_NULL;
1125 
1126 		// some drivers advertise GL_KHR_debug but give out null pointers. Silently ignore.
1127 		if (entrypointsPresent)
1128 		{
1129 			gl.debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, DE_NULL, true);
1130 			gl.debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, DE_NULL, false);
1131 			gl.debugMessageCallback(DE_NULL, DE_NULL);
1132 
1133 			if (type.getFlags() & glu::CONTEXT_DEBUG)
1134 				gl.enable(GL_DEBUG_OUTPUT);
1135 			else
1136 				gl.disable(GL_DEBUG_OUTPUT);
1137 		}
1138 	}
1139 }
1140 
resetState(const RenderContext & renderCtx,const ContextInfo & ctxInfo)1141 void resetState (const RenderContext& renderCtx, const ContextInfo& ctxInfo)
1142 {
1143 	if (isContextTypeES(renderCtx.getType()))
1144 		resetStateES(renderCtx, ctxInfo);
1145 	else if (isContextTypeGLCore(renderCtx.getType()))
1146 		resetStateGLCore(renderCtx, ctxInfo);
1147 	else
1148 		throw tcu::InternalError("State reset requested for unsupported context type");
1149 }
1150 
1151 } // glu
1152