D3D12: Enable Integer Range Analysis behind a toggle
With this CL the performance of dawn_perf_tests
"ShaderRobustnessPerf" with integer range analysis enabled will be
on par with the one with robustness disabled on D3D12.
Bug: 348701956
Change-Id: I6873801f5ff4f3382fb52ef0a3c10049612f8055
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/242976
Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/dawn/native/Toggles.cpp b/src/dawn/native/Toggles.cpp
index cb5f5aa..218dc1f 100644
--- a/src/dawn/native/Toggles.cpp
+++ b/src/dawn/native/Toggles.cpp
@@ -647,6 +647,11 @@
"Adds a small amount of work to empty render passes which perform a resolve. This toggle is "
"enabled by default on Qualcomm GPUs, where it is needed to force the resolve to complete.",
"https://crbug.com/411656647", ToggleStage::Device}},
+ {Toggle::EnableIntegerRangeAnalysisInRobustness,
+ {"enable_integer_range_analysis_in_robustness",
+ "Compute the range of the index with Integer Range Analysis in the robustness transform and "
+ "skip doing index clamping when the out of bound access cannot happen.",
+ "https://crbug.com/348701956", ToggleStage::Device}},
{Toggle::NoWorkaroundSampleMaskBecomesZeroForAllButLastColorTarget,
{"no_workaround_sample_mask_becomes_zero_for_all_but_last_color_target",
"MacOS 12.0+ Intel has a bug where the sample mask is only applied for the last color "
diff --git a/src/dawn/native/Toggles.h b/src/dawn/native/Toggles.h
index 92ac359..de32833 100644
--- a/src/dawn/native/Toggles.h
+++ b/src/dawn/native/Toggles.h
@@ -153,6 +153,7 @@
UseVulkanMemoryModel,
VulkanScalarizeClampBuiltin,
VulkanAddWorkToEmptyResolvePass,
+ EnableIntegerRangeAnalysisInRobustness,
// Unresolved issues.
NoWorkaroundSampleMaskBecomesZeroForAllButLastColorTarget,
diff --git a/src/dawn/native/d3d12/ShaderModuleD3D12.cpp b/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
index 74c5f66..ca4b0d6 100644
--- a/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
+++ b/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
@@ -376,6 +376,8 @@
device->IsToggleEnabled(Toggle::DisablePolyfillsOnIntegerDivisonAndModulo);
req.hlsl.tintOptions.polyfill_pack_unpack_4x8 =
device->IsToggleEnabled(Toggle::D3D12PolyFillPackUnpack4x8);
+ req.hlsl.tintOptions.enable_integer_range_analysis =
+ device->IsToggleEnabled(Toggle::EnableIntegerRangeAnalysisInRobustness);
req.hlsl.limits = LimitsForCompilationRequest::Create(device->GetLimits().v1);
req.hlsl.adapterSupportedLimits =
diff --git a/src/dawn/tests/perf_tests/ShaderRobustnessPerf.cpp b/src/dawn/tests/perf_tests/ShaderRobustnessPerf.cpp
index 9a65d75..495bb0a 100644
--- a/src/dawn/tests/perf_tests/ShaderRobustnessPerf.cpp
+++ b/src/dawn/tests/perf_tests/ShaderRobustnessPerf.cpp
@@ -594,19 +594,19 @@
RunTest();
}
-DAWN_INSTANTIATE_TEST_P(ShaderRobustnessPerf,
- {D3D12Backend(), D3D12Backend({"disable_robustness"}, {}), MetalBackend(),
- MetalBackend({"disable_robustness"}, {}), OpenGLBackend(),
- OpenGLBackend({"disable_robustness"}, {}), VulkanBackend(),
- VulkanBackend({"disable_robustness"}, {})},
- {MatMulMethod::MatMulFloatOneDimSharedArray,
- MatMulMethod::MatMulFloatTwoDimSharedArray,
- MatMulMethod::MatMulVec4OneDimSharedArray,
- MatMulMethod::MatMulVec4TwoDimSharedArray},
- {ElemType::F32, ElemType::F16},
- {512u},
- {512u},
- {512u});
+DAWN_INSTANTIATE_TEST_P(
+ ShaderRobustnessPerf,
+ {D3D12Backend({"use_tint_ir"}), D3D12Backend({"disable_robustness", "use_tint_ir"}, {}),
+ D3D12Backend({"enable_integer_range_analysis_in_robustness", "use_tint_ir"}, {}),
+ MetalBackend(), MetalBackend({"disable_robustness"}, {}), OpenGLBackend(),
+ OpenGLBackend({"disable_robustness"}, {}), VulkanBackend(),
+ VulkanBackend({"disable_robustness"}, {})},
+ {MatMulMethod::MatMulFloatOneDimSharedArray, MatMulMethod::MatMulFloatTwoDimSharedArray,
+ MatMulMethod::MatMulVec4OneDimSharedArray, MatMulMethod::MatMulVec4TwoDimSharedArray},
+ {ElemType::F32, ElemType::F16},
+ {512u},
+ {512u},
+ {512u});
} // anonymous namespace
} // namespace dawn
diff --git a/src/tint/lang/hlsl/writer/common/options.h b/src/tint/lang/hlsl/writer/common/options.h
index f080142..e41f6cf 100644
--- a/src/tint/lang/hlsl/writer/common/options.h
+++ b/src/tint/lang/hlsl/writer/common/options.h
@@ -215,6 +215,9 @@
/// Set to `true` to disable software robustness that prevents out-of-bounds accesses.
bool disable_robustness = false;
+ /// Set to `true` to enable integer range analysis in robustness transform.
+ bool enable_integer_range_analysis = false;
+
/// Set to `true` to disable workgroup memory zero initialization
bool disable_workgroup_init = false;
@@ -273,6 +276,7 @@
remapped_entry_point_name,
strip_all_names,
disable_robustness,
+ enable_integer_range_analysis,
disable_workgroup_init,
truncate_interstage_variables,
polyfill_reflect_vec2_f32,
diff --git a/src/tint/lang/hlsl/writer/raise/raise.cc b/src/tint/lang/hlsl/writer/raise/raise.cc
index 6569374..c4d7c3b 100644
--- a/src/tint/lang/hlsl/writer/raise/raise.cc
+++ b/src/tint/lang/hlsl/writer/raise/raise.cc
@@ -173,6 +173,8 @@
// means nothing gets written to memory.
config.clamp_texture = false;
+ config.use_integer_range_analysis = options.enable_integer_range_analysis;
+
RUN_TRANSFORM(core::ir::transform::Robustness, module, config);
}
diff --git a/src/tint/lang/hlsl/writer/writer_fuzz.cc b/src/tint/lang/hlsl/writer/writer_fuzz.cc
index f645d55..4c670af 100644
--- a/src/tint/lang/hlsl/writer/writer_fuzz.cc
+++ b/src/tint/lang/hlsl/writer/writer_fuzz.cc
@@ -43,6 +43,7 @@
struct FuzzedOptions {
bool strip_all_names;
bool disable_robustness;
+ bool enable_integer_range_analysis;
bool disable_workgroup_init;
bool polyfill_reflect_vec2_f32;
bool polyfill_dot_4x8_packed;
@@ -54,6 +55,7 @@
TINT_REFLECT(FuzzedOptions,
strip_all_names,
disable_robustness,
+ enable_integer_range_analysis,
disable_workgroup_init,
polyfill_reflect_vec2_f32,
polyfill_dot_4x8_packed,
@@ -68,6 +70,7 @@
Options options;
options.strip_all_names = fuzzed_options.strip_all_names;
options.disable_robustness = fuzzed_options.disable_robustness;
+ options.enable_integer_range_analysis = fuzzed_options.enable_integer_range_analysis;
options.disable_workgroup_init = fuzzed_options.disable_workgroup_init;
options.polyfill_reflect_vec2_f32 = fuzzed_options.polyfill_reflect_vec2_f32;
options.polyfill_dot_4x8_packed = fuzzed_options.polyfill_dot_4x8_packed;