From f48b6bf2a7335135b8fedafe2cc36a047ce6ad8d Mon Sep 17 00:00:00 2001 From: Josh Groves Date: Thu, 16 Feb 2023 20:03:24 -0330 Subject: [PATCH] Skip `invariant` for `gl_FragCoord` on WebGL2 (#2254) --- src/back/glsl/mod.rs | 26 +++++++++++++++---- tests/in/invariant.param.ron | 11 ++++++++ tests/in/invariant.wgsl | 7 +++++ .../glsl/invariant.frag_main.Fragment.glsl | 11 ++++++++ tests/out/glsl/invariant.fs.Fragment.glsl | 11 ++++++++ tests/out/glsl/invariant.vs.Vertex.glsl | 12 +++++++++ tests/snapshots.rs | 1 + 7 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 tests/in/invariant.param.ron create mode 100644 tests/in/invariant.wgsl create mode 100644 tests/out/glsl/invariant.frag_main.Fragment.glsl create mode 100644 tests/out/glsl/invariant.fs.Fragment.glsl create mode 100644 tests/out/glsl/invariant.vs.Vertex.glsl diff --git a/src/back/glsl/mod.rs b/src/back/glsl/mod.rs index c9d11dc4b2..addcbadbcd 100644 --- a/src/back/glsl/mod.rs +++ b/src/back/glsl/mod.rs @@ -1264,11 +1264,27 @@ impl<'a, W: Write> Writer<'a, W> { } => (location, interpolation, sampling), crate::Binding::BuiltIn(built_in) => { if let crate::BuiltIn::Position { invariant: true } = built_in { - writeln!( - self.out, - "invariant {};", - glsl_built_in(built_in, output, self.options.version.is_webgl()) - )?; + match (self.options.version, self.entry_point.stage) { + ( + Version::Embedded { + version: 300, + is_webgl: true, + }, + ShaderStage::Fragment, + ) => { + // `invariant gl_FragCoord` is not allowed in WebGL2 and possibly + // OpenGL ES in general (waiting on confirmation). + // + // See https://github.com/KhronosGroup/WebGL/issues/3518 + } + _ => { + writeln!( + self.out, + "invariant {};", + glsl_built_in(built_in, output, self.options.version.is_webgl()) + )?; + } + } } return Ok(()); } diff --git a/tests/in/invariant.param.ron b/tests/in/invariant.param.ron new file mode 100644 index 0000000000..9b90c13ba0 --- /dev/null +++ b/tests/in/invariant.param.ron @@ -0,0 +1,11 @@ +( + glsl: ( + version: Embedded ( + version: 300, + is_webgl: true + ), + writer_flags: (bits: 0), + binding_map: {}, + zero_initialize_workgroup_memory: true, + ), +) diff --git a/tests/in/invariant.wgsl b/tests/in/invariant.wgsl new file mode 100644 index 0000000000..ac6bc09f1e --- /dev/null +++ b/tests/in/invariant.wgsl @@ -0,0 +1,7 @@ +@vertex +fn vs() -> @builtin(position) @invariant vec4 { + return vec4(0.0); +} + +@fragment +fn fs(@builtin(position) @invariant position: vec4) { } diff --git a/tests/out/glsl/invariant.frag_main.Fragment.glsl b/tests/out/glsl/invariant.frag_main.Fragment.glsl new file mode 100644 index 0000000000..9936a28ad3 --- /dev/null +++ b/tests/out/glsl/invariant.frag_main.Fragment.glsl @@ -0,0 +1,11 @@ +#version 300 es + +precision highp float; +precision highp int; + + +void main() { + vec4 position = gl_FragCoord; + return; +} + diff --git a/tests/out/glsl/invariant.fs.Fragment.glsl b/tests/out/glsl/invariant.fs.Fragment.glsl new file mode 100644 index 0000000000..9936a28ad3 --- /dev/null +++ b/tests/out/glsl/invariant.fs.Fragment.glsl @@ -0,0 +1,11 @@ +#version 300 es + +precision highp float; +precision highp int; + + +void main() { + vec4 position = gl_FragCoord; + return; +} + diff --git a/tests/out/glsl/invariant.vs.Vertex.glsl b/tests/out/glsl/invariant.vs.Vertex.glsl new file mode 100644 index 0000000000..a34eab3479 --- /dev/null +++ b/tests/out/glsl/invariant.vs.Vertex.glsl @@ -0,0 +1,12 @@ +#version 300 es + +precision highp float; +precision highp int; + +invariant gl_Position; + +void main() { + gl_Position = vec4(0.0); + return; +} + diff --git a/tests/snapshots.rs b/tests/snapshots.rs index 7fea12200c..c464aa3448 100644 --- a/tests/snapshots.rs +++ b/tests/snapshots.rs @@ -558,6 +558,7 @@ fn convert_wgsl() { ), ("sprite", Targets::SPIRV), ("force_point_size_vertex_shader_webgl", Targets::GLSL), + ("invariant", Targets::GLSL), ]; for &(name, targets) in inputs.iter() {