mirror of https://gitlab.freedesktop.org/mesa/mesa
98 lines
2.4 KiB
C
98 lines
2.4 KiB
C
/*
|
|
* 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
|