mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-17 00:47:13 +00:00
Disallow storage buffer binding in vertex shader
Writable storage buffer in vertex shader is an optional feature. It is not supported in many devices/OSes. WebGPU doesn't support writable storage buffer in vertex shader. This change generates an error for storage buffer binding for vertex shader stage, in order to disallow writable storage buffer in vertex shader. This change also adds a validation test and revises existing end2end tests and validation tests accordingly. BUG=dawn:180 Change-Id: I9def918d19f65aab45a31acb985c1a0a09c97ca8 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/14521 Commit-Queue: Yunchao He <yunchao.he@intel.com> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Austin Eng <enga@chromium.org>
This commit is contained in:
committed by
Commit Bot service account
parent
bfb2a5740f
commit
d28b578b6b
@@ -493,6 +493,22 @@ class BindGroupLayoutValidationTest : public ValidationTest {
|
||||
}
|
||||
};
|
||||
|
||||
// Tests setting storage buffer and readonly storage buffer bindings in vertex and fragment shader.
|
||||
TEST_F(BindGroupLayoutValidationTest, BindGroupLayoutStorageBindingsInVertexShader) {
|
||||
// Checks that storage buffer binding is not supported in vertex shader.
|
||||
ASSERT_DEVICE_ERROR(utils::MakeBindGroupLayout(
|
||||
device, {{0, wgpu::ShaderStage::Vertex, wgpu::BindingType::StorageBuffer}}));
|
||||
|
||||
utils::MakeBindGroupLayout(
|
||||
device, {{0, wgpu::ShaderStage::Vertex, wgpu::BindingType::ReadonlyStorageBuffer}});
|
||||
|
||||
utils::MakeBindGroupLayout(
|
||||
device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
|
||||
|
||||
utils::MakeBindGroupLayout(
|
||||
device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageBuffer}});
|
||||
}
|
||||
|
||||
// Tests setting OOB checks for kMaxBindingsPerGroup in bind group layouts.
|
||||
TEST_F(BindGroupLayoutValidationTest, BindGroupLayoutBindingOOB) {
|
||||
// Checks that kMaxBindingsPerGroup - 1 is valid.
|
||||
|
||||
@@ -210,7 +210,7 @@ TEST_F(CommandBufferValidationTest, BufferWithReadAndWriteUsage) {
|
||||
|
||||
// Create the bind group to use the buffer as storage
|
||||
wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
|
||||
device, {{0, wgpu::ShaderStage::Vertex, wgpu::BindingType::StorageBuffer}});
|
||||
device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
|
||||
wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, buffer, 0, 4}});
|
||||
|
||||
// Use the buffer as both index and storage in the same pass
|
||||
@@ -258,8 +258,8 @@ TEST_F(CommandBufferValidationTest, BufferWithReadAndWriteStorageBufferUsage) {
|
||||
|
||||
// Create the bind group to use the buffer as storage
|
||||
wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
|
||||
device, {{0, wgpu::ShaderStage::Vertex, wgpu::BindingType::StorageBuffer},
|
||||
{1, wgpu::ShaderStage::Vertex, wgpu::BindingType::ReadonlyStorageBuffer}});
|
||||
device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer},
|
||||
{1, wgpu::ShaderStage::Fragment, wgpu::BindingType::ReadonlyStorageBuffer}});
|
||||
wgpu::BindGroup bg =
|
||||
utils::MakeBindGroup(device, bgl, {{0, buffer, 0, 4}, {1, buffer, 256, 4}});
|
||||
|
||||
|
||||
@@ -22,14 +22,14 @@ class GetBindGroupLayoutTests : public ValidationTest {
|
||||
static constexpr wgpu::ShaderStage kVisibilityAll =
|
||||
wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment | wgpu::ShaderStage::Vertex;
|
||||
|
||||
wgpu::RenderPipeline RenderPipelineFromVertexShader(const char* shader) {
|
||||
wgpu::RenderPipeline RenderPipelineFromFragmentShader(const char* shader) {
|
||||
wgpu::ShaderModule vsModule =
|
||||
utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex, shader);
|
||||
wgpu::ShaderModule fsModule =
|
||||
utils::CreateShaderModule(device, utils::SingleShaderStage::Fragment, R"(
|
||||
utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex, R"(
|
||||
#version 450
|
||||
void main() {
|
||||
})");
|
||||
wgpu::ShaderModule fsModule =
|
||||
utils::CreateShaderModule(device, utils::SingleShaderStage::Fragment, shader);
|
||||
|
||||
utils::ComboRenderPipelineDescriptor descriptor(device);
|
||||
descriptor.layout = nullptr;
|
||||
@@ -93,7 +93,7 @@ TEST_F(GetBindGroupLayoutTests, SameObject) {
|
||||
// - shader stage visibility is All
|
||||
// - dynamic offsets is false
|
||||
TEST_F(GetBindGroupLayoutTests, DefaultShaderStageAndDynamicOffsets) {
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform UniformBuffer {
|
||||
vec4 pos;
|
||||
@@ -167,7 +167,6 @@ TEST_F(GetBindGroupLayoutTests, ComputePipeline) {
|
||||
TEST_F(GetBindGroupLayoutTests, BindingType) {
|
||||
wgpu::BindGroupLayoutBinding binding = {};
|
||||
binding.binding = 0;
|
||||
binding.visibility = kVisibilityAll;
|
||||
binding.hasDynamicOffset = false;
|
||||
binding.multisampled = false;
|
||||
|
||||
@@ -175,9 +174,24 @@ TEST_F(GetBindGroupLayoutTests, BindingType) {
|
||||
desc.bindingCount = 1;
|
||||
desc.bindings = &binding;
|
||||
|
||||
{
|
||||
// Storage buffer binding is not supported in vertex shader.
|
||||
binding.visibility = wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment;
|
||||
binding.type = wgpu::BindingType::StorageBuffer;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) buffer Storage {
|
||||
vec4 pos;
|
||||
};
|
||||
|
||||
void main() {})");
|
||||
EXPECT_EQ(device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get());
|
||||
}
|
||||
|
||||
binding.visibility = kVisibilityAll;
|
||||
{
|
||||
binding.type = wgpu::BindingType::UniformBuffer;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform Buffer {
|
||||
vec4 pos;
|
||||
@@ -187,21 +201,9 @@ TEST_F(GetBindGroupLayoutTests, BindingType) {
|
||||
EXPECT_EQ(device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get());
|
||||
}
|
||||
|
||||
{
|
||||
binding.type = wgpu::BindingType::StorageBuffer;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) buffer Storage {
|
||||
vec4 pos;
|
||||
};
|
||||
|
||||
void main() {})");
|
||||
EXPECT_EQ(device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get());
|
||||
}
|
||||
|
||||
{
|
||||
binding.type = wgpu::BindingType::ReadonlyStorageBuffer;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) readonly buffer Storage {
|
||||
vec4 pos;
|
||||
@@ -213,7 +215,7 @@ TEST_F(GetBindGroupLayoutTests, BindingType) {
|
||||
|
||||
{
|
||||
binding.type = wgpu::BindingType::SampledTexture;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform texture2D tex;
|
||||
|
||||
@@ -223,7 +225,7 @@ TEST_F(GetBindGroupLayoutTests, BindingType) {
|
||||
|
||||
{
|
||||
binding.type = wgpu::BindingType::Sampler;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform sampler samp;
|
||||
|
||||
@@ -246,7 +248,7 @@ TEST_F(GetBindGroupLayoutTests, Multisampled) {
|
||||
|
||||
{
|
||||
binding.multisampled = false;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform texture2D tex;
|
||||
|
||||
@@ -258,7 +260,7 @@ TEST_F(GetBindGroupLayoutTests, Multisampled) {
|
||||
GTEST_SKIP() << "Multisampling unimplemented";
|
||||
{
|
||||
binding.multisampled = true;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform texture2DMS tex;
|
||||
|
||||
@@ -282,7 +284,7 @@ TEST_F(GetBindGroupLayoutTests, TextureDimension) {
|
||||
|
||||
{
|
||||
binding.textureDimension = wgpu::TextureViewDimension::e1D;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform texture1D tex;
|
||||
|
||||
@@ -292,7 +294,7 @@ TEST_F(GetBindGroupLayoutTests, TextureDimension) {
|
||||
|
||||
{
|
||||
binding.textureDimension = wgpu::TextureViewDimension::e2D;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform texture2D tex;
|
||||
|
||||
@@ -302,7 +304,7 @@ TEST_F(GetBindGroupLayoutTests, TextureDimension) {
|
||||
|
||||
{
|
||||
binding.textureDimension = wgpu::TextureViewDimension::e2DArray;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform texture2DArray tex;
|
||||
|
||||
@@ -312,7 +314,7 @@ TEST_F(GetBindGroupLayoutTests, TextureDimension) {
|
||||
|
||||
{
|
||||
binding.textureDimension = wgpu::TextureViewDimension::e3D;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform texture3D tex;
|
||||
|
||||
@@ -322,7 +324,7 @@ TEST_F(GetBindGroupLayoutTests, TextureDimension) {
|
||||
|
||||
{
|
||||
binding.textureDimension = wgpu::TextureViewDimension::Cube;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform textureCube tex;
|
||||
|
||||
@@ -332,7 +334,7 @@ TEST_F(GetBindGroupLayoutTests, TextureDimension) {
|
||||
|
||||
{
|
||||
binding.textureDimension = wgpu::TextureViewDimension::CubeArray;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform textureCubeArray tex;
|
||||
|
||||
@@ -356,7 +358,7 @@ TEST_F(GetBindGroupLayoutTests, TextureComponentType) {
|
||||
|
||||
{
|
||||
binding.textureComponentType = wgpu::TextureComponentType::Float;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform texture2D tex;
|
||||
|
||||
@@ -366,7 +368,7 @@ TEST_F(GetBindGroupLayoutTests, TextureComponentType) {
|
||||
|
||||
{
|
||||
binding.textureComponentType = wgpu::TextureComponentType::Sint;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform itexture2D tex;
|
||||
|
||||
@@ -376,7 +378,7 @@ TEST_F(GetBindGroupLayoutTests, TextureComponentType) {
|
||||
|
||||
{
|
||||
binding.textureComponentType = wgpu::TextureComponentType::Uint;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform utexture2D tex;
|
||||
|
||||
@@ -399,7 +401,7 @@ TEST_F(GetBindGroupLayoutTests, BindingIndices) {
|
||||
|
||||
{
|
||||
binding.binding = 0;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform Buffer {
|
||||
vec4 pos;
|
||||
@@ -411,7 +413,7 @@ TEST_F(GetBindGroupLayoutTests, BindingIndices) {
|
||||
|
||||
{
|
||||
binding.binding = 1;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 1) uniform Buffer {
|
||||
vec4 pos;
|
||||
@@ -423,7 +425,7 @@ TEST_F(GetBindGroupLayoutTests, BindingIndices) {
|
||||
|
||||
{
|
||||
binding.binding = 2;
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 1) uniform Buffer {
|
||||
vec4 pos;
|
||||
@@ -571,7 +573,7 @@ TEST_F(GetBindGroupLayoutTests, ConflictingBindingTextureComponentType) {
|
||||
|
||||
// Test it is an error to query an out of range bind group layout.
|
||||
TEST_F(GetBindGroupLayoutTests, OutOfRangeIndex) {
|
||||
ASSERT_DEVICE_ERROR(RenderPipelineFromVertexShader(R"(
|
||||
ASSERT_DEVICE_ERROR(RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform Buffer1 {
|
||||
vec4 pos1;
|
||||
@@ -579,7 +581,7 @@ TEST_F(GetBindGroupLayoutTests, OutOfRangeIndex) {
|
||||
void main() {})")
|
||||
.GetBindGroupLayout(kMaxBindGroups));
|
||||
|
||||
ASSERT_DEVICE_ERROR(RenderPipelineFromVertexShader(R"(
|
||||
ASSERT_DEVICE_ERROR(RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform Buffer1 {
|
||||
vec4 pos1;
|
||||
@@ -590,7 +592,7 @@ TEST_F(GetBindGroupLayoutTests, OutOfRangeIndex) {
|
||||
|
||||
// Test that unused indices return the empty bind group layout.
|
||||
TEST_F(GetBindGroupLayoutTests, UnusedIndex) {
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromVertexShader(R"(
|
||||
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
|
||||
#version 450
|
||||
layout(set = 0, binding = 0) uniform Buffer1 {
|
||||
vec4 pos1;
|
||||
|
||||
Reference in New Issue
Block a user