diff options
author | Kenneth Graunke <[email protected]> | 2015-02-26 23:51:27 -0800 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2015-03-11 18:23:21 +0000 |
commit | 0d625e1ae7a112fee1e5068b7817e07ee1a253e1 (patch) | |
tree | a1f267ad52c56ba22251e0a58e3de1d30a0f0eff /src/mesa/drivers | |
parent | e9e182658dbb329e6a8e5b54794d173a878c9151 (diff) |
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 <[email protected]>
Reviewed-by: Matt Turner <[email protected]>
Cc: [email protected]
(cherry picked from commit e43af8d09f919d02b5ac0810c1c0f1783cbef6ef)
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.cpp | 19 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.h | 2 |
2 files changed, 16 insertions, 5 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 347bdb9852e..a2bfaf225bb 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -678,8 +678,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); @@ -690,7 +696,7 @@ fs_visitor::get_timestamp() fs_reg dst = fs_reg(GRF, virtual_grf_alloc(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. */ @@ -708,6 +714,7 @@ fs_visitor::get_timestamp() */ dst.set_smear(0); + *out_mov = mov; return dst; } @@ -715,7 +722,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 @@ -751,7 +760,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). diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index fcc8a5aca2a..bf8bb0b7343 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -622,7 +622,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); |