@@ -1517,6 +1517,9 @@ i915_gem_object_move_to_active(struct drm_gem_object *obj, uint32_t seqno)
drm_gem_object_reference(obj);
obj_priv->active = 1;
}
+ /* Take the seqno of the next request if none is given */
+ if (seqno == 0)
+ seqno = dev_priv->mm.next_gem_seqno;
/* Move from whatever list we were on to the tail of execution. */
spin_lock(&dev_priv->mm.active_list_lock);
list_move_tail(&obj_priv->list,
@@ -1992,6 +1995,7 @@ static int
i915_gem_object_wait_rendering(struct drm_gem_object *obj)
{
struct drm_device *dev = obj->dev;
+ drm_i915_private_t *dev_priv = dev->dev_private;
struct drm_i915_gem_object *obj_priv = obj->driver_private;
int ret;
@@ -2004,6 +2008,8 @@ i915_gem_object_wait_rendering(struct drm_gem_object *obj)
* it.
*/
if (obj_priv->active) {
+ BUG_ON(obj_priv->last_rendering_seqno
+ == dev_priv->mm.next_gem_seqno);
#if WATCH_BUF
DRM_INFO("%s: object %p wait for seqno %08x\n",
__func__, obj, obj_priv->last_rendering_seqno);
@@ -2895,17 +2901,10 @@ i915_gem_object_set_to_display_plane(struct drm_gem_object *obj)
return -EINVAL;
i915_gem_object_flush_gpu_write_domain(obj);
-
/* Wait on any GPU rendering and flushing to occur. */
- if (obj_priv->active) {
-#if WATCH_BUF
- DRM_INFO("%s: object %p wait for seqno %08x\n",
- __func__, obj, obj_priv->last_rendering_seqno);
-#endif
- ret = i915_do_wait_request(dev, obj_priv->last_rendering_seqno, 0);
- if (ret != 0)
- return ret;
- }
+ ret = i915_gem_object_wait_rendering(obj);
+ if (ret != 0)
+ return ret;
old_write_domain = obj->write_domain;
old_read_domains = obj->read_domains;