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;
|
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 {
|
typedef struct gpir_compiler {
|
||||||
struct list_head block_list;
|
struct list_head block_list;
|
||||||
|
@@ -27,103 +27,6 @@
|
|||||||
#include "gpir.h"
|
#include "gpir.h"
|
||||||
#include "lima_context.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)
|
static bool gpir_lower_const(gpir_compiler *comp)
|
||||||
{
|
{
|
||||||
int num_constant = 0;
|
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)
|
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(gpir_block, block, &comp->block_list, list) {
|
||||||
list_for_each_entry_safe(gpir_node, node, &block->node_list, list) {
|
list_for_each_entry_safe(gpir_node, node, &block->node_list, list) {
|
||||||
if (gpir_pre_rsched_lower_funcs[node->op] &&
|
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,
|
gpir_op_load_uniform,
|
||||||
offset / 4, offset % 4) != NULL;
|
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:
|
case nir_intrinsic_store_output:
|
||||||
{
|
{
|
||||||
gpir_store_node *store = gpir_node_create(block, gpir_op_store_varying);
|
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_seq(comp);
|
||||||
gpir_node_print_prog_dep(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))
|
if (!gpir_pre_rsched_lower_prog(comp))
|
||||||
goto err_out0;
|
goto err_out0;
|
||||||
|
|
||||||
|
@@ -85,6 +85,7 @@ lima_program_optimize_vs_nir(struct nir_shader *s)
|
|||||||
{
|
{
|
||||||
bool progress;
|
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_io, nir_var_all, type_size, 0);
|
||||||
NIR_PASS_V(s, nir_lower_regs_to_ssa);
|
NIR_PASS_V(s, nir_lower_regs_to_ssa);
|
||||||
NIR_PASS_V(s, nir_lower_load_const_to_scalar);
|
NIR_PASS_V(s, nir_lower_load_const_to_scalar);
|
||||||
|
Reference in New Issue
Block a user