[hlsl] Use IR by default for CLI and E2E tests.
The `hlsl-dxc-ir` and `hlsl-fxc-ir` formats are now skipped in the E2E
test runner. They will be removed when the CQ has been updated to no
longer use them.
The `hlsl-dxc` and `hlsl-fxc` expectations are currently set to the `ir`
outputs until the expectations are moved around.
Bug: 421916945
Change-Id: I1773b888b16abefe2505139676866d22cea08470
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/248314
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/include/tint/tint.h b/include/tint/tint.h
index be2bb51..7ea2f98 100644
--- a/include/tint/tint.h
+++ b/include/tint/tint.h
@@ -40,11 +40,6 @@
#include "src/tint/lang/core/ir/transform/single_entry_point.h"
#include "src/tint/lang/core/ir/transform/substitute_overrides.h"
#include "src/tint/lang/core/type/manager.h"
-#include "src/tint/lang/wgsl/ast/transform/first_index_offset.h"
-#include "src/tint/lang/wgsl/ast/transform/manager.h"
-#include "src/tint/lang/wgsl/ast/transform/renamer.h"
-#include "src/tint/lang/wgsl/ast/transform/single_entry_point.h"
-#include "src/tint/lang/wgsl/ast/transform/substitute_override.h"
#include "src/tint/lang/wgsl/inspector/inspector.h"
#include "src/tint/utils/diagnostic/formatter.h"
#include "src/tint/utils/text/styled_text.h"
diff --git a/src/dawn/native/Toggles.h b/src/dawn/native/Toggles.h
index 6e8707f..b283682 100644
--- a/src/dawn/native/Toggles.h
+++ b/src/dawn/native/Toggles.h
@@ -131,6 +131,7 @@
ResolveMultipleAttachmentInSeparatePasses,
D3D12CreateNotZeroedHeap,
D3D12DontUseNotZeroedHeapFlagOnTexturesAsCommitedResources,
+ // TODO(421916945): Remove when CQ no longer uses this flag.
UseTintIR,
D3DDisableIEEEStrictness,
PolyFillPacked4x8DotProduct,
diff --git a/src/tint/cmd/bench/hlsl/writer_bench.cc b/src/tint/cmd/bench/hlsl/writer_bench.cc
index ceaab2c..2a55e6b 100644
--- a/src/tint/cmd/bench/hlsl/writer_bench.cc
+++ b/src/tint/cmd/bench/hlsl/writer_bench.cc
@@ -50,7 +50,7 @@
}
Options gen_options;
- gen_options.bindings = GenerateBindings(res->program);
+ gen_options.bindings = GenerateBindings(ir.Get());
auto gen_res = Generate(ir.Get(), gen_options);
if (gen_res != Success) {
state.SkipWithError(gen_res.Failure().reason);
@@ -58,24 +58,7 @@
}
}
-void GenerateHLSL_AST(benchmark::State& state, std::string input_name) {
- auto res = bench::GetWgslProgram(input_name);
- if (res != Success) {
- state.SkipWithError(res.Failure().reason);
- return;
- }
- for (auto _ : state) {
- Options gen_options;
- gen_options.bindings = GenerateBindings(res->program);
- auto gen_res = Generate(res->program, gen_options);
- if (gen_res != Success) {
- state.SkipWithError(gen_res.Failure().reason);
- }
- }
-}
-
TINT_BENCHMARK_PROGRAMS(GenerateHLSL);
-TINT_BENCHMARK_PROGRAMS(GenerateHLSL_AST);
} // namespace
} // namespace tint::hlsl::writer
diff --git a/src/tint/cmd/common/helper.cc b/src/tint/cmd/common/helper.cc
index c8e8bc8..d2a97ae 100644
--- a/src/tint/cmd/common/helper.cc
+++ b/src/tint/cmd/common/helper.cc
@@ -111,7 +111,7 @@
#if TINT_BUILD_SPV_READER
tint::Program ReadSpirv(const std::vector<uint32_t>& data, const LoadProgramOptions& opts) {
- if (opts.use_ir) {
+ if (opts.use_ir_reader) {
#if TINT_BUILD_WGSL_WRITER
// Parse the SPIR-V binary to a core Tint IR module.
auto result = tint::spirv::reader::ReadIR(data, opts.spirv_reader_options);
diff --git a/src/tint/cmd/common/helper.h b/src/tint/cmd/common/helper.h
index 3e4fb24..0e52af1 100644
--- a/src/tint/cmd/common/helper.h
+++ b/src/tint/cmd/common/helper.h
@@ -76,7 +76,7 @@
std::string filename;
#if TINT_BUILD_SPV_READER
/// Spirv-reader options
- bool use_ir = false;
+ bool use_ir_reader = false;
tint::spirv::reader::Options spirv_reader_options;
#endif
/// The text printer to use for output
diff --git a/src/tint/cmd/tint/BUILD.bazel b/src/tint/cmd/tint/BUILD.bazel
index 4fca497..4c940ac 100644
--- a/src/tint/cmd/tint/BUILD.bazel
+++ b/src/tint/cmd/tint/BUILD.bazel
@@ -55,7 +55,6 @@
"//src/tint/lang/msl/ir/transform",
"//src/tint/lang/wgsl",
"//src/tint/lang/wgsl/ast",
- "//src/tint/lang/wgsl/ast/transform",
"//src/tint/lang/wgsl/inspector",
"//src/tint/lang/wgsl/program",
"//src/tint/lang/wgsl/sem",
diff --git a/src/tint/cmd/tint/BUILD.cmake b/src/tint/cmd/tint/BUILD.cmake
index 5a035d9..dd244dd 100644
--- a/src/tint/cmd/tint/BUILD.cmake
+++ b/src/tint/cmd/tint/BUILD.cmake
@@ -56,7 +56,6 @@
tint_lang_msl_ir_transform
tint_lang_wgsl
tint_lang_wgsl_ast
- tint_lang_wgsl_ast_transform
tint_lang_wgsl_inspector
tint_lang_wgsl_program
tint_lang_wgsl_sem
diff --git a/src/tint/cmd/tint/BUILD.gn b/src/tint/cmd/tint/BUILD.gn
index 695ea50..e12c881 100644
--- a/src/tint/cmd/tint/BUILD.gn
+++ b/src/tint/cmd/tint/BUILD.gn
@@ -57,7 +57,6 @@
"${tint_src_dir}/lang/msl/ir/transform",
"${tint_src_dir}/lang/wgsl",
"${tint_src_dir}/lang/wgsl/ast",
- "${tint_src_dir}/lang/wgsl/ast/transform",
"${tint_src_dir}/lang/wgsl/inspector",
"${tint_src_dir}/lang/wgsl/program",
"${tint_src_dir}/lang/wgsl/sem",
diff --git a/src/tint/cmd/tint/main.cc b/src/tint/cmd/tint/main.cc
index 8778487..f068b76 100644
--- a/src/tint/cmd/tint/main.cc
+++ b/src/tint/cmd/tint/main.cc
@@ -48,10 +48,6 @@
#include "src/tint/lang/core/ir/var.h"
#include "src/tint/lang/msl/ir/transform/flatten_bindings.h"
#include "src/tint/lang/wgsl/ast/module.h"
-#include "src/tint/lang/wgsl/ast/transform/manager.h"
-#include "src/tint/lang/wgsl/ast/transform/renamer.h"
-#include "src/tint/lang/wgsl/ast/transform/single_entry_point.h"
-#include "src/tint/lang/wgsl/ast/transform/substitute_override.h"
#include "src/tint/utils/command/cli.h"
#include "src/tint/utils/command/command.h"
#include "src/tint/utils/containers/transform.h"
@@ -155,7 +151,6 @@
bool enable_robustness = true;
bool dump_ir = false;
- bool use_ir = false;
bool use_ir_reader = false;
#if TINT_BUILD_SYNTAX_TREE_WRITER
@@ -298,9 +293,9 @@
Parameter{"name"});
TINT_DEFER(opts->output_file = output.value.value_or(""));
- auto& use_ir = options.Add<BoolOption>(
+ // TODO(421916945): Remove when CQ no longer uses this flag
+ [[maybe_unused]] auto& use_ir = options.Add<BoolOption>(
"use-ir", "Use the IR for writers and transforms when possible", Default{false});
- TINT_DEFER(opts->use_ir = *use_ir.value);
auto& use_ir_reader = options.Add<BoolOption>(
"use-ir-reader", "Use the IR for the SPIR-V reader", Default{false});
@@ -684,55 +679,12 @@
}
TINT_END_DISABLE_WARNING(UNSAFE_BUFFER_USAGE);
-[[maybe_unused]] void AddRenamer(Options& options,
- tint::ast::transform::Manager& transform_manager,
- tint::ast::transform::DataMap& transform_inputs) {
- switch (options.format) {
- case Format::kMsl: {
- // Renaming is handled in the backend.
- break;
- }
- case Format::kGlsl: {
- // Renaming is handled in the backend.
- break;
- }
- case Format::kHlsl:
- case Format::kHlslFxc: {
- if (options.use_ir) {
- // Renaming is handled in the backend.
- break;
- }
- if (!options.rename_all) {
- transform_inputs.Add<tint::ast::transform::Renamer::Config>(
- tint::ast::transform::Renamer::Target::kHlslKeywords);
- }
- transform_manager.Add<tint::ast::transform::Renamer>();
- break;
- }
- case Format::kSpirv:
- case Format::kSpvAsm:
- // Renaming is handled in the backend.
- break;
- case Format::kWgsl:
- case Format::kIr: {
- if (options.rename_all) {
- transform_manager.Add<tint::ast::transform::Renamer>();
- }
- break;
- }
- case Format::kNone:
- case Format::kUnknown:
- break;
- }
-}
-
-tint::diag::Result<std::unordered_map<tint::OverrideId, double>> CreateOverrideMap(
- Options& options,
- tint::inspector::Inspector& inspector) {
+[[maybe_unused]] tint::diag::Result<tint::core::ir::transform::SubstituteOverridesConfig>
+CreateOverrideMap(Options& options, tint::inspector::Inspector& inspector) {
auto override_names = inspector.GetNamedOverrideIds();
- std::unordered_map<tint::OverrideId, double> values;
- values.reserve(options.overrides.Count());
+ tint::core::ir::transform::SubstituteOverridesConfig cfg;
+ cfg.map.reserve(options.overrides.Count());
for (auto& override : options.overrides) {
const auto& override_name = override.key.Value();
const auto& override_value = override.value;
@@ -743,7 +695,7 @@
auto num = tint::strconv::ParseNumber<decltype(tint::OverrideId::value)>(override_name);
if (num == tint::Success) {
tint::OverrideId id{num.Get()};
- values.emplace(id, override_value);
+ cfg.map.emplace(id, override_value);
continue;
}
@@ -751,59 +703,9 @@
if (it == override_names.end()) {
return tint::diag::Failure("unknown override '" + override_name + "'");
}
- values.emplace(it->second, override_value);
+ cfg.map.emplace(it->second, override_value);
}
- return values;
-}
-
-void AddSubstituteOverrides(std::unordered_map<tint::OverrideId, double> values,
- tint::ast::transform::Manager& transform_manager,
- tint::ast::transform::DataMap& transform_inputs) {
- tint::ast::transform::SubstituteOverride::Config cfg;
- cfg.map = std::move(values);
-
- transform_inputs.Add<tint::ast::transform::SubstituteOverride::Config>(cfg);
- transform_manager.Add<tint::ast::transform::SubstituteOverride>();
-}
-
-[[maybe_unused]] tint::diag::Result<tint::Program> ProcessASTTransforms(
- Options& options,
- tint::inspector::Inspector& inspector,
- tint::Program& program,
- std::optional<tint::ast::transform::SubstituteOverride::Config>& cfg) {
- tint::ast::transform::Manager transform_manager;
- tint::ast::transform::DataMap transform_inputs;
-
- // In the case where there are no entry points, the ep_name is blank and we need to skip single
- // entry point.
- if (!options.use_ir && options.ep_name != "") {
- transform_manager.append(std::make_unique<tint::ast::transform::SingleEntryPoint>());
- transform_inputs.Add<tint::ast::transform::SingleEntryPoint::Config>(options.ep_name);
- }
-
- AddRenamer(options, transform_manager, transform_inputs);
-
- auto res = CreateOverrideMap(options, inspector);
- if (res != tint::Success) {
- return res.Failure();
- }
- if (options.use_ir) {
- tint::ast::transform::SubstituteOverride::Config cfg_temp;
- cfg_temp.map = std::move(res.Get());
- cfg = cfg_temp;
- } else {
- AddSubstituteOverrides(res.Get(), transform_manager, transform_inputs);
- }
-
- tint::ast::transform::DataMap outputs;
- auto transformed = transform_manager.Run(program, std::move(transform_inputs), outputs);
- if (!transformed.IsValid()) {
- std::stringstream err;
- tint::cmd::PrintWGSL(err, transformed);
- err << transformed.Diagnostics() << "\n";
- return tint::diag::Failure(err.str());
- }
- return transformed;
+ return cfg;
}
#if TINT_BUILD_SPV_WRITER
@@ -855,16 +757,8 @@
[[maybe_unused]] tint::inspector::Inspector& inspector,
[[maybe_unused]] tint::Program& src_program) {
#if TINT_BUILD_SPV_WRITER
-
- std::optional<tint::ast::transform::SubstituteOverride::Config> cfg;
- auto res = ProcessASTTransforms(options, inspector, src_program, cfg);
- if (res != tint::Success) {
- std::cerr << res.Failure() << "\n";
- return true;
- }
-
// Convert the AST program to an IR module.
- auto ir = tint::wgsl::reader::ProgramToLoweredIR(res.Get());
+ auto ir = tint::wgsl::reader::ProgramToLoweredIR(src_program);
if (ir != tint::Success) {
std::cerr << "Failed to generate IR: " << ir << "\n";
return false;
@@ -879,18 +773,19 @@
}
}
- if (cfg) {
- // this needs to run after SingleEntryPoint transform which removes unused
- // overrides for the current entry point.
- tint::core::ir::transform::SubstituteOverridesConfig ir_cfg;
- ir_cfg.map = cfg->map;
- auto substituteOverridesResult =
- tint::core::ir::transform::SubstituteOverrides(ir.Get(), ir_cfg);
- if (substituteOverridesResult != tint::Success) {
- std::cerr << "Pipeline override substitution (IR) failed:\n"
- << substituteOverridesResult.Failure() << "\n";
- return false;
- }
+ // this needs to run after SingleEntryPoint transform which removes unused
+ // overrides for the current entry point.
+ auto substitute_override_cfg = CreateOverrideMap(options, inspector);
+ if (substitute_override_cfg != tint::Success) {
+ std::cerr << "Failed to create override map: " << substitute_override_cfg.Failure() << "\n";
+ return false;
+ }
+ auto substituteOverridesResult =
+ tint::core::ir::transform::SubstituteOverrides(ir.Get(), substitute_override_cfg.Get());
+ if (substituteOverridesResult != tint::Success) {
+ std::cerr << "Pipeline override substitution (IR) failed:\n"
+ << substituteOverridesResult.Failure() << "\n";
+ return false;
}
tint::spirv::writer::Options gen_options;
@@ -934,7 +829,7 @@
// Generate SPIR-V from Tint IR.
auto result = tint::spirv::writer::Generate(ir.Get(), gen_options);
if (result != tint::Success) {
- tint::cmd::PrintWGSL(std::cerr, res.Get());
+ tint::cmd::PrintWGSL(std::cerr, src_program);
std::cerr << "Failed to generate SPIR-V: " << result.Failure() << "\n";
return false;
}
@@ -1031,16 +926,8 @@
[[maybe_unused]] tint::inspector::Inspector& inspector,
[[maybe_unused]] tint::Program& src_program) {
#if TINT_BUILD_MSL_WRITER
-
- std::optional<tint::ast::transform::SubstituteOverride::Config> cfg;
- auto transform_res = ProcessASTTransforms(options, inspector, src_program, cfg);
- if (transform_res != tint::Success) {
- std::cerr << transform_res.Failure() << "\n";
- return true;
- }
-
// Convert the AST program to an IR module.
- auto ir = tint::wgsl::reader::ProgramToLoweredIR(transform_res.Get());
+ auto ir = tint::wgsl::reader::ProgramToLoweredIR(src_program);
if (ir != tint::Success) {
std::cerr << "Failed to generate IR: " << ir << "\n";
return false;
@@ -1055,18 +942,19 @@
}
}
- if (cfg) {
- // this needs to run after SingleEntryPoint transform which removes unused
- // overrides for the current entry point.
- tint::core::ir::transform::SubstituteOverridesConfig ir_cfg;
- ir_cfg.map = cfg->map;
- auto substituteOverridesResult =
- tint::core::ir::transform::SubstituteOverrides(ir.Get(), ir_cfg);
- if (substituteOverridesResult != tint::Success) {
- std::cerr << "Pipeline override substitution (IR) failed:\n"
- << substituteOverridesResult.Failure() << "\n";
- return false;
- }
+ // this needs to run after SingleEntryPoint transform which removes unused
+ // overrides for the current entry point.
+ auto substitute_override_cfg = CreateOverrideMap(options, inspector);
+ if (substitute_override_cfg != tint::Success) {
+ std::cerr << "Failed to create override map: " << substitute_override_cfg.Failure() << "\n";
+ return false;
+ }
+ auto substituteOverridesResult =
+ tint::core::ir::transform::SubstituteOverrides(ir.Get(), substitute_override_cfg.Get());
+ if (substituteOverridesResult != tint::Success) {
+ std::cerr << "Pipeline override substitution (IR) failed:\n"
+ << substituteOverridesResult.Failure() << "\n";
+ return false;
}
{
@@ -1123,7 +1011,7 @@
auto result = tint::msl::writer::Generate(ir.Get(), gen_options);
if (result != tint::Success) {
- tint::cmd::PrintWGSL(std::cerr, transform_res.Get());
+ tint::cmd::PrintWGSL(std::cerr, src_program);
std::cerr << "Failed to generate: " << result.Failure() << "\n";
return false;
}
@@ -1181,13 +1069,6 @@
[[maybe_unused]] tint::inspector::Inspector& inspector,
[[maybe_unused]] tint::Program& src_program) {
#if TINT_BUILD_HLSL_WRITER
- std::optional<tint::ast::transform::SubstituteOverride::Config> cfg;
- auto res = ProcessASTTransforms(options, inspector, src_program, cfg);
- if (res != tint::Success) {
- std::cerr << res.Failure() << "\n";
- return true;
- }
-
const bool for_fxc = options.format == Format::kHlslFxc;
// Set up the backend options.
tint::hlsl::writer::Options gen_options;
@@ -1197,7 +1078,6 @@
}
gen_options.disable_robustness = !options.enable_robustness;
gen_options.disable_workgroup_init = options.disable_workgroup_init;
- gen_options.bindings = tint::hlsl::writer::GenerateBindings(res.Get());
gen_options.pixel_local = options.pixel_local_options;
gen_options.polyfill_dot_4x8_packed = options.hlsl_shader_model < kMinShaderModelForDP4aInHLSL;
gen_options.polyfill_pack_unpack_4x8 =
@@ -1205,52 +1085,48 @@
gen_options.compiler = for_fxc ? tint::hlsl::writer::Options::Compiler::kFXC
: tint::hlsl::writer::Options::Compiler::kDXC;
- tint::Result<tint::hlsl::writer::Output> result;
- if (options.use_ir) {
- // Convert the AST program to an IR module.
- auto ir = tint::wgsl::reader::ProgramToLoweredIR(res.Get());
- if (ir != tint::Success) {
- std::cerr << "Failed to generate IR: " << ir << "\n";
- return false;
- }
+ // Convert the AST program to an IR module.
+ auto ir = tint::wgsl::reader::ProgramToLoweredIR(src_program);
+ if (ir != tint::Success) {
+ std::cerr << "Failed to generate IR: " << ir << "\n";
+ return false;
+ }
+ gen_options.bindings = tint::hlsl::writer::GenerateBindings(ir.Get());
- if (options.ep_name != "") {
- auto singleEntryPointResult =
- tint::core::ir::transform::SingleEntryPoint(ir.Get(), options.ep_name);
- if (singleEntryPointResult != tint::Success) {
- std::cerr << "Pipeline single entry point (IR) failed:\n"
- << singleEntryPointResult.Failure() << "\n";
- }
+ if (options.ep_name != "") {
+ auto singleEntryPointResult =
+ tint::core::ir::transform::SingleEntryPoint(ir.Get(), options.ep_name);
+ if (singleEntryPointResult != tint::Success) {
+ std::cerr << "Pipeline single entry point (IR) failed:\n"
+ << singleEntryPointResult.Failure() << "\n";
}
-
- if (cfg) {
- // this needs to run after SingleEntryPoint transform which removes unused
- // overrides for the current entry point.
- tint::core::ir::transform::SubstituteOverridesConfig ir_cfg;
- ir_cfg.map = cfg->map;
- auto substituteOverridesResult =
- tint::core::ir::transform::SubstituteOverrides(ir.Get(), ir_cfg);
- if (substituteOverridesResult != tint::Success) {
- std::cerr << "Pipeline override substitution (IR) failed:\n"
- << substituteOverridesResult.Failure() << "\n";
- return false;
- }
- }
-
- // Check that the module and options are supported by the backend.
- auto check = tint::hlsl::writer::CanGenerate(ir.Get(), gen_options);
- if (check != tint::Success) {
- std::cerr << check.Failure() << "\n";
- return false;
- }
-
- result = tint::hlsl::writer::Generate(ir.Get(), gen_options);
- } else {
- result = tint::hlsl::writer::Generate(res.Get(), gen_options);
}
+ // this needs to run after SingleEntryPoint transform which removes unused
+ // overrides for the current entry point.
+ auto substitute_override_cfg = CreateOverrideMap(options, inspector);
+ if (substitute_override_cfg != tint::Success) {
+ std::cerr << "Failed to create override map: " << substitute_override_cfg.Failure() << "\n";
+ return false;
+ }
+ auto substituteOverridesResult =
+ tint::core::ir::transform::SubstituteOverrides(ir.Get(), substitute_override_cfg.Get());
+ if (substituteOverridesResult != tint::Success) {
+ std::cerr << "Pipeline override substitution (IR) failed:\n"
+ << substituteOverridesResult.Failure() << "\n";
+ return false;
+ }
+
+ // Check that the module and options are supported by the backend.
+ auto check = tint::hlsl::writer::CanGenerate(ir.Get(), gen_options);
+ if (check != tint::Success) {
+ std::cerr << check.Failure() << "\n";
+ return false;
+ }
+
+ auto result = tint::hlsl::writer::Generate(ir.Get(), gen_options);
if (result != tint::Success) {
- tint::cmd::PrintWGSL(std::cerr, res.Get());
+ tint::cmd::PrintWGSL(std::cerr, src_program);
std::cerr << "Failed to generate: " << result.Failure() << "\n";
return false;
}
@@ -1276,7 +1152,7 @@
auto dxc = tint::Command::LookPath(dxc_path);
if (dxc.Found()) {
uint32_t hlsl_shader_model = options.hlsl_shader_model;
- auto enable_list = res->AST().Enables();
+ auto enable_list = src_program.AST().Enables();
bool dxc_require_16bit_types = false;
for (auto* enable : enable_list) {
if (enable->HasExtension(tint::wgsl::Extension::kF16)) {
@@ -1350,14 +1226,6 @@
[[maybe_unused]] tint::inspector::Inspector& inspector,
[[maybe_unused]] tint::Program& src_program) {
#if TINT_BUILD_GLSL_WRITER
-
- std::optional<tint::ast::transform::SubstituteOverride::Config> cfg;
- auto res = ProcessASTTransforms(options, inspector, src_program, cfg);
- if (res != tint::Success) {
- std::cerr << res.Failure() << "\n";
- return true;
- }
-
tint::glsl::writer::Options gen_options;
gen_options.strip_all_names = options.rename_all;
if (options.glsl_desktop) {
@@ -1390,7 +1258,7 @@
}
// Convert the AST program to an IR module.
- auto ir = tint::wgsl::reader::ProgramToLoweredIR(res.Get());
+ auto ir = tint::wgsl::reader::ProgramToLoweredIR(src_program);
if (ir != tint::Success) {
std::cerr << "Failed to generate IR: " << ir << "\n";
return false;
@@ -1405,19 +1273,21 @@
}
}
- if (cfg) {
- // this needs to run after SingleEntryPoint transform which removes unused
- // overrides for the current entry point.
- tint::core::ir::transform::SubstituteOverridesConfig ir_cfg;
- ir_cfg.map = cfg->map;
- auto substituteOverridesResult =
- tint::core::ir::transform::SubstituteOverrides(ir.Get(), ir_cfg);
- if (substituteOverridesResult != tint::Success) {
- std::cerr << "Pipeline override substitution (IR) failed:\n"
- << substituteOverridesResult.Failure() << "\n";
- return false;
- }
+ // this needs to run after SingleEntryPoint transform which removes unused
+ // overrides for the current entry point.
+ auto substitute_override_cfg = CreateOverrideMap(options, inspector);
+ if (substitute_override_cfg != tint::Success) {
+ std::cerr << "Failed to create override map: " << substitute_override_cfg.Failure() << "\n";
+ return false;
}
+ auto substituteOverridesResult =
+ tint::core::ir::transform::SubstituteOverrides(ir.Get(), substitute_override_cfg.Get());
+ if (substituteOverridesResult != tint::Success) {
+ std::cerr << "Pipeline override substitution (IR) failed:\n"
+ << substituteOverridesResult.Failure() << "\n";
+ return false;
+ }
+
// Generate binding options.
gen_options.bindings = tint::glsl::writer::GenerateBindings(ir.Get());
@@ -1525,17 +1395,11 @@
options.format = Format::kSpvAsm;
}
- // TODO(crbug.com/344563756): Remove the user option for 'use_ir' once the ir is launched on all
- // backends.
- if (options.format != Format::kHlsl && options.format != Format::kHlslFxc) {
- options.use_ir = true;
- }
-
tint::cmd::LoadProgramOptions opts;
opts.filename = options.input_filename;
opts.printer = options.printer.get();
#if TINT_BUILD_SPV_READER
- opts.use_ir = options.use_ir_reader;
+ opts.use_ir_reader = options.use_ir_reader;
opts.spirv_reader_options = options.spirv_reader_options;
// Allow the shader-f16 extension
opts.spirv_reader_options.allowed_features = tint::wgsl::AllowedFeatures::Everything();
diff --git a/src/tint/lang/hlsl/writer/helpers/generate_bindings.cc b/src/tint/lang/hlsl/writer/helpers/generate_bindings.cc
index 940eb79..8325945 100644
--- a/src/tint/lang/hlsl/writer/helpers/generate_bindings.cc
+++ b/src/tint/lang/hlsl/writer/helpers/generate_bindings.cc
@@ -119,78 +119,4 @@
return bindings;
}
-Bindings GenerateBindings(const Program& program) {
- // TODO(tint:1491): Use Inspector once we can get binding info for all
- // variables, not just those referenced by entry points.
-
- Bindings bindings{};
-
- // Collect next valid binding number per group
- Hashmap<uint32_t, uint32_t, 4> group_to_next_binding_number;
- Vector<tint::BindingPoint, 4> ext_tex_bps;
- for (auto* var : program.AST().GlobalVariables()) {
- if (auto* sem_var = program.Sem().Get(var)->As<sem::GlobalVariable>()) {
- if (auto bp = sem_var->Attributes().binding_point) {
- if (auto val = group_to_next_binding_number.Get(bp->group)) {
- *val = std::max(*val, bp->binding + 1);
- } else {
- group_to_next_binding_number.Add(bp->group, bp->binding + 1);
- }
-
- // Store up the external textures, we'll add them in the next step
- if (sem_var->Type()->UnwrapRef()->Is<core::type::ExternalTexture>()) {
- ext_tex_bps.Push(*bp);
- continue;
- }
-
- binding::BindingInfo info{bp->group, bp->binding};
- switch (sem_var->AddressSpace()) {
- case core::AddressSpace::kHandle:
- Switch(
- sem_var->Type()->UnwrapRef(), //
- [&](const core::type::Sampler*) {
- bindings.sampler.emplace(*bp, info);
- },
- [&](const core::type::StorageTexture*) {
- bindings.storage_texture.emplace(*bp, info);
- },
- [&](const core::type::Texture*) {
- bindings.texture.emplace(*bp, info);
- });
- break;
- case core::AddressSpace::kStorage:
- bindings.storage.emplace(*bp, info);
- break;
- case core::AddressSpace::kUniform:
- bindings.uniform.emplace(*bp, info);
- break;
-
- case core::AddressSpace::kUndefined:
- case core::AddressSpace::kPixelLocal:
- case core::AddressSpace::kPrivate:
- case core::AddressSpace::kImmediate:
- case core::AddressSpace::kIn:
- case core::AddressSpace::kOut:
- case core::AddressSpace::kFunction:
- case core::AddressSpace::kWorkgroup:
- break;
- }
- }
- }
- }
-
- for (auto bp : ext_tex_bps) {
- uint32_t g = bp.group;
- uint32_t& next_num = group_to_next_binding_number.GetOrAddZero(g);
-
- binding::BindingInfo plane0{bp.group, bp.binding};
- binding::BindingInfo plane1{g, next_num++};
- binding::BindingInfo metadata{g, next_num++};
-
- bindings.external_texture.emplace(bp, binding::ExternalTexture{metadata, plane0, plane1});
- }
-
- return bindings;
-}
-
} // namespace tint::hlsl::writer
diff --git a/src/tint/lang/hlsl/writer/helpers/generate_bindings.h b/src/tint/lang/hlsl/writer/helpers/generate_bindings.h
index 72abac8..fef4e4f 100644
--- a/src/tint/lang/hlsl/writer/helpers/generate_bindings.h
+++ b/src/tint/lang/hlsl/writer/helpers/generate_bindings.h
@@ -31,10 +31,6 @@
#include "src/tint/lang/hlsl/writer/common/options.h"
// Forward declarations
-namespace tint {
-class Program;
-}
-
namespace tint::core::ir {
class Module;
} // namespace tint::core::ir
@@ -46,11 +42,6 @@
/// @returns the bindings
Bindings GenerateBindings(const core::ir::Module& module);
-/// Generate the resource bindings
-/// @param program the program to generate from
-/// @returns the bindings
-Bindings GenerateBindings(const Program& program);
-
} // namespace tint::hlsl::writer
#endif // SRC_TINT_LANG_HLSL_WRITER_HELPERS_GENERATE_BINDINGS_H_
diff --git a/tools/src/cmd/tests/main.go b/tools/src/cmd/tests/main.go
index ac4966f..f07dc90 100644
--- a/tools/src/cmd/tests/main.go
+++ b/tools/src/cmd/tests/main.go
@@ -74,7 +74,7 @@
)
// allOutputFormats holds all the supported outputFormats
-var allOutputFormats = []outputFormat{wgsl, spvasm, msl, hlslDXC, hlslDXCIR, hlslFXC, hlslFXCIR, glsl}
+var allOutputFormats = []outputFormat{wgsl, spvasm, msl, hlslDXC, hlslFXC, glsl}
// The default non-flag arguments to the command
var defaultArgs = []string{"test/tint"}
@@ -240,6 +240,10 @@
if err != nil {
return err
}
+ // TODO(421916945): Remove when CQ is updated to stop using these formats.
+ if parsed[0] == hlslDXCIR || parsed[0] == hlslFXCIR {
+ continue
+ }
formats = append(formats, parsed...)
}
}
@@ -699,16 +703,11 @@
return status{code: skip, timeTaken: 0}
}
- useIr := j.format == hlslDXCIR || j.format == hlslFXCIR
-
+ // TODO(421916945): Remove when IR expectations have been moved.
switch j.format {
case hlslDXC:
- expectedFilePath += "dxc.hlsl"
- case hlslDXCIR:
expectedFilePath += "ir.dxc.hlsl"
case hlslFXC:
- expectedFilePath += "fxc.hlsl"
- case hlslFXCIR:
expectedFilePath += "ir.fxc.hlsl"
default:
expectedFilePath += string(j.format)
@@ -758,10 +757,6 @@
"--print-hash",
}
- if useIr {
- args = append(args, "--use-ir")
- }
-
if cfg.useIrReader {
args = append(args, "--use-ir-reader")
}
@@ -782,12 +777,12 @@
case spvasm, glsl:
args = append(args, "--validate") // spirv-val and glslang are statically linked, always available
validate = true
- case hlslDXC, hlslDXCIR:
+ case hlslDXC:
if cfg.dxcPath != "" {
args = append(args, "--dxc", cfg.dxcPath)
validate = true
}
- case hlslFXC, hlslFXCIR:
+ case hlslFXC:
if cfg.fxcPath != "" {
args = append(args, "--fxc", cfg.fxcPath)
validate = true