diff --git a/include/sirit/sirit.h b/include/sirit/sirit.h index 1118767..eb68c00 100644 --- a/include/sirit/sirit.h +++ b/include/sirit/sirit.h @@ -137,12 +137,16 @@ public: /// Returns a numeric scalar constant. Ref ConstantComposite(Ref result_type, const std::vector& constituents); + /// Returns a sampler constant. + Ref ConstantSampler(Ref result_type, spv::SamplerAddressingMode addressing_mode, + bool normalized, spv::SamplerFilterMode filter_mode); + // Function - /// Emits a function. + /// Declares a function. Ref Function(Ref result_type, spv::FunctionControlMask function_control, Ref function_type); - /// Emits a function end. + /// Ends a function. Ref FunctionEnd(); // Flow diff --git a/src/insts.h b/src/insts.h index 0e75141..68f3998 100644 --- a/src/insts.h +++ b/src/insts.h @@ -11,4 +11,9 @@ namespace Sirit { +template +inline void AddEnum(Op* op, T value) { + op->Add(static_cast(value)); +} + } // namespace Sirit diff --git a/src/insts/constant.cpp b/src/insts/constant.cpp index d691583..90af194 100644 --- a/src/insts/constant.cpp +++ b/src/insts/constant.cpp @@ -30,4 +30,15 @@ Ref Module::ConstantComposite(Ref result_type, const std::vector& constitue return AddDeclaration(op); } +Ref Module::ConstantSampler(Ref result_type, spv::SamplerAddressingMode addressing_mode, + bool normalized, spv::SamplerFilterMode filter_mode) { + AddCapability(spv::Capability::LiteralSampler); + AddCapability(spv::Capability::Kernel); + Op* op{new Op(spv::Op::OpConstantSampler, bound, result_type)}; + AddEnum(op, addressing_mode); + op->Add(normalized ? 1 : 0); + AddEnum(op, filter_mode); + return AddDeclaration(op); +} + } // namespace Sirit diff --git a/src/op.h b/src/op.h index 8c884bc..45d62f9 100644 --- a/src/op.h +++ b/src/op.h @@ -34,7 +34,7 @@ public: void Add(const std::string& string); void Add(const std::vector& ids); - + private: u16 WordCount() const; diff --git a/tests/main.cpp b/tests/main.cpp index 2f60422..2df624e 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -20,7 +20,6 @@ public: // Type testing TypeBool(); TypeBool(); - TypeInt(64, true); TypeInt(64, false); TypeInt(16, false); TypeFloat(16); @@ -32,11 +31,11 @@ public: TypeImage(TypeFloat(32), spv::Dim::Dim2D, 0, false, false, 0, spv::ImageFormat::Rg32f); TypeSampledImage(TypeImage(TypeFloat(32), spv::Dim::Rect, 0, false, false, 0, - spv::ImageFormat::Rg32f)); - TypeVector(TypeInt(32, true), 4); - TypeVector(TypeInt(64, true), 4); - TypeRuntimeArray(TypeInt(32, true)); - TypeStruct({TypeInt(32, true), TypeFloat(64)}); + spv::ImageFormat::Rg32f)); + TypeVector(TypeInt(32, false), 4); + TypeVector(TypeInt(64, false), 4); + TypeRuntimeArray(TypeInt(32, false)); + TypeStruct({TypeInt(32, false), TypeFloat(64)}); TypePointer(spv::StorageClass::Private, TypeFloat(16)); ConstantTrue(TypeBool()); ConstantTrue(TypeBool());