X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fglsl%2Fnir%2Fnir_builder.h;h=ba988d71dde406cff6e0284ec6befac0233101b1;hb=f649afc9ddabfc70a5f9861e6daa2cb996461f45;hp=6459e9a7e296248128a4b009bd22272839553472;hpb=06f7bea96ab62e7de1523de837f5b69c1bac6513;p=mesa.git diff --git a/src/glsl/nir/nir_builder.h b/src/glsl/nir/nir_builder.h index 6459e9a7e29..ba988d71dde 100644 --- a/src/glsl/nir/nir_builder.h +++ b/src/glsl/nir/nir_builder.h @@ -24,10 +24,13 @@ #ifndef NIR_BUILDER_H #define NIR_BUILDER_H +#include "nir_control_flow.h" + struct exec_list; typedef struct nir_builder { - struct exec_list *cf_node_list; + nir_cursor cursor; + nir_shader *shader; nir_function_impl *impl; } nir_builder; @@ -41,10 +44,18 @@ nir_builder_init(nir_builder *build, nir_function_impl *impl) } static inline void -nir_builder_insert_after_cf_list(nir_builder *build, - struct exec_list *cf_node_list) +nir_builder_instr_insert(nir_builder *build, nir_instr *instr) +{ + nir_instr_insert(build->cursor, instr); + + /* Move the cursor forward. */ + build->cursor = nir_after_instr(instr); +} + +static inline void +nir_builder_cf_insert(nir_builder *build, nir_cf_node *cf) { - build->cf_node_list = cf_node_list; + nir_cf_node_insert(build->cursor, cf); } static inline nir_ssa_def * @@ -57,7 +68,7 @@ nir_build_imm(nir_builder *build, unsigned num_components, nir_const_value value load_const->value = value; - nir_instr_insert_after_cf_list(build->cf_node_list, &load_const->instr); + nir_builder_instr_insert(build, &load_const->instr); return &load_const->def; } @@ -125,7 +136,7 @@ nir_build_alu(nir_builder *build, nir_op op, nir_ssa_def *src0, nir_ssa_dest_init(&instr->instr, &instr->dest.dest, num_components, NULL); instr->dest.write_mask = (1 << num_components) - 1; - nir_instr_insert_after_cf_list(build->cf_node_list, &instr->instr); + nir_builder_instr_insert(build, &instr->instr); return &instr->dest.dest.ssa; } @@ -172,7 +183,7 @@ nir_fmov_alu(nir_builder *build, nir_alu_src src, unsigned num_components) nir_ssa_dest_init(&mov->instr, &mov->dest.dest, num_components, NULL); mov->dest.write_mask = (1 << num_components) - 1; mov->src[0] = src; - nir_instr_insert_after_cf_list(build->cf_node_list, &mov->instr); + nir_builder_instr_insert(build, &mov->instr); return &mov->dest.dest.ssa; } @@ -184,7 +195,7 @@ nir_imov_alu(nir_builder *build, nir_alu_src src, unsigned num_components) nir_ssa_dest_init(&mov->instr, &mov->dest.dest, num_components, NULL); mov->dest.write_mask = (1 << num_components) - 1; mov->src[0] = src; - nir_instr_insert_after_cf_list(build->cf_node_list, &mov->instr); + nir_builder_instr_insert(build, &mov->instr); return &mov->dest.dest.ssa; } @@ -196,8 +207,7 @@ static inline nir_ssa_def * nir_swizzle(nir_builder *build, nir_ssa_def *src, unsigned swiz[4], unsigned num_components, bool use_fmov) { - nir_alu_src alu_src; - memset(&alu_src, 0, sizeof(alu_src)); + nir_alu_src alu_src = { NIR_SRC_INIT }; alu_src.src = nir_src_for_ssa(src); for (int i = 0; i < 4; i++) alu_src.swizzle[i] = swiz[i]; @@ -206,4 +216,22 @@ nir_swizzle(nir_builder *build, nir_ssa_def *src, unsigned swiz[4], nir_imov_alu(build, alu_src, num_components); } +/** + * Turns a nir_src into a nir_ssa_def * so it can be passed to + * nir_build_alu()-based builder calls. + */ +static inline nir_ssa_def * +nir_ssa_for_src(nir_builder *build, nir_src src, int num_components) +{ + if (src.is_ssa && src.ssa->num_components == num_components) + return src.ssa; + + nir_alu_src alu = { NIR_SRC_INIT }; + alu.src = src; + for (int j = 0; j < 4; j++) + alu.swizzle[j] = j; + + return nir_imov_alu(build, alu, num_components); +} + #endif /* NIR_BUILDER_H */