i965/fs: Make get_timestamp() pass back the MOV rather than emitting it.
This makes another part of the INTEL_DEBUG=shader_time code emittable at arbitrary locations, rather than just at the end of the instruction stream. v2: Don't lose smear! Caught by Topi Pohjolainen. v3: Don't set smear on the destination of the MOV. Thanks Topi! Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Matt Turner <mattst88@gmail.com> Cc: mesa-stable@lists.freedesktop.org
This commit is contained in:
parent
bea854c7f3
commit
e43af8d09f
|
@ -677,8 +677,14 @@ fs_visitor::type_size(const struct glsl_type *type)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a MOV to read the timestamp register.
|
||||
*
|
||||
* The caller is responsible for emitting the MOV. The return value is
|
||||
* the destination of the MOV, with extra parameters set.
|
||||
*/
|
||||
fs_reg
|
||||
fs_visitor::get_timestamp()
|
||||
fs_visitor::get_timestamp(fs_inst **out_mov)
|
||||
{
|
||||
assert(brw->gen >= 7);
|
||||
|
||||
|
@ -689,7 +695,7 @@ fs_visitor::get_timestamp()
|
|||
|
||||
fs_reg dst = fs_reg(GRF, alloc.allocate(1), BRW_REGISTER_TYPE_UD, 4);
|
||||
|
||||
fs_inst *mov = emit(MOV(dst, ts));
|
||||
fs_inst *mov = MOV(dst, ts);
|
||||
/* We want to read the 3 fields we care about even if it's not enabled in
|
||||
* the dispatch.
|
||||
*/
|
||||
|
@ -707,6 +713,7 @@ fs_visitor::get_timestamp()
|
|||
*/
|
||||
dst.set_smear(0);
|
||||
|
||||
*out_mov = mov;
|
||||
return dst;
|
||||
}
|
||||
|
||||
|
@ -714,7 +721,9 @@ void
|
|||
fs_visitor::emit_shader_time_begin()
|
||||
{
|
||||
current_annotation = "shader time start";
|
||||
shader_start_time = get_timestamp();
|
||||
fs_inst *mov;
|
||||
shader_start_time = get_timestamp(&mov);
|
||||
emit(mov);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -750,7 +759,9 @@ fs_visitor::emit_shader_time_end()
|
|||
unreachable("fs_visitor::emit_shader_time_end missing code");
|
||||
}
|
||||
|
||||
fs_reg shader_end_time = get_timestamp();
|
||||
fs_inst *tm_read;
|
||||
fs_reg shader_end_time = get_timestamp(&tm_read);
|
||||
emit(tm_read);
|
||||
|
||||
/* Check that there weren't any timestamp reset events (assuming these
|
||||
* were the only two timestamp reads that happened).
|
||||
|
|
|
@ -402,7 +402,7 @@ public:
|
|||
void resolve_ud_negate(fs_reg *reg);
|
||||
void resolve_bool_comparison(ir_rvalue *rvalue, fs_reg *reg);
|
||||
|
||||
fs_reg get_timestamp();
|
||||
fs_reg get_timestamp(fs_inst **out_mov);
|
||||
|
||||
struct brw_reg interp_reg(int location, int channel);
|
||||
void setup_uniform_values(ir_variable *ir);
|
||||
|
|
Loading…
Reference in New Issue