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