diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2011-10-17 13:32:40 +0200 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2011-10-17 14:24:32 +0200 |
commit | 6e7275eb7b584e2669d3fa908e3b774f8450630c (patch) | |
tree | a1d7a24c1731f903dd4484831ec0877649f50e2e | |
parent | 6849854a952d39e44ef3c4807931ab93ed73f536 (diff) |
intel: apply pipe_control work-around for gen6+
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | src/intel_batchbuffer.c | 17 | ||||
-rw-r--r-- | src/intel_driver.c | 5 | ||||
-rw-r--r-- | src/intel_driver.h | 1 |
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) |