Metal: Remap resource bindings when using Tint
Use the BindingRemapper transform to remap resources binding numbers
to the indices chosen in the pipeline layout.
Bug: dawn:571
Change-Id: I548f063f09970222dea289f05285764fc3ea1b46
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/54520
Commit-Queue: James Price <jrprice@google.com>
Auto-Submit: James Price <jrprice@google.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn_native/metal/ShaderModuleMTL.mm b/src/dawn_native/metal/ShaderModuleMTL.mm
index 22c15ee..a923fe6 100644
--- a/src/dawn_native/metal/ShaderModuleMTL.mm
+++ b/src/dawn_native/metal/ShaderModuleMTL.mm
@@ -69,6 +69,37 @@
std::ostringstream errorStream;
errorStream << "Tint MSL failure:" << std::endl;
+ // Remap BindingNumber to BindingIndex in WGSL shader
+ using BindingRemapper = tint::transform::BindingRemapper;
+ using BindingPoint = tint::transform::BindingPoint;
+ BindingRemapper::BindingPoints bindingPoints;
+ BindingRemapper::AccessControls accessControls;
+
+ for (BindGroupIndex group : IterateBitSet(layout->GetBindGroupLayoutsMask())) {
+ const BindGroupLayoutBase::BindingMap& bindingMap =
+ layout->GetBindGroupLayout(group)->GetBindingMap();
+ for (const auto& it : bindingMap) {
+ BindingNumber bindingNumber = it.first;
+ BindingIndex bindingIndex = it.second;
+
+ const BindingInfo& bindingInfo =
+ layout->GetBindGroupLayout(group)->GetBindingInfo(bindingIndex);
+
+ if (!(bindingInfo.visibility & StageBit(stage))) {
+ continue;
+ }
+
+ uint32_t shaderIndex = layout->GetBindingIndexInfo(stage)[group][bindingIndex];
+
+ BindingPoint srcBindingPoint{static_cast<uint32_t>(group),
+ static_cast<uint32_t>(bindingNumber)};
+ BindingPoint dstBindingPoint{0, shaderIndex};
+ if (srcBindingPoint != dstBindingPoint) {
+ bindingPoints.emplace(srcBindingPoint, dstBindingPoint);
+ }
+ }
+ }
+
tint::transform::Manager transformManager;
tint::transform::DataMap transformInputs;
@@ -88,9 +119,14 @@
if (GetDevice()->IsRobustnessEnabled()) {
transformManager.Add<tint::transform::BoundArrayAccessors>();
}
+ transformManager.Add<tint::transform::BindingRemapper>();
transformManager.Add<tint::transform::Renamer>();
transformManager.Add<tint::transform::Msl>();
+ transformInputs.Add<BindingRemapper::Remappings>(std::move(bindingPoints),
+ std::move(accessControls),
+ /* mayCollide */ true);
+
tint::Program program;
tint::transform::DataMap transformOutputs;
DAWN_TRY_ASSIGN(program, RunTransforms(&transformManager, GetTintProgram(), transformInputs,