intel/fs: Split fetch_payload_reg() into separate helper for barycentrics.
We're about to change the layout of barycentric vectors, which will involve permuting the GRFs of barycentrics fetched from the thread payload. Make room for this in a function separate from the generic fetch_payload_reg(), since the permutation will only be applicable to barycentric vectors. This allows simplifying fetch_payload_reg(), since there was no need for handling multiple-component payload registers except for barycentrics. This causes some minor shader-db noise due to the new helper emitting a LOAD_PAYLOAD instruction unconditionally, but it will be cleaned up shortly. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -539,25 +539,21 @@ private:
|
||||
namespace brw {
|
||||
inline fs_reg
|
||||
fetch_payload_reg(const brw::fs_builder &bld, uint8_t regs[2],
|
||||
brw_reg_type type = BRW_REGISTER_TYPE_F, unsigned n = 1)
|
||||
brw_reg_type type = BRW_REGISTER_TYPE_F)
|
||||
{
|
||||
if (!regs[0])
|
||||
return fs_reg();
|
||||
|
||||
if (bld.dispatch_width() > 16) {
|
||||
const fs_reg tmp = bld.vgrf(type, n);
|
||||
const fs_reg tmp = bld.vgrf(type);
|
||||
const brw::fs_builder hbld = bld.exec_all().group(16, 0);
|
||||
const unsigned m = bld.dispatch_width() / hbld.dispatch_width();
|
||||
fs_reg *const components = new fs_reg[n * m];
|
||||
fs_reg *const components = new fs_reg[m];
|
||||
|
||||
for (unsigned c = 0; c < n; c++) {
|
||||
for (unsigned g = 0; g < m; g++) {
|
||||
components[c * m + g] =
|
||||
offset(retype(brw_vec8_grf(regs[g], 0), type), hbld, c);
|
||||
}
|
||||
}
|
||||
for (unsigned g = 0; g < m; g++)
|
||||
components[g] = retype(brw_vec8_grf(regs[g], 0), type);
|
||||
|
||||
hbld.LOAD_PAYLOAD(tmp, components, n * m, 0);
|
||||
hbld.LOAD_PAYLOAD(tmp, components, m, 0);
|
||||
|
||||
delete[] components;
|
||||
return tmp;
|
||||
@@ -567,6 +563,28 @@ namespace brw {
|
||||
}
|
||||
}
|
||||
|
||||
inline fs_reg
|
||||
fetch_barycentric_reg(const brw::fs_builder &bld, uint8_t regs[2])
|
||||
{
|
||||
if (!regs[0])
|
||||
return fs_reg();
|
||||
|
||||
const fs_reg tmp = bld.vgrf(BRW_REGISTER_TYPE_F, 2);
|
||||
const brw::fs_builder hbld = bld.exec_all().group(16, 0);
|
||||
const unsigned m = bld.dispatch_width() / hbld.dispatch_width();
|
||||
fs_reg *const components = new fs_reg[2 * m];
|
||||
|
||||
for (unsigned c = 0; c < 2; c++) {
|
||||
for (unsigned g = 0; g < m; g++)
|
||||
components[c * m + g] = offset(brw_vec8_grf(regs[g], 0), hbld, c);
|
||||
}
|
||||
|
||||
hbld.LOAD_PAYLOAD(tmp, components, 2 * m, 0);
|
||||
|
||||
delete[] components;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
bool
|
||||
lower_src_modifiers(fs_visitor *v, bblock_t *block, fs_inst *inst, unsigned i);
|
||||
}
|
||||
|
@@ -328,8 +328,8 @@ fs_visitor::emit_interpolation_setup_gen6()
|
||||
struct brw_wm_prog_data *wm_prog_data = brw_wm_prog_data(prog_data);
|
||||
|
||||
for (int i = 0; i < BRW_BARYCENTRIC_MODE_COUNT; ++i) {
|
||||
this->delta_xy[i] = fetch_payload_reg(
|
||||
bld, payload.barycentric_coord_reg[i], BRW_REGISTER_TYPE_F, 2);
|
||||
this->delta_xy[i] = fetch_barycentric_reg(
|
||||
bld, payload.barycentric_coord_reg[i]);
|
||||
}
|
||||
|
||||
uint32_t centroid_modes = wm_prog_data->barycentric_interp_modes &
|
||||
|
Reference in New Issue
Block a user