Module: Mesa
Branch: main
Commit: aedf9113c48e9c6c5eea412c604d7f348b760e63
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=aedf9113c48e9c6c5eea412c604d7f348b760e63

Author: M Henning <[email protected]>
Date:   Mon Nov 13 22:20:57 2023 -0500

nak: Set "evict first" from ACCESS_NON_TEMPORAL

This matches the way ptxas sets this hint.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26201>

---

 src/nouveau/compiler/nak_from_nir.rs | 30 +++++++++++++++++++++++-------
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/src/nouveau/compiler/nak_from_nir.rs 
b/src/nouveau/compiler/nak_from_nir.rs
index 69db7b55214..0c481618be3 100644
--- a/src/nouveau/compiler/nak_from_nir.rs
+++ b/src/nouveau/compiler/nak_from_nir.rs
@@ -1187,6 +1187,17 @@ impl<'a> ShaderFromNir<'a> {
         }
     }
 
+    fn get_eviction_priority(
+        &mut self,
+        access: gl_access_qualifier,
+    ) -> MemEvictionPriority {
+        if self.info.sm >= 70 && access & ACCESS_NON_TEMPORAL != 0 {
+            MemEvictionPriority::First
+        } else {
+            MemEvictionPriority::Normal
+        }
+    }
+
     fn get_image_dim(&mut self, intrin: &nir_intrinsic_instr) -> ImageDim {
         let is_array = intrin.image_array();
         let image_dim = intrin.image_dim();
@@ -1433,7 +1444,8 @@ impl<'a> ShaderFromNir<'a> {
                     atom_type: atom_type,
                     image_dim: dim,
                     mem_order: MemOrder::Strong(MemScope::System),
-                    mem_eviction_priority: MemEvictionPriority::Normal,
+                    mem_eviction_priority: self
+                        .get_eviction_priority(intrin.access()),
                 });
                 self.set_dst(&intrin.def, dst);
             }
@@ -1454,7 +1466,8 @@ impl<'a> ShaderFromNir<'a> {
                     resident: Dst::None,
                     image_dim: dim,
                     mem_order: MemOrder::Strong(MemScope::System),
-                    mem_eviction_priority: MemEvictionPriority::Normal,
+                    mem_eviction_priority: self
+                        .get_eviction_priority(intrin.access()),
                     mask: (1 << comps) - 1,
                     handle: handle,
                     coord: coord,
@@ -1475,7 +1488,8 @@ impl<'a> ShaderFromNir<'a> {
                 b.push_op(OpSuSt {
                     image_dim: dim,
                     mem_order: MemOrder::Strong(MemScope::System),
-                    mem_eviction_priority: MemEvictionPriority::Normal,
+                    mem_eviction_priority: self
+                        .get_eviction_priority(intrin.access()),
                     mask: (1 << comps) - 1,
                     handle: handle,
                     coord: coord,
@@ -1532,7 +1546,7 @@ impl<'a> ShaderFromNir<'a> {
                     addr_offset: offset,
                     mem_space: MemSpace::Global,
                     mem_order: MemOrder::Strong(MemScope::System),
-                    mem_eviction_priority: MemEvictionPriority::Normal,
+                    mem_eviction_priority: MemEvictionPriority::Normal, // 
Note: no intrinic access
                 });
                 self.set_dst(&intrin.def, dst);
             }
@@ -1558,7 +1572,7 @@ impl<'a> ShaderFromNir<'a> {
                     addr_offset: offset,
                     mem_space: MemSpace::Global,
                     mem_order: MemOrder::Strong(MemScope::System),
-                    mem_eviction_priority: MemEvictionPriority::Normal,
+                    mem_eviction_priority: MemEvictionPriority::Normal, // 
Note: no intrinic access
                 });
                 self.set_dst(&intrin.def, dst);
             }
@@ -1639,7 +1653,8 @@ impl<'a> ShaderFromNir<'a> {
                     mem_type: MemType::from_size(size_B, false),
                     space: MemSpace::Global,
                     order: order,
-                    eviction_priority: MemEvictionPriority::Normal,
+                    eviction_priority: self
+                        .get_eviction_priority(intrin.access()),
                 };
                 let (addr, offset) = self.get_io_addr_offset(&srcs[0], 32);
                 let dst = b.alloc_ssa(RegFile::GPR, size_B.div_ceil(4));
@@ -1948,7 +1963,8 @@ impl<'a> ShaderFromNir<'a> {
                     mem_type: MemType::from_size(size_B, false),
                     space: MemSpace::Global,
                     order: MemOrder::Strong(MemScope::System),
-                    eviction_priority: MemEvictionPriority::Normal,
+                    eviction_priority: self
+                        .get_eviction_priority(intrin.access()),
                 };
                 let (addr, offset) = self.get_io_addr_offset(&srcs[1], 32);
 

Reply via email to