From e6397d10680cf0272bde298677c5f94c706ee258 Mon Sep 17 00:00:00 2001 From: David Lenaerts Date: Tue, 9 Dec 2025 11:43:01 +0100 Subject: [PATCH 1/6] fix(gles): Support non-comparison depth textures --- naga/src/back/glsl/writer.rs | 49 +++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/naga/src/back/glsl/writer.rs b/naga/src/back/glsl/writer.rs index 4d23d2873a9..9d02057e5fd 100644 --- a/naga/src/back/glsl/writer.rs +++ b/naga/src/back/glsl/writer.rs @@ -330,7 +330,7 @@ impl<'a, W: Write> Writer<'a, W> { TypeInner::Image { mut dim, arrayed, - class, + mut class, } => { // Gather the storage format if needed let storage_format_access = match self.module.types[global.ty].inner { @@ -378,6 +378,10 @@ impl<'a, W: Write> Writer<'a, W> { // The trailing space is important write!(self.out, "uniform ")?; + if self.needs_depth_fix(ep_info, handle, &mut class) { + class = crate::ImageClass::Sampled { kind: crate::ScalarKind::Float, multi: false }; + } + // write the type // // This is way we need the leading space because `write_image_type` doesn't add @@ -453,6 +457,27 @@ impl<'a, W: Write> Writer<'a, W> { self.collect_reflection_info() } + fn needs_depth_fix(&mut self, ep_info: &valid::FunctionInfo, handle: Handle, class: &crate::ImageClass) -> bool { + if let crate::ImageClass::Depth { multi: false } = class { + let has_shadow_sampler = ep_info.sampling_set.iter().all(|key| { + let data = &self.module.global_variables[key.sampler]; + if key.image != handle { + return false; + } + return if let TypeInner::Sampler { comparison: true } = &self.module.types[data.ty].inner { + true + } else { + false + } + }); + + !has_shadow_sampler + } + else { + false + } + } + fn write_array_size( &mut self, base: Handle, @@ -2586,6 +2611,14 @@ impl<'a, W: Write> Writer<'a, W> { self.write_expr(expr, ctx)?; } + let needs_depth_fix = if let Expression::GlobalVariable(global_handle) = ctx.expressions[image] { + let ep_info = self.info.get_entry_point(self.entry_point_idx as usize); + self.needs_depth_fix(ep_info, global_handle, &class) + } + else { + false + }; + match level { // Auto needs no more arguments crate::SampleLevel::Auto => (), @@ -2604,7 +2637,16 @@ impl<'a, W: Write> Writer<'a, W> { // Exact and bias require another argument crate::SampleLevel::Exact(expr) => { write!(self.out, ", ")?; + + if needs_depth_fix { + write!(self.out, "float(")?; + } + self.write_expr(expr, ctx)?; + + if needs_depth_fix { + write!(self.out, ")")?; + } } crate::SampleLevel::Bias(_) => { // This needs to be done after the offset writing @@ -2651,6 +2693,11 @@ impl<'a, W: Write> Writer<'a, W> { // End the function write!(self.out, ")")? + + if needs_depth_fix { + // parser thinks it will yield f32, but in reality it yields vec4f + write!(self.out, ".x")?; + } } Expression::ImageLoad { image, From 0ede3bdf24f2dbf51a05a1621be3d03640e95f5f Mon Sep 17 00:00:00 2001 From: David Lenaerts Date: Tue, 9 Dec 2025 12:00:35 +0100 Subject: [PATCH 2/6] fix(gles): Fix missing semi-column --- naga/src/back/glsl/writer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/naga/src/back/glsl/writer.rs b/naga/src/back/glsl/writer.rs index 9d02057e5fd..8784860522a 100644 --- a/naga/src/back/glsl/writer.rs +++ b/naga/src/back/glsl/writer.rs @@ -2692,7 +2692,7 @@ impl<'a, W: Write> Writer<'a, W> { } // End the function - write!(self.out, ")")? + write!(self.out, ")")?; if needs_depth_fix { // parser thinks it will yield f32, but in reality it yields vec4f From 9a44b233504d07cab73170e1fc833f15722adb3a Mon Sep 17 00:00:00 2001 From: David Lenaerts Date: Tue, 9 Dec 2025 12:13:12 +0100 Subject: [PATCH 3/6] fix(gles): Run fmt --- naga/src/back/glsl/writer.rs | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/naga/src/back/glsl/writer.rs b/naga/src/back/glsl/writer.rs index 8784860522a..fd7c488fe4c 100644 --- a/naga/src/back/glsl/writer.rs +++ b/naga/src/back/glsl/writer.rs @@ -379,7 +379,10 @@ impl<'a, W: Write> Writer<'a, W> { write!(self.out, "uniform ")?; if self.needs_depth_fix(ep_info, handle, &mut class) { - class = crate::ImageClass::Sampled { kind: crate::ScalarKind::Float, multi: false }; + class = crate::ImageClass::Sampled { + kind: crate::ScalarKind::Float, + multi: false, + }; } // write the type @@ -457,23 +460,29 @@ impl<'a, W: Write> Writer<'a, W> { self.collect_reflection_info() } - fn needs_depth_fix(&mut self, ep_info: &valid::FunctionInfo, handle: Handle, class: &crate::ImageClass) -> bool { + fn needs_depth_fix( + &mut self, + ep_info: &valid::FunctionInfo, + handle: Handle, + class: &crate::ImageClass, + ) -> bool { if let crate::ImageClass::Depth { multi: false } = class { let has_shadow_sampler = ep_info.sampling_set.iter().all(|key| { let data = &self.module.global_variables[key.sampler]; if key.image != handle { return false; } - return if let TypeInner::Sampler { comparison: true } = &self.module.types[data.ty].inner { + return if let TypeInner::Sampler { comparison: true } = + &self.module.types[data.ty].inner + { true } else { false - } + }; }); !has_shadow_sampler - } - else { + } else { false } } @@ -2611,13 +2620,13 @@ impl<'a, W: Write> Writer<'a, W> { self.write_expr(expr, ctx)?; } - let needs_depth_fix = if let Expression::GlobalVariable(global_handle) = ctx.expressions[image] { - let ep_info = self.info.get_entry_point(self.entry_point_idx as usize); - self.needs_depth_fix(ep_info, global_handle, &class) - } - else { - false - }; + let needs_depth_fix = + if let Expression::GlobalVariable(global_handle) = ctx.expressions[image] { + let ep_info = self.info.get_entry_point(self.entry_point_idx as usize); + self.needs_depth_fix(ep_info, global_handle, &class) + } else { + false + }; match level { // Auto needs no more arguments From 7a27f2ec9ff60bcfeddefb70027405978122cbee Mon Sep 17 00:00:00 2001 From: David Lenaerts Date: Tue, 9 Dec 2025 13:06:51 +0100 Subject: [PATCH 4/6] fix(gles): Run clippy --- naga/src/back/glsl/writer.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/naga/src/back/glsl/writer.rs b/naga/src/back/glsl/writer.rs index fd7c488fe4c..d0a4136508b 100644 --- a/naga/src/back/glsl/writer.rs +++ b/naga/src/back/glsl/writer.rs @@ -378,7 +378,7 @@ impl<'a, W: Write> Writer<'a, W> { // The trailing space is important write!(self.out, "uniform ")?; - if self.needs_depth_fix(ep_info, handle, &mut class) { + if self.needs_depth_fix(ep_info, handle, class) { class = crate::ImageClass::Sampled { kind: crate::ScalarKind::Float, multi: false, @@ -464,21 +464,23 @@ impl<'a, W: Write> Writer<'a, W> { &mut self, ep_info: &valid::FunctionInfo, handle: Handle, - class: &crate::ImageClass, + class: crate::ImageClass, ) -> bool { if let crate::ImageClass::Depth { multi: false } = class { let has_shadow_sampler = ep_info.sampling_set.iter().all(|key| { let data = &self.module.global_variables[key.sampler]; + if key.image != handle { return false; } - return if let TypeInner::Sampler { comparison: true } = - &self.module.types[data.ty].inner + + if let TypeInner::Sampler { comparison: true } = + self.module.types[data.ty].inner { true } else { false - }; + } }); !has_shadow_sampler @@ -2623,7 +2625,7 @@ impl<'a, W: Write> Writer<'a, W> { let needs_depth_fix = if let Expression::GlobalVariable(global_handle) = ctx.expressions[image] { let ep_info = self.info.get_entry_point(self.entry_point_idx as usize); - self.needs_depth_fix(ep_info, global_handle, &class) + self.needs_depth_fix(ep_info, global_handle, class) } else { false }; From 8ef81e0721644e7d7aa6ebc7e3d4a2b1b5a533ef Mon Sep 17 00:00:00 2001 From: David Lenaerts Date: Tue, 9 Dec 2025 13:18:36 +0100 Subject: [PATCH 5/6] fix(gles): cargo fmt fixes --- naga/src/back/glsl/writer.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/naga/src/back/glsl/writer.rs b/naga/src/back/glsl/writer.rs index d0a4136508b..ff9297f60dc 100644 --- a/naga/src/back/glsl/writer.rs +++ b/naga/src/back/glsl/writer.rs @@ -474,9 +474,7 @@ impl<'a, W: Write> Writer<'a, W> { return false; } - if let TypeInner::Sampler { comparison: true } = - self.module.types[data.ty].inner - { + if let TypeInner::Sampler { comparison: true } = self.module.types[data.ty].inner { true } else { false From 0f919ea4b0c8cfa427a194a78fd5eb9d521f7cf6 Mon Sep 17 00:00:00 2001 From: David Lenaerts Date: Tue, 9 Dec 2025 13:50:38 +0100 Subject: [PATCH 6/6] Attempt at fixing tests --- naga/src/back/glsl/writer.rs | 2 +- wgpu.iml | 46 ++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 wgpu.iml diff --git a/naga/src/back/glsl/writer.rs b/naga/src/back/glsl/writer.rs index ff9297f60dc..7904944bbcb 100644 --- a/naga/src/back/glsl/writer.rs +++ b/naga/src/back/glsl/writer.rs @@ -467,7 +467,7 @@ impl<'a, W: Write> Writer<'a, W> { class: crate::ImageClass, ) -> bool { if let crate::ImageClass::Depth { multi: false } = class { - let has_shadow_sampler = ep_info.sampling_set.iter().all(|key| { + let has_shadow_sampler = ep_info.sampling_set.iter().any(|key| { let data = &self.module.global_variables[key.sampler]; if key.image != handle { diff --git a/wgpu.iml b/wgpu.iml new file mode 100644 index 00000000000..69f1ad0a6dc --- /dev/null +++ b/wgpu.iml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file