return true;
}
+ /* load can have multiple successors in case if we duplicated load node
+ * that has load node in source
+ */
+ if ((ppir_node_has_single_src_succ(node) || ppir_node_is_root(node)) &&
+ dest->type != ppir_target_register) {
+ ppir_node *succ = ppir_node_first_succ(node);
+ switch (succ->type) {
+ case ppir_node_type_alu:
+ case ppir_node_type_branch: {
+ ppir_src *src = ppir_node_get_src_for_pred(succ, node);
+ /* Can consume uniforms directly */
+ src->type = dest->type = ppir_target_pipeline;
+ src->pipeline = dest->pipeline = ppir_pipeline_reg_uniform;
+ return true;
+ }
+ default:
+ /* Create mov for everyone else */
+ break;
+ }
+ }
+
ppir_node *move = ppir_node_insert_mov(node);
if (unlikely(!move))
return false;
- dest->type = ppir_target_pipeline;
- dest->pipeline = ppir_pipeline_reg_uniform;
+ ppir_src *mov_src = ppir_node_get_src(move, 0);
+ mov_src->type = dest->type = ppir_target_pipeline;
+ mov_src->pipeline = dest->pipeline = ppir_pipeline_reg_uniform;
return true;
}
{
ppir_load_texture_node *load_tex = ppir_node_to_load_texture(node);
ppir_dest *dest = ppir_node_get_dest(node);
+ ppir_node *src_coords = ppir_node_get_src(node, 0)->node;
+ ppir_load_node *load = NULL;
- if (ppir_node_is_root(node) && dest->type == ppir_target_ssa) {
- ppir_node_delete(node);
- return true;
- }
-
- /* Create load_coords node */
- ppir_load_node *load = ppir_node_create(block, ppir_op_load_coords, -1, 0);
- if (!load)
- return false;
- list_addtail(&load->node.list, &node->list);
-
- ppir_debug("%s create load_coords node %d for %d\n",
- __FUNCTION__, load->node.index, node->index);
-
- load->dest.type = ppir_target_pipeline;
- load->dest.pipeline = ppir_pipeline_reg_discard;
-
- load->src = load_tex->src_coords;
-
- ppir_node_foreach_pred_safe(node, dep) {
- ppir_node *pred = dep->pred;
- ppir_node_remove_dep(dep);
- ppir_node_add_dep(&load->node, pred);
+ if (src_coords && ppir_node_has_single_src_succ(src_coords) &&
+ (src_coords->op == ppir_op_load_coords))
+ load = ppir_node_to_load(src_coords);
+ else {
+ /* Create load_coords node */
+ load = ppir_node_create(block, ppir_op_load_coords_reg, -1, 0);
+ if (!load)
+ return false;
+ list_addtail(&load->node.list, &node->list);
+
+ load->src = load_tex->src[0];
+ load->num_src = 1;
+ if (load_tex->sampler_dim == GLSL_SAMPLER_DIM_CUBE)
+ load->num_components = 3;
+ else
+ load->num_components = 2;
+
+ ppir_debug("%s create load_coords node %d for %d\n",
+ __FUNCTION__, load->node.index, node->index);
+
+ ppir_node_foreach_pred_safe(node, dep) {
+ ppir_node *pred = dep->pred;
+ ppir_node_remove_dep(dep);
+ ppir_node_add_dep(&load->node, pred, ppir_dep_src);
+ }
+ ppir_node_add_dep(node, &load->node, ppir_dep_src);
}
- ppir_node_add_dep(node, &load->node);
+ assert(load);
+ load_tex->src[0].type = load->dest.type = ppir_target_pipeline;
+ load_tex->src[0].pipeline = load->dest.pipeline = ppir_pipeline_reg_discard;
- /* Create move node */
- ppir_node *move = ppir_node_insert_mov(node);
+ /* Always create move node since there can be successors in other blocks */
+ ppir_node *move = ppir_node_insert_mov_all_blocks(node);
if (unlikely(!move))
return false;
if (dep)
ppir_node_replace_pred(dep, move);
else
- ppir_node_add_dep(node, move);
+ ppir_node_add_dep(node, move, ppir_dep_src);
/* pred can be a register */
if (pred)
- ppir_node_add_dep(move, pred);
+ ppir_node_add_dep(move, pred, ppir_dep_src);
src->swizzle[0] = 0;
ppir_node_target_assign(alu->src, move);
zero->dest.type = ppir_target_pipeline;
zero->dest.pipeline = ppir_pipeline_reg_const0;
zero->dest.ssa.num_components = 1;
- zero->dest.ssa.live_in = INT_MAX;
- zero->dest.ssa.live_out = 0;
zero->dest.write_mask = 0x01;
/* For now we're just comparing branch condition with 0,
branch->num_src = 2;
- ppir_node_add_dep(&branch->node, &zero->node);
+ ppir_node_add_dep(&branch->node, &zero->node, ppir_dep_src);
list_addtail(&zero->node.list, &node->list);
return true;