diff --git a/src/back/glsl/features.rs b/src/back/glsl/features.rs index 95a7787d42..ab2182b46c 100644 --- a/src/back/glsl/features.rs +++ b/src/back/glsl/features.rs @@ -206,7 +206,10 @@ impl<'a, W> Writer<'a, W> { /// [`Error::MissingFeatures`](super::Error::MissingFeatures) will be returned pub(super) fn collect_required_features(&mut self) -> BackendResult { if let Some(depth_test) = self.entry_point.early_depth_test { - self.features.request(Features::IMAGE_LOAD_STORE); + // If IMAGE_LOAD_STORE is supported for this version of GLSL + if self.options.version.supports_early_depth_test() { + self.features.request(Features::IMAGE_LOAD_STORE); + } if depth_test.conservative.is_some() { self.features.request(Features::CONSERVATIVE_DEPTH); diff --git a/src/back/glsl/mod.rs b/src/back/glsl/mod.rs index 71e7096e72..fa22ac8188 100644 --- a/src/back/glsl/mod.rs +++ b/src/back/glsl/mod.rs @@ -110,6 +110,10 @@ impl Version { fn supports_explicit_locations(&self) -> bool { *self >= Version::Embedded(310) || *self >= Version::Desktop(410) } + + fn supports_early_depth_test(&self) -> bool { + *self >= Version::Desktop(130) || *self >= Version::Embedded(310) + } } impl PartialOrd for Version { @@ -430,22 +434,27 @@ impl<'a, W: Write> Writer<'a, W> { // Enable early depth tests if needed if let Some(depth_test) = self.entry_point.early_depth_test { - writeln!(self.out, "layout(early_fragment_tests) in;")?; + // If early depth test is supported for this version of GLSL + if self.options.version.supports_early_depth_test() { + writeln!(self.out, "layout(early_fragment_tests) in;")?; - if let Some(conservative) = depth_test.conservative { - use crate::ConservativeDepth as Cd; + if let Some(conservative) = depth_test.conservative { + use crate::ConservativeDepth as Cd; - writeln!( - self.out, - "layout (depth_{}) out float gl_FragDepth;", - match conservative { + let depth = match conservative { Cd::GreaterEqual => "greater", Cd::LessEqual => "less", Cd::Unchanged => "unchanged", - } - )?; + }; + writeln!(self.out, "layout (depth_{}) out float gl_FragDepth;", depth)?; + } + writeln!(self.out)?; + } else { + log::warn!( + "Early depth testing is not supported for this version of GLSL: {}", + self.options.version + ); } - writeln!(self.out)?; } // Write all structs