PPIR_INSTR_SLOT_VARYING, PPIR_INSTR_SLOT_END
},
},
+ [ppir_op_load_coords_reg] = {
+ .name = "ld_coords_reg",
+ .type = ppir_node_type_load,
+ .slots = (int []) {
+ PPIR_INSTR_SLOT_VARYING, PPIR_INSTR_SLOT_END
+ },
+ },
[ppir_op_load_fragcoord] = {
.name = "ld_fragcoord",
.type = ppir_node_type_load,
PPIR_INSTR_SLOT_BRANCH, PPIR_INSTR_SLOT_END
},
},
+ [ppir_op_undef] = {
+ .name = "undef",
+ .type = ppir_node_type_alu,
+ .slots = (int []) {
+ },
+ },
[ppir_op_dummy] = {
.name = "dummy",
.type = ppir_node_type_alu,
return node;
}
-void ppir_node_add_dep(ppir_node *succ, ppir_node *pred)
+void ppir_node_add_dep(ppir_node *succ, ppir_node *pred,
+ ppir_dep_type type)
{
/* don't add dep for two nodes from different block */
if (succ->block != pred->block)
ppir_dep *dep = ralloc(succ, ppir_dep);
dep->pred = pred;
dep->succ = succ;
+ dep->type = type;
list_addtail(&dep->pred_link, &succ->pred_list);
list_addtail(&dep->succ_link, &pred->succ_list);
}
case ppir_node_type_load_texture:
{
ppir_load_texture_node *load_texture = ppir_node_to_load_texture(parent);
- _ppir_node_replace_child(&load_texture->src_coords, old_child, new_child);
+ for (int i = 0; i < load_texture->num_src; i++)
+ _ppir_node_replace_child(ppir_node_get_src(parent, i), old_child, new_child);
break;
}
case ppir_node_type_store:
}
new_cnode->dest.type = ppir_target_ssa;
new_cnode->dest.ssa.num_components = cnode->dest.ssa.num_components;
- new_cnode->dest.ssa.live_in = INT_MAX;
- new_cnode->dest.ssa.live_out = 0;
new_cnode->dest.write_mask = cnode->dest.write_mask;
return &new_cnode->node;
}
static ppir_node *
-ppir_node_clone_tex(ppir_block *block, ppir_node *node)
+ppir_node_clone_load(ppir_block *block, ppir_node *node)
{
- ppir_load_texture_node *tex_node = ppir_node_to_load_texture(node);
- ppir_node *tex_coords = tex_node->src_coords.node;
-
- ppir_node *new_tex_coords = NULL;
+ ppir_load_node *load_node = ppir_node_to_load(node);
+ ppir_load_node *new_lnode = ppir_node_create(block, node->op, -1, 0);
- ppir_load_texture_node *new_tnode = ppir_node_create(block, ppir_op_load_texture, -1, 0);
- if (!new_tnode)
+ if (!new_lnode)
return NULL;
- list_addtail(&new_tnode->node.list, &block->node_list);
+ list_addtail(&new_lnode->node.list, &block->node_list);
- if (tex_coords) {
- new_tex_coords = ppir_node_clone(block, tex_coords);
- if (!new_tex_coords)
- return NULL;
- }
+ new_lnode->num_components = load_node->num_components;
+ new_lnode->index = load_node->index;
ppir_dest *dest = ppir_node_get_dest(node);
- new_tnode->dest = *dest;
-
- new_tnode->sampler_dim = tex_node->sampler_dim;
-
- for (int i = 0; i < 4; i++)
- new_tnode->src_coords.swizzle[i] = tex_node->src_coords.swizzle[i];
+ new_lnode->dest = *dest;
- for (int i = 0; i < ppir_node_get_src_num(node); i++) {
- ppir_src *src = ppir_node_get_src(node, i);
- ppir_src *new_src = ppir_node_get_src(&new_tnode->node, i);
+ ppir_src *src = ppir_node_get_src(node, 0);
+ if (src) {
+ new_lnode->num_src = 1;
switch (src->type) {
- case ppir_target_ssa: {
- ppir_node_target_assign(new_src, new_tex_coords);
- ppir_node_add_dep(&new_tnode->node, new_tex_coords);
- break;
- }
- case ppir_target_register: {
- new_src->type = src->type;
- new_src->reg = src->reg;
- new_src->node = NULL;
+ case ppir_target_ssa:
+ ppir_node_target_assign(&new_lnode->src, src->node);
+ ppir_node_add_dep(&new_lnode->node, src->node, ppir_dep_src);
break;
- }
- case ppir_target_pipeline: {
- new_src->type = src->type;
- new_src->pipeline = src->pipeline;
+ case ppir_target_register:
+ new_lnode->src.type = src->type;
+ new_lnode->src.reg = src->reg;
+ new_lnode->src.node = NULL;
break;
- }
default:
- /* pipeline is not expected here */
+ /* Load nodes can't consume pipeline registers */
assert(0);
}
}
- return &new_tnode->node;
+ return &new_lnode->node;
}
-static ppir_node *
-ppir_node_clone_load(ppir_block *block, ppir_node *node)
+void
+ppir_delete_if_orphan(ppir_block *block, ppir_node *node)
{
- ppir_load_node *load_node = ppir_node_to_load(node);
- ppir_load_node *new_lnode = ppir_node_create(block, node->op, -1, 0);
-
- if (!new_lnode)
- return NULL;
-
- list_addtail(&new_lnode->node.list, &block->node_list);
-
- new_lnode->num_components = load_node->num_components;
- new_lnode->index = load_node->index;
-
ppir_dest *dest = ppir_node_get_dest(node);
- new_lnode->dest = *dest;
+ if (!dest)
+ return;
- return &new_lnode->node;
+ ppir_node_foreach_succ_safe(node, dep) {
+ ppir_node *succ = dep->succ;
+ for (int i = 0; i < ppir_node_get_src_num(succ); i++) {
+ ppir_src *src = ppir_node_get_src(succ, i);
+ if (!src)
+ continue;
+ if (ppir_node_target_equal(src, dest))
+ return;
+ }
+ }
+
+ ppir_node_delete(node);
}
ppir_node *ppir_node_clone(ppir_block *block, ppir_node *node)
switch (node->op) {
case ppir_op_const:
return ppir_node_clone_const(block, node);
- case ppir_op_load_texture:
- return ppir_node_clone_tex(block, node);
case ppir_op_load_uniform:
case ppir_op_load_varying:
case ppir_op_load_temp:
case ppir_op_load_coords:
+ case ppir_op_load_coords_reg:
return ppir_node_clone_load(block, node);
default:
return NULL;
alu->src->swizzle[s] = s;
ppir_node_replace_all_succ(move, node);
- ppir_node_add_dep(move, node);
+ ppir_node_add_dep(move, node, ppir_dep_src);
list_addtail(&move->list, &node->list);
return move;
}
+
+bool ppir_node_has_single_src_succ(ppir_node *node)
+{
+ if (list_is_singular(&node->succ_list) &&
+ list_first_entry(&node->succ_list,
+ ppir_dep, succ_link)->type == ppir_dep_src)
+ return true;
+
+ int cnt = 0;
+ ppir_node_foreach_succ(node, dep) {
+ if (dep->type != ppir_dep_src)
+ continue;
+ cnt++;
+ }
+
+ return cnt == 1;
+}