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);