xref: /aosp_15_r20/external/angle/src/tests/gl_tests/SamplersTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2017 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // SamplerTest.cpp : Tests for samplers.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker namespace angle
14*8975f5c5SAndroid Build Coastguard Worker {
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker class SamplersTest : public ANGLETest<>
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker   protected:
SamplersTest()19*8975f5c5SAndroid Build Coastguard Worker     SamplersTest() {}
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker     // Sets a value for GL_TEXTURE_MAX_ANISOTROPY_EXT and expects it to fail.
validateInvalidAnisotropy(GLSampler & sampler,float invalidValue)22*8975f5c5SAndroid Build Coastguard Worker     void validateInvalidAnisotropy(GLSampler &sampler, float invalidValue)
23*8975f5c5SAndroid Build Coastguard Worker     {
24*8975f5c5SAndroid Build Coastguard Worker         glSamplerParameterf(sampler, GL_TEXTURE_MAX_ANISOTROPY_EXT, invalidValue);
25*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_VALUE);
26*8975f5c5SAndroid Build Coastguard Worker     }
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker     // Sets a value for GL_TEXTURE_MAX_ANISOTROPY_EXT and expects it to work.
validateValidAnisotropy(GLSampler & sampler,float validValue)29*8975f5c5SAndroid Build Coastguard Worker     void validateValidAnisotropy(GLSampler &sampler, float validValue)
30*8975f5c5SAndroid Build Coastguard Worker     {
31*8975f5c5SAndroid Build Coastguard Worker         glSamplerParameterf(sampler, GL_TEXTURE_MAX_ANISOTROPY_EXT, validValue);
32*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker         GLfloat valueToVerify = 0.0f;
35*8975f5c5SAndroid Build Coastguard Worker         glGetSamplerParameterfv(sampler, GL_TEXTURE_MAX_ANISOTROPY_EXT, &valueToVerify);
36*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(valueToVerify, validValue);
37*8975f5c5SAndroid Build Coastguard Worker     }
38*8975f5c5SAndroid Build Coastguard Worker };
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker class SamplersTest31 : public SamplersTest
41*8975f5c5SAndroid Build Coastguard Worker {};
42*8975f5c5SAndroid Build Coastguard Worker 
43*8975f5c5SAndroid Build Coastguard Worker // Verify that samplerParameterf supports TEXTURE_MAX_ANISOTROPY_EXT valid values.
TEST_P(SamplersTest,ValidTextureSamplerMaxAnisotropyExt)44*8975f5c5SAndroid Build Coastguard Worker TEST_P(SamplersTest, ValidTextureSamplerMaxAnisotropyExt)
45*8975f5c5SAndroid Build Coastguard Worker {
46*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker     // Exact min
49*8975f5c5SAndroid Build Coastguard Worker     validateValidAnisotropy(sampler, 1.0f);
50*8975f5c5SAndroid Build Coastguard Worker 
51*8975f5c5SAndroid Build Coastguard Worker     GLfloat maxValue = 0.0f;
52*8975f5c5SAndroid Build Coastguard Worker     glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxValue);
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker     // Max value
55*8975f5c5SAndroid Build Coastguard Worker     validateValidAnisotropy(sampler, maxValue - 1);
56*8975f5c5SAndroid Build Coastguard Worker 
57*8975f5c5SAndroid Build Coastguard Worker     // In-between
58*8975f5c5SAndroid Build Coastguard Worker     GLfloat between = (1.0f + maxValue) / 2;
59*8975f5c5SAndroid Build Coastguard Worker     validateValidAnisotropy(sampler, between);
60*8975f5c5SAndroid Build Coastguard Worker }
61*8975f5c5SAndroid Build Coastguard Worker 
62*8975f5c5SAndroid Build Coastguard Worker // Verify an error is thrown if we try to go under the minimum value for
63*8975f5c5SAndroid Build Coastguard Worker // GL_TEXTURE_MAX_ANISOTROPY_EXT
TEST_P(SamplersTest,InvalidUnderTextureSamplerMaxAnisotropyExt)64*8975f5c5SAndroid Build Coastguard Worker TEST_P(SamplersTest, InvalidUnderTextureSamplerMaxAnisotropyExt)
65*8975f5c5SAndroid Build Coastguard Worker {
66*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
67*8975f5c5SAndroid Build Coastguard Worker 
68*8975f5c5SAndroid Build Coastguard Worker     // Under min
69*8975f5c5SAndroid Build Coastguard Worker     validateInvalidAnisotropy(sampler, 0.0f);
70*8975f5c5SAndroid Build Coastguard Worker }
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker // Verify an error is thrown if we try to go over the max value for
73*8975f5c5SAndroid Build Coastguard Worker // GL_TEXTURE_MAX_ANISOTROPY_EXT
TEST_P(SamplersTest,InvalidOverTextureSamplerMaxAnisotropyExt)74*8975f5c5SAndroid Build Coastguard Worker TEST_P(SamplersTest, InvalidOverTextureSamplerMaxAnisotropyExt)
75*8975f5c5SAndroid Build Coastguard Worker {
76*8975f5c5SAndroid Build Coastguard Worker     GLSampler sampler;
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker     GLfloat maxValue = 0.0f;
79*8975f5c5SAndroid Build Coastguard Worker     glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxValue);
80*8975f5c5SAndroid Build Coastguard Worker     maxValue += 1;
81*8975f5c5SAndroid Build Coastguard Worker 
82*8975f5c5SAndroid Build Coastguard Worker     validateInvalidAnisotropy(sampler, maxValue);
83*8975f5c5SAndroid Build Coastguard Worker }
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker // Test that updating a sampler uniform in a program behaves correctly.
TEST_P(SamplersTest31,SampleTextureAThenTextureB)86*8975f5c5SAndroid Build Coastguard Worker TEST_P(SamplersTest31, SampleTextureAThenTextureB)
87*8975f5c5SAndroid Build Coastguard Worker {
88*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsVulkan());
89*8975f5c5SAndroid Build Coastguard Worker 
90*8975f5c5SAndroid Build Coastguard Worker     constexpr int kWidth  = 2;
91*8975f5c5SAndroid Build Coastguard Worker     constexpr int kHeight = 2;
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker     const GLchar *vertString = R"(#version 310 es
94*8975f5c5SAndroid Build Coastguard Worker precision highp float;
95*8975f5c5SAndroid Build Coastguard Worker in vec2 a_position;
96*8975f5c5SAndroid Build Coastguard Worker out vec2 texCoord;
97*8975f5c5SAndroid Build Coastguard Worker void main()
98*8975f5c5SAndroid Build Coastguard Worker {
99*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(a_position, 0, 1);
100*8975f5c5SAndroid Build Coastguard Worker     texCoord = a_position * 0.5 + vec2(0.5);
101*8975f5c5SAndroid Build Coastguard Worker })";
102*8975f5c5SAndroid Build Coastguard Worker 
103*8975f5c5SAndroid Build Coastguard Worker     const GLchar *fragString = R"(#version 310 es
104*8975f5c5SAndroid Build Coastguard Worker precision highp float;
105*8975f5c5SAndroid Build Coastguard Worker in vec2 texCoord;
106*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex;
107*8975f5c5SAndroid Build Coastguard Worker out vec4 my_FragColor;
108*8975f5c5SAndroid Build Coastguard Worker void main()
109*8975f5c5SAndroid Build Coastguard Worker {
110*8975f5c5SAndroid Build Coastguard Worker     my_FragColor = texture(tex, texCoord);
111*8975f5c5SAndroid Build Coastguard Worker })";
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kWidth * kHeight> redColor = {
114*8975f5c5SAndroid Build Coastguard Worker         {GLColor::red, GLColor::red, GLColor::red, GLColor::red}};
115*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, kWidth * kHeight> greenColor = {
116*8975f5c5SAndroid Build Coastguard Worker         {GLColor::green, GLColor::green, GLColor::green, GLColor::green}};
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker     // Create a red texture and bind to texture unit 0
119*8975f5c5SAndroid Build Coastguard Worker     GLTexture redTex;
120*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
121*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, redTex);
122*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
123*8975f5c5SAndroid Build Coastguard Worker                  redColor.data());
124*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
125*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
126*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
127*8975f5c5SAndroid Build Coastguard Worker     // Create a green texture and bind to texture unit 1
128*8975f5c5SAndroid Build Coastguard Worker     GLTexture greenTex;
129*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
130*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, greenTex);
131*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
132*8975f5c5SAndroid Build Coastguard Worker                  greenColor.data());
133*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
134*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
135*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
136*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
137*8975f5c5SAndroid Build Coastguard Worker 
138*8975f5c5SAndroid Build Coastguard Worker     GLProgram program;
139*8975f5c5SAndroid Build Coastguard Worker     program.makeRaster(vertString, fragString);
140*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, program);
141*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
142*8975f5c5SAndroid Build Coastguard Worker 
143*8975f5c5SAndroid Build Coastguard Worker     GLint location = glGetUniformLocation(program, "tex");
144*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(location, -1);
145*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
146*8975f5c5SAndroid Build Coastguard Worker 
147*8975f5c5SAndroid Build Coastguard Worker     // Draw red
148*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(location, 0);
149*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
150*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "a_position", 0.5f);
151*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
152*8975f5c5SAndroid Build Coastguard Worker 
153*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
154*8975f5c5SAndroid Build Coastguard Worker     glBlendEquation(GL_FUNC_ADD);
155*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
156*8975f5c5SAndroid Build Coastguard Worker 
157*8975f5c5SAndroid Build Coastguard Worker     // Draw green
158*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(location, 1);
159*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
160*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "a_position", 0.5f);
161*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker     // Draw red
164*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(location, 0);
165*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
166*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "a_position", 0.5f);
167*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
168*8975f5c5SAndroid Build Coastguard Worker 
169*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::yellow);
170*8975f5c5SAndroid Build Coastguard Worker }
171*8975f5c5SAndroid Build Coastguard Worker 
172*8975f5c5SAndroid Build Coastguard Worker // Samplers are only supported on ES3.
173*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SamplersTest);
174*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(SamplersTest);
175*8975f5c5SAndroid Build Coastguard Worker 
176*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SamplersTest31);
177*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES31(SamplersTest31);
178*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
179