summaryrefslogtreecommitdiff
path: root/src/intel_batchbuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/intel_batchbuffer.c')
-rw-r--r--src/intel_batchbuffer.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/intel_batchbuffer.c b/src/intel_batchbuffer.c
index f310793..90fdd0f 100644
--- a/src/intel_batchbuffer.c
+++ b/src/intel_batchbuffer.c
@@ -163,8 +163,21 @@ intel_batchbuffer_emit_mi_flush(struct intel_batchbuffer *batch)
if (IS_GEN6(intel->device_id) ||
IS_GEN7(intel->device_id)) {
- if (batch->flag == I915_EXEC_RENDER) {
- BEGIN_BATCH(batch, 4);
+ if (batch->flag == I915_EXEC_RENDER) { BEGIN_BATCH(batch, 3*4);
+ /* work-around flushes */
+ OUT_BATCH(batch, CMD_PIPE_CONTROL | (4 - 2));
+ OUT_BATCH(batch, CMD_PIPE_CONTROL_CS_STALL |
+ CMD_PIPE_CONTROL_STALL_AT_SCOREBOARD);
+ OUT_BATCH(batch, 0); /* address */
+ OUT_BATCH(batch, 0); /* write data */
+
+ OUT_BATCH(batch, CMD_PIPE_CONTROL | (4 - 2));
+ OUT_BATCH(batch, CMD_PIPE_CONTROL_WRITE_QWORD);
+ OUT_RELOC(batch, intel->wa_scratch_bo, I915_GEM_DOMAIN_INSTRUCTION,
+ I915_GEM_DOMAIN_INSTRUCTION, 0);
+ OUT_BATCH(batch, 0); /* write data */
+
+ /* and now the actual flush */
OUT_BATCH(batch, CMD_PIPE_CONTROL | 0x2);
if (IS_GEN6(intel->device_id))