[glsl][ir] Support sampled texture types This CL adds support for the `SampledTexture` type. Bug: 42251044 Change-Id: Ia5d380720dc0dcbe6b855befe503c5411977bebe Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/204515 Reviewed-by: James Price <jrprice@google.com> Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/glsl/writer/printer/printer.cc b/src/tint/lang/glsl/writer/printer/printer.cc index 84fe10a..4db5cd0 100644 --- a/src/tint/lang/glsl/writer/printer/printer.cc +++ b/src/tint/lang/glsl/writer/printer/printer.cc
@@ -59,6 +59,7 @@ #include "src/tint/lang/core/type/i32.h" #include "src/tint/lang/core/type/matrix.h" #include "src/tint/lang/core/type/pointer.h" +#include "src/tint/lang/core/type/sampled_texture.h" #include "src/tint/lang/core/type/storage_texture.h" #include "src/tint/lang/core/type/u32.h" #include "src/tint/lang/core/type/vector.h" @@ -447,6 +448,7 @@ TINT_ASSERT(!t->Is<core::type::ExternalTexture>()); auto* storage = t->As<core::type::StorageTexture>(); + auto* sampled = t->As<core::type::SampledTexture>(); out << "highp "; @@ -477,7 +479,7 @@ TINT_UNREACHABLE(); } } - auto* subtype = storage ? storage->Type() : nullptr; + auto* subtype = sampled ? sampled->Type() : storage ? storage->Type() : nullptr; tint::Switch( subtype, // @@ -486,7 +488,7 @@ [&](const core::type::U32*) { out << "u"; }, // TINT_ICE_ON_NO_MATCH); - out << "image"; + out << (storage ? "image" : "sampler"); switch (t->Dim()) { case core::type::TextureDimension::k1d:
diff --git a/src/tint/lang/glsl/writer/type_test.cc b/src/tint/lang/glsl/writer/type_test.cc index fb90160..844c1dd 100644 --- a/src/tint/lang/glsl/writer/type_test.cc +++ b/src/tint/lang/glsl/writer/type_test.cc
@@ -562,9 +562,8 @@ out << str.str(); return out; } -using GlslWriterSampledTexturesTest = GlslWriterTestWithParam<GlslTextureData>; -// TODO(dsinclair): Add sampled texture support -TEST_P(GlslWriterSampledTexturesTest, DISABLED_Emit) { +using GlslWriterSampledTextureESTest = GlslWriterTestWithParam<GlslTextureData>; +TEST_P(GlslWriterSampledTextureESTest, Emit) { auto params = GetParam(); const core::type::Type* subtype = nullptr; @@ -573,7 +572,7 @@ subtype = ty.f32(); break; case TextureDataType::kI32: - subtype = ty.u32(); + subtype = ty.i32(); break; case TextureDataType::kU32: subtype = ty.u32(); @@ -581,23 +580,83 @@ } auto* t = ty.Get<core::type::SampledTexture>(params.dim, subtype); - auto* func = b.Function("foo", ty.void_(), core::ir::Function::PipelineStage::kCompute); + auto* func = b.Function("foo", ty.void_()); auto* param = b.FunctionParam("a", t); func->SetParams({param}); - func->SetWorkgroupSize(1, 1, 1); b.Append(func->Block(), [&] { b.Return(func); }); ASSERT_TRUE(Generate()) << err_ << output_.glsl; - EXPECT_EQ(output_.glsl, R"( -layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; -void main()" + params.result + + EXPECT_EQ(output_.glsl, GlslHeader() + R"( +void foo(highp )" + params.result + R"( a) { } +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { +} )"); } INSTANTIATE_TEST_SUITE_P( GlslWriterTest, - GlslWriterSampledTexturesTest, + GlslWriterSampledTextureESTest, + testing::Values( + GlslTextureData{core::type::TextureDimension::k2d, TextureDataType::kF32, "sampler2D"}, + GlslTextureData{core::type::TextureDimension::k2dArray, TextureDataType::kF32, + "sampler2DArray"}, + GlslTextureData{core::type::TextureDimension::k3d, TextureDataType::kF32, "sampler3D"}, + GlslTextureData{core::type::TextureDimension::kCube, TextureDataType::kF32, "samplerCube"}, + + GlslTextureData{core::type::TextureDimension::k2d, TextureDataType::kI32, "isampler2D"}, + GlslTextureData{core::type::TextureDimension::k2dArray, TextureDataType::kI32, + "isampler2DArray"}, + GlslTextureData{core::type::TextureDimension::k3d, TextureDataType::kI32, "isampler3D"}, + GlslTextureData{core::type::TextureDimension::kCube, TextureDataType::kI32, "isamplerCube"}, + + GlslTextureData{core::type::TextureDimension::k2d, TextureDataType::kU32, "usampler2D"}, + GlslTextureData{core::type::TextureDimension::k2dArray, TextureDataType::kU32, + "usampler2DArray"}, + GlslTextureData{core::type::TextureDimension::k3d, TextureDataType::kU32, "usampler3D"}, + GlslTextureData{core::type::TextureDimension::kCube, TextureDataType::kU32, + "usamplerCube"})); + +using GlslWriterSampledTextureNonESTest = GlslWriterTestWithParam<GlslTextureData>; +TEST_P(GlslWriterSampledTextureNonESTest, Emit) { + auto params = GetParam(); + + const core::type::Type* subtype = nullptr; + switch (params.datatype) { + case TextureDataType::kF32: + subtype = ty.f32(); + break; + case TextureDataType::kI32: + subtype = ty.i32(); + break; + case TextureDataType::kU32: + subtype = ty.u32(); + break; + } + + auto* t = ty.Get<core::type::SampledTexture>(params.dim, subtype); + auto* func = b.Function("foo", ty.void_()); + auto* param = b.FunctionParam("a", t); + func->SetParams({param}); + b.Append(func->Block(), [&] { b.Return(func); }); + + Options opts{}; + opts.version = Version(Version::Standard::kDesktop, 4, 6); + ASSERT_TRUE(Generate(opts)) << err_ << output_.glsl; + EXPECT_EQ(output_.glsl, R"(#version 460 + +void foo(highp )" + params.result + + R"( a) { +} +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { +} +)"); +} +INSTANTIATE_TEST_SUITE_P( + GlslWriterTest, + GlslWriterSampledTextureNonESTest, testing::Values( GlslTextureData{core::type::TextureDimension::k1d, TextureDataType::kF32, "sampler1D"}, GlslTextureData{core::type::TextureDimension::k2d, TextureDataType::kF32, "sampler2D"}, @@ -613,7 +672,7 @@ GlslTextureData{core::type::TextureDimension::k2dArray, TextureDataType::kI32, "isampler2DArray"}, GlslTextureData{core::type::TextureDimension::k3d, TextureDataType::kI32, "isampler3D"}, - GlslTextureData{core::type::TextureDimension::kCube, TextureDataType::kI32, "samplerCube"}, + GlslTextureData{core::type::TextureDimension::kCube, TextureDataType::kI32, "isamplerCube"}, GlslTextureData{core::type::TextureDimension::kCubeArray, TextureDataType::kI32, "isamplerCubeArray"},