writer/msl: Fix swizzling on packed vectors

Metal 1.x does not support swizzling on packed_vec types.
Use array-index for single element selection (permitted on LHS and RHS of assignment)
Cast the packed_vec to a vec for multiple element swizzles (not permitted as the LHS of an assignment).

Fixed: tint:1249
Change-Id: I70cbb0c22a935b06b3905d24484bdc2edfb95fc2
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/67060
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Ben Clayton <bclayton@google.com>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/test/samples/compute_boids.wgsl.expected.msl b/test/samples/compute_boids.wgsl.expected.msl
index 9c1b8a8..48252a3 100644
--- a/test/samples/compute_boids.wgsl.expected.msl
+++ b/test/samples/compute_boids.wgsl.expected.msl
@@ -33,8 +33,8 @@
 };
 
 float4 vert_main_inner(float2 a_particlePos, float2 a_particleVel, float2 a_pos) {
-  float angle = -(atan2(a_particleVel.x, a_particleVel.y));
-  float2 pos = float2(((a_pos.x * cos(angle)) - (a_pos.y * sin(angle))), ((a_pos.x * sin(angle)) + (a_pos.y * cos(angle))));
+  float angle = -(atan2(a_particleVel[0], a_particleVel[1]));
+  float2 pos = float2(((a_pos[0] * cos(angle)) - (a_pos[1] * sin(angle))), ((a_pos[0] * sin(angle)) + (a_pos[1] * cos(angle))));
   return float4((pos + a_particlePos), 0.0f, 1.0f);
 }
 
@@ -57,7 +57,7 @@
 }
 
 void comp_main_inner(constant SimParams& params, device Particles& particlesA, device Particles& particlesB, uint3 gl_GlobalInvocationID) {
-  uint index = gl_GlobalInvocationID.x;
+  uint index = gl_GlobalInvocationID[0];
   if ((index >= 5u)) {
     return;
   }
@@ -74,8 +74,8 @@
     if ((i == index)) {
       continue;
     }
-    pos = particlesA.particles.arr[i].pos.xy;
-    vel = particlesA.particles.arr[i].vel.xy;
+    pos = float2(particlesA.particles.arr[i].pos).xy;
+    vel = float2(particlesA.particles.arr[i].vel).xy;
     if ((distance(pos, vPos) < params.rule1Distance)) {
       cMass = (cMass + pos);
       cMassCount = as_type<int>((as_type<uint>(cMassCount) + as_type<uint>(1)));
@@ -97,17 +97,17 @@
   vVel = (((vVel + (cMass * params.rule1Scale)) + (colVel * params.rule2Scale)) + (cVel * params.rule3Scale));
   vVel = (normalize(vVel) * clamp(length(vVel), 0.0f, 0.100000001f));
   vPos = (vPos + (vVel * params.deltaT));
-  if ((vPos.x < -1.0f)) {
-    vPos.x = 1.0f;
+  if ((vPos[0] < -1.0f)) {
+    vPos[0] = 1.0f;
   }
-  if ((vPos.x > 1.0f)) {
-    vPos.x = -1.0f;
+  if ((vPos[0] > 1.0f)) {
+    vPos[0] = -1.0f;
   }
-  if ((vPos.y < -1.0f)) {
-    vPos.y = 1.0f;
+  if ((vPos[1] < -1.0f)) {
+    vPos[1] = 1.0f;
   }
-  if ((vPos.y > 1.0f)) {
-    vPos.y = -1.0f;
+  if ((vPos[1] > 1.0f)) {
+    vPos[1] = -1.0f;
   }
   particlesB.particles.arr[index].pos = vPos;
   particlesB.particles.arr[index].vel = vVel;