Update GpuMemorySynchronizationTests to use WGSL

Bug: dawn:572
Change-Id: Ie16558bc104557603df99c9976b744a685592247
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/33765
Commit-Queue: Austin Eng <enga@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/tests/end2end/GpuMemorySynchronizationTests.cpp b/src/tests/end2end/GpuMemorySynchronizationTests.cpp
index 75ad6f6..d268b5b 100644
--- a/src/tests/end2end/GpuMemorySynchronizationTests.cpp
+++ b/src/tests/end2end/GpuMemorySynchronizationTests.cpp
@@ -42,15 +42,14 @@
 
     std::tuple<wgpu::ComputePipeline, wgpu::BindGroup> CreatePipelineAndBindGroupForCompute(
         const wgpu::Buffer& buffer) {
-        wgpu::ShaderModule csModule =
-            utils::CreateShaderModule(device, utils::SingleShaderStage::Compute, R"(
-        #version 450
-        layout(std140, set = 0, binding = 0) buffer Data {
-            int a;
-        } data;
-        void main() {
-            data.a += 1;
-        })");
+        wgpu::ShaderModule csModule = utils::CreateShaderModuleFromWGSL(device, R"(
+            [[block]] struct Data {
+                [[offset(0)]] a : i32;
+            };
+            [[set(0), binding(0)]] var<storage_buffer> data : [[access(read_write)]] Data;
+            [[stage(compute)]] fn main() -> void {
+                data.a = data.a + 1;
+            })");
 
         wgpu::ComputePipelineDescriptor cpDesc;
         cpDesc.computeStage.module = csModule;
@@ -65,25 +64,22 @@
     std::tuple<wgpu::RenderPipeline, wgpu::BindGroup> CreatePipelineAndBindGroupForRender(
         const wgpu::Buffer& buffer,
         wgpu::TextureFormat colorFormat) {
-        wgpu::ShaderModule vsModule =
-            utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex, R"(
-        #version 450
-        void main() {
-            gl_Position = vec4(0.f, 0.f, 0.f, 1.f);
-            gl_PointSize = 1.0;
-        })");
+        wgpu::ShaderModule vsModule = utils::CreateShaderModuleFromWGSL(device, R"(
+            [[builtin(position)]] var<out> Position : vec4<f32>;
+            [[stage(vertex)]] fn main() -> void {
+                Position = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+            })");
 
-        wgpu::ShaderModule fsModule =
-            utils::CreateShaderModule(device, utils::SingleShaderStage::Fragment, R"(
-        #version 450
-        layout (set = 0, binding = 0) buffer Data {
-            int i;
-        } data;
-        layout(location = 0) out vec4 fragColor;
-        void main() {
-            data.i += 1;
-            fragColor = vec4(data.i / 255.f, 0.f, 0.f, 1.f);
-        })");
+        wgpu::ShaderModule fsModule = utils::CreateShaderModuleFromWGSL(device, R"(
+            [[block]] struct Data {
+                [[offset(0)]] i : i32;
+            };
+            [[set(0), binding(0)]] var<storage_buffer> data : [[access(read_write)]] Data;
+            [[location(0)]] var<out> fragColor : vec4<f32>;
+            [[stage(fragment)]] fn main() -> void {
+                data.i = data.i + 1;
+                fragColor = vec4<f32>(f32(data.i) / 255.0, 0.0, 0.0, 1.0);
+            })");
 
         utils::ComboRenderPipelineDescriptor rpDesc(device);
         rpDesc.vertexStage.module = vsModule;
@@ -262,15 +258,14 @@
     }
 
     std::tuple<wgpu::ComputePipeline, wgpu::BindGroup> CreatePipelineAndBindGroupForCompute() {
-        wgpu::ShaderModule csModule =
-            utils::CreateShaderModule(device, utils::SingleShaderStage::Compute, R"(
-        #version 450
-        layout(std140, set = 0, binding = 0) buffer Data {
-            float a;
-        } data;
-        void main() {
-            data.a = 1.0;
-        })");
+        wgpu::ShaderModule csModule = utils::CreateShaderModuleFromWGSL(device, R"(
+            [[block]] struct Data {
+                [[offset(0)]] a : f32;
+            };
+            [[set(0), binding(0)]] var<storage_buffer> data : [[access(read_write)]] Data;
+            [[stage(compute)]] fn main() -> void {
+                data.a = 1.0;
+            })");
 
         wgpu::ComputePipelineDescriptor cpDesc;
         cpDesc.computeStage.module = csModule;
@@ -284,24 +279,22 @@
 
     std::tuple<wgpu::RenderPipeline, wgpu::BindGroup> CreatePipelineAndBindGroupForRender(
         wgpu::TextureFormat colorFormat) {
-        wgpu::ShaderModule vsModule =
-            utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex, R"(
-        #version 450
-        void main() {
-            gl_Position = vec4(0.f, 0.f, 0.f, 1.f);
-            gl_PointSize = 1.0;
-        })");
+        wgpu::ShaderModule vsModule = utils::CreateShaderModuleFromWGSL(device, R"(
+            [[builtin(position)]] var<out> Position : vec4<f32>;
+            [[stage(vertex)]] fn main() -> void {
+                Position = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+            })");
 
-        wgpu::ShaderModule fsModule =
-            utils::CreateShaderModule(device, utils::SingleShaderStage::Fragment, R"(
-        #version 450
-        layout (set = 0, binding = 0) uniform Contents{
-            float color;
-        };
-        layout(location = 0) out vec4 fragColor;
-        void main() {
-            fragColor = vec4(color, 0.f, 0.f, 1.f);
-        })");
+        wgpu::ShaderModule fsModule = utils::CreateShaderModuleFromWGSL(device, R"(
+            [[block]] struct Contents {
+                [[offset(0)]] color : f32;
+            };
+            [[set(0), binding(0)]] var<uniform> contents : Contents;
+
+            [[location(0)]] var<out> fragColor : vec4<f32>;
+            [[stage(fragment)]] fn main() -> void {
+                fragColor = vec4<f32>(contents.color, 0.0, 0.0, 1.0);
+            })");
 
         utils::ComboRenderPipelineDescriptor rpDesc(device);
         rpDesc.vertexStage.module = vsModule;
@@ -464,35 +457,37 @@
 // operation in compute pass.
 TEST_P(MultipleWriteThenMultipleReadTests, SeparateBuffers) {
     // Create pipeline, bind group, and different buffers for compute pass.
-    wgpu::ShaderModule csModule =
-        utils::CreateShaderModule(device, utils::SingleShaderStage::Compute, R"(
-        #version 450
-        layout(std140, set = 0, binding = 0) buffer VBContents {
-            vec4 pos[4];
+    wgpu::ShaderModule csModule = utils::CreateShaderModuleFromWGSL(device, R"(
+        [[block]] struct VBContents {
+            [[offset(0)]] pos : [[stride(16)]] array<vec4<f32>, 4>;
         };
+        [[set(0), binding(0)]] var<storage_buffer> vbContents : [[access(read_write)]] VBContents;
 
-        layout(std140, set = 0, binding = 1) buffer IBContents {
-            ivec4 indices[2];
+        [[block]] struct IBContents {
+            [[offset(0)]] indices : [[stride(16)]] array<vec4<i32>, 2>;
         };
+        [[set(0), binding(1)]] var<storage_buffer> ibContents : [[access(read_write)]] IBContents;
 
-        layout(std140, set = 0, binding = 2) buffer UniformContents {
-            float color0;
+        # TODO(crbug.com/tint/386): Use the same struct.
+        [[block]] struct ColorContents1 {
+            [[offset(0)]] color : f32;
         };
-
-        layout(std140, set = 0, binding = 3) buffer ReadonlyStorageContents {
-            float color1;
+        [[block]] struct ColorContents2 {
+            [[offset(0)]] color : f32;
         };
+        [[set(0), binding(2)]] var<storage_buffer> uniformContents : [[access(read_write)]] ColorContents1;
+        [[set(0), binding(3)]] var<storage_buffer> storageContents : [[access(read_write)]] ColorContents2;
 
-        void main() {
-            pos[0] = vec4(-1.f, 1.f, 0.f, 1.f);
-            pos[1] = vec4(1.f, 1.f, 0.f, 1.f);
-            pos[2] = vec4(1.f, -1.f, 0.f, 1.f);
-            pos[3] = vec4(-1.f, -1.f, 0.f, 1.f);
-            int dummy = 0;
-            indices[0] = ivec4(0, 1, 2, 0);
-            indices[1] = ivec4(2, 3, dummy, dummy);
-            color0 = 1.0;
-            color1 = 1.0;
+        [[stage(compute)]] fn main() -> void {
+            vbContents.pos[0] = vec4<f32>(-1.0, 1.0, 0.0, 1.0);
+            vbContents.pos[1] = vec4<f32>(1.0, 1.0, 0.0, 1.0);
+            vbContents.pos[2] = vec4<f32>(1.0, -1.0, 0.0, 1.0);
+            vbContents.pos[3] = vec4<f32>(-1.0, -1.0, 0.0, 1.0);
+            const dummy : i32 = 0;
+            ibContents.indices[0] = vec4<i32>(0, 1, 2, 0);
+            ibContents.indices[1] = vec4<i32>(2, 3, dummy, dummy);
+            uniformContents.color = 1.0;
+            storageContents.color = 1.0;
         })");
 
     wgpu::ComputePipelineDescriptor cpDesc;
@@ -508,12 +503,12 @@
     wgpu::Buffer uniformBuffer =
         CreateZeroedBuffer(sizeof(float), wgpu::BufferUsage::Uniform | wgpu::BufferUsage::Storage |
                                               wgpu::BufferUsage::CopyDst);
-    wgpu::Buffer readonlyStorageBuffer =
+    wgpu::Buffer storageBuffer =
         CreateZeroedBuffer(sizeof(float), wgpu::BufferUsage::Storage | wgpu::BufferUsage::CopyDst);
 
     wgpu::BindGroup bindGroup0 = utils::MakeBindGroup(
         device, cp.GetBindGroupLayout(0),
-        {{0, vertexBuffer}, {1, indexBuffer}, {2, uniformBuffer}, {3, readonlyStorageBuffer}});
+        {{0, vertexBuffer}, {1, indexBuffer}, {2, uniformBuffer}, {3, storageBuffer}});
     // Write data into storage buffers in compute pass.
     wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
     wgpu::ComputePassEncoder pass0 = encoder.BeginComputePass();
@@ -523,28 +518,24 @@
     pass0.EndPass();
 
     // Create pipeline, bind group, and reuse buffers in render pass.
-    wgpu::ShaderModule vsModule =
-        utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex, R"(
-        #version 450
-        layout(location = 0) in vec4 pos;
-        void main() {
-            gl_Position = pos;
+    wgpu::ShaderModule vsModule = utils::CreateShaderModuleFromWGSL(device, R"(
+        [[location(0)]] var<in> pos : vec4<f32>;
+        [[builtin(position)]] var<out> Position: vec4<f32>;
+        [[stage(vertex)]] fn main() -> void {
+            Position = pos;
         })");
 
-    wgpu::ShaderModule fsModule =
-        utils::CreateShaderModule(device, utils::SingleShaderStage::Fragment, R"(
-        #version 450
-        layout (set = 0, binding = 0) uniform UniformBuffer {
-            float color0;
+    wgpu::ShaderModule fsModule = utils::CreateShaderModuleFromWGSL(device, R"(
+        [[block]] struct Buf {
+            [[offset(0)]] color : f32;
         };
 
-        layout (set = 0, binding = 1) readonly buffer ReadonlyStorageBuffer {
-            float color1;
-        };
+        [[set(0), binding(0)]] var<uniform> uniformBuffer : Buf;
+        [[set(0), binding(1)]] var<storage_buffer> storageBuffer : [[access(read)]] Buf;
 
-        layout(location = 0) out vec4 fragColor;
-        void main() {
-            fragColor = vec4(color0, color1, 0.f, 1.f);
+        [[location(0)]] var<out> fragColor : vec4<f32>;
+        [[stage(fragment)]] fn main() -> void {
+            fragColor = vec4<f32>(uniformBuffer.color, storageBuffer.color, 0.0, 1.0);
         })");
 
     utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
@@ -561,8 +552,8 @@
 
     wgpu::RenderPipeline rp = device.CreateRenderPipeline(&rpDesc);
 
-    wgpu::BindGroup bindGroup1 = utils::MakeBindGroup(
-        device, rp.GetBindGroupLayout(0), {{0, uniformBuffer}, {1, readonlyStorageBuffer}});
+    wgpu::BindGroup bindGroup1 = utils::MakeBindGroup(device, rp.GetBindGroupLayout(0),
+                                                      {{0, uniformBuffer}, {1, storageBuffer}});
 
     // Read data in buffers in render pass.
     wgpu::RenderPassEncoder pass1 = encoder.BeginRenderPass(&renderPass.renderPassInfo);
@@ -589,31 +580,26 @@
 // buffer in render pass depend on the write operation in compute pass.
 TEST_P(MultipleWriteThenMultipleReadTests, OneBuffer) {
     // Create pipeline, bind group, and a complex buffer for compute pass.
-    wgpu::ShaderModule csModule =
-        utils::CreateShaderModule(device, utils::SingleShaderStage::Compute, R"(
-        #version 450
-        layout(std140, set = 0, binding = 0) buffer Contents {
-            // Every single float (and every float in an array, and every single vec2, vec3, and
-            // every column in mat2/mat3, etc) uses the same amount of memory as vec4 (float4).
-            vec4 pos[4];
-            vec4 padding0[12];
-            ivec4 indices[2];
-            ivec4 padding1[14];
-            float color0;
-            float padding2[15];
-            float color1;
+    wgpu::ShaderModule csModule = utils::CreateShaderModuleFromWGSL(device, R"(
+        [[block]] struct Contents {
+            [[offset(0)]] pos : [[stride(16)]] array<vec4<f32>, 4>;
+            [[offset(256)]] indices : [[stride(16)]] array<vec4<i32>, 2>;
+            [[offset(512)]] color0 : f32;
+            [[offset(768)]] color1 : f32;
         };
 
-        void main() {
-            pos[0] = vec4(-1.f, 1.f, 0.f, 1.f);
-            pos[1] = vec4(1.f, 1.f, 0.f, 1.f);
-            pos[2] = vec4(1.f, -1.f, 0.f, 1.f);
-            pos[3] = vec4(-1.f, -1.f, 0.f, 1.f);
-            int dummy = 0;
-            indices[0] = ivec4(0, 1, 2, 0);
-            indices[1] = ivec4(2, 3, dummy, dummy);
-            color0 = 1.0;
-            color1 = 1.0;
+        [[set(0), binding(0)]] var<storage_buffer> contents : [[access(read_write)]] Contents;
+
+        [[stage(compute)]] fn main() -> void {
+            contents.pos[0] = vec4<f32>(-1.0, 1.0, 0.0, 1.0);
+            contents.pos[1] = vec4<f32>(1.0, 1.0, 0.0, 1.0);
+            contents.pos[2] = vec4<f32>(1.0, -1.0, 0.0, 1.0);
+            contents.pos[3] = vec4<f32>(-1.0, -1.0, 0.0, 1.0);
+            const dummy : i32 = 0;
+            contents.indices[0] = vec4<i32>(0, 1, 2, 0);
+            contents.indices[1] = vec4<i32>(2, 3, dummy, dummy);
+            contents.color0 = 1.0;
+            contents.color1 = 1.0;
         })");
 
     wgpu::ComputePipelineDescriptor cpDesc;
@@ -625,9 +611,9 @@
         char padding0[256 - sizeof(float) * 16];
         int indices[2][4];
         char padding1[256 - sizeof(int) * 8];
-        float color0[4];
-        char padding2[256 - sizeof(float) * 4];
-        float color1[4];
+        float color0;
+        char padding2[256 - sizeof(float)];
+        float color1;
     };
     wgpu::Buffer buffer = CreateZeroedBuffer(
         sizeof(Data), wgpu::BufferUsage::Vertex | wgpu::BufferUsage::Index |
@@ -645,28 +631,23 @@
     pass0.EndPass();
 
     // Create pipeline, bind group, and reuse the buffer in render pass.
-    wgpu::ShaderModule vsModule =
-        utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex, R"(
-        #version 450
-        layout(location = 0) in vec4 pos;
-        void main() {
-            gl_Position = pos;
+    wgpu::ShaderModule vsModule = utils::CreateShaderModuleFromWGSL(device, R"(
+        [[location(0)]] var<in> pos : vec4<f32>;
+        [[builtin(position)]] var<out> Position : vec4<f32>;
+        [[stage(vertex)]] fn main() -> void {
+            Position = pos;
         })");
 
-    wgpu::ShaderModule fsModule =
-        utils::CreateShaderModule(device, utils::SingleShaderStage::Fragment, R"(
-        #version 450
-        layout (set = 0, binding = 0) uniform UniformBuffer {
-            float color0;
+    wgpu::ShaderModule fsModule = utils::CreateShaderModuleFromWGSL(device, R"(
+        [[block]] struct Buf {
+            [[offset(0)]] color : f32;
         };
+        [[set(0), binding(0)]] var<uniform> uniformBuffer : Buf;
+        [[set(0), binding(1)]] var<storage_buffer> storageBuffer : [[access(read)]] Buf;
 
-        layout (set = 0, binding = 1) readonly buffer ReadonlyStorageBuffer {
-            float color1;
-        };
-
-        layout(location = 0) out vec4 fragColor;
-        void main() {
-            fragColor = vec4(color0, color1, 0.f, 1.f);
+        [[location(0)]] var<out> fragColor : vec4<f32>;
+        [[stage(fragment)]] fn main() -> void {
+            fragColor = vec4<f32>(uniformBuffer.color, storageBuffer.color, 0.0, 1.0);
         })");
 
     utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);