We need to wrap all batch buffer access inside begin/end. In order to make that transformation for brw_performance_monitor.c requires a small amount of code motion, but otherwise straightforward.
To simply the number of places where we try and access the batch, we move the start/stop based on oa_users into the critical sections. Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> --- src/mesa/drivers/dri/i965/brw_context.c | 3 ++ .../drivers/dri/i965/brw_performance_monitor.c | 38 ++++++++++------------ 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index e8d43db..26041e6 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -1575,6 +1575,9 @@ void brw_batch_finish_hook(brw_batch *batch) */ brw_emit_query_end(brw); + /* We may also need to snapshot and disable OA counters. */ + brw_perf_monitor_finish_batch(brw); + brw->cache.bo_used_by_gpu = true; } diff --git a/src/mesa/drivers/dri/i965/brw_performance_monitor.c b/src/mesa/drivers/dri/i965/brw_performance_monitor.c index dfc003f..5545ac7 100644 --- a/src/mesa/drivers/dri/i965/brw_performance_monitor.c +++ b/src/mesa/drivers/dri/i965/brw_performance_monitor.c @@ -703,12 +703,6 @@ emit_mi_report_perf_count(struct brw_context *brw, { assert(offset_in_bytes % 64 == 0); - /* Make sure the commands to take a snapshot fits in a single batch. */ - intel_batchbuffer_require_space(&brw->batch, - MI_REPORT_PERF_COUNT_BATCH_DWORDS * 4, - RENDER_RING); - int batch_used = USED_BATCH(&brw->batch); - /* Reports apparently don't always get written unless we flush first. */ brw_emit_mi_flush(brw); @@ -749,9 +743,6 @@ emit_mi_report_perf_count(struct brw_context *brw, /* Reports apparently don't always get written unless we flush after. */ brw_emit_mi_flush(brw); - - (void) batch_used; - assert(USED_BATCH(&brw->batch) - batch_used <= MI_REPORT_PERF_COUNT_BATCH_DWORDS * 4); } /** @@ -1101,6 +1092,13 @@ brw_begin_perf_monitor(struct gl_context *ctx, DBG("Begin(%d)\n", m->Name); reinitialize_perf_monitor(brw, monitor); + + /* Ensure the OACONTROL enable and snapshot land in the same batch. */ + if (brw_batch_begin(&brw->batch, + (MI_REPORT_PERF_COUNT_BATCH_DWORDS + 3) * 4, + RENDER_RING) < 0) + return false; + if (monitor_needs_oa(brw, m)) { /* If the global OA bookend BO doesn't exist, allocate it. This should * only happen once, but we delay until BeginPerfMonitor time to avoid @@ -1126,12 +1124,8 @@ brw_begin_perf_monitor(struct gl_context *ctx, calloc(brw->perfmon.entries_per_oa_snapshot, sizeof(uint32_t)); /* If the OA counters aren't already on, enable them. */ - if (brw->perfmon.oa_users == 0) { - /* Ensure the OACONTROL enable and snapshot land in the same batch. */ - int space = (MI_REPORT_PERF_COUNT_BATCH_DWORDS + 3) * 4; - intel_batchbuffer_require_space(&brw->batch, space, RENDER_RING); + if (brw->perfmon.oa_users++ == 0) start_oa_counters(brw); - } /* Take a starting OA counter snapshot. */ emit_mi_report_perf_count(brw, monitor->oa_bo, 0, REPORT_ID); @@ -1142,8 +1136,6 @@ brw_begin_perf_monitor(struct gl_context *ctx, /* Add the monitor to the unresolved list. */ add_to_unresolved_monitor_list(brw, monitor); - - ++brw->perfmon.oa_users; } if (monitor_needs_statistics_registers(brw, m)) { @@ -1155,7 +1147,7 @@ brw_begin_perf_monitor(struct gl_context *ctx, snapshot_statistics_registers(brw, monitor, 0); } - return true; + return brw_batch_end(&brw->batch) == 0; } /** @@ -1170,14 +1162,16 @@ brw_end_perf_monitor(struct gl_context *ctx, DBG("End(%d)\n", m->Name); + if (brw_batch_begin(&brw->batch, 80, RENDER_RING) < 0) + return; + if (monitor_needs_oa(brw, m)) { + assert(brw->perfmon.oa_users > 0); + /* Take an ending OA counter snapshot. */ emit_mi_report_perf_count(brw, monitor->oa_bo, SECOND_SNAPSHOT_OFFSET_IN_BYTES, REPORT_ID); - - --brw->perfmon.oa_users; - - if (brw->perfmon.oa_users == 0) + if (--brw->perfmon.oa_users == 0) stop_oa_counters(brw); if (monitor->oa_head_end == brw->perfmon.bookend_snapshots) { @@ -1208,6 +1202,8 @@ brw_end_perf_monitor(struct gl_context *ctx, snapshot_statistics_registers(brw, monitor, SECOND_SNAPSHOT_OFFSET_IN_BYTES); } + + brw_batch_end(&brw->batch); } /** -- 2.5.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev