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

Author: Karol Herbst <kher...@redhat.com>
Date:   Sun Dec 10 19:09:37 2023 +0100

nak: add algebraic lowering pass

Lowering and file copied from bifrost_nir_algebraic.py

Signed-off-by: Karol Herbst <kher...@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26214>

---

 src/nouveau/compiler/meson.build          | 13 ++++++-
 src/nouveau/compiler/nak_nir.c            |  4 +-
 src/nouveau/compiler/nak_nir_algebraic.py | 62 +++++++++++++++++++++++++++++++
 src/nouveau/compiler/nak_private.h        |  1 +
 4 files changed, 78 insertions(+), 2 deletions(-)

diff --git a/src/nouveau/compiler/meson.build b/src/nouveau/compiler/meson.build
index 3ce3372c4af..dadf1aaaaa9 100644
--- a/src/nouveau/compiler/meson.build
+++ b/src/nouveau/compiler/meson.build
@@ -120,9 +120,20 @@ _libnak_rs = static_library(
   link_with: [_libbitview_rs, libnak_bindings_gen, _libnak_ir_proc_rs],
 )
 
+nak_nir_algebraic_c = custom_target(
+  'nak_nir_algebraic.c',
+  input : 'nak_nir_algebraic.py',
+  output : 'nak_nir_algebraic.c',
+  command : [
+    prog_python, '@INPUT@', '-p', dir_compiler_nir,
+  ],
+  capture : true,
+  depend_files : nir_algebraic_depends,
+)
+
 _libnak = static_library(
   'nak',
-  libnak_c_files,
+  [libnak_c_files, nak_nir_algebraic_c],
   include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, 
inc_gallium],
   dependencies : libnak_deps,
   link_with : [_libnak_rs],
diff --git a/src/nouveau/compiler/nak_nir.c b/src/nouveau/compiler/nak_nir.c
index c936907c60e..b00e6c24792 100644
--- a/src/nouveau/compiler/nak_nir.c
+++ b/src/nouveau/compiler/nak_nir.c
@@ -1208,7 +1208,9 @@ nak_postprocess_nir(nir_shader *nir,
 
    do {
       progress = false;
-      if (OPT(nir, nir_opt_algebraic_late)) {
+      OPT(nir, nir_opt_algebraic_late);
+      OPT(nir, nak_nir_lower_algebraic_late, nak);
+      if (progress) {
          OPT(nir, nir_opt_constant_folding);
          OPT(nir, nir_copy_prop);
          OPT(nir, nir_opt_dce);
diff --git a/src/nouveau/compiler/nak_nir_algebraic.py 
b/src/nouveau/compiler/nak_nir_algebraic.py
new file mode 100644
index 00000000000..b191a41f703
--- /dev/null
+++ b/src/nouveau/compiler/nak_nir_algebraic.py
@@ -0,0 +1,62 @@
+# Copyright (C) 2023 Red Hat, Inc.
+# Copyright (C) 2021 Collabora, Ltd.
+# Copyright (C) 2016 Intel Corporation
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice (including the next
+# paragraph) shall be included in all copies or substantial portions of the
+# Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+import argparse
+import sys
+
+a = 'a'
+b = 'b'
+
+# common conditions to improve readability
+volta = 'nak->sm >= 70 && nak->sm < 75'
+
+algebraic_lowering = [
+    # Volta doesn't have `IMNMX`
+    (('imin', 'a', 'b'), ('bcsel', ('ilt', a, b), a, b), volta),
+    (('imax', 'a', 'b'), ('bcsel', ('ilt', a, b), b, a), volta),
+    (('umin', 'a', 'b'), ('bcsel', ('ult', a, b), a, b), volta),
+    (('umax', 'a', 'b'), ('bcsel', ('ult', a, b), b, a), volta),
+]
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('-p', '--import-path', required=True)
+    args = parser.parse_args()
+    sys.path.insert(0, args.import_path)
+    run()
+
+
+def run():
+    import nir_algebraic  # pylint: disable=import-error
+
+    print('#include "nak_private.h"')
+
+    print(nir_algebraic.AlgebraicPass("nak_nir_lower_algebraic_late",
+                                      algebraic_lowering,
+                                      [
+                                          ("const struct nak_compiler *", 
"nak"),
+                                      ]).render())
+
+
+if __name__ == '__main__':
+    main()
diff --git a/src/nouveau/compiler/nak_private.h 
b/src/nouveau/compiler/nak_private.h
index eaed9023ec1..6fab0d3db22 100644
--- a/src/nouveau/compiler/nak_private.h
+++ b/src/nouveau/compiler/nak_private.h
@@ -146,6 +146,7 @@ struct nak_nir_tex_flags {
 bool nak_nir_lower_scan_reduce(nir_shader *shader);
 bool nak_nir_lower_tex(nir_shader *nir, const struct nak_compiler *nak);
 bool nak_nir_lower_gs_intrinsics(nir_shader *shader);
+bool nak_nir_lower_algebraic_late(nir_shader *nir, const struct nak_compiler 
*nak);
 
 struct nak_nir_attr_io_flags {
    bool output : 1;

Reply via email to