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