[msl] If no dynamic buffer given, just return the access. In the case where a group is provided, and we're in an entry point, we should get a dynamic buffer, but if it isn't provided (this can happen through clusterfuzz) then just return the original access. Fixed: 443418986 Change-Id: I8e0acb8b299998c2281c8ffb9c665f45f7bd0d72 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/261438 Reviewed-by: James Price <jrprice@google.com> Auto-Submit: dan sinclair <dsinclair@chromium.org> Commit-Queue: dan sinclair <dsinclair@chromium.org> Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/tint/lang/msl/writer/raise/argument_buffers.cc b/src/tint/lang/msl/writer/raise/argument_buffers.cc index a14bf5a..044ba62 100644 --- a/src/tint/lang/msl/writer/raise/argument_buffers.cc +++ b/src/tint/lang/msl/writer/raise/argument_buffers.cc
@@ -345,10 +345,10 @@ return access->Result(); } - TINT_ASSERT(group_to_dynamic_offset_buffer.Contains(group)); - core::ir::Value* offset_buffer = group_to_dynamic_offset_buffer.GetOr(group, nullptr); - TINT_ASSERT(offset_buffer); + if (!offset_buffer) { + return access->Result(); + } core::ir::Value* result = nullptr; b.InsertAfter(access, [&] {
diff --git a/src/tint/lang/msl/writer/raise/argument_buffers_test.cc b/src/tint/lang/msl/writer/raise/argument_buffers_test.cc index b56c6ee..c3a92db 100644 --- a/src/tint/lang/msl/writer/raise/argument_buffers_test.cc +++ b/src/tint/lang/msl/writer/raise/argument_buffers_test.cc
@@ -1726,5 +1726,64 @@ EXPECT_EQ(expect, str()); } +TEST_F(MslWriter_ArgumentBuffersTest, NoDynamicOffset) { + auto* var_a = b.Var("a", ty.ptr<storage, i32, core::Access::kReadWrite>()); + var_a->SetBindingPoint(1, 2); + mod.root_block->Append(var_a); + + auto* func = b.Function("foo", ty.void_(), core::ir::Function::PipelineStage::kFragment); + b.Append(func->Block(), [&] { + auto* load_a = b.Load(var_a); + auto* add = b.Add<i32>(load_a, load_a); + b.Store(var_a, add); + b.Return(func); + }); + + auto* src = R"( +$B1: { # root + %a:ptr<storage, i32, read_write> = var undef @binding_point(1, 2) +} + +%foo = @fragment func():void { + $B2: { + %3:i32 = load %a + %4:i32 = add %3, %3 + store %a, %4 + ret + } +} +)"; + EXPECT_EQ(src, str()); + + auto* expect = R"( +tint_arg_buffer_struct_1 = struct @align(1), @core.explicit_layout { + a:ptr<storage, i32, read_write> @offset(0), @binding_point(1, 2) +} + +%foo = @fragment func(%tint_arg_buffer_1:ptr<uniform, tint_arg_buffer_struct_1, read> [@binding_point(0, 2)]):void { + $B1: { + %3:tint_arg_buffer_struct_1 = load %tint_arg_buffer_1 + %4:ptr<storage, i32, read_write> = access %3, 0u + %5:i32 = load %4 + %6:i32 = add %5, %5 + %7:ptr<storage, i32, read_write> = access %3, 0u + store %7, %6 + ret + } +} +)"; + + ArgumentBufferInfo info{ + .id = 2, + .binding_info_to_offset_index = {{2, 3}}, + }; + + ArgumentBuffersConfig cfg{}; + cfg.group_to_argument_buffer_info.insert({1, info}); + Run(ArgumentBuffers, cfg); + + EXPECT_EQ(expect, str()); +} + } // namespace } // namespace tint::msl::writer::raise