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,
.slots = (int []) {
},
},
+ [ppir_op_dummy] = {
+ .name = "dummy",
+ .type = ppir_node_type_alu,
+ .slots = (int []) {
+ },
+ },
};
void *ppir_node_create(ppir_block *block, ppir_op op, int index, unsigned mask)
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) {
- switch (tex_coords->op) {
- case ppir_op_load_varying:
- case ppir_op_load_coords:
- new_tex_coords = ppir_node_clone(block, tex_coords);
- assert(new_tex_coords);
- break;
- default:
- new_tex_coords = tex_coords;
- break;
- }
- }
+ 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, ppir_dep_src);
- 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;