i965/gen4-5: Emit MI_FLUSH as required prior to switching pipelines.
authorFrancisco Jerez <currojerez@riseup.net>
Sun, 3 Jan 2016 03:05:48 +0000 (19:05 -0800)
committerFrancisco Jerez <currojerez@riseup.net>
Fri, 15 Jan 2016 03:26:23 +0000 (19:26 -0800)
AFAIK brw_emit_select_pipeline() is only called once during context
init on Gen4-5, at which point the pipeline is likely to be already
idle so it may just happen to work by luck regardless of the MI_FLUSH.

Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_misc_state.c

index 95edbc9edcd87c4b5da3bf9c6cba975fb296e683..8335865b2d3fef923d40d089b3f3bd11233706d5 100644 (file)
@@ -923,6 +923,19 @@ brw_emit_select_pipeline(struct brw_context *brw, enum brw_pipeline pipeline)
                                   PIPE_CONTROL_STATE_CACHE_INVALIDATE |
                                   PIPE_CONTROL_INSTRUCTION_INVALIDATE |
                                   PIPE_CONTROL_NO_WRITE);
+
+   } else {
+      /* From "BXML » GT » MI » vol1a GPU Overview » [Instruction]
+       * PIPELINE_SELECT [DevBWR+]":
+       *
+       *   Project: PRE-DEVSNB
+       *
+       *   Software must ensure the current pipeline is flushed via an
+       *   MI_FLUSH or PIPE_CONTROL prior to the execution of PIPELINE_SELECT.
+       */
+      BEGIN_BATCH(1);
+      OUT_BATCH(MI_FLUSH);
+      ADVANCE_BATCH();
    }
 
    /* Select the pipeline */