diff options
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index f25fd16ffe8..2cd3ffe7269 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -1130,6 +1130,27 @@ fs_visitor::compact_virtual_grfs() } } + /* In addition to registers used in instructions, fs_visitor keeps + * direct references to certain special values which must be patched: + */ + fs_reg *special[] = { + &frag_depth, &pixel_x, &pixel_y, &pixel_w, &wpos_w, &dual_src_output, + &outputs[0], &outputs[1], &outputs[2], &outputs[3], + &outputs[4], &outputs[5], &outputs[6], &outputs[7], + &delta_x[0], &delta_x[1], &delta_x[2], + &delta_x[3], &delta_x[4], &delta_x[5], + &delta_y[0], &delta_y[1], &delta_y[2], + &delta_y[3], &delta_y[4], &delta_y[5], + }; + STATIC_ASSERT(BRW_WM_BARYCENTRIC_INTERP_MODE_COUNT == 6); + STATIC_ASSERT(BRW_MAX_DRAW_BUFFERS == 8); + + /* Treat all special values as used, to be conservative */ + for (unsigned i = 0; i < ARRAY_SIZE(special); i++) { + if (special[i]->file == GRF) + remap_table[special[i]->reg] = 0; + } + /* Compact the GRF arrays. */ int new_index = 0; for (int i = 0; i < this->virtual_grf_count; i++) { @@ -1158,6 +1179,12 @@ fs_visitor::compact_virtual_grfs() inst->src[i].reg = remap_table[inst->src[i].reg]; } } + + /* Patch all the references to special values */ + for (unsigned i = 0; i < ARRAY_SIZE(special); i++) { + if (special[i]->file == GRF && remap_table[special[i]->reg] != -1) + special[i]->reg = remap_table[special[i]->reg]; + } } bool |