[Mesa-dev] [PATCH 10/10] i965/fs: Do not mark used surfaces in FS_OPCODE_FB_WRITE/FS_OPCODE_REP_FB_WRITE
Iago Toral Quiroga
itoral at igalia.com
Fri Oct 30 04:12:02 PDT 2015
Do it in the visitor, like we do for other opcodes.
---
src/mesa/drivers/dri/i965/brw_fs.cpp | 5 +++++
src/mesa/drivers/dri/i965/brw_fs.h | 3 ++-
src/mesa/drivers/dri/i965/brw_fs_generator.cpp | 2 --
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 24 +++++++++++++++---------
4 files changed, 22 insertions(+), 12 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 1cfae5c..1461917 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -2644,6 +2644,7 @@ void
fs_visitor::emit_repclear_shader()
{
brw_wm_prog_key *key = (brw_wm_prog_key*) this->key;
+ brw_wm_prog_data *prog_data = (brw_wm_prog_data *) this->prog_data;
int base_mrf = 1;
int color_mrf = base_mrf + 2;
@@ -2659,6 +2660,8 @@ fs_visitor::emit_repclear_shader()
write->target = 0;
write->header_size = 0;
write->mlen = 1;
+ brw_mark_surface_used(&prog_data->base,
+ prog_data->binding_table.render_target_start);
} else {
assume(key->nr_color_regions > 0);
for (int i = 0; i < key->nr_color_regions; ++i) {
@@ -2668,6 +2671,8 @@ fs_visitor::emit_repclear_shader()
write->target = i;
write->header_size = 2;
write->mlen = 3;
+ brw_mark_surface_used(&prog_data->base,
+ prog_data->binding_table.render_target_start + i);
}
}
write->eot = true;
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
index 8058b34..8572e39 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_fs.h
@@ -278,7 +278,8 @@ public:
void emit_alpha_test();
fs_inst *emit_single_fb_write(const brw::fs_builder &bld,
fs_reg color1, fs_reg color2,
- fs_reg src0_alpha, unsigned components);
+ fs_reg src0_alpha, unsigned components,
+ unsigned target);
void emit_fb_writes();
void emit_urb_writes();
void emit_cs_terminate();
diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
index aafac99..5f87b06 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
@@ -249,8 +249,6 @@ fs_generator::fire_fb_write(fs_inst *inst,
inst->eot,
last_render_target,
inst->header_size != 0);
-
- brw_mark_surface_used(&prog_data->base, surf_index);
}
void
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index 5c57944..a05788f 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -462,8 +462,13 @@ fs_visitor::emit_dummy_fs()
fs_reg(color[i]));
}
+ brw_wm_prog_data *wm_prog_data = (brw_wm_prog_data *) this->prog_data;
+
fs_inst *write;
write = bld.emit(FS_OPCODE_FB_WRITE);
+ brw_mark_surface_used(&wm_prog_data->base,
+ wm_prog_data->binding_table.render_target_start);
+
write->eot = true;
if (devinfo->gen >= 6) {
write->base_mrf = 2;
@@ -477,7 +482,6 @@ fs_visitor::emit_dummy_fs()
/* Tell the SF we don't have any inputs. Gen4-5 require at least one
* varying to avoid GPU hangs, so set that.
*/
- brw_wm_prog_data *wm_prog_data = (brw_wm_prog_data *) this->prog_data;
wm_prog_data->num_varying_inputs = devinfo->gen < 6 ? 1 : 0;
memset(wm_prog_data->urb_setup, -1,
sizeof(wm_prog_data->urb_setup[0]) * VARYING_SLOT_MAX);
@@ -688,7 +692,8 @@ fs_visitor::emit_alpha_test()
fs_inst *
fs_visitor::emit_single_fb_write(const fs_builder &bld,
fs_reg color0, fs_reg color1,
- fs_reg src0_alpha, unsigned components)
+ fs_reg src0_alpha, unsigned components,
+ unsigned target)
{
assert(stage == MESA_SHADER_FRAGMENT);
brw_wm_prog_data *prog_data = (brw_wm_prog_data*) this->prog_data;
@@ -722,6 +727,10 @@ fs_visitor::emit_single_fb_write(const fs_builder &bld,
write->flag_subreg = 1;
}
+ write->target = target;
+ brw_mark_surface_used(&prog_data->base,
+ prog_data->binding_table.render_target_start + target);
+
return write;
}
@@ -758,12 +767,11 @@ fs_visitor::emit_fb_writes()
const fs_builder abld = bld.annotate("FB dual-source write");
inst = emit_single_fb_write(abld, this->outputs[0],
- this->dual_src_output, reg_undef, 4);
- inst->target = 0;
+ this->dual_src_output, reg_undef, 4, 0);
prog_data->dual_src_blend = true;
} else {
- for (int target = 0; target < key->nr_color_regions; target++) {
+ for (unsigned target = 0; target < key->nr_color_regions; target++) {
/* Skip over outputs that weren't written. */
if (this->outputs[target].file == BAD_FILE)
continue;
@@ -777,8 +785,7 @@ fs_visitor::emit_fb_writes()
inst = emit_single_fb_write(abld, this->outputs[target], reg_undef,
src0_alpha,
- this->output_components[target]);
- inst->target = target;
+ this->output_components[target], target);
}
}
@@ -795,8 +802,7 @@ fs_visitor::emit_fb_writes()
const fs_reg tmp = bld.vgrf(BRW_REGISTER_TYPE_UD, 4);
bld.LOAD_PAYLOAD(tmp, srcs, 4, 0);
- inst = emit_single_fb_write(bld, tmp, reg_undef, reg_undef, 4);
- inst->target = 0;
+ inst = emit_single_fb_write(bld, tmp, reg_undef, reg_undef, 4, 0);
}
inst->eot = true;
--
1.9.1
More information about the mesa-dev
mailing list