xref: /aosp_15_r20/external/angle/src/tests/gl_tests/gles1/TextureEnvTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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