Update OpArrayLengthTests to use WGSL
Bug: dawn:572
Change-Id: Iba92adda4758fc91294f7c6d8b0be3065c786f71
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/33773
Commit-Queue: Austin Eng <enga@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/tests/end2end/OpArrayLengthTests.cpp b/src/tests/end2end/OpArrayLengthTests.cpp
index 884378c..8cb1e1f 100644
--- a/src/tests/end2end/OpArrayLengthTests.cpp
+++ b/src/tests/end2end/OpArrayLengthTests.cpp
@@ -56,23 +56,33 @@
// Common shader code to use these buffers in shaders, assuming they are in bindgroup index
// 0.
mShaderInterface = R"(
- // The length should be 1 because the buffer is 4-byte long.
- layout(std430, set = 0, binding = 0) readonly buffer Buffer1 {
- float data[];
- } buffer1;
+ # TODO(crbug.com/tint/386): Use the same struct.
+ [[block]] struct DataBuffer1 {
+ [[offset(0)]] data : [[stride(4)]] array<f32>;
+ };
- // The length should be 64 because the buffer is 256 bytes long.
- layout(std430, set = 0, binding = 1) readonly buffer Buffer2 {
- float data[];
- } buffer2;
+ [[block]] struct DataBuffer2 {
+ [[offset(0)]] data : [[stride(4)]] array<f32>;
+ };
- // The length should be (512 - 16*4) / 8 = 56 because the buffer is 512 bytes long
- // and the structure is 8 bytes big.
- struct Buffer3Data {float a; int b;};
- layout(std430, set = 0, binding = 2) readonly buffer Buffer3 {
- mat4 garbage;
- Buffer3Data data[];
- } buffer3;
+ # The length should be 1 because the buffer is 4-byte long.
+ [[set(0), binding(0)]] var<storage_buffer> buffer1 : [[access(read)]] DataBuffer1;
+
+ # The length should be 64 because the buffer is 256 bytes long.
+ [[set(0), binding(1)]] var<storage_buffer> buffer2 : [[access(read)]] DataBuffer2;
+
+ # The length should be (512 - 16*4) / 8 = 56 because the buffer is 512 bytes long
+ # and the structure is 8 bytes big.
+ struct Buffer3Data {
+ [[offset(0)]] a : f32;
+ [[offset(4)]] b : i32;
+ };
+
+ [[block]] struct Buffer3 {
+ [[offset(0)]] garbage : mat4x4<f32>;
+ [[offset(64)]] data : [[stride(8)]] array<Buffer3Data>;
+ };
+ [[set(0), binding(2)]] var<storage_buffer> buffer3 : [[access(read)]] Buffer3;
)";
// See comments in the shader for an explanation of these values
@@ -118,19 +128,18 @@
wgpu::ComputePipelineDescriptor pipelineDesc;
pipelineDesc.layout = pl;
pipelineDesc.computeStage.entryPoint = "main";
- pipelineDesc.computeStage.module =
- utils::CreateShaderModule(device, utils::SingleShaderStage::Compute,
- (R"(#version 450
- layout(std430, set = 1, binding = 0) buffer ResultBuffer {
- uint result[3];
- };
- )" + mShaderInterface + R"(
- void main() {
- result[0] = buffer1.data.length();
- result[1] = buffer2.data.length();
- result[2] = buffer3.data.length();
- })")
- .c_str());
+ pipelineDesc.computeStage.module = utils::CreateShaderModuleFromWGSL(device, (R"(
+ [[block]] struct ResultBuffer {
+ [[offset(0)]] data : [[stride(4)]] array<u32, 3>;
+ };
+ [[set(1), binding(0)]] var<storage_buffer> result : [[access(read_write)]] ResultBuffer;
+ )" + mShaderInterface + R"(
+ [[stage(compute)]] fn main() -> void {
+ result.data[0] = arrayLength(buffer1.data);
+ result.data[1] = arrayLength(buffer2.data);
+ result.data[2] = arrayLength(buffer3.data);
+ })")
+ .c_str());
wgpu::ComputePipeline pipeline = device.CreateComputePipeline(&pipelineDesc);
// Run a single instance of the compute shader
@@ -159,27 +168,21 @@
// Create the pipeline that computes the length of the buffers and writes it to the only render
// pass pixel.
- wgpu::ShaderModule vsModule =
- utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex, R"(
- #version 450
- void main() {
- gl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);
- 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
- )" + mShaderInterface + R"(
- layout(location = 0) out vec4 fragColor;
- void main() {
- fragColor.r = buffer1.data.length() / 255.0f;
- fragColor.g = buffer2.data.length() / 255.0f;
- fragColor.b = buffer3.data.length() / 255.0f;
- fragColor.a = 0.0f;
+ wgpu::ShaderModule fsModule = utils::CreateShaderModuleFromWGSL(device, (mShaderInterface + R"(
+ [[location(0)]] var<out> fragColor : vec4<f32>;
+ [[stage(fragment)]] fn main() -> void {
+ fragColor.r = f32(arrayLength(buffer1.data)) / 255.0;
+ fragColor.g = f32(arrayLength(buffer2.data)) / 255.0;
+ fragColor.b = f32(arrayLength(buffer3.data)) / 255.0;
+ fragColor.a = 0.0;
})")
- .c_str());
+ .c_str());
utils::ComboRenderPipelineDescriptor descriptor(device);
descriptor.vertexStage.module = vsModule;
@@ -217,29 +220,23 @@
// Create the pipeline that computes the length of the buffers and writes it to the only render
// pass pixel.
- wgpu::ShaderModule vsModule =
- utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex,
- (R"(
- #version 450
- )" + mShaderInterface + R"(
- layout(location = 0) out vec4 pointColor;
- void main() {
- pointColor.r = buffer1.data.length() / 255.0f;
- pointColor.g = buffer2.data.length() / 255.0f;
- pointColor.b = buffer3.data.length() / 255.0f;
- pointColor.a = 0.0f;
+ wgpu::ShaderModule vsModule = utils::CreateShaderModuleFromWGSL(device, (mShaderInterface + R"(
+ [[location(0)]] var<out> pointColor : vec4<f32>;
+ [[builtin(position)]] var<out> Position : vec4<f32>;
+ [[stage(vertex)]] fn main() -> void {
+ pointColor.r = f32(arrayLength(buffer1.data)) / 255.0;
+ pointColor.g = f32(arrayLength(buffer2.data)) / 255.0;
+ pointColor.b = f32(arrayLength(buffer3.data)) / 255.0;
+ pointColor.a = 0.0;
- gl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);
- gl_PointSize = 1.0;
+ Position = vec4<f32>(0.0, 0.0, 0.0, 1.0);
})")
- .c_str());
+ .c_str());
- wgpu::ShaderModule fsModule =
- utils::CreateShaderModule(device, utils::SingleShaderStage::Fragment, R"(
- #version 450
- layout(location = 0) out vec4 fragColor;
- layout(location = 0) in vec4 pointColor;
- void main() {
+ wgpu::ShaderModule fsModule = utils::CreateShaderModuleFromWGSL(device, R"(
+ [[location(0)]] var<out> fragColor : vec4<f32>;
+ [[location(0)]] var<in> pointColor : vec4<f32>;
+ [[stage(fragment)]] fn main() -> void {
fragColor = pointColor;
})");