Metal API clips all primitives?
float3 in Metal Shading Language has the same size/alignment as float4, i.e. 16 bytes. I think your original code would have worked using packed_float3 (12 bytes) in the vertex shader.