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