text: /*
   * 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<GrFragmentProcessor> clone() const override { return nullptr; }
  
      std::unique_ptr<ProgramImpl> 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<Impl>();
      }
  };
  
  DEF_SIMPLE_GPU_GM(simple_dsl_test, rContext, canvas, 100, 100) {
      auto sfc = SkCanvasPriv::TopDeviceSurfaceFillContext(canvas);
      if (!sfc) {
          return;
      }
  
      sfc->fillWithFP(std::make_unique<SimpleDSLEffect>());
  }
  