| From 40a24488f5250d63341e74b9994159afc4589606 Mon Sep 17 00:00:00 2001 |
| From: Chris Wilson <chris@chris-wilson.co.uk> |
| Date: Fri, 21 Aug 2015 16:08:41 +0100 |
| Subject: drm/i915: Flush pipecontrol post-sync writes |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Chris Wilson <chris@chris-wilson.co.uk> |
| |
| commit 40a24488f5250d63341e74b9994159afc4589606 upstream. |
| |
| In order to flush the results from in-batch pipecontrol writes (used for |
| example in glQuery) before declaring the batch complete (and so declaring |
| the query results coherent), we need to set the FlushEnable bit in our |
| flushing pipecontrol. The FlushEnable bit "waits until all previous |
| writes of immediate data from post-sync circles are complete before |
| executing the next command". |
| |
| I get GPU hangs on byt without flushing these writes (running ue4). |
| piglit has examples where the flush is required for correct rendering. |
| |
| Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> |
| Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> |
| Acked-by: Daniel Vetter <daniel@ffwll.ch> |
| Signed-off-by: Jani Nikula <jani.nikula@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/i915/intel_lrc.c | 1 + |
| drivers/gpu/drm/i915/intel_ringbuffer.c | 2 ++ |
| 2 files changed, 3 insertions(+) |
| |
| --- a/drivers/gpu/drm/i915/intel_lrc.c |
| +++ b/drivers/gpu/drm/i915/intel_lrc.c |
| @@ -1298,6 +1298,7 @@ static int gen8_emit_flush_render(struct |
| if (flush_domains) { |
| flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH; |
| flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH; |
| + flags |= PIPE_CONTROL_FLUSH_ENABLE; |
| } |
| |
| if (invalidate_domains) { |
| --- a/drivers/gpu/drm/i915/intel_ringbuffer.c |
| +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c |
| @@ -342,6 +342,7 @@ gen7_render_ring_flush(struct intel_engi |
| if (flush_domains) { |
| flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH; |
| flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH; |
| + flags |= PIPE_CONTROL_FLUSH_ENABLE; |
| } |
| if (invalidate_domains) { |
| flags |= PIPE_CONTROL_TLB_INVALIDATE; |
| @@ -412,6 +413,7 @@ gen8_render_ring_flush(struct intel_engi |
| if (flush_domains) { |
| flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH; |
| flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH; |
| + flags |= PIPE_CONTROL_FLUSH_ENABLE; |
| } |
| if (invalidate_domains) { |
| flags |= PIPE_CONTROL_TLB_INVALIDATE; |