1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2021 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "tests/Test.h"
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h"
11cb93a386Sopenharmony_ci#include "src/gpu/tessellate/CullTest.h"
12cb93a386Sopenharmony_ci
13cb93a386Sopenharmony_cinamespace skgpu {
14cb93a386Sopenharmony_ci
15cb93a386Sopenharmony_ciconst SkMatrix gMatrices[] = {
16cb93a386Sopenharmony_ci    SkMatrix::I(),
17cb93a386Sopenharmony_ci    SkMatrix::Translate(25, -1000),
18cb93a386Sopenharmony_ci    SkMatrix::Scale(.5f, 1000.1f),
19cb93a386Sopenharmony_ci    SkMatrix::MakeAll(1000.1f, .0f,  -100,
20cb93a386Sopenharmony_ci                         0.0f, .5f, -3000,
21cb93a386Sopenharmony_ci                         0.0f, .0f,     1),
22cb93a386Sopenharmony_ci    SkMatrix::MakeAll(0, 1, 0,
23cb93a386Sopenharmony_ci                      1, 0, 0,
24cb93a386Sopenharmony_ci                      0, 0, 1),
25cb93a386Sopenharmony_ci    SkMatrix::MakeAll(    2, 7.0f, -100,
26cb93a386Sopenharmony_ci                      -8000,  .5f, 2000,
27cb93a386Sopenharmony_ci                          0,  .0f,    1),
28cb93a386Sopenharmony_ci};
29cb93a386Sopenharmony_ci
30cb93a386Sopenharmony_ciDEF_TEST(CullTestTest, reporter) {
31cb93a386Sopenharmony_ci    SkRandom rand;
32cb93a386Sopenharmony_ci    float l=10, t=2000, r=100, b=2064;
33cb93a386Sopenharmony_ci    SkRect viewportRect{l, t, r, b};
34cb93a386Sopenharmony_ci    float valuesL[4] = {l-20, l-10, l+10, l+20};
35cb93a386Sopenharmony_ci    float valuesT[4] = {t-20, t-10, t+10, t+20};
36cb93a386Sopenharmony_ci    float valuesR[4] = {r+20, r+10, r-10, r-20};
37cb93a386Sopenharmony_ci    float valuesB[4] = {b+20, b+10, b-10, b-20};
38cb93a386Sopenharmony_ci    for (SkMatrix m : gMatrices) {
39cb93a386Sopenharmony_ci        CullTest cullTest(viewportRect, m);
40cb93a386Sopenharmony_ci        SkMatrix inverse;
41cb93a386Sopenharmony_ci        SkAssertResult(m.invert(&inverse));
42cb93a386Sopenharmony_ci        for (const float* y : {valuesT, valuesB}) {
43cb93a386Sopenharmony_ci        for (const float* x : {valuesL, valuesR}) {
44cb93a386Sopenharmony_ci        for (int i = 0; i < 500; ++i) {
45cb93a386Sopenharmony_ci            int mask = rand.nextU();
46cb93a386Sopenharmony_ci            const SkPoint devPts[4] = {{x[(mask >>  0) & 3], y[(mask >>  2) & 3]},
47cb93a386Sopenharmony_ci                                       {x[(mask >>  4) & 3], y[(mask >>  6) & 3]},
48cb93a386Sopenharmony_ci                                       {x[(mask >>  8) & 3], y[(mask >> 10) & 3]},
49cb93a386Sopenharmony_ci                                       {x[(mask >> 12) & 3], y[(mask >> 14) & 3]}};
50cb93a386Sopenharmony_ci
51cb93a386Sopenharmony_ci            SkPoint localPts[4];
52cb93a386Sopenharmony_ci            inverse.mapPoints(localPts, devPts, 4);
53cb93a386Sopenharmony_ci
54cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter,
55cb93a386Sopenharmony_ci                            cullTest.isVisible(localPts[0]) ==
56cb93a386Sopenharmony_ci                            viewportRect.contains(devPts[0].fX, devPts[0].fY));
57cb93a386Sopenharmony_ci
58cb93a386Sopenharmony_ci            {
59cb93a386Sopenharmony_ci                SkRect devBounds3;
60cb93a386Sopenharmony_ci                devBounds3.setBounds(devPts, 3);
61cb93a386Sopenharmony_ci                // Outset devBounds because SkRect::intersects returns false on empty, which is NOT
62cb93a386Sopenharmony_ci                // the behavior we want.
63cb93a386Sopenharmony_ci                devBounds3.outset(1e-3f, 1e-3f);
64cb93a386Sopenharmony_ci                REPORTER_ASSERT(reporter,
65cb93a386Sopenharmony_ci                        cullTest.areVisible3(localPts) == viewportRect.intersects(devBounds3));
66cb93a386Sopenharmony_ci            }
67cb93a386Sopenharmony_ci
68cb93a386Sopenharmony_ci            {
69cb93a386Sopenharmony_ci                SkRect devBounds4;
70cb93a386Sopenharmony_ci                devBounds4.setBounds(devPts, 4);
71cb93a386Sopenharmony_ci                // Outset devBounds because SkRect::intersects returns false on empty, which is NOT
72cb93a386Sopenharmony_ci                // the behavior we want.
73cb93a386Sopenharmony_ci                devBounds4.outset(1e-3f, 1e-3f);
74cb93a386Sopenharmony_ci                REPORTER_ASSERT(reporter,
75cb93a386Sopenharmony_ci                        cullTest.areVisible4(localPts) == viewportRect.intersects(devBounds4));
76cb93a386Sopenharmony_ci            }
77cb93a386Sopenharmony_ci        }}}
78cb93a386Sopenharmony_ci    }
79cb93a386Sopenharmony_ci}
80cb93a386Sopenharmony_ci
81cb93a386Sopenharmony_ci}  // namespace skgpu
82