|
@@ -970,6 +970,31 @@ i915_gem_execbuffer_retire_commands(struct drm_device *dev,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+i915_reset_gen7_sol_offsets(struct drm_device *dev,
|
|
|
+ struct intel_ring_buffer *ring)
|
|
|
+{
|
|
|
+ drm_i915_private_t *dev_priv = dev->dev_private;
|
|
|
+ int ret, i;
|
|
|
+
|
|
|
+ if (!IS_GEN7(dev) || ring != &dev_priv->ring[RCS])
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ ret = intel_ring_begin(ring, 4 * 3);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ for (i = 0; i < 4; i++) {
|
|
|
+ intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
|
|
|
+ intel_ring_emit(ring, GEN7_SO_WRITE_OFFSET(i));
|
|
|
+ intel_ring_emit(ring, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ intel_ring_advance(ring);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int
|
|
|
i915_gem_do_execbuffer(struct drm_device *dev, void *data,
|
|
|
struct drm_file *file,
|
|
@@ -1184,6 +1209,12 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
|
|
|
dev_priv->relative_constants_mode = mode;
|
|
|
}
|
|
|
|
|
|
+ if (args->flags & I915_EXEC_GEN7_SOL_RESET) {
|
|
|
+ ret = i915_reset_gen7_sol_offsets(dev, ring);
|
|
|
+ if (ret)
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+
|
|
|
trace_i915_gem_ring_dispatch(ring, seqno);
|
|
|
|
|
|
exec_start = batch_obj->gtt_offset + args->batch_start_offset;
|