> + > +static bool gpir_lower_viewport_transform(gpir_compiler *comp) > +{ > + gpir_node *rcpw = NULL; > + > + /* rcpw = 1 / w */ > + list_for_each_entry(gpir_block, block, &comp->block_list, list) { > + list_for_each_entry(gpir_node, node, &block->node_list, list) { > + if (node->op == gpir_op_store_varying) { > + gpir_store_node *store = gpir_node_to_store(node); > + if (store->index == 0 && store->component == 3) { > + gpir_node *w = store->child; > + > + rcpw = gpir_node_create(block, gpir_op_rcp); > + if (!rcpw) > + return false; > + list_addtail(&rcpw->list, &node->list); > + > + gpir_alu_node *alu = gpir_node_to_alu(rcpw); > + alu->children[0] = w; > + alu->num_child = 1; > + store->child = rcpw; > + > + gpir_node_insert_child(node, w, rcpw); > + goto found; > + } > + } > + } > + } > + > +found: > + assert(rcpw); > + > + /* xyz = xyz * rcpw * scale + transition */ > + list_for_each_entry(gpir_block, block, &comp->block_list, list) { > + list_for_each_entry(gpir_node, node, &block->node_list, list) { > + if (node->op == gpir_op_store_varying) { > + gpir_store_node *store = gpir_node_to_store(node); > + if (store->index == 0 && store->component < 3) { > + gpir_node *xyz = store->child; > + > + gpir_node *mul1 = > + gpir_lower_create_insert_node(node, xyz, rcpw, > gpir_op_mul); > + if (!mul1) > + return false; > + > + gpir_load_node *scale = gpir_node_create(block, > gpir_op_load_uniform); > + if (!scale) > + return false; > + scale->index = comp->constant_base; > + scale->component = store->component; > + list_addtail(&scale->node.list, &node->list); > + > + gpir_node *mul2 = > + gpir_lower_create_insert_node(node, mul1, &scale->node, > gpir_op_mul); > + if (!mul2) > + return false; > + > + gpir_load_node *translate = gpir_node_create(block, > gpir_op_load_uniform); > + if (!translate) > + return false; > + translate->index = comp->constant_base + 1; > + translate->component = store->component; > + list_addtail(&translate->node.list, &node->list); > + > + gpir_node *add = > + gpir_lower_create_insert_node(node, mul2, > &translate->node, gpir_op_add); > + if (!add) > + return false; > + > + store->child = add; > + } > + } > + } > + } > + > + comp->constant_base += 2; > + return true; > +}
I have this routine implemented in Panfrost at the NIR level, rather than the ISA level. Do we want to move this to common NIR code? > +static int gpir_get_max_start(gpir_node *node) Read until here (note to self, gotta go, will read more later). _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev