1 //
2 // Copyright 2018 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 // TextureEnvTest.cpp: Tests basic usage of texture environments.
8
9 #include "test_utils/ANGLETest.h"
10 #include "test_utils/gl_raii.h"
11
12 #include "util/random_utils.h"
13
14 #include <stdint.h>
15
16 using namespace angle;
17
18 class TextureEnvTest : public ANGLETest<>
19 {
20 protected:
TextureEnvTest()21 TextureEnvTest()
22 {
23 setWindowWidth(32);
24 setWindowHeight(32);
25 setConfigRedBits(8);
26 setConfigGreenBits(8);
27 setConfigBlueBits(8);
28 setConfigAlphaBits(8);
29 setConfigDepthBits(24);
30 }
31
verifyEnvironment(GLenum mode,GLenum combineRgb,GLenum combineAlpha,GLenum src0Rgb,GLenum src0Alpha,GLenum src1Rgb,GLenum src1Alpha,GLenum src2Rgb,GLenum src2Alpha,GLenum op0Rgb,GLenum op0Alpha,GLenum op1Rgb,GLenum op1Alpha,GLenum op2Rgb,GLenum op2Alpha,const GLColor32F & envColor,GLfloat rgbScale,GLfloat alphaScale)32 void verifyEnvironment(GLenum mode,
33 GLenum combineRgb,
34 GLenum combineAlpha,
35 GLenum src0Rgb,
36 GLenum src0Alpha,
37 GLenum src1Rgb,
38 GLenum src1Alpha,
39 GLenum src2Rgb,
40 GLenum src2Alpha,
41 GLenum op0Rgb,
42 GLenum op0Alpha,
43 GLenum op1Rgb,
44 GLenum op1Alpha,
45 GLenum op2Rgb,
46 GLenum op2Alpha,
47 const GLColor32F &envColor,
48 GLfloat rgbScale,
49 GLfloat alphaScale)
50 {
51
52 GLfloat actualParams[4] = {};
53
54 glGetTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, actualParams);
55 EXPECT_GL_NO_ERROR();
56 EXPECT_GLENUM_EQ(mode, actualParams[0]);
57
58 glGetTexEnvfv(GL_TEXTURE_ENV, GL_COMBINE_RGB, actualParams);
59 EXPECT_GL_NO_ERROR();
60 EXPECT_GLENUM_EQ(combineRgb, actualParams[0]);
61
62 glGetTexEnvfv(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, actualParams);
63 EXPECT_GL_NO_ERROR();
64 EXPECT_GLENUM_EQ(combineAlpha, actualParams[0]);
65
66 glGetTexEnvfv(GL_TEXTURE_ENV, GL_SRC0_RGB, actualParams);
67 EXPECT_GL_NO_ERROR();
68 EXPECT_GLENUM_EQ(src0Rgb, actualParams[0]);
69
70 glGetTexEnvfv(GL_TEXTURE_ENV, GL_SRC0_ALPHA, actualParams);
71 EXPECT_GL_NO_ERROR();
72 EXPECT_GLENUM_EQ(src0Alpha, actualParams[0]);
73
74 glGetTexEnvfv(GL_TEXTURE_ENV, GL_SRC1_RGB, actualParams);
75 EXPECT_GL_NO_ERROR();
76 EXPECT_GLENUM_EQ(src1Rgb, actualParams[0]);
77
78 glGetTexEnvfv(GL_TEXTURE_ENV, GL_SRC1_ALPHA, actualParams);
79 EXPECT_GL_NO_ERROR();
80 EXPECT_GLENUM_EQ(src1Alpha, actualParams[0]);
81
82 glGetTexEnvfv(GL_TEXTURE_ENV, GL_SRC2_RGB, actualParams);
83 EXPECT_GL_NO_ERROR();
84 EXPECT_GLENUM_EQ(src2Rgb, actualParams[0]);
85
86 glGetTexEnvfv(GL_TEXTURE_ENV, GL_SRC2_ALPHA, actualParams);
87 EXPECT_GL_NO_ERROR();
88 EXPECT_GLENUM_EQ(src2Alpha, actualParams[0]);
89
90 glGetTexEnvfv(GL_TEXTURE_ENV, GL_OPERAND0_RGB, actualParams);
91 EXPECT_GL_NO_ERROR();
92 EXPECT_GLENUM_EQ(op0Rgb, actualParams[0]);
93
94 glGetTexEnvfv(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, actualParams);
95 EXPECT_GL_NO_ERROR();
96 EXPECT_GLENUM_EQ(op0Alpha, actualParams[0]);
97
98 glGetTexEnvfv(GL_TEXTURE_ENV, GL_OPERAND1_RGB, actualParams);
99 EXPECT_GL_NO_ERROR();
100 EXPECT_GLENUM_EQ(op1Rgb, actualParams[0]);
101
102 glGetTexEnvfv(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, actualParams);
103 EXPECT_GL_NO_ERROR();
104 EXPECT_GLENUM_EQ(op1Alpha, actualParams[0]);
105
106 glGetTexEnvfv(GL_TEXTURE_ENV, GL_OPERAND2_RGB, actualParams);
107 EXPECT_GL_NO_ERROR();
108 EXPECT_GLENUM_EQ(op2Rgb, actualParams[0]);
109
110 glGetTexEnvfv(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, actualParams);
111 EXPECT_GL_NO_ERROR();
112 EXPECT_GLENUM_EQ(op2Alpha, actualParams[0]);
113
114 glGetTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, actualParams);
115 EXPECT_GL_NO_ERROR();
116 EXPECT_EQ(envColor.R, actualParams[0]);
117 EXPECT_EQ(envColor.G, actualParams[1]);
118 EXPECT_EQ(envColor.B, actualParams[2]);
119 EXPECT_EQ(envColor.A, actualParams[3]);
120
121 glGetTexEnvfv(GL_TEXTURE_ENV, GL_RGB_SCALE, actualParams);
122 EXPECT_GL_NO_ERROR();
123 EXPECT_EQ(rgbScale, actualParams[0]);
124
125 glGetTexEnvfv(GL_TEXTURE_ENV, GL_ALPHA_SCALE, actualParams);
126 EXPECT_GL_NO_ERROR();
127 EXPECT_EQ(alphaScale, actualParams[0]);
128 }
129 };
130
131 // Initial state check.
TEST_P(TextureEnvTest,InitialState)132 TEST_P(TextureEnvTest, InitialState)
133 {
134 GLint numUnits;
135 glGetIntegerv(GL_MAX_TEXTURE_UNITS, &numUnits);
136 EXPECT_GL_NO_ERROR();
137
138 for (int i = 0; i < numUnits; i++)
139 {
140 glActiveTexture(GL_TEXTURE0 + i);
141 EXPECT_GL_NO_ERROR();
142
143 verifyEnvironment(GL_MODULATE, // envMode
144 GL_MODULATE, // combineRgb
145 GL_MODULATE, // combineAlpha
146 GL_TEXTURE, // src0Rgb
147 GL_TEXTURE, // src0Alpha
148 GL_PREVIOUS, // src1Rgb
149 GL_PREVIOUS, // src1Alpha
150 GL_CONSTANT, // src2Rgb
151 GL_CONSTANT, // src2Alpha
152 GL_SRC_COLOR, // op0Rgb
153 GL_SRC_ALPHA, // op0Alpha
154 GL_SRC_COLOR, // op1Rgb
155 GL_SRC_ALPHA, // op1Alpha
156 GL_SRC_ALPHA, // op2Rgb
157 GL_SRC_ALPHA, // op2Alpha
158 GLColor32F(0.0f, 0.0f, 0.0f, 0.0f), // envColor
159 1.0f, // rgbScale
160 1.0f // alphaScale
161 );
162 }
163 }
164
165 // Negative test for parameter names.
TEST_P(TextureEnvTest,NegativeParameter)166 TEST_P(TextureEnvTest, NegativeParameter)
167 {
168 glTexEnvfv(0, GL_ALPHA_SCALE, nullptr);
169 EXPECT_GL_ERROR(GL_INVALID_ENUM);
170 glTexEnvfv(GL_ALPHA_SCALE, GL_ALPHA_SCALE, nullptr);
171 EXPECT_GL_ERROR(GL_INVALID_ENUM);
172 glTexEnvfv(GL_TEXTURE_ENV, 0, nullptr);
173 EXPECT_GL_ERROR(GL_INVALID_ENUM);
174 }
175
176 // Negative test for parameter values.
TEST_P(TextureEnvTest,NegativeValues)177 TEST_P(TextureEnvTest, NegativeValues)
178 {
179 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, 0.0f);
180 EXPECT_GL_ERROR(GL_INVALID_VALUE);
181
182 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, 0.0f);
183 EXPECT_GL_ERROR(GL_INVALID_VALUE);
184
185 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, 0.0f);
186 EXPECT_GL_ERROR(GL_INVALID_VALUE);
187
188 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, 0.0f);
189 EXPECT_GL_ERROR(GL_INVALID_VALUE);
190 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, 0.0f);
191 EXPECT_GL_ERROR(GL_INVALID_VALUE);
192 glTexEnvf(GL_TEXTURE_ENV, GL_SRC2_RGB, 0.0f);
193 EXPECT_GL_ERROR(GL_INVALID_VALUE);
194 glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_ALPHA, 0.0f);
195 EXPECT_GL_ERROR(GL_INVALID_VALUE);
196 glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_ALPHA, 0.0f);
197 EXPECT_GL_ERROR(GL_INVALID_VALUE);
198 glTexEnvf(GL_TEXTURE_ENV, GL_SRC2_ALPHA, 0.0f);
199 EXPECT_GL_ERROR(GL_INVALID_VALUE);
200
201 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, 0.0f);
202 EXPECT_GL_ERROR(GL_INVALID_VALUE);
203 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB, 0.0f);
204 EXPECT_GL_ERROR(GL_INVALID_VALUE);
205 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, 0.0f);
206 EXPECT_GL_ERROR(GL_INVALID_VALUE);
207 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, 0.0f);
208 EXPECT_GL_ERROR(GL_INVALID_VALUE);
209 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, 0.0f);
210 EXPECT_GL_ERROR(GL_INVALID_VALUE);
211 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, 0.0f);
212 EXPECT_GL_ERROR(GL_INVALID_VALUE);
213
214 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, (GLfloat)GL_DOT3_RGB);
215 EXPECT_GL_ERROR(GL_INVALID_VALUE);
216 glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, (GLfloat)GL_DOT3_RGBA);
217 EXPECT_GL_ERROR(GL_INVALID_VALUE);
218
219 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, (GLfloat)GL_SRC_COLOR);
220 EXPECT_GL_ERROR(GL_INVALID_VALUE);
221 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, (GLfloat)GL_ONE_MINUS_SRC_COLOR);
222 EXPECT_GL_ERROR(GL_INVALID_VALUE);
223 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, (GLfloat)GL_SRC_COLOR);
224 EXPECT_GL_ERROR(GL_INVALID_VALUE);
225 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, (GLfloat)GL_ONE_MINUS_SRC_COLOR);
226 EXPECT_GL_ERROR(GL_INVALID_VALUE);
227 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, (GLfloat)GL_SRC_COLOR);
228 EXPECT_GL_ERROR(GL_INVALID_VALUE);
229 glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, (GLfloat)GL_ONE_MINUS_SRC_COLOR);
230 EXPECT_GL_ERROR(GL_INVALID_VALUE);
231
232 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 0.5f);
233 EXPECT_GL_ERROR(GL_INVALID_VALUE);
234 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 3.0f);
235 EXPECT_GL_ERROR(GL_INVALID_VALUE);
236 glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 0.5f);
237 EXPECT_GL_ERROR(GL_INVALID_VALUE);
238 glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 3.0f);
239 EXPECT_GL_ERROR(GL_INVALID_VALUE);
240 }
241
242 // Checks that texture environment state can be set.
TEST_P(TextureEnvTest,Set)243 TEST_P(TextureEnvTest, Set)
244 {
245 const int kTrials = 1000;
246
247 angle::RNG rng(0);
248
249 GLint numUnits;
250 glGetIntegerv(GL_MAX_TEXTURE_UNITS, &numUnits);
251 EXPECT_GL_NO_ERROR();
252
253 std::vector<GLenum> validUnits(numUnits);
254 for (int i = 0; i < numUnits; i++)
255 {
256 validUnits[i] = GL_TEXTURE0 + i;
257 }
258
259 std::vector<GLenum> validEnvModes = {
260 GL_ADD, GL_BLEND, GL_COMBINE, GL_DECAL, GL_MODULATE, GL_REPLACE,
261 };
262
263 std::vector<GLenum> validCombineRgbs = {
264 GL_MODULATE, GL_REPLACE, GL_ADD, GL_ADD_SIGNED,
265 GL_SUBTRACT, GL_INTERPOLATE, GL_DOT3_RGB, GL_DOT3_RGBA,
266 };
267
268 std::vector<GLenum> validCombineAlphas = {
269 GL_MODULATE, GL_REPLACE, GL_ADD, GL_ADD_SIGNED, GL_SUBTRACT, GL_INTERPOLATE,
270 };
271
272 std::vector<GLenum> validSrcs = {
273 GL_CONSTANT,
274 GL_PREVIOUS,
275 GL_PRIMARY_COLOR,
276 GL_TEXTURE,
277 };
278
279 std::vector<GLenum> validOpRgbs = {
280 GL_SRC_COLOR,
281 GL_ONE_MINUS_SRC_COLOR,
282 GL_SRC_ALPHA,
283 GL_ONE_MINUS_SRC_ALPHA,
284 };
285
286 std::vector<GLenum> validOpAlphas = {
287 GL_SRC_ALPHA,
288 GL_ONE_MINUS_SRC_ALPHA,
289 };
290
291 std::vector<GLfloat> validScales = {
292 1.0f,
293 2.0f,
294 4.0f,
295 };
296
297 for (int i = 0; i < kTrials; i++)
298 {
299 GLenum textureUnit = rng.randomSelect(validUnits);
300 GLenum mode = rng.randomSelect(validEnvModes);
301 GLenum combineRgb = rng.randomSelect(validCombineRgbs);
302 GLenum combineAlpha = rng.randomSelect(validCombineAlphas);
303
304 GLenum src0Rgb = rng.randomSelect(validSrcs);
305 GLenum src0Alpha = rng.randomSelect(validSrcs);
306 GLenum src1Rgb = rng.randomSelect(validSrcs);
307 GLenum src1Alpha = rng.randomSelect(validSrcs);
308 GLenum src2Rgb = rng.randomSelect(validSrcs);
309 GLenum src2Alpha = rng.randomSelect(validSrcs);
310
311 GLenum op0Rgb = rng.randomSelect(validOpRgbs);
312 GLenum op0Alpha = rng.randomSelect(validOpAlphas);
313 GLenum op1Rgb = rng.randomSelect(validOpRgbs);
314 GLenum op1Alpha = rng.randomSelect(validOpAlphas);
315 GLenum op2Rgb = rng.randomSelect(validOpRgbs);
316 GLenum op2Alpha = rng.randomSelect(validOpAlphas);
317
318 GLColor32F envColor(rng.randomFloatBetween(0.0f, 1.0f), rng.randomFloatBetween(0.0f, 1.0f),
319 rng.randomFloatBetween(0.0f, 1.0f), rng.randomFloatBetween(0.0f, 1.0f));
320
321 GLfloat rgbScale = rng.randomSelect(validScales);
322 GLfloat alphaScale = rng.randomSelect(validScales);
323
324 glActiveTexture(textureUnit);
325 EXPECT_GL_NO_ERROR();
326
327 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, mode);
328 EXPECT_GL_NO_ERROR();
329 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, combineRgb);
330 EXPECT_GL_NO_ERROR();
331 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, combineAlpha);
332 EXPECT_GL_NO_ERROR();
333
334 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, src0Rgb);
335 EXPECT_GL_NO_ERROR();
336 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, src0Alpha);
337 EXPECT_GL_NO_ERROR();
338 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, src1Rgb);
339 EXPECT_GL_NO_ERROR();
340 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, src1Alpha);
341 EXPECT_GL_NO_ERROR();
342 glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, src2Rgb);
343 EXPECT_GL_NO_ERROR();
344 glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_ALPHA, src2Alpha);
345 EXPECT_GL_NO_ERROR();
346
347 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, op0Rgb);
348 EXPECT_GL_NO_ERROR();
349 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, op0Alpha);
350 EXPECT_GL_NO_ERROR();
351 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, op1Rgb);
352 EXPECT_GL_NO_ERROR();
353 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, op1Alpha);
354 EXPECT_GL_NO_ERROR();
355 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, op2Rgb);
356 EXPECT_GL_NO_ERROR();
357 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, op2Alpha);
358 EXPECT_GL_NO_ERROR();
359
360 glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &envColor.R);
361 EXPECT_GL_NO_ERROR();
362
363 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, rgbScale);
364 EXPECT_GL_NO_ERROR();
365
366 glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, alphaScale);
367 EXPECT_GL_NO_ERROR();
368
369 verifyEnvironment(mode, combineRgb, combineAlpha, src0Rgb, src0Alpha, src1Rgb, src1Alpha,
370 src2Rgb, src2Alpha, op0Rgb, op0Alpha, op1Rgb, op1Alpha, op2Rgb, op2Alpha,
371 envColor, rgbScale, alphaScale);
372 }
373 }
374
375 ANGLE_INSTANTIATE_TEST_ES1(TextureEnvTest);
376