nak: add algebraic lowering pass

Lowering and file copied from bifrost_nir_algebraic.py

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26214>
This commit is contained in:
Karol Herbst 2023-12-10 19:09:37 +01:00 committed by Marge Bot
parent 8c73b1eb90
commit cedb101d3f
4 changed files with 78 additions and 2 deletions

View file

@ -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],

View file

@ -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);

View file

@ -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()

View file

@ -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;