[Mesa-dev] [PATCH v2 6/8] gallium: add lima driver

Alyssa Rosenzweig alyssa at rosenzweig.io
Fri Mar 22 15:25:19 UTC 2019


> +
> +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).


More information about the mesa-dev mailing list