1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES Utilities
3 * ------------------------------------------------
5 * Copyright 2014 The Android Open Source Project
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 * \brief OpenGL State Reset.
22 *//*--------------------------------------------------------------------*/
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"
41 void resetErrors (const glw::Functions& gl)
45 for (errorNdx = 0; errorNdx < MAX_ERROR_COUNT; errorNdx++)
47 if (gl.getError() == GL_NONE)
51 if (errorNdx == MAX_ERROR_COUNT)
52 TCU_FAIL("Couldn't reset error state");
57 void resetStateES (const RenderContext& renderCtx, const ContextInfo& ctxInfo)
59 const glw::Functions& gl = renderCtx.getFunctions();
60 const ContextType type = renderCtx.getType();
65 DE_ASSERT(isContextTypeES(type));
67 // Vertex attrib array state.
69 int numVertexAttribArrays = 0;
70 gl.getIntegerv(GL_MAX_VERTEX_ATTRIBS, &numVertexAttribArrays);
72 gl.bindBuffer (GL_ARRAY_BUFFER, 0);
73 gl.bindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
75 if (contextSupports(type, ApiType::es(3,0)))
77 gl.bindVertexArray (0);
78 gl.disable (GL_PRIMITIVE_RESTART_FIXED_INDEX);
81 if (contextSupports(type, ApiType::es(3,1)))
82 gl.bindBuffer(GL_DRAW_INDIRECT_BUFFER, 0);
84 for (int ndx = 0; ndx < numVertexAttribArrays; ndx++)
86 gl.disableVertexAttribArray (ndx);
87 gl.vertexAttribPointer (ndx, 4, GL_FLOAT, GL_FALSE, 0, DE_NULL);
89 if (contextSupports(type, ApiType::es(3,0)))
90 gl.vertexAttribDivisor(ndx, 0);
93 GLU_EXPECT_NO_ERROR(gl.getError(), "Vertex attrib array state reset failed");
96 // Transformation state.
98 const tcu::RenderTarget& renderTarget = renderCtx.getRenderTarget();
100 gl.viewport (0, 0, renderTarget.getWidth(), renderTarget.getHeight());
101 gl.depthRangef (0.0f, 1.0f);
103 if (contextSupports(type, ApiType::es(3,0)))
104 gl.bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
106 GLU_EXPECT_NO_ERROR(gl.getError(), "Transformation state reset failed");
109 // Rasterization state
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);
118 if (contextSupports(type, ApiType::es(3,0)))
119 gl.disable(GL_RASTERIZER_DISCARD);
121 GLU_EXPECT_NO_ERROR(gl.getError(), "Rasterization state reset failed");
124 // Multisampling state
126 gl.disable (GL_SAMPLE_ALPHA_TO_COVERAGE);
127 gl.disable (GL_SAMPLE_COVERAGE);
128 gl.sampleCoverage (1.0f, GL_FALSE);
130 if (contextSupports(type, ApiType::es(3,1)))
132 int numSampleMaskWords = 0;
133 gl.getIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &numSampleMaskWords);
135 gl.disable(GL_SAMPLE_MASK);
137 for (int ndx = 0; ndx < numSampleMaskWords; ndx++)
138 gl.sampleMaski(ndx, ~0u);
141 GLU_EXPECT_NO_ERROR(gl.getError(), "Multisampling state reset failed");
145 // \todo [2013-04-08 pyry] Reset all levels?
147 const float borderColor[] = { 0.0f, 0.0f, 0.0f, 0.0f };
149 const bool supportsBorderClamp = ctxInfo.isExtensionSupported("GL_EXT_texture_border_clamp") || contextSupports(type, ApiType::es(3,2));
151 gl.getIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &numTexUnits);
153 for (int ndx = 0; ndx < numTexUnits; ndx++)
155 gl.activeTexture(GL_TEXTURE0 + ndx);
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);
165 if (contextSupports(type, ApiType::es(3,0)))
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);
179 if (contextSupports(type, ApiType::es(3,1)))
180 gl.texParameteri(GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_DEPTH_COMPONENT);
182 if (supportsBorderClamp)
183 gl.texParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
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);
198 if (contextSupports(type, ApiType::es(3,0)))
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);
212 if (contextSupports(type, ApiType::es(3,1)))
213 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_DEPTH_COMPONENT);
215 if (supportsBorderClamp)
216 gl.texParameterfv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
218 if (contextSupports(type, ApiType::es(3,0)))
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);
238 if (supportsBorderClamp)
239 gl.texParameterfv(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
242 if (contextSupports(type, ApiType::es(3,1)))
243 gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_DEPTH_COMPONENT);
245 if (contextSupports(type, ApiType::es(3,0)))
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);
266 if (supportsBorderClamp)
267 gl.texParameterfv(GL_TEXTURE_3D, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
270 if (contextSupports(type, ApiType::es(3,1)))
271 gl.texParameteri(GL_TEXTURE_3D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_DEPTH_COMPONENT);
273 if (contextSupports(type, ApiType::es(3,1)))
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);
285 if (ctxInfo.isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
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);
296 if (ctxInfo.isExtensionSupported("GL_EXT_texture_cube_map_array"))
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);
315 if (supportsBorderClamp)
316 gl.texParameterfv(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
320 gl.activeTexture(GL_TEXTURE0);
322 if (contextSupports(type, ApiType::es(3,0)))
324 for (int ndx = 0; ndx < numTexUnits; ndx++)
325 gl.bindSampler(ndx, 0);
328 GLU_EXPECT_NO_ERROR(gl.getError(), "Texture state reset failed");
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"))
336 int numDrawBuffers = 0;
338 gl.getIntegerv(GL_MAX_DRAW_BUFFERS, &numDrawBuffers);
340 for (int drawBufferNdx = 0; drawBufferNdx < numDrawBuffers; drawBufferNdx++)
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);
348 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to reset indexed draw buffer state");
353 const tcu::RenderTarget& renderTarget = renderCtx.getRenderTarget();
355 gl.disable (GL_SCISSOR_TEST);
356 gl.scissor (0, 0, renderTarget.getWidth(), renderTarget.getHeight());
358 gl.disable (GL_STENCIL_TEST);
359 gl.stencilFunc (GL_ALWAYS, 0, ~0u);
360 gl.stencilOp (GL_KEEP, GL_KEEP, GL_KEEP);
362 gl.disable (GL_DEPTH_TEST);
363 gl.depthFunc (GL_LESS);
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);
370 gl.enable (GL_DITHER);
372 if (ctxInfo.isExtensionSupported("GL_EXT_sRGB_write_control"))
374 gl.enable (GL_FRAMEBUFFER_SRGB);
377 GLU_EXPECT_NO_ERROR(gl.getError(), "Pixel operation state reset failed");
380 // Framebuffer control.
382 gl.colorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
383 gl.depthMask (GL_TRUE);
384 gl.stencilMask (~0u);
386 gl.clearColor (0.0f, 0.0f, 0.0f, 0.0f);
387 gl.clearDepthf (1.0f);
390 GLU_EXPECT_NO_ERROR(gl.getError(), "Framebuffer control state reset failed");
393 // Framebuffer state.
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;
400 gl.bindFramebuffer(GL_FRAMEBUFFER, defaultFbo);
402 if (contextSupports(type, ApiType::es(3,0)))
404 gl.drawBuffers (1, &drawBuffer);
405 gl.readBuffer (readBuffer);
408 GLU_EXPECT_NO_ERROR(gl.getError(), "Framebuffer state reset failed");
411 // Renderbuffer state.
413 gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
414 GLU_EXPECT_NO_ERROR(gl.getError(), "Renderbuffer state reset failed");
417 // Pixel transfer state.
419 gl.pixelStorei(GL_UNPACK_ALIGNMENT, 4);
420 gl.pixelStorei(GL_PACK_ALIGNMENT, 4);
422 if (contextSupports(type, ApiType::es(3,0)))
424 gl.pixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0);
425 gl.pixelStorei(GL_UNPACK_SKIP_IMAGES, 0);
426 gl.pixelStorei(GL_UNPACK_ROW_LENGTH, 0);
427 gl.pixelStorei(GL_UNPACK_SKIP_ROWS, 0);
428 gl.pixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
430 gl.pixelStorei(GL_PACK_ROW_LENGTH, 0);
431 gl.pixelStorei(GL_PACK_SKIP_ROWS, 0);
432 gl.pixelStorei(GL_PACK_SKIP_PIXELS, 0);
434 gl.bindBuffer(GL_PIXEL_PACK_BUFFER, 0);
435 gl.bindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
438 GLU_EXPECT_NO_ERROR(gl.getError(), "Pixel transfer state reset failed");
441 // Program object state.
445 if (contextSupports(type, ApiType::es(3,0)))
447 int maxUniformBufferBindings = 0;
448 gl.getIntegerv (GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
449 gl.bindBuffer (GL_UNIFORM_BUFFER, 0);
451 for (int ndx = 0; ndx < maxUniformBufferBindings; ndx++)
452 gl.bindBufferBase(GL_UNIFORM_BUFFER, ndx, 0);
455 if (contextSupports(type, ApiType::es(3,1)))
457 gl.bindProgramPipeline(0);
460 int maxAtomicCounterBufferBindings = 0;
461 gl.getIntegerv (GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, &maxAtomicCounterBufferBindings);
462 gl.bindBuffer (GL_ATOMIC_COUNTER_BUFFER, 0);
464 for (int ndx = 0; ndx < maxAtomicCounterBufferBindings; ndx++)
465 gl.bindBufferBase(GL_ATOMIC_COUNTER_BUFFER, ndx, 0);
469 int maxShaderStorageBufferBindings = 0;
470 gl.getIntegerv (GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, &maxShaderStorageBufferBindings);
471 gl.bindBuffer (GL_SHADER_STORAGE_BUFFER, 0);
473 for (int ndx = 0; ndx < maxShaderStorageBufferBindings; ndx++)
474 gl.bindBufferBase(GL_SHADER_STORAGE_BUFFER, ndx, 0);
478 GLU_EXPECT_NO_ERROR(gl.getError(), "Program object state reset failed");
481 // Vertex shader state.
483 int numVertexAttribArrays = 0;
484 gl.getIntegerv(GL_MAX_VERTEX_ATTRIBS, &numVertexAttribArrays);
486 for (int ndx = 0; ndx < numVertexAttribArrays; ndx++)
487 gl.vertexAttrib4f(ndx, 0.0f, 0.0f, 0.0f, 1.0f);
489 GLU_EXPECT_NO_ERROR(gl.getError(), "Vertex shader state reset failed");
492 // Transform feedback state.
493 if (contextSupports(type, ApiType::es(3,0)))
495 int numTransformFeedbackSeparateAttribs = 0;
496 glw::GLboolean transformFeedbackActive = 0;
497 gl.getIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &numTransformFeedbackSeparateAttribs);
498 gl.getBooleanv(GL_TRANSFORM_FEEDBACK_ACTIVE, &transformFeedbackActive);
500 if (transformFeedbackActive)
501 gl.endTransformFeedback();
503 gl.bindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0);
505 for (int ndx = 0; ndx < numTransformFeedbackSeparateAttribs; ndx++)
506 gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, ndx, 0);
508 GLU_EXPECT_NO_ERROR(gl.getError(), "Transform feedback state reset failed");
511 // Asynchronous query state.
512 if (contextSupports(type, ApiType::es(3,0)))
514 static const deUint32 targets[] = { GL_ANY_SAMPLES_PASSED, GL_ANY_SAMPLES_PASSED_CONSERVATIVE, GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN };
516 for (int i = 0; i < DE_LENGTH_OF_ARRAY(targets); i++)
519 gl.getQueryiv(targets[i], GL_CURRENT_QUERY, &queryActive);
521 if (queryActive != 0)
522 gl.endQuery(targets[i]);
525 GLU_EXPECT_NO_ERROR(gl.getError(), "Asynchronous query state reset failed");
530 gl.hint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);
532 if (contextSupports(type, ApiType::es(3,0)))
533 gl.hint(GL_FRAGMENT_SHADER_DERIVATIVE_HINT, GL_DONT_CARE);
535 GLU_EXPECT_NO_ERROR(gl.getError(), "Hints reset failed");
539 if (contextSupports(type, ApiType::es(3,1)))
541 gl.bindBuffer(GL_DISPATCH_INDIRECT_BUFFER, 0);
542 GLU_EXPECT_NO_ERROR(gl.getError(), "Compute dispatch state reset failed");
545 // Buffer copy state.
546 if (contextSupports(type, ApiType::es(3,0)))
548 gl.bindBuffer(GL_COPY_READ_BUFFER, 0);
549 gl.bindBuffer(GL_COPY_WRITE_BUFFER, 0);
551 GLU_EXPECT_NO_ERROR(gl.getError(), "Buffer copy state reset failed");
555 if (contextSupports(type, ApiType::es(3,1)))
557 int numImageUnits = 0;
558 gl.getIntegerv(GL_MAX_IMAGE_UNITS, &numImageUnits);
560 for (int ndx = 0; ndx < numImageUnits; ndx++)
561 gl.bindImageTexture(ndx, 0, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R32UI);
563 GLU_EXPECT_NO_ERROR(gl.getError(), "Image state reset failed");
566 // Sample shading state.
567 if (contextSupports(type, ApiType::es(3,1)) && ctxInfo.isExtensionSupported("GL_OES_sample_shading"))
569 gl.minSampleShading(0.0f);
570 gl.disable(GL_SAMPLE_SHADING);
572 GLU_EXPECT_NO_ERROR(gl.getError(), "Sample shading state reset failed");
576 if (ctxInfo.isExtensionSupported("GL_KHR_debug"))
578 const bool entrypointsPresent = gl.debugMessageControl != DE_NULL &&
579 gl.debugMessageCallback != DE_NULL &&
580 gl.popDebugGroup != DE_NULL;
582 // some drivers advertise GL_KHR_debug but give out null pointers. Silently ignore.
583 if (entrypointsPresent)
586 gl.getIntegerv(GL_DEBUG_GROUP_STACK_DEPTH, &stackDepth);
587 for (int ndx = 1; ndx < stackDepth; ++ndx)
590 gl.debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, DE_NULL, true);
591 gl.debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, DE_NULL, false);
592 gl.debugMessageCallback(DE_NULL, DE_NULL);
594 if (type.getFlags() & glu::CONTEXT_DEBUG)
595 gl.enable(GL_DEBUG_OUTPUT);
597 gl.disable(GL_DEBUG_OUTPUT);
598 gl.disable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
600 GLU_EXPECT_NO_ERROR(gl.getError(), "Debug state reset failed");
604 // Primitive bounding box state.
605 if (ctxInfo.isExtensionSupported("GL_EXT_primitive_bounding_box"))
607 gl.primitiveBoundingBox(-1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
608 GLU_EXPECT_NO_ERROR(gl.getError(), "Primitive bounding box state reset failed");
611 // Tessellation state
612 if (ctxInfo.isExtensionSupported("GL_EXT_tessellation_shader"))
614 gl.patchParameteri(GL_PATCH_VERTICES, 3);
615 GLU_EXPECT_NO_ERROR(gl.getError(), "Tessellation patch vertices state reset failed");
618 // Advanced coherent blending
619 if (ctxInfo.isExtensionSupported("GL_KHR_blend_equation_advanced_coherent"))
621 gl.enable(GL_BLEND_ADVANCED_COHERENT_KHR);
622 GLU_EXPECT_NO_ERROR(gl.getError(), "Blend equation advanced coherent state reset failed");
626 if (ctxInfo.isExtensionSupported("GL_EXT_texture_buffer"))
628 gl.bindTexture(GL_TEXTURE_BUFFER, 0);
629 gl.bindBuffer(GL_TEXTURE_BUFFER, 0);
630 GLU_EXPECT_NO_ERROR(gl.getError(), "Texture buffer state reset failed");
634 void resetStateGLCore (const RenderContext& renderCtx, const ContextInfo& ctxInfo)
636 const glw::Functions& gl = renderCtx.getFunctions();
637 const ContextType type = renderCtx.getType();
642 // Vertex attrib array state.
644 gl.bindVertexArray (0);
645 gl.bindBuffer (GL_ARRAY_BUFFER, 0);
646 gl.bindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
648 if (contextSupports(type, ApiType::core(3,1)))
650 gl.disable (GL_PRIMITIVE_RESTART);
651 gl.primitiveRestartIndex(0);
654 GLU_EXPECT_NO_ERROR(gl.getError(), "Vertex attrib array state reset failed");
657 // Transformation state.
659 const tcu::RenderTarget& renderTarget = renderCtx.getRenderTarget();
660 int numUserClipPlanes = 0;
662 gl.getIntegerv(GL_MAX_CLIP_DISTANCES, &numUserClipPlanes);
664 gl.viewport (0, 0, renderTarget.getWidth(), renderTarget.getHeight());
665 gl.depthRange (0.0, 1.0);
667 for (int ndx = 0; ndx < numUserClipPlanes; ndx++)
668 gl.disable(GL_CLIP_DISTANCE0+ndx);
670 if (contextSupports(type, ApiType::core(3,2)))
671 gl.disable(GL_DEPTH_CLAMP);
673 //gl.bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
675 GLU_EXPECT_NO_ERROR(gl.getError(), "Transformation state reset failed");
680 gl.clampColor(GL_CLAMP_READ_COLOR, GL_FIXED_ONLY);
682 if (contextSupports(type, ApiType::core(3,2)))
683 gl.provokingVertex(GL_LAST_VERTEX_CONVENTION);
685 GLU_EXPECT_NO_ERROR(gl.getError(), "Coloring state reset failed");
688 // Rasterization state
690 gl.disable (GL_RASTERIZER_DISCARD);
692 gl.pointParameterf (GL_POINT_FADE_THRESHOLD_SIZE, 1.0f);
693 gl.pointParameteri (GL_POINT_SPRITE_COORD_ORIGIN, GL_UPPER_LEFT);
695 gl.disable (GL_LINE_SMOOTH);
696 gl.disable (GL_CULL_FACE);
697 gl.cullFace (GL_BACK);
698 gl.frontFace (GL_CCW);
699 gl.disable (GL_POLYGON_SMOOTH);
700 gl.polygonOffset (0.0f, 0.0f);
701 gl.disable (GL_POLYGON_OFFSET_POINT);
702 gl.disable (GL_POLYGON_OFFSET_LINE);
703 gl.disable (GL_POLYGON_OFFSET_FILL);
705 GLU_EXPECT_NO_ERROR(gl.getError(), "Rasterization state reset failed");
708 // Multisampling state
710 gl.enable (GL_MULTISAMPLE);
711 gl.disable (GL_SAMPLE_ALPHA_TO_COVERAGE);
712 gl.disable (GL_SAMPLE_ALPHA_TO_ONE);
713 gl.disable (GL_SAMPLE_COVERAGE);
714 gl.sampleCoverage (1.0f, GL_FALSE);
716 if (contextSupports(type, ApiType::core(3,2)))
718 int numSampleMaskWords = 0;
719 gl.getIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &numSampleMaskWords);
721 gl.disable(GL_SAMPLE_MASK);
723 for (int ndx = 0; ndx < numSampleMaskWords; ndx++)
724 gl.sampleMaski(ndx, ~0u);
727 GLU_EXPECT_NO_ERROR(gl.getError(), "Multisampling state reset failed");
731 // \todo [2013-04-08 pyry] Reset all levels?
733 const float borderColor[] = { 0.0f, 0.0f, 0.0f, 0.0f };
735 gl.getIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &numTexUnits);
737 gl.bindBuffer(GL_TEXTURE_BUFFER, 0);
739 for (int ndx = 0; ndx < numTexUnits; ndx++)
741 gl.activeTexture(GL_TEXTURE0 + ndx);
744 gl.bindTexture (GL_TEXTURE_1D, 0);
745 gl.texImage1D (GL_TEXTURE_1D, 0, GL_RGBA, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
746 gl.texParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
747 gl.texParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
748 gl.texParameterfv (GL_TEXTURE_1D, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
749 gl.texParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
750 gl.texParameterf (GL_TEXTURE_1D, GL_TEXTURE_MIN_LOD, -1000.0f);
751 gl.texParameterf (GL_TEXTURE_1D, GL_TEXTURE_MAX_LOD, 1000.0f);
752 gl.texParameteri (GL_TEXTURE_1D, GL_TEXTURE_BASE_LEVEL, 0);
753 gl.texParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAX_LEVEL, 1000);
754 gl.texParameterf (GL_TEXTURE_1D, GL_TEXTURE_LOD_BIAS, 0.0f);
755 gl.texParameteri (GL_TEXTURE_1D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
756 gl.texParameteri (GL_TEXTURE_1D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
758 if (contextSupports(type, ApiType::core(3,3)))
760 gl.texParameteri(GL_TEXTURE_1D, GL_TEXTURE_SWIZZLE_R, GL_RED);
761 gl.texParameteri(GL_TEXTURE_1D, GL_TEXTURE_SWIZZLE_G, GL_GREEN);
762 gl.texParameteri(GL_TEXTURE_1D, GL_TEXTURE_SWIZZLE_B, GL_BLUE);
763 gl.texParameteri(GL_TEXTURE_1D, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
767 gl.bindTexture (GL_TEXTURE_2D, 0);
768 gl.texImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
769 gl.texParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
770 gl.texParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
771 gl.texParameterfv (GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
772 gl.texParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
773 gl.texParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
774 gl.texParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, -1000.0f);
775 gl.texParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, 1000.0f);
776 gl.texParameteri (GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
777 gl.texParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1000);
778 gl.texParameterf (GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, 0.0f);
779 gl.texParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
780 gl.texParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
782 if (contextSupports(type, ApiType::core(3,3)))
784 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
785 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_GREEN);
786 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_BLUE);
787 gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
790 // Reset cube map texture.
791 gl.bindTexture (GL_TEXTURE_CUBE_MAP, 0);
792 gl.texImage2D (GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
793 gl.texImage2D (GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
794 gl.texImage2D (GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
795 gl.texImage2D (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
796 gl.texImage2D (GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
797 gl.texImage2D (GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
798 gl.texParameteri (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
799 gl.texParameteri (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
800 gl.texParameterfv (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
801 gl.texParameteri (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT);
802 gl.texParameteri (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_REPEAT);
803 gl.texParameterf (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_LOD, -1000.0f);
804 gl.texParameterf (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LOD, 1000.0f);
805 gl.texParameteri (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, 0);
806 gl.texParameteri (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL, 1000);
807 gl.texParameterf (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_LOD_BIAS, 0.0f);
808 gl.texParameteri (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_MODE, GL_NONE);
809 gl.texParameteri (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
811 if (contextSupports(type, ApiType::core(3,3)))
813 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_R, GL_RED);
814 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_G, GL_GREEN);
815 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_B, GL_BLUE);
816 gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
819 // Reset 1D array texture.
820 gl.bindTexture (GL_TEXTURE_1D_ARRAY, 0);
821 gl.texImage2D (GL_TEXTURE_1D_ARRAY, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
822 gl.texParameteri (GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
823 gl.texParameteri (GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
824 gl.texParameterfv (GL_TEXTURE_1D_ARRAY, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
825 gl.texParameteri (GL_TEXTURE_1D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT);
826 gl.texParameterf (GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_LOD, -1000.0f);
827 gl.texParameterf (GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAX_LOD, 1000.0f);
828 gl.texParameteri (GL_TEXTURE_1D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
829 gl.texParameteri (GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1000);
830 gl.texParameterf (GL_TEXTURE_1D_ARRAY, GL_TEXTURE_LOD_BIAS, 0.0f);
831 gl.texParameteri (GL_TEXTURE_1D_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_NONE);
832 gl.texParameteri (GL_TEXTURE_1D_ARRAY, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
834 if (contextSupports(type, ApiType::core(3,3)))
836 gl.texParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_SWIZZLE_R, GL_RED);
837 gl.texParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_SWIZZLE_G, GL_GREEN);
838 gl.texParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_SWIZZLE_B, GL_BLUE);
839 gl.texParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
842 // Reset 2D array texture.
843 gl.bindTexture (GL_TEXTURE_2D_ARRAY, 0);
844 gl.texImage3D (GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
845 gl.texParameteri (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
846 gl.texParameteri (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
847 gl.texParameterfv (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
848 gl.texParameteri (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT);
849 gl.texParameteri (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT);
850 gl.texParameterf (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_LOD, -1000.0f);
851 gl.texParameterf (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LOD, 1000.0f);
852 gl.texParameteri (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
853 gl.texParameteri (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1000);
854 gl.texParameterf (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_LOD_BIAS, 0.0f);
855 gl.texParameteri (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_NONE);
856 gl.texParameteri (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
858 if (contextSupports(type, ApiType::core(3,3)))
860 gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_SWIZZLE_R, GL_RED);
861 gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_SWIZZLE_G, GL_GREEN);
862 gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_SWIZZLE_B, GL_BLUE);
863 gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
867 gl.bindTexture (GL_TEXTURE_3D, 0);
868 gl.texImage3D (GL_TEXTURE_3D, 0, GL_RGBA, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
869 gl.texParameteri (GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
870 gl.texParameteri (GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
871 gl.texParameterfv (GL_TEXTURE_3D, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
872 gl.texParameteri (GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);
873 gl.texParameteri (GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
874 gl.texParameteri (GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT);
875 gl.texParameterf (GL_TEXTURE_3D, GL_TEXTURE_MIN_LOD, -1000.0f);
876 gl.texParameterf (GL_TEXTURE_3D, GL_TEXTURE_MAX_LOD, 1000.0f);
877 gl.texParameteri (GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
878 gl.texParameteri (GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1000);
879 gl.texParameterf (GL_TEXTURE_3D, GL_TEXTURE_LOD_BIAS, 0.0f);
880 gl.texParameteri (GL_TEXTURE_3D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
881 gl.texParameteri (GL_TEXTURE_3D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
883 if (contextSupports(type, ApiType::core(3,3)))
885 gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED);
886 gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, GL_GREEN);
887 gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, GL_BLUE);
888 gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
891 if (contextSupports(type, ApiType::core(3,1)))
893 // Reset rectangle texture.
894 gl.bindTexture (GL_TEXTURE_RECTANGLE, 0);
895 gl.texImage2D (GL_TEXTURE_RECTANGLE, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
896 gl.texParameteri (GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
897 gl.texParameteri (GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
898 gl.texParameterfv (GL_TEXTURE_RECTANGLE, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
899 gl.texParameteri (GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
900 gl.texParameteri (GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
901 gl.texParameteri (GL_TEXTURE_RECTANGLE, GL_TEXTURE_BASE_LEVEL, 0);
902 gl.texParameteri (GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAX_LEVEL, 1000);
903 gl.texParameteri (GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_MODE, GL_NONE);
904 gl.texParameteri (GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
905 // \todo [2013-06-17 pyry] Drivers don't accept GL_MIN_LOD, GL_MAX_LOD for rectangle textures. Is that okay?
907 if (contextSupports(type, ApiType::core(3,3)))
909 gl.texParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_SWIZZLE_R, GL_RED);
910 gl.texParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_SWIZZLE_G, GL_GREEN);
911 gl.texParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_SWIZZLE_B, GL_BLUE);
912 gl.texParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
915 // Reset buffer texture.
916 gl.bindTexture (GL_TEXTURE_BUFFER, 0);
917 gl.texBuffer (GL_TEXTURE_BUFFER, GL_R8, 0);
918 // \todo [2013-05-04 pyry] Which parameters apply to buffer textures?
921 if (contextSupports(type, ApiType::core(3,2)))
923 // Reset 2D multisample texture.
924 gl.bindTexture (GL_TEXTURE_2D_MULTISAMPLE, 0);
925 gl.texImage2DMultisample (GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, 0, 0, GL_TRUE);
927 // Reset 2D multisample array texture.
928 gl.bindTexture (GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 0);
929 gl.texImage3DMultisample (GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 1, GL_RGBA8, 0, 0, 0, GL_TRUE);
933 gl.activeTexture(GL_TEXTURE0);
935 if (contextSupports(type, ApiType::core(3,3)))
937 for (int ndx = 0; ndx < numTexUnits; ndx++)
938 gl.bindSampler(ndx, 0);
940 gl.disable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
943 GLU_EXPECT_NO_ERROR(gl.getError(), "Texture state reset failed");
948 const tcu::RenderTarget& renderTarget = renderCtx.getRenderTarget();
950 gl.disable (GL_SCISSOR_TEST);
951 gl.scissor (0, 0, renderTarget.getWidth(), renderTarget.getHeight());
953 gl.disable (GL_STENCIL_TEST);
954 gl.stencilFunc (GL_ALWAYS, 0, ~0u);
955 gl.stencilOp (GL_KEEP, GL_KEEP, GL_KEEP);
957 gl.disable (GL_DEPTH_TEST);
958 gl.depthFunc (GL_LESS);
960 gl.disable (GL_BLEND);
961 gl.blendFunc (GL_ONE, GL_ZERO);
962 gl.blendEquation(GL_FUNC_ADD);
963 gl.blendColor (0.0f, 0.0f, 0.0f, 0.0f);
965 gl.disable (GL_FRAMEBUFFER_SRGB);
966 gl.enable (GL_DITHER);
968 gl.disable (GL_COLOR_LOGIC_OP);
969 gl.logicOp (GL_COPY);
971 GLU_EXPECT_NO_ERROR(gl.getError(), "Pixel operation state reset failed");
974 // Framebuffer control.
976 gl.colorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
977 gl.depthMask (GL_TRUE);
978 gl.stencilMask (~0u);
980 gl.clearColor (0.0f, 0.0f, 0.0f, 0.0f);
984 GLU_EXPECT_NO_ERROR(gl.getError(), "Framebuffer control state reset failed");
987 // Framebuffer state.
989 // \todo [2013-04-05 pyry] Single-buffered rendering: use GL_FRONT
990 deUint32 framebuffer = renderCtx.getDefaultFramebuffer();
991 deUint32 drawReadBuffer = framebuffer == 0 ? GL_BACK : GL_COLOR_ATTACHMENT0;
993 gl.bindFramebuffer (GL_FRAMEBUFFER, renderCtx.getDefaultFramebuffer());
994 gl.drawBuffer (drawReadBuffer);
995 gl.readBuffer (drawReadBuffer);
997 GLU_EXPECT_NO_ERROR(gl.getError(), "Framebuffer state reset failed");
1000 // Renderbuffer state.
1002 gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
1003 GLU_EXPECT_NO_ERROR(gl.getError(), "Renderbuffer state reset failed");
1006 // Pixel transfer state.
1008 gl.pixelStorei (GL_UNPACK_SWAP_BYTES, GL_FALSE);
1009 gl.pixelStorei (GL_UNPACK_LSB_FIRST, GL_FALSE);
1010 gl.pixelStorei (GL_UNPACK_IMAGE_HEIGHT, 0);
1011 gl.pixelStorei (GL_UNPACK_SKIP_IMAGES, 0);
1012 gl.pixelStorei (GL_UNPACK_ROW_LENGTH, 0);
1013 gl.pixelStorei (GL_UNPACK_SKIP_ROWS, 0);
1014 gl.pixelStorei (GL_UNPACK_SKIP_PIXELS, 0);
1015 gl.pixelStorei (GL_UNPACK_ALIGNMENT, 4);
1017 gl.pixelStorei (GL_PACK_SWAP_BYTES, GL_FALSE);
1018 gl.pixelStorei (GL_PACK_LSB_FIRST, GL_FALSE);
1019 gl.pixelStorei (GL_PACK_IMAGE_HEIGHT, 0);
1020 gl.pixelStorei (GL_PACK_SKIP_IMAGES, 0);
1021 gl.pixelStorei (GL_PACK_ROW_LENGTH, 0);
1022 gl.pixelStorei (GL_PACK_SKIP_ROWS, 0);
1023 gl.pixelStorei (GL_PACK_SKIP_PIXELS, 0);
1024 gl.pixelStorei (GL_PACK_ALIGNMENT, 4);
1026 gl.bindBuffer (GL_PIXEL_PACK_BUFFER, 0);
1027 gl.bindBuffer (GL_PIXEL_UNPACK_BUFFER, 0);
1029 GLU_EXPECT_NO_ERROR(gl.getError(), "Pixel transfer state reset failed");
1032 // Program object state.
1036 if (contextSupports(type, ApiType::core(3,1)))
1038 int maxUniformBufferBindings = 0;
1039 gl.getIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
1041 gl.bindBuffer(GL_UNIFORM_BUFFER, 0);
1043 for (int ndx = 0; ndx < maxUniformBufferBindings; ndx++)
1044 gl.bindBufferBase(GL_UNIFORM_BUFFER, ndx, 0);
1047 GLU_EXPECT_NO_ERROR(gl.getError(), "Program object state reset failed");
1050 // Vertex shader state.
1052 int numVertexAttribArrays = 0;
1053 gl.getIntegerv(GL_MAX_VERTEX_ATTRIBS, &numVertexAttribArrays);
1055 for (int ndx = 0; ndx < numVertexAttribArrays; ndx++)
1056 gl.vertexAttrib4f(ndx, 0.0f, 0.0f, 0.0f, 1.0f);
1058 gl.disable(GL_VERTEX_PROGRAM_POINT_SIZE);
1060 GLU_EXPECT_NO_ERROR(gl.getError(), "Vertex shader state reset failed");
1063 // Transform feedback state.
1065 int numTransformFeedbackSeparateAttribs = 0;
1066 gl.getIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &numTransformFeedbackSeparateAttribs);
1068 if (contextSupports(type, ApiType::core(4,0)))
1070 glw::GLboolean transformFeedbackActive = 0;
1071 gl.getBooleanv(GL_TRANSFORM_FEEDBACK_ACTIVE, &transformFeedbackActive);
1073 if (transformFeedbackActive)
1074 gl.endTransformFeedback();
1077 gl.bindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0);
1079 for (int ndx = 0; ndx < numTransformFeedbackSeparateAttribs; ndx++)
1080 gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, ndx, 0);
1082 GLU_EXPECT_NO_ERROR(gl.getError(), "Transform feedback state reset failed");
1085 // Asynchronous query state.
1087 deUint32 queryTargets[8];
1090 queryTargets[numTargets++] = GL_PRIMITIVES_GENERATED;
1091 queryTargets[numTargets++] = GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN;
1092 queryTargets[numTargets++] = GL_SAMPLES_PASSED;
1094 DE_ASSERT(numTargets <= DE_LENGTH_OF_ARRAY(queryTargets));
1096 for (int i = 0; i < numTargets; i++)
1098 int queryActive = 0;
1099 gl.getQueryiv(queryTargets[i], GL_CURRENT_QUERY, &queryActive);
1101 if (queryActive != 0)
1102 gl.endQuery(queryTargets[i]);
1105 GLU_EXPECT_NO_ERROR(gl.getError(), "Asynchronous query state reset failed");
1110 gl.hint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
1111 gl.hint(GL_POLYGON_SMOOTH_HINT, GL_DONT_CARE);
1112 gl.hint(GL_TEXTURE_COMPRESSION_HINT, GL_DONT_CARE);
1113 gl.hint(GL_FRAGMENT_SHADER_DERIVATIVE_HINT, GL_DONT_CARE);
1115 GLU_EXPECT_NO_ERROR(gl.getError(), "Hints reset failed");
1118 // Buffer copy state.
1119 if (contextSupports(type, ApiType::core(3,1)))
1121 gl.bindBuffer(GL_COPY_READ_BUFFER, 0);
1122 gl.bindBuffer(GL_COPY_WRITE_BUFFER, 0);
1124 GLU_EXPECT_NO_ERROR(gl.getError(), "Buffer copy state reset failed");
1128 if (ctxInfo.isExtensionSupported("GL_KHR_debug"))
1130 const bool entrypointsPresent = gl.debugMessageControl != DE_NULL &&
1131 gl.debugMessageCallback != DE_NULL;
1133 // some drivers advertise GL_KHR_debug but give out null pointers. Silently ignore.
1134 if (entrypointsPresent)
1136 gl.debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, DE_NULL, true);
1137 gl.debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, DE_NULL, false);
1138 gl.debugMessageCallback(DE_NULL, DE_NULL);
1140 if (type.getFlags() & glu::CONTEXT_DEBUG)
1141 gl.enable(GL_DEBUG_OUTPUT);
1143 gl.disable(GL_DEBUG_OUTPUT);
1148 void resetState (const RenderContext& renderCtx, const ContextInfo& ctxInfo)
1150 if (isContextTypeES(renderCtx.getType()))
1151 resetStateES(renderCtx, ctxInfo);
1152 else if (isContextTypeGLCore(renderCtx.getType()))
1153 resetStateGLCore(renderCtx, ctxInfo);
1155 throw tcu::InternalError("State reset requested for unsupported context type");