From 2bb15eb0a84af63b5319bd5df385d7ce724b44ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Capucho?= Date: Wed, 30 Jun 2021 17:15:35 +0100 Subject: [PATCH] [glsl-in] Add support for texture arguments --- src/front/wgsl/mod.rs | 5 +++-- tests/in/texture-arg.wgsl | 13 +++++++++++ tests/out/glsl/texture-arg.main.Fragment.glsl | 19 ++++++++++++++++ tests/out/msl/texture-arg.msl | 22 +++++++++++++++++++ tests/out/wgsl/texture-arg.wgsl | 15 +++++++++++++ tests/snapshots.rs | 4 ++++ 6 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 tests/in/texture-arg.wgsl create mode 100644 tests/out/glsl/texture-arg.main.Fragment.glsl create mode 100644 tests/out/msl/texture-arg.msl create mode 100644 tests/out/wgsl/texture-arg.wgsl diff --git a/src/front/wgsl/mod.rs b/src/front/wgsl/mod.rs index bab096fe3c..4afa8d4eb9 100644 --- a/src/front/wgsl/mod.rs +++ b/src/front/wgsl/mod.rs @@ -1673,8 +1673,9 @@ impl Parser { allow_deref: bool, ) -> Result, Error<'a>> { let mut needs_deref = match ctx.expressions[handle] { - crate::Expression::LocalVariable(_) | crate::Expression::GlobalVariable(_) => { - allow_deref + crate::Expression::LocalVariable(_) => allow_deref, + crate::Expression::GlobalVariable(var) => { + ctx.global_vars[var].class != crate::StorageClass::Handle && allow_deref } _ => false, }; diff --git a/tests/in/texture-arg.wgsl b/tests/in/texture-arg.wgsl new file mode 100644 index 0000000000..af4c382bea --- /dev/null +++ b/tests/in/texture-arg.wgsl @@ -0,0 +1,13 @@ +[[group(0), binding(0)]] +var Texture: texture_2d; +[[group(0), binding(1)]] +var Sampler: sampler; + +fn test(Passed_Texture: texture_2d, Passed_Sampler: sampler) -> vec4 { + return textureSample(Passed_Texture, Passed_Sampler, vec2(0.0, 0.0)); +} + +[[stage(fragment)]] +fn main() -> [[location(0)]] vec4 { + return test(Texture, Sampler); +} diff --git a/tests/out/glsl/texture-arg.main.Fragment.glsl b/tests/out/glsl/texture-arg.main.Fragment.glsl new file mode 100644 index 0000000000..3719492361 --- /dev/null +++ b/tests/out/glsl/texture-arg.main.Fragment.glsl @@ -0,0 +1,19 @@ +#version 310 es + +precision highp float; + +uniform highp sampler2D _group_0_binding_0; + +layout(location = 0) out vec4 _fs2p_location0; + +vec4 test(highp sampler2D Passed_Texture, ) { + vec4 _expr7 = texture(Passed_Texture, vec2(vec2(0.0, 0.0))); + return _expr7; +} + +void main() { + vec4 _expr2 = test(_group_0_binding_0, ); + _fs2p_location0 = _expr2; + return; +} + diff --git a/tests/out/msl/texture-arg.msl b/tests/out/msl/texture-arg.msl new file mode 100644 index 0000000000..f958f527ff --- /dev/null +++ b/tests/out/msl/texture-arg.msl @@ -0,0 +1,22 @@ +#include +#include + + +metal::float4 test( + metal::texture2d Passed_Texture, + metal::sampler Passed_Sampler +) { + metal::float4 _e7 = Passed_Texture.sample(Passed_Sampler, metal::float2(0.0, 0.0)); + return _e7; +} + +struct main1Output { + metal::float4 member [[color(0)]]; +}; +fragment main1Output main1( + metal::texture2d Texture [[user(fake0)]] +, metal::sampler Sampler [[user(fake0)]] +) { + metal::float4 _e2 = test(Texture, Sampler); + return main1Output { _e2 }; +} diff --git a/tests/out/wgsl/texture-arg.wgsl b/tests/out/wgsl/texture-arg.wgsl new file mode 100644 index 0000000000..420b437801 --- /dev/null +++ b/tests/out/wgsl/texture-arg.wgsl @@ -0,0 +1,15 @@ +[[group(0), binding(0)]] +var Texture: texture_2d; +[[group(0), binding(1)]] +var Sampler: sampler; + +fn test(Passed_Texture: texture_2d, Passed_Sampler: sampler) -> vec4 { + let _e7: vec4 = textureSample(Passed_Texture, Passed_Sampler, vec2(0.0, 0.0)); + return _e7; +} + +[[stage(fragment)]] +fn main() -> [[location(0)]] vec4 { + let _e2: vec4 = test(Texture, Sampler); + return _e2; +} diff --git a/tests/snapshots.rs b/tests/snapshots.rs index b9466738df..1f747478cb 100644 --- a/tests/snapshots.rs +++ b/tests/snapshots.rs @@ -380,6 +380,10 @@ fn convert_wgsl() { Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::WGSL, ), ("bounds-check-zero", Targets::SPIRV), + ( + "texture-arg", + Targets::METAL | Targets::GLSL | Targets::WGSL, + ), ]; for &(name, targets) in inputs.iter() {