#include "util/set.h"
#include "util/bitscan.h"
#include "util/bitset.h"
+#include "util/enum_operators.h"
#include "util/macros.h"
#include "util/format/u_format.h"
#include "compiler/nir_types.h"
nir_var_mem_shared = (1 << 8),
nir_var_mem_global = (1 << 9),
nir_var_mem_push_const = (1 << 10), /* not actually used for variables */
- nir_num_variable_modes = 11,
+ nir_var_mem_constant = (1 << 11),
+ nir_num_variable_modes = 12,
nir_var_all = (1 << nir_num_variable_modes) - 1,
} nir_variable_mode;
+MESA_DEFINE_CPP_ENUM_BITFIELD_OPERATORS(nir_variable_mode)
/**
* Rounding modes.
*
* \sa nir_variable_mode
*/
- unsigned mode:11;
+ unsigned mode:12;
/**
* Is the variable read-only?
enum pipe_format format;
} image;
+ struct {
+ /**
+ * For OpenCL inline samplers. See cl_sampler_addressing_mode and cl_sampler_filter_mode
+ */
+ unsigned is_inline_sampler : 1;
+ unsigned addressing_mode : 3;
+ unsigned normalized_coordinates : 1;
+ unsigned filter_mode : 1;
+ } sampler;
+
struct {
/**
* Transform feedback buffer.
/** generic SSA definition index. */
unsigned index;
- /** Index into the live_in and live_out bitfields */
+ /** Ordered SSA definition index used by nir_liveness. */
unsigned live_index;
/** Instruction which produces this SSA value. */
struct {
unsigned ptr_stride;
+ unsigned align_mul;
+ unsigned align_offset;
} cast;
};
*/
int16_t dom_pre_index, dom_post_index;
- /* live in and out for this block; used for liveness analysis */
+ /* SSA def live in and out for this block; used for liveness analysis.
+ * Indexed by ssa_def->index
+ */
BITSET_WORD *live_in;
BITSET_WORD *live_out;
} nir_block;
*/
nir_metadata_all = ~nir_metadata_not_properly_reset,
} nir_metadata;
+MESA_DEFINE_CPP_ENUM_BITFIELD_OPERATORS(nir_metadata)
typedef struct {
nir_cf_node cf_node;
/* lower {slt,sge,seq,sne} to {flt,fge,feq,fneu} + b2f: */
bool lower_scmp;
- /* lower fall_equalN/fany_nequalN (ex:fany_nequal4 to sne+fdot4+fsat) */
+ /* lower b/fall_equalN/b/fany_nequalN (ex:fany_nequal4 to sne+fdot4+fsat) */
bool lower_vector_cmp;
/** enables rules to lower idiv by power-of-two: */
struct exec_list functions; /** < list of nir_function */
/**
- * the highest index a load_input_*, load_uniform_*, etc. intrinsic can
- * access plus one
+ * The size of the variable space for load_input_*, load_uniform_*, etc.
+ * intrinsics. This is in back-end specific units which is likely one of
+ * bytes, dwords, or vec4s depending on context and back-end.
*/
- unsigned num_inputs, num_uniforms, num_outputs, num_shared;
+ unsigned num_inputs, num_uniforms, num_outputs;
+
+ /** Size in bytes of required shared memory */
+ unsigned shared_size;
/** Size in bytes of required scratch space */
unsigned scratch_size;
void nir_print_instr(const nir_instr *instr, FILE *fp);
void nir_print_deref(const nir_deref_instr *deref, FILE *fp);
+/** Shallow clone of a single instruction. */
+nir_instr *nir_instr_clone(nir_shader *s, const nir_instr *orig);
+
/** Shallow clone of a single ALU instruction. */
nir_alu_instr *nir_alu_instr_clone(nir_shader *s, const nir_alu_instr *orig);
void nir_inline_function_impl(struct nir_builder *b,
const nir_function_impl *impl,
- nir_ssa_def **params);
+ nir_ssa_def **params,
+ struct hash_table *shader_var_remap);
bool nir_inline_functions(nir_shader *shader);
bool nir_propagate_invariant(nir_shader *shader);
bool nir_lower_array_deref_of_vec(nir_shader *shader, nir_variable_mode modes,
nir_lower_array_deref_of_vec_options options);
-bool nir_lower_indirect_derefs(nir_shader *shader, nir_variable_mode modes);
+bool nir_lower_indirect_derefs(nir_shader *shader, nir_variable_mode modes,
+ uint32_t max_lower_array_len);
bool nir_lower_locals_to_regs(nir_shader *shader);
nir_variable_mode modes,
glsl_type_size_align_func type_info);
+bool nir_lower_mem_constant_vars(nir_shader *shader,
+ glsl_type_size_align_func type_info);
+
typedef enum {
/**
* An address format which is a simple 32-bit global GPU address.
bool nir_opt_undef(nir_shader *shader);
-bool nir_opt_vectorize(nir_shader *shader);
+typedef bool (*nir_opt_vectorize_cb)(const nir_instr *a, const nir_instr *b,
+ void *data);
+bool nir_opt_vectorize(nir_shader *shader, nir_opt_vectorize_cb filter,
+ void *data);
bool nir_opt_conditional_discard(nir_shader *shader);