1 /* 2 * Copyright 2021 Google LLC. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "gm/gm.h" 9 #include "include/effects/SkRuntimeEffect.h" 10 #include "src/core/SkCanvasPriv.h" 11 #include "src/gpu/SurfaceFillContext.h" 12 #include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h" 13 #include "src/sksl/dsl/priv/DSLFPs.h" 14 #include "src/sksl/dsl/priv/DSLWriter.h" 15 #include "src/sksl/ir/SkSLVariable.h" 16 17 class SimpleDSLEffect : public GrFragmentProcessor { 18 public: 19 static constexpr GrProcessor::ClassID CLASS_ID = (GrProcessor::ClassID) 100; 20 SimpleDSLEffect()21 SimpleDSLEffect() : GrFragmentProcessor(CLASS_ID, kNone_OptimizationFlags) { 22 } 23 name() const24 const char* name() const override { return "DSLEffect"; } onAddToKey(const GrShaderCaps &,GrProcessorKeyBuilder *) const25 void onAddToKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override {} onIsEqual(const GrFragmentProcessor & that) const26 bool onIsEqual(const GrFragmentProcessor& that) const override { return this == &that; } clone() const27 std::unique_ptr<GrFragmentProcessor> clone() const override { return nullptr; } 28 onMakeProgramImpl() const29 std::unique_ptr<ProgramImpl> onMakeProgramImpl() const override { 30 class Impl : public ProgramImpl { 31 public: 32 void emitCode(EmitArgs& args) override { 33 using namespace SkSL::dsl; 34 StartFragmentProcessor(this, &args); 35 36 // Test for skbug.com/11384 37 Var x(kInt_Type, 1); 38 Declare(x); 39 SkASSERT(DSLWriter::Var(x)->initialValue()->description() == "1"); 40 41 GlobalVar blueAlpha(kUniform_Modifier, kHalf2_Type, "blueAlpha"); 42 Declare(blueAlpha); 43 fBlueAlphaUniform = VarUniformHandle(blueAlpha); 44 Var coords(kFloat4_Type, sk_FragCoord()); 45 Declare(coords); 46 Return(Half4(Swizzle(coords, X, Y) / 100, blueAlpha)); 47 EndFragmentProcessor(); 48 } 49 50 private: 51 void onSetData(const GrGLSLProgramDataManager& pdman, 52 const GrFragmentProcessor& effect) override { 53 pdman.set2f(fBlueAlphaUniform, 0.0, 1.0); 54 } 55 56 GrGLSLProgramDataManager::UniformHandle fBlueAlphaUniform; 57 }; 58 return std::make_unique<Impl>(); 59 } 60 }; 61 62 DEF_SIMPLE_GPU_GM(simple_dsl_test, rContext, canvas, 100, 100) { 63 auto sfc = SkCanvasPriv::TopDeviceSurfaceFillContext(canvas); 64 if (!sfc) { 65 return; 66 } 67 68 sfc->fillWithFP(std::make_unique<SimpleDSLEffect>()); 69 } 70