lima/gpir: switch to use nir_lower_viewport_transform
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com> Reviewed-by: Erico Nunes <nunes.erico@gmail.com> Signed-off-by: Qiang Yu <yuq825@gmail.com>
This commit is contained in:
@@ -319,7 +319,9 @@ typedef struct {
|
||||
|
||||
struct lima_vs_shader_state;
|
||||
|
||||
#define GPIR_VECTOR_SSA_NUM 0
|
||||
#define GPIR_VECTOR_SSA_VIEWPORT_SCALE 0
|
||||
#define GPIR_VECTOR_SSA_VIEWPORT_OFFSET 1
|
||||
#define GPIR_VECTOR_SSA_NUM 2
|
||||
|
||||
typedef struct gpir_compiler {
|
||||
struct list_head block_list;
|
||||
|
@@ -27,103 +27,6 @@
|
||||
#include "gpir.h"
|
||||
#include "lima_context.h"
|
||||
|
||||
static gpir_node *
|
||||
gpir_lower_create_insert_node(gpir_node *parent, gpir_node *child,
|
||||
gpir_node *child2, gpir_op op)
|
||||
{
|
||||
gpir_node *node = gpir_node_create(parent->block, op);
|
||||
if (!node)
|
||||
return NULL;
|
||||
|
||||
gpir_alu_node *alu = gpir_node_to_alu(node);
|
||||
alu->children[0] = child;
|
||||
alu->children[1] = child2;
|
||||
alu->num_child = 2;
|
||||
gpir_node_insert_child(parent, child, node);
|
||||
gpir_node_add_dep(node, child2, GPIR_DEP_INPUT);
|
||||
list_addtail(&node->list, &parent->list);
|
||||
return node;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static bool gpir_lower_const(gpir_compiler *comp)
|
||||
{
|
||||
int num_constant = 0;
|
||||
@@ -488,9 +391,6 @@ static bool (*gpir_post_rsched_lower_funcs[gpir_op_num])(gpir_block *, gpir_node
|
||||
|
||||
bool gpir_pre_rsched_lower_prog(gpir_compiler *comp)
|
||||
{
|
||||
if (!gpir_lower_viewport_transform(comp))
|
||||
return false;
|
||||
|
||||
list_for_each_entry(gpir_block, block, &comp->block_list, list) {
|
||||
list_for_each_entry_safe(gpir_node, node, &block->node_list, list) {
|
||||
if (gpir_pre_rsched_lower_funcs[node->op] &&
|
||||
|
@@ -214,6 +214,10 @@ static bool gpir_emit_intrinsic(gpir_block *block, nir_instr *ni)
|
||||
gpir_op_load_uniform,
|
||||
offset / 4, offset % 4) != NULL;
|
||||
}
|
||||
case nir_intrinsic_load_viewport_scale:
|
||||
return gpir_create_vector_load(block, &instr->dest, GPIR_VECTOR_SSA_VIEWPORT_SCALE);
|
||||
case nir_intrinsic_load_viewport_offset:
|
||||
return gpir_create_vector_load(block, &instr->dest, GPIR_VECTOR_SSA_VIEWPORT_OFFSET);
|
||||
case nir_intrinsic_store_output:
|
||||
{
|
||||
gpir_store_node *store = gpir_node_create(block, gpir_op_store_varying);
|
||||
@@ -409,6 +413,9 @@ bool gpir_compile_nir(struct lima_vs_shader_state *prog, struct nir_shader *nir)
|
||||
gpir_node_print_prog_seq(comp);
|
||||
gpir_node_print_prog_dep(comp);
|
||||
|
||||
/* increase for viewport uniforms */
|
||||
comp->constant_base += GPIR_VECTOR_SSA_NUM;
|
||||
|
||||
if (!gpir_pre_rsched_lower_prog(comp))
|
||||
goto err_out0;
|
||||
|
||||
|
@@ -85,6 +85,7 @@ lima_program_optimize_vs_nir(struct nir_shader *s)
|
||||
{
|
||||
bool progress;
|
||||
|
||||
NIR_PASS_V(s, nir_lower_viewport_transform);
|
||||
NIR_PASS_V(s, nir_lower_io, nir_var_all, type_size, 0);
|
||||
NIR_PASS_V(s, nir_lower_regs_to_ssa);
|
||||
NIR_PASS_V(s, nir_lower_load_const_to_scalar);
|
||||
|
Reference in New Issue
Block a user