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