pan/bi: Add support for the CLPER instructions
Those are needed to implement derivatives. Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7530>
This commit is contained in:
parent
3f8a7d9582
commit
6914316e9a
|
@ -701,6 +701,10 @@ bi_pack_add_special(bi_clause *clause, bi_instruction *ins, bi_registers *regs)
|
||||||
return pan_pack_add_cube_ssel(clause, ins, regs);
|
return pan_pack_add_cube_ssel(clause, ins, regs);
|
||||||
case BI_SPECIAL_CUBE_TSEL:
|
case BI_SPECIAL_CUBE_TSEL:
|
||||||
return pan_pack_add_cube_tsel(clause, ins, regs);
|
return pan_pack_add_cube_tsel(clause, ins, regs);
|
||||||
|
case BI_SPECIAL_CLPER_V6:
|
||||||
|
return pan_pack_add_clper_v6_i32(clause, ins, regs);
|
||||||
|
case BI_SPECIAL_CLPER_V7:
|
||||||
|
return pan_pack_add_clper_v7_i32(clause, ins, regs);
|
||||||
default:
|
default:
|
||||||
unreachable("Unknown special op");
|
unreachable("Unknown special op");
|
||||||
}
|
}
|
||||||
|
|
|
@ -211,6 +211,8 @@ bi_special_op_name(enum bi_special_op op)
|
||||||
case BI_SPECIAL_CUBEFACE2: return "cubeface2";
|
case BI_SPECIAL_CUBEFACE2: return "cubeface2";
|
||||||
case BI_SPECIAL_CUBE_SSEL: return "cube_ssel";
|
case BI_SPECIAL_CUBE_SSEL: return "cube_ssel";
|
||||||
case BI_SPECIAL_CUBE_TSEL: return "cube_tsel";
|
case BI_SPECIAL_CUBE_TSEL: return "cube_tsel";
|
||||||
|
case BI_SPECIAL_CLPER_V6: return "clper_v6";
|
||||||
|
case BI_SPECIAL_CLPER_V7: return "clper_v7";
|
||||||
default: return "invalid";
|
default: return "invalid";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -241,6 +241,10 @@ enum bi_special_op {
|
||||||
BI_SPECIAL_CUBEFACE2,
|
BI_SPECIAL_CUBEFACE2,
|
||||||
BI_SPECIAL_CUBE_SSEL,
|
BI_SPECIAL_CUBE_SSEL,
|
||||||
BI_SPECIAL_CUBE_TSEL,
|
BI_SPECIAL_CUBE_TSEL,
|
||||||
|
|
||||||
|
/* Cross-lane permute, used to implement dFd{x,y} */
|
||||||
|
BI_SPECIAL_CLPER_V6,
|
||||||
|
BI_SPECIAL_CLPER_V7,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct bi_bitwise {
|
struct bi_bitwise {
|
||||||
|
@ -259,6 +263,46 @@ struct bi_texture {
|
||||||
bool compute_lod;
|
bool compute_lod;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum bi_clper_lane_op_mod {
|
||||||
|
BI_CLPER_LANE_OP_MOD_NONE,
|
||||||
|
BI_CLPER_LANE_OP_MOD_XOR,
|
||||||
|
BI_CLPER_LANE_OP_MOD_ACCUMULATE,
|
||||||
|
BI_CLPER_LANE_OP_MOD_SHIFT,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum bi_subgroup_sz {
|
||||||
|
BI_CLPER_SUBGROUP_SZ_2,
|
||||||
|
BI_CLPER_SUBGROUP_SZ_4,
|
||||||
|
BI_CLPER_SUBGROUP_SZ_8,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum bi_clper_inactive_res {
|
||||||
|
BI_CLPER_INACTIVE_RES_ZERO,
|
||||||
|
BI_CLPER_INACTIVE_RES_UMAX,
|
||||||
|
BI_CLPER_INACTIVE_RES_I1,
|
||||||
|
BI_CLPER_INACTIVE_RES_V2I1,
|
||||||
|
BI_CLPER_INACTIVE_RES_SMIN,
|
||||||
|
BI_CLPER_INACTIVE_RES_SMAX,
|
||||||
|
BI_CLPER_INACTIVE_RES_V2SMIN,
|
||||||
|
BI_CLPER_INACTIVE_RES_V2SMAX,
|
||||||
|
BI_CLPER_INACTIVE_RES_V4SMIN,
|
||||||
|
BI_CLPER_INACTIVE_RES_V4SMAX,
|
||||||
|
BI_CLPER_INACTIVE_RES_F1,
|
||||||
|
BI_CLPER_INACTIVE_RES_V2F1,
|
||||||
|
BI_CLPER_INACTIVE_RES_INFN,
|
||||||
|
BI_CLPER_INACTIVE_RES_INF,
|
||||||
|
BI_CLPER_INACTIVE_RES_V2INFN,
|
||||||
|
BI_CLPER_INACTIVE_RES_V2INF,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct bi_special {
|
||||||
|
struct {
|
||||||
|
enum bi_clper_lane_op_mod lane_op_mod;
|
||||||
|
enum bi_clper_inactive_res inactive_res;
|
||||||
|
} clper;
|
||||||
|
enum bi_subgroup_sz subgroup_sz;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct list_head link; /* Must be first */
|
struct list_head link; /* Must be first */
|
||||||
enum bi_class type;
|
enum bi_class type;
|
||||||
|
@ -355,6 +399,7 @@ typedef struct {
|
||||||
|
|
||||||
struct bi_bitwise bitwise;
|
struct bi_bitwise bitwise;
|
||||||
struct bi_texture texture;
|
struct bi_texture texture;
|
||||||
|
struct bi_special special;
|
||||||
};
|
};
|
||||||
} bi_instruction;
|
} bi_instruction;
|
||||||
|
|
||||||
|
|
|
@ -284,6 +284,13 @@ modifier_map = {
|
||||||
# For +LD_VAR, infer sample from load_vary.interp_mode
|
# For +LD_VAR, infer sample from load_vary.interp_mode
|
||||||
"sample": lambda a,b,c,d: 'ins->load_vary.interp_mode',
|
"sample": lambda a,b,c,d: 'ins->load_vary.interp_mode',
|
||||||
|
|
||||||
|
# +CLPER
|
||||||
|
"lane_op": lambda a,b,c,d: 'ins->special.clper.lane_op_mod',
|
||||||
|
"inactive_result": lambda a,b,c,d: 'ins->special.clper.inactive_res',
|
||||||
|
|
||||||
|
# +CLPER and +WMASK
|
||||||
|
"subgroup": lambda a,b,c,d: 'ins->special.subgroup_sz',
|
||||||
|
|
||||||
# We don't support these in the IR yet (TODO)
|
# We don't support these in the IR yet (TODO)
|
||||||
"saturate": lambda a,b,c,d: '0', # clamp to min/max int
|
"saturate": lambda a,b,c,d: '0', # clamp to min/max int
|
||||||
"mask": lambda a,b,c,d: '0', # clz(~0) = ~0
|
"mask": lambda a,b,c,d: '0', # clz(~0) = ~0
|
||||||
|
@ -304,9 +311,6 @@ modifier_map = {
|
||||||
"bytes2": lambda a,b,c,d: '0', # NIR shifts are in bits
|
"bytes2": lambda a,b,c,d: '0', # NIR shifts are in bits
|
||||||
"result_word": lambda a,b,c,d: '0', # 32-bit only shifts for now (TODO)
|
"result_word": lambda a,b,c,d: '0', # 32-bit only shifts for now (TODO)
|
||||||
"source": lambda a,b,c,d: '7', # cycle_counter for LD_GCLK
|
"source": lambda a,b,c,d: '7', # cycle_counter for LD_GCLK
|
||||||
"lane_op": lambda a,b,c,d: '0', # CLPER none
|
|
||||||
"subgroup": lambda a,b,c,d: '1', # CLPER subgroup4
|
|
||||||
"inactive_result": lambda a,b,c,d: '0', # CLPER zero
|
|
||||||
"threads": lambda a,b,c,d: '0', # IMULD odd
|
"threads": lambda a,b,c,d: '0', # IMULD odd
|
||||||
"combine": lambda a,b,c,d: '0', # BRANCHC any
|
"combine": lambda a,b,c,d: '0', # BRANCHC any
|
||||||
"format": lambda a,b,c,d: '1', # LEA_TEX_IMM u32
|
"format": lambda a,b,c,d: '1', # LEA_TEX_IMM u32
|
||||||
|
|
Loading…
Reference in New Issue