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