xref: /aosp_15_r20/external/mesa3d/src/compiler/nir/nir_legacy.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2023 Valve Corporation
3*61046927SAndroid Build Coastguard Worker  * Copyright 2014 Connor Abbott
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  */
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker #ifndef NIR_LEGACY_H
8*61046927SAndroid Build Coastguard Worker #define NIR_LEGACY_H
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #include "nir.h"
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker typedef struct {
13*61046927SAndroid Build Coastguard Worker    nir_def *handle;
14*61046927SAndroid Build Coastguard Worker    /** NULL for no indirect offset */
15*61046927SAndroid Build Coastguard Worker    nir_def *indirect;
16*61046927SAndroid Build Coastguard Worker    unsigned base_offset;
17*61046927SAndroid Build Coastguard Worker } nir_reg_src;
18*61046927SAndroid Build Coastguard Worker 
19*61046927SAndroid Build Coastguard Worker typedef struct {
20*61046927SAndroid Build Coastguard Worker    nir_def *handle;
21*61046927SAndroid Build Coastguard Worker    /** NULL for no indirect offset */
22*61046927SAndroid Build Coastguard Worker    nir_def *indirect;
23*61046927SAndroid Build Coastguard Worker    unsigned base_offset;
24*61046927SAndroid Build Coastguard Worker } nir_reg_dest;
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker typedef struct {
27*61046927SAndroid Build Coastguard Worker    bool is_ssa;
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker    union {
30*61046927SAndroid Build Coastguard Worker       nir_reg_src reg;
31*61046927SAndroid Build Coastguard Worker       nir_def *ssa;
32*61046927SAndroid Build Coastguard Worker    };
33*61046927SAndroid Build Coastguard Worker } nir_legacy_src;
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker typedef struct {
36*61046927SAndroid Build Coastguard Worker    bool is_ssa;
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker    union {
39*61046927SAndroid Build Coastguard Worker       nir_reg_dest reg;
40*61046927SAndroid Build Coastguard Worker       nir_def *ssa;
41*61046927SAndroid Build Coastguard Worker    };
42*61046927SAndroid Build Coastguard Worker } nir_legacy_dest;
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker typedef struct {
45*61046927SAndroid Build Coastguard Worker    /* Base source */
46*61046927SAndroid Build Coastguard Worker    nir_legacy_src src;
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker    /* For inputs interpreted as floating point, flips the sign bit. */
49*61046927SAndroid Build Coastguard Worker    bool fneg;
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker    /* Clears the sign bit for floating point values, Note that the negate
52*61046927SAndroid Build Coastguard Worker     * modifier acts after the absolute value modifier, therefore if both are set
53*61046927SAndroid Build Coastguard Worker     * then all inputs will become negative.
54*61046927SAndroid Build Coastguard Worker     */
55*61046927SAndroid Build Coastguard Worker    bool fabs;
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker    uint8_t swizzle[NIR_MAX_VEC_COMPONENTS];
58*61046927SAndroid Build Coastguard Worker } nir_legacy_alu_src;
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker typedef struct {
61*61046927SAndroid Build Coastguard Worker    /* Base destination */
62*61046927SAndroid Build Coastguard Worker    nir_legacy_dest dest;
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker    nir_component_mask_t write_mask;
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker    /**
67*61046927SAndroid Build Coastguard Worker     * Saturate output modifier
68*61046927SAndroid Build Coastguard Worker     *
69*61046927SAndroid Build Coastguard Worker     * Only valid for opcodes that output floating-point numbers. Clamps the
70*61046927SAndroid Build Coastguard Worker     * output to between 0.0 and 1.0 inclusive.
71*61046927SAndroid Build Coastguard Worker     */
72*61046927SAndroid Build Coastguard Worker    bool fsat;
73*61046927SAndroid Build Coastguard Worker } nir_legacy_alu_dest;
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker /* Prepare shader for use with legacy helpers. Must call on final NIR. */
76*61046927SAndroid Build Coastguard Worker void nir_legacy_trivialize(nir_shader *s, bool fuse_fabs);
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker /* Reconstruct a legacy source/destination (including registers) */
79*61046927SAndroid Build Coastguard Worker nir_legacy_src nir_legacy_chase_src(const nir_src *src);
80*61046927SAndroid Build Coastguard Worker nir_legacy_dest nir_legacy_chase_dest(nir_def *def);
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker /* Reconstruct a legacy ALU source/destination (including float modifiers) */
83*61046927SAndroid Build Coastguard Worker nir_legacy_alu_src nir_legacy_chase_alu_src(const nir_alu_src *src,
84*61046927SAndroid Build Coastguard Worker                                             bool fuse_fabs);
85*61046927SAndroid Build Coastguard Worker nir_legacy_alu_dest nir_legacy_chase_alu_dest(nir_def *def);
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker /* Check if a source modifier folds. If so, it may be skipped during instruction
88*61046927SAndroid Build Coastguard Worker  * selection, avoiding the need for backend dead code elimination.
89*61046927SAndroid Build Coastguard Worker  */
90*61046927SAndroid Build Coastguard Worker bool nir_legacy_float_mod_folds(nir_alu_instr *mod);
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker /* Check if an fsat destination modifier folds. If so, it must be skipped to
93*61046927SAndroid Build Coastguard Worker  * avoid multiple conflicting writes to the same definition.
94*61046927SAndroid Build Coastguard Worker  */
95*61046927SAndroid Build Coastguard Worker bool nir_legacy_fsat_folds(nir_alu_instr *fsat);
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker #endif
98