Commit cf5d8a46 authored by Chris Wilson's avatar Chris Wilson Committed by Daniel Vetter

drm/i915: Fix the flip synchronisation to consider mmioflips

Currently we emit semaphore synchronisation as if we were going to flip
using the target CS engine, but we then change our minds and do the flip
using the CPU. Consequently we write instructions to the ring but never
use them - even to the point of filling that ring up entirely and never
submitting a request.

The wrinkle in the ointment is that we have to tell a white lie to
pin-to-display for it to skip the synchronisation for mmioflips as we
will create a task specifically for that slow synchronisation. An oddity
of note is the discrepancy in requests that we tell to pin-display to
serialise to and that we then eventually wait upon. This is due to a
limitation in the i915_gem_object_sync() routine that will be lifted
later.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent ee286370
...@@ -10210,6 +10210,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, ...@@ -10210,6 +10210,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
enum pipe pipe = intel_crtc->pipe; enum pipe pipe = intel_crtc->pipe;
struct intel_unpin_work *work; struct intel_unpin_work *work;
struct intel_engine_cs *ring; struct intel_engine_cs *ring;
bool mmio_flip;
int ret; int ret;
/* /*
...@@ -10307,15 +10308,23 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, ...@@ -10307,15 +10308,23 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
ring = &dev_priv->ring[RCS]; ring = &dev_priv->ring[RCS];
} }
mmio_flip = use_mmio_flip(ring, obj);
/* When using CS flips, we want to emit semaphores between rings.
* However, when using mmio flips we will create a task to do the
* synchronisation, so all we want here is to pin the framebuffer
* into the display plane and skip any waits.
*/
ret = intel_pin_and_fence_fb_obj(crtc->primary, fb, ret = intel_pin_and_fence_fb_obj(crtc->primary, fb,
crtc->primary->state, ring); crtc->primary->state,
mmio_flip ? i915_gem_request_get_ring(obj->last_read_req) : ring);
if (ret) if (ret)
goto cleanup_pending; goto cleanup_pending;
work->gtt_offset = intel_plane_obj_offset(to_intel_plane(primary), obj) work->gtt_offset = intel_plane_obj_offset(to_intel_plane(primary), obj)
+ intel_crtc->dspaddr_offset; + intel_crtc->dspaddr_offset;
if (use_mmio_flip(ring, obj)) { if (mmio_flip) {
ret = intel_queue_mmio_flip(dev, crtc, fb, obj, ring, ret = intel_queue_mmio_flip(dev, crtc, fb, obj, ring,
page_flip_flags); page_flip_flags);
if (ret) if (ret)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment