mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-27 10:30:08 +01:00
i965/fs: add generator support for pixel interpolator query
V5: - Split into separate opcodes
- Pass message data in src1 immediate
- Put noperspective bit in fs_inst rather than adding any junk to
backend_instruction
Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
d732598b63
commit
6e91f2df95
4 changed files with 59 additions and 0 deletions
|
|
@ -853,6 +853,10 @@ enum opcode {
|
|||
FS_OPCODE_UNPACK_HALF_2x16_SPLIT_X,
|
||||
FS_OPCODE_UNPACK_HALF_2x16_SPLIT_Y,
|
||||
FS_OPCODE_PLACEHOLDER_HALT,
|
||||
FS_OPCODE_INTERPOLATE_AT_CENTROID,
|
||||
FS_OPCODE_INTERPOLATE_AT_SAMPLE,
|
||||
FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET,
|
||||
FS_OPCODE_INTERPOLATE_AT_PER_SLOT_OFFSET,
|
||||
|
||||
VS_OPCODE_URB_WRITE,
|
||||
VS_OPCODE_PULL_CONSTANT_LOAD,
|
||||
|
|
|
|||
|
|
@ -370,6 +370,10 @@ fs_inst::is_send_from_grf() const
|
|||
{
|
||||
return (opcode == FS_OPCODE_VARYING_PULL_CONSTANT_LOAD_GEN7 ||
|
||||
opcode == SHADER_OPCODE_SHADER_TIME_ADD ||
|
||||
opcode == FS_OPCODE_INTERPOLATE_AT_CENTROID ||
|
||||
opcode == FS_OPCODE_INTERPOLATE_AT_SAMPLE ||
|
||||
opcode == FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET ||
|
||||
opcode == FS_OPCODE_INTERPOLATE_AT_PER_SLOT_OFFSET ||
|
||||
(opcode == FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD &&
|
||||
src[1].file == GRF) ||
|
||||
(is_tex() && src[0].file == GRF));
|
||||
|
|
@ -837,6 +841,10 @@ fs_visitor::implied_mrf_writes(fs_inst *inst)
|
|||
return 2;
|
||||
case SHADER_OPCODE_UNTYPED_ATOMIC:
|
||||
case SHADER_OPCODE_UNTYPED_SURFACE_READ:
|
||||
case FS_OPCODE_INTERPOLATE_AT_CENTROID:
|
||||
case FS_OPCODE_INTERPOLATE_AT_SAMPLE:
|
||||
case FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET:
|
||||
case FS_OPCODE_INTERPOLATE_AT_PER_SLOT_OFFSET:
|
||||
return 0;
|
||||
default:
|
||||
unreachable("not reached");
|
||||
|
|
|
|||
|
|
@ -196,6 +196,7 @@ public:
|
|||
bool shadow_compare:1;
|
||||
bool force_uncompressed:1;
|
||||
bool force_sechalf:1;
|
||||
bool pi_noperspective:1; /**< Pixel interpolator noperspective flag */
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -623,6 +624,12 @@ private:
|
|||
struct brw_reg offset);
|
||||
void generate_mov_dispatch_to_flags(fs_inst *inst);
|
||||
|
||||
void generate_pixel_interpolator_query(fs_inst *inst,
|
||||
struct brw_reg dst,
|
||||
struct brw_reg src,
|
||||
struct brw_reg msg_data,
|
||||
unsigned msg_type);
|
||||
|
||||
void generate_set_omask(fs_inst *inst,
|
||||
struct brw_reg dst,
|
||||
struct brw_reg sample_mask);
|
||||
|
|
|
|||
|
|
@ -995,6 +995,26 @@ fs_generator::generate_mov_dispatch_to_flags(fs_inst *inst)
|
|||
brw_pop_insn_state(p);
|
||||
}
|
||||
|
||||
void
|
||||
fs_generator::generate_pixel_interpolator_query(fs_inst *inst,
|
||||
struct brw_reg dst,
|
||||
struct brw_reg src,
|
||||
struct brw_reg msg_data,
|
||||
unsigned msg_type)
|
||||
{
|
||||
assert(msg_data.file == BRW_IMMEDIATE_VALUE &&
|
||||
msg_data.type == BRW_REGISTER_TYPE_UD);
|
||||
|
||||
brw_pixel_interpolator_query(p,
|
||||
retype(dst, BRW_REGISTER_TYPE_UW),
|
||||
src,
|
||||
inst->pi_noperspective,
|
||||
msg_type,
|
||||
msg_data.dw1.ud,
|
||||
inst->mlen,
|
||||
inst->regs_written);
|
||||
}
|
||||
|
||||
|
||||
static uint32_t brw_file_from_reg(fs_reg *reg)
|
||||
{
|
||||
|
|
@ -1730,6 +1750,26 @@ fs_generator::generate_code(exec_list *instructions)
|
|||
}
|
||||
break;
|
||||
|
||||
case FS_OPCODE_INTERPOLATE_AT_CENTROID:
|
||||
generate_pixel_interpolator_query(inst, dst, src[0], src[1],
|
||||
GEN7_PIXEL_INTERPOLATOR_LOC_CENTROID);
|
||||
break;
|
||||
|
||||
case FS_OPCODE_INTERPOLATE_AT_SAMPLE:
|
||||
generate_pixel_interpolator_query(inst, dst, src[0], src[1],
|
||||
GEN7_PIXEL_INTERPOLATOR_LOC_SAMPLE);
|
||||
break;
|
||||
|
||||
case FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET:
|
||||
generate_pixel_interpolator_query(inst, dst, src[0], src[1],
|
||||
GEN7_PIXEL_INTERPOLATOR_LOC_SHARED_OFFSET);
|
||||
break;
|
||||
|
||||
case FS_OPCODE_INTERPOLATE_AT_PER_SLOT_OFFSET:
|
||||
generate_pixel_interpolator_query(inst, dst, src[0], src[1],
|
||||
GEN7_PIXEL_INTERPOLATOR_LOC_PER_SLOT_OFFSET);
|
||||
break;
|
||||
|
||||
default:
|
||||
if (inst->opcode < (int) ARRAY_SIZE(opcode_descs)) {
|
||||
_mesa_problem(ctx, "Unsupported opcode `%s' in FS",
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue