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