drm/i915: Record space required for breadcrumb emission
In the next patch, we will use deferred breadcrumb emission. That requires reserving sufficient space in the ringbuffer to emit the breadcrumb, which first requires us to know how large the breadcrumb is. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20161028125858.23563-28-chris@chris-wilson.co.uk
This commit is contained in:
@@ -1348,6 +1348,8 @@ static int i9xx_emit_breadcrumb(struct drm_i915_gem_request *req)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const int i9xx_emit_breadcrumb_sz = 4;
|
||||
|
||||
/**
|
||||
* gen6_sema_emit_breadcrumb - Update the semaphore mailbox registers
|
||||
*
|
||||
@@ -1401,6 +1403,8 @@ static int gen8_render_emit_breadcrumb(struct drm_i915_gem_request *req)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const int gen8_render_emit_breadcrumb_sz = 8;
|
||||
|
||||
/**
|
||||
* intel_ring_sync - sync the waiter to the signaller on seqno
|
||||
*
|
||||
@@ -2638,8 +2642,21 @@ static void intel_ring_default_vfuncs(struct drm_i915_private *dev_priv,
|
||||
engine->reset_hw = reset_ring_common;
|
||||
|
||||
engine->emit_breadcrumb = i9xx_emit_breadcrumb;
|
||||
if (i915.semaphores)
|
||||
engine->emit_breadcrumb_sz = i9xx_emit_breadcrumb_sz;
|
||||
if (i915.semaphores) {
|
||||
int num_rings;
|
||||
|
||||
engine->emit_breadcrumb = gen6_sema_emit_breadcrumb;
|
||||
|
||||
num_rings = hweight32(INTEL_INFO(dev_priv)->ring_mask) - 1;
|
||||
if (INTEL_GEN(dev_priv) >= 8) {
|
||||
engine->emit_breadcrumb_sz += num_rings * 6;
|
||||
} else {
|
||||
engine->emit_breadcrumb_sz += num_rings * 3;
|
||||
if (num_rings & 1)
|
||||
engine->emit_breadcrumb_sz++;
|
||||
}
|
||||
}
|
||||
engine->submit_request = i9xx_submit_request;
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 8)
|
||||
@@ -2667,9 +2684,17 @@ int intel_init_render_ring_buffer(struct intel_engine_cs *engine)
|
||||
if (INTEL_GEN(dev_priv) >= 8) {
|
||||
engine->init_context = intel_rcs_ctx_init;
|
||||
engine->emit_breadcrumb = gen8_render_emit_breadcrumb;
|
||||
engine->emit_breadcrumb_sz = gen8_render_emit_breadcrumb_sz;
|
||||
engine->emit_flush = gen8_render_ring_flush;
|
||||
if (i915.semaphores)
|
||||
if (i915.semaphores) {
|
||||
int num_rings;
|
||||
|
||||
engine->semaphore.signal = gen8_rcs_signal;
|
||||
|
||||
num_rings =
|
||||
hweight32(INTEL_INFO(dev_priv)->ring_mask) - 1;
|
||||
engine->emit_breadcrumb_sz += num_rings * 6;
|
||||
}
|
||||
} else if (INTEL_GEN(dev_priv) >= 6) {
|
||||
engine->init_context = intel_rcs_ctx_init;
|
||||
engine->emit_flush = gen7_render_ring_flush;
|
||||
|
Reference in New Issue
Block a user