xref: /aosp_15_r20/external/angle/src/libANGLE/BlendStateExt_unittest.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 
7*8975f5c5SAndroid Build Coastguard Worker // BlendStateExt_unittest.cpp: Unit tests of the BlendStateExt class.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include <gtest/gtest.h>
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.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 #if defined(ANGLE_IS_64_BIT_CPU)
17*8975f5c5SAndroid Build Coastguard Worker constexpr bool is64Bit = true;
18*8975f5c5SAndroid Build Coastguard Worker #else
19*8975f5c5SAndroid Build Coastguard Worker constexpr bool is64Bit = false;
20*8975f5c5SAndroid Build Coastguard Worker #endif
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker // Test the initial state of BlendStateExt
TEST(BlendStateExt,Init)23*8975f5c5SAndroid Build Coastguard Worker TEST(BlendStateExt, Init)
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker     const std::array<uint8_t, 9> allEnabledMasks = {0, 1, 3, 7, 15, 31, 63, 127, 255};
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker     const std::array<uint32_t, 9> allColorMasks32 = {
28*8975f5c5SAndroid Build Coastguard Worker         0, 0xF, 0xFF, 0xFFF, 0xFFFF, 0xFFFFF, 0xFFFFFF, 0xFFFFFFF, 0xFFFFFFFF};
29*8975f5c5SAndroid Build Coastguard Worker 
30*8975f5c5SAndroid Build Coastguard Worker     const std::array<uint64_t, 9> allColorMasks64 = {
31*8975f5c5SAndroid Build Coastguard Worker         0x0000000000000000, 0x000000000000000F, 0x0000000000000F0F,
32*8975f5c5SAndroid Build Coastguard Worker         0x00000000000F0F0F, 0x000000000F0F0F0F, 0x0000000F0F0F0F0F,
33*8975f5c5SAndroid Build Coastguard Worker         0x00000F0F0F0F0F0F, 0x000F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F};
34*8975f5c5SAndroid Build Coastguard Worker 
35*8975f5c5SAndroid Build Coastguard Worker     const std::array<uint64_t, 9> sourceColorAlpha = {
36*8975f5c5SAndroid Build Coastguard Worker         0x0000000000000000, 0x0000000000000001, 0x0000000000000101,
37*8975f5c5SAndroid Build Coastguard Worker         0x0000000000010101, 0x0000000001010101, 0x0000000101010101,
38*8975f5c5SAndroid Build Coastguard Worker         0x0000010101010101, 0x0001010101010101, 0x0101010101010101};
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker     for (size_t c = 1; c <= 8; ++c)
41*8975f5c5SAndroid Build Coastguard Worker     {
42*8975f5c5SAndroid Build Coastguard Worker         const gl::BlendStateExt blendStateExt = gl::BlendStateExt(c);
43*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getDrawBufferCount(), c);
44*8975f5c5SAndroid Build Coastguard Worker 
45*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getEnabledMask().to_ulong(), 0u);
46*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getAllEnabledMask().to_ulong(), allEnabledMasks[c]);
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getColorMaskBits(), blendStateExt.getAllColorMaskBits());
49*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getAllColorMaskBits(),
50*8975f5c5SAndroid Build Coastguard Worker                   is64Bit ? allColorMasks64[c] : allColorMasks32[c]);
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getUsesAdvancedBlendEquationMask().to_ulong(), 0u);
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getUsesExtendedBlendFactorMask().to_ulong(), 0u);
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getSrcColorBits(), sourceColorAlpha[c]);
57*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getSrcAlphaBits(), sourceColorAlpha[c]);
58*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getDstColorBits(), 0u);
59*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getDstAlphaBits(), 0u);
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getEquationColorBits(), 0u);
62*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getEquationAlphaBits(), 0u);
63*8975f5c5SAndroid Build Coastguard Worker 
64*8975f5c5SAndroid Build Coastguard Worker         for (size_t i = 0; i < c; ++i)
65*8975f5c5SAndroid Build Coastguard Worker         {
66*8975f5c5SAndroid Build Coastguard Worker             ASSERT_FALSE(blendStateExt.getEnabledMask().test(i));
67*8975f5c5SAndroid Build Coastguard Worker 
68*8975f5c5SAndroid Build Coastguard Worker             bool r, g, b, a;
69*8975f5c5SAndroid Build Coastguard Worker             blendStateExt.getColorMaskIndexed(i, &r, &g, &b, &a);
70*8975f5c5SAndroid Build Coastguard Worker             ASSERT_TRUE(r);
71*8975f5c5SAndroid Build Coastguard Worker             ASSERT_TRUE(g);
72*8975f5c5SAndroid Build Coastguard Worker             ASSERT_TRUE(b);
73*8975f5c5SAndroid Build Coastguard Worker             ASSERT_TRUE(a);
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(blendStateExt.getEquationColorIndexed(i), gl::BlendEquationType::Add);
76*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(blendStateExt.getEquationAlphaIndexed(i), gl::BlendEquationType::Add);
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(blendStateExt.getSrcColorIndexed(i), gl::BlendFactorType::One);
79*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(blendStateExt.getDstColorIndexed(i), gl::BlendFactorType::Zero);
80*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(blendStateExt.getSrcAlphaIndexed(i), gl::BlendFactorType::One);
81*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(blendStateExt.getDstAlphaIndexed(i), gl::BlendFactorType::Zero);
82*8975f5c5SAndroid Build Coastguard Worker         }
83*8975f5c5SAndroid Build Coastguard Worker     }
84*8975f5c5SAndroid Build Coastguard Worker }
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker // Test blend enabled flags
TEST(BlendStateExt,BlendEnabled)87*8975f5c5SAndroid Build Coastguard Worker TEST(BlendStateExt, BlendEnabled)
88*8975f5c5SAndroid Build Coastguard Worker {
89*8975f5c5SAndroid Build Coastguard Worker     const std::array<uint8_t, 9> enabled = {0, 1, 3, 7, 15, 31, 63, 127, 255};
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     for (size_t c = 1; c <= 8; c++)
92*8975f5c5SAndroid Build Coastguard Worker     {
93*8975f5c5SAndroid Build Coastguard Worker         gl::BlendStateExt blendStateExt = gl::BlendStateExt(c);
94*8975f5c5SAndroid Build Coastguard Worker 
95*8975f5c5SAndroid Build Coastguard Worker         blendStateExt.setEnabled(true);
96*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getEnabledMask().to_ulong(), enabled[c]);
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker         blendStateExt.setEnabled(false);
99*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getEnabledMask().to_ulong(), 0u);
100*8975f5c5SAndroid Build Coastguard Worker 
101*8975f5c5SAndroid Build Coastguard Worker         blendStateExt.setEnabledIndexed(c / 2, true);
102*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getEnabledMask().to_ulong(), 1u << (c / 2));
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker         blendStateExt.setEnabledIndexed(c / 2, false);
105*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getEnabledMask().to_ulong(), 0u);
106*8975f5c5SAndroid Build Coastguard Worker     }
107*8975f5c5SAndroid Build Coastguard Worker }
108*8975f5c5SAndroid Build Coastguard Worker 
validateMaskPacking(const uint8_t packed,const bool r,const bool g,const bool b,const bool a)109*8975f5c5SAndroid Build Coastguard Worker void validateMaskPacking(const uint8_t packed,
110*8975f5c5SAndroid Build Coastguard Worker                          const bool r,
111*8975f5c5SAndroid Build Coastguard Worker                          const bool g,
112*8975f5c5SAndroid Build Coastguard Worker                          const bool b,
113*8975f5c5SAndroid Build Coastguard Worker                          const bool a)
114*8975f5c5SAndroid Build Coastguard Worker {
115*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(gl::BlendStateExt::PackColorMask(r, g, b, a), packed);
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker     bool rOut, gOut, bOut, aOut;
118*8975f5c5SAndroid Build Coastguard Worker     gl::BlendStateExt::UnpackColorMask(packed, &rOut, &gOut, &bOut, &aOut);
119*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(r, rOut);
120*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(g, gOut);
121*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(b, bOut);
122*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(a, aOut);
123*8975f5c5SAndroid Build Coastguard Worker }
124*8975f5c5SAndroid Build Coastguard Worker 
125*8975f5c5SAndroid Build Coastguard Worker // Test color write mask packing
TEST(BlendStateExt,ColorMaskPacking)126*8975f5c5SAndroid Build Coastguard Worker TEST(BlendStateExt, ColorMaskPacking)
127*8975f5c5SAndroid Build Coastguard Worker {
128*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0x0, false, false, false, false);
129*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0x1, true, false, false, false);
130*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0x2, false, true, false, false);
131*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0x3, true, true, false, false);
132*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0x4, false, false, true, false);
133*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0x5, true, false, true, false);
134*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0x6, false, true, true, false);
135*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0x7, true, true, true, false);
136*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0x8, false, false, false, true);
137*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0x9, true, false, false, true);
138*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0xA, false, true, false, true);
139*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0xB, true, true, false, true);
140*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0xC, false, false, true, true);
141*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0xD, true, false, true, true);
142*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0xE, false, true, true, true);
143*8975f5c5SAndroid Build Coastguard Worker     validateMaskPacking(0xF, true, true, true, true);
144*8975f5c5SAndroid Build Coastguard Worker }
145*8975f5c5SAndroid Build Coastguard Worker 
146*8975f5c5SAndroid Build Coastguard Worker // Test color write mask manipulations
TEST(BlendStateExt,ColorMask)147*8975f5c5SAndroid Build Coastguard Worker TEST(BlendStateExt, ColorMask)
148*8975f5c5SAndroid Build Coastguard Worker {
149*8975f5c5SAndroid Build Coastguard Worker     const std::array<uint32_t, 9> startSingleValue32 = {0x00000000, 0x00000005, 0x00000055,
150*8975f5c5SAndroid Build Coastguard Worker                                                         0x00000555, 0x00005555, 0x00055555,
151*8975f5c5SAndroid Build Coastguard Worker                                                         0x00555555, 0x05555555, 0x55555555};
152*8975f5c5SAndroid Build Coastguard Worker 
153*8975f5c5SAndroid Build Coastguard Worker     const std::array<uint64_t, 9> startSingleValue64 = {
154*8975f5c5SAndroid Build Coastguard Worker         0x0000000000000000, 0x0000000000000005, 0x0000000000000505,
155*8975f5c5SAndroid Build Coastguard Worker         0x0000000000050505, 0x0000000005050505, 0x0000000505050505,
156*8975f5c5SAndroid Build Coastguard Worker         0x0000050505050505, 0x0005050505050505, 0x0505050505050505};
157*8975f5c5SAndroid Build Coastguard Worker 
158*8975f5c5SAndroid Build Coastguard Worker     for (size_t c = 1; c <= 8; c++)
159*8975f5c5SAndroid Build Coastguard Worker     {
160*8975f5c5SAndroid Build Coastguard Worker         gl::BlendStateExt blendStateExt = gl::BlendStateExt(c);
161*8975f5c5SAndroid Build Coastguard Worker 
162*8975f5c5SAndroid Build Coastguard Worker         blendStateExt.setColorMask(true, false, true, false);
163*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(blendStateExt.getColorMaskBits(),
164*8975f5c5SAndroid Build Coastguard Worker                   is64Bit ? startSingleValue64[c] : startSingleValue32[c]);
165*8975f5c5SAndroid Build Coastguard Worker 
166*8975f5c5SAndroid Build Coastguard Worker         blendStateExt.setColorMaskIndexed(c / 2, false, true, false, true);
167*8975f5c5SAndroid Build Coastguard Worker         for (size_t i = 0; i < c; ++i)
168*8975f5c5SAndroid Build Coastguard Worker         {
169*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(blendStateExt.getColorMaskIndexed(i), i == c / 2 ? 0xAu : 0x5u);
170*8975f5c5SAndroid Build Coastguard Worker         }
171*8975f5c5SAndroid Build Coastguard Worker 
172*8975f5c5SAndroid Build Coastguard Worker         blendStateExt.setColorMaskIndexed(0, 0xF);
173*8975f5c5SAndroid Build Coastguard Worker         bool r, g, b, a;
174*8975f5c5SAndroid Build Coastguard Worker         blendStateExt.getColorMaskIndexed(0, &r, &g, &b, &a);
175*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(r);
176*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(g);
177*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(b);
178*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(a);
179*8975f5c5SAndroid Build Coastguard Worker 
180*8975f5c5SAndroid Build Coastguard Worker         blendStateExt.setColorMaskIndexed(c - 1, true, false, true, true);
181*8975f5c5SAndroid Build Coastguard Worker         gl::BlendStateExt::ColorMaskStorage::Type otherColorMask =
182*8975f5c5SAndroid Build Coastguard Worker             blendStateExt.expandColorMaskIndexed(c - 1);
183*8975f5c5SAndroid Build Coastguard Worker         for (size_t i = 0; i < c; ++i)
184*8975f5c5SAndroid Build Coastguard Worker         {
185*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(gl::BlendStateExt::ColorMaskStorage::GetValueIndexed(i, otherColorMask), 0xD);
186*8975f5c5SAndroid Build Coastguard Worker         }
187*8975f5c5SAndroid Build Coastguard Worker 
188*8975f5c5SAndroid Build Coastguard Worker         // All masks are different except the c-th
189*8975f5c5SAndroid Build Coastguard Worker         {
190*8975f5c5SAndroid Build Coastguard Worker             const gl::DrawBufferMask diff = blendStateExt.compareColorMask(otherColorMask);
191*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(diff.to_ulong(), 127u >> (8 - c));
192*8975f5c5SAndroid Build Coastguard Worker         }
193*8975f5c5SAndroid Build Coastguard Worker 
194*8975f5c5SAndroid Build Coastguard Worker         // Test that all-enabled color mask correctly compares with the current color mask
195*8975f5c5SAndroid Build Coastguard Worker         {
196*8975f5c5SAndroid Build Coastguard Worker             blendStateExt.setColorMask(true, true, true, true);
197*8975f5c5SAndroid Build Coastguard Worker             blendStateExt.setColorMaskIndexed(c / 2, false, false, true, false);
198*8975f5c5SAndroid Build Coastguard Worker             const gl::DrawBufferMask diff =
199*8975f5c5SAndroid Build Coastguard Worker                 blendStateExt.compareColorMask(blendStateExt.getAllColorMaskBits());
200*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(diff.to_ulong(), 1u << (c / 2));
201*8975f5c5SAndroid Build Coastguard Worker         }
202*8975f5c5SAndroid Build Coastguard Worker     }
203*8975f5c5SAndroid Build Coastguard Worker }
204*8975f5c5SAndroid Build Coastguard Worker 
205*8975f5c5SAndroid Build Coastguard Worker // Test blend equations manipulations
TEST(BlendStateExt,BlendEquations)206*8975f5c5SAndroid Build Coastguard Worker TEST(BlendStateExt, BlendEquations)
207*8975f5c5SAndroid Build Coastguard Worker {
208*8975f5c5SAndroid Build Coastguard Worker     gl::BlendStateExt blendStateExt = gl::BlendStateExt(7);
209*8975f5c5SAndroid Build Coastguard Worker 
210*8975f5c5SAndroid Build Coastguard Worker     blendStateExt.setEquations(GL_MIN, GL_FUNC_SUBTRACT);
211*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getEquationColorBits(), 0x01010101010101u);
212*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getEquationAlphaBits(), 0x04040404040404u);
213*8975f5c5SAndroid Build Coastguard Worker 
214*8975f5c5SAndroid Build Coastguard Worker     blendStateExt.setEquationsIndexed(3, GL_MAX, GL_FUNC_SUBTRACT);
215*8975f5c5SAndroid Build Coastguard Worker     blendStateExt.setEquationsIndexed(5, GL_MIN, GL_FUNC_ADD);
216*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getEquationColorBits(), 0x01010102010101u);
217*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getEquationAlphaBits(), 0x04000404040404u);
218*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getEquationColorIndexed(3), gl::BlendEquationType::Max);
219*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getEquationAlphaIndexed(5), gl::BlendEquationType::Add);
220*8975f5c5SAndroid Build Coastguard Worker 
221*8975f5c5SAndroid Build Coastguard Worker     gl::BlendStateExt::EquationStorage::Type otherEquationColor =
222*8975f5c5SAndroid Build Coastguard Worker         blendStateExt.expandEquationColorIndexed(0);
223*8975f5c5SAndroid Build Coastguard Worker     gl::BlendStateExt::EquationStorage::Type otherEquationAlpha =
224*8975f5c5SAndroid Build Coastguard Worker         blendStateExt.expandEquationAlphaIndexed(0);
225*8975f5c5SAndroid Build Coastguard Worker 
226*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(otherEquationColor, 0x01010101010101u);
227*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(otherEquationAlpha, 0x04040404040404u);
228*8975f5c5SAndroid Build Coastguard Worker 
229*8975f5c5SAndroid Build Coastguard Worker     const gl::DrawBufferMask diff =
230*8975f5c5SAndroid Build Coastguard Worker         blendStateExt.compareEquations(otherEquationColor, otherEquationAlpha);
231*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(diff.to_ulong(), 40u);
232*8975f5c5SAndroid Build Coastguard Worker 
233*8975f5c5SAndroid Build Coastguard Worker     // Copy buffer 3 to buffer 0
234*8975f5c5SAndroid Build Coastguard Worker     blendStateExt.setEquationsIndexed(0, 3, blendStateExt);
235*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getEquationColorIndexed(0), gl::BlendEquationType::Max);
236*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getEquationAlphaIndexed(0), gl::BlendEquationType::Subtract);
237*8975f5c5SAndroid Build Coastguard Worker 
238*8975f5c5SAndroid Build Coastguard Worker     // Copy buffer 5 to buffer 0
239*8975f5c5SAndroid Build Coastguard Worker     blendStateExt.setEquationsIndexed(0, 5, blendStateExt);
240*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getEquationColorIndexed(0), gl::BlendEquationType::Min);
241*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getEquationAlphaIndexed(0), gl::BlendEquationType::Add);
242*8975f5c5SAndroid Build Coastguard Worker }
243*8975f5c5SAndroid Build Coastguard Worker 
244*8975f5c5SAndroid Build Coastguard Worker // Test blend factors manipulations
TEST(BlendStateExt,BlendFactors)245*8975f5c5SAndroid Build Coastguard Worker TEST(BlendStateExt, BlendFactors)
246*8975f5c5SAndroid Build Coastguard Worker {
247*8975f5c5SAndroid Build Coastguard Worker     gl::BlendStateExt blendStateExt = gl::BlendStateExt(8);
248*8975f5c5SAndroid Build Coastguard Worker 
249*8975f5c5SAndroid Build Coastguard Worker     blendStateExt.setFactors(GL_SRC_COLOR, GL_DST_COLOR, GL_SRC_ALPHA, GL_DST_ALPHA);
250*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getSrcColorBits(), 0x0202020202020202u);
251*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getDstColorBits(), 0x0808080808080808u);
252*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getSrcAlphaBits(), 0x0404040404040404u);
253*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getDstAlphaBits(), 0x0606060606060606u);
254*8975f5c5SAndroid Build Coastguard Worker 
255*8975f5c5SAndroid Build Coastguard Worker     blendStateExt.setFactorsIndexed(0, GL_ONE, GL_DST_COLOR, GL_SRC_ALPHA, GL_DST_ALPHA);
256*8975f5c5SAndroid Build Coastguard Worker     blendStateExt.setFactorsIndexed(3, GL_SRC_COLOR, GL_ONE, GL_SRC_ALPHA, GL_DST_ALPHA);
257*8975f5c5SAndroid Build Coastguard Worker     blendStateExt.setFactorsIndexed(5, GL_SRC_COLOR, GL_DST_COLOR, GL_ONE, GL_DST_ALPHA);
258*8975f5c5SAndroid Build Coastguard Worker     blendStateExt.setFactorsIndexed(7, GL_SRC_COLOR, GL_DST_COLOR, GL_SRC_ALPHA, GL_ONE);
259*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getSrcColorBits(), 0x0202020202020201u);
260*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getDstColorBits(), 0x0808080801080808u);
261*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getSrcAlphaBits(), 0x0404010404040404u);
262*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getDstAlphaBits(), 0x0106060606060606u);
263*8975f5c5SAndroid Build Coastguard Worker 
264*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getSrcColorIndexed(0), gl::BlendFactorType::One);
265*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getDstColorIndexed(3), gl::BlendFactorType::One);
266*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getSrcAlphaIndexed(5), gl::BlendFactorType::One);
267*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getDstAlphaIndexed(7), gl::BlendFactorType::One);
268*8975f5c5SAndroid Build Coastguard Worker 
269*8975f5c5SAndroid Build Coastguard Worker     gl::BlendStateExt::FactorStorage::Type otherSrcColor = blendStateExt.expandSrcColorIndexed(1);
270*8975f5c5SAndroid Build Coastguard Worker     gl::BlendStateExt::FactorStorage::Type otherDstColor = blendStateExt.expandDstColorIndexed(1);
271*8975f5c5SAndroid Build Coastguard Worker     gl::BlendStateExt::FactorStorage::Type otherSrcAlpha = blendStateExt.expandSrcAlphaIndexed(1);
272*8975f5c5SAndroid Build Coastguard Worker     gl::BlendStateExt::FactorStorage::Type otherDstAlpha = blendStateExt.expandDstAlphaIndexed(1);
273*8975f5c5SAndroid Build Coastguard Worker 
274*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(otherSrcColor, 0x0202020202020202u);
275*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(otherDstColor, 0x0808080808080808u);
276*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(otherSrcAlpha, 0x0404040404040404u);
277*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(otherDstAlpha, 0x0606060606060606u);
278*8975f5c5SAndroid Build Coastguard Worker 
279*8975f5c5SAndroid Build Coastguard Worker     const gl::DrawBufferMask diff =
280*8975f5c5SAndroid Build Coastguard Worker         blendStateExt.compareFactors(otherSrcColor, otherDstColor, otherSrcAlpha, otherDstAlpha);
281*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(diff.to_ulong(), 169u);
282*8975f5c5SAndroid Build Coastguard Worker 
283*8975f5c5SAndroid Build Coastguard Worker     // Copy buffer 0 to buffer 1
284*8975f5c5SAndroid Build Coastguard Worker     blendStateExt.setFactorsIndexed(1, 0, blendStateExt);
285*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getSrcColorIndexed(1), gl::BlendFactorType::One);
286*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getDstColorIndexed(1), gl::BlendFactorType::DstColor);
287*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getSrcAlphaIndexed(1), gl::BlendFactorType::SrcAlpha);
288*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getDstAlphaIndexed(1), gl::BlendFactorType::DstAlpha);
289*8975f5c5SAndroid Build Coastguard Worker 
290*8975f5c5SAndroid Build Coastguard Worker     // Copy buffer 3 to buffer 1
291*8975f5c5SAndroid Build Coastguard Worker     blendStateExt.setFactorsIndexed(1, 3, blendStateExt);
292*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getSrcColorIndexed(1), gl::BlendFactorType::SrcColor);
293*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getDstColorIndexed(1), gl::BlendFactorType::One);
294*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getSrcAlphaIndexed(1), gl::BlendFactorType::SrcAlpha);
295*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getDstAlphaIndexed(1), gl::BlendFactorType::DstAlpha);
296*8975f5c5SAndroid Build Coastguard Worker 
297*8975f5c5SAndroid Build Coastguard Worker     // Copy buffer 5 to buffer 1
298*8975f5c5SAndroid Build Coastguard Worker     blendStateExt.setFactorsIndexed(1, 5, blendStateExt);
299*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getSrcColorIndexed(1), gl::BlendFactorType::SrcColor);
300*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getDstColorIndexed(1), gl::BlendFactorType::DstColor);
301*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getSrcAlphaIndexed(1), gl::BlendFactorType::One);
302*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getDstAlphaIndexed(1), gl::BlendFactorType::DstAlpha);
303*8975f5c5SAndroid Build Coastguard Worker 
304*8975f5c5SAndroid Build Coastguard Worker     // Copy buffer 7 to buffer 1
305*8975f5c5SAndroid Build Coastguard Worker     blendStateExt.setFactorsIndexed(1, 7, blendStateExt);
306*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getSrcColorIndexed(1), gl::BlendFactorType::SrcColor);
307*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getDstColorIndexed(1), gl::BlendFactorType::DstColor);
308*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getSrcAlphaIndexed(1), gl::BlendFactorType::SrcAlpha);
309*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(blendStateExt.getDstAlphaIndexed(1), gl::BlendFactorType::One);
310*8975f5c5SAndroid Build Coastguard Worker }
311*8975f5c5SAndroid Build Coastguard Worker 
312*8975f5c5SAndroid Build Coastguard Worker // Test clip rectangle
TEST(Rectangle,Clip)313*8975f5c5SAndroid Build Coastguard Worker TEST(Rectangle, Clip)
314*8975f5c5SAndroid Build Coastguard Worker {
315*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle source(0, 0, 100, 200);
316*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle clip1(0, 0, 50, 100);
317*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle result;
318*8975f5c5SAndroid Build Coastguard Worker 
319*8975f5c5SAndroid Build Coastguard Worker     ASSERT_TRUE(gl::ClipRectangle(source, clip1, &result));
320*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x, 0);
321*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y, 0);
322*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.width, 50);
323*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.height, 100);
324*8975f5c5SAndroid Build Coastguard Worker 
325*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle clip2(10, 20, 30, 40);
326*8975f5c5SAndroid Build Coastguard Worker 
327*8975f5c5SAndroid Build Coastguard Worker     ASSERT_TRUE(gl::ClipRectangle(source, clip2, &result));
328*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x, 10);
329*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y, 20);
330*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.width, 30);
331*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.height, 40);
332*8975f5c5SAndroid Build Coastguard Worker 
333*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle clip3(-20, -30, 10000, 400000);
334*8975f5c5SAndroid Build Coastguard Worker 
335*8975f5c5SAndroid Build Coastguard Worker     ASSERT_TRUE(gl::ClipRectangle(source, clip3, &result));
336*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x, 0);
337*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y, 0);
338*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.width, 100);
339*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.height, 200);
340*8975f5c5SAndroid Build Coastguard Worker 
341*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle clip4(50, 100, -20, -30);
342*8975f5c5SAndroid Build Coastguard Worker 
343*8975f5c5SAndroid Build Coastguard Worker     ASSERT_TRUE(gl::ClipRectangle(source, clip4, &result));
344*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x, 30);
345*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y, 70);
346*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.width, 20);
347*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.height, 30);
348*8975f5c5SAndroid Build Coastguard Worker 
349*8975f5c5SAndroid Build Coastguard Worker     // Non-overlapping rectangles
350*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle clip5(-100, 0, 99, 200);
351*8975f5c5SAndroid Build Coastguard Worker     ASSERT_FALSE(gl::ClipRectangle(source, clip5, nullptr));
352*8975f5c5SAndroid Build Coastguard Worker 
353*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle clip6(0, -100, 100, 99);
354*8975f5c5SAndroid Build Coastguard Worker     ASSERT_FALSE(gl::ClipRectangle(source, clip6, nullptr));
355*8975f5c5SAndroid Build Coastguard Worker 
356*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle clip7(101, 0, 99, 200);
357*8975f5c5SAndroid Build Coastguard Worker     ASSERT_FALSE(gl::ClipRectangle(source, clip7, nullptr));
358*8975f5c5SAndroid Build Coastguard Worker 
359*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle clip8(0, 201, 100, 99);
360*8975f5c5SAndroid Build Coastguard Worker     ASSERT_FALSE(gl::ClipRectangle(source, clip8, nullptr));
361*8975f5c5SAndroid Build Coastguard Worker 
362*8975f5c5SAndroid Build Coastguard Worker     // Zero-width/height rectangles
363*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle clip9(50, 0, 0, 200);
364*8975f5c5SAndroid Build Coastguard Worker     ASSERT_FALSE(gl::ClipRectangle(source, clip9, nullptr));
365*8975f5c5SAndroid Build Coastguard Worker     ASSERT_FALSE(gl::ClipRectangle(clip9, source, nullptr));
366*8975f5c5SAndroid Build Coastguard Worker 
367*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle clip10(0, 100, 100, 0);
368*8975f5c5SAndroid Build Coastguard Worker     ASSERT_FALSE(gl::ClipRectangle(source, clip10, nullptr));
369*8975f5c5SAndroid Build Coastguard Worker     ASSERT_FALSE(gl::ClipRectangle(clip10, source, nullptr));
370*8975f5c5SAndroid Build Coastguard Worker }
371*8975f5c5SAndroid Build Coastguard Worker 
372*8975f5c5SAndroid Build Coastguard Worker // Test combine rectangles
TEST(Rectangle,Combine)373*8975f5c5SAndroid Build Coastguard Worker TEST(Rectangle, Combine)
374*8975f5c5SAndroid Build Coastguard Worker {
375*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle rect1(0, 0, 100, 200);
376*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle rect2(0, 0, 50, 100);
377*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle result;
378*8975f5c5SAndroid Build Coastguard Worker 
379*8975f5c5SAndroid Build Coastguard Worker     gl::GetEnclosingRectangle(rect1, rect2, &result);
380*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x0(), 0);
381*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y0(), 0);
382*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x1(), 100);
383*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y1(), 200);
384*8975f5c5SAndroid Build Coastguard Worker 
385*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle rect3(50, 100, 100, 200);
386*8975f5c5SAndroid Build Coastguard Worker 
387*8975f5c5SAndroid Build Coastguard Worker     gl::GetEnclosingRectangle(rect1, rect3, &result);
388*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x0(), 0);
389*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y0(), 0);
390*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x1(), 150);
391*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y1(), 300);
392*8975f5c5SAndroid Build Coastguard Worker 
393*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle rect4(-20, -30, 100, 200);
394*8975f5c5SAndroid Build Coastguard Worker 
395*8975f5c5SAndroid Build Coastguard Worker     gl::GetEnclosingRectangle(rect1, rect4, &result);
396*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x0(), -20);
397*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y0(), -30);
398*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x1(), 100);
399*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y1(), 200);
400*8975f5c5SAndroid Build Coastguard Worker 
401*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle rect5(10, -30, 100, 200);
402*8975f5c5SAndroid Build Coastguard Worker 
403*8975f5c5SAndroid Build Coastguard Worker     gl::GetEnclosingRectangle(rect1, rect5, &result);
404*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x0(), 0);
405*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y0(), -30);
406*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x1(), 110);
407*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y1(), 200);
408*8975f5c5SAndroid Build Coastguard Worker }
409*8975f5c5SAndroid Build Coastguard Worker 
410*8975f5c5SAndroid Build Coastguard Worker // Test extend rectangles
TEST(Rectangle,Extend)411*8975f5c5SAndroid Build Coastguard Worker TEST(Rectangle, Extend)
412*8975f5c5SAndroid Build Coastguard Worker {
413*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle source(0, 0, 100, 200);
414*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle extend1(0, 0, 50, 100);
415*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle result;
416*8975f5c5SAndroid Build Coastguard Worker 
417*8975f5c5SAndroid Build Coastguard Worker     //  +------+       +------+
418*8975f5c5SAndroid Build Coastguard Worker     //  |   |  |       |      |
419*8975f5c5SAndroid Build Coastguard Worker     //  +---+  |  -->  |      |
420*8975f5c5SAndroid Build Coastguard Worker     //  |      |       |      |
421*8975f5c5SAndroid Build Coastguard Worker     //  +------+       +------+
422*8975f5c5SAndroid Build Coastguard Worker     //
423*8975f5c5SAndroid Build Coastguard Worker     gl::ExtendRectangle(source, extend1, &result);
424*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x0(), 0);
425*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y0(), 0);
426*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x1(), 100);
427*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y1(), 200);
428*8975f5c5SAndroid Build Coastguard Worker 
429*8975f5c5SAndroid Build Coastguard Worker     //  +------+           +------+
430*8975f5c5SAndroid Build Coastguard Worker     //  |S     |           |      |
431*8975f5c5SAndroid Build Coastguard Worker     //  |   +--+---+  -->  |      |
432*8975f5c5SAndroid Build Coastguard Worker     //  |   |  |   |       |      |
433*8975f5c5SAndroid Build Coastguard Worker     //  +---+--+   +       +------+
434*8975f5c5SAndroid Build Coastguard Worker     //      |      |
435*8975f5c5SAndroid Build Coastguard Worker     //      +------+
436*8975f5c5SAndroid Build Coastguard Worker     //
437*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle extend2(50, 100, 100, 200);
438*8975f5c5SAndroid Build Coastguard Worker 
439*8975f5c5SAndroid Build Coastguard Worker     gl::ExtendRectangle(source, extend2, &result);
440*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x0(), 0);
441*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y0(), 0);
442*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x1(), 100);
443*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y1(), 200);
444*8975f5c5SAndroid Build Coastguard Worker 
445*8975f5c5SAndroid Build Coastguard Worker     //    +------+           +------+
446*8975f5c5SAndroid Build Coastguard Worker     //    |S     |           |      |
447*8975f5c5SAndroid Build Coastguard Worker     //  +-+------+---+  -->  |      |
448*8975f5c5SAndroid Build Coastguard Worker     //  | |      |   |       |      |
449*8975f5c5SAndroid Build Coastguard Worker     //  | +------+   +       |      |
450*8975f5c5SAndroid Build Coastguard Worker     //  |            |       |      |
451*8975f5c5SAndroid Build Coastguard Worker     //  +------------+       +------+
452*8975f5c5SAndroid Build Coastguard Worker     //
453*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle extend3(-10, 100, 200, 200);
454*8975f5c5SAndroid Build Coastguard Worker 
455*8975f5c5SAndroid Build Coastguard Worker     gl::ExtendRectangle(source, extend3, &result);
456*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x0(), 0);
457*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y0(), 0);
458*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x1(), 100);
459*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y1(), 300);
460*8975f5c5SAndroid Build Coastguard Worker 
461*8975f5c5SAndroid Build Coastguard Worker     //    +------+           +------+
462*8975f5c5SAndroid Build Coastguard Worker     //    |S     |           |      |
463*8975f5c5SAndroid Build Coastguard Worker     //    |      |      -->  |      |
464*8975f5c5SAndroid Build Coastguard Worker     //    |      |           |      |
465*8975f5c5SAndroid Build Coastguard Worker     //  +-+------+---+       |      |
466*8975f5c5SAndroid Build Coastguard Worker     //  |            |       |      |
467*8975f5c5SAndroid Build Coastguard Worker     //  +------------+       +------+
468*8975f5c5SAndroid Build Coastguard Worker     //
469*8975f5c5SAndroid Build Coastguard Worker     for (int offsetLeft = 10; offsetLeft >= 0; offsetLeft -= 10)
470*8975f5c5SAndroid Build Coastguard Worker     {
471*8975f5c5SAndroid Build Coastguard Worker         for (int offsetRight = 10; offsetRight >= 0; offsetRight -= 10)
472*8975f5c5SAndroid Build Coastguard Worker         {
473*8975f5c5SAndroid Build Coastguard Worker             const gl::Rectangle extend4(-offsetLeft, 200, 100 + offsetLeft + offsetRight, 100);
474*8975f5c5SAndroid Build Coastguard Worker 
475*8975f5c5SAndroid Build Coastguard Worker             gl::ExtendRectangle(source, extend4, &result);
476*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.x0(), 0) << offsetLeft << " " << offsetRight;
477*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.y0(), 0) << offsetLeft << " " << offsetRight;
478*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.x1(), 100) << offsetLeft << " " << offsetRight;
479*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.y1(), 300) << offsetLeft << " " << offsetRight;
480*8975f5c5SAndroid Build Coastguard Worker         }
481*8975f5c5SAndroid Build Coastguard Worker     }
482*8975f5c5SAndroid Build Coastguard Worker 
483*8975f5c5SAndroid Build Coastguard Worker     // Similar to extend4, but with the second rectangle on the top, left and right.
484*8975f5c5SAndroid Build Coastguard Worker     for (int offsetLeft = 10; offsetLeft >= 0; offsetLeft -= 10)
485*8975f5c5SAndroid Build Coastguard Worker     {
486*8975f5c5SAndroid Build Coastguard Worker         for (int offsetRight = 10; offsetRight >= 0; offsetRight -= 10)
487*8975f5c5SAndroid Build Coastguard Worker         {
488*8975f5c5SAndroid Build Coastguard Worker             const gl::Rectangle extend4(-offsetLeft, -100, 100 + offsetLeft + offsetRight, 100);
489*8975f5c5SAndroid Build Coastguard Worker 
490*8975f5c5SAndroid Build Coastguard Worker             gl::ExtendRectangle(source, extend4, &result);
491*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.x0(), 0) << offsetLeft << " " << offsetRight;
492*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.y0(), -100) << offsetLeft << " " << offsetRight;
493*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.x1(), 100) << offsetLeft << " " << offsetRight;
494*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.y1(), 200) << offsetLeft << " " << offsetRight;
495*8975f5c5SAndroid Build Coastguard Worker         }
496*8975f5c5SAndroid Build Coastguard Worker     }
497*8975f5c5SAndroid Build Coastguard Worker     for (int offsetTop = 10; offsetTop >= 0; offsetTop -= 10)
498*8975f5c5SAndroid Build Coastguard Worker     {
499*8975f5c5SAndroid Build Coastguard Worker         for (int offsetBottom = 10; offsetBottom >= 0; offsetBottom -= 10)
500*8975f5c5SAndroid Build Coastguard Worker         {
501*8975f5c5SAndroid Build Coastguard Worker             const gl::Rectangle extend4(-50, -offsetTop, 50, 200 + offsetTop + offsetBottom);
502*8975f5c5SAndroid Build Coastguard Worker 
503*8975f5c5SAndroid Build Coastguard Worker             gl::ExtendRectangle(source, extend4, &result);
504*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.x0(), -50) << offsetTop << " " << offsetBottom;
505*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.y0(), 0) << offsetTop << " " << offsetBottom;
506*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.x1(), 100) << offsetTop << " " << offsetBottom;
507*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.y1(), 200) << offsetTop << " " << offsetBottom;
508*8975f5c5SAndroid Build Coastguard Worker         }
509*8975f5c5SAndroid Build Coastguard Worker     }
510*8975f5c5SAndroid Build Coastguard Worker     for (int offsetTop = 10; offsetTop >= 0; offsetTop -= 10)
511*8975f5c5SAndroid Build Coastguard Worker     {
512*8975f5c5SAndroid Build Coastguard Worker         for (int offsetBottom = 10; offsetBottom >= 0; offsetBottom -= 10)
513*8975f5c5SAndroid Build Coastguard Worker         {
514*8975f5c5SAndroid Build Coastguard Worker             const gl::Rectangle extend4(100, -offsetTop, 50, 200 + offsetTop + offsetBottom);
515*8975f5c5SAndroid Build Coastguard Worker 
516*8975f5c5SAndroid Build Coastguard Worker             gl::ExtendRectangle(source, extend4, &result);
517*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.x0(), 0) << offsetTop << " " << offsetBottom;
518*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.y0(), 0) << offsetTop << " " << offsetBottom;
519*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.x1(), 150) << offsetTop << " " << offsetBottom;
520*8975f5c5SAndroid Build Coastguard Worker             ASSERT_EQ(result.y1(), 200) << offsetTop << " " << offsetBottom;
521*8975f5c5SAndroid Build Coastguard Worker         }
522*8975f5c5SAndroid Build Coastguard Worker     }
523*8975f5c5SAndroid Build Coastguard Worker 
524*8975f5c5SAndroid Build Coastguard Worker     //    +------+           +------+
525*8975f5c5SAndroid Build Coastguard Worker     //    |S     |           |      |
526*8975f5c5SAndroid Build Coastguard Worker     //    |      |      -->  |      |
527*8975f5c5SAndroid Build Coastguard Worker     //    |      |           |      |
528*8975f5c5SAndroid Build Coastguard Worker     //    +------+           +------+
529*8975f5c5SAndroid Build Coastguard Worker     //  +------------+
530*8975f5c5SAndroid Build Coastguard Worker     //  |            |
531*8975f5c5SAndroid Build Coastguard Worker     //  +------------+
532*8975f5c5SAndroid Build Coastguard Worker     //
533*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle extend5(-10, 201, 120, 100);
534*8975f5c5SAndroid Build Coastguard Worker 
535*8975f5c5SAndroid Build Coastguard Worker     gl::ExtendRectangle(source, extend5, &result);
536*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x0(), 0);
537*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y0(), 0);
538*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x1(), 100);
539*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y1(), 200);
540*8975f5c5SAndroid Build Coastguard Worker 
541*8975f5c5SAndroid Build Coastguard Worker     // Similar to extend5, but with the second rectangle on the top, left and right.
542*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle extend6(-10, -101, 120, 100);
543*8975f5c5SAndroid Build Coastguard Worker 
544*8975f5c5SAndroid Build Coastguard Worker     gl::ExtendRectangle(source, extend6, &result);
545*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x0(), 0);
546*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y0(), 0);
547*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x1(), 100);
548*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y1(), 200);
549*8975f5c5SAndroid Build Coastguard Worker 
550*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle extend7(-101, -10, 100, 220);
551*8975f5c5SAndroid Build Coastguard Worker 
552*8975f5c5SAndroid Build Coastguard Worker     gl::ExtendRectangle(source, extend7, &result);
553*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x0(), 0);
554*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y0(), 0);
555*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x1(), 100);
556*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y1(), 200);
557*8975f5c5SAndroid Build Coastguard Worker 
558*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle extend8(101, -10, 100, 220);
559*8975f5c5SAndroid Build Coastguard Worker 
560*8975f5c5SAndroid Build Coastguard Worker     gl::ExtendRectangle(source, extend8, &result);
561*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x0(), 0);
562*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y0(), 0);
563*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x1(), 100);
564*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y1(), 200);
565*8975f5c5SAndroid Build Coastguard Worker 
566*8975f5c5SAndroid Build Coastguard Worker     //  +-------------+       +-------------+
567*8975f5c5SAndroid Build Coastguard Worker     //  |   +------+  |       |             |
568*8975f5c5SAndroid Build Coastguard Worker     //  |   |S     |  |       |             |
569*8975f5c5SAndroid Build Coastguard Worker     //  |   |      |  |  -->  |             |
570*8975f5c5SAndroid Build Coastguard Worker     //  |   |      |  |       |             |
571*8975f5c5SAndroid Build Coastguard Worker     //  |   +------+  |       |             |
572*8975f5c5SAndroid Build Coastguard Worker     //  +-------------+       +-------------+
573*8975f5c5SAndroid Build Coastguard Worker     //
574*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle extend9(-100, -100, 300, 400);
575*8975f5c5SAndroid Build Coastguard Worker 
576*8975f5c5SAndroid Build Coastguard Worker     gl::ExtendRectangle(source, extend9, &result);
577*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x0(), -100);
578*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y0(), -100);
579*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.x1(), 200);
580*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(result.y1(), 300);
581*8975f5c5SAndroid Build Coastguard Worker }
582*8975f5c5SAndroid Build Coastguard Worker 
583*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
584