lima/ppir: Add gl_PointCoord handling

Treat gl_PointCoord as a system value and
add the necessary bits for correct codegen.

Signed-off-by: Andreas Baierl <ichgeh@imkreisrum.de>
Reviewed-by: Qiang Yu <yuq825@gmail.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Andreas Baierl 2019-05-31 09:54:27 +02:00 committed by Qiang Yu
parent 3523233027
commit 4627a0c4eb
6 changed files with 34 additions and 5 deletions

View file

@ -56,7 +56,8 @@ static void ppir_codegen_encode_varying(ppir_node *node, void *code)
if (num_components) {
assert(node->op == ppir_op_load_varying ||
node->op == ppir_op_load_coords ||
node->op == ppir_op_load_fragcoord);
node->op == ppir_op_load_fragcoord ||
node->op == ppir_op_load_pointcoord);
f->imm.dest = index >> 2;
f->imm.mask = dest->write_mask << (index & 0x3);
@ -70,9 +71,16 @@ static void ppir_codegen_encode_varying(ppir_node *node, void *code)
else
f->imm.index = load->index >> alignment;
if (node->op == ppir_op_load_fragcoord) {
f->imm.source_type = 2;
f->imm.perspective = 3;
switch (node->op) {
case ppir_op_load_fragcoord:
f->imm.source_type = 2;
f->imm.perspective = 3;
break;
case ppir_op_load_pointcoord:
f->imm.source_type = 3;
break;
default:
break;
}
}
else {

View file

@ -285,6 +285,17 @@ static ppir_node *ppir_emit_intrinsic(ppir_block *block, nir_instr *ni)
lnode->num_components = instr->num_components;
return &lnode->node;
case nir_intrinsic_load_point_coord:
if (!instr->dest.is_ssa)
mask = u_bit_consecutive(0, instr->num_components);
lnode = ppir_node_create_dest(block, ppir_op_load_pointcoord, &instr->dest, mask);
if (!lnode)
return NULL;
lnode->num_components = instr->num_components;
return &lnode->node;
case nir_intrinsic_load_uniform:
if (!instr->dest.is_ssa)
mask = u_bit_consecutive(0, instr->num_components);

View file

@ -254,6 +254,13 @@ const ppir_op_info ppir_op_infos[] = {
PPIR_INSTR_SLOT_VARYING, PPIR_INSTR_SLOT_END
},
},
[ppir_op_load_pointcoord] = {
.name = "ld_pointcoord",
.type = ppir_node_type_load,
.slots = (int []) {
PPIR_INSTR_SLOT_VARYING, PPIR_INSTR_SLOT_END
},
},
[ppir_op_load_uniform] = {
.name = "ld_uni",
.type = ppir_node_type_load,

View file

@ -240,7 +240,8 @@ static bool ppir_do_node_to_instr(ppir_block *block, ppir_node *node)
load->dest.pipeline = ppir_pipeline_reg_uniform;
}
else if (node->op == ppir_op_load_varying ||
node->op == ppir_op_load_fragcoord) {
node->op == ppir_op_load_fragcoord ||
node->op == ppir_op_load_pointcoord) {
/* delay the load varying dup to scheduler */
if (!create_new_instr(block, node))
return false;

View file

@ -103,6 +103,7 @@ typedef enum {
ppir_op_load_varying,
ppir_op_load_coords,
ppir_op_load_fragcoord,
ppir_op_load_pointcoord,
ppir_op_load_texture,
ppir_op_load_temp,

View file

@ -117,6 +117,7 @@ lima_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
return 1;
case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
case PIPE_CAP_TGSI_FS_POINT_IS_SYSVAL:
return 1;
case PIPE_CAP_MAX_TEXTURE_2D_SIZE: