lima/ppir: Add gl_FrontFace handling

Signed-off-by: Andreas Baierl <ichgeh@imkreisrum.de>
Reviewed-by: Qiang Yu <yuq825@gmail.com>
This commit is contained in:
Andreas Baierl
2019-08-01 11:35:28 +02:00
committed by Qiang Yu
parent b62b0cfa71
commit 5254e53deb
6 changed files with 35 additions and 13 deletions

View File

@@ -57,7 +57,8 @@ static void ppir_codegen_encode_varying(ppir_node *node, void *code)
assert(node->op == ppir_op_load_varying ||
node->op == ppir_op_load_coords ||
node->op == ppir_op_load_fragcoord ||
node->op == ppir_op_load_pointcoord);
node->op == ppir_op_load_pointcoord ||
node->op == ppir_op_load_frontface);
f->imm.dest = index >> 2;
f->imm.mask = dest->write_mask << (index & 0x3);
@@ -79,6 +80,10 @@ static void ppir_codegen_encode_varying(ppir_node *node, void *code)
case ppir_op_load_pointcoord:
f->imm.source_type = 3;
break;
case ppir_op_load_frontface:
f->imm.source_type = 3;
f->imm.perspective = 1;
break;
default:
break;
}

View File

@@ -271,21 +271,28 @@ static ppir_node *ppir_emit_intrinsic(ppir_block *block, nir_instr *ni)
return &lnode->node;
case nir_intrinsic_load_frag_coord:
if (!instr->dest.is_ssa)
mask = u_bit_consecutive(0, instr->num_components);
lnode = ppir_node_create_dest(block, ppir_op_load_fragcoord, &instr->dest, mask);
if (!lnode)
return NULL;
lnode->num_components = instr->num_components;
return &lnode->node;
case nir_intrinsic_load_point_coord:
case nir_intrinsic_load_front_face:
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);
ppir_op op;
switch (instr->intrinsic) {
case nir_intrinsic_load_frag_coord:
op = ppir_op_load_fragcoord;
break;
case nir_intrinsic_load_point_coord:
op = ppir_op_load_pointcoord;
break;
case nir_intrinsic_load_front_face:
op = ppir_op_load_frontface;
break;
default:
assert(0);
break;
}
lnode = ppir_node_create_dest(block, op, &instr->dest, mask);
if (!lnode)
return NULL;

View File

@@ -252,6 +252,13 @@ const ppir_op_info ppir_op_infos[] = {
PPIR_INSTR_SLOT_VARYING, PPIR_INSTR_SLOT_END
},
},
[ppir_op_load_frontface] = {
.name = "ld_frontface",
.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

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

View File

@@ -100,6 +100,7 @@ typedef enum {
ppir_op_load_coords,
ppir_op_load_fragcoord,
ppir_op_load_pointcoord,
ppir_op_load_frontface,
ppir_op_load_texture,
ppir_op_load_temp,

View File

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