From: Junyan He <junyan...@intel.com>

Signed-off-by: Junyan He <junyan...@intel.com>
---
 src/gen/intel_batchbuffer.c | 104 ++++++++++++++++++++++++++++++--------------
 src/gen/intel_batchbuffer.h |  14 +++---
 2 files changed, 78 insertions(+), 40 deletions(-)

diff --git a/src/gen/intel_batchbuffer.c b/src/gen/intel_batchbuffer.c
index 292be83..8815163 100644
--- a/src/gen/intel_batchbuffer.c
+++ b/src/gen/intel_batchbuffer.c
@@ -54,6 +54,19 @@
 #include <assert.h>
 #include <errno.h>
 
+LOCAL intel_batchbuffer_t *
+intel_batchbuffer_new(intel_driver_t *intel)
+{
+  intel_batchbuffer_t *batch = NULL;
+  assert(intel);
+  batch = CL_CALLOC(1, sizeof(intel_batchbuffer_t));
+  if (batch == NULL)
+    return NULL;
+
+  intel_batchbuffer_init(batch, intel);
+  return batch;
+}
+
 LOCAL int
 intel_batchbuffer_reset(intel_batchbuffer_t *batch, size_t sz)
 {
@@ -73,7 +86,7 @@ intel_batchbuffer_reset(intel_batchbuffer_t *batch, size_t sz)
     batch->buffer = NULL;
     return -1;
   }
-  batch->map = (uint8_t*) batch->buffer->virtual;
+  batch->map = (uint8_t *)batch->buffer->virtual;
   batch->size = sz;
   batch->ptr = batch->map;
   batch->atomic = 0;
@@ -89,20 +102,6 @@ intel_batchbuffer_init(intel_batchbuffer_t *batch, 
intel_driver_t *intel)
   batch->intel = intel;
 }
 
