xref: /aosp_15_r20/external/angle/src/tests/gl_tests/ActiveTextureCacheTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2020 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 // ActiveTextureCacheTest.cpp: Regression tests of ANGLE's ActiveTextureCache inside gl::State.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
9*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker namespace angle
12*8975f5c5SAndroid Build Coastguard Worker {
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker class ActiveTextureCacheTest : public ANGLETest<>
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker   protected:
ActiveTextureCacheTest()17*8975f5c5SAndroid Build Coastguard Worker     ActiveTextureCacheTest()
18*8975f5c5SAndroid Build Coastguard Worker     {
19*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
20*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
21*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
22*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
23*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
24*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
25*8975f5c5SAndroid Build Coastguard Worker     }
26*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()27*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
28*8975f5c5SAndroid Build Coastguard Worker     {
29*8975f5c5SAndroid Build Coastguard Worker         constexpr char kVS[] =
30*8975f5c5SAndroid Build Coastguard Worker             "precision highp float;\n"
31*8975f5c5SAndroid Build Coastguard Worker             "\n"
32*8975f5c5SAndroid Build Coastguard Worker             "void main()\n"
33*8975f5c5SAndroid Build Coastguard Worker             "{\n"
34*8975f5c5SAndroid Build Coastguard Worker             "   gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\n"
35*8975f5c5SAndroid Build Coastguard Worker             "}\n";
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker         constexpr char k2DFS[] =
38*8975f5c5SAndroid Build Coastguard Worker             "precision highp float;\n"
39*8975f5c5SAndroid Build Coastguard Worker             "uniform sampler2D tex2D;\n"
40*8975f5c5SAndroid Build Coastguard Worker             "uniform samplerCube texCube;\n"
41*8975f5c5SAndroid Build Coastguard Worker             "\n"
42*8975f5c5SAndroid Build Coastguard Worker             "void main()\n"
43*8975f5c5SAndroid Build Coastguard Worker             "{\n"
44*8975f5c5SAndroid Build Coastguard Worker             "   gl_FragColor = texture2D(tex2D, vec2(0.0, 0.0)) + textureCube(texCube, vec3(0.0, "
45*8975f5c5SAndroid Build Coastguard Worker             "0.0, 0.0));\n"
46*8975f5c5SAndroid Build Coastguard Worker             "}\n";
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker         mProgram = CompileProgram(kVS, k2DFS);
49*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(0u, mProgram);
50*8975f5c5SAndroid Build Coastguard Worker 
51*8975f5c5SAndroid Build Coastguard Worker         m2DTextureLocation = glGetUniformLocation(mProgram, "tex2D");
52*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, m2DTextureLocation);
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker         mCubeTextureLocation = glGetUniformLocation(mProgram, "texCube");
55*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, mCubeTextureLocation);
56*8975f5c5SAndroid Build Coastguard Worker     }
57*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()58*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override { glDeleteProgram(mProgram); }
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker     GLuint mProgram            = 0;
61*8975f5c5SAndroid Build Coastguard Worker     GLint m2DTextureLocation   = -1;
62*8975f5c5SAndroid Build Coastguard Worker     GLint mCubeTextureLocation = -1;
63*8975f5c5SAndroid Build Coastguard Worker };
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker // Regression test for a bug that causes the ActiveTexturesCache to get out of sync with the
66*8975f5c5SAndroid Build Coastguard Worker // currently bound textures when changing program uniforms in such a way that the program becomes
67*8975f5c5SAndroid Build Coastguard Worker // invalid.
TEST_P(ActiveTextureCacheTest,UniformChangeUpdatesActiveTextureCache)68*8975f5c5SAndroid Build Coastguard Worker TEST_P(ActiveTextureCacheTest, UniformChangeUpdatesActiveTextureCache)
69*8975f5c5SAndroid Build Coastguard Worker {
70*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker     // Generate two textures and reset the texture binding
73*8975f5c5SAndroid Build Coastguard Worker     GLuint tex0 = 0;
74*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, &tex0);
75*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex0);
76*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker     GLuint tex1 = 0;
79*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, &tex1);
80*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex1);
81*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
82*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker     // Set the active texture to 1 and bind tex0.
85*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE1);
86*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex0);
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     // Point the program's 2D sampler at texture binding 1. The texture will be added to the
89*8975f5c5SAndroid Build Coastguard Worker     // ActiveTexturesCache because it matches the program's sampler type for this texture binding.
90*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(m2DTextureLocation, 1);
91*8975f5c5SAndroid Build Coastguard Worker 
92*8975f5c5SAndroid Build Coastguard Worker     // Point the program's cube sampler to texture binding 1 as well. This causes the program's
93*8975f5c5SAndroid Build Coastguard Worker     // samplers become invalid and the ActiveTexturesCache is NOT updated.
94*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mCubeTextureLocation, 1);
95*8975f5c5SAndroid Build Coastguard Worker 
96*8975f5c5SAndroid Build Coastguard Worker     // Bind tex1. ActiveTexturesCache is NOT updated (still contains tex0). The current texture
97*8975f5c5SAndroid Build Coastguard Worker     // bindings do not match ActiveTexturesCache's state.
98*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex1);
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker     // Delete tex0. The ActiveTexturesCache entry that points to tex0 is not cleared because tex0 is
101*8975f5c5SAndroid Build Coastguard Worker     // not currently bound.
102*8975f5c5SAndroid Build Coastguard Worker     glDeleteTextures(1, &tex0);
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker     // Use-after-free occurs during context destruction when the ActiveTexturesCache is cleared.
105*8975f5c5SAndroid Build Coastguard Worker }
106*8975f5c5SAndroid Build Coastguard Worker 
107*8975f5c5SAndroid Build Coastguard Worker // Use this to select which configurations (e.g. which renderer, which GLES major version) these
108*8975f5c5SAndroid Build Coastguard Worker // tests should be run against.
109*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(ActiveTextureCacheTest);
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
112