From b29f56e3c2af0d20c2784333e86414336b23296a Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Fri, 16 Jul 2021 22:00:00 -0400 Subject: [PATCH] glsl-out: fix emission of location/binding attributes --- src/back/glsl/mod.rs | 25 +++++++++++++-------- tests/in/quad.param.ron | 5 +++++ tests/out/glsl/quad-vert.main.Vertex.glsl | 2 +- tests/out/glsl/quad.fs_extra.Fragment.glsl | 2 +- tests/out/glsl/quad.main.Fragment.glsl | 2 +- tests/out/glsl/quad.main.Vertex.glsl | 3 +-- tests/out/glsl/shadow.fs_main.Fragment.glsl | 4 ++-- tests/out/glsl/skybox.fs_main.Fragment.glsl | 2 +- tests/out/glsl/skybox.vs_main.Vertex.glsl | 2 +- 9 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/back/glsl/mod.rs b/src/back/glsl/mod.rs index 66209e6b38..41d099601b 100644 --- a/src/back/glsl/mod.rs +++ b/src/back/glsl/mod.rs @@ -101,9 +101,14 @@ impl Version { } } - /// Checks if the version supports explicit `layout(location=)` qualifiers. + /// Checks if the version supports all of the explicit layouts: + /// - `location=` qualifiers for bindings + /// - `binding=` qualifiers for resources + /// + /// Note: `location=` for vertex inputs and fragment outputs is supported + /// unconditionally for GLES 300. fn supports_explicit_locations(&self) -> bool { - *self >= Version::Embedded(300) || *self >= Version::Desktop(410) + *self >= Version::Embedded(310) || *self >= Version::Desktop(410) } } @@ -865,19 +870,21 @@ impl<'a, W: Write> Writer<'a, W> { ShaderStage::Fragment => !output, _ => false, }; + + // Write the I/O locations, if allowed + if self.options.version.supports_explicit_locations() + || !emit_interpolation_and_auxiliary + { + write!(self.out, "layout(location = {}) ", location)?; + } + + // Write the interpolation qualifier. if let Some(interp) = interpolation { if emit_interpolation_and_auxiliary { write!(self.out, "{} ", glsl_interpolation(interp))?; } } - // Write the storage class - if !emit_interpolation_and_auxiliary - && self.options.version.supports_explicit_locations() - { - write!(self.out, "layout(location = {}) ", location)?; - } - // Write the sampling auxiliary qualifier. // // Before GLSL 4.2, the `centroid` and `sample` qualifiers were required to appear diff --git a/tests/in/quad.param.ron b/tests/in/quad.param.ron index a049e71aa2..aca1da9b93 100644 --- a/tests/in/quad.param.ron +++ b/tests/in/quad.param.ron @@ -2,4 +2,9 @@ spv_version: (1, 0), spv_debug: true, spv_adjust_coordinate_space: true, + glsl: ( + version: Embedded(300), + writer_flags: (bits: 0), + binding_map: {}, + ), ) diff --git a/tests/out/glsl/quad-vert.main.Vertex.glsl b/tests/out/glsl/quad-vert.main.Vertex.glsl index b60099c18e..b1b05b722f 100644 --- a/tests/out/glsl/quad-vert.main.Vertex.glsl +++ b/tests/out/glsl/quad-vert.main.Vertex.glsl @@ -25,7 +25,7 @@ vec2 a_pos1 = vec2(0, 0); layout(location = 1) in vec2 _p2vs_location1; layout(location = 0) in vec2 _p2vs_location0; -smooth out vec2 _vs2fs_location0; +layout(location = 0) smooth out vec2 _vs2fs_location0; void main2() { vec2 _expr12 = a_uv1; diff --git a/tests/out/glsl/quad.fs_extra.Fragment.glsl b/tests/out/glsl/quad.fs_extra.Fragment.glsl index 2556b28d83..b5f2bea379 100644 --- a/tests/out/glsl/quad.fs_extra.Fragment.glsl +++ b/tests/out/glsl/quad.fs_extra.Fragment.glsl @@ -1,4 +1,4 @@ -#version 310 es +#version 300 es precision highp float; diff --git a/tests/out/glsl/quad.main.Fragment.glsl b/tests/out/glsl/quad.main.Fragment.glsl index 4ad470b3ea..7f1fda42e0 100644 --- a/tests/out/glsl/quad.main.Fragment.glsl +++ b/tests/out/glsl/quad.main.Fragment.glsl @@ -1,4 +1,4 @@ -#version 310 es +#version 300 es precision highp float; diff --git a/tests/out/glsl/quad.main.Vertex.glsl b/tests/out/glsl/quad.main.Vertex.glsl index cde8ac8d46..e6935cfa6c 100644 --- a/tests/out/glsl/quad.main.Vertex.glsl +++ b/tests/out/glsl/quad.main.Vertex.glsl @@ -1,4 +1,4 @@ -#version 310 es +#version 300 es precision highp float; @@ -17,7 +17,6 @@ void main() { VertexOutput _tmp_return = VertexOutput(uv, vec4((1.2 * pos), 0.0, 1.0)); _vs2fs_location0 = _tmp_return.uv; gl_Position = _tmp_return.position; - gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w); return; } diff --git a/tests/out/glsl/shadow.fs_main.Fragment.glsl b/tests/out/glsl/shadow.fs_main.Fragment.glsl index dffc97416c..2f63f6c6f9 100644 --- a/tests/out/glsl/shadow.fs_main.Fragment.glsl +++ b/tests/out/glsl/shadow.fs_main.Fragment.glsl @@ -18,8 +18,8 @@ readonly buffer Lights_block_1 { uniform highp sampler2DArrayShadow _group_0_binding_2; -smooth in vec3 _vs2fs_location0; -smooth in vec4 _vs2fs_location1; +layout(location = 0) smooth in vec3 _vs2fs_location0; +layout(location = 1) smooth in vec4 _vs2fs_location1; layout(location = 0) out vec4 _fs2p_location0; float fetch_shadow(uint light_id, vec4 homogeneous_coords) { diff --git a/tests/out/glsl/skybox.fs_main.Fragment.glsl b/tests/out/glsl/skybox.fs_main.Fragment.glsl index c75b0abb0f..4495eb478a 100644 --- a/tests/out/glsl/skybox.fs_main.Fragment.glsl +++ b/tests/out/glsl/skybox.fs_main.Fragment.glsl @@ -9,7 +9,7 @@ struct VertexOutput { layout(binding = 0) uniform highp samplerCube _group_0_binding_1; -smooth in vec3 _vs2fs_location0; +layout(location = 0) smooth in vec3 _vs2fs_location0; layout(location = 0) out vec4 _fs2p_location0; void main() { diff --git a/tests/out/glsl/skybox.vs_main.Vertex.glsl b/tests/out/glsl/skybox.vs_main.Vertex.glsl index c1b423fc62..ccdac1e4db 100644 --- a/tests/out/glsl/skybox.vs_main.Vertex.glsl +++ b/tests/out/glsl/skybox.vs_main.Vertex.glsl @@ -12,7 +12,7 @@ layout(binding = 0) uniform Data_block_0 { mat4x4 view; } _group_0_binding_0; -smooth out vec3 _vs2fs_location0; +layout(location = 0) smooth out vec3 _vs2fs_location0; void main() { uint vertex_index = uint(gl_VertexID);