From de8f1332f6320c81a7641e263206a469d100aa52 Mon Sep 17 00:00:00 2001 From: Ryan Harrison Date: Tue, 20 Apr 2021 20:47:51 +0000 Subject: [PATCH] Validate Storage Textures and update existing tests Adds rejecting unsupported image formats and texture dimensions. BUG=tint:718 Change-Id: Ic6375d1e75524336462ea59b159cb4c8601f55fd Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/48500 Auto-Submit: Ryan Harrison Kokoro: Kokoro Reviewed-by: Ben Clayton Commit-Queue: Ryan Harrison --- src/inspector/inspector_test.cc | 133 ++++++------------- src/resolver/intrinsic_test.cc | 24 ++-- src/resolver/resolver.cc | 62 ++++++++- src/resolver/type_validation_test.cc | 141 +++++++++++++++++++++ src/writer/msl/generator_impl_type_test.cc | 4 +- src/writer/spirv/builder_type_test.cc | 109 ++-------------- 6 files changed, 265 insertions(+), 208 deletions(-) diff --git a/src/inspector/inspector_test.cc b/src/inspector/inspector_test.cc index 15a95398dc..68214a0c04 100644 --- a/src/inspector/inspector_test.cc +++ b/src/inspector/inspector_test.cc @@ -1722,7 +1722,7 @@ TEST_F(InspectorGetResourceBindingsTest, Simple) { sem::Type* st_subtype; sem::AccessControl* st_ac; std::tie(st_type, st_subtype, st_ac) = MakeStorageTextureTypes( - sem::TextureDimension::k2d, sem::ImageFormat::kR8Uint, false); + sem::TextureDimension::k2d, sem::ImageFormat::kR32Uint, false); AddStorageTexture("st_var", st_ac, 4, 0); MakeStorageTextureBodyFunction("st_func", "st_var", ty.vec2(), {}); @@ -1730,7 +1730,7 @@ TEST_F(InspectorGetResourceBindingsTest, Simple) { sem::Type* rost_subtype; sem::AccessControl* rost_ac; std::tie(rost_type, rost_subtype, rost_ac) = MakeStorageTextureTypes( - sem::TextureDimension::k2d, sem::ImageFormat::kR8Uint, true); + sem::TextureDimension::k2d, sem::ImageFormat::kR32Uint, true); AddStorageTexture("rost_var", rost_ac, 4, 1); MakeStorageTextureBodyFunction("rost_func", "rost_var", ty.vec2(), {}); @@ -2965,110 +2965,53 @@ INSTANTIATE_TEST_SUITE_P( std::make_tuple(sem::TextureDimension::k3d, ResourceBinding::TextureDimension::k3d)), testing::Values( - std::make_tuple(sem::ImageFormat::kR8Uint, - ResourceBinding::ImageFormat::kR8Uint, - ResourceBinding::SampledKind::kUInt), - std::make_tuple(sem::ImageFormat::kR16Uint, - ResourceBinding::ImageFormat::kR16Uint, - ResourceBinding::SampledKind::kUInt), - std::make_tuple(sem::ImageFormat::kRg8Uint, - ResourceBinding::ImageFormat::kRg8Uint, - ResourceBinding::SampledKind::kUInt), - std::make_tuple(sem::ImageFormat::kR32Uint, - ResourceBinding::ImageFormat::kR32Uint, - ResourceBinding::SampledKind::kUInt), - std::make_tuple(sem::ImageFormat::kRg16Uint, - ResourceBinding::ImageFormat::kRg16Uint, - ResourceBinding::SampledKind::kUInt), - std::make_tuple(sem::ImageFormat::kRgba8Uint, - ResourceBinding::ImageFormat::kRgba8Uint, - ResourceBinding::SampledKind::kUInt), - std::make_tuple(sem::ImageFormat::kRg32Uint, - ResourceBinding::ImageFormat::kRg32Uint, - ResourceBinding::SampledKind::kUInt), - std::make_tuple(sem::ImageFormat::kRgba16Uint, - ResourceBinding::ImageFormat::kRgba16Uint, - ResourceBinding::SampledKind::kUInt), - std::make_tuple(sem::ImageFormat::kRgba32Uint, - ResourceBinding::ImageFormat::kRgba32Uint, - ResourceBinding::SampledKind::kUInt), - std::make_tuple(sem::ImageFormat::kR8Sint, - ResourceBinding::ImageFormat::kR8Sint, - ResourceBinding::SampledKind::kSInt), - std::make_tuple(sem::ImageFormat::kR16Sint, - ResourceBinding::ImageFormat::kR16Sint, - ResourceBinding::SampledKind::kSInt), - std::make_tuple(sem::ImageFormat::kRg8Sint, - ResourceBinding::ImageFormat::kRg8Sint, - ResourceBinding::SampledKind::kSInt), - std::make_tuple(sem::ImageFormat::kR32Sint, - ResourceBinding::ImageFormat::kR32Sint, - ResourceBinding::SampledKind::kSInt), - std::make_tuple(sem::ImageFormat::kRg16Sint, - ResourceBinding::ImageFormat::kRg16Sint, - ResourceBinding::SampledKind::kSInt), - std::make_tuple(sem::ImageFormat::kRgba8Sint, - ResourceBinding::ImageFormat::kRgba8Sint, - ResourceBinding::SampledKind::kSInt), - std::make_tuple(sem::ImageFormat::kRg32Sint, - ResourceBinding::ImageFormat::kRg32Sint, - ResourceBinding::SampledKind::kSInt), - std::make_tuple(sem::ImageFormat::kRgba16Sint, - ResourceBinding::ImageFormat::kRgba16Sint, - ResourceBinding::SampledKind::kSInt), - std::make_tuple(sem::ImageFormat::kRgba32Sint, - ResourceBinding::ImageFormat::kRgba32Sint, - ResourceBinding::SampledKind::kSInt), - std::make_tuple(sem::ImageFormat::kR8Unorm, - ResourceBinding::ImageFormat::kR8Unorm, - ResourceBinding::SampledKind::kFloat), - std::make_tuple(sem::ImageFormat::kRg8Unorm, - ResourceBinding::ImageFormat::kRg8Unorm, - ResourceBinding::SampledKind::kFloat), - std::make_tuple(sem::ImageFormat::kRgba8Unorm, - ResourceBinding::ImageFormat::kRgba8Unorm, - ResourceBinding::SampledKind::kFloat), - std::make_tuple(sem::ImageFormat::kRgba8UnormSrgb, - ResourceBinding::ImageFormat::kRgba8UnormSrgb, - ResourceBinding::SampledKind::kFloat), - std::make_tuple(sem::ImageFormat::kBgra8Unorm, - ResourceBinding::ImageFormat::kBgra8Unorm, - ResourceBinding::SampledKind::kFloat), - std::make_tuple(sem::ImageFormat::kBgra8UnormSrgb, - ResourceBinding::ImageFormat::kBgra8UnormSrgb, - ResourceBinding::SampledKind::kFloat), - std::make_tuple(sem::ImageFormat::kRgb10A2Unorm, - ResourceBinding::ImageFormat::kRgb10A2Unorm, - ResourceBinding::SampledKind::kFloat), - std::make_tuple(sem::ImageFormat::kR8Snorm, - ResourceBinding::ImageFormat::kR8Snorm, - ResourceBinding::SampledKind::kFloat), - std::make_tuple(sem::ImageFormat::kRg8Snorm, - ResourceBinding::ImageFormat::kRg8Snorm, - ResourceBinding::SampledKind::kFloat), - std::make_tuple(sem::ImageFormat::kRgba8Snorm, - ResourceBinding::ImageFormat::kRgba8Snorm, - ResourceBinding::SampledKind::kFloat), - std::make_tuple(sem::ImageFormat::kR16Float, - ResourceBinding::ImageFormat::kR16Float, - ResourceBinding::SampledKind::kFloat), std::make_tuple(sem::ImageFormat::kR32Float, ResourceBinding::ImageFormat::kR32Float, ResourceBinding::SampledKind::kFloat), - std::make_tuple(sem::ImageFormat::kRg16Float, - ResourceBinding::ImageFormat::kRg16Float, - ResourceBinding::SampledKind::kFloat), - std::make_tuple(sem::ImageFormat::kRg11B10Float, - ResourceBinding::ImageFormat::kRg11B10Float, - ResourceBinding::SampledKind::kFloat), + std::make_tuple(sem::ImageFormat::kR32Sint, + ResourceBinding::ImageFormat::kR32Sint, + ResourceBinding::SampledKind::kSInt), + std::make_tuple(sem::ImageFormat::kR32Uint, + ResourceBinding::ImageFormat::kR32Uint, + ResourceBinding::SampledKind::kUInt), std::make_tuple(sem::ImageFormat::kRg32Float, ResourceBinding::ImageFormat::kRg32Float, ResourceBinding::SampledKind::kFloat), + std::make_tuple(sem::ImageFormat::kRg32Sint, + ResourceBinding::ImageFormat::kRg32Sint, + ResourceBinding::SampledKind::kSInt), + std::make_tuple(sem::ImageFormat::kRg32Uint, + ResourceBinding::ImageFormat::kRg32Uint, + ResourceBinding::SampledKind::kUInt), std::make_tuple(sem::ImageFormat::kRgba16Float, ResourceBinding::ImageFormat::kRgba16Float, ResourceBinding::SampledKind::kFloat), + std::make_tuple(sem::ImageFormat::kRgba16Sint, + ResourceBinding::ImageFormat::kRgba16Sint, + ResourceBinding::SampledKind::kSInt), + std::make_tuple(sem::ImageFormat::kRgba16Uint, + ResourceBinding::ImageFormat::kRgba16Uint, + ResourceBinding::SampledKind::kUInt), std::make_tuple(sem::ImageFormat::kRgba32Float, ResourceBinding::ImageFormat::kRgba32Float, + ResourceBinding::SampledKind::kFloat), + std::make_tuple(sem::ImageFormat::kRgba32Sint, + ResourceBinding::ImageFormat::kRgba32Sint, + ResourceBinding::SampledKind::kSInt), + std::make_tuple(sem::ImageFormat::kRgba32Uint, + ResourceBinding::ImageFormat::kRgba32Uint, + ResourceBinding::SampledKind::kUInt), + std::make_tuple(sem::ImageFormat::kRgba8Sint, + ResourceBinding::ImageFormat::kRgba8Sint, + ResourceBinding::SampledKind::kSInt), + std::make_tuple(sem::ImageFormat::kRgba8Snorm, + ResourceBinding::ImageFormat::kRgba8Snorm, + ResourceBinding::SampledKind::kFloat), + std::make_tuple(sem::ImageFormat::kRgba8Uint, + ResourceBinding::ImageFormat::kRgba8Uint, + ResourceBinding::SampledKind::kUInt), + std::make_tuple(sem::ImageFormat::kRgba8Unorm, + ResourceBinding::ImageFormat::kRgba8Unorm, ResourceBinding::SampledKind::kFloat)))); TEST_P(InspectorGetDepthTextureResourceBindingsTestWithParam, diff --git a/src/resolver/intrinsic_test.cc b/src/resolver/intrinsic_test.cc index 5adf046ddb..434305f296 100644 --- a/src/resolver/intrinsic_test.cc +++ b/src/resolver/intrinsic_test.cc @@ -302,29 +302,29 @@ INSTANTIATE_TEST_SUITE_P( ResolverIntrinsicTest_StorageTextureOperation, testing::Values( TextureTestParams{sem::TextureDimension::k1d, Texture::kF32, - sem::ImageFormat::kR16Float}, + sem::ImageFormat::kR32Float}, TextureTestParams{sem::TextureDimension::k1d, Texture::kI32, - sem::ImageFormat::kR16Sint}, + sem::ImageFormat::kR32Sint}, TextureTestParams{sem::TextureDimension::k1d, Texture::kF32, - sem::ImageFormat::kR8Unorm}, + sem::ImageFormat::kRgba8Unorm}, TextureTestParams{sem::TextureDimension::k2d, Texture::kF32, - sem::ImageFormat::kR16Float}, + sem::ImageFormat::kR32Float}, TextureTestParams{sem::TextureDimension::k2d, Texture::kI32, - sem::ImageFormat::kR16Sint}, + sem::ImageFormat::kR32Sint}, TextureTestParams{sem::TextureDimension::k2d, Texture::kF32, - sem::ImageFormat::kR8Unorm}, + sem::ImageFormat::kRgba8Unorm}, TextureTestParams{sem::TextureDimension::k2dArray, Texture::kF32, - sem::ImageFormat::kR16Float}, + sem::ImageFormat::kR32Float}, TextureTestParams{sem::TextureDimension::k2dArray, Texture::kI32, - sem::ImageFormat::kR16Sint}, + sem::ImageFormat::kR32Sint}, TextureTestParams{sem::TextureDimension::k2dArray, Texture::kF32, - sem::ImageFormat::kR8Unorm}, + sem::ImageFormat::kRgba8Unorm}, TextureTestParams{sem::TextureDimension::k3d, Texture::kF32, - sem::ImageFormat::kR16Float}, + sem::ImageFormat::kR32Float}, TextureTestParams{sem::TextureDimension::k3d, Texture::kI32, - sem::ImageFormat::kR16Sint}, + sem::ImageFormat::kR32Sint}, TextureTestParams{sem::TextureDimension::k3d, Texture::kF32, - sem::ImageFormat::kR8Unorm})); + sem::ImageFormat::kRgba8Unorm})); using ResolverIntrinsicTest_SampledTextureOperation = ResolverIntrinsicTest_TextureOperation; diff --git a/src/resolver/resolver.cc b/src/resolver/resolver.cc index 947dfefabe..24790f1347 100644 --- a/src/resolver/resolver.cc +++ b/src/resolver/resolver.cc @@ -42,6 +42,7 @@ #include "src/sem/member_accessor_expression.h" #include "src/sem/multisampled_texture_type.h" #include "src/sem/statement.h" +#include "src/sem/storage_texture_type.h" #include "src/sem/struct.h" #include "src/sem/variable.h" #include "src/utils/get_or_create.h" @@ -77,6 +78,42 @@ Source CombineSourceRange(const Source& start, const Source& end) { start.file_path, start.file_content); } +bool IsValidStorageTextureDimension(sem::TextureDimension dim) { + switch (dim) { + case sem::TextureDimension::k1d: + case sem::TextureDimension::k2d: + case sem::TextureDimension::k2dArray: + case sem::TextureDimension::k3d: + return true; + default: + return false; + } +} + +bool IsValidStorageTextureImageFormat(sem::ImageFormat format) { + switch (format) { + case sem::ImageFormat::kR32Uint: + case sem::ImageFormat::kR32Sint: + case sem::ImageFormat::kR32Float: + case sem::ImageFormat::kRg32Uint: + case sem::ImageFormat::kRg32Sint: + case sem::ImageFormat::kRg32Float: + case sem::ImageFormat::kRgba8Unorm: + case sem::ImageFormat::kRgba8Snorm: + case sem::ImageFormat::kRgba8Uint: + case sem::ImageFormat::kRgba8Sint: + case sem::ImageFormat::kRgba16Uint: + case sem::ImageFormat::kRgba16Sint: + case sem::ImageFormat::kRgba16Float: + case sem::ImageFormat::kRgba32Uint: + case sem::ImageFormat::kRgba32Sint: + case sem::ImageFormat::kRgba32Float: + return true; + default: + return false; + } +} + } // namespace Resolver::Resolver(ProgramBuilder* builder) @@ -175,6 +212,7 @@ bool Resolver::IsValidAssignment(sem::Type* lhs, sem::Type* rhs) { return false; } } + return true; } @@ -372,14 +410,14 @@ bool Resolver::ValidateVariable(const ast::Variable* var) { } } - if (auto* mst = type->UnwrapAll()->As()) { - if (mst->dim() != sem::TextureDimension::k2d) { + if (auto* r = type->UnwrapAll()->As()) { + if (r->dim() != sem::TextureDimension::k2d) { diagnostics_.add_error("Only 2d multisampled textures are supported", var->source()); return false; } - auto* data_type = mst->type()->UnwrapAll(); + auto* data_type = r->type()->UnwrapAll(); if (!data_type->is_numeric_scalar()) { diagnostics_.add_error( "texture_multisampled_2d: type must be f32, i32 or u32", @@ -388,6 +426,24 @@ bool Resolver::ValidateVariable(const ast::Variable* var) { } } + if (auto* r = type->UnwrapAll()->As()) { + if (!IsValidStorageTextureDimension(r->dim())) { + diagnostics_.add_error( + "Cube dimensions for storage textures are not " + "supported.", + var->source()); + return false; + } + + if (!IsValidStorageTextureImageFormat(r->image_format())) { + diagnostics_.add_error( + "image format must be one of the texel formats specified for storage " + "textues in https://gpuweb.github.io/gpuweb/wgsl/#texel-formats", + var->source()); + return false; + } + } + return true; } diff --git a/src/resolver/type_validation_test.cc b/src/resolver/type_validation_test.cc index 48cf806326..faedfbe322 100644 --- a/src/resolver/type_validation_test.cc +++ b/src/resolver/type_validation_test.cc @@ -18,6 +18,7 @@ #include "src/resolver/resolver.h" #include "src/resolver/resolver_test_helper.h" #include "src/sem/multisampled_texture_type.h" +#include "src/sem/storage_texture_type.h" #include "gmock/gmock.h" @@ -613,6 +614,146 @@ INSTANTIATE_TEST_SUITE_P(ResolverTypeValidationTest, } // namespace MultisampledTextureTests +namespace StorageTextureTests { +struct DimensionParams { + sem::TextureDimension dim; + bool is_valid; +}; + +static constexpr DimensionParams Dimension_cases[] = { + DimensionParams{sem::TextureDimension::k1d, true}, + DimensionParams{sem::TextureDimension::k2d, true}, + DimensionParams{sem::TextureDimension::k2dArray, true}, + DimensionParams{sem::TextureDimension::k3d, true}, + DimensionParams{sem::TextureDimension::kCube, false}, + DimensionParams{sem::TextureDimension::kCubeArray, false}}; + +using StorageTextureDimensionTest = ResolverTestWithParam; +TEST_P(StorageTextureDimensionTest, All) { + auto& params = GetParam(); + Global("a", + create(params.dim, sem::ImageFormat::kR32Uint, + sem::StorageTexture::SubtypeFor( + sem::ImageFormat::kR32Uint, Types())), + ast::StorageClass::kUniformConstant, nullptr, + ast::DecorationList{ + create(0), + create(0), + }); + + if (params.is_valid) { + EXPECT_TRUE(r()->Resolve()) << r()->error(); + } else { + EXPECT_FALSE(r()->Resolve()); + } +} +INSTANTIATE_TEST_SUITE_P(ResolverTypeValidationTest, + StorageTextureDimensionTest, + testing::ValuesIn(Dimension_cases)); + +struct FormatParams { + sem::ImageFormat format; + bool is_valid; +}; + +static constexpr FormatParams format_cases[] = { + FormatParams{sem::ImageFormat::kBgra8Unorm, false}, + FormatParams{sem::ImageFormat::kBgra8UnormSrgb, false}, + FormatParams{sem::ImageFormat::kR16Float, false}, + FormatParams{sem::ImageFormat::kR16Sint, false}, + FormatParams{sem::ImageFormat::kR16Uint, false}, + FormatParams{sem::ImageFormat::kR32Float, true}, + FormatParams{sem::ImageFormat::kR32Sint, true}, + FormatParams{sem::ImageFormat::kR32Uint, true}, + FormatParams{sem::ImageFormat::kR8Sint, false}, + FormatParams{sem::ImageFormat::kR8Snorm, false}, + FormatParams{sem::ImageFormat::kR8Uint, false}, + FormatParams{sem::ImageFormat::kR8Unorm, false}, + FormatParams{sem::ImageFormat::kRg11B10Float, false}, + FormatParams{sem::ImageFormat::kRg16Float, false}, + FormatParams{sem::ImageFormat::kRg16Sint, false}, + FormatParams{sem::ImageFormat::kRg16Uint, false}, + FormatParams{sem::ImageFormat::kRg32Float, true}, + FormatParams{sem::ImageFormat::kRg32Sint, true}, + FormatParams{sem::ImageFormat::kRg32Uint, true}, + FormatParams{sem::ImageFormat::kRg8Sint, false}, + FormatParams{sem::ImageFormat::kRg8Snorm, false}, + FormatParams{sem::ImageFormat::kRg8Uint, false}, + FormatParams{sem::ImageFormat::kRg8Unorm, false}, + FormatParams{sem::ImageFormat::kRgb10A2Unorm, false}, + FormatParams{sem::ImageFormat::kRgba16Float, true}, + FormatParams{sem::ImageFormat::kRgba16Sint, true}, + FormatParams{sem::ImageFormat::kRgba16Uint, true}, + FormatParams{sem::ImageFormat::kRgba32Float, true}, + FormatParams{sem::ImageFormat::kRgba32Sint, true}, + FormatParams{sem::ImageFormat::kRgba32Uint, true}, + FormatParams{sem::ImageFormat::kRgba8Sint, true}, + FormatParams{sem::ImageFormat::kRgba8Snorm, true}, + FormatParams{sem::ImageFormat::kRgba8Uint, true}, + FormatParams{sem::ImageFormat::kRgba8Unorm, true}, + FormatParams{sem::ImageFormat::kRgba8UnormSrgb, false}}; + +using StorageTextureFormatTest = ResolverTestWithParam; +TEST_P(StorageTextureFormatTest, All) { + auto& params = GetParam(); + // { + // var a : texture_storage_1d<*>; + // var b : texture_storage_2d<*>; + // var c : texture_storage_2d_array<*>; + // var d : texture_storage_3<*>; + // } + + Global("a", + create( + sem::TextureDimension::k1d, params.format, + sem::StorageTexture::SubtypeFor(params.format, Types())), + ast::StorageClass::kUniformConstant, nullptr, + ast::DecorationList{ + create(0), + create(0), + }); + + Global("b", + create( + sem::TextureDimension::k2d, params.format, + sem::StorageTexture::SubtypeFor(params.format, Types())), + ast::StorageClass::kUniformConstant, nullptr, + ast::DecorationList{ + create(1), + create(0), + }); + + Global("c", + create( + sem::TextureDimension::k2dArray, params.format, + sem::StorageTexture::SubtypeFor(params.format, Types())), + ast::StorageClass::kUniformConstant, nullptr, + ast::DecorationList{ + create(2), + create(0), + }); + + Global("d", + create( + sem::TextureDimension::k3d, params.format, + sem::StorageTexture::SubtypeFor(params.format, Types())), + ast::StorageClass::kUniformConstant, nullptr, + ast::DecorationList{ + create(3), + create(0), + }); + + if (params.is_valid) { + EXPECT_TRUE(r()->Resolve()) << r()->error(); + } else { + EXPECT_FALSE(r()->Resolve()); + } +} +INSTANTIATE_TEST_SUITE_P(ResolverTypeValidationTest, + StorageTextureFormatTest, + testing::ValuesIn(format_cases)); +} // namespace StorageTextureTests + } // namespace } // namespace resolver } // namespace tint diff --git a/src/writer/msl/generator_impl_type_test.cc b/src/writer/msl/generator_impl_type_test.cc index 2c377629a2..6cb8d723c0 100644 --- a/src/writer/msl/generator_impl_type_test.cc +++ b/src/writer/msl/generator_impl_type_test.cc @@ -739,8 +739,8 @@ TEST_P(MslStorageTexturesTest, Emit) { auto params = GetParam(); auto* subtype = - sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR16Float, Types()); - auto* s = create(params.dim, sem::ImageFormat::kR16Float, + sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Float, Types()); + auto* s = create(params.dim, sem::ImageFormat::kR32Float, subtype); auto* ac = create(params.ro ? ast::AccessControl::kReadOnly diff --git a/src/writer/spirv/builder_type_test.cc b/src/writer/spirv/builder_type_test.cc index 4fd9b325cd..ed081d885d 100644 --- a/src/writer/spirv/builder_type_test.cc +++ b/src/writer/spirv/builder_type_test.cc @@ -836,11 +836,11 @@ TEST_F(BuilderTest_Type, SampledTexture_Generate_CubeArray) { )"); } -TEST_F(BuilderTest_Type, StorageTexture_Generate_1d_R16Float) { +TEST_F(BuilderTest_Type, StorageTexture_Generate_1d) { auto* subtype = - sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR16Float, Types()); + sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Float, Types()); auto* s = create(sem::TextureDimension::k1d, - sem::ImageFormat::kR16Float, subtype); + sem::ImageFormat::kR32Float, subtype); Global("test_var", s, ast::StorageClass::kInput); @@ -849,98 +849,15 @@ TEST_F(BuilderTest_Type, StorageTexture_Generate_1d_R16Float) { EXPECT_EQ(b.GenerateTypeIfNeeded(s), 1u); ASSERT_FALSE(b.has_error()) << b.error(); EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32 -%1 = OpTypeImage %2 1D 0 0 0 2 R16f -)"); - - EXPECT_EQ(DumpInstructions(b.capabilities()), - R"(OpCapability Image1D -OpCapability StorageImageExtendedFormats -)"); -} - -TEST_F(BuilderTest_Type, StorageTexture_Generate_1d_R8SNorm) { - auto* subtype = - sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR8Snorm, Types()); - auto* s = create(sem::TextureDimension::k1d, - sem::ImageFormat::kR8Snorm, subtype); - - Global("test_var", s, ast::StorageClass::kInput); - - spirv::Builder& b = Build(); - - EXPECT_EQ(b.GenerateTypeIfNeeded(s), 1u); - ASSERT_FALSE(b.has_error()) << b.error(); - EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32 -%1 = OpTypeImage %2 1D 0 0 0 2 R8Snorm -)"); - - EXPECT_EQ(DumpInstructions(b.capabilities()), - R"(OpCapability Image1D -OpCapability StorageImageExtendedFormats -)"); -} - -TEST_F(BuilderTest_Type, StorageTexture_Generate_1d_R8UNorm) { - auto* subtype = - sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR8Unorm, Types()); - auto* s = create(sem::TextureDimension::k1d, - sem::ImageFormat::kR8Unorm, subtype); - - Global("test_var", s, ast::StorageClass::kInput); - - spirv::Builder& b = Build(); - - EXPECT_EQ(b.GenerateTypeIfNeeded(s), 1u); - ASSERT_FALSE(b.has_error()) << b.error(); - EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32 -%1 = OpTypeImage %2 1D 0 0 0 2 R8 -)"); - - EXPECT_EQ(DumpInstructions(b.capabilities()), - R"(OpCapability Image1D -OpCapability StorageImageExtendedFormats -)"); -} - -TEST_F(BuilderTest_Type, StorageTexture_Generate_1d_R8Uint) { - auto* subtype = - sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR8Uint, Types()); - auto* s = create(sem::TextureDimension::k1d, - sem::ImageFormat::kR8Uint, subtype); - - Global("test_var", s, ast::StorageClass::kInput); - - spirv::Builder& b = Build(); - - EXPECT_EQ(b.GenerateTypeIfNeeded(s), 1u); - ASSERT_FALSE(b.has_error()) << b.error(); - EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 0 -%1 = OpTypeImage %2 1D 0 0 0 2 R8ui -)"); -} - -TEST_F(BuilderTest_Type, StorageTexture_Generate_1d_R8Sint) { - auto* subtype = - sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR8Sint, Types()); - auto* s = create(sem::TextureDimension::k1d, - sem::ImageFormat::kR8Sint, subtype); - - Global("test_var", s, ast::StorageClass::kInput); - - spirv::Builder& b = Build(); - - EXPECT_EQ(b.GenerateTypeIfNeeded(s), 1u); - ASSERT_FALSE(b.has_error()) << b.error(); - EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeInt 32 1 -%1 = OpTypeImage %2 1D 0 0 0 2 R8i +%1 = OpTypeImage %2 1D 0 0 0 2 R32f )"); } TEST_F(BuilderTest_Type, StorageTexture_Generate_2d) { auto* subtype = - sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR16Float, Types()); + sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Float, Types()); auto* s = create(sem::TextureDimension::k2d, - sem::ImageFormat::kR16Float, subtype); + sem::ImageFormat::kR32Float, subtype); Global("test_var", s, ast::StorageClass::kInput); @@ -949,15 +866,15 @@ TEST_F(BuilderTest_Type, StorageTexture_Generate_2d) { EXPECT_EQ(b.GenerateTypeIfNeeded(s), 1u); ASSERT_FALSE(b.has_error()) << b.error(); EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32 -%1 = OpTypeImage %2 2D 0 0 0 2 R16f +%1 = OpTypeImage %2 2D 0 0 0 2 R32f )"); } TEST_F(BuilderTest_Type, StorageTexture_Generate_2dArray) { auto* subtype = - sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR16Float, Types()); + sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Float, Types()); auto* s = create(sem::TextureDimension::k2dArray, - sem::ImageFormat::kR16Float, subtype); + sem::ImageFormat::kR32Float, subtype); Global("test_var", s, ast::StorageClass::kInput); @@ -966,15 +883,15 @@ TEST_F(BuilderTest_Type, StorageTexture_Generate_2dArray) { EXPECT_EQ(b.GenerateTypeIfNeeded(s), 1u); ASSERT_FALSE(b.has_error()) << b.error(); EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32 -%1 = OpTypeImage %2 2D 0 1 0 2 R16f +%1 = OpTypeImage %2 2D 0 1 0 2 R32f )"); } TEST_F(BuilderTest_Type, StorageTexture_Generate_3d) { auto* subtype = - sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR16Float, Types()); + sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Float, Types()); auto* s = create(sem::TextureDimension::k3d, - sem::ImageFormat::kR16Float, subtype); + sem::ImageFormat::kR32Float, subtype); Global("test_var", s, ast::StorageClass::kInput); @@ -983,7 +900,7 @@ TEST_F(BuilderTest_Type, StorageTexture_Generate_3d) { EXPECT_EQ(b.GenerateTypeIfNeeded(s), 1u); ASSERT_FALSE(b.has_error()) << b.error(); EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32 -%1 = OpTypeImage %2 3D 0 0 0 2 R16f +%1 = OpTypeImage %2 3D 0 0 0 2 R32f )"); }