X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fpanfrost%2Fmidgard%2Fcompiler.h;h=6f953d48cb80c1f44d9ac04c9ad3840cdc184b83;hb=84580c6dbc31a65fe9170e1db3dcecd9bac63ba0;hp=52113dda33f241a5752e74646bdc27d389c8a9f4;hpb=2fc44c4dc8077abc5515786933424e85b12f3cc2;p=mesa.git diff --git a/src/panfrost/midgard/compiler.h b/src/panfrost/midgard/compiler.h index 52113dda33f..6f953d48cb8 100644 --- a/src/panfrost/midgard/compiler.h +++ b/src/panfrost/midgard/compiler.h @@ -170,9 +170,11 @@ typedef struct midgard_block { /* Succeeding blocks. The compiler should not necessarily rely on * source-order traversal */ - struct midgard_block *successors[4]; + struct midgard_block *successors[2]; unsigned nr_successors; + struct set *predecessors; + /* The successors pointer form a graph, and in the case of * complex control flow, this graph has a cycles. To aid * traversal during liveness analysis, we have a visited? @@ -268,9 +270,6 @@ typedef struct compiler_context { /* Alpha ref value passed in */ float alpha_ref; - /* The index corresponding to the fragment output */ - unsigned fragment_output; - /* The mapping of sysvals to uniforms, the count, and the off-by-one inverse */ unsigned sysvals[MAX_SYSVAL_COUNT]; unsigned sysval_count; @@ -337,6 +336,8 @@ mir_next_op(struct midgard_instruction *ins) #define mir_foreach_instr_in_block(block, v) \ list_for_each_entry(struct midgard_instruction, v, &block->instructions, link) +#define mir_foreach_instr_in_block_rev(block, v) \ + list_for_each_entry_rev(struct midgard_instruction, v, &block->instructions, link) #define mir_foreach_instr_in_block_safe(block, v) \ list_for_each_entry_safe(struct midgard_instruction, v, &block->instructions, link) @@ -361,6 +362,25 @@ mir_next_op(struct midgard_instruction *ins) mir_foreach_block(ctx, v_block) \ mir_foreach_instr_in_block_safe(v_block, v) +#define mir_foreach_successor(blk, v) \ + struct midgard_block *v; \ + struct midgard_block **_v; \ + for (_v = &blk->successors[0], \ + v = *_v; \ + v != NULL && _v < &blk->successors[2]; \ + _v++, v = *_v) \ + +/* Based on set_foreach, expanded with automatic type casts */ + +#define mir_foreach_predecessor(blk, v) \ + struct set_entry *_entry_##v; \ + struct midgard_block *v; \ + for (_entry_##v = _mesa_set_next_entry(blk->predecessors, NULL), \ + v = (struct midgard_block *) (_entry_##v ? _entry_##v->key : NULL); \ + _entry_##v != NULL; \ + _entry_##v = _mesa_set_next_entry(blk->predecessors, _entry_##v), \ + v = (struct midgard_block *) (_entry_##v ? _entry_##v->key : NULL)) + static inline midgard_instruction * mir_last_in_block(struct midgard_block *block) { @@ -378,6 +398,19 @@ mir_get_block(compiler_context *ctx, int idx) return (struct midgard_block *) lst; } +static inline midgard_block * +mir_exit_block(struct compiler_context *ctx) +{ + midgard_block *last = list_last_entry(&ctx->blocks, + struct midgard_block, link); + + /* The last block must be empty (the exit block) */ + assert(list_empty(&last->instructions)); + assert(last->nr_successors == 0); + + return last; +} + static inline bool mir_is_alu_bundle(midgard_bundle *bundle) { @@ -444,6 +477,7 @@ bool mir_special_index(compiler_context *ctx, unsigned idx); unsigned mir_use_count(compiler_context *ctx, unsigned value); bool mir_is_written_before(compiler_context *ctx, midgard_instruction *ins, unsigned node); unsigned mir_mask_of_read_components(midgard_instruction *ins, unsigned node); +unsigned mir_ubo_shift(midgard_load_store_op op); /* MIR printing */ @@ -542,6 +576,7 @@ midgard_promote_uniforms(compiler_context *ctx, unsigned promoted_count); midgard_instruction * emit_ubo_read( compiler_context *ctx, + nir_instr *instr, unsigned dest, unsigned offset, nir_src *indirect_offset,