Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:wolfi323:branches:home:wolfi323:branches:X11:XOrg
Mesa-drivers
8aaa08844fcdefb5d3ca9af871ead70ac7bef282.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 8aaa08844fcdefb5d3ca9af871ead70ac7bef282.patch of Package Mesa-drivers
From 8aaa08844fcdefb5d3ca9af871ead70ac7bef282 Mon Sep 17 00:00:00 2001 From: Gert Wollny <gert.wollny@collabora.com> Date: Sun, 13 Jun 2021 20:20:08 +0200 Subject: r600/sfn: Clean up some ALU lowering and move code Signed-off-by: Gert Wollny <gert.wollny@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11348> --- src/gallium/drivers/r600/Android.mk | 9 -- src/gallium/drivers/r600/Makefile.sources | 2 + src/gallium/drivers/r600/meson.build | 17 +--- src/gallium/drivers/r600/sfn/sfn_nir.cpp | 39 +------- src/gallium/drivers/r600/sfn/sfn_nir.h | 4 - src/gallium/drivers/r600/sfn/sfn_nir_algebraic.py | 49 ---------- src/gallium/drivers/r600/sfn/sfn_nir_lower_alu.cpp | 103 +++++++++++++++++++++ src/gallium/drivers/r600/sfn/sfn_nir_lower_alu.h | 11 +++ 8 files changed, 121 insertions(+), 113 deletions(-) delete mode 100644 src/gallium/drivers/r600/sfn/sfn_nir_algebraic.py create mode 100644 src/gallium/drivers/r600/sfn/sfn_nir_lower_alu.cpp create mode 100644 src/gallium/drivers/r600/sfn/sfn_nir_lower_alu.h diff --git a/src/gallium/drivers/r600/meson.build b/src/gallium/drivers/r600/meson.build index 2dd39d26420..2c631bbbb54 100644 --- a/src/gallium/drivers/r600/meson.build +++ b/src/gallium/drivers/r600/meson.build @@ -151,6 +151,8 @@ files_r600 = files( 'sfn/sfn_nir.h', 'sfn/sfn_nir_legalize_image_load_store.cpp', 'sfn/sfn_nir_lower_64bit.cpp', + 'sfn/sfn_nir_lower_alu.cpp', + 'sfn/sfn_nir_lower_alu.h', 'sfn/sfn_nir_lower_fs_out_to_vector.cpp', 'sfn/sfn_nir_lower_fs_out_to_vector.h', 'sfn/sfn_nir_lower_tess_io.cpp', @@ -189,19 +191,6 @@ egd_tables_h = custom_target( capture : true, ) -sfn_nir_algebraic_c = custom_target( - 'sfn_nir_algebraic.c', - input : 'sfn/sfn_nir_algebraic.py', - output : 'sfn_nir_algebraic.c', - command : [ - prog_python, '@INPUT@', - '-p', join_paths(meson.source_root(), 'src/compiler/nir/'), - ], - capture : true, - depend_files : nir_algebraic_py, -) - - r600_c_args = [] if with_gallium_opencl r600_c_args += '-DHAVE_OPENCL' @@ -209,7 +198,7 @@ endif libr600 = static_library( 'r600', - [files_r600, egd_tables_h, sfn_nir_algebraic_c], + [files_r600, egd_tables_h], c_args : [r600_c_args, '-Wstrict-overflow=0'], gnu_symbol_visibility : 'hidden', include_directories : [ diff --git a/src/gallium/drivers/r600/sfn/sfn_nir.cpp b/src/gallium/drivers/r600/sfn/sfn_nir.cpp index e221e969f30..bf8588a6227 100644 --- a/src/gallium/drivers/r600/sfn/sfn_nir.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_nir.cpp @@ -40,6 +40,7 @@ #include "sfn_shader_tess_eval.h" #include "sfn_nir_lower_fs_out_to_vector.h" #include "sfn_ir_to_assembly.h" +#include "sfn_nir_lower_alu.h" #include <vector> @@ -337,41 +338,6 @@ bool AssemblyFromShader::lower(const std::vector<InstructionBlock>& ir) return do_lower(ir); } -static nir_ssa_def * -r600_nir_lower_pack_unpack_2x16_impl(nir_builder *b, nir_instr *instr, void *_options) -{ - nir_alu_instr *alu = nir_instr_as_alu(instr); - - switch (alu->op) { - case nir_op_unpack_half_2x16: { - nir_ssa_def *packed = nir_ssa_for_alu_src(b, alu, 0); - return nir_vec2(b, nir_unpack_half_2x16_split_x(b, packed), - nir_unpack_half_2x16_split_y(b, packed)); - - } - case nir_op_pack_half_2x16: { - nir_ssa_def *src_vec2 = nir_ssa_for_alu_src(b, alu, 0); - return nir_pack_half_2x16_split(b, nir_channel(b, src_vec2, 0), - nir_channel(b, src_vec2, 1)); - } - default: - return nullptr; - } -} - -bool r600_nir_lower_pack_unpack_2x16_filter(const nir_instr *instr, const void *_options) -{ - return instr->type == nir_instr_type_alu; -} - -bool r600_nir_lower_pack_unpack_2x16(nir_shader *shader) -{ - return nir_shader_lower_instructions(shader, - r600_nir_lower_pack_unpack_2x16_filter, - r600_nir_lower_pack_unpack_2x16_impl, - nullptr); -}; - static void r600_nir_lower_scratch_address_impl(nir_builder *b, nir_intrinsic_instr *instr) { @@ -610,7 +576,6 @@ r600_nir_lower_atomics(nir_shader *shader) return progress; } using r600::r600_nir_lower_int_tg4; -using r600::r600_nir_lower_pack_unpack_2x16; using r600::r600_lower_scratch_addresses; using r600::r600_lower_fs_out_to_vector; using r600::r600_lower_ubo_to_align16; @@ -876,7 +841,7 @@ int r600_shader_from_nir(struct r600_context *rctx, idiv_options.allow_fp16 = true; NIR_PASS_V(sel->nir, nir_lower_idiv, &idiv_options); - NIR_PASS_V(sel->nir, r600_lower_alu); + NIR_PASS_V(sel->nir, r600_nir_lower_trigen); NIR_PASS_V(sel->nir, nir_lower_phis_to_scalar, false); if (lower_64bit) diff --git a/src/gallium/drivers/r600/sfn/sfn_nir.h b/src/gallium/drivers/r600/sfn/sfn_nir.h index 695be1af162..4cec83314e4 100644 --- a/src/gallium/drivers/r600/sfn/sfn_nir.h +++ b/src/gallium/drivers/r600/sfn/sfn_nir.h @@ -54,8 +54,6 @@ protected: nir_builder *b; }; -bool r600_nir_lower_pack_unpack_2x16(nir_shader *shader); - bool r600_lower_scratch_addresses(nir_shader *shader); bool r600_lower_ubo_to_align16(nir_shader *shader); @@ -156,8 +154,6 @@ int r600_shader_from_nir(struct r600_context *rctx, struct r600_pipe_shader *pipeshader, union r600_shader_key *key); -bool r600_lower_alu(nir_shader *sh); - #ifdef __cplusplus } #endif diff --git a/src/gallium/drivers/r600/sfn/sfn_nir_algebraic.py b/src/gallium/drivers/r600/sfn/sfn_nir_algebraic.py deleted file mode 100644 index 2ef06411172..00000000000 --- a/src/gallium/drivers/r600/sfn/sfn_nir_algebraic.py +++ /dev/null @@ -1,49 +0,0 @@ -# -# Copyright (C) 2021 Collabora Ltd. -# -# 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 - -lower_alu = [ - # For chipfamily r600 one must do fma (2*pi ffract() - 0.5) - (('fsin', "a@32"), ('fsin_r600', ('fadd', ('ffract', ('ffma', 'a', 0.15915494, 0.5)), -0.5))), - (('fcos', "a@32"), ('fcos_r600', ('fadd', ('ffract', ('ffma', 'a', 0.15915494, 0.5)), -0.5))), -] - -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 "sfn/sfn_nir.h"') - - print(nir_algebraic.AlgebraicPass("r600_lower_alu", - lower_alu).render()) - -if __name__ == '__main__': - main() diff --git a/src/gallium/drivers/r600/sfn/sfn_nir_lower_alu.cpp b/src/gallium/drivers/r600/sfn/sfn_nir_lower_alu.cpp new file mode 100644 index 00000000000..561c7468f91 --- /dev/null +++ b/src/gallium/drivers/r600/sfn/sfn_nir_lower_alu.cpp @@ -0,0 +1,103 @@ +#include "sfn_nir_lower_alu.h" +#include "sfn_nir.h" + +namespace r600 { + +class Lower2x16 : public NirLowerInstruction { +private: + bool filter(const nir_instr *instr) const override; + nir_ssa_def *lower(nir_instr *instr) override; +}; + + +bool Lower2x16::filter(const nir_instr *instr) const +{ + if (instr->type != nir_instr_type_alu) + return false; + auto alu = nir_instr_as_alu(instr); + switch (alu->op) { + case nir_op_unpack_half_2x16: + case nir_op_pack_half_2x16: + return true; + default: + return false; + } +} + +nir_ssa_def *Lower2x16::lower(nir_instr *instr) +{ + nir_alu_instr *alu = nir_instr_as_alu(instr); + + switch (alu->op) { + case nir_op_unpack_half_2x16: { + nir_ssa_def *packed = nir_ssa_for_alu_src(b, alu, 0); + return nir_vec2(b, nir_unpack_half_2x16_split_x(b, packed), + nir_unpack_half_2x16_split_y(b, packed)); + + } + case nir_op_pack_half_2x16: { + nir_ssa_def *src_vec2 = nir_ssa_for_alu_src(b, alu, 0); + return nir_pack_half_2x16_split(b, nir_channel(b, src_vec2, 0), + nir_channel(b, src_vec2, 1)); + } + default: + unreachable("Lower2x16 filter doesn't filter correctly"); + } +} + +class LowerSinCos : public NirLowerInstruction { +private: + bool filter(const nir_instr *instr) const override; + nir_ssa_def *lower(nir_instr *instr) override; +}; + +bool LowerSinCos::filter(const nir_instr *instr) const +{ + if (instr->type != nir_instr_type_alu) + return false; + + auto alu = nir_instr_as_alu(instr); + switch (alu->op) { + case nir_op_fsin: + case nir_op_fcos: + return true; + default: + return false; + } +} + +nir_ssa_def *LowerSinCos::lower(nir_instr *instr) +{ + auto alu = nir_instr_as_alu(instr); + + assert(alu->op == nir_op_fsin || + alu->op == nir_op_fcos); + + auto normalized = + nir_fadd(b, + nir_ffract(b, + nir_ffma(b, + nir_ssa_for_alu_src(b, alu, 0), + nir_imm_float(b, 0.15915494), + nir_imm_float(b, 0.5))), + nir_imm_float(b, -0.5)); + + if (alu->op == nir_op_fsin) + return nir_fsin_r600(b, normalized); + else + return nir_fcos_r600(b, normalized); +} + + +} // namespace r600 + + +bool r600_nir_lower_pack_unpack_2x16(nir_shader *shader) +{ + return r600::Lower2x16().run(shader); +} + +bool r600_nir_lower_trigen(nir_shader *shader) +{ + return r600::LowerSinCos().run(shader); +} diff --git a/src/gallium/drivers/r600/sfn/sfn_nir_lower_alu.h b/src/gallium/drivers/r600/sfn/sfn_nir_lower_alu.h new file mode 100644 index 00000000000..6a75493235d --- /dev/null +++ b/src/gallium/drivers/r600/sfn/sfn_nir_lower_alu.h @@ -0,0 +1,11 @@ +#ifndef SFN_NIR_LOWER_ALU_H +#define SFN_NIR_LOWER_ALU_H + +#include "nir.h" + +bool r600_nir_lower_pack_unpack_2x16(nir_shader *shader); + +bool r600_nir_lower_trigen(nir_shader *shader); + + +#endif // SFN_NIR_LOWER_ALU_H -- cgit v1.2.1
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor