From 4942a29314a8e10b2d69a6092ec6322d127ca6f1 Mon Sep 17 00:00:00 2001 From: Lorenzo Rossi Date: Tue, 20 May 2025 15:53:41 +0200 Subject: [PATCH] nvk: Fix local memory loads in Kepler shader header Kepler cards shader header needs the load/store flag enabled even for local memory usage. Part-of: --- src/nouveau/compiler/nak/ir.rs | 5 +++++ src/nouveau/compiler/nak/sph.rs | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/nouveau/compiler/nak/ir.rs b/src/nouveau/compiler/nak/ir.rs index 6102d2e8671..8c67f9e4855 100644 --- a/src/nouveau/compiler/nak/ir.rs +++ b/src/nouveau/compiler/nak/ir.rs @@ -7732,6 +7732,11 @@ pub trait ShaderModel { self.sm() >= 32 && self.sm() < 40 } + #[allow(dead_code)] + fn is_kepler(&self) -> bool { + self.is_kepler_a() || self.is_kepler_b() + } + // The following helpers are pulled from GetSpaVersion in the open-source // NVIDIA kernel driver sources diff --git a/src/nouveau/compiler/nak/sph.rs b/src/nouveau/compiler/nak/sph.rs index ffca4c6d515..a1d3a3f752d 100644 --- a/src/nouveau/compiler/nak/sph.rs +++ b/src/nouveau/compiler/nak/sph.rs @@ -473,12 +473,14 @@ pub fn encode_header( let mut sph = ShaderProgramHeader::new(ShaderType::from(&shader_info.stage), sm.sm()); + let slm_size = shader_info.slm_size.next_multiple_of(16); sph.set_sass_version(1); - sph.set_does_load_or_store(shader_info.uses_global_mem); + sph.set_does_load_or_store( + shader_info.uses_global_mem || (sm.is_kepler() && slm_size > 0), + ); sph.set_does_global_store(shader_info.writes_global_mem); sph.set_does_fp64(shader_info.uses_fp64); - let slm_size = shader_info.slm_size.next_multiple_of(16); sph.set_shader_local_memory_size(slm_size.into()); let crs_size = sm.crs_size(shader_info.max_crs_depth); sph.set_shader_local_memory_crs_size(crs_size);