| /* | 
 |  * Copyright 2024 Google LLC | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 | #include "include/core/SkTypes.h" | 
 | #include "src/sksl/SkSLCompiler.h" | 
 | #include "src/sksl/SkSLProgramKind.h" | 
 | #include "src/sksl/SkSLProgramSettings.h" | 
 | #include "src/sksl/SkSLUtil.h" | 
 | #include "src/sksl/codegen/SkSLPipelineStageCodeGenerator.h" | 
 | #include "src/sksl/ir/SkSLProgram.h" | 
 | #include "src/sksl/ir/SkSLVarDeclarations.h" | 
 | #include "tests/Test.h" | 
 |  | 
 | #include <memory> | 
 | #include <string> | 
 |  | 
 | static void test(skiatest::Reporter* r, | 
 |                  const char* src, | 
 |                  SkSL::ProgramKind kind = SkSL::ProgramKind::kPrivateRuntimeShader) { | 
 |     // These callbacks match the behavior of skslc when given a .stage file. | 
 |     class Callbacks : public SkSL::PipelineStage::Callbacks { | 
 |     public: | 
 |         std::string getMangledName(const char* name) override { | 
 |             return std::string(name) + "_0"; | 
 |         } | 
 |  | 
 |         std::string declareUniform(const SkSL::VarDeclaration* decl) override { | 
 |             fOutput += decl->description(); | 
 |             return std::string(decl->var()->name()); | 
 |         } | 
 |  | 
 |         void defineFunction(const char* decl, const char* body, bool /*isMain*/) override { | 
 |             fOutput += std::string(decl) + '{' + body + '}'; | 
 |         } | 
 |  | 
 |         void declareFunction(const char* decl) override { fOutput += decl; } | 
 |  | 
 |         void defineStruct(const char* definition) override { fOutput += definition; } | 
 |  | 
 |         void declareGlobal(const char* declaration) override { fOutput += declaration; } | 
 |  | 
 |         std::string sampleShader(int index, std::string coords) override { | 
 |             return "child_" + std::to_string(index) + ".eval(" + coords + ')'; | 
 |         } | 
 |  | 
 |         std::string sampleColorFilter(int index, std::string color) override { | 
 |             return "child_" + std::to_string(index) + ".eval(" + color + ')'; | 
 |         } | 
 |  | 
 |         std::string sampleBlender(int index, std::string src, std::string dst) override { | 
 |             return "child_" + std::to_string(index) + ".eval(" + src + ", " + dst + ')'; | 
 |         } | 
 |  | 
 |         std::string toLinearSrgb(std::string color) override { | 
 |             return "toLinearSrgb(" + color + ')'; | 
 |         } | 
 |         std::string fromLinearSrgb(std::string color) override { | 
 |             return "fromLinearSrgb(" + color + ')'; | 
 |         } | 
 |  | 
 |         std::string fOutput; | 
 |     }; | 
 |  | 
 |     SkSL::Compiler compiler; | 
 |     SkSL::ProgramSettings settings; | 
 |     std::unique_ptr<SkSL::Program> program = compiler.convertProgram(kind, std::string(src), | 
 |                                                                      settings); | 
 |     if (!program) { | 
 |         SkDebugf("Unexpected error compiling %s\n%s", src, compiler.errorText().c_str()); | 
 |         REPORTER_ASSERT(r, program); | 
 |     } else { | 
 |         Callbacks callbacks; | 
 |         SkSL::PipelineStage::ConvertProgram(*program, "_coords", "_inColor", | 
 |                                             "_canvasColor", &callbacks); | 
 |         REPORTER_ASSERT(r, !callbacks.fOutput.empty()); | 
 |         // SkDebugf("Pipeline stage output:\n\n%s", callbacks.fOutput.c_str()); | 
 |     } | 
 | } | 
 |  | 
 | DEF_TEST(SkSLPipelineStageTestbed, r) { | 
 |     // Add in your SkSL here. | 
 |     test(r, | 
 |          R"__SkSL__( | 
 |              half4 main(float2) { | 
 |                  return half4(0); | 
 |              } | 
 |          )__SkSL__"); | 
 | } |