intel/fs: Rework INTERPOLATE_AT_PER_SLOT_OFFSET
This reworks INTERPOLATE_AT_PER_SLOT_OFFSET to work more like an ALU operation and less like a send. This is less code over-all and, as a side-effect, it now properly handles execution groups and lowering so SIMD32 support just falls out. Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:

committed by
Jason Ekstrand

parent
74b477039d
commit
73d60455e9
@@ -805,6 +805,8 @@ fs_inst::components_read(unsigned i) const
|
|||||||
else
|
else
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
case FS_OPCODE_INTERPOLATE_AT_PER_SLOT_OFFSET:
|
||||||
|
return (i == 0 ? 2 : 1);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return 1;
|
return 1;
|
||||||
@@ -840,7 +842,6 @@ fs_inst::size_read(int arg) const
|
|||||||
case SHADER_OPCODE_TYPED_SURFACE_WRITE:
|
case SHADER_OPCODE_TYPED_SURFACE_WRITE:
|
||||||
case FS_OPCODE_INTERPOLATE_AT_SAMPLE:
|
case FS_OPCODE_INTERPOLATE_AT_SAMPLE:
|
||||||
case FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET:
|
case FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET:
|
||||||
case FS_OPCODE_INTERPOLATE_AT_PER_SLOT_OFFSET:
|
|
||||||
case SHADER_OPCODE_BYTE_SCATTERED_WRITE:
|
case SHADER_OPCODE_BYTE_SCATTERED_WRITE:
|
||||||
case SHADER_OPCODE_BYTE_SCATTERED_READ:
|
case SHADER_OPCODE_BYTE_SCATTERED_READ:
|
||||||
if (arg == 0)
|
if (arg == 0)
|
||||||
|
@@ -1579,16 +1579,18 @@ fs_generator::generate_pixel_interpolator_query(fs_inst *inst,
|
|||||||
struct brw_reg msg_data,
|
struct brw_reg msg_data,
|
||||||
unsigned msg_type)
|
unsigned msg_type)
|
||||||
{
|
{
|
||||||
assert(inst->size_written % REG_SIZE == 0);
|
const bool has_payload = inst->src[0].file != BAD_FILE;
|
||||||
assert(msg_data.type == BRW_REGISTER_TYPE_UD);
|
assert(msg_data.type == BRW_REGISTER_TYPE_UD);
|
||||||
|
assert(inst->size_written % REG_SIZE == 0);
|
||||||
|
|
||||||
brw_pixel_interpolator_query(p,
|
brw_pixel_interpolator_query(p,
|
||||||
retype(dst, BRW_REGISTER_TYPE_UW),
|
retype(dst, BRW_REGISTER_TYPE_UW),
|
||||||
src,
|
/* If we don't have a payload, what we send doesn't matter */
|
||||||
|
has_payload ? src : brw_vec8_grf(0, 0),
|
||||||
inst->pi_noperspective,
|
inst->pi_noperspective,
|
||||||
msg_type,
|
msg_type,
|
||||||
msg_data,
|
msg_data,
|
||||||
inst->mlen,
|
has_payload ? 2 * inst->exec_size / 8 : 1,
|
||||||
inst->size_written / REG_SIZE);
|
inst->size_written / REG_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1795,21 +1795,8 @@ emit_pixel_interpolater_send(const fs_builder &bld,
|
|||||||
{
|
{
|
||||||
struct brw_wm_prog_data *wm_prog_data =
|
struct brw_wm_prog_data *wm_prog_data =
|
||||||
brw_wm_prog_data(bld.shader->stage_prog_data);
|
brw_wm_prog_data(bld.shader->stage_prog_data);
|
||||||
fs_inst *inst;
|
|
||||||
fs_reg payload;
|
|
||||||
int mlen;
|
|
||||||
|
|
||||||
if (src.file == BAD_FILE) {
|
fs_inst *inst = bld.emit(opcode, dst, src, desc);
|
||||||
/* Dummy payload */
|
|
||||||
payload = bld.vgrf(BRW_REGISTER_TYPE_F, 1);
|
|
||||||
mlen = 1;
|
|
||||||
} else {
|
|
||||||
payload = src;
|
|
||||||
mlen = 2 * bld.dispatch_width() / 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
inst = bld.emit(opcode, dst, payload, desc);
|
|
||||||
inst->mlen = mlen;
|
|
||||||
/* 2 floats per slot returned */
|
/* 2 floats per slot returned */
|
||||||
inst->size_written = 2 * dst.component_size(inst->exec_size);
|
inst->size_written = 2 * dst.component_size(inst->exec_size);
|
||||||
inst->pi_noperspective = interpolation == INTERP_MODE_NOPERSPECTIVE;
|
inst->pi_noperspective = interpolation == INTERP_MODE_NOPERSPECTIVE;
|
||||||
@@ -3464,7 +3451,7 @@ fs_visitor::nir_emit_fs_intrinsic(const fs_builder &bld,
|
|||||||
FS_OPCODE_INTERPOLATE_AT_SAMPLE,
|
FS_OPCODE_INTERPOLATE_AT_SAMPLE,
|
||||||
dest,
|
dest,
|
||||||
fs_reg(), /* src */
|
fs_reg(), /* src */
|
||||||
msg_data,
|
component(msg_data, 0),
|
||||||
interpolation);
|
interpolation);
|
||||||
set_predicate(BRW_PREDICATE_NORMAL, inst);
|
set_predicate(BRW_PREDICATE_NORMAL, inst);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user