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