| /* |
| * Copyright 2023 Valve Corporation |
| * Copyright 2014 Connor Abbott |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #ifndef NIR_LEGACY_H |
| #define NIR_LEGACY_H |
| |
| #include "nir.h" |
| |
| typedef struct { |
| nir_def *handle; |
| /** NULL for no indirect offset */ |
| nir_def *indirect; |
| unsigned base_offset; |
| } nir_reg_src; |
| |
| typedef struct { |
| nir_def *handle; |
| /** NULL for no indirect offset */ |
| nir_def *indirect; |
| unsigned base_offset; |
| } nir_reg_dest; |
| |
| typedef struct { |
| bool is_ssa; |
| |
| union { |
| nir_reg_src reg; |
| nir_def *ssa; |
| }; |
| } nir_legacy_src; |
| |
| typedef struct { |
| bool is_ssa; |
| |
| union { |
| nir_reg_dest reg; |
| nir_def *ssa; |
| }; |
| } nir_legacy_dest; |
| |
| typedef struct { |
| /* Base source */ |
| nir_legacy_src src; |
| |
| /* For inputs interpreted as floating point, flips the sign bit. */ |
| bool fneg; |
| |
| /* Clears the sign bit for floating point values, Note that the negate |
| * modifier acts after the absolute value modifier, therefore if both are set |
| * then all inputs will become negative. |
| */ |
| bool fabs; |
| |
| uint8_t swizzle[NIR_MAX_VEC_COMPONENTS]; |
| } nir_legacy_alu_src; |
| |
| typedef struct { |
| /* Base destination */ |
| nir_legacy_dest dest; |
| |
| nir_component_mask_t write_mask; |
| |
| /** |
| * Saturate output modifier |
| * |
| * Only valid for opcodes that output floating-point numbers. Clamps the |
| * output to between 0.0 and 1.0 inclusive. |
| */ |
| bool fsat; |
| } nir_legacy_alu_dest; |
| |
| /* Prepare shader for use with legacy helpers. Must call on final NIR. */ |
| void nir_legacy_trivialize(nir_shader *s, bool fuse_fabs); |
| |
| /* Reconstruct a legacy source/destination (including registers) */ |
| nir_legacy_src nir_legacy_chase_src(const nir_src *src); |
| nir_legacy_dest nir_legacy_chase_dest(nir_def *def); |
| |
| /* Reconstruct a legacy ALU source/destination (including float modifiers) */ |
| nir_legacy_alu_src nir_legacy_chase_alu_src(const nir_alu_src *src, |
| bool fuse_fabs); |
| nir_legacy_alu_dest nir_legacy_chase_alu_dest(nir_def *def); |
| |
| /* Check if a source modifier folds. If so, it may be skipped during instruction |
| * selection, avoiding the need for backend dead code elimination. |
| */ |
| bool nir_legacy_float_mod_folds(nir_alu_instr *mod); |
| |
| /* Check if an fsat destination modifier folds. If so, it must be skipped to |
| * avoid multiple conflicting writes to the same definition. |
| */ |
| bool nir_legacy_fsat_folds(nir_alu_instr *fsat); |
| |
| #endif |