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;
}
}
+ 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);
}
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 &