mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-06 02:20:11 +01:00
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:
parent
3523233027
commit
4627a0c4eb
6 changed files with 34 additions and 5 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue