1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SKSL_SETTING 9*c8dee2aaSAndroid Build Coastguard Worker #define SKSL_SETTING 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLPosition.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLUtil.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLExpression.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLIRNode.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 17*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 18*c8dee2aaSAndroid Build Coastguard Worker #include <string> 19*c8dee2aaSAndroid Build Coastguard Worker #include <string_view> 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker namespace SkSL { 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker class Context; 25*c8dee2aaSAndroid Build Coastguard Worker class Type; 26*c8dee2aaSAndroid Build Coastguard Worker enum class OperatorPrecedence : uint8_t; 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker /** 29*c8dee2aaSAndroid Build Coastguard Worker * Represents a compile-time constant setting, such as sk_Caps.integerSupport. These IRNodes are 30*c8dee2aaSAndroid Build Coastguard Worker * used when assembling a module. These nodes are replaced with the value of the setting during 31*c8dee2aaSAndroid Build Coastguard Worker * compilation when ShaderCaps are available. 32*c8dee2aaSAndroid Build Coastguard Worker */ 33*c8dee2aaSAndroid Build Coastguard Worker class Setting final : public Expression { 34*c8dee2aaSAndroid Build Coastguard Worker public: 35*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr Kind kIRNodeKind = Kind::kSetting; 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker using CapsPtr = const bool ShaderCaps::*; 38*c8dee2aaSAndroid Build Coastguard Worker Setting(Position pos,CapsPtr capsPtr,const Type * type)39*c8dee2aaSAndroid Build Coastguard Worker Setting(Position pos, CapsPtr capsPtr, const Type* type) 40*c8dee2aaSAndroid Build Coastguard Worker : INHERITED(pos, kIRNodeKind, type) 41*c8dee2aaSAndroid Build Coastguard Worker , fCapsPtr(capsPtr) {} 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker // Creates the current value of the associated caps bit as a Literal if ShaderCaps are 44*c8dee2aaSAndroid Build Coastguard Worker // available, or a Setting IRNode when ShaderCaps are not known. Reports errors via the 45*c8dee2aaSAndroid Build Coastguard Worker // ErrorReporter. 46*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<Expression> Convert(const Context& context, 47*c8dee2aaSAndroid Build Coastguard Worker Position pos, 48*c8dee2aaSAndroid Build Coastguard Worker const std::string_view& name); 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker // Creates the current value of the passed-in caps bit as a Literal if ShaderCaps are 51*c8dee2aaSAndroid Build Coastguard Worker // available, or a Setting IRNode when ShaderCaps are not known. 52*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<Expression> Make(const Context& context, Position pos, CapsPtr capsPtr); 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker // Converts a Setting expression to its actual ShaderCaps value (boolean true/false). 55*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Expression> toLiteral(const ShaderCaps& caps) const; 56*c8dee2aaSAndroid Build Coastguard Worker clone(Position pos)57*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Expression> clone(Position pos) const override { 58*c8dee2aaSAndroid Build Coastguard Worker return std::make_unique<Setting>(pos, fCapsPtr, &this->type()); 59*c8dee2aaSAndroid Build Coastguard Worker } 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker std::string_view name() const; 62*c8dee2aaSAndroid Build Coastguard Worker capsPtr()63*c8dee2aaSAndroid Build Coastguard Worker CapsPtr capsPtr() const { return fCapsPtr; } 64*c8dee2aaSAndroid Build Coastguard Worker description(OperatorPrecedence)65*c8dee2aaSAndroid Build Coastguard Worker std::string description(OperatorPrecedence) const override { 66*c8dee2aaSAndroid Build Coastguard Worker return "sk_Caps." + std::string(this->name()); 67*c8dee2aaSAndroid Build Coastguard Worker } 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker private: 70*c8dee2aaSAndroid Build Coastguard Worker CapsPtr fCapsPtr; 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Expression; 73*c8dee2aaSAndroid Build Coastguard Worker }; 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker } // namespace SkSL 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker #endif 78