Update ComputeCopyStorageBufferTests to use WGSL
Bug: dawn:572 Change-Id: If5cce116540bd4298824e3801ee48b2197269cd4 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/32505 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Ben Clayton <bclayton@google.com> Commit-Queue: Austin Eng <enga@chromium.org>
This commit is contained in:
parent
545a6970cb
commit
584ba432e9
|
@ -29,7 +29,7 @@ class ComputeCopyStorageBufferTests : public DawnTest {
|
||||||
|
|
||||||
void ComputeCopyStorageBufferTests::BasicTest(const char* shader) {
|
void ComputeCopyStorageBufferTests::BasicTest(const char* shader) {
|
||||||
// Set up shader and pipeline
|
// Set up shader and pipeline
|
||||||
auto module = utils::CreateShaderModule(device, utils::SingleShaderStage::Compute, shader);
|
auto module = utils::CreateShaderModuleFromWGSL(device, shader);
|
||||||
|
|
||||||
wgpu::ComputePipelineDescriptor csDesc;
|
wgpu::ComputePipelineDescriptor csDesc;
|
||||||
csDesc.computeStage.module = module;
|
csDesc.computeStage.module = module;
|
||||||
|
@ -88,13 +88,22 @@ void ComputeCopyStorageBufferTests::BasicTest(const char* shader) {
|
||||||
// Test that a trivial compute-shader memcpy implementation works.
|
// Test that a trivial compute-shader memcpy implementation works.
|
||||||
TEST_P(ComputeCopyStorageBufferTests, SizedArrayOfBasic) {
|
TEST_P(ComputeCopyStorageBufferTests, SizedArrayOfBasic) {
|
||||||
BasicTest(R"(
|
BasicTest(R"(
|
||||||
#version 450
|
[[block]] struct Buf1 {
|
||||||
#define kInstances 4
|
[[offset(0)]] s : [[stride(16)]] array<vec4<u32>, 4>;
|
||||||
layout(std140, set = 0, binding = 0) buffer Src { uvec4 s[kInstances]; } src;
|
};
|
||||||
layout(std140, set = 0, binding = 1) buffer Dst { uvec4 s[kInstances]; } dst;
|
[[block]] struct Buf2 {
|
||||||
void main() {
|
[[offset(0)]] s : [[stride(16)]] array<vec4<u32>, 4>;
|
||||||
uint index = gl_GlobalInvocationID.x;
|
};
|
||||||
if (index >= kInstances) { return; }
|
|
||||||
|
// TODO(crbug.com/tint/386): Use the same struct type
|
||||||
|
[[set(0), binding(0)]] var<storage> src : Buf1;
|
||||||
|
[[set(0), binding(1)]] var<storage> dst : Buf2;
|
||||||
|
|
||||||
|
[[builtin(global_invocation_id)]] var<in> GlobalInvocationID : vec3<u32>;
|
||||||
|
|
||||||
|
[[stage(compute)]] fn main() -> void {
|
||||||
|
var index : u32 = GlobalInvocationID.x;
|
||||||
|
if (index >= 4) { return; }
|
||||||
dst.s[index] = src.s[index];
|
dst.s[index] = src.s[index];
|
||||||
})");
|
})");
|
||||||
}
|
}
|
||||||
|
@ -102,79 +111,54 @@ TEST_P(ComputeCopyStorageBufferTests, SizedArrayOfBasic) {
|
||||||
// Test that a slightly-less-trivial compute-shader memcpy implementation works.
|
// Test that a slightly-less-trivial compute-shader memcpy implementation works.
|
||||||
TEST_P(ComputeCopyStorageBufferTests, SizedArrayOfStruct) {
|
TEST_P(ComputeCopyStorageBufferTests, SizedArrayOfStruct) {
|
||||||
BasicTest(R"(
|
BasicTest(R"(
|
||||||
#version 450
|
|
||||||
#define kInstances 4
|
|
||||||
struct S {
|
struct S {
|
||||||
uvec2 a, b; // kUintsPerInstance = 4
|
[[offset(0)]] a : vec2<u32>;
|
||||||
|
[[offset(8)]] b : vec2<u32>;
|
||||||
};
|
};
|
||||||
layout(std140, set = 0, binding = 0) buffer Src { S s[kInstances]; } src;
|
|
||||||
layout(std140, set = 0, binding = 1) buffer Dst { S s[kInstances]; } dst;
|
[[block]] struct Buf1 {
|
||||||
void main() {
|
[[offset(0)]] s : [[stride(16)]] array<S, 4>;
|
||||||
uint index = gl_GlobalInvocationID.x;
|
};
|
||||||
if (index >= kInstances) { return; }
|
[[block]] struct Buf2 {
|
||||||
|
[[offset(0)]] s : [[stride(16)]] array<S, 4>;
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO(crbug.com/tint/386): Use the same struct type
|
||||||
|
[[set(0), binding(0)]] var<storage> src : Buf1;
|
||||||
|
[[set(0), binding(1)]] var<storage> dst : Buf2;
|
||||||
|
|
||||||
|
[[builtin(global_invocation_id)]] var<in> GlobalInvocationID : vec3<u32>;
|
||||||
|
|
||||||
|
[[stage(compute)]] fn main() -> void {
|
||||||
|
var index : u32 = GlobalInvocationID.x;
|
||||||
|
if (index >= 4) { return; }
|
||||||
dst.s[index] = src.s[index];
|
dst.s[index] = src.s[index];
|
||||||
})");
|
})");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test that a trivial compute-shader memcpy implementation works.
|
// Test that a trivial compute-shader memcpy implementation works.
|
||||||
TEST_P(ComputeCopyStorageBufferTests, UnsizedArrayOfBasic) {
|
TEST_P(ComputeCopyStorageBufferTests, UnsizedArrayOfBasic) {
|
||||||
// TODO(crbug.com/tint/400)
|
|
||||||
// Tint transform failure: error: invalid 0 size for array or vector
|
|
||||||
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
|
|
||||||
BasicTest(R"(
|
BasicTest(R"(
|
||||||
#version 450
|
[[block]] struct Buf1 {
|
||||||
#define kInstances 4
|
[[offset(0)]] s : [[stride(16)]] array<vec4<u32>>;
|
||||||
layout(std140, set = 0, binding = 0) buffer Src { uvec4 s[]; } src;
|
};
|
||||||
layout(std140, set = 0, binding = 1) buffer Dst { uvec4 s[]; } dst;
|
[[block]] struct Buf2 {
|
||||||
void main() {
|
[[offset(0)]] s : [[stride(16)]] array<vec4<u32>>;
|
||||||
uint index = gl_GlobalInvocationID.x;
|
};
|
||||||
if (index >= kInstances) { return; }
|
|
||||||
|
// TODO(crbug.com/tint/386): Use the same struct type
|
||||||
|
[[set(0), binding(0)]] var<storage> src : Buf1;
|
||||||
|
[[set(0), binding(1)]] var<storage> dst : Buf2;
|
||||||
|
|
||||||
|
[[builtin(global_invocation_id)]] var<in> GlobalInvocationID : vec3<u32>;
|
||||||
|
|
||||||
|
[[stage(compute)]] fn main() -> void {
|
||||||
|
var index : u32 = GlobalInvocationID.x;
|
||||||
|
if (index >= 4) { return; }
|
||||||
dst.s[index] = src.s[index];
|
dst.s[index] = src.s[index];
|
||||||
})");
|
})");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test binding a sized array of SSBO descriptors.
|
|
||||||
//
|
|
||||||
// This is disabled because WebGPU doesn't currently have binding arrays (equivalent to
|
|
||||||
// VkDescriptorSetLayoutBinding::descriptorCount). https://github.com/gpuweb/gpuweb/pull/61
|
|
||||||
TEST_P(ComputeCopyStorageBufferTests, DISABLED_SizedDescriptorArray) {
|
|
||||||
BasicTest(R"(
|
|
||||||
#version 450
|
|
||||||
#define kInstances 4
|
|
||||||
struct S {
|
|
||||||
uvec2 a, b; // kUintsPerInstance = 4
|
|
||||||
};
|
|
||||||
layout(std140, set = 0, binding = 0) buffer Src { S s; } src[kInstances];
|
|
||||||
layout(std140, set = 0, binding = 1) buffer Dst { S s; } dst[kInstances];
|
|
||||||
void main() {
|
|
||||||
uint index = gl_GlobalInvocationID.x;
|
|
||||||
if (index >= kInstances) { return; }
|
|
||||||
dst[index].s = src[index].s;
|
|
||||||
})");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test binding an unsized array of SSBO descriptors.
|
|
||||||
//
|
|
||||||
// TODO(kainino@chromium.org): This test may be somewhat wrong. I'm not sure whether this is
|
|
||||||
// supposed to be possible on the various native APIs.
|
|
||||||
// Linking on OpenGL fails with "OpenGL requires constant indexes for unsized array access(dst)".
|
|
||||||
TEST_P(ComputeCopyStorageBufferTests, DISABLED_UnsizedDescriptorArray) {
|
|
||||||
BasicTest(R"(
|
|
||||||
#version 450
|
|
||||||
#extension GL_EXT_nonuniform_qualifier : require
|
|
||||||
#define kInstances 4
|
|
||||||
struct S {
|
|
||||||
uvec2 a, b; // kUintsPerInstance = 4
|
|
||||||
};
|
|
||||||
layout(std140, set = 0, binding = 0) buffer Src { S s; } src[];
|
|
||||||
layout(std140, set = 0, binding = 1) buffer Dst { S s; } dst[];
|
|
||||||
void main() {
|
|
||||||
uint index = gl_GlobalInvocationID.x;
|
|
||||||
if (index >= kInstances) { return; }
|
|
||||||
dst[index].s = src[index].s;
|
|
||||||
})");
|
|
||||||
}
|
|
||||||
|
|
||||||
DAWN_INSTANTIATE_TEST(ComputeCopyStorageBufferTests,
|
DAWN_INSTANTIATE_TEST(ComputeCopyStorageBufferTests,
|
||||||
D3D12Backend(),
|
D3D12Backend(),
|
||||||
MetalBackend(),
|
MetalBackend(),
|
||||||
|
|
Loading…
Reference in New Issue