nir_register *addr_reg;
/**
- * Stack of cf_node_lists where instructions should be pushed as we pop
+ * Stack of nir_cursors where instructions should be pushed as we pop
* back out of the control flow stack.
*
* For each IF/ELSE/ENDIF block, if_stack[if_stack_pos] has where the else
* instructions should be placed, and if_stack[if_stack_pos - 1] has where
* the next instructions outside of the if/then/else block go.
*/
- struct exec_list **if_stack;
+ nir_cursor *if_stack;
unsigned if_stack_pos;
/**
- * Stack of cf_node_lists where instructions should be pushed as we pop
+ * Stack of nir_cursors where instructions should be pushed as we pop
* back out of the control flow stack.
*
* loop_stack[loop_stack_pos - 1] contains the cf_node_list for the outside
* of the loop.
*/
- struct exec_list **loop_stack;
+ nir_cursor *loop_stack;
unsigned loop_stack_pos;
/* How many TGSI_FILE_IMMEDIATE vec4s have been parsed so far. */
nir_builder *b = &c->build;
/* Save the outside-of-the-if-statement node list. */
- c->if_stack[c->if_stack_pos] = b->cf_node_list;
+ c->if_stack[c->if_stack_pos] = b->cursor;
c->if_stack_pos++;
src = ttn_channel(b, src, X);
} else {
if_stmt->condition = nir_src_for_ssa(nir_fne(b, src, nir_imm_int(b, 0)));
}
- nir_cf_node_insert_end(b->cf_node_list, &if_stmt->cf_node);
+ nir_builder_cf_insert(b, &if_stmt->cf_node);
- nir_builder_insert_after_cf_list(b, &if_stmt->then_list);
+ b->cursor = nir_after_cf_list(&if_stmt->then_list);
- c->if_stack[c->if_stack_pos] = &if_stmt->else_list;
+ c->if_stack[c->if_stack_pos] = nir_after_cf_list(&if_stmt->else_list);
c->if_stack_pos++;
}
{
nir_builder *b = &c->build;
- nir_builder_insert_after_cf_list(b, c->if_stack[c->if_stack_pos - 1]);
+ b->cursor = c->if_stack[c->if_stack_pos - 1];
}
static void
nir_builder *b = &c->build;
c->if_stack_pos -= 2;
- nir_builder_insert_after_cf_list(b, c->if_stack[c->if_stack_pos]);
+ b->cursor = c->if_stack[c->if_stack_pos];
}
static void
nir_builder *b = &c->build;
/* Save the outside-of-the-loop node list. */
- c->loop_stack[c->loop_stack_pos] = b->cf_node_list;
+ c->loop_stack[c->loop_stack_pos] = b->cursor;
c->loop_stack_pos++;
nir_loop *loop = nir_loop_create(b->shader);
- nir_cf_node_insert_end(b->cf_node_list, &loop->cf_node);
+ nir_builder_cf_insert(b, &loop->cf_node);
- nir_builder_insert_after_cf_list(b, &loop->body);
+ b->cursor = nir_after_cf_list(&loop->body);
}
static void
nir_builder *b = &c->build;
c->loop_stack_pos--;
- nir_builder_insert_after_cf_list(b, c->loop_stack[c->loop_stack_pos]);
+ b->cursor = c->loop_stack[c->loop_stack_pos];
}
static void
nir_function_impl *impl = nir_function_impl_create(overload);
nir_builder_init(&c->build, impl);
- nir_builder_insert_after_cf_list(&c->build, &impl->body);
+ c->build.cursor = nir_after_cf_list(&impl->body);
s->num_inputs = scan.file_max[TGSI_FILE_INPUT] + 1;
s->num_uniforms = scan.const_file_max[0] + 1;
c->num_samp_types = scan.file_max[TGSI_FILE_SAMPLER_VIEW] + 1;
c->samp_types = rzalloc_array(c, nir_alu_type, c->num_samp_types);
- c->if_stack = rzalloc_array(c, struct exec_list *,
+ c->if_stack = rzalloc_array(c, nir_cursor,
(scan.opcode_count[TGSI_OPCODE_IF] +
scan.opcode_count[TGSI_OPCODE_UIF]) * 2);
- c->loop_stack = rzalloc_array(c, struct exec_list *,
+ c->loop_stack = rzalloc_array(c, nir_cursor,
scan.opcode_count[TGSI_OPCODE_BGNLOOP]);
ret = tgsi_parse_init(&parser, tgsi_tokens);
(intr->intrinsic == nir_intrinsic_discard_if)) {
nir_ssa_def *discard_cond;
- nir_builder_insert_after_instr(bld,
+ bld->cursor = nir_after_instr(
nir_block_last_instr(prev_block));
if (invert) {
nir_cf_node_get_function(&block->cf_node);
nir_builder b;
nir_builder_init(&b, impl);
- nir_builder_insert_before_instr(&b, &intr->instr);
+ b.cursor = nir_before_instr(&intr->instr);
vc4_nir_lower_blend_instr(c, &b, intr);
}
return true;
vc4_nir_lower_input(struct vc4_compile *c, nir_builder *b,
nir_intrinsic_instr *intr)
{
- nir_builder_insert_before_instr(b, &intr->instr);
+ b->cursor = nir_before_instr(&intr->instr);
if (c->stage == QSTAGE_FRAG && intr->const_index[0] ==
VC4_NIR_TLB_COLOR_READ_INPUT) {
/* All TGSI-to-NIR outputs are VEC4. */
assert(intr->num_components == 4);
- nir_builder_insert_before_instr(b, &intr->instr);
+ b->cursor = nir_before_instr(&intr->instr);
for (unsigned i = 0; i < intr->num_components; i++) {
nir_intrinsic_instr *intr_comp =
return;
assert(intr->num_components == 4);
- nir_builder_insert_before_instr(b, &intr->instr);
+ b->cursor = nir_before_instr(&intr->instr);
/* Generate scalar loads equivalent to the original VEC4. */
nir_ssa_def *dests[4];
#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_instr *before_instr;
- nir_instr *after_instr;
+ nir_cursor cursor;
nir_shader *shader;
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)
{
- build->cf_node_list = cf_node_list;
- build->before_instr = NULL;
- build->after_instr = NULL;
-}
+ nir_instr_insert(build->cursor, instr);
-static inline void
-nir_builder_insert_before_instr(nir_builder *build, nir_instr *before_instr)
-{
- build->cf_node_list = NULL;
- build->before_instr = before_instr;
- build->after_instr = NULL;
+ /* Move the cursor forward. */
+ if (build->cursor.option == nir_cursor_after_instr)
+ build->cursor.instr = instr;
}
static inline void
-nir_builder_insert_after_instr(nir_builder *build, nir_instr *after_instr)
+nir_builder_cf_insert(nir_builder *build, nir_cf_node *cf)
{
- build->cf_node_list = NULL;
- build->before_instr = NULL;
- build->after_instr = after_instr;
-}
-
-static inline void
-nir_builder_instr_insert(nir_builder *build, nir_instr *instr)
-{
- if (build->cf_node_list) {
- nir_instr_insert_after_cf_list(build->cf_node_list, instr);
- } else if (build->before_instr) {
- nir_instr_insert_before(build->before_instr, instr);
- } else {
- assert(build->after_instr);
- nir_instr_insert_after(build->after_instr, instr);
- build->after_instr = instr;
- }
+ nir_cf_node_insert(build->cursor, cf);
}
static inline nir_ssa_def *
is_signed = (op == nir_op_idiv);
- nir_builder_insert_before_instr(bld, &alu->instr);
+ bld->cursor = nir_before_instr(&alu->instr);
numer = nir_ssa_for_src(bld, alu->src[0].src,
nir_ssa_alu_instr_src_components(alu, 0));
unsigned base_offset = 0;
nir_builder *b = &state->builder;
- nir_builder_insert_before_instr(b, instr);
+ b->cursor = nir_before_instr(instr);
nir_deref *tail = &deref->deref;
while (tail->child != NULL) {
nir_builder b;
nir_builder_init(&b, nir_cf_node_get_function(&lower->instr.block->cf_node));
- nir_builder_insert_before_instr(&b, &lower->instr);
+ b.cursor = nir_before_instr(&lower->instr);
/* Emit the individual loads. */
nir_ssa_def *loads[4];
continue;
nir_tex_instr *tex = nir_instr_as_tex(instr);
- nir_builder_insert_before_instr(b, &tex->instr);
+ b->cursor = nir_before_instr(&tex->instr);
/* Find the projector in the srcs list, if present. */
int proj_index;
if (tex->sampler_dim != GLSL_SAMPLER_DIM_CUBE)
continue;
- nir_builder_insert_before_instr(b, &tex->instr);
+ b->cursor = nir_before_instr(&tex->instr);
for (unsigned i = 0; i < tex->num_srcs; i++) {
if (tex->src[i].src_type != nir_tex_src_coord)
c->build.shader = s;
c->build.impl = impl;
- nir_builder_insert_after_cf_list(&c->build, &impl->body);
+ c->build.cursor = nir_after_cf_list(&impl->body);
setup_registers_and_variables(c);
if (unlikely(c->error))