From b3c99ddfaebd0e89d6bcf22881c5a33290a40a29 Mon Sep 17 00:00:00 2001 From: Corentin Wallez Date: Fri, 4 Feb 2022 17:55:43 +0000 Subject: [PATCH] writer/msl: Output constant 0 lod for 1d texture builtins The MSL headers have annotations that requires that the lod for 1D textures is a constexpr with value 0. This affects .get_width() and .read(). Bug: dawn:814 Change-Id: Ic21d32067061afe67a16fbbeee222ab695b53066 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/79301 Reviewed-by: Ben Clayton Kokoro: Kokoro Commit-Queue: Corentin Wallez Auto-Submit: Corentin Wallez --- src/writer/msl/generator_impl.cc | 22 ++++++++++++++----- .../generator_impl_builtin_texture_test.cc | 8 +++---- .../002b2a.wgsl.expected.msl | 2 +- .../08753d.wgsl.expected.msl | 2 +- .../0cce40.wgsl.expected.msl | 2 +- .../1e9e39.wgsl.expected.msl | 2 +- .../318ecc.wgsl.expected.msl | 2 +- .../3aca08.wgsl.expected.msl | 2 +- .../423f99.wgsl.expected.msl | 2 +- .../42d4e6.wgsl.expected.msl | 2 +- .../4df9a8.wgsl.expected.msl | 2 +- .../55b23e.wgsl.expected.msl | 2 +- .../57da0b.wgsl.expected.msl | 2 +- .../5caa5e.wgsl.expected.msl | 2 +- .../6adac6.wgsl.expected.msl | 2 +- .../9da9e2.wgsl.expected.msl | 2 +- .../a7d565.wgsl.expected.msl | 2 +- .../a863f2.wgsl.expected.msl | 2 +- .../cc968c.wgsl.expected.msl | 2 +- .../cccc8f.wgsl.expected.msl | 2 +- .../dc2dd0.wgsl.expected.msl | 2 +- 21 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc index 129e9692a4..5c2ce6d328 100644 --- a/src/writer/msl/generator_impl.cc +++ b/src/writer/msl/generator_impl.cc @@ -885,6 +885,10 @@ bool GeneratorImpl::EmitTextureCall(std::ostream& out, return true; }; + // MSL requires that `lod` is a constant 0 for 1D textures. + bool level_is_constant_zero = + texture_type->dim() == ast::TextureDimension::k1d; + switch (builtin->Type()) { case sem::BuiltinType::kTextureDimensions: { std::vector dims; @@ -912,9 +916,13 @@ bool GeneratorImpl::EmitTextureCall(std::ostream& out, return false; } out << ".get_" << name << "("; - if (auto* level = arg(Usage::kLevel)) { - if (!EmitExpression(out, level->Declaration())) { - return false; + if (level_is_constant_zero) { + out << "0"; + } else { + if (auto* level = arg(Usage::kLevel)) { + if (!EmitExpression(out, level->Declaration())) { + return false; + } } } out << ")"; @@ -1061,8 +1069,12 @@ bool GeneratorImpl::EmitTextureCall(std::ostream& out, if (lod_param_is_named) { out << "level("; } - if (!EmitExpression(out, level->Declaration())) { - return false; + if (level_is_constant_zero) { + out << "0"; + } else { + if (!EmitExpression(out, level->Declaration())) { + return false; + } } if (lod_param_is_named) { out << ")"; diff --git a/src/writer/msl/generator_impl_builtin_texture_test.cc b/src/writer/msl/generator_impl_builtin_texture_test.cc index f5887ffdde..46fe89f5e8 100644 --- a/src/writer/msl/generator_impl_builtin_texture_test.cc +++ b/src/writer/msl/generator_impl_builtin_texture_test.cc @@ -27,7 +27,7 @@ std::string expected_texture_overload( switch (overload) { case ValidTextureOverload::kDimensions1d: case ValidTextureOverload::kDimensionsStorageWO1d: - return R"(int(texture.get_width()))"; + return R"(int(texture.get_width(0)))"; case ValidTextureOverload::kDimensions2d: case ValidTextureOverload::kDimensions2dArray: case ValidTextureOverload::kDimensionsCube: @@ -225,11 +225,11 @@ std::string expected_texture_overload( case ValidTextureOverload::kSampleCompareLevelDepthCubeArrayF32: return R"(texture.sample_compare(sampler, float3(1.0f, 2.0f, 3.0f), 4, 5.0f))"; case ValidTextureOverload::kLoad1dLevelF32: - return R"(texture.read(uint(1), 3))"; + return R"(texture.read(uint(1), 0))"; case ValidTextureOverload::kLoad1dLevelU32: - return R"(texture.read(uint(1), 3))"; + return R"(texture.read(uint(1), 0))"; case ValidTextureOverload::kLoad1dLevelI32: - return R"(texture.read(uint(1), 3))"; + return R"(texture.read(uint(1), 0))"; case ValidTextureOverload::kLoad2dLevelF32: return R"(texture.read(uint2(int2(1, 2)), 3))"; case ValidTextureOverload::kLoad2dLevelU32: diff --git a/test/builtins/gen/textureDimensions/002b2a.wgsl.expected.msl b/test/builtins/gen/textureDimensions/002b2a.wgsl.expected.msl index 73f998f0e7..97cec1c72d 100644 --- a/test/builtins/gen/textureDimensions/002b2a.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/002b2a.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_002b2a(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/08753d.wgsl.expected.msl b/test/builtins/gen/textureDimensions/08753d.wgsl.expected.msl index 881c7e2b38..92557a7961 100644 --- a/test/builtins/gen/textureDimensions/08753d.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/08753d.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_08753d(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/0cce40.wgsl.expected.msl b/test/builtins/gen/textureDimensions/0cce40.wgsl.expected.msl index 58d7d3e835..6718be01fb 100644 --- a/test/builtins/gen/textureDimensions/0cce40.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/0cce40.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_0cce40(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/1e9e39.wgsl.expected.msl b/test/builtins/gen/textureDimensions/1e9e39.wgsl.expected.msl index f7ea514120..37bf3f3d71 100644 --- a/test/builtins/gen/textureDimensions/1e9e39.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/1e9e39.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_1e9e39(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/318ecc.wgsl.expected.msl b/test/builtins/gen/textureDimensions/318ecc.wgsl.expected.msl index c373afd237..577e060fd1 100644 --- a/test/builtins/gen/textureDimensions/318ecc.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/318ecc.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_318ecc(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/3aca08.wgsl.expected.msl b/test/builtins/gen/textureDimensions/3aca08.wgsl.expected.msl index d8bf7b44c8..186865ccf8 100644 --- a/test/builtins/gen/textureDimensions/3aca08.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/3aca08.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_3aca08(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/423f99.wgsl.expected.msl b/test/builtins/gen/textureDimensions/423f99.wgsl.expected.msl index 168004b06b..dc27caea03 100644 --- a/test/builtins/gen/textureDimensions/423f99.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/423f99.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_423f99(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/42d4e6.wgsl.expected.msl b/test/builtins/gen/textureDimensions/42d4e6.wgsl.expected.msl index e377d8d69a..3156bbb896 100644 --- a/test/builtins/gen/textureDimensions/42d4e6.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/42d4e6.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_42d4e6(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/4df9a8.wgsl.expected.msl b/test/builtins/gen/textureDimensions/4df9a8.wgsl.expected.msl index 00beb11a7e..2f350d560c 100644 --- a/test/builtins/gen/textureDimensions/4df9a8.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/4df9a8.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_4df9a8(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/55b23e.wgsl.expected.msl b/test/builtins/gen/textureDimensions/55b23e.wgsl.expected.msl index c3532a3565..24fb6e8882 100644 --- a/test/builtins/gen/textureDimensions/55b23e.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/55b23e.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_55b23e(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/57da0b.wgsl.expected.msl b/test/builtins/gen/textureDimensions/57da0b.wgsl.expected.msl index 010a701c73..44429f3c0d 100644 --- a/test/builtins/gen/textureDimensions/57da0b.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/57da0b.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_57da0b(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/5caa5e.wgsl.expected.msl b/test/builtins/gen/textureDimensions/5caa5e.wgsl.expected.msl index 1d7db804d8..9816f22ae8 100644 --- a/test/builtins/gen/textureDimensions/5caa5e.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/5caa5e.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_5caa5e(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/6adac6.wgsl.expected.msl b/test/builtins/gen/textureDimensions/6adac6.wgsl.expected.msl index 03a4f5beec..375da250b1 100644 --- a/test/builtins/gen/textureDimensions/6adac6.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/6adac6.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_6adac6(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/9da9e2.wgsl.expected.msl b/test/builtins/gen/textureDimensions/9da9e2.wgsl.expected.msl index f94dbe07e0..e114675ba7 100644 --- a/test/builtins/gen/textureDimensions/9da9e2.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/9da9e2.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_9da9e2(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/a7d565.wgsl.expected.msl b/test/builtins/gen/textureDimensions/a7d565.wgsl.expected.msl index d317de8450..e06c9c96dc 100644 --- a/test/builtins/gen/textureDimensions/a7d565.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/a7d565.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_a7d565(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/a863f2.wgsl.expected.msl b/test/builtins/gen/textureDimensions/a863f2.wgsl.expected.msl index 989df4d725..152cdc59c5 100644 --- a/test/builtins/gen/textureDimensions/a863f2.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/a863f2.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_a863f2(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/cc968c.wgsl.expected.msl b/test/builtins/gen/textureDimensions/cc968c.wgsl.expected.msl index 849aa301c4..a585ee85ae 100644 --- a/test/builtins/gen/textureDimensions/cc968c.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/cc968c.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_cc968c(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/cccc8f.wgsl.expected.msl b/test/builtins/gen/textureDimensions/cccc8f.wgsl.expected.msl index e4d021833d..d02c7e554c 100644 --- a/test/builtins/gen/textureDimensions/cccc8f.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/cccc8f.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_cccc8f(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) { diff --git a/test/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.msl b/test/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.msl index f8e141ab85..f33ba03103 100644 --- a/test/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.msl +++ b/test/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.msl @@ -6,7 +6,7 @@ struct tint_symbol { }; void textureDimensions_dc2dd0(texture1d tint_symbol_1) { - int res = int(tint_symbol_1.get_width()); + int res = int(tint_symbol_1.get_width(0)); } float4 vertex_main_inner(texture1d tint_symbol_2) {