mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 11:28:05 +02: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_X,
|
||||||
FS_OPCODE_UNPACK_HALF_2x16_SPLIT_Y,
|
FS_OPCODE_UNPACK_HALF_2x16_SPLIT_Y,
|
||||||
FS_OPCODE_PLACEHOLDER_HALT,
|
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_URB_WRITE,
|
||||||
VS_OPCODE_PULL_CONSTANT_LOAD,
|
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 ||
|
return (opcode == FS_OPCODE_VARYING_PULL_CONSTANT_LOAD_GEN7 ||
|
||||||
opcode == SHADER_OPCODE_SHADER_TIME_ADD ||
|
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 &&
|
(opcode == FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD &&
|
||||||
src[1].file == GRF) ||
|
src[1].file == GRF) ||
|
||||||
(is_tex() && src[0].file == GRF));
|
(is_tex() && src[0].file == GRF));
|
||||||
|
|
@ -837,6 +841,10 @@ fs_visitor::implied_mrf_writes(fs_inst *inst)
|
||||||
return 2;
|
return 2;
|
||||||
case SHADER_OPCODE_UNTYPED_ATOMIC:
|
case SHADER_OPCODE_UNTYPED_ATOMIC:
|
||||||
case SHADER_OPCODE_UNTYPED_SURFACE_READ:
|
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;
|
return 0;
|
||||||
default:
|
default:
|
||||||
unreachable("not reached");
|
unreachable("not reached");
|
||||||
|
|
|
||||||
|
|
@ -196,6 +196,7 @@ public:
|
||||||
bool shadow_compare:1;
|
bool shadow_compare:1;
|
||||||
bool force_uncompressed:1;
|
bool force_uncompressed:1;
|
||||||
bool force_sechalf:1;
|
bool force_sechalf:1;
|
||||||
|
bool pi_noperspective:1; /**< Pixel interpolator noperspective flag */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -623,6 +624,12 @@ private:
|
||||||
struct brw_reg offset);
|
struct brw_reg offset);
|
||||||
void generate_mov_dispatch_to_flags(fs_inst *inst);
|
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,
|
void generate_set_omask(fs_inst *inst,
|
||||||
struct brw_reg dst,
|
struct brw_reg dst,
|
||||||
struct brw_reg sample_mask);
|
struct brw_reg sample_mask);
|
||||||
|
|
|
||||||
|
|
@ -995,6 +995,26 @@ fs_generator::generate_mov_dispatch_to_flags(fs_inst *inst)
|
||||||
brw_pop_insn_state(p);
|
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)
|
static uint32_t brw_file_from_reg(fs_reg *reg)
|
||||||
{
|
{
|
||||||
|
|
@ -1730,6 +1750,26 @@ fs_generator::generate_code(exec_list *instructions)
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
if (inst->opcode < (int) ARRAY_SIZE(opcode_descs)) {
|
if (inst->opcode < (int) ARRAY_SIZE(opcode_descs)) {
|
||||||
_mesa_problem(ctx, "Unsupported opcode `%s' in FS",
|
_mesa_problem(ctx, "Unsupported opcode `%s' in FS",
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue