|
@@ -73,6 +73,24 @@ free_gem:
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Macro to add commands to auxiliary batch.
|
|
|
|
+ * This macro only checks for page overflow before inserting the commands,
|
|
|
|
+ * this is sufficient as the null state generator makes the final batch
|
|
|
|
+ * with two passes to build command and state separately. At this point
|
|
|
|
+ * the size of both are known and it compacts them by relocating the state
|
|
|
|
+ * right after the commands taking care of aligment so we should sufficient
|
|
|
|
+ * space below them for adding new commands.
|
|
|
|
+ */
|
|
|
|
+#define OUT_BATCH(batch, i, val) \
|
|
|
|
+ do { \
|
|
|
|
+ if (WARN_ON((i) >= PAGE_SIZE / sizeof(u32))) { \
|
|
|
|
+ ret = -ENOSPC; \
|
|
|
|
+ goto err_out; \
|
|
|
|
+ } \
|
|
|
|
+ (batch)[(i)++] = (val); \
|
|
|
|
+ } while(0)
|
|
|
|
+
|
|
static int render_state_setup(struct render_state *so)
|
|
static int render_state_setup(struct render_state *so)
|
|
{
|
|
{
|
|
const struct intel_renderstate_rodata *rodata = so->rodata;
|
|
const struct intel_renderstate_rodata *rodata = so->rodata;
|
|
@@ -110,6 +128,21 @@ static int render_state_setup(struct render_state *so)
|
|
|
|
|
|
d[i++] = s;
|
|
d[i++] = s;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ while (i % CACHELINE_DWORDS)
|
|
|
|
+ OUT_BATCH(d, i, MI_NOOP);
|
|
|
|
+
|
|
|
|
+ so->aux_batch_offset = i * sizeof(u32);
|
|
|
|
+
|
|
|
|
+ OUT_BATCH(d, i, MI_BATCH_BUFFER_END);
|
|
|
|
+ so->aux_batch_size = (i * sizeof(u32)) - so->aux_batch_offset;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Since we are sending length, we need to strictly conform to
|
|
|
|
+ * all requirements. For Gen2 this must be a multiple of 8.
|
|
|
|
+ */
|
|
|
|
+ so->aux_batch_size = ALIGN(so->aux_batch_size, 8);
|
|
|
|
+
|
|
kunmap(page);
|
|
kunmap(page);
|
|
|
|
|
|
ret = i915_gem_object_set_to_gtt_domain(so->obj, false);
|
|
ret = i915_gem_object_set_to_gtt_domain(so->obj, false);
|
|
@@ -128,6 +161,8 @@ err_out:
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#undef OUT_BATCH
|
|
|
|
+
|
|
void i915_gem_render_state_fini(struct render_state *so)
|
|
void i915_gem_render_state_fini(struct render_state *so)
|
|
{
|
|
{
|
|
i915_gem_object_ggtt_unpin(so->obj);
|
|
i915_gem_object_ggtt_unpin(so->obj);
|
|
@@ -176,6 +211,16 @@ int i915_gem_render_state_init(struct drm_i915_gem_request *req)
|
|
if (ret)
|
|
if (ret)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
|
|
+ if (so.aux_batch_size > 8) {
|
|
|
|
+ ret = req->ring->dispatch_execbuffer(req,
|
|
|
|
+ (so.ggtt_offset +
|
|
|
|
+ so.aux_batch_offset),
|
|
|
|
+ so.aux_batch_size,
|
|
|
|
+ I915_DISPATCH_SECURE);
|
|
|
|
+ if (ret)
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+
|
|
i915_vma_move_to_active(i915_gem_obj_to_ggtt(so.obj), req);
|
|
i915_vma_move_to_active(i915_gem_obj_to_ggtt(so.obj), req);
|
|
|
|
|
|
out:
|
|
out:
|