xref: /aosp_15_r20/external/angle/src/tests/gl_tests/gles1/TextureParameterTest.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 // TextureParameterTest.cpp: Tests GLES1-specific usage of glTexParameter.
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 TextureParameterTest : public ANGLETest<>
19 {
20   protected:
TextureParameterTest()21     TextureParameterTest()
22     {
23         setWindowWidth(32);
24         setWindowHeight(32);
25         setConfigRedBits(8);
26         setConfigGreenBits(8);
27         setConfigBlueBits(8);
28         setConfigAlphaBits(8);
29         setConfigDepthBits(24);
30     }
31 };
32 
33 // Initial state check
TEST_P(TextureParameterTest,InitialState)34 TEST_P(TextureParameterTest, InitialState)
35 {
36     GLint params[4] = {};
37 
38     glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, params);
39     EXPECT_GL_NO_ERROR();
40     EXPECT_EQ(GL_NEAREST_MIPMAP_LINEAR, params[0]);
41 
42     glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, params);
43     EXPECT_GL_NO_ERROR();
44     EXPECT_EQ(GL_LINEAR, params[0]);
45 
46     glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, params);
47     EXPECT_GL_NO_ERROR();
48     EXPECT_EQ(GL_REPEAT, params[0]);
49 
50     glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, params);
51     EXPECT_GL_NO_ERROR();
52     EXPECT_EQ(GL_REPEAT, params[0]);
53 
54     glGetTexParameteriv(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, params);
55     EXPECT_GL_NO_ERROR();
56     EXPECT_GL_FALSE(params[0]);
57 
58     glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, params);
59     EXPECT_GL_NO_ERROR();
60 
61     EXPECT_EQ(0, params[0]);
62     EXPECT_EQ(0, params[1]);
63     EXPECT_EQ(0, params[2]);
64     EXPECT_EQ(0, params[3]);
65 }
66 
67 // Negative test: invalid enum / operation
TEST_P(TextureParameterTest,NegativeEnum)68 TEST_P(TextureParameterTest, NegativeEnum)
69 {
70     // Invalid target (not supported)
71     glGetTexParameteriv(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, nullptr);
72     EXPECT_GL_ERROR(GL_INVALID_ENUM);
73 
74     // Invalid parameter name
75     glGetTexParameteriv(GL_TEXTURE_2D, 0, nullptr);
76     EXPECT_GL_ERROR(GL_INVALID_ENUM);
77 
78     // Not enough buffer
79     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, 3);
80     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
81 
82     // Not supported in GLES1
83     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
84     EXPECT_GL_ERROR(GL_INVALID_ENUM);
85 }
86 
87 // Checks that GLES1-specific texture parameters can be set.
TEST_P(TextureParameterTest,Set)88 TEST_P(TextureParameterTest, Set)
89 {
90     GLint params[4] = {};
91 
92     glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
93     EXPECT_GL_NO_ERROR();
94 
95     glGetTexParameteriv(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, params);
96     EXPECT_GL_NO_ERROR();
97 
98     EXPECT_GL_TRUE(params[0]);
99 
100     GLint cropRect[4] = {10, 20, 30, 40};
101 
102     glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, cropRect);
103     EXPECT_GL_NO_ERROR();
104 
105     glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, params);
106     EXPECT_GL_NO_ERROR();
107 
108     for (int i = 0; i < 4; i++)
109     {
110         EXPECT_EQ(cropRect[i], params[i]);
111     }
112 }
113 
114 // Make sure we don't improperly cast an int into a float in ANGLE's internals
TEST_P(TextureParameterTest,IntConversionsAndIntBounds)115 TEST_P(TextureParameterTest, IntConversionsAndIntBounds)
116 {
117     // Test integers that can't be represented as floats, INT_MIN, and INT_MAX
118     constexpr GLint kFirstIntThatCannotBeFloat         = 16777217;
119     constexpr unsigned int kParameterLength            = 4;
120     constexpr std::array<GLint, kParameterLength> crop = {
121         -kFirstIntThatCannotBeFloat, kFirstIntThatCannotBeFloat, std::numeric_limits<GLint>::max(),
122         std::numeric_limits<GLint>::min()};
123     glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop.data());
124     std::array<GLint, kParameterLength> cropStored = {0};
125     glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, cropStored.data());
126     ASSERT_EQ(crop, cropStored);
127 }
128 
129 // Check that texture parameters can be set by glTexParameterx, glTexParameterxv
130 // and get by glGetTexParameterxv.
TEST_P(TextureParameterTest,SetFixedPoint)131 TEST_P(TextureParameterTest, SetFixedPoint)
132 {
133     std::array<GLfixed, 4> params = {};
134 
135     glTexParameterx(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
136     EXPECT_GL_NO_ERROR();
137 
138     glGetTexParameterxv(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, params.data());
139     EXPECT_GL_NO_ERROR();
140     EXPECT_GL_TRUE(params[0]);
141 
142     std::array<GLfixed, 4> cropRect = {0x10000, 0x10000, 0x20000, 0x20000};
143 
144     glTexParameterxv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, cropRect.data());
145     EXPECT_GL_NO_ERROR();
146 
147     glGetTexParameterxv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, params.data());
148     EXPECT_GL_NO_ERROR();
149     EXPECT_EQ(cropRect, params);
150 
151     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
152     EXPECT_GL_NO_ERROR();
153 
154     glGetTexParameterxv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, params.data());
155     EXPECT_GL_NO_ERROR();
156     EXPECT_EQ(GL_REPEAT, params[0]);
157 
158     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
159     EXPECT_GL_NO_ERROR();
160 
161     glGetTexParameterxv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, params.data());
162     EXPECT_GL_NO_ERROR();
163     EXPECT_EQ(GL_LINEAR, params[0]);
164 
165     if (IsGLExtensionEnabled("GL_OES_texture_mirrored_repeat"))
166     {
167         glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
168         EXPECT_GL_NO_ERROR();
169     }
170     else
171     {
172         glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
173         EXPECT_GL_ERROR(GL_INVALID_ENUM);
174     }
175 }
176 
177 ANGLE_INSTANTIATE_TEST_ES1(TextureParameterTest);
178