static struct list_head flip_wait_list;
static struct notifier_block dss_nb;
-static inline bool is_render_complete(const struct PVRSRV_SYNC_DATA *sync)
+static inline bool is_render_complete(const struct PVRSRV_SYNC_DATA *sync,
+ u32 write_ops_pending)
{
- return sync->ui32ReadOpsComplete == sync->ui32ReadOpsPending &&
- sync->ui32WriteOpsComplete == sync->ui32WriteOpsPending;
+ return (int)sync->ui32WriteOpsComplete - (int)write_ops_pending >= 0;
}
static void pvr_signal_sync_event(struct pvr_pending_sync_event *e,
e->base.event = &e->event.base;
e->base.file_priv = priv;
e->base.destroy = (void (*)(struct pvr_pending_event *))kfree;
+ e->base.write_ops_pending = sync_info->psSyncData->ui32WriteOpsPending;
do_gettimeofday(&now);
spin_lock_irqsave(&event_lock, flags);
priv->event_space -= sizeof(e->event);
list_add_tail(&e->base.link, &sync_wait_list);
- if (is_render_complete(sync_info->psSyncData))
+ if (is_render_complete(sync_info->psSyncData,
+ e->base.write_ops_pending))
pvr_signal_sync_event(e, &now);
spin_unlock_irqrestore(&event_lock, flags);
spin_lock_irqsave(&event_lock, flags);
list_for_each_entry_safe(e, t, &sync_wait_list, base.link) {
- if (!is_render_complete(e->event.sync_info->psSyncData))
+ if (!is_render_complete(e->event.sync_info->psSyncData,
+ e->base.write_ops_pending))
continue;
pvr_signal_sync_event(e, &now);