summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2011-10-17 13:32:40 +0200
committerDaniel Vetter <daniel.vetter@ffwll.ch>2011-10-17 14:24:32 +0200
commit6e7275eb7b584e2669d3fa908e3b774f8450630c (patch)
treea1d7a24c1731f903dd4484831ec0877649f50e2e
parent6849854a952d39e44ef3c4807931ab93ed73f536 (diff)
intel: apply pipe_control work-around for gen6+
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--src/intel_batchbuffer.c17
-rw-r--r--src/intel_driver.c5
-rw-r--r--src/intel_driver.h1
3 files changed, 21 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))
diff --git a/src/intel_driver.c b/src/intel_driver.c
index 2b155ca..6bbcbf5 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -74,6 +74,10 @@ intel_driver_init(VADriverContextP ctx)
assert(intel->bufmgr);
intel_bufmgr_gem_enable_reuse(intel->bufmgr);
+ intel->wa_scratch_bo = drm_intel_bo_alloc(intel->bufmgr, "wa scratch",
+ 4096, 4096);
+ assert(intel->wa_scratch_bo);
+
return True;
}
@@ -82,6 +86,7 @@ intel_driver_terminate(VADriverContextP ctx)
{
struct intel_driver_data *intel = intel_driver_data(ctx);
+ drm_intel_bo_unreference(intel->wa_scratch_bo);
drm_intel_bufmgr_destroy(intel->bufmgr);
pthread_mutex_destroy(&intel->ctxmutex);
diff --git a/src/intel_driver.h b/src/intel_driver.h
index de4c01f..cffbad6 100644
--- a/src/intel_driver.h
+++ b/src/intel_driver.h
@@ -54,6 +54,7 @@
#define CMD_PIPE_CONTROL_DC_FLUSH (1 << 5)
#define CMD_PIPE_CONTROL_GLOBAL_GTT (1 << 2)
#define CMD_PIPE_CONTROL_LOCAL_PGTT (0 << 2)
+#define CMD_PIPE_CONTROL_STALL_AT_SCOREBOARD (1 << 1)
#define CMD_PIPE_CONTROL_DEPTH_CACHE_FLUSH (1 << 0)