Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 58 additions & 2 deletions naga/src/back/glsl/writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -378,6 +378,13 @@ impl<'a, W: Write> Writer<'a, W> {
// The trailing space is important
write!(self.out, "uniform ")?;

if self.needs_depth_fix(ep_info, handle, 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
Expand Down Expand Up @@ -453,6 +460,33 @@ impl<'a, W: Write> Writer<'a, W> {
self.collect_reflection_info()
}

fn needs_depth_fix(
&mut self,
ep_info: &valid::FunctionInfo,
handle: Handle<crate::GlobalVariable>,
class: crate::ImageClass,
) -> bool {
if let crate::ImageClass::Depth { multi: false } = class {
let has_shadow_sampler = ep_info.sampling_set.iter().any(|key| {
let data = &self.module.global_variables[key.sampler];

if key.image != handle {
return false;
}

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<crate::Type>,
Expand Down Expand Up @@ -2586,6 +2620,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 => (),
Expand All @@ -2604,7 +2646,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
Expand Down Expand Up @@ -2650,7 +2701,12 @@ 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
write!(self.out, ".x")?;
}
}
Expression::ImageLoad {
image,
Expand Down
46 changes: 46 additions & 0 deletions wgpu.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="RUST_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/benches" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/benches/benches" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/cts_runner/examples" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/cts_runner/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/cts_runner/tests" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/examples" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/examples/features/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/examples/standalone/01_hello_compute/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/examples/standalone/02_hello_window/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/examples/standalone/custom_backend/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/lock-analyzer/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/naga-cli/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/naga-test/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/naga/hlsl-snapshots/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/naga/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/naga/tests" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/naga/xtask/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/player/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/player/tests" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/tests/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/tests/tests" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/wgpu-core/platform-deps/apple/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/wgpu-core/platform-deps/emscripten/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/wgpu-core/platform-deps/wasm/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/wgpu-core/platform-deps/windows-linux-android/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/wgpu-core/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/wgpu-hal/examples" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/wgpu-hal/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/wgpu-info/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/wgpu-macros/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/wgpu-types/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/wgpu/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/xtask/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/benches/src" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
Loading