xref: /aosp_15_r20/external/angle/src/tests/gl_tests/TiledRenderingTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2024 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 #include "test_utils/ANGLETest.h"
8*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker namespace angle
11*8975f5c5SAndroid Build Coastguard Worker {
12*8975f5c5SAndroid Build Coastguard Worker class TiledRenderingTest : public ANGLETest<>
13*8975f5c5SAndroid Build Coastguard Worker {
14*8975f5c5SAndroid Build Coastguard Worker   protected:
TiledRenderingTest()15*8975f5c5SAndroid Build Coastguard Worker     TiledRenderingTest()
16*8975f5c5SAndroid Build Coastguard Worker     {
17*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
18*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
19*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
20*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
21*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
22*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
23*8975f5c5SAndroid Build Coastguard Worker     }
24*8975f5c5SAndroid Build Coastguard Worker };
25*8975f5c5SAndroid Build Coastguard Worker 
26*8975f5c5SAndroid Build Coastguard Worker // Validate that the extension entry points generate errors when the extension is not available.
TEST_P(TiledRenderingTest,ExtensionDisabled)27*8975f5c5SAndroid Build Coastguard Worker TEST_P(TiledRenderingTest, ExtensionDisabled)
28*8975f5c5SAndroid Build Coastguard Worker {
29*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(IsGLExtensionEnabled("GL_QCOM_tiled_rendering"));
30*8975f5c5SAndroid Build Coastguard Worker     glStartTilingQCOM(0, 0, 1, 1, GL_COLOR_BUFFER_BIT0_QCOM);
31*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
32*8975f5c5SAndroid Build Coastguard Worker     glEndTilingQCOM(GL_COLOR_BUFFER_BIT0_QCOM);
33*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
34*8975f5c5SAndroid Build Coastguard Worker }
35*8975f5c5SAndroid Build Coastguard Worker 
36*8975f5c5SAndroid Build Coastguard Worker // Test that tiled rendering can be stared and stopped. Verify that only pixels in bounds are
37*8975f5c5SAndroid Build Coastguard Worker // written.
TEST_P(TiledRenderingTest,BasicUsage)38*8975f5c5SAndroid Build Coastguard Worker TEST_P(TiledRenderingTest, BasicUsage)
39*8975f5c5SAndroid Build Coastguard Worker {
40*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_tiled_rendering"));
41*8975f5c5SAndroid Build Coastguard Worker 
42*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 0);
45*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker     glStartTilingQCOM(10, 12, 15, 17, GL_COLOR_BUFFER_BIT0_QCOM);
48*8975f5c5SAndroid Build Coastguard Worker 
49*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
50*8975f5c5SAndroid Build Coastguard Worker 
51*8975f5c5SAndroid Build Coastguard Worker     glEndTilingQCOM(GL_COLOR_BUFFER_BIT0_QCOM);
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth();
54*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight();
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(10, 12, 15, 17, GLColor::blue);
57*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, w, 12, GLColor::transparentBlack);
58*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 12 + 17, w, h - 12 - 17, GLColor::transparentBlack);
59*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 10, h, GLColor::transparentBlack);
60*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(10 + 15, 0, w - 10 - 15, h, GLColor::transparentBlack);
61*8975f5c5SAndroid Build Coastguard Worker }
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker // Test that changing the framebuffer implicitly ends tiled rendering.
TEST_P(TiledRenderingTest,ImplicitEnd)64*8975f5c5SAndroid Build Coastguard Worker TEST_P(TiledRenderingTest, ImplicitEnd)
65*8975f5c5SAndroid Build Coastguard Worker {
66*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_tiled_rendering"));
67*8975f5c5SAndroid Build Coastguard Worker 
68*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex1;
69*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex1);
70*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo1;
73*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo1);
74*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex1, 0);
75*8975f5c5SAndroid Build Coastguard Worker 
76*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex2;
77*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex2);
78*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
79*8975f5c5SAndroid Build Coastguard Worker 
80*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo2;
81*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo2);
82*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2, 0);
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 0);
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo1);
89*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
90*8975f5c5SAndroid Build Coastguard Worker     glStartTilingQCOM(0, 0, 8, 8, GL_COLOR_BUFFER_BIT0_QCOM);
91*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
94*8975f5c5SAndroid Build Coastguard Worker 
95*8975f5c5SAndroid Build Coastguard Worker     // Switch framebuffer bindings. Tiling is implicitly ended and start can be called again without
96*8975f5c5SAndroid Build Coastguard Worker     // errors.
97*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo2);
98*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
99*8975f5c5SAndroid Build Coastguard Worker     glStartTilingQCOM(8, 8, 8, 8, GL_COLOR_BUFFER_BIT0_QCOM);
100*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker     glEndTilingQCOM(GL_COLOR_BUFFER_BIT0_QCOM);
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker     // Test that the correct tiling regions were used
107*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo1);
108*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(4, 4, GLColor::blue);
109*8975f5c5SAndroid Build Coastguard Worker 
110*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo2);
111*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(12, 12, GLColor::blue);
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker     // Qualcomm drivers do not implicitly end tiling when changing the texture bound to the
114*8975f5c5SAndroid Build Coastguard Worker     // framebuffer so ANGLE inherits this behaviour. Validate that tiling is not ended.
115*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex1);
116*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo1);
117*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
118*8975f5c5SAndroid Build Coastguard Worker     glStartTilingQCOM(4, 4, 4, 4, GL_COLOR_BUFFER_BIT0_QCOM);
119*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
120*8975f5c5SAndroid Build Coastguard Worker 
121*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
122*8975f5c5SAndroid Build Coastguard Worker 
123*8975f5c5SAndroid Build Coastguard Worker     // Redefine to 8x8 with red data
124*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> redData(8 * 8, GLColor::red);
125*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, redData.data());
126*8975f5c5SAndroid Build Coastguard Worker 
127*8975f5c5SAndroid Build Coastguard Worker     // If tiling is still continuing from before, should only draw to [4, 4] to (8, 8)
128*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
129*8975f5c5SAndroid Build Coastguard Worker 
130*8975f5c5SAndroid Build Coastguard Worker     glStartTilingQCOM(4, 4, 4, 4, GL_COLOR_BUFFER_BIT0_QCOM);
131*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker     glEndTilingQCOM(GL_COLOR_BUFFER_BIT0_QCOM);
134*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
135*8975f5c5SAndroid Build Coastguard Worker 
136*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, 4, 4, GLColor::red);
137*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(4, 4, 4, 4, GLColor::blue);
138*8975f5c5SAndroid Build Coastguard Worker }
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker // Test that the only written areas are the intersection of scissor and tiled rendering area
TEST_P(TiledRenderingTest,Scissor)141*8975f5c5SAndroid Build Coastguard Worker TEST_P(TiledRenderingTest, Scissor)
142*8975f5c5SAndroid Build Coastguard Worker {
143*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_QCOM_tiled_rendering"));
144*8975f5c5SAndroid Build Coastguard Worker 
145*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), essl1_shaders::fs::Blue());
146*8975f5c5SAndroid Build Coastguard Worker 
147*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 0, 0);
148*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
149*8975f5c5SAndroid Build Coastguard Worker 
150*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
151*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, 12, 12);
152*8975f5c5SAndroid Build Coastguard Worker 
153*8975f5c5SAndroid Build Coastguard Worker     glStartTilingQCOM(8, 8, 8, 8, GL_COLOR_BUFFER_BIT0_QCOM);
154*8975f5c5SAndroid Build Coastguard Worker 
155*8975f5c5SAndroid Build Coastguard Worker     // Scissor and tile intersect from [8, 8] to [12, 12]
156*8975f5c5SAndroid Build Coastguard Worker 
157*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0);
158*8975f5c5SAndroid Build Coastguard Worker 
159*8975f5c5SAndroid Build Coastguard Worker     glEndTilingQCOM(GL_COLOR_BUFFER_BIT0_QCOM);
160*8975f5c5SAndroid Build Coastguard Worker 
161*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
162*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(6, 6, GLColor::transparentBlack);
163*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(8, 8, 4, 4, GLColor::blue);
164*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(14, 14, GLColor::transparentBlack);
165*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(18, 18, GLColor::transparentBlack);
166*8975f5c5SAndroid Build Coastguard Worker }
167*8975f5c5SAndroid Build Coastguard Worker 
168*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(TiledRenderingTest);
169*8975f5c5SAndroid Build Coastguard Worker 
170*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
171