writer/msl: Emit const on array and ptr parameters
This fixes issues with passing constant arrays to functions.
Change-Id: I6e2f1c3f64df836c0b6a55ab925cf3c2bc317733
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/51861
Auto-Submit: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 193e4e7..e569945 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -1311,7 +1311,9 @@
auto* type = program_->Sem().Get(v)->Type();
- if (!EmitType(type, program_->Symbols().NameFor(v->symbol()))) {
+ std::string param_name =
+ "const " + program_->Symbols().NameFor(v->symbol());
+ if (!EmitType(type, param_name)) {
return false;
}
// Parameter name is output as part of the type for arrays and pointers.
diff --git a/src/writer/msl/generator_impl_function_test.cc b/src/writer/msl/generator_impl_function_test.cc
index 5cf1eb8..8ec73fb 100644
--- a/src/writer/msl/generator_impl_function_test.cc
+++ b/src/writer/msl/generator_impl_function_test.cc
@@ -770,7 +770,7 @@
EXPECT_EQ(gen.result(), R"(#include <metal_stdlib>
using namespace metal;
- void my_func(float a[5]) {
+ void my_func(float const a[5]) {
return;
}
diff --git a/test/ptr_ref/load/param/ptr.spvasm.expected.msl b/test/ptr_ref/load/param/ptr.spvasm.expected.msl
index cf1067f..1999858 100644
--- a/test/ptr_ref/load/param/ptr.spvasm.expected.msl
+++ b/test/ptr_ref/load/param/ptr.spvasm.expected.msl
@@ -1,7 +1,7 @@
#include <metal_stdlib>
using namespace metal;
-int func(int value, thread int* pointer) {
+int func(int value, thread int* const pointer) {
int const x_9 = *(pointer);
return (value + x_9);
}
diff --git a/test/ptr_ref/load/param/ptr.wgsl.expected.msl b/test/ptr_ref/load/param/ptr.wgsl.expected.msl
index 20a0cc9..a215474 100644
--- a/test/ptr_ref/load/param/ptr.wgsl.expected.msl
+++ b/test/ptr_ref/load/param/ptr.wgsl.expected.msl
@@ -1,7 +1,7 @@
#include <metal_stdlib>
using namespace metal;
-int func(int value, thread int* pointer) {
+int func(int value, thread int* const pointer) {
return (value + *(pointer));
}
diff --git a/test/ptr_ref/store/param/ptr.spvasm.expected.msl b/test/ptr_ref/store/param/ptr.spvasm.expected.msl
index 0633ba6..98cc63c 100644
--- a/test/ptr_ref/store/param/ptr.spvasm.expected.msl
+++ b/test/ptr_ref/store/param/ptr.spvasm.expected.msl
@@ -1,7 +1,7 @@
#include <metal_stdlib>
using namespace metal;
-void func(int value, thread int* pointer) {
+void func(int value, thread int* const pointer) {
*(pointer) = value;
return;
}
diff --git a/test/ptr_ref/store/param/ptr.wgsl.expected.msl b/test/ptr_ref/store/param/ptr.wgsl.expected.msl
index 9a64bcb..7460a3e 100644
--- a/test/ptr_ref/store/param/ptr.wgsl.expected.msl
+++ b/test/ptr_ref/store/param/ptr.wgsl.expected.msl
@@ -1,7 +1,7 @@
#include <metal_stdlib>
using namespace metal;
-void func(int value, thread int* pointer) {
+void func(int value, thread int* const pointer) {
*(pointer) = value;
}
diff --git a/test/types/parameters.wgsl.expected.msl b/test/types/parameters.wgsl.expected.msl
index 9134d86..81ca7b3 100644
--- a/test/types/parameters.wgsl.expected.msl
+++ b/test/types/parameters.wgsl.expected.msl
@@ -4,7 +4,7 @@
struct S {
};
-void foo(bool param_bool, int param_i32, uint param_u32, float param_f32, int2 param_v2i32, uint3 param_v3u32, float4 param_v4f32, float2x3 param_m2x3, float param_arr[4], S param_struct, thread float* param_ptr_f32, thread float4* param_ptr_vec, thread float (*param_ptr_arr)[4]) {
+void foo(bool param_bool, int param_i32, uint param_u32, float param_f32, int2 param_v2i32, uint3 param_v3u32, float4 param_v4f32, float2x3 param_m2x3, float const param_arr[4], S param_struct, thread float* const param_ptr_f32, thread float4* const param_ptr_vec, thread float (*const param_ptr_arr)[4]) {
}
kernel void tint_symbol() {