1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2021 Google LLC
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 "experimental/graphite/src/ContextUtils.h"
11cb93a386Sopenharmony_ci#include "experimental/graphite/src/UniformCache.h"
12cb93a386Sopenharmony_ci#include "include/core/SkPaint.h"
13cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h"
14cb93a386Sopenharmony_ci
15cb93a386Sopenharmony_cinamespace {
16cb93a386Sopenharmony_ci
17cb93a386Sopenharmony_cistd::tuple<SkPaint, int> create_paint(skgpu::Combination combo) {
18cb93a386Sopenharmony_ci    SkPoint pts[2] = {{-100, -100},
19cb93a386Sopenharmony_ci                      {100,  100}};
20cb93a386Sopenharmony_ci    SkColor colors[2] = {SK_ColorRED, SK_ColorGREEN};
21cb93a386Sopenharmony_ci    SkScalar offsets[2] = {0.0f, 1.0f};
22cb93a386Sopenharmony_ci
23cb93a386Sopenharmony_ci    sk_sp<SkShader> s;
24cb93a386Sopenharmony_ci    int numUniforms = 0;
25cb93a386Sopenharmony_ci    switch (combo.fShaderType) {
26cb93a386Sopenharmony_ci        case skgpu::ShaderCombo::ShaderType::kNone:
27cb93a386Sopenharmony_ci            numUniforms += 1;
28cb93a386Sopenharmony_ci            break;
29cb93a386Sopenharmony_ci        case skgpu::ShaderCombo::ShaderType::kLinearGradient:
30cb93a386Sopenharmony_ci            s = SkGradientShader::MakeLinear(pts, colors, offsets, 2, combo.fTileMode);
31cb93a386Sopenharmony_ci            numUniforms += 6;
32cb93a386Sopenharmony_ci            break;
33cb93a386Sopenharmony_ci        case skgpu::ShaderCombo::ShaderType::kRadialGradient:
34cb93a386Sopenharmony_ci            s = SkGradientShader::MakeRadial({0, 0}, 100, colors, offsets, 2, combo.fTileMode);
35cb93a386Sopenharmony_ci            numUniforms += 6;
36cb93a386Sopenharmony_ci            break;
37cb93a386Sopenharmony_ci        case skgpu::ShaderCombo::ShaderType::kSweepGradient:
38cb93a386Sopenharmony_ci            s = SkGradientShader::MakeSweep(0, 0, colors, offsets, 2, combo.fTileMode,
39cb93a386Sopenharmony_ci                                            0, 359, 0, nullptr);
40cb93a386Sopenharmony_ci            numUniforms += 6;
41cb93a386Sopenharmony_ci            break;
42cb93a386Sopenharmony_ci        case skgpu::ShaderCombo::ShaderType::kConicalGradient:
43cb93a386Sopenharmony_ci            s = SkGradientShader::MakeTwoPointConical({100, 100}, 100,
44cb93a386Sopenharmony_ci                                                      {-100, -100}, 100,
45cb93a386Sopenharmony_ci                                                      colors, offsets, 2, combo.fTileMode);
46cb93a386Sopenharmony_ci            numUniforms += 6;
47cb93a386Sopenharmony_ci            break;
48cb93a386Sopenharmony_ci    }
49cb93a386Sopenharmony_ci    SkPaint p;
50cb93a386Sopenharmony_ci    p.setColor(SK_ColorRED);
51cb93a386Sopenharmony_ci    p.setShader(std::move(s));
52cb93a386Sopenharmony_ci    p.setBlendMode(combo.fBlendMode);
53cb93a386Sopenharmony_ci    return { p, numUniforms };
54cb93a386Sopenharmony_ci}
55cb93a386Sopenharmony_ci
56cb93a386Sopenharmony_ci} // anonymous namespace
57cb93a386Sopenharmony_ci
58cb93a386Sopenharmony_ciDEF_GRAPHITE_TEST(UniformTest, reporter) {
59cb93a386Sopenharmony_ci    using namespace skgpu;
60cb93a386Sopenharmony_ci
61cb93a386Sopenharmony_ci    UniformCache cache;
62cb93a386Sopenharmony_ci
63cb93a386Sopenharmony_ci    for (auto s : { ShaderCombo::ShaderType::kNone,
64cb93a386Sopenharmony_ci                    ShaderCombo::ShaderType::kLinearGradient,
65cb93a386Sopenharmony_ci                    ShaderCombo::ShaderType::kRadialGradient,
66cb93a386Sopenharmony_ci                    ShaderCombo::ShaderType::kSweepGradient,
67cb93a386Sopenharmony_ci                    ShaderCombo::ShaderType::kConicalGradient }) {
68cb93a386Sopenharmony_ci        for (auto tm: { SkTileMode::kClamp,
69cb93a386Sopenharmony_ci                        SkTileMode::kRepeat,
70cb93a386Sopenharmony_ci                        SkTileMode::kMirror,
71cb93a386Sopenharmony_ci                        SkTileMode::kDecal }) {
72cb93a386Sopenharmony_ci            if (s == ShaderCombo::ShaderType::kNone) {
73cb93a386Sopenharmony_ci                tm = SkTileMode::kRepeat;  // the TileMode doesn't matter for this case
74cb93a386Sopenharmony_ci            }
75cb93a386Sopenharmony_ci
76cb93a386Sopenharmony_ci            for (auto bm : { SkBlendMode::kSrc, SkBlendMode::kSrcOver }) {
77cb93a386Sopenharmony_ci                Combination expected;
78cb93a386Sopenharmony_ci
79cb93a386Sopenharmony_ci                expected.fShaderType = s;
80cb93a386Sopenharmony_ci                expected.fTileMode = tm;
81cb93a386Sopenharmony_ci                expected.fBlendMode = bm;
82cb93a386Sopenharmony_ci
83cb93a386Sopenharmony_ci                auto [ p, expectedNumUniforms ] = create_paint(expected);
84cb93a386Sopenharmony_ci                auto [ actual, ud] = ExtractCombo(&cache, p);
85cb93a386Sopenharmony_ci                REPORTER_ASSERT(reporter, expected == actual);
86cb93a386Sopenharmony_ci                REPORTER_ASSERT(reporter, expectedNumUniforms == ud->count());
87cb93a386Sopenharmony_ci                for (int i = 0; i < ud->count(); ++i) {
88cb93a386Sopenharmony_ci                    REPORTER_ASSERT(reporter, ud->offset(i) >= 0 && ud->offset(i) < ud->dataSize());
89cb93a386Sopenharmony_ci                }
90cb93a386Sopenharmony_ci                REPORTER_ASSERT(reporter, ud->id() != UniformData::kInvalidUniformID);
91cb93a386Sopenharmony_ci            }
92cb93a386Sopenharmony_ci        }
93cb93a386Sopenharmony_ci    }
94cb93a386Sopenharmony_ci}
95