Re: [Intel-gfx] [RFC 05/39] drm/i915: Split i915_dem_do_execbuffer() in half

2015-07-21 Thread Daniel Vetter
On Fri, Jul 17, 2015 at 03:33:14PM +0100, john.c.harri...@intel.com wrote:
 From: John Harrison john.c.harri...@intel.com
 
 Split the execbuffer() function in half. The first half collects and validates
 all the information requried to process the batch buffer. It also does all the
 object pinning, relocations, active list management, etc - basically anything
 that must be done upfront before the IOCTL returns and allows the user land 
 side
 to start changing/freeing things. The second half does the actual ring
 submission.
 
 This change implements the split but leaves the back half being called 
 directly
 from the end of the front half.
 
 Change-Id: I5e1c77639ce526ab2401b0323186c518bf13da0a
 For: VIZ-1587
 Signed-off-by: John Harrison john.c.harri...@intel.com
 ---
  drivers/gpu/drm/i915/i915_drv.h|  11 +++
  drivers/gpu/drm/i915/i915_gem.c|   2 +
  drivers/gpu/drm/i915/i915_gem_execbuffer.c | 130 
 -
  drivers/gpu/drm/i915/intel_lrc.c   |  58 +
  drivers/gpu/drm/i915/intel_lrc.h   |   1 +
  5 files changed, 147 insertions(+), 55 deletions(-)
 
 diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
 index 289ddd6..28d51ac 100644
 --- a/drivers/gpu/drm/i915/i915_drv.h
 +++ b/drivers/gpu/drm/i915/i915_drv.h
 @@ -1684,10 +1684,18 @@ struct i915_execbuffer_params {
   struct drm_device   *dev;
   struct drm_file *file;
   uint32_tdispatch_flags;
 + uint32_targs_flags;
   uint32_targs_batch_start_offset;
 + uint32_targs_batch_len;
 + uint32_targs_num_cliprects;
 + uint32_targs_DR1;
 + uint32_targs_DR4;
   uint32_tbatch_obj_vm_offset;
   struct intel_engine_cs  *ring;
   struct drm_i915_gem_object  *batch_obj;
 + struct drm_clip_rect*cliprects;
 + uint32_tinstp_mask;
 + int instp_mode;
   struct intel_context*ctx;
   struct drm_i915_gem_request *request;
  };
 @@ -1929,6 +1937,7 @@ struct drm_i915_private {
   int (*execbuf_submit)(struct i915_execbuffer_params *params,
 struct drm_i915_gem_execbuffer2 *args,
 struct list_head *vmas);
 + int (*execbuf_final)(struct i915_execbuffer_params *params);

No need for this vfunc since you only call this from specialized and not
generic code.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [RFC 05/39] drm/i915: Split i915_dem_do_execbuffer() in half

2015-07-17 Thread John . C . Harrison
From: John Harrison john.c.harri...@intel.com

Split the execbuffer() function in half. The first half collects and validates
all the information requried to process the batch buffer. It also does all the
object pinning, relocations, active list management, etc - basically anything
that must be done upfront before the IOCTL returns and allows the user land side
to start changing/freeing things. The second half does the actual ring
submission.

This change implements the split but leaves the back half being called directly
from the end of the front half.

Change-Id: I5e1c77639ce526ab2401b0323186c518bf13da0a
For: VIZ-1587
Signed-off-by: John Harrison john.c.harri...@intel.com
---
 drivers/gpu/drm/i915/i915_drv.h|  11 +++
 drivers/gpu/drm/i915/i915_gem.c|   2 +
 drivers/gpu/drm/i915/i915_gem_execbuffer.c | 130 -
 drivers/gpu/drm/i915/intel_lrc.c   |  58 +
 drivers/gpu/drm/i915/intel_lrc.h   |   1 +
 5 files changed, 147 insertions(+), 55 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 289ddd6..28d51ac 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1684,10 +1684,18 @@ struct i915_execbuffer_params {
struct drm_device   *dev;
struct drm_file *file;
uint32_tdispatch_flags;
+   uint32_targs_flags;
uint32_targs_batch_start_offset;
+   uint32_targs_batch_len;
+   uint32_targs_num_cliprects;
+   uint32_targs_DR1;
+   uint32_targs_DR4;
uint32_tbatch_obj_vm_offset;
struct intel_engine_cs  *ring;
struct drm_i915_gem_object  *batch_obj;
+   struct drm_clip_rect*cliprects;
+   uint32_tinstp_mask;
+   int instp_mode;
struct intel_context*ctx;
struct drm_i915_gem_request *request;
 };
@@ -1929,6 +1937,7 @@ struct drm_i915_private {
int (*execbuf_submit)(struct i915_execbuffer_params *params,
  struct drm_i915_gem_execbuffer2 *args,
  struct list_head *vmas);
+   int (*execbuf_final)(struct i915_execbuffer_params *params);
int (*init_rings)(struct drm_device *dev);
void (*cleanup_ring)(struct intel_engine_cs *ring);
void (*stop_ring)(struct intel_engine_cs *ring);
@@ -2743,9 +2752,11 @@ int i915_gem_sw_finish_ioctl(struct drm_device *dev, 
void *data,
 void i915_gem_execbuffer_move_to_active(struct list_head *vmas,
struct drm_i915_gem_request *req);
 void i915_gem_execbuffer_retire_commands(struct i915_execbuffer_params 
*params);
+void i915_gem_execbuff_release_batch_obj(struct drm_i915_gem_object 
*batch_obj);
 int i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
   struct drm_i915_gem_execbuffer2 *args,
   struct list_head *vmas);
+int i915_gem_ringbuffer_submission_final(struct i915_execbuffer_params 
*params);
 int i915_gem_execbuffer(struct drm_device *dev, void *data,
struct drm_file *file_priv);
 int i915_gem_execbuffer2(struct drm_device *dev, void *data,
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 8150820..2a5667b 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -5481,11 +5481,13 @@ int i915_gem_init(struct drm_device *dev)
 
if (!i915.enable_execlists) {
dev_priv-gt.execbuf_submit = i915_gem_ringbuffer_submission;
+   dev_priv-gt.execbuf_final = 
i915_gem_ringbuffer_submission_final;
dev_priv-gt.init_rings = i915_gem_init_rings;
dev_priv-gt.cleanup_ring = intel_cleanup_ring_buffer;
dev_priv-gt.stop_ring = intel_stop_ring_buffer;
} else {
dev_priv-gt.execbuf_submit = intel_execlists_submission;
+   dev_priv-gt.execbuf_final = intel_execlists_submission_final;
dev_priv-gt.init_rings = intel_logical_rings_init;
dev_priv-gt.cleanup_ring = intel_logical_ring_cleanup;
dev_priv-gt.stop_ring = intel_logical_ring_stop;
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 988ecd4..ba9d595 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -1198,14 +1198,10 @@ i915_gem_ringbuffer_submission(struct 
i915_execbuffer_params *params,
   struct drm_i915_gem_execbuffer2 *args,