/* * Copyright 2021 Google LLC. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "gm/gm.h" #include "include/effects/SkRuntimeEffect.h" #include "include/sksl/DSL.h" #include "src/core/SkCanvasPriv.h" #include "src/gpu/ganesh/SurfaceFillContext.h" #include "src/gpu/ganesh/glsl/GrGLSLFragmentShaderBuilder.h" #include "src/sksl/dsl/priv/DSLFPs.h" #include "src/sksl/dsl/priv/DSLWriter.h" #include "src/sksl/ir/SkSLVariable.h" class SimpleDSLEffect : public GrFragmentProcessor { public: static constexpr GrProcessor::ClassID CLASS_ID = (GrProcessor::ClassID) 100; SimpleDSLEffect() : GrFragmentProcessor(CLASS_ID, kNone_OptimizationFlags) { } const char* name() const override { return "DSLEffect"; } void onAddToKey(const GrShaderCaps&, skgpu::KeyBuilder*) const override {} bool onIsEqual(const GrFragmentProcessor& that) const override { return this == &that; } std::unique_ptr clone() const override { return nullptr; } std::unique_ptr onMakeProgramImpl() const override { class Impl : public ProgramImpl { public: void emitCode(EmitArgs& args) override { using namespace SkSL::dsl; StartFragmentProcessor(this, &args); // Test for skbug.com/11384 Var x(kInt_Type, 1); Declare(x); SkASSERT(DSLWriter::Var(x)->initialValue()->description() == "1"); GlobalVar blueAlpha(kUniform_Modifier, kHalf2_Type, "blueAlpha"); Declare(blueAlpha); fBlueAlphaUniform = VarUniformHandle(blueAlpha); Var coords(kFloat4_Type, sk_FragCoord()); Declare(coords); Return(Half4(Swizzle(coords, X, Y) / 100, blueAlpha)); EndFragmentProcessor(); } private: void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& effect) override { pdman.set2f(fBlueAlphaUniform, 0.0, 1.0); } GrGLSLProgramDataManager::UniformHandle fBlueAlphaUniform; }; return std::make_unique(); } }; DEF_SIMPLE_GPU_GM(simple_dsl_test, rContext, canvas, 100, 100) { auto sfc = SkCanvasPriv::TopDeviceSurfaceFillContext(canvas); if (!sfc) { return; } sfc->fillWithFP(std::make_unique()); }