[ir][spirv-writer] Add builder to create constants The SPIRV-Writer has to create a few constants, currently it uses the IR directly and the `constant_values` constant::Manager. This CL adds the `Builder` into the SPIRV-Writer and then uses the buider helper methods to create the constants. Bug: tint:1906 Change-Id: I6722dfeb6da2c24cb86d3dceb21443bf23ee17db Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/144321 Reviewed-by: James Price <jrprice@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc index ef086ee..5b81aba3 100644 --- a/src/tint/lang/spirv/writer/printer/printer.cc +++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -150,7 +150,7 @@ } // namespace Printer::Printer(ir::Module* module, bool zero_init_workgroup_mem) - : ir_(module), zero_init_workgroup_memory_(zero_init_workgroup_mem) {} + : ir_(module), b_(*module), zero_init_workgroup_memory_(zero_init_workgroup_mem) {} Result<std::vector<uint32_t>, std::string> Printer::Generate() { auto valid = ir::ValidateAndDumpIfNeeded(*ir_, "SPIR-V writer"); @@ -355,7 +355,7 @@ }, [&](const type::Array* arr) { if (arr->ConstantCount()) { - auto* count = ir_->constant_values.Get(u32(arr->ConstantCount().value())); + auto* count = b_.ConstantValue(u32(arr->ConstantCount().value())); module_.PushType(spv::Op::OpTypeArray, {id, Type(arr->ElemType()), Constant(count)}); } else { @@ -1341,11 +1341,11 @@ case builtin::Function::kStorageBarrier: op = spv::Op::OpControlBarrier; operands.clear(); - operands.push_back(Constant(ir_->constant_values.Get(u32(spv::Scope::Workgroup)))); - operands.push_back(Constant(ir_->constant_values.Get(u32(spv::Scope::Workgroup)))); + operands.push_back(Constant(b_.ConstantValue(u32(spv::Scope::Workgroup)))); + operands.push_back(Constant(b_.ConstantValue(u32(spv::Scope::Workgroup)))); operands.push_back( - Constant(ir_->constant_values.Get(u32(spv::MemorySemanticsMask::UniformMemory | - spv::MemorySemanticsMask::AcquireRelease)))); + Constant(b_.ConstantValue(u32(spv::MemorySemanticsMask::UniformMemory | + spv::MemorySemanticsMask::AcquireRelease)))); break; case builtin::Function::kSubgroupBallot: module_.PushCapability(SpvCapabilityGroupNonUniformBallot); @@ -1391,11 +1391,11 @@ case builtin::Function::kWorkgroupBarrier: op = spv::Op::OpControlBarrier; operands.clear(); - operands.push_back(Constant(ir_->constant_values.Get(u32(spv::Scope::Workgroup)))); - operands.push_back(Constant(ir_->constant_values.Get(u32(spv::Scope::Workgroup)))); + operands.push_back(Constant(b_.ConstantValue(u32(spv::Scope::Workgroup)))); + operands.push_back(Constant(b_.ConstantValue(u32(spv::Scope::Workgroup)))); operands.push_back( - Constant(ir_->constant_values.Get(u32(spv::MemorySemanticsMask::WorkgroupMemory | - spv::MemorySemanticsMask::AcquireRelease)))); + Constant(b_.ConstantValue(u32(spv::MemorySemanticsMask::WorkgroupMemory | + spv::MemorySemanticsMask::AcquireRelease)))); break; default: TINT_ICE() << "unimplemented builtin function: " << builtin->Func(); @@ -1471,37 +1471,37 @@ operands.push_back(ConstantNull(arg_ty)); } else if (arg_ty->is_bool_scalar_or_vector()) { // Select between constant one and zero, splatting them to vectors if necessary. - const constant::Value* one = nullptr; - const constant::Value* zero = nullptr; + ir::Constant* one = nullptr; + ir::Constant* zero = nullptr; Switch( res_ty->DeepestElement(), // [&](const type::F32*) { - one = ir_->constant_values.Get(1_f); - zero = ir_->constant_values.Get(0_f); + one = b_.Constant(1_f); + zero = b_.Constant(0_f); }, [&](const type::F16*) { - one = ir_->constant_values.Get(1_h); - zero = ir_->constant_values.Get(0_h); + one = b_.Constant(1_h); + zero = b_.Constant(0_h); }, [&](const type::I32*) { - one = ir_->constant_values.Get(1_i); - zero = ir_->constant_values.Get(0_i); + one = b_.Constant(1_i); + zero = b_.Constant(0_i); }, [&](const type::U32*) { - one = ir_->constant_values.Get(1_u); - zero = ir_->constant_values.Get(0_u); + one = b_.Constant(1_u); + zero = b_.Constant(0_u); }); TINT_ASSERT_OR_RETURN(one && zero); if (auto* vec = res_ty->As<type::Vector>()) { // Splat the scalars into vectors. - one = ir_->constant_values.Splat(vec, one, vec->Width()); - zero = ir_->constant_values.Splat(vec, zero, vec->Width()); + one = b_.Splat(vec, one, vec->Width()); + zero = b_.Splat(vec, zero, vec->Width()); } op = spv::Op::OpSelect; - operands.push_back(Constant(one)); - operands.push_back(Constant(zero)); + operands.push_back(Constant(b_.ConstantValue(one))); + operands.push_back(Constant(b_.ConstantValue(zero))); } else { TINT_ICE() << "unhandled convert instruction"; }
diff --git a/src/tint/lang/spirv/writer/printer/printer.h b/src/tint/lang/spirv/writer/printer/printer.h index 7c292a7..5f1c085 100644 --- a/src/tint/lang/spirv/writer/printer/printer.h +++ b/src/tint/lang/spirv/writer/printer/printer.h
@@ -22,6 +22,7 @@ #include "src/tint/lang/core/builtin/builtin_value.h" #include "src/tint/lang/core/builtin/texel_format.h" #include "src/tint/lang/core/constant/value.h" +#include "src/tint/lang/core/ir/builder.h" #include "src/tint/lang/core/ir/constant.h" #include "src/tint/lang/spirv/writer/common/binary_writer.h" #include "src/tint/lang/spirv/writer/common/function.h" @@ -266,6 +267,7 @@ void EmitExitPhis(ir::ControlInstruction* inst); ir::Module* ir_; + ir::Builder b_; writer::Module module_; BinaryWriter writer_;