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