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