From 15a0761cad862a5d73bbc2af81bc5267e66c307e Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 29 Jun 2012 12:22:55 +0100 Subject: [PATCH] sna: Only consider the request list when deciding whether the GPU is busy Micro-optimisation to overhead extra checks and to make sure an unflushed bo doesn't prevent us from submitting more work before sleeping. Signed-off-by: Chris Wilson --- src/sna/kgem.h | 10 ++++++++++ src/sna/sna_accel.c | 5 ++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/sna/kgem.h b/src/sna/kgem.h index 2d8def81..f9b2a33a 100644 --- a/src/sna/kgem.h +++ b/src/sna/kgem.h @@ -253,6 +253,16 @@ void kgem_bo_set_binding(struct kgem_bo *bo, uint32_t format, uint16_t offset); void kgem_bo_retire(struct kgem *kgem, struct kgem_bo *bo); bool kgem_retire(struct kgem *kgem); +static inline bool kgem_is_idle(struct kgem *kgem) +{ + if (list_is_empty(&kgem->requests)) + return true; + + if (!kgem_retire(kgem)) + return false; + + return list_is_empty(&kgem->requests); +} struct kgem_bo *kgem_get_last_request(struct kgem *kgem); void _kgem_submit(struct kgem *kgem); diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index b9164aea..d280f84c 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -12807,7 +12807,10 @@ void sna_accel_close(struct sna *sna) void sna_accel_block_handler(struct sna *sna, struct timeval **tv) { - sna_accel_wakeup_handler(sna, NULL); + if (sna->kgem.nbatch && kgem_is_idle(&sna->kgem)) { + DBG(("%s: GPU idle, flushing\n", __FUNCTION__)); + _kgem_submit(&sna->kgem); + } if (sna_accel_do_flush(sna)) sna_accel_flush(sna);