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 #ifndef SKSL_CONSTRUCTOR_SPLAT 9 #define SKSL_CONSTRUCTOR_SPLAT 10 11 #include "src/sksl/SkSLContext.h" 12 #include "src/sksl/ir/SkSLConstructor.h" 13 #include "src/sksl/ir/SkSLExpression.h" 14 15 #include <memory> 16 17 namespace SkSL { 18 19 /** 20 * Represents the construction of a vector splat, such as `half3(n)`. 21 * 22 * These always contain exactly 1 scalar. 23 */ 24 class ConstructorSplat final : public SingleArgumentConstructor { 25 public: 26 inline static constexpr Kind kExpressionKind = Kind::kConstructorSplat; 27 ConstructorSplat(int line,const Type & type,std::unique_ptr<Expression> arg)28 ConstructorSplat(int line, const Type& type, std::unique_ptr<Expression> arg) 29 : INHERITED(line, kExpressionKind, &type, std::move(arg)) {} 30 31 // The input argument must be scalar. A "splat" to a scalar type will be optimized into a no-op. 32 static std::unique_ptr<Expression> Make(const Context& context, 33 int line, 34 const Type& type, 35 std::unique_ptr<Expression> arg); 36 clone()37 std::unique_ptr<Expression> clone() const override { 38 return std::make_unique<ConstructorSplat>(fLine, this->type(), argument()->clone()); 39 } 40 supportsConstantValues()41 bool supportsConstantValues() const override { 42 return true; 43 } 44 getConstantValue(int n)45 std::optional<double> getConstantValue(int n) const override { 46 SkASSERT(n >= 0 && n < this->type().columns()); 47 return this->argument()->getConstantValue(0); 48 } 49 50 private: 51 using INHERITED = SingleArgumentConstructor; 52 }; 53 54 } // namespace SkSL 55 56 #endif 57