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 "gm/gm.h" 9cb93a386Sopenharmony_ci#include "include/effects/SkRuntimeEffect.h" 10cb93a386Sopenharmony_ci#include "src/core/SkCanvasPriv.h" 11cb93a386Sopenharmony_ci#include "src/gpu/SurfaceFillContext.h" 12cb93a386Sopenharmony_ci#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h" 13cb93a386Sopenharmony_ci#include "src/sksl/dsl/priv/DSLFPs.h" 14cb93a386Sopenharmony_ci#include "src/sksl/dsl/priv/DSLWriter.h" 15cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLVariable.h" 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ciclass SimpleDSLEffect : public GrFragmentProcessor { 18cb93a386Sopenharmony_cipublic: 19cb93a386Sopenharmony_ci static constexpr GrProcessor::ClassID CLASS_ID = (GrProcessor::ClassID) 100; 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ci SimpleDSLEffect() : GrFragmentProcessor(CLASS_ID, kNone_OptimizationFlags) { 22cb93a386Sopenharmony_ci } 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci const char* name() const override { return "DSLEffect"; } 25cb93a386Sopenharmony_ci void onAddToKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override {} 26cb93a386Sopenharmony_ci bool onIsEqual(const GrFragmentProcessor& that) const override { return this == &that; } 27cb93a386Sopenharmony_ci std::unique_ptr<GrFragmentProcessor> clone() const override { return nullptr; } 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci std::unique_ptr<ProgramImpl> onMakeProgramImpl() const override { 30cb93a386Sopenharmony_ci class Impl : public ProgramImpl { 31cb93a386Sopenharmony_ci public: 32cb93a386Sopenharmony_ci void emitCode(EmitArgs& args) override { 33cb93a386Sopenharmony_ci using namespace SkSL::dsl; 34cb93a386Sopenharmony_ci StartFragmentProcessor(this, &args); 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci // Test for skbug.com/11384 37cb93a386Sopenharmony_ci Var x(kInt_Type, 1); 38cb93a386Sopenharmony_ci Declare(x); 39cb93a386Sopenharmony_ci SkASSERT(DSLWriter::Var(x)->initialValue()->description() == "1"); 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci GlobalVar blueAlpha(kUniform_Modifier, kHalf2_Type, "blueAlpha"); 42cb93a386Sopenharmony_ci Declare(blueAlpha); 43cb93a386Sopenharmony_ci fBlueAlphaUniform = VarUniformHandle(blueAlpha); 44cb93a386Sopenharmony_ci Var coords(kFloat4_Type, sk_FragCoord()); 45cb93a386Sopenharmony_ci Declare(coords); 46cb93a386Sopenharmony_ci Return(Half4(Swizzle(coords, X, Y) / 100, blueAlpha)); 47cb93a386Sopenharmony_ci EndFragmentProcessor(); 48cb93a386Sopenharmony_ci } 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ci private: 51cb93a386Sopenharmony_ci void onSetData(const GrGLSLProgramDataManager& pdman, 52cb93a386Sopenharmony_ci const GrFragmentProcessor& effect) override { 53cb93a386Sopenharmony_ci pdman.set2f(fBlueAlphaUniform, 0.0, 1.0); 54cb93a386Sopenharmony_ci } 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci GrGLSLProgramDataManager::UniformHandle fBlueAlphaUniform; 57cb93a386Sopenharmony_ci }; 58cb93a386Sopenharmony_ci return std::make_unique<Impl>(); 59cb93a386Sopenharmony_ci } 60cb93a386Sopenharmony_ci}; 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ciDEF_SIMPLE_GPU_GM(simple_dsl_test, rContext, canvas, 100, 100) { 63cb93a386Sopenharmony_ci auto sfc = SkCanvasPriv::TopDeviceSurfaceFillContext(canvas); 64cb93a386Sopenharmony_ci if (!sfc) { 65cb93a386Sopenharmony_ci return; 66cb93a386Sopenharmony_ci } 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci sfc->fillWithFP(std::make_unique<SimpleDSLEffect>()); 69cb93a386Sopenharmony_ci} 70