-LOCAL void
-intel_batchbuffer_terminate(intel_batchbuffer_t *batch)
-{
-  assert(batch->buffer);
-
-  if (batch->map) {
-    dri_bo_unmap(batch->buffer);
-    batch->map = NULL;
-  }
-
-  dri_bo_unreference(batch->buffer);
-  batch->buffer = NULL;
-}
-
 LOCAL int
 intel_batchbuffer_flush(intel_batchbuffer_t *batch)
 {
@@ -114,11 +113,11 @@ intel_batchbuffer_flush(intel_batchbuffer_t *batch)
     return 0;
 
   if ((used & 4) == 0) {
-    *(uint32_t*) batch->ptr = 0;
+    *(uint32_t *)batch->ptr = 0;
     batch->ptr += 4;
   }
 
-  *(uint32_t*)batch->ptr = MI_BATCH_BUFFER_END;
+  *(uint32_t *)batch->ptr = MI_BATCH_BUFFER_END;
   batch->ptr += 4;
   used = batch->ptr - batch->map;
   dri_bo_unmap(batch->buffer);
@@ -128,10 +127,10 @@ intel_batchbuffer_flush(intel_batchbuffer_t *batch)
     intel_driver_lock_hardware(batch->intel);
 
   int flag = I915_EXEC_RENDER;
-  if(batch->enable_slm) {
+  if (batch->enable_slm) {
     /* use the hard code here temp, must change to
      * I915_EXEC_ENABLE_SLM when it drm accept the patch */
-    flag |= (1<<13);
+    flag |= (1 << 13);
   }
   if (drm_intel_gem_bo_context_exec(batch->buffer, batch->intel->ctx, used, 
flag) < 0) {
     fprintf(stderr, "drm_intel_gem_bo_context_exec() failed: %s\n", 
strerror(errno));
@@ -144,11 +143,21 @@ intel_batchbuffer_flush(intel_batchbuffer_t *batch)
   return err;
 }
 
-LOCAL void 
+LOCAL int
+intel_batchbuffer_finish(intel_batchbuffer_t *batch)
+{
+  assert(batch && batch->last_bo);
+  drm_intel_bo_reference(batch->last_bo);
+  drm_intel_bo_wait_rendering(batch->last_bo);
+  drm_intel_bo_unreference(batch->last_bo);
+  return 0;
+}
+
+LOCAL void
 intel_batchbuffer_emit_reloc(intel_batchbuffer_t *batch,
-                             dri_bo *bo, 
+                             dri_bo *bo,
                              uint32_t read_domains,
-                             uint32_t write_domains, 
+                             uint32_t write_domains,
                              uint32_t delta)
 {
   assert(batch->ptr - batch->map < batch->size);
@@ -161,20 +170,41 @@ intel_batchbuffer_emit_reloc(intel_batchbuffer_t *batch,
   intel_batchbuffer_emit_dword(batch, bo->offset + delta);
 }
 
-LOCAL intel_batchbuffer_t*
-intel_batchbuffer_new(intel_driver_t *intel)
+LOCAL intel_batchbuffer_t *
+intel_batchbuffer_create(intel_driver_t *intel, size_t sz)
 {
   intel_batchbuffer_t *batch = NULL;
   assert(intel);
-  TRY_ALLOC_NO_ERR (batch, CL_CALLOC(1, sizeof(intel_batchbuffer_t)));
-  intel_batchbuffer_init(batch, intel);
 
-exit:
+  batch = CL_CALLOC(1, sizeof(intel_batchbuffer_t));
+  if (batch == NULL)
+    return NULL;
+
+  batch->intel = intel;
+
+  batch->buffer = dri_bo_alloc(batch->intel->bufmgr,
+                               "batch buffer",
+                               sz,
+                               64);
+  if (batch->buffer == NULL) {
+    CL_FREE(batch);
+    return NULL;
+  }
+
+  if (dri_bo_map(batch->buffer, 1) != 0) {
+    dri_bo_unreference(batch->buffer);
+    CL_FREE(batch);
+    return NULL;
+  }
+
+  batch->map = (uint8_t *)batch->buffer->virtual;
+  batch->size = sz;
+  batch->ptr = batch->map;
+  batch->atomic = 0;
+  batch->last_bo = batch->buffer;
+  batch->enable_slm = 0;
+
   return batch;
-error:
-  intel_batchbuffer_delete(batch);
-  batch = NULL;
-  goto exit;
 }
 
 LOCAL void
@@ -182,8 +212,16 @@ intel_batchbuffer_delete(intel_batchbuffer_t *batch)
 {
   if (batch == NULL)
     return;
-  if(batch->buffer)
-    intel_batchbuffer_terminate(batch);
+
+  if (batch->buffer) {
+    if (batch->map) {
+      dri_bo_unmap(batch->buffer);
+      batch->map = NULL;
+    }
+
+    dri_bo_unreference(batch->buffer);
+    batch->buffer = NULL;
+  }
 
   CL_FREE(batch);
 }
diff --git a/src/gen/intel_batchbuffer.h b/src/gen/intel_batchbuffer.h
index 0544e9a..95db24f 100644
--- a/src/gen/intel_batchbuffer.h
+++ b/src/gen/intel_batchbuffer.h
@@ -90,16 +90,16 @@ typedef struct intel_batchbuffer
 } intel_batchbuffer_t;
 
 extern intel_batchbuffer_t* intel_batchbuffer_new(struct intel_driver*);
+extern int intel_batchbuffer_reset(intel_batchbuffer_t*, size_t sz);
+
+
+extern intel_batchbuffer_t* intel_batchbuffer_create(struct intel_driver*, 
size_t);
 extern void intel_batchbuffer_delete(intel_batchbuffer_t*);
-extern void intel_batchbuffer_emit_reloc(intel_batchbuffer_t*,
-                                         drm_intel_bo*,
-                                         uint32_t read_domains,
-                                         uint32_t write_domains,
-                                         uint32_t delta);
+extern void intel_batchbuffer_emit_reloc(intel_batchbuffer_t*, drm_intel_bo*, 
uint32_t read_domains,
+                                         uint32_t write_domains, uint32_t 
delta);
 extern void intel_batchbuffer_init(intel_batchbuffer_t*, struct intel_driver*);
-extern void intel_batchbuffer_terminate(intel_batchbuffer_t*);
 extern int intel_batchbuffer_flush(intel_batchbuffer_t*);
-extern int intel_batchbuffer_reset(intel_batchbuffer_t*, size_t sz);
+extern int intel_batchbuffer_finish(intel_batchbuffer_t*);
 
 static INLINE uint32_t
 intel_batchbuffer_space(const intel_batchbuffer_t *batch)
-- 
2.7.4

_______________________________________________
Beignet mailing list
Beignet@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/beignet

Reply via email to