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