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

Signed-off-by: Junyan He <junyan...@intel.com>
---
 src/CMakeLists.txt          |    2 +-
 src/cl_driver.cpp           |    2 +-
 src/gen/intel_batchbuffer.c |    2 +-
 src/gen/intel_driver.c      | 1058 +++++++++++++++++++++++++++++++++++++++++++
 src/gen/intel_driver.h      |  152 +++++++
 src/intel/intel_driver.c    | 1042 ------------------------------------------
 src/intel/intel_driver.h    |  150 ------
 src/intel/intel_gpgpu.h     |    2 +-
 8 files changed, 1214 insertions(+), 1196 deletions(-)
 create mode 100644 src/gen/intel_driver.c
 create mode 100644 src/gen/intel_driver.h
 delete mode 100644 src/intel/intel_driver.c
 delete mode 100644 src/intel/intel_driver.h

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 8d2bf5b..709dc10 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -102,8 +102,8 @@ set(OPENCL_SRC
     cl_driver.cpp
     cl_driver_defs.c
     gen/intel_batchbuffer.c
+    gen/intel_driver.c
     intel/intel_gpgpu.c
-    intel/intel_driver.c
     performance.c)
 
 if (X11_FOUND)
diff --git a/src/cl_driver.cpp b/src/cl_driver.cpp
index 03b980e..e0d2ae3 100644
--- a/src/cl_driver.cpp
+++ b/src/cl_driver.cpp
@@ -18,7 +18,7 @@
  */
 
 extern "C" {
-#include "intel/intel_driver.h"
+#include "gen/intel_driver.h"
 #include "cl_utils.h"
 #include <stdlib.h>
 #include <string.h>
diff --git a/src/gen/intel_batchbuffer.c b/src/gen/intel_batchbuffer.c
index 078908c..292be83 100644
--- a/src/gen/intel_batchbuffer.c
+++ b/src/gen/intel_batchbuffer.c
@@ -45,7 +45,7 @@
  **************************************************************************/
 
 #include "intel_batchbuffer.h"
-#include "intel/intel_driver.h"
+#include "intel_driver.h"
 #include "cl_alloc.h"
 #include "cl_utils.h"
 
diff --git a/src/gen/intel_driver.c b/src/gen/intel_driver.c
new file mode 100644
index 0000000..bce1894
--- /dev/null
+++ b/src/gen/intel_driver.c
@@ -0,0 +1,1058 @@
+/* 
+ * Copyright © 2012 Intel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Benjamin Segovia <benjamin.sego...@intel.com>
+ */
+
+/*
+ * Copyright 2009 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Xiang Haihao <haihao.xi...@intel.com>
+ *    Zou Nan hai <nanhai....@intel.com>
+ *
+ */
+
+#if defined(HAS_GL_EGL)
+#define EGL_EGLEXT_PROTOTYPES
+#include "GL/gl.h"
+#include "EGL/egl.h"
+#include <EGL/eglext.h>
+#endif
+
+#ifdef HAS_X11
+#include <X11/Xlibint.h>
+#include "x11/dricommon.h"
+#endif
+
+#include "intel_driver.h"
+#include "intel/intel_gpgpu.h"
+#include "intel_batchbuffer.h"
+#include "intel_bufmgr.h"
+#include "cl_mem.h"
+
+#include <assert.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <xf86drm.h>
+#include <stdio.h>
+
+#include "cl_utils.h"
+#include "cl_alloc.h"
+#include "cl_context.h"
+#include "cl_driver.h"
+#include "cl_device_id.h"
+#include "cl_platform_id.h"
+
+static void
+intel_driver_delete(intel_driver_t *driver)
+{
+  if (driver == NULL)
+    return;
+
+  CL_FREE(driver);
+}
+
+static intel_driver_t *
+intel_driver_new(void)
+{
+  intel_driver_t *driver = NULL;
+
+  TRY_ALLOC_NO_ERR(driver, CL_CALLOC(1, sizeof(intel_driver_t)));
+  driver->fd = -1;
+
+exit:
+  return driver;
+error:
+  intel_driver_delete(driver);
+  driver = NULL;
+  goto exit;
+}
+
+/* just used for maximum relocation number in drm_intel */
+#define BATCH_SIZE 0x4000
+
+/* set OCL_DUMP_AUB=1 to get aub file */
+static void
+intel_driver_aub_dump(intel_driver_t *driver)
+{
+  char *val;
+  val = getenv("OCL_DUMP_AUB");
+  if (!val)
+    return;
+  if (atoi(val) != 0) {
+    drm_intel_bufmgr_gem_set_aub_filename(driver->bufmgr,
+                                          "beignet.aub");
+    drm_intel_bufmgr_gem_set_aub_dump(driver->bufmgr, 1);
+  }
+}
+
+static int
+intel_driver_memman_init(intel_driver_t *driver)
+{
+  driver->bufmgr = drm_intel_bufmgr_gem_init(driver->fd, BATCH_SIZE);
+  if (!driver->bufmgr)
+    return 0;
+  drm_intel_bufmgr_gem_enable_reuse(driver->bufmgr);
+  driver->device_id = drm_intel_bufmgr_gem_get_devid(driver->bufmgr);
+  intel_driver_aub_dump(driver);
+  return 1;
+}
+
+static int
+intel_driver_context_init(intel_driver_t *driver)
+{
+  driver->ctx = drm_intel_gem_context_create(driver->bufmgr);
+  if (!driver->ctx)
+    return 0;
+  driver->null_bo = NULL;
+#ifdef HAS_BO_SET_SOFTPIN
+  drm_intel_bo *bo = dri_bo_alloc(driver->bufmgr, "null_bo", 64 * 1024, 4096);
+  drm_intel_bo_set_softpin_offset(bo, 0);
+  // don't reuse it, that would make two bo trying to bind to same address,
+  // which is un-reasonable.
+  drm_intel_bo_disable_reuse(bo);
+  driver->null_bo = bo;
+#endif
+  return 1;
+}
+
+static void
+intel_driver_context_destroy(intel_driver_t *driver)
+{
+  if (driver->null_bo)
+    drm_intel_bo_unreference(driver->null_bo);
+  if (driver->ctx)
+    drm_intel_gem_context_destroy(driver->ctx);
+  driver->ctx = NULL;
+}
+
+static int
+intel_driver_init(intel_driver_t *driver, int dev_fd)
+{
+  driver->fd = dev_fd;
+  driver->locked = 0;
+  pthread_mutex_init(&driver->ctxmutex, NULL);
+
+  if (!intel_driver_memman_init(driver))
+    return 0;
+  if (!intel_driver_context_init(driver))
+    return 0;
+
+#if EMULATE_GEN
+  driver->gen_ver = EMULATE_GEN;
+  if (EMULATE_GEN == 75)
+    driver->device_id = PCI_CHIP_HASWELL_L; /* we pick L for HSW */
+  else if (EMULATE_GEN == 7)
+    driver->device_id = PCI_CHIP_IVYBRIDGE_GT2; /* we pick GT2 for IVB */
+  else if (EMULATE_GEN == 6)
+    driver->device_id = PCI_CHIP_SANDYBRIDGE_GT2; /* we pick GT2 for SNB */
+  else
+    FATAL("Unsupported Gen for emulation");
+#else
+  if (IS_GEN9(driver->device_id))
+    driver->gen_ver = 9;
+  else if (IS_GEN8(driver->device_id))
+    driver->gen_ver = 8;
+  else if (IS_GEN75(driver->device_id))
+    driver->gen_ver = 75;
+  else if (IS_GEN7(driver->device_id))
+    driver->gen_ver = 7;
+  else if (IS_GEN6(driver->device_id))
+    driver->gen_ver = 6;
+  else if (IS_IGDNG(driver->device_id))
+    driver->gen_ver = 5;
+  else
+    driver->gen_ver = 4;
+#endif /* EMULATE_GEN */
+  return 1;
+}
+
+static cl_int
+intel_driver_open(intel_driver_t *intel, cl_context_prop props)
+{
+  int cardi;
+#ifdef HAS_X11
+  char *driver_name;
+#endif
+  if (props != NULL && props->gl_type != CL_GL_NOSHARE && props->gl_type != 
CL_GL_GLX_DISPLAY && props->gl_type != CL_GL_EGL_DISPLAY) {
+    fprintf(stderr, "Unsupported gl share type %d.\n", props->gl_type);
+    return CL_INVALID_OPERATION;
+  }
+
+#ifdef HAS_X11
+  intel->x11_display = XOpenDisplay(NULL);
+
+  if (intel->x11_display) {
+    if ((intel->dri_ctx = getDRI2State(intel->x11_display,
+                                       DefaultScreen(intel->x11_display),
+                                       &driver_name))) {
+      intel_driver_init_shared(intel, intel->dri_ctx);
+      Xfree(driver_name);
+    } else
+      fprintf(stderr, "X server found. dri2 connection failed! \n");
+  }
+#endif
+
+  if (!intel_driver_is_active(intel)) {
+    char card_name[20];
+    for (cardi = 0; cardi < 16; cardi++) {
+      sprintf(card_name, "/dev/dri/renderD%d", 128 + cardi);
+      if (access(card_name, R_OK) != 0)
+        continue;
+      if (intel_driver_init_render(intel, card_name))
+        break;
+    }
+  }
+
+  if (!intel_driver_is_active(intel)) {
+    char card_name[20];
+    for (cardi = 0; cardi < 16; cardi++) {
+      sprintf(card_name, "/dev/dri/card%d", cardi);
+      if (access(card_name, R_OK) != 0)
+        continue;
+      if (intel_driver_init_master(intel, card_name))
+        break;
+    }
+  }
+
+  if (!intel_driver_is_active(intel)) {
+    fprintf(stderr, "Device open failed, aborting...\n");
+    return CL_DEVICE_NOT_FOUND;
+  }
+
+#ifdef HAS_GL_EGL
+  if (props && props->gl_type == CL_GL_EGL_DISPLAY) {
+    assert(props->egl_display);
+  }
+#endif
+  return CL_SUCCESS;
+}
+
+static void
+intel_driver_close(intel_driver_t *intel)
+{
+  //Due to the drm change about the test usrptr, we need to destroy the bufmgr
+  //befor the driver was closed, otherwise the test usrptr will not be freed.
+  if (intel->bufmgr)
+    drm_intel_bufmgr_destroy(intel->bufmgr);
+#ifdef HAS_X11
+  if (intel->dri_ctx)
+    dri_state_release(intel->dri_ctx);
+  if (intel->x11_display)
+    XCloseDisplay(intel->x11_display);
+#endif
+  if (intel->need_close) {
+    close(intel->fd);
+    intel->need_close = 0;
+  }
+  intel->dri_ctx = NULL;
+  intel->x11_display = NULL;
+  intel->fd = -1;
+}
+
+LOCAL int
+intel_driver_is_active(intel_driver_t *driver)
+{
+  return driver->fd >= 0;
+}
+
+#ifdef HAS_X11
+LOCAL int
+intel_driver_init_shared(intel_driver_t *driver, dri_state_t *state)
+{
+  int ret;
+  assert(state);
+  if (state->driConnectedFlag != DRI2)
+    return 0;
+  ret = intel_driver_init(driver, state->fd);
+  driver->need_close = 0;
+  return ret;
+}
+#endif
+
+LOCAL int
+intel_driver_init_master(intel_driver_t *driver, const char *dev_name)
+{
+  int dev_fd, ret;
+
+  drm_client_t client;
+
+  // usually dev_name = "/dev/dri/card%d"
+  dev_fd = open(dev_name, O_RDWR);
+  if (dev_fd == -1) {
+    fprintf(stderr, "open(\"%s\", O_RDWR) failed: %s\n", dev_name, 
strerror(errno));
+    return 0;
+  }
+
+  // Check that we're authenticated
+  memset(&client, 0, sizeof(drm_client_t));
+  ret = ioctl(dev_fd, DRM_IOCTL_GET_CLIENT, &client);
+  if (ret == -1) {
+    fprintf(stderr, "ioctl(dev_fd, DRM_IOCTL_GET_CLIENT, &client) failed: 
%s\n", strerror(errno));
+    close(dev_fd);
+    return 0;
+  }
+
+  if (!client.auth) {
+    fprintf(stderr, "%s not authenticated\n", dev_name);
+    close(dev_fd);
+    return 0;
+  }
+
+  ret = intel_driver_init(driver, dev_fd);
+  driver->need_close = 1;
+
+  return ret;
+}
+
+LOCAL int
+intel_driver_init_render(intel_driver_t *driver, const char *dev_name)
+{
+  int dev_fd, ret;
+
+  dev_fd = open(dev_name, O_RDWR);
+  if (dev_fd == -1)
+    return 0;
+
+  ret = intel_driver_init(driver, dev_fd);
+  driver->need_close = 1;
+
+  return ret;
+}
+
+LOCAL int
+intel_driver_terminate(intel_driver_t *driver)
+{
+  pthread_mutex_destroy(&driver->ctxmutex);
+
+  if (driver->need_close) {
+    close(driver->fd);
+    driver->need_close = 0;
+  }
+  driver->fd = -1;
+  return 1;
+}
+
+LOCAL void
+intel_driver_lock_hardware(intel_driver_t *driver)
+{
+
+  PPTHREAD_MUTEX_LOCK(driver);
+  assert(!driver->locked);
+  driver->locked = 1;
+}
+
+LOCAL void
+intel_driver_unlock_hardware(intel_driver_t *driver)
+{
+  driver->locked = 0;
+  PPTHREAD_MUTEX_UNLOCK(driver);
+}
+
+LOCAL dri_bo *
+intel_driver_share_buffer_from_name(intel_driver_t *driver, const char *sname, 
uint32_t name)
+{
+  dri_bo *bo = intel_bo_gem_create_from_name(driver->bufmgr,
+                                             sname,
+                                             name);
+  if (bo == NULL) {
+    fprintf(stderr, "intel_bo_gem_create_from_name create \"%s\" bo from name 
%d failed: %s\n", sname, name, strerror(errno));
+    return NULL;
+  }
+  return bo;
+}
+
+LOCAL dri_bo *
+intel_driver_share_buffer_from_fd(intel_driver_t *driver, int fd, int size)
+{
+  dri_bo *bo = drm_intel_bo_gem_create_from_prime(driver->bufmgr,
+                                                  fd,
+                                                  size);
+  if (bo == NULL) {
+    fprintf(stderr, "drm_intel_bo_gem_create_from_prime create bo(size %d) 
from fd %d failed: %s\n", size, fd, strerror(errno));
+    return NULL;
+  }
+  return bo;
+}
+
+LOCAL uint32_t
+intel_driver_shared_name(intel_driver_t *driver, dri_bo *bo)
+{
+  uint32_t name;
+  assert(bo);
+  dri_bo_flink(bo, &name);
+  return name;
+}
+/* XXX a null props is ok? */
+static int
+intel_get_device_id(void)
+{
+  intel_driver_t *driver = NULL;
+  int intel_device_id;
+
+  driver = intel_driver_new();
+  assert(driver != NULL);
+  if (UNLIKELY(intel_driver_open(driver, NULL) != CL_SUCCESS))
+    return INVALID_CHIP_ID;
+  intel_device_id = driver->device_id;
+  intel_driver_context_destroy(driver);
+  intel_driver_close(driver);
+  intel_driver_terminate(driver);
+  intel_driver_delete(driver);
+
+  return intel_device_id;
+}
+
+extern void intel_gpgpu_delete_all(intel_driver_t *driver);
+static void
+cl_intel_driver_delete(intel_driver_t *driver)
+{
+  if (driver == NULL)
+    return;
+  intel_gpgpu_delete_all(driver);
+  intel_driver_context_destroy(driver);
+  intel_driver_close(driver);
+  intel_driver_terminate(driver);
+  intel_driver_delete(driver);
+}
+
+#include "cl_gbe_loader.h"
+static intel_driver_t *
+cl_intel_driver_new(cl_context_prop props)
+{
+  intel_driver_t *driver = NULL;
+  TRY_ALLOC_NO_ERR(driver, intel_driver_new());
+  if (UNLIKELY(intel_driver_open(driver, props) != CL_SUCCESS))
+    goto error;
+exit:
+  return driver;
+error:
+  cl_intel_driver_delete(driver);
+  driver = NULL;
+  goto exit;
+}
+
+static drm_intel_bufmgr *
+intel_driver_get_bufmgr(intel_driver_t *drv)
+{
+  return drv->bufmgr;
+}
+
+static uint32_t
+intel_driver_get_ver(struct intel_driver *drv)
+{
+  return drv->gen_ver;
+}
+
+static void
+intel_driver_enlarge_stack_size(struct intel_driver *drv, int32_t *stack_size)
+{
+  if (drv->gen_ver == 75)
+    *stack_size = *stack_size * 4;
+  else if (drv->device_id == PCI_CHIP_BROXTON_1 || drv->device_id == 
PCI_CHIP_BROXTON_3 ||
+           IS_CHERRYVIEW(drv->device_id))
+    *stack_size = *stack_size * 2;
+}
+
+static void
+intel_driver_set_atomic_flag(intel_driver_t *drv, int atomic_flag)
+{
+  drv->atomic_test_result = atomic_flag;
+}
+
+static size_t drm_intel_bo_get_size(drm_intel_bo *bo) { return bo->size; }
+static void *drm_intel_bo_get_virtual(drm_intel_bo *bo) { return bo->virtual; }
+
+static int get_cl_tiling(uint32_t drm_tiling)
+{
+  switch (drm_tiling) {
+  case I915_TILING_X:
+    return CL_TILE_X;
+  case I915_TILING_Y:
+    return CL_TILE_Y;
+  case I915_TILING_NONE:
+    return CL_NO_TILE;
+  default:
+    assert(0);
+  }
+  return CL_NO_TILE;
+}
+
+static uint32_t intel_buffer_get_tiling_align(cl_context ctx, uint32_t 
tiling_mode, uint32_t dim)
+{
+  uint32_t gen_ver = ((intel_driver_t *)ctx->drv)->gen_ver;
+  uint32_t ret = 0;
+
+  switch (tiling_mode) {
+  case CL_TILE_X:
+    if (dim == 0) { //tileX width in bytes
+      ret = 512;
+    } else if (dim == 1) { //tileX height in number of rows
+      ret = 8;
+    } else if (dim == 2) { //height to calculate slice pitch
+      if (gen_ver == 9)    //SKL same as tileY height
+        ret = 8;
+      else if (gen_ver == 8) //IVB, HSW, BDW same as CL_NO_TILE vertical 
alignment
+        ret = 4;
+      else
+        ret = 2;
+    } else
+      assert(0);
+    break;
+
+  case CL_TILE_Y:
+    if (dim == 0) { //tileY width in bytes
+      ret = 128;
+    } else if (dim == 1) { //tileY height in number of rows
+      ret = 32;
+    } else if (dim == 2) { //height to calculate slice pitch
+      if (gen_ver == 9)    //SKL same as tileY height
+        ret = 32;
+      else if (gen_ver == 8) //IVB, HSW, BDW same as CL_NO_TILE vertical 
alignment
+        ret = 4;
+      else
+        ret = 2;
+    } else
+      assert(0);
+    break;
+
+  case CL_NO_TILE:
+    if (dim == 1 || dim == 2) {         //vertical alignment
+      if (gen_ver == 8 || gen_ver == 9) //SKL 1D array need 4 alignment qpitch
+        ret = 4;
+      else
+        ret = 2;
+    } else
+      assert(0);
+    break;
+  }
+
+  return ret;
+}
+
+#if defined(HAS_GL_EGL)
+#include "intel_cl_gl_share_image_info.h"
+#include "cl_image.h"
+
+static PFNEGLEXPORTDMABUFIMAGEMESAPROC eglExportDMABUFImageMESA_func = NULL;
+
+static int
+get_required_egl_extensions()
+{
+
+  if (eglExportDMABUFImageMESA_func == NULL) {
+    eglExportDMABUFImageMESA_func = 
(PFNEGLEXPORTDMABUFIMAGEMESAPROC)eglGetProcAddress("eglExportDMABUFImageMESA");
+    if (eglExportDMABUFImageMESA_func == NULL) {
+      fprintf(stderr, "Failed to get EGL extension function 
eglExportDMABUFImageMESA\n");
+      return -1;
+    }
+  }
+  return 0;
+}
+
+static int cl_get_clformat_from_texture(GLint tex_format, cl_image_format 
*cl_format)
+{
+  cl_int ret = CL_SUCCESS;
+
+  switch (tex_format) {
+  case GL_RGBA8:
+  case GL_RGBA:
+  case GL_RGBA16:
+  case GL_RGBA8I:
+  case GL_RGBA16I:
+  case GL_RGBA32I:
+  case GL_RGBA8UI:
+  case GL_RGBA16UI:
+  case GL_RGBA32UI:
+  case GL_RGBA16F:
+  case GL_RGBA32F:
+    cl_format->image_channel_order = CL_RGBA;
+    break;
+  case GL_BGRA:
+    cl_format->image_channel_order = CL_BGRA;
+    break;
+  default:
+    ret = -1;
+    goto error;
+  }
+
+  switch (tex_format) {
+  case GL_RGBA8:
+  case GL_RGBA:
+  case GL_BGRA:
+    cl_format->image_channel_data_type = CL_UNORM_INT8;
+    break;
+  case GL_RGBA16:
+    cl_format->image_channel_data_type = CL_UNORM_INT16;
+    break;
+  case GL_RGBA8I:
+    cl_format->image_channel_data_type = CL_SIGNED_INT8;
+    break;
+  case GL_RGBA16I:
+    cl_format->image_channel_data_type = CL_SIGNED_INT16;
+    break;
+  case GL_RGBA32I:
+    cl_format->image_channel_data_type = CL_SIGNED_INT32;
+    break;
+  case GL_RGBA8UI:
+    cl_format->image_channel_data_type = CL_UNSIGNED_INT8;
+    break;
+  case GL_RGBA16UI:
+    cl_format->image_channel_data_type = CL_UNSIGNED_INT16;
+    break;
+  case GL_RGBA32UI:
+    cl_format->image_channel_data_type = CL_UNSIGNED_INT32;
+    break;
+  case GL_RGBA16F:
+    cl_format->image_channel_data_type = CL_HALF_FLOAT;
+    break;
+  case GL_RGBA32F:
+    cl_format->image_channel_order = CL_FLOAT;
+    break;
+  default:
+    ret = -1;
+    goto error;
+  }
+
+error:
+  return ret;
+}
+
+static int
+get_mem_type_from_target(GLenum texture_target, cl_mem_object_type *type)
+{
+  switch (texture_target) {
+  case GL_TEXTURE_1D:
+    *type = CL_MEM_OBJECT_IMAGE1D;
+    break;
+  case GL_TEXTURE_2D:
+    *type = CL_MEM_OBJECT_IMAGE2D;
+    break;
+  case GL_TEXTURE_3D:
+    *type = CL_MEM_OBJECT_IMAGE3D;
+    break;
+  case GL_TEXTURE_1D_ARRAY:
+    *type = CL_MEM_OBJECT_IMAGE1D_ARRAY;
+    break;
+  case GL_TEXTURE_2D_ARRAY:
+    *type = CL_MEM_OBJECT_IMAGE2D_ARRAY;
+    break;
+  default:
+    return -1;
+  }
+  return CL_SUCCESS;
+}
+
+static cl_buffer
+intel_alloc_buffer_from_texture_egl(cl_context ctx, unsigned int target,
+                                    int miplevel, unsigned int texture,
+                                    struct _cl_mem_image *image)
+{
+  drm_intel_bo *intel_bo = NULL;
+  struct _intel_cl_gl_share_image_info info;
+  unsigned int bpp, intel_fmt;
+  cl_image_format cl_format;
+  EGLBoolean ret;
+
+  EGLenum e_target;
+  //We just support GL_TEXTURE_2D because we can't query info like slice_pitch 
now.
+  if (target == GL_TEXTURE_2D)
+    e_target = EGL_GL_TEXTURE_2D;
+  else
+    return NULL;
+
+  if (get_required_egl_extensions() != 0)
+    return NULL;
+
+  EGLAttrib attrib_list[] = {EGL_GL_TEXTURE_LEVEL, miplevel,
+                             EGL_NONE};
+  EGLImage e_image = eglCreateImage(EGL_DISP(ctx), EGL_CTX(ctx), e_target,
+                                    (EGLClientBuffer)texture, &attrib_list[0]);
+  if (e_image == EGL_NO_IMAGE)
+    return NULL;
+
+  int fd, stride, offset;
+  ret = eglExportDMABUFImageMESA_func(EGL_DISP(ctx), e_image, &fd, &stride, 
&offset);
+  if (ret != EGL_TRUE) {
+    eglDestroyImage(EGL_DISP(ctx), e_image);
+    return NULL;
+  }
+  info.fd = fd;
+
+  /* The size argument just takes effect in intel_driver_share_buffer_from_fd 
when
+ * Linux kernel is older than 3.12, so it doesn't matter we set to 0 here.
+ */
+  int size = 0;
+  intel_bo = intel_driver_share_buffer_from_fd((intel_driver_t *)ctx->drv, fd, 
size);
+
+  if (intel_bo == NULL) {
+    eglDestroyImage(EGL_DISP(ctx), e_image);
+    return NULL;
+  }
+
+  GLint param_value;
+  glGetTexLevelParameteriv(target, miplevel, GL_TEXTURE_WIDTH, &param_value);
+  info.w = param_value;
+  glGetTexLevelParameteriv(target, miplevel, GL_TEXTURE_HEIGHT, &param_value);
+  info.h = param_value;
+  glGetTexLevelParameteriv(target, miplevel, GL_TEXTURE_DEPTH, &param_value);
+  info.depth = 1;
+  info.pitch = stride;
+  uint32_t tiling_mode, swizzle_mode;
+  drm_intel_bo_get_tiling(intel_bo, &tiling_mode, &swizzle_mode);
+  info.offset = offset;
+  info.tile_x = 0;
+  info.tile_y = 0;
+  glGetTexLevelParameteriv(target, miplevel, GL_TEXTURE_INTERNAL_FORMAT, 
&param_value);
+  info.gl_format = param_value;
+  info.row_pitch = stride;
+  info.slice_pitch = 0;
+
+  info.tiling = get_cl_tiling(tiling_mode);
+  if (cl_get_clformat_from_texture(info.gl_format, &cl_format) != 0)
+    goto error;
+
+  if (cl_image_byte_per_pixel(&cl_format, &bpp) != CL_SUCCESS)
+    goto error;
+  intel_fmt = cl_image_get_intel_format(&cl_format);
+  if (intel_fmt == INTEL_UNSUPPORTED_FORMAT)
+    goto error;
+  cl_mem_object_type image_type;
+  if (get_mem_type_from_target(target, &image_type) != 0)
+    goto error;
+
+  cl_mem_image_init(image, info.w, info.h,
+                    image_type, info.depth, cl_format,
+                    intel_fmt, bpp, info.row_pitch,
+                    info.slice_pitch, info.tiling,
+                    info.tile_x, info.tile_y, info.offset);
+
+  struct _cl_mem_gl_image *gl_image = (struct _cl_mem_gl_image *)image;
+  gl_image->fd = fd;
+  gl_image->egl_image = e_image;
+
+  return (cl_buffer)intel_bo;
+
+error:
+  drm_intel_bo_unreference(intel_bo);
+  close(fd);
+  eglDestroyImage(EGL_DISP(ctx), e_image);
+  return NULL;
+}
+
+static cl_buffer
+intel_alloc_buffer_from_texture(cl_context ctx, unsigned int target,
+                                int miplevel, unsigned int texture,
+                                struct _cl_mem_image *image)
+{
+
+  if (IS_EGL_CONTEXT(ctx))
+    return intel_alloc_buffer_from_texture_egl(ctx, target, miplevel, texture, 
image);
+
+  return NULL;
+}
+
+static int
+intel_release_buffer_from_texture(cl_context ctx, struct _cl_mem_gl_image 
*gl_image)
+{
+  if (IS_EGL_CONTEXT(ctx)) {
+    close(gl_image->fd);
+    eglDestroyImage(EGL_DISP(ctx), gl_image->egl_image);
+    return CL_SUCCESS;
+  }
+  return -1;
+}
+#endif
+
+cl_buffer intel_share_buffer_from_libva(cl_context ctx,
+                                        unsigned int bo_name,
+                                        size_t *sz)
+{
+  drm_intel_bo *intel_bo;
+
+  intel_bo = intel_driver_share_buffer_from_name((intel_driver_t *)ctx->drv, 
"shared from libva", bo_name);
+
+  if (intel_bo == NULL)
+    return NULL;
+
+  if (sz)
+    *sz = intel_bo->size;
+
+  return (cl_buffer)intel_bo;
+}
+
+cl_buffer intel_share_image_from_libva(cl_context ctx,
+                                       unsigned int bo_name,
+                                       struct _cl_mem_image *image)
+{
+  drm_intel_bo *intel_bo;
+  uint32_t intel_tiling, intel_swizzle_mode;
+
+  intel_bo = intel_driver_share_buffer_from_name((intel_driver_t *)ctx->drv, 
"shared from libva", bo_name);
+
+  if (intel_bo == NULL)
+    return NULL;
+
+  drm_intel_bo_get_tiling(intel_bo, &intel_tiling, &intel_swizzle_mode);
+  image->tiling = get_cl_tiling(intel_tiling);
+
+  return (cl_buffer)intel_bo;
+}
+
+cl_buffer intel_share_buffer_from_fd(cl_context ctx,
+                                     int fd,
+                                     int buffer_size)
+{
+  drm_intel_bo *intel_bo;
+
+  intel_bo = intel_driver_share_buffer_from_fd((intel_driver_t *)ctx->drv, fd, 
buffer_size);
+
+  if (intel_bo == NULL)
+    return NULL;
+
+  return (cl_buffer)intel_bo;
+}
+
+cl_buffer intel_share_image_from_fd(cl_context ctx,
+                                    int fd,
+                                    int image_size,
+                                    struct _cl_mem_image *image)
+{
+  drm_intel_bo *intel_bo;
+  uint32_t intel_tiling, intel_swizzle_mode;
+
+  intel_bo = intel_driver_share_buffer_from_fd((intel_driver_t *)ctx->drv, fd, 
image_size);
+
+  if (intel_bo == NULL)
+    return NULL;
+
+  drm_intel_bo_get_tiling(intel_bo, &intel_tiling, &intel_swizzle_mode);
+  image->tiling = get_cl_tiling(intel_tiling);
+
+  return (cl_buffer)intel_bo;
+}
+
+static cl_buffer intel_buffer_alloc_userptr(cl_buffer_mgr bufmgr, const char 
*name, void *data, size_t size, unsigned long flags)
+{
+#ifdef HAS_USERPTR
+  drm_intel_bo *bo;
+  bo = drm_intel_bo_alloc_userptr((drm_intel_bufmgr *)bufmgr, name, data, 
I915_TILING_NONE, 0, size, flags);
+  /* Fallback to unsynchronized userptr allocation if kernel has no MMU 
notifier enabled. */
+  if (bo == NULL)
+    bo = drm_intel_bo_alloc_userptr((drm_intel_bufmgr *)bufmgr, name, data, 
I915_TILING_NONE, 0, size, flags | I915_USERPTR_UNSYNCHRONIZED);
+  return (cl_buffer)bo;
+#else
+  return NULL;
+#endif
+}
+
+static int32_t get_intel_tiling(cl_int tiling, uint32_t *intel_tiling)
+{
+  switch (tiling) {
+  case CL_NO_TILE:
+    *intel_tiling = I915_TILING_NONE;
+    break;
+  case CL_TILE_X:
+    *intel_tiling = I915_TILING_X;
+    break;
+  case CL_TILE_Y:
+    *intel_tiling = I915_TILING_Y;
+    break;
+  default:
+    assert(0);
+    return -1;
+  }
+  return 0;
+}
+
+static int intel_buffer_set_tiling(cl_buffer bo,
+                                   cl_image_tiling_t tiling, size_t stride)
+{
+  uint32_t intel_tiling;
+  int ret;
+  if (UNLIKELY((get_intel_tiling(tiling, &intel_tiling)) < 0))
+    return -1;
+#ifndef NDEBUG
+  uint32_t required_tiling;
+  required_tiling = intel_tiling;
+#endif
+  ret = drm_intel_bo_set_tiling((drm_intel_bo *)bo, &intel_tiling, stride);
+  assert(intel_tiling == required_tiling);
+  return ret;
+}
+
+#define CHV_CONFIG_WARNING \
+  "Warning: can't get GPU's configurations, will use the minimal one. Please 
update your drm to 2.4.59+ and linux kernel to 4.0.0+.\n"
+static void
+intel_update_device_info(cl_device_id device)
+{
+  intel_driver_t *driver;
+
+  driver = intel_driver_new();
+  assert(driver != NULL);
+  if (intel_driver_open(driver, NULL) != CL_SUCCESS) {
+    intel_driver_delete(driver);
+    return;
+  }
+
+#ifdef HAS_USERPTR
+  const size_t sz = 4096;
+  void *host_ptr;
+
+  host_ptr = CL_MEMALIGN(sz, 4096);
+  if (host_ptr != NULL) {
+    cl_buffer bo = intel_buffer_alloc_userptr((cl_buffer_mgr)driver->bufmgr,
+                                              "CL memory object", host_ptr, 
sz, 0);
+    if (bo == NULL)
+      device->host_unified_memory = CL_FALSE;
+    else
+      drm_intel_bo_unreference((drm_intel_bo *)bo);
+    CL_FREE(host_ptr);
+  } else
+    device->host_unified_memory = CL_FALSE;
+#endif
+
+#ifdef HAS_EU_TOTAL
+  unsigned int eu_total;
+
+  /* Prefer driver-queried max compute units if supported */
+  if (!drm_intel_get_eu_total(driver->fd, &eu_total))
+    device->max_compute_unit = eu_total;
+  else if (IS_CHERRYVIEW(device->device_id))
+    printf(CHV_CONFIG_WARNING);
+#else
+  if (IS_CHERRYVIEW(device->device_id)) {
+#if defined(__ANDROID__)
+    device->max_compute_unit = 12;
+#else
+    printf(CHV_CONFIG_WARNING);
+#endif
+  }
+#endif
+
+#ifdef HAS_SUBSLICE_TOTAL
+  unsigned int subslice_total;
+
+  /* Prefer driver-queried subslice count if supported */
+  if (!drm_intel_get_subslice_total(driver->fd, &subslice_total))
+    device->sub_slice_count = subslice_total;
+  else if (IS_CHERRYVIEW(device->device_id))
+    printf(CHV_CONFIG_WARNING);
+#else
+  if (IS_CHERRYVIEW(device->device_id)) {
+#if defined(__ANDROID__)
+    device->sub_slice_count = 2;
+#else
+    printf(CHV_CONFIG_WARNING);
+#endif
+  }
+#endif
+
+#ifdef HAS_POOLED_EU
+  /* BXT pooled eu, 3*6 to 2*9, like sub slice count is 2 */
+  int has_pooled_eu;
+  if ((has_pooled_eu = drm_intel_get_pooled_eu(driver->fd)) > 0)
+    device->sub_slice_count = 2;
+
+#ifdef HAS_MIN_EU_IN_POOL
+  int min_eu;
+  /* for fused down 2x6 devices, beignet don't support. */
+  if (has_pooled_eu > 0 && (min_eu = drm_intel_get_min_eu_in_pool(driver->fd)) 
> 0) {
+    assert(min_eu == 9); //don't support fuse down device.
+  }
+#endif //HAS_MIN_EU_IN_POOL
+#endif //HAS_POOLED_EU
+  //We should get the device memory dynamically, but the
+  //mapablce mem size usage is unknown. Just ignore it.
+  size_t total_mem, map_mem;
+  if (drm_intel_get_aperture_sizes(driver->fd, &map_mem, &total_mem) == 0)
+    device->global_mem_size = (cl_ulong)total_mem;
+
+  intel_driver_context_destroy(driver);
+  intel_driver_close(driver);
+  intel_driver_terminate(driver);
+  intel_driver_delete(driver);
+}
+
+LOCAL void
+intel_setup_callbacks(void)
+{
+  cl_driver_new = (cl_driver_new_cb *)cl_intel_driver_new;
+  cl_driver_delete = (cl_driver_delete_cb *)cl_intel_driver_delete;
+  cl_driver_get_ver = (cl_driver_get_ver_cb *)intel_driver_get_ver;
+  cl_driver_enlarge_stack_size = (cl_driver_enlarge_stack_size_cb 
*)intel_driver_enlarge_stack_size;
+  cl_driver_set_atomic_flag = (cl_driver_set_atomic_flag_cb 
*)intel_driver_set_atomic_flag;
+  cl_driver_get_bufmgr = (cl_driver_get_bufmgr_cb *)intel_driver_get_bufmgr;
+  cl_driver_get_device_id = (cl_driver_get_device_id_cb *)intel_get_device_id;
+  cl_driver_update_device_info = (cl_driver_update_device_info_cb 
*)intel_update_device_info;
+  cl_buffer_alloc = (cl_buffer_alloc_cb *)drm_intel_bo_alloc;
+  cl_buffer_alloc_userptr = (cl_buffer_alloc_userptr_cb 
*)intel_buffer_alloc_userptr;
+#ifdef HAS_BO_SET_SOFTPIN
+  cl_buffer_set_softpin_offset = (cl_buffer_set_softpin_offset_cb 
*)drm_intel_bo_set_softpin_offset;
+  cl_buffer_set_bo_use_full_range = (cl_buffer_set_bo_use_full_range_cb 
*)drm_intel_bo_use_48b_address_range;
+#endif
+  cl_buffer_disable_reuse = (cl_buffer_disable_reuse_cb 
*)drm_intel_bo_disable_reuse;
+  cl_buffer_set_tiling = (cl_buffer_set_tiling_cb *)intel_buffer_set_tiling;
+#if defined(HAS_GL_EGL)
+  cl_buffer_alloc_from_texture = (cl_buffer_alloc_from_texture_cb 
*)intel_alloc_buffer_from_texture;
+  cl_buffer_release_from_texture = (cl_buffer_release_from_texture_cb 
*)intel_release_buffer_from_texture;
+#endif
+  cl_buffer_get_buffer_from_libva = (cl_buffer_get_buffer_from_libva_cb 
*)intel_share_buffer_from_libva;
+  cl_buffer_get_image_from_libva = (cl_buffer_get_image_from_libva_cb 
*)intel_share_image_from_libva;
+  cl_buffer_reference = (cl_buffer_reference_cb *)drm_intel_bo_reference;
+  cl_buffer_unreference = (cl_buffer_unreference_cb *)drm_intel_bo_unreference;
+  cl_buffer_map = (cl_buffer_map_cb *)drm_intel_bo_map;
+  cl_buffer_unmap = (cl_buffer_unmap_cb *)drm_intel_bo_unmap;
+  cl_buffer_map_gtt = (cl_buffer_map_gtt_cb *)drm_intel_gem_bo_map_gtt;
+  cl_buffer_unmap_gtt = (cl_buffer_unmap_gtt_cb *)drm_intel_gem_bo_unmap_gtt;
+  cl_buffer_map_gtt_unsync = (cl_buffer_map_gtt_unsync_cb 
*)drm_intel_gem_bo_map_unsynchronized;
+  cl_buffer_get_virtual = (cl_buffer_get_virtual_cb *)drm_intel_bo_get_virtual;
+  cl_buffer_get_size = (cl_buffer_get_size_cb *)drm_intel_bo_get_size;
+  cl_buffer_pin = (cl_buffer_pin_cb *)drm_intel_bo_pin;
+  cl_buffer_unpin = (cl_buffer_unpin_cb *)drm_intel_bo_unpin;
+  cl_buffer_subdata = (cl_buffer_subdata_cb *)drm_intel_bo_subdata;
+  cl_buffer_get_subdata = (cl_buffer_get_subdata_cb *)drm_intel_bo_get_subdata;
+  cl_buffer_wait_rendering = (cl_buffer_wait_rendering_cb 
*)drm_intel_bo_wait_rendering;
+  cl_buffer_get_fd = (cl_buffer_get_fd_cb *)drm_intel_bo_gem_export_to_prime;
+  cl_buffer_get_tiling_align = (cl_buffer_get_tiling_align_cb 
*)intel_buffer_get_tiling_align;
+  cl_buffer_get_buffer_from_fd = (cl_buffer_get_buffer_from_fd_cb 
*)intel_share_buffer_from_fd;
+  cl_buffer_get_image_from_fd = (cl_buffer_get_image_from_fd_cb 
*)intel_share_image_from_fd;
+  intel_set_gpgpu_callbacks(intel_get_device_id());
+}
diff --git a/src/gen/intel_driver.h b/src/gen/intel_driver.h
new file mode 100644
index 0000000..0b54689
--- /dev/null
+++ b/src/gen/intel_driver.h
@@ -0,0 +1,152 @@
+/* 
+ * Copyright © 2012 Intel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Benjamin Segovia <benjamin.sego...@intel.com>
+ */
+
+/*
+ * Copyright 2009 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+#ifndef _INTEL_DRIVER_H_
+#define _INTEL_DRIVER_H_
+
+#include "cl_device_data.h"
+
+#include <stdint.h>
+#include <pthread.h>
+#include <signal.h>
+
+#include <xf86drm.h>
+#include <drm.h>
+#include <i915_drm.h>
+#include <intel_bufmgr.h>
+#include <intel/intel_gpgpu.h>
+
+#define CMD_MI (0x0 << 29)
+#define CMD_2D (0x2 << 29)
+
+#define MI_NOOP (CMD_MI | 0)
+#define MI_BATCH_BUFFER_END (CMD_MI | (0xA << 23))
+
+#define XY_COLOR_BLT_CMD (CMD_2D | (0x50 << 22) | 0x04)
+#define XY_COLOR_BLT_WRITE_ALPHA (1 << 21)
+#define XY_COLOR_BLT_WRITE_RGB (1 << 20)
+#define XY_COLOR_BLT_DST_TILED (1 << 11)
+
+/* BR13 */
+#define BR13_565 (0x1 << 24)
+#define BR13_8888 (0x3 << 24)
+
+struct dri_state;
+struct intel_gpgpu_node;
+typedef struct _XDisplay Display;
+
+typedef struct intel_driver {
+  dri_bufmgr *bufmgr;
+  drm_intel_context *ctx;
+  drm_intel_bo *null_bo;
+  int fd;
+  int device_id;
+  int gen_ver;
+  sigset_t sa_mask;
+  pthread_mutex_t ctxmutex;
+  int locked;
+  int need_close;
+  Display *x11_display;
+  struct dri_state *dri_ctx;
+  struct intel_gpgpu_node *gpgpu_list;
+  int atomic_test_result;
+} intel_driver_t;
+
+#define SET_BLOCKED_SIGSET(DRIVER)                              \
+  do {                                                          \
+    sigset_t bl_mask;                                           \
+    sigfillset(&bl_mask);                                       \
+    sigdelset(&bl_mask, SIGFPE);                                \
+    sigdelset(&bl_mask, SIGILL);                                \
+    sigdelset(&bl_mask, SIGSEGV);                               \
+    sigdelset(&bl_mask, SIGBUS);                                \
+    sigdelset(&bl_mask, SIGKILL);                               \
+    pthread_sigmask(SIG_SETMASK, &bl_mask, &(DRIVER)->sa_mask); \
+  } while (0)
+
+#define RESTORE_BLOCKED_SIGSET(DRIVER)                      \
+  do {                                                      \
+    pthread_sigmask(SIG_SETMASK, &(DRIVER)->sa_mask, NULL); \
+  } while (0)
+
+#define PPTHREAD_MUTEX_LOCK(DRIVER)          \
+  do {                                       \
+    SET_BLOCKED_SIGSET(DRIVER);              \
+    pthread_mutex_lock(&(DRIVER)->ctxmutex); \
+  } while (0)
+
+#define PPTHREAD_MUTEX_UNLOCK(DRIVER)          \
+  do {                                         \
+    pthread_mutex_unlock(&(DRIVER)->ctxmutex); \
+    RESTORE_BLOCKED_SIGSET(DRIVER);            \
+  } while (0)
+
+/* device control */
+extern void intel_driver_lock_hardware(intel_driver_t *);
+extern void intel_driver_unlock_hardware(intel_driver_t *);
+
+/* methods working in shared mode */
+extern dri_bo *intel_driver_share_buffer(intel_driver_t *, const char *sname, 
uint32_t name);
+extern uint32_t intel_driver_shared_name(intel_driver_t *, dri_bo *);
+
+/* init driver shared with X using dri state, acquired from X Display */
+extern int intel_driver_init_shared(intel_driver_t *, struct dri_state *);
+
+/* init driver in master mode (when X is not using the card) 
+ * usually dev_name = "/dev/dri/card0"
+ */
+extern int intel_driver_init_master(intel_driver_t *, const char *dev_name);
+
+/* init driver for render node */
+extern int intel_driver_init_render(intel_driver_t *, const char *dev_name);
+
+/* terminate driver and all underlying structures */
+extern int intel_driver_terminate(intel_driver_t *);
+
+/* simple check if driver was initialized (checking fd should suffice) */
+extern int intel_driver_is_active(intel_driver_t *);
+
+/* init the call backs used by the ocl driver */
+extern void intel_setup_callbacks(void);
+
+#endif /* _INTEL_DRIVER_H_ */
diff --git a/src/intel/intel_driver.c b/src/intel/intel_driver.c
deleted file mode 100644
index 5f4a080..0000000
--- a/src/intel/intel_driver.c
+++ /dev/null
@@ -1,1042 +0,0 @@
-/* 
- * Copyright © 2012 Intel Corporation
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Benjamin Segovia <benjamin.sego...@intel.com>
- */
-
-/*
- * Copyright 2009 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Xiang Haihao <haihao.xi...@intel.com>
- *    Zou Nan hai <nanhai....@intel.com>
- *
- */
-
-#if defined(HAS_GL_EGL)
-#define EGL_EGLEXT_PROTOTYPES
-#include "GL/gl.h"
-#include "EGL/egl.h"
-#include <EGL/eglext.h>
-#endif
-
-#ifdef HAS_X11
-#include <X11/Xlibint.h>
-#include "x11/dricommon.h"
-#endif
-
-#include "intel_driver.h"
-#include "intel_gpgpu.h"
-#include "gen/intel_batchbuffer.h"
-#include "intel_bufmgr.h"
-#include "cl_mem.h"
-
-#include <assert.h>
-#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <xf86drm.h>
-#include <stdio.h>
-
-#include "cl_utils.h"
-#include "cl_alloc.h"
-#include "cl_context.h"
-#include "cl_driver.h"
-#include "cl_device_id.h"
-#include "cl_platform_id.h"
-
-static void
-intel_driver_delete(intel_driver_t *driver)
-{
-  if (driver == NULL)
-    return;
-
-  CL_FREE(driver);
-}
-
-static intel_driver_t*
-intel_driver_new(void)
-{
-  intel_driver_t *driver = NULL;
-
-  TRY_ALLOC_NO_ERR (driver, CL_CALLOC(1, sizeof(intel_driver_t)));
-  driver->fd = -1;
-
-exit:
-  return driver;
-error:
-intel_driver_delete(driver);
-driver = NULL;
-goto exit;
-}
-
-/* just used for maximum relocation number in drm_intel */
-#define BATCH_SIZE 0x4000
-
-/* set OCL_DUMP_AUB=1 to get aub file */
-static void
-intel_driver_aub_dump(intel_driver_t *driver)
-{
-char *val;
-val = getenv("OCL_DUMP_AUB");
-if (!val)
-  return;
-if (atoi(val) != 0) {
-  drm_intel_bufmgr_gem_set_aub_filename(driver->bufmgr,
-          "beignet.aub");
-  drm_intel_bufmgr_gem_set_aub_dump(driver->bufmgr, 1);
-}
-}
-
-static int
-intel_driver_memman_init(intel_driver_t *driver)
-{
-driver->bufmgr = drm_intel_bufmgr_gem_init(driver->fd, BATCH_SIZE);
-if (!driver->bufmgr) return 0;
-drm_intel_bufmgr_gem_enable_reuse(driver->bufmgr);
-driver->device_id = drm_intel_bufmgr_gem_get_devid(driver->bufmgr);
-intel_driver_aub_dump(driver);
-return 1;
-}
-
-static int
-intel_driver_context_init(intel_driver_t *driver)
-{
-driver->ctx = drm_intel_gem_context_create(driver->bufmgr);
-if (!driver->ctx)
-  return 0;
-driver->null_bo = NULL;
-#ifdef HAS_BO_SET_SOFTPIN
-drm_intel_bo *bo = dri_bo_alloc(driver->bufmgr, "null_bo", 64*1024, 4096);
-drm_intel_bo_set_softpin_offset(bo, 0);
-// don't reuse it, that would make two bo trying to bind to same address,
-// which is un-reasonable.
-drm_intel_bo_disable_reuse(bo);
-driver->null_bo = bo;
-#endif
-return 1;
-}
-
-static void
-intel_driver_context_destroy(intel_driver_t *driver)
-{
-if (driver->null_bo)
-  drm_intel_bo_unreference(driver->null_bo);
-if(driver->ctx)
-  drm_intel_gem_context_destroy(driver->ctx);
-driver->ctx = NULL;
-}
-
-static int
-intel_driver_init(intel_driver_t *driver, int dev_fd)
-{
-driver->fd = dev_fd;
-driver->locked = 0;
-pthread_mutex_init(&driver->ctxmutex, NULL);
-
-if (!intel_driver_memman_init(driver)) return 0;
-if (!intel_driver_context_init(driver)) return 0;
-
-#if EMULATE_GEN
-driver->gen_ver = EMULATE_GEN;
-if (EMULATE_GEN == 75)
-  driver->device_id = PCI_CHIP_HASWELL_L;       /* we pick L for HSW */
-else if (EMULATE_GEN == 7)
-  driver->device_id = PCI_CHIP_IVYBRIDGE_GT2; /* we pick GT2 for IVB */
-else if (EMULATE_GEN == 6)
-  driver->device_id = PCI_CHIP_SANDYBRIDGE_GT2; /* we pick GT2 for SNB */
-else
-  FATAL ("Unsupported Gen for emulation");
-#else
-if (IS_GEN9(driver->device_id))
-  driver->gen_ver = 9;
-else if (IS_GEN8(driver->device_id))
-  driver->gen_ver = 8;
-else if (IS_GEN75(driver->device_id))
-  driver->gen_ver = 75;
-else if (IS_GEN7(driver->device_id))
-  driver->gen_ver = 7;
-else if (IS_GEN6(driver->device_id))
-  driver->gen_ver = 6;
-else if(IS_IGDNG(driver->device_id))
-  driver->gen_ver = 5;
-else
-  driver->gen_ver = 4;
-#endif /* EMULATE_GEN */
-return 1;
-}
-
-static cl_int
-intel_driver_open(intel_driver_t *intel, cl_context_prop props)
-{
-int cardi;
-#ifdef HAS_X11
-char *driver_name;
-#endif
-if (props != NULL
-    && props->gl_type != CL_GL_NOSHARE
-    && props->gl_type != CL_GL_GLX_DISPLAY
-    && props->gl_type != CL_GL_EGL_DISPLAY) {
-  fprintf(stderr, "Unsupported gl share type %d.\n", props->gl_type);
-  return CL_INVALID_OPERATION;
-}
-
-#ifdef HAS_X11
-intel->x11_display = XOpenDisplay(NULL);
-
-if(intel->x11_display) {
-  if((intel->dri_ctx = getDRI2State(intel->x11_display,
-                                   DefaultScreen(intel->x11_display),
-                                   &driver_name))) {
-    intel_driver_init_shared(intel, intel->dri_ctx);
-    Xfree(driver_name);
-  }
-  else
-    fprintf(stderr, "X server found. dri2 connection failed! \n");
-}
-#endif
-
-if(!intel_driver_is_active(intel)) {
-  char card_name[20];
-  for(cardi = 0; cardi < 16; cardi++) {
-    sprintf(card_name, "/dev/dri/renderD%d", 128+cardi);
-    if (access(card_name, R_OK) != 0)
-      continue;
-    if(intel_driver_init_render(intel, card_name))
-      break;
-  }
-}
-
-if(!intel_driver_is_active(intel)) {
-  char card_name[20];
-  for(cardi = 0; cardi < 16; cardi++) {
-    sprintf(card_name, "/dev/dri/card%d", cardi);
-    if (access(card_name, R_OK) != 0)
-      continue;
-    if(intel_driver_init_master(intel, card_name))
-      break;
-  }
-}
-
-if(!intel_driver_is_active(intel)) {
-  fprintf(stderr, "Device open failed, aborting...\n");
-  return CL_DEVICE_NOT_FOUND;
-}
-
-#ifdef HAS_GL_EGL
-if (props && props->gl_type == CL_GL_EGL_DISPLAY) {
-  assert(props->egl_display);
-}
-#endif
-return CL_SUCCESS;
-}
-
-static void
-intel_driver_close(intel_driver_t *intel)
-{
-//Due to the drm change about the test usrptr, we need to destroy the bufmgr
-//befor the driver was closed, otherwise the test usrptr will not be freed.
-if (intel->bufmgr)
-  drm_intel_bufmgr_destroy(intel->bufmgr);
-#ifdef HAS_X11
-if(intel->dri_ctx) dri_state_release(intel->dri_ctx);
-if(intel->x11_display) XCloseDisplay(intel->x11_display);
-#endif
-if(intel->need_close) {
-  close(intel->fd);
-  intel->need_close = 0;
-}
-intel->dri_ctx = NULL;
-intel->x11_display = NULL;
-intel->fd = -1;
-}
-
-LOCAL int
-intel_driver_is_active(intel_driver_t *driver) {
-return driver->fd >= 0;
-}
-
-#ifdef HAS_X11
-LOCAL int 
-intel_driver_init_shared(intel_driver_t *driver, dri_state_t *state)
-{
-int ret;
-assert(state);
-if(state->driConnectedFlag != DRI2)
-  return 0;
-ret = intel_driver_init(driver, state->fd);
-driver->need_close = 0;
-return ret;
-}
-#endif
-
-LOCAL int
-intel_driver_init_master(intel_driver_t *driver, const char* dev_name)
-{
-int dev_fd, ret;
-
-drm_client_t client;
-
-// usually dev_name = "/dev/dri/card%d"
-dev_fd = open(dev_name, O_RDWR);
-if (dev_fd == -1) {
-  fprintf(stderr, "open(\"%s\", O_RDWR) failed: %s\n", dev_name, 
strerror(errno));
-  return 0;
-}
-
-// Check that we're authenticated
-memset(&client, 0, sizeof(drm_client_t));
-ret = ioctl(dev_fd, DRM_IOCTL_GET_CLIENT, &client);
-if (ret == -1) {
-  fprintf(stderr, "ioctl(dev_fd, DRM_IOCTL_GET_CLIENT, &client) failed: %s\n", 
strerror(errno));
-  close(dev_fd);
-  return 0;
-}
-
-if (!client.auth) {
-  fprintf(stderr, "%s not authenticated\n", dev_name);
-  close(dev_fd);
-  return 0;
-}
-
-ret = intel_driver_init(driver, dev_fd);
-driver->need_close = 1;
-
-return ret;
-}
-
-LOCAL int
-intel_driver_init_render(intel_driver_t *driver, const char* dev_name)
-{
-int dev_fd, ret;
-
-dev_fd = open(dev_name, O_RDWR);
-if (dev_fd == -1)
-  return 0;
-
-ret = intel_driver_init(driver, dev_fd);
-driver->need_close = 1;
-
-return ret;
-}
-
-LOCAL int 
-intel_driver_terminate(intel_driver_t *driver)
-{
-pthread_mutex_destroy(&driver->ctxmutex);
-
-if(driver->need_close) {
-  close(driver->fd);
-  driver->need_close = 0;
-}
-driver->fd = -1;
-return 1;
-}
-
-LOCAL void
-intel_driver_lock_hardware(intel_driver_t *driver)
-{
-
-PPTHREAD_MUTEX_LOCK(driver);
-assert(!driver->locked);
-driver->locked = 1;
-}
-
-LOCAL void 
-intel_driver_unlock_hardware(intel_driver_t *driver)
-{
-driver->locked = 0;
-PPTHREAD_MUTEX_UNLOCK(driver);
-}
-
-LOCAL dri_bo*
-intel_driver_share_buffer_from_name(intel_driver_t *driver, const char *sname, 
uint32_t name)
-{
-dri_bo *bo = intel_bo_gem_create_from_name(driver->bufmgr,
-                                           sname,
-                                           name);
-if (bo == NULL) {
-  fprintf(stderr, "intel_bo_gem_create_from_name create \"%s\" bo from name %d 
failed: %s\n", sname, name, strerror(errno));
-  return NULL;
-}
-return bo;
-}
-
-LOCAL dri_bo*
-intel_driver_share_buffer_from_fd(intel_driver_t *driver, int fd, int size)
-{
-dri_bo *bo = drm_intel_bo_gem_create_from_prime(driver->bufmgr,
-                                                fd,
-                                                size);
-if (bo == NULL) {
-  fprintf(stderr, "drm_intel_bo_gem_create_from_prime create bo(size %d) from 
fd %d failed: %s\n", size, fd, strerror(errno));
-  return NULL;
-}
-return bo;
-}
-
-LOCAL uint32_t
-intel_driver_shared_name(intel_driver_t *driver, dri_bo *bo)
-{
-uint32_t name;
-assert(bo);
-dri_bo_flink(bo, &name);
-return name;
-}
-/* XXX a null props is ok? */
-static int
-intel_get_device_id(void)
-{
-intel_driver_t *driver = NULL;
-int intel_device_id;
-
-driver = intel_driver_new();
-assert(driver != NULL);
-if(UNLIKELY(intel_driver_open(driver, NULL) != CL_SUCCESS)) return 
INVALID_CHIP_ID;
-intel_device_id = driver->device_id;
-intel_driver_context_destroy(driver);
-intel_driver_close(driver);
-intel_driver_terminate(driver);
-intel_driver_delete(driver);
-
-return intel_device_id;
-}
-
-extern void intel_gpgpu_delete_all(intel_driver_t *driver);
-static void
-cl_intel_driver_delete(intel_driver_t *driver)
-{
-if (driver == NULL)
-  return;
-intel_gpgpu_delete_all(driver);
-intel_driver_context_destroy(driver);
-intel_driver_close(driver);
-intel_driver_terminate(driver);
-intel_driver_delete(driver);
-}
-
-#include "cl_gbe_loader.h"
-static intel_driver_t*
-cl_intel_driver_new(cl_context_prop props)
-{
-intel_driver_t *driver = NULL;
-TRY_ALLOC_NO_ERR (driver, intel_driver_new());
-if(UNLIKELY(intel_driver_open(driver, props) != CL_SUCCESS)) goto error;
-exit:
-return driver;
-error:
-cl_intel_driver_delete(driver);
-driver = NULL;
-goto exit;
-}
-
-static drm_intel_bufmgr*
-intel_driver_get_bufmgr(intel_driver_t *drv)
-{
-return drv->bufmgr;
-}
-
-static uint32_t
-intel_driver_get_ver(struct intel_driver *drv)
-{
-return drv->gen_ver;
-}
-
-static void
-intel_driver_enlarge_stack_size(struct intel_driver *drv, int32_t *stack_size)
-{
-  if (drv->gen_ver == 75)
-    *stack_size = *stack_size * 4;
-  else if (drv->device_id == PCI_CHIP_BROXTON_1 || drv->device_id == 
PCI_CHIP_BROXTON_3 ||
-           IS_CHERRYVIEW(drv->device_id))
-    *stack_size = *stack_size * 2;
-}
-
-static void
-intel_driver_set_atomic_flag(intel_driver_t *drv, int atomic_flag)
-{
-drv->atomic_test_result = atomic_flag;
-}
-
-static size_t drm_intel_bo_get_size(drm_intel_bo *bo) { return bo->size; }
-static void* drm_intel_bo_get_virtual(drm_intel_bo *bo) { return bo->virtual; }
-
-static int get_cl_tiling(uint32_t drm_tiling)
-{
-switch(drm_tiling) {
-case I915_TILING_X: return CL_TILE_X;
-case I915_TILING_Y: return CL_TILE_Y;
-case I915_TILING_NONE: return CL_NO_TILE;
-default:
-  assert(0);
-}
-return CL_NO_TILE;
-}
-
-static uint32_t intel_buffer_get_tiling_align(cl_context ctx, uint32_t 
tiling_mode, uint32_t dim)
-{
-uint32_t gen_ver = ((intel_driver_t *)ctx->drv)->gen_ver;
-uint32_t ret = 0;
-
-switch (tiling_mode) {
-case CL_TILE_X:
-  if (dim == 0) { //tileX width in bytes
-    ret = 512;
-  } else if (dim == 1) { //tileX height in number of rows
-    ret = 8;
-  }  else if (dim == 2) { //height to calculate slice pitch
-    if (gen_ver == 9) //SKL same as tileY height
-      ret = 8;
-    else if (gen_ver == 8)  //IVB, HSW, BDW same as CL_NO_TILE vertical 
alignment
-      ret = 4;
-    else
-      ret = 2;
-  } else
-    assert(0);
-  break;
-
-case CL_TILE_Y:
-  if (dim == 0) { //tileY width in bytes
-    ret = 128;
-  } else if (dim == 1) { //tileY height in number of rows
-    ret = 32;
-  } else if (dim == 2) { //height to calculate slice pitch
-    if (gen_ver == 9) //SKL same as tileY height
-      ret = 32;
-    else if (gen_ver == 8) //IVB, HSW, BDW same as CL_NO_TILE vertical 
alignment
-      ret = 4;
-    else
-      ret = 2;
-  } else
-    assert(0);
-  break;
-
-case CL_NO_TILE:
-  if (dim == 1 || dim == 2) { //vertical alignment
-    if (gen_ver == 8 || gen_ver == 9) //SKL 1D array need 4 alignment qpitch
-      ret = 4;
-    else
-      ret = 2;
-  } else
-    assert(0);
-  break;
-}
-
-return ret;
-}
-
-#if defined(HAS_GL_EGL)
-#include "intel_cl_gl_share_image_info.h"
-#include "cl_image.h"
-
-static PFNEGLEXPORTDMABUFIMAGEMESAPROC eglExportDMABUFImageMESA_func = NULL;
-
-static int
-get_required_egl_extensions(){
-
-if(eglExportDMABUFImageMESA_func == NULL){
-  eglExportDMABUFImageMESA_func =  (PFNEGLEXPORTDMABUFIMAGEMESAPROC) 
eglGetProcAddress("eglExportDMABUFImageMESA");
-  if(eglExportDMABUFImageMESA_func == NULL){
-    fprintf(stderr, "Failed to get EGL extension function 
eglExportDMABUFImageMESA\n");
-    return -1;
-  }
-}
-return 0;
-}
-
-
-static int cl_get_clformat_from_texture(GLint tex_format, cl_image_format * 
cl_format)
-{
-cl_int ret = CL_SUCCESS;
-
-switch (tex_format) {
-case GL_RGBA8:
-case GL_RGBA:
-case GL_RGBA16:
-case GL_RGBA8I:
-case GL_RGBA16I:
-case GL_RGBA32I:
-case GL_RGBA8UI:
-case GL_RGBA16UI:
-case GL_RGBA32UI:
-case GL_RGBA16F:
-case GL_RGBA32F:
-  cl_format->image_channel_order = CL_RGBA;
-  break;
-case GL_BGRA:
-  cl_format->image_channel_order = CL_BGRA;
-  break;
-default:
-  ret = -1;
-  goto error;
-}
-
-switch (tex_format) {
-case GL_RGBA8:
-case GL_RGBA:
-case GL_BGRA:
-  cl_format->image_channel_data_type = CL_UNORM_INT8;
-  break;
-case GL_RGBA16:
-  cl_format->image_channel_data_type = CL_UNORM_INT16;
-  break;
-case GL_RGBA8I:
-  cl_format->image_channel_data_type = CL_SIGNED_INT8;
-  break;
-case GL_RGBA16I:
-  cl_format->image_channel_data_type = CL_SIGNED_INT16;
-  break;
-case GL_RGBA32I:
-  cl_format->image_channel_data_type = CL_SIGNED_INT32;
-  break;
-case GL_RGBA8UI:
-  cl_format->image_channel_data_type = CL_UNSIGNED_INT8;
-  break;
-case GL_RGBA16UI:
-  cl_format->image_channel_data_type = CL_UNSIGNED_INT16;
-  break;
-case GL_RGBA32UI:
-  cl_format->image_channel_data_type = CL_UNSIGNED_INT32;
-  break;
-case GL_RGBA16F:
-  cl_format->image_channel_data_type = CL_HALF_FLOAT;
-  break;
-case GL_RGBA32F:
-  cl_format->image_channel_order = CL_FLOAT;
-  break;
-default:
-  ret = -1;
-  goto error;
-}
-
-error:
-return ret;
-}
-
-static int
-get_mem_type_from_target(GLenum texture_target, cl_mem_object_type *type)
-{
-switch(texture_target) {
-case GL_TEXTURE_1D: *type = CL_MEM_OBJECT_IMAGE1D; break;
-case GL_TEXTURE_2D: *type = CL_MEM_OBJECT_IMAGE2D; break;
-case GL_TEXTURE_3D: *type = CL_MEM_OBJECT_IMAGE3D; break;
-case GL_TEXTURE_1D_ARRAY: *type = CL_MEM_OBJECT_IMAGE1D_ARRAY; break;
-case GL_TEXTURE_2D_ARRAY: *type = CL_MEM_OBJECT_IMAGE2D_ARRAY; break;
-default:
-  return -1;
-}
-return CL_SUCCESS;
-}
-
-static cl_buffer
-intel_alloc_buffer_from_texture_egl(cl_context ctx, unsigned int target,
-                                  int miplevel, unsigned int texture,
-                                  struct _cl_mem_image *image)
-{
-drm_intel_bo *intel_bo = NULL;
-struct _intel_cl_gl_share_image_info info;
-unsigned int bpp, intel_fmt;
-cl_image_format cl_format;
-EGLBoolean ret;
-
-EGLenum e_target;
-//We just support GL_TEXTURE_2D because we can't query info like slice_pitch 
now.
-if(target == GL_TEXTURE_2D)
-  e_target = EGL_GL_TEXTURE_2D;
-else
-  return NULL;
-
-if(get_required_egl_extensions() != 0)
-  return NULL;
-
-EGLAttrib attrib_list[] = {EGL_GL_TEXTURE_LEVEL, miplevel,
-                          EGL_NONE};
-EGLImage e_image = eglCreateImage(EGL_DISP(ctx), EGL_CTX(ctx), e_target,
-                                  (EGLClientBuffer)texture, &attrib_list[0]);
-if(e_image == EGL_NO_IMAGE)
-  return NULL;
-
-int fd, stride, offset;
-ret = eglExportDMABUFImageMESA_func(EGL_DISP(ctx), e_image, &fd, &stride, 
&offset);
-if(ret != EGL_TRUE){
-  eglDestroyImage(EGL_DISP(ctx), e_image);
-  return NULL;
-}
-info.fd = fd;
-
-/* The size argument just takes effect in intel_driver_share_buffer_from_fd 
when
- * Linux kernel is older than 3.12, so it doesn't matter we set to 0 here.
- */
-int size = 0;
-intel_bo = intel_driver_share_buffer_from_fd((intel_driver_t *)ctx->drv, fd, 
size);
-
-if (intel_bo == NULL) {
-  eglDestroyImage(EGL_DISP(ctx), e_image);
-  return NULL;
-}
-
-GLint param_value;
-glGetTexLevelParameteriv(target, miplevel, GL_TEXTURE_WIDTH, &param_value);
-info.w = param_value;
-glGetTexLevelParameteriv(target, miplevel, GL_TEXTURE_HEIGHT, &param_value);
-info.h = param_value;
-glGetTexLevelParameteriv(target, miplevel, GL_TEXTURE_DEPTH, &param_value);
-info.depth = 1;
-info.pitch = stride;
-uint32_t tiling_mode, swizzle_mode;
-drm_intel_bo_get_tiling(intel_bo, &tiling_mode, &swizzle_mode);
-info.offset = offset;
-info.tile_x = 0;
-info.tile_y = 0;
-glGetTexLevelParameteriv(target, miplevel, GL_TEXTURE_INTERNAL_FORMAT, 
&param_value);
-info.gl_format = param_value;
-info.row_pitch = stride;
-info.slice_pitch = 0;
-
-info.tiling = get_cl_tiling(tiling_mode);
-if (cl_get_clformat_from_texture(info.gl_format, &cl_format) != 0)
-  goto error;
-
-if (cl_image_byte_per_pixel(&cl_format, &bpp) != CL_SUCCESS)
-  goto error;
-intel_fmt = cl_image_get_intel_format(&cl_format);
-if (intel_fmt == INTEL_UNSUPPORTED_FORMAT)
-  goto error;
-cl_mem_object_type image_type;
-if (get_mem_type_from_target(target, &image_type) != 0)
-  goto error;
-
-cl_mem_image_init(image, info.w, info.h,
-                  image_type, info.depth, cl_format,
-                  intel_fmt, bpp, info.row_pitch,
-                  info.slice_pitch, info.tiling,
-                  info.tile_x, info.tile_y, info.offset);
-
-struct _cl_mem_gl_image *gl_image = (struct _cl_mem_gl_image*)image;
-gl_image->fd = fd;
-gl_image->egl_image = e_image;
-
-return (cl_buffer) intel_bo;
-
-error:
-drm_intel_bo_unreference(intel_bo);
-close(fd);
-eglDestroyImage(EGL_DISP(ctx), e_image);
-return NULL;
-}
-
-static cl_buffer
-intel_alloc_buffer_from_texture(cl_context ctx, unsigned int target,
-                              int miplevel, unsigned int texture,
-                              struct _cl_mem_image *image)
-{
-
-if (IS_EGL_CONTEXT(ctx))
-  return intel_alloc_buffer_from_texture_egl(ctx, target, miplevel, texture, 
image);
-
-return NULL;
-}
-
-static int
-intel_release_buffer_from_texture(cl_context ctx, struct _cl_mem_gl_image 
*gl_image)
-{
-if (IS_EGL_CONTEXT(ctx)) {
-  close(gl_image->fd);
-  eglDestroyImage(EGL_DISP(ctx), gl_image->egl_image);
-  return CL_SUCCESS;
-}
-return -1;
-}
-#endif
-
-cl_buffer intel_share_buffer_from_libva(cl_context ctx,
-                                      unsigned int bo_name,
-                                      size_t *sz)
-{
-drm_intel_bo *intel_bo;
-
-intel_bo = intel_driver_share_buffer_from_name((intel_driver_t *)ctx->drv, 
"shared from libva", bo_name);
-
-if (intel_bo == NULL)
-  return NULL;
-
-if (sz)
-  *sz = intel_bo->size;
-
-return (cl_buffer)intel_bo;
-}
-
-cl_buffer intel_share_image_from_libva(cl_context ctx,
-                                     unsigned int bo_name,
-                                     struct _cl_mem_image *image)
-{
-drm_intel_bo *intel_bo;
-uint32_t intel_tiling, intel_swizzle_mode;
-
-intel_bo = intel_driver_share_buffer_from_name((intel_driver_t *)ctx->drv, 
"shared from libva", bo_name);
-
-if (intel_bo == NULL)
-  return NULL;
-
-drm_intel_bo_get_tiling(intel_bo, &intel_tiling, &intel_swizzle_mode);
-image->tiling = get_cl_tiling(intel_tiling);
-
-return (cl_buffer)intel_bo;
-}
-
-cl_buffer intel_share_buffer_from_fd(cl_context ctx,
-                                   int fd,
-                                   int buffer_size)
-{
-drm_intel_bo *intel_bo;
-
-intel_bo = intel_driver_share_buffer_from_fd((intel_driver_t *)ctx->drv, fd, 
buffer_size);
-
-if (intel_bo == NULL)
-  return NULL;
-
-return (cl_buffer)intel_bo;
-}
-
-cl_buffer intel_share_image_from_fd(cl_context ctx,
-                                  int fd,
-                                  int image_size,
-                                  struct _cl_mem_image *image)
-{
-drm_intel_bo *intel_bo;
-uint32_t intel_tiling, intel_swizzle_mode;
-
-intel_bo = intel_driver_share_buffer_from_fd((intel_driver_t *)ctx->drv, fd, 
image_size);
-
-if (intel_bo == NULL)
-  return NULL;
-
-drm_intel_bo_get_tiling(intel_bo, &intel_tiling, &intel_swizzle_mode);
-image->tiling = get_cl_tiling(intel_tiling);
-
-return (cl_buffer)intel_bo;
-}
-
-static cl_buffer intel_buffer_alloc_userptr(cl_buffer_mgr bufmgr, const char* 
name, void *data,size_t size, unsigned long flags)
-{
-#ifdef HAS_USERPTR
-drm_intel_bo *bo;
-bo = drm_intel_bo_alloc_userptr((drm_intel_bufmgr *)bufmgr, name, data, 
I915_TILING_NONE, 0, size, flags);
-/* Fallback to unsynchronized userptr allocation if kernel has no MMU notifier 
enabled. */
-if (bo == NULL)
-  bo = drm_intel_bo_alloc_userptr((drm_intel_bufmgr *)bufmgr, name, data, 
I915_TILING_NONE, 0, size, flags | I915_USERPTR_UNSYNCHRONIZED);
-return (cl_buffer)bo;
-#else
-return NULL;
-#endif
-}
-
-static int32_t get_intel_tiling(cl_int tiling, uint32_t *intel_tiling)
-{
-switch (tiling) {
-  case CL_NO_TILE:
-    *intel_tiling = I915_TILING_NONE;
-    break;
-  case CL_TILE_X:
-    *intel_tiling = I915_TILING_X;
-    break;
-  case CL_TILE_Y:
-    *intel_tiling = I915_TILING_Y;
-    break;
-  default:
-    assert(0);
-    return -1;
-}
-return 0;
-}
-
-static int intel_buffer_set_tiling(cl_buffer bo,
-                                 cl_image_tiling_t tiling, size_t stride)
-{
-uint32_t intel_tiling;
-int ret;
-if (UNLIKELY((get_intel_tiling(tiling, &intel_tiling)) < 0))
-  return -1;
-#ifndef NDEBUG
-uint32_t required_tiling;
-required_tiling = intel_tiling;
-#endif
-ret = drm_intel_bo_set_tiling((drm_intel_bo*)bo, &intel_tiling, stride);
-assert(intel_tiling == required_tiling);
-return ret;
-}
-
-#define CHV_CONFIG_WARNING \
-      "Warning: can't get GPU's configurations, will use the minimal one. 
Please update your drm to 2.4.59+ and linux kernel to 4.0.0+.\n"
-static void
-intel_update_device_info(cl_device_id device)
-{
-intel_driver_t *driver;
-
-driver = intel_driver_new();
-assert(driver != NULL);
-if (intel_driver_open(driver, NULL) != CL_SUCCESS) {
-  intel_driver_delete(driver);
-  return;
-}
-
-#ifdef HAS_USERPTR
-const size_t sz = 4096;
-void *host_ptr;
-
-host_ptr = CL_MEMALIGN(sz, 4096);
-if (host_ptr != NULL) {
-  cl_buffer bo = intel_buffer_alloc_userptr((cl_buffer_mgr)driver->bufmgr,
-    "CL memory object", host_ptr, sz, 0);
-  if (bo == NULL)
-    device->host_unified_memory = CL_FALSE;
-  else
-    drm_intel_bo_unreference((drm_intel_bo*)bo);
-  CL_FREE(host_ptr);
-}
-else
-  device->host_unified_memory = CL_FALSE;
-#endif
-
-#ifdef HAS_EU_TOTAL
-unsigned int eu_total;
-
-/* Prefer driver-queried max compute units if supported */
-if (!drm_intel_get_eu_total(driver->fd, &eu_total))
-  device->max_compute_unit = eu_total;
-else if (IS_CHERRYVIEW(device->device_id))
-  printf(CHV_CONFIG_WARNING);
-#else
-if (IS_CHERRYVIEW(device->device_id)) {
-#if defined(__ANDROID__)
-  device->max_compute_unit = 12;
-#else
-  printf(CHV_CONFIG_WARNING);
-#endif
-}
-#endif
-
-#ifdef HAS_SUBSLICE_TOTAL
-unsigned int subslice_total;
-
-/* Prefer driver-queried subslice count if supported */
-if (!drm_intel_get_subslice_total(driver->fd, &subslice_total))
-  device->sub_slice_count = subslice_total;
-else if (IS_CHERRYVIEW(device->device_id))
-  printf(CHV_CONFIG_WARNING);
-#else
-if (IS_CHERRYVIEW(device->device_id)) {
-#if defined(__ANDROID__)
-  device->sub_slice_count = 2;
-#else
-  printf(CHV_CONFIG_WARNING);
-#endif
-}
-#endif
-
-#ifdef HAS_POOLED_EU
-/* BXT pooled eu, 3*6 to 2*9, like sub slice count is 2 */
-int has_pooled_eu;
-if((has_pooled_eu = drm_intel_get_pooled_eu(driver->fd)) > 0)
-  device->sub_slice_count = 2;
-
-#ifdef HAS_MIN_EU_IN_POOL
-int min_eu;
-/* for fused down 2x6 devices, beignet don't support. */
-if (has_pooled_eu > 0 && (min_eu = drm_intel_get_min_eu_in_pool(driver->fd)) > 
0) {
-  assert(min_eu == 9); //don't support fuse down device.
-}
-#endif //HAS_MIN_EU_IN_POOL
-#endif //HAS_POOLED_EU
-//We should get the device memory dynamically, but the
-//mapablce mem size usage is unknown. Just ignore it.
-size_t total_mem,map_mem;
-if(drm_intel_get_aperture_sizes(driver->fd,&map_mem,&total_mem) == 0)
-  device->global_mem_size = (cl_ulong)total_mem;
-
-intel_driver_context_destroy(driver);
-intel_driver_close(driver);
-intel_driver_terminate(driver);
-intel_driver_delete(driver);
-}
-
-LOCAL void
-intel_setup_callbacks(void)
-{
-cl_driver_new = (cl_driver_new_cb *) cl_intel_driver_new;
-cl_driver_delete = (cl_driver_delete_cb *) cl_intel_driver_delete;
-cl_driver_get_ver = (cl_driver_get_ver_cb *) intel_driver_get_ver;
-cl_driver_enlarge_stack_size = (cl_driver_enlarge_stack_size_cb *) 
intel_driver_enlarge_stack_size;
-cl_driver_set_atomic_flag = (cl_driver_set_atomic_flag_cb *) 
intel_driver_set_atomic_flag;
-cl_driver_get_bufmgr = (cl_driver_get_bufmgr_cb *) intel_driver_get_bufmgr;
-cl_driver_get_device_id = (cl_driver_get_device_id_cb *) intel_get_device_id;
-cl_driver_update_device_info = (cl_driver_update_device_info_cb *) 
intel_update_device_info;
-cl_buffer_alloc = (cl_buffer_alloc_cb *) drm_intel_bo_alloc;
-cl_buffer_alloc_userptr = (cl_buffer_alloc_userptr_cb*) 
intel_buffer_alloc_userptr;
-#ifdef HAS_BO_SET_SOFTPIN
-cl_buffer_set_softpin_offset = (cl_buffer_set_softpin_offset_cb *) 
drm_intel_bo_set_softpin_offset;
-cl_buffer_set_bo_use_full_range = (cl_buffer_set_bo_use_full_range_cb *) 
drm_intel_bo_use_48b_address_range;
-#endif
-  cl_buffer_disable_reuse = (cl_buffer_disable_reuse_cb *) 
drm_intel_bo_disable_reuse;
-  cl_buffer_set_tiling = (cl_buffer_set_tiling_cb *) intel_buffer_set_tiling;
-#if defined(HAS_GL_EGL)
-  cl_buffer_alloc_from_texture = (cl_buffer_alloc_from_texture_cb *) 
intel_alloc_buffer_from_texture;
-  cl_buffer_release_from_texture = (cl_buffer_release_from_texture_cb *) 
intel_release_buffer_from_texture;
-#endif
-  cl_buffer_get_buffer_from_libva = (cl_buffer_get_buffer_from_libva_cb *) 
intel_share_buffer_from_libva;
-  cl_buffer_get_image_from_libva = (cl_buffer_get_image_from_libva_cb *) 
intel_share_image_from_libva;
-  cl_buffer_reference = (cl_buffer_reference_cb *) drm_intel_bo_reference;
-  cl_buffer_unreference = (cl_buffer_unreference_cb *) 
drm_intel_bo_unreference;
-  cl_buffer_map = (cl_buffer_map_cb *) drm_intel_bo_map;
-  cl_buffer_unmap = (cl_buffer_unmap_cb *) drm_intel_bo_unmap;
-  cl_buffer_map_gtt = (cl_buffer_map_gtt_cb *) drm_intel_gem_bo_map_gtt;
-  cl_buffer_unmap_gtt = (cl_buffer_unmap_gtt_cb *) drm_intel_gem_bo_unmap_gtt;
-  cl_buffer_map_gtt_unsync = (cl_buffer_map_gtt_unsync_cb *) 
drm_intel_gem_bo_map_unsynchronized;
-  cl_buffer_get_virtual = (cl_buffer_get_virtual_cb *) 
drm_intel_bo_get_virtual;
-  cl_buffer_get_size = (cl_buffer_get_size_cb *) drm_intel_bo_get_size;
-  cl_buffer_pin = (cl_buffer_pin_cb *) drm_intel_bo_pin;
-  cl_buffer_unpin = (cl_buffer_unpin_cb *) drm_intel_bo_unpin;
-  cl_buffer_subdata = (cl_buffer_subdata_cb *) drm_intel_bo_subdata;
-  cl_buffer_get_subdata = (cl_buffer_get_subdata_cb *) 
drm_intel_bo_get_subdata;
-  cl_buffer_wait_rendering = (cl_buffer_wait_rendering_cb *) 
drm_intel_bo_wait_rendering;
-  cl_buffer_get_fd = (cl_buffer_get_fd_cb *) drm_intel_bo_gem_export_to_prime;
-  cl_buffer_get_tiling_align = (cl_buffer_get_tiling_align_cb 
*)intel_buffer_get_tiling_align;
-  cl_buffer_get_buffer_from_fd = (cl_buffer_get_buffer_from_fd_cb *) 
intel_share_buffer_from_fd;
-  cl_buffer_get_image_from_fd = (cl_buffer_get_image_from_fd_cb *) 
intel_share_image_from_fd;
-  intel_set_gpgpu_callbacks(intel_get_device_id());
-}
diff --git a/src/intel/intel_driver.h b/src/intel/intel_driver.h
deleted file mode 100644
index 3be93c2..0000000
--- a/src/intel/intel_driver.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/* 
- * Copyright © 2012 Intel Corporation
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Benjamin Segovia <benjamin.sego...@intel.com>
- */
-
-/*
- * Copyright 2009 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-#ifndef _INTEL_DRIVER_H_
-#define _INTEL_DRIVER_H_
-
-#include "cl_device_data.h"
-
-#include <stdint.h>
-#include <pthread.h>
-#include <signal.h>
-
-#include <xf86drm.h>
-#include <drm.h>
-#include <i915_drm.h>
-#include <intel_bufmgr.h>
-#include <intel/intel_gpgpu.h>
-
-#define CMD_MI                                  (0x0 << 29)
-#define CMD_2D                                  (0x2 << 29)
-
-#define MI_NOOP                                 (CMD_MI | 0)
-#define MI_BATCH_BUFFER_END                     (CMD_MI | (0xA << 23))
-
-#define XY_COLOR_BLT_CMD                        (CMD_2D | (0x50 << 22) | 0x04)
-#define XY_COLOR_BLT_WRITE_ALPHA                (1 << 21)
-#define XY_COLOR_BLT_WRITE_RGB                  (1 << 20)
-#define XY_COLOR_BLT_DST_TILED                  (1 << 11)
-
-/* BR13 */
-#define BR13_565                                (0x1 << 24)
-#define BR13_8888                               (0x3 << 24)
-
-struct dri_state;
-struct intel_gpgpu_node;
-typedef struct _XDisplay Display;
-
-typedef struct intel_driver
-{
-  dri_bufmgr *bufmgr;
-  drm_intel_context *ctx;
-  drm_intel_bo *null_bo;
-  int fd;
-  int device_id;
-  int gen_ver;
-  sigset_t sa_mask;
-  pthread_mutex_t ctxmutex;
-  int locked;
-  int need_close;
-  Display *x11_display;
-  struct dri_state *dri_ctx;
-  struct intel_gpgpu_node *gpgpu_list;
-  int atomic_test_result;
-} intel_driver_t;
-
-#define SET_BLOCKED_SIGSET(DRIVER)   do {                     \
-  sigset_t bl_mask;                                           \
-  sigfillset(&bl_mask);                                       \
-  sigdelset(&bl_mask, SIGFPE);                                \
-  sigdelset(&bl_mask, SIGILL);                                \
-  sigdelset(&bl_mask, SIGSEGV);                               \
-  sigdelset(&bl_mask, SIGBUS);                                \
-  sigdelset(&bl_mask, SIGKILL);                               \
-  pthread_sigmask(SIG_SETMASK, &bl_mask, &(DRIVER)->sa_mask); \
-} while (0)
-
-#define RESTORE_BLOCKED_SIGSET(DRIVER) do {                   \
-  pthread_sigmask(SIG_SETMASK, &(DRIVER)->sa_mask, NULL);     \
-} while (0)
-
-#define PPTHREAD_MUTEX_LOCK(DRIVER) do {                      \
-  SET_BLOCKED_SIGSET(DRIVER);                                 \
-  pthread_mutex_lock(&(DRIVER)->ctxmutex);                    \
-} while (0)
-
-#define PPTHREAD_MUTEX_UNLOCK(DRIVER) do {                    \
-  pthread_mutex_unlock(&(DRIVER)->ctxmutex);                  \
-  RESTORE_BLOCKED_SIGSET(DRIVER);                             \
-} while (0)
-
-/* device control */
-extern void intel_driver_lock_hardware(intel_driver_t*);
-extern void intel_driver_unlock_hardware(intel_driver_t*);
-
-/* methods working in shared mode */
-extern dri_bo* intel_driver_share_buffer(intel_driver_t*, const char *sname, 
uint32_t name);
-extern uint32_t intel_driver_shared_name(intel_driver_t*, dri_bo*);
-
-/* init driver shared with X using dri state, acquired from X Display */
-extern int intel_driver_init_shared(intel_driver_t*, struct dri_state*);
-
-/* init driver in master mode (when X is not using the card) 
- * usually dev_name = "/dev/dri/card0"
- */
-extern int intel_driver_init_master(intel_driver_t*, const char* dev_name);
-
-/* init driver for render node */
-extern int intel_driver_init_render(intel_driver_t*, const char* dev_name);
-
-/* terminate driver and all underlying structures */
-extern int intel_driver_terminate(intel_driver_t*);
-
-/* simple check if driver was initialized (checking fd should suffice) */
-extern int intel_driver_is_active(intel_driver_t*);
-
-/* init the call backs used by the ocl driver */
-extern void intel_setup_callbacks(void);
-
-#endif /* _INTEL_DRIVER_H_ */
-
diff --git a/src/intel/intel_gpgpu.h b/src/intel/intel_gpgpu.h
index d3bcf0f..f34ecbc 100644
--- a/src/intel/intel_gpgpu.h
+++ b/src/intel/intel_gpgpu.h
@@ -24,7 +24,7 @@
 #include "cl_utils.h"
 #include "cl_driver.h"
 #include "gen/intel_batchbuffer.h"
-#include "intel/intel_driver.h"
+#include "gen/intel_driver.h"
 
 #include <stdlib.h>
 #include <stdint.h>
-- 
2.7.4

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

Reply via email to