[Beignet] [PATCH v2] Runtime: re-enable cl_khr_gl_sharing with existing egl extension.

Chuanbo Weng chuanbo.weng at intel.com
Wed Sep 7 10:59:05 UTC 2016


In order to query low level layout of GL buffer object/texture/render
buffer, previous implementation introduced an egl extension and
implemented in Beignet side. This way is broken once mesa change its
related internal code. In this patch, we use an new egl extension
(EGL_MESA_image_dma_buf_export) to query related layout infomations
of gl texture. Since this egl extension is already accepted by Khronos,
so it's a stable method. This patch just implement GL texture 2d buffer
sharing, and we will implement other target type if necessary.

v2:
  Add CMake build option to enable cl_khr_gl_sharing(default off).
  Clean up related CMake code.

Signed-off-by: Chuanbo Weng <chuanbo.weng at intel.com>
---
 CMake/FindMesaSrc.cmake                    |  26 ---
 CMakeLists.txt                             |  39 ++--
 src/CMakeLists.txt                         |  22 +--
 src/cl_driver.h                            |  32 +--
 src/cl_driver_defs.c                       |   7 -
 src/cl_extensions.c                        |   4 +-
 src/cl_gl_api.c                            |  19 +-
 src/cl_mem.c                               |   2 +-
 src/cl_mem.h                               |  10 +-
 src/cl_mem_gl.c                            |   7 +-
 src/intel/intel_cl_gl_share_image_info.h   |  18 ++
 src/intel/intel_dri_resource_sharing.c     | 208 --------------------
 src/intel/intel_dri_resource_sharing.h     |  39 ----
 src/intel/intel_dri_resource_sharing_int.h | 143 --------------
 src/intel/intel_driver.c                   | 140 +++++++++----
 src/x11/mesa_egl_extension.c               | 306 -----------------------------
 src/x11/mesa_egl_extension.h               |  20 --
 src/x11/mesa_egl_res_share.c               | 135 -------------
 src/x11/mesa_egl_res_share.h               |  44 -----
 utests/CMakeLists.txt                      |  22 ++-
 utests/compiler_fill_gl_image.cpp          |  69 ++++---
 utests/utest_helper.cpp                    |  10 +-
 utests/utest_helper.hpp                    |   9 +-
 23 files changed, 220 insertions(+), 1111 deletions(-)
 delete mode 100644 CMake/FindMesaSrc.cmake
 create mode 100644 src/intel/intel_cl_gl_share_image_info.h
 delete mode 100644 src/intel/intel_dri_resource_sharing.c
 delete mode 100644 src/intel/intel_dri_resource_sharing.h
 delete mode 100644 src/intel/intel_dri_resource_sharing_int.h
 delete mode 100644 src/x11/mesa_egl_extension.c
 delete mode 100644 src/x11/mesa_egl_extension.h
 delete mode 100644 src/x11/mesa_egl_res_share.c
 delete mode 100644 src/x11/mesa_egl_res_share.h

diff --git a/CMake/FindMesaSrc.cmake b/CMake/FindMesaSrc.cmake
deleted file mode 100644
index 978cb4e..0000000
--- a/CMake/FindMesaSrc.cmake
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Try to find mesa source code
-# Once done this will define
-#
-# MESA_SOURCE_FOUND
-# MESA_SOURCE_INCLUDES
-#
-
-# Find mesa source code.
-FIND_PATH(MESA_SOURCE_PREFIX src/mesa/main/texobj.c
-  $ENV{MESA_SOURCE_DIR}
-  ${MAKE_CURRENT_SOURCE_DIR}/../mesa
-  ~/mesa
-  DOC "The mesa source directory which is needed for cl_khr_gl_sharing.")
-
-IF(MESA_SOURCE_PREFIX)
-SET(MESA_SOURCE_INCLUDES ${MESA_SOURCE_PREFIX}/src/mesa
-                         ${MESA_SOURCE_PREFIX}/include
-                         ${MESA_SOURCE_PREFIX}/src/mapi
-                         ${MESA_SOURCE_PREFIX}/src/mesa/drivers/dri/i965/
-                         ${MESA_SOURCE_PREFIX}/src/mesa/drivers/dri/i915/
-                         ${MESA_SOURCE_PREFIX}/src/mesa/drivers/dri/common/)
-SET(MESA_SOURCE_FOUND 1 CACHE STRING "Set to 1 if mesa source code is found, 0 otherwise")
-ELSE(MESA_SOURCE_PREFIX)
-SET(MESA_SOURCE_FOUND 0 CACHE STRING "Set to 1 if mesa source code is found, 0 otherwise")
-ENDIF(MESA_SOURCE_PREFIX)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f0b45ef..d839f3f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -179,15 +179,6 @@ ENDIF(CMRT_FOUND)
 Find_Package(Threads)
 
 IF(X11_FOUND)
-# OpenGL (not use cmake helper)
-pkg_check_modules(OPENGL gl)
-IF(OPENGL_FOUND)
-  INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIRS})
-  MESSAGE(STATUS "Looking for OpenGL - found at ${OPENGL_PREFIX}")
-ELSE(OPENGL_FOUND)
-  MESSAGE(STATUS "Looking for OpenGL - not found")
-ENDIF(OPENGL_FOUND)
-
 # Xext
 pkg_check_modules(XEXT REQUIRED xext)
 IF(XEXT_FOUND)
@@ -207,20 +198,22 @@ ELSE(XFIXES_FOUND)
 ENDIF(XFIXES_FOUND)
 ENDIF(X11_FOUND)
 
-pkg_check_modules(EGL egl)
-IF(EGL_FOUND)
-  MESSAGE(STATUS "Looking for EGL - found at ${EGL_PREFIX}")
-ELSE(EGL_FOUND)
-  MESSAGE(STATUS "Looking for EGL - not found")
-ENDIF(EGL_FOUND)
-
-# cl_khr_gl_sharing requires to build with mesa source
-#Find_Package(MesaSrc)
-#IF(MESA_SOURCE_FOUND)
-#  MESSAGE(STATUS "Looking for mesa source code - found at ${MESA_SOURCE_PREFIX}")
-#ELSE(MESA_SOURCE_FOUND)
-#  MESSAGE(STATUS "Looking for mesa source code - not found, cl_khr_gl_sharing will be disabled.")
-#ENDIF(MESA_SOURCE_FOUND)
+OPTION(ENABLE_GL_SHARING "cl_khr_gl_sharing" OFF)
+
+IF(ENABLE_GL_SHARING)
+  pkg_check_modules(OPENGL REQUIRED gl)
+  IF(OPENGL_FOUND)
+    MESSAGE(STATUS "Looking for OpenGL - found at ${OPENGL_PREFIX}")
+  ELSE(OPENGL_FOUND)
+    MESSAGE(STATUS "Looking for OpenGL - not found")
+  ENDIF(OPENGL_FOUND)
+  pkg_check_modules(EGL REQUIRED egl>=11.0.0)
+  IF(EGL_FOUND)
+    MESSAGE(STATUS "Looking for EGL - found at ${EGL_PREFIX}")
+  ELSE(EGL_FOUND)
+    MESSAGE(STATUS "Looking for EGL - not found")
+  ENDIF(EGL_FOUND)
+ENDIF(ENABLE_GL_SHARING)
 
 Find_Package(OCLIcd)
 IF(OCLIcd_FOUND)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index cec7cfc..009d057 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -3,8 +3,9 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}
                     ${DRM_INCLUDE_DIRS}/../
                     ${CMAKE_CURRENT_SOURCE_DIR}/../backend/src/backend/
                     ${CMAKE_CURRENT_SOURCE_DIR}/../include
-                    ${MESA_SOURCE_INCLUDES}
-                    ${LLVM_INCLUDE_DIR})
+                    ${LLVM_INCLUDE_DIR}
+                    ${OPENGL_INCLUDE_DIRS}
+                    ${EGL_INCLUDE_DIRS})
 
 macro (MakeKernelBinStr KERNEL_PATH KERNEL_FILES)
 foreach (KF ${KERNEL_FILES})
@@ -109,14 +110,11 @@ if (CMRT_FOUND)
   set(OPENCL_SRC ${OPENCL_SRC} cl_cmrt.cpp)
 endif (CMRT_FOUND)
 
-if (EGL_FOUND AND MESA_SOURCE_FOUND)
-  set (OPENCL_SRC ${OPENCL_SRC} cl_mem_gl.c cl_gl_api.c x11/mesa_egl_extension.c x11/mesa_egl_res_share.c intel/intel_dri_resource_sharing.c)
-  SET(CMAKE_CXX_FLAGS "-DHAS_EGL ${CMAKE_CXX_FLAGS}")
-  SET(CMAKE_C_FLAGS "-DHAS_EGL ${CMAKE_C_FLAGS}")
-  SET(OPTIONAL_EGL_LIBRARY "${EGL_LIBRARY}")
-else(EGL_FOUND AND MESA_SOURCE_FOUND)
-  SET(OPTIONAL_EGL_LIBRARY "")
-endif (EGL_FOUND AND MESA_SOURCE_FOUND)
+if (OPENGL_FOUND AND EGL_FOUND)
+  set (OPENCL_SRC ${OPENCL_SRC} cl_mem_gl.c cl_gl_api.c )
+  SET(CMAKE_CXX_FLAGS "-DHAS_GL_EGL ${CMAKE_CXX_FLAGS}")
+  SET(CMAKE_C_FLAGS "-DHAS_GL_EGL ${CMAKE_C_FLAGS}")
+endif (OPENGL_FOUND AND EGL_FOUND)
 
 if (OCLIcd_FOUND)
   set (OPENCL_SRC ${OPENCL_SRC} cl_khr_icd.c)
@@ -157,7 +155,7 @@ add_custom_target(${GIT_SHA1} ALL
 
 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-Bsymbolic,--allow-shlib-undefined")
 
-link_directories (${LLVM_LIBRARY_DIR} ${DRM_LIBDIR})
+link_directories (${LLVM_LIBRARY_DIR} ${DRM_LIBDIR} ${OPENGL_LIBDIR} ${EGL_LIBDIR})
 add_library(cl SHARED ${OPENCL_SRC})
 ADD_DEPENDENCIES(cl ${GIT_SHA1})
 target_link_libraries(
@@ -171,5 +169,5 @@ target_link_libraries(
                       ${CMAKE_THREAD_LIBS_INIT}
                       ${CMAKE_DL_LIBS}
                       ${OPENGL_LIBRARIES}
-                      ${OPTIONAL_EGL_LIBRARY})
+                      ${EGL_LIBRARIES})
 install (TARGETS cl LIBRARY DESTINATION ${BEIGNET_INSTALL_DIR})
diff --git a/src/cl_driver.h b/src/cl_driver.h
index 16730db..1a9b607 100644
--- a/src/cl_driver.h
+++ b/src/cl_driver.h
@@ -347,7 +347,7 @@ typedef cl_buffer (cl_buffer_alloc_from_texture_cb)(cl_context, unsigned int, in
                                                     struct _cl_mem_image *gl_image);
 extern cl_buffer_alloc_from_texture_cb *cl_buffer_alloc_from_texture;
 
-typedef void (cl_buffer_release_from_texture_cb)(cl_context, unsigned int, int, unsigned int);
+typedef void (cl_buffer_release_from_texture_cb)(cl_context, struct _cl_mem_gl_image *);
 extern cl_buffer_release_from_texture_cb *cl_buffer_release_from_texture;
 
 typedef cl_buffer (cl_buffer_get_buffer_from_libva_cb)(cl_context ctx, unsigned int bo_name, size_t *sz);
@@ -432,35 +432,5 @@ extern cl_driver_get_device_id_cb *cl_driver_get_device_id;
 typedef void (cl_driver_update_device_info_cb)(cl_device_id device);
 extern cl_driver_update_device_info_cb *cl_driver_update_device_info;
 
-/**************************************************************************
- * cl_khr_gl_sharing.
- **************************************************************************/
-typedef int (cl_gl_acquire_texture_cb)(void *driver, void *ctx, int target,
-                                       int level, int texture, void*user_data);
-extern cl_gl_acquire_texture_cb *cl_gl_acquire_texture;
-
-typedef int (cl_gl_release_texture_cb)(void *driver, void *ctx, int target,
-                                       int level, int texture);
-extern cl_gl_release_texture_cb *cl_gl_release_texture;
-
-typedef int (cl_gl_acquire_buffer_object_cb)(void *driver, void *ctx,
-                                             int bufobj, void* user_data);
-extern cl_gl_acquire_buffer_object_cb *cl_gl_acquire_buffer_object;
-
-typedef int (cl_gl_release_buffer_object_cb)(void *driver, void *ctx, int bufobj);
-extern cl_gl_release_buffer_object_cb *cl_gl_release_buffer_object;
-
-typedef int (cl_gl_acquire_render_buffer_cb)(void *driver, void *ctx,
-                                             int rb, void* user_data);
-extern cl_gl_acquire_render_buffer_cb *cl_gl_acquire_render_buffer;
-
-typedef int (cl_gl_release_render_buffer_cb)(void *driver, void *ctx, int rb);
-extern cl_gl_release_render_buffer_cb *cl_gl_release_render_buffer;
-
-#ifndef DEFAULT_DRIVER_DIR
-/* this is normally defined in Mesa/configs/default with DRI_DRIVER_SEARCH_PATH */
-#define DEFAULT_DRIVER_DIR "/usr/local/lib/dri"
-#endif
-
 #endif /* __CL_DRIVER_H__ */
 
diff --git a/src/cl_driver_defs.c b/src/cl_driver_defs.c
index 31176a4..a4a137d 100644
--- a/src/cl_driver_defs.c
+++ b/src/cl_driver_defs.c
@@ -56,13 +56,6 @@ LOCAL cl_buffer_get_tiling_align_cb *cl_buffer_get_tiling_align = NULL;
 LOCAL cl_buffer_get_buffer_from_fd_cb *cl_buffer_get_buffer_from_fd = NULL;
 LOCAL cl_buffer_get_image_from_fd_cb *cl_buffer_get_image_from_fd = NULL;
 
-/* cl_khr_gl_sharing */
-LOCAL cl_gl_acquire_texture_cb *cl_gl_acquire_texture = NULL;
-LOCAL cl_gl_release_texture_cb *cl_gl_release_texture = NULL;
-LOCAL cl_gl_acquire_buffer_object_cb *cl_gl_acquire_buffer_object = NULL;
-LOCAL cl_gl_release_buffer_object_cb *cl_gl_release_buffer_object = NULL;
-LOCAL cl_gl_acquire_render_buffer_cb *cl_gl_acquire_render_buffer = NULL;
-LOCAL cl_gl_release_render_buffer_cb *cl_gl_release_render_buffer = NULL;
 /* GPGPU */
 LOCAL cl_gpgpu_new_cb *cl_gpgpu_new = NULL;
 LOCAL cl_gpgpu_delete_cb *cl_gpgpu_delete = NULL;
diff --git a/src/cl_extensions.c b/src/cl_extensions.c
index 183aafc..4693bb6 100644
--- a/src/cl_extensions.c
+++ b/src/cl_extensions.c
@@ -1,5 +1,5 @@
 #include "llvm/Config/llvm-config.h"
-#ifdef HAS_EGL
+#ifdef HAS_GL_EGL
 #include "EGL/egl.h"
 #include "EGL/eglext.h"
 #endif
@@ -55,7 +55,7 @@ void check_opt1_extension(cl_extensions_t *extensions)
 
 void
 check_gl_extension(cl_extensions_t *extensions) {
-#if defined(HAS_EGL)
+#if defined(HAS_GL_EGL)
   int id;
       /* For now, we only support cl_khr_gl_sharing. */
   for(id = GL_EXT_START_ID; id <= GL_EXT_END_ID; id++)
diff --git a/src/cl_gl_api.c b/src/cl_gl_api.c
index 519aab6..897edb4 100644
--- a/src/cl_gl_api.c
+++ b/src/cl_gl_api.c
@@ -20,7 +20,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
-#ifdef HAS_EGL
+#ifdef HAS_GL_EGL
 #include <GL/gl.h>
 #endif
 
@@ -95,16 +95,7 @@ clCreateFromGLTexture3D(cl_context    context,
                         GLuint texture,
                         cl_int *      errcode_ret)
 {
-  cl_mem mem = NULL;
-  cl_int err = CL_SUCCESS;
-  CHECK_CONTEXT (context);
-  CHECK_GL_CONTEXT (context);
-
-  mem = cl_mem_new_gl_texture(context, flags, texture_target, miplevel, texture, &err);
-error:
-  if (errcode_ret)
-    *errcode_ret = err;
-  return mem;
+  NOT_IMPLEMENTED;
 }
 
 cl_mem
@@ -120,6 +111,12 @@ clCreateFromGLTexture(cl_context      context,
   CHECK_CONTEXT (context);
   CHECK_GL_CONTEXT (context);
 
+  //We just support GL_TEXTURE_2D now.
+  if(target != GL_TEXTURE_2D){
+    err = CL_INVALID_VALUE;
+    goto error;
+  }
+
   mem = cl_mem_new_gl_texture(context, flags, target, miplevel, texture, &err);
 error:
   if (errcode_ret)
diff --git a/src/cl_mem.c b/src/cl_mem.c
index 597d9ce..5caf5a9 100644
--- a/src/cl_mem.c
+++ b/src/cl_mem.c
@@ -1177,7 +1177,7 @@ cl_mem_delete(cl_mem mem)
     return;
   if (CL_OBJECT_DEC_REF(mem) > 1)
     return;
-#ifdef HAS_EGL
+#ifdef HAS_GL_EGL
   if (UNLIKELY(IS_GL_IMAGE(mem))) {
      cl_mem_gl_delete(cl_mem_gl_image(mem));
   }
diff --git a/src/cl_mem.h b/src/cl_mem.h
index 39dbab1..e6c8217 100644
--- a/src/cl_mem.h
+++ b/src/cl_mem.h
@@ -26,6 +26,9 @@
 #include "cl_base_object.h"
 #include <assert.h>
 #include <pthread.h>
+#if defined(HAS_GL_EGL)
+#include "EGL/egl.h"
+#endif
 
 #ifndef CL_VERSION_1_2
 #define CL_MEM_OBJECT_IMAGE1D                       0x10F4
@@ -119,9 +122,10 @@ struct _cl_mem_image {
 
 struct _cl_mem_gl_image {
   struct _cl_mem_image base;
-  uint32_t target;
-  int      miplevel;
-  uint32_t texture;
+  int fd;
+#if defined(HAS_GL_EGL)
+  EGLImage egl_image;
+#endif
 };
 
 struct _cl_mem_buffer1d_image {
diff --git a/src/cl_mem_gl.c b/src/cl_mem_gl.c
index b0b2c1b..fdad067 100644
--- a/src/cl_mem_gl.c
+++ b/src/cl_mem_gl.c
@@ -74,10 +74,6 @@ cl_mem_new_gl_texture(cl_context ctx,
     goto error;
   }
 
-  cl_mem_gl_image(mem)->target = texture_target;
-  cl_mem_gl_image(mem)->miplevel = miplevel;
-  cl_mem_gl_image(mem)->texture = texture;
-
 exit:
   if (errcode_ret)
     *errcode_ret = err;
@@ -92,6 +88,5 @@ error:
 LOCAL void cl_mem_gl_delete(struct _cl_mem_gl_image *gl_image)
 {
   if (gl_image->base.base.bo != NULL)
-    cl_buffer_release_from_texture(gl_image->base.base.ctx, gl_image->target,
-                                   gl_image->miplevel, gl_image->texture);
+    cl_buffer_release_from_texture(gl_image->base.base.ctx, gl_image);
 }
diff --git a/src/intel/intel_cl_gl_share_image_info.h b/src/intel/intel_cl_gl_share_image_info.h
new file mode 100644
index 0000000..21fbbd1
--- /dev/null
+++ b/src/intel/intel_cl_gl_share_image_info.h
@@ -0,0 +1,18 @@
+#ifndef __INTEL_CL_GL_SHARE_IMAGE_INFO_
+#define __INTEL_CL_GL_SHARE_IMAGE_INFO_
+
+struct _intel_cl_gl_share_image_info {
+  int fd;
+  size_t w;
+  size_t h;
+  size_t depth;
+  size_t pitch;
+  int tiling;
+  size_t offset;
+  size_t tile_x;
+  size_t tile_y;
+  unsigned int gl_format;
+  size_t row_pitch, slice_pitch;
+};
+
+#endif
diff --git a/src/intel/intel_dri_resource_sharing.c b/src/intel/intel_dri_resource_sharing.c
deleted file mode 100644
index 188c1fa..0000000
--- a/src/intel/intel_dri_resource_sharing.c
+++ /dev/null
@@ -1,208 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- *
- * 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 TUNGSTEN GRAPHICS 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.
- *
- **************************************************************************/
-
-#define HAVE_PTHREAD 1
-#include <errno.h>
-#include <time.h>
-#include "main/context.h"
-#include "main/renderbuffer.h"
-#include "main/texobj.h"
-#include <stdbool.h>
-#include <string.h>
-#include <drm.h>
-#include <i915_drm.h>
-#include <intel_bufmgr.h>
-#include <GL/internal/dri_interface.h>
-#include "intel_mipmap_tree.h"
-#include "intel_regions.h"
-#include "intel_context.h"
-
-#include "intel_dri_resource_sharing.h"
-#include "intel_dri_resource_sharing_int.h"
-
-#include <dlfcn.h>
-/**
- * Sets up a DRIImage structure to point to our shared image in a region
- */
-static bool
-intel_setup_cl_region_from_mipmap_tree(void *driver,
-                                       struct intel_context *intel,
-                                       struct intel_mipmap_tree *mt,
-                                       GLuint level, GLuint zoffset,
-                                       struct _intel_dri_share_image_region *region)
-{
-   unsigned int draw_x, draw_y;
-   uint32_t mask_x, mask_y;
-   struct intel_region *null_region = (struct intel_region *)NULL;
-
-   intel_miptree_check_level_layer(mt, level, zoffset);
-
-   _intel_region_get_tile_masks(mt->region, &mask_x, &mask_y, false);
-   _intel_miptree_get_image_offset(mt, level, zoffset, &draw_x, &draw_y);
-
-   region->w = mt->level[level].width;
-   region->h = mt->level[level].height;
-   region->tile_x = draw_x & mask_x;
-   region->tile_y = draw_y & mask_y;
-   region->tiling = mt->region->tiling;
-   /* XXX hard code to 1 right now. */
-   region->depth = 1;
-   region->row_pitch = mt->region->pitch;
-
-   region->offset = _intel_region_get_aligned_offset(mt->region,
-                                                     draw_x & ~mask_x,
-                                                     draw_y & ~mask_y,
-                                                     false);
-   if (!_intel_region_flink(mt->region, &region->name))
-      return false;
-   _intel_region_reference(&null_region, mt->region);
-   return true;
-}
-
-typedef void
-_mesa_test_texobj_completeness_t( const struct gl_context *ctx,
-                                struct gl_texture_object *t );
-_mesa_test_texobj_completeness_t *__mesa_test_texobj_completeness;
-
-typedef struct gl_texture_object *
-_mesa_lookup_texture_t( const struct gl_context *ctx, GLuint id);
-_mesa_lookup_texture_t *__mesa_lookup_texture;
-
-static struct gl_texture_object *
-intel_get_gl_obj_from_texture(void *driver,
-                              struct intel_context *intel,
-                              GLenum target, GLint level,
-                              GLuint texture, GLuint face)
-{
-   struct gl_texture_object *obj;
-   __mesa_lookup_texture = dlsym(driver, "_mesa_lookup_texture");
-   obj = __mesa_lookup_texture(&intel->ctx, texture);
-   if (!obj || obj->Target != target) {
-      return NULL;
-   }
-
-   __mesa_test_texobj_completeness = dlsym(driver, "_mesa_test_texobj_completeness");
-   __mesa_test_texobj_completeness(&intel->ctx, obj);
-   if (!obj->_BaseComplete || (level > 0 && !obj->_MipmapComplete)) {
-      return NULL;
-   }
-
-   if (level < obj->BaseLevel || level > obj->_MaxLevel) {
-      return NULL;
-   }
-
-   return obj;
-}
-
-static GLenum
-get_cl_gl_format(mesa_format format)
-{
-   switch (format) {
-   case MESA_FORMAT_R8G8B8A8_UNORM:
-      return GL_RGBA;
-   case MESA_FORMAT_A8R8G8B8_UNORM:
-      return GL_BGRA;
-   default:
-      return GL_BGRA;
-  }
-}
-
-static bool
-intelAcquireTexture(void *driver, __DRIcontext *context, GLenum target,
-                    GLint level, GLuint texture, void *user_data)
-{
-   struct _intel_dri_share_image_region *region = intel_dri_share_image_region(user_data);
-   struct intel_context *intel = context->driverPrivate;
-   struct gl_texture_object *obj;
-   struct intel_texture_object *iobj;
-   /* XXX Always be face 0? */
-   GLuint face = 0;
-
-   obj = intel_get_gl_obj_from_texture(driver, intel, target, level, texture, face);
-   if (obj == NULL)
-     return false;
-   iobj = intel_texture_object(obj);
-   region->gl_format = get_cl_gl_format(obj->Image[face][level]->TexFormat);
-   return intel_setup_cl_region_from_mipmap_tree(driver, intel, iobj->mt, level, 0, region);
-}
-
-static bool
-intelReleaseTexture(void *driver, __DRIcontext *context, GLenum target,
-                    GLint level, GLuint texture)
-{
-   struct intel_context *intel = context->driverPrivate;
-   struct gl_texture_object *obj;
-   struct intel_texture_object *iobj;
-   /* XXX Always be face 0? */
-   GLuint face = 0;
-
-   obj = intel_get_gl_obj_from_texture(driver, intel, target, level, texture, face);
-   if (obj == NULL)
-     return false;
-
-   iobj = intel_texture_object(obj);
-   _intel_region_release(&iobj->mt->region);
-   return true;
-}
-
-static bool
-intelAcquireBufferObj(void *driver, __DRIcontext *driContextPriv,
-                      GLuint bufobj, void *user_data)
-{
-  return false;
-}
-
-static bool
-intelReleaseBufferObj(void *driver, __DRIcontext *driContextPriv, GLuint bufobj)
-{
-  return false;
-}
-
-static bool
-intelAcquireRenderBuffer(void *driver, __DRIcontext *driContextPriv,
-                         GLuint bufobj, void *user_data)
-{
-  return false;
-}
-
-static bool
-intelReleaseRenderBuffer(void *driver, __DRIcontext *driContextPriv, GLuint bufobj)
-{
-  return false;
-}
-
-#include "cl_driver.h"
-void
-intel_set_cl_gl_callbacks(void)
-{
-  cl_gl_acquire_texture = (cl_gl_acquire_texture_cb*)intelAcquireTexture;
-  cl_gl_release_texture = (cl_gl_release_texture_cb*)intelReleaseTexture;
-  cl_gl_acquire_buffer_object = (cl_gl_acquire_buffer_object_cb*)intelAcquireBufferObj;
-  cl_gl_release_buffer_object = (cl_gl_release_buffer_object_cb*)intelReleaseBufferObj;
-  cl_gl_acquire_render_buffer = (cl_gl_acquire_render_buffer_cb*)intelAcquireRenderBuffer;
-  cl_gl_release_render_buffer = (cl_gl_release_render_buffer_cb*)intelReleaseRenderBuffer;
-}
diff --git a/src/intel/intel_dri_resource_sharing.h b/src/intel/intel_dri_resource_sharing.h
deleted file mode 100644
index 6d2ce4d..0000000
--- a/src/intel/intel_dri_resource_sharing.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef __INTEL_DRI_RESOURCE_SHARING_H__
-#define __INTEL_DRI_RESOURCE_SHARING_H__
-
-struct _intel_dri_share_image_region {
-  unsigned int name;
-  size_t w;
-  size_t h;
-  size_t depth;
-  size_t pitch;
-  int tiling;
-  size_t offset;
-  size_t tile_x;
-  size_t tile_y;
-  unsigned int gl_format;
-  size_t row_pitch, slice_pitch;
-};
-
-struct _intel_dri_share_buffer_object {
-  unsigned int name;
-  size_t sz;
-  size_t offset;
-};
-
-inline static struct _intel_dri_share_image_region *
-intel_dri_share_image_region(void *user_data)
-{
-   return (struct _intel_dri_share_image_region *)user_data;
-}
-
-inline static struct _intel_dri_share_buffer_object *
-intel_dri_share_buffer_object(void *user_data)
-{
-   return (struct _intel_dri_share_buffer_object *)user_data;
-}
-
-extern void intel_set_cl_gl_callbacks(void);
-
-
-#endif
diff --git a/src/intel/intel_dri_resource_sharing_int.h b/src/intel/intel_dri_resource_sharing_int.h
deleted file mode 100644
index c7b283a..0000000
--- a/src/intel/intel_dri_resource_sharing_int.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/*****************************************************************
- * The following functions are copied from i965 driver, commit
- * id 292368570a13501dfa95b1b0dd70966caf6ffc6b. Need to keep consistant
- * with the dri driver installed on current system.
- *****************************************************************/
-static bool
-_intel_region_flink(struct intel_region *region, uint32_t *name)
-{
-   if (region->name == 0) {
-      if (drm_intel_bo_flink(region->bo, &region->name))
-         return false;
-   }
-
-   *name = region->name;
-
-   return true;
-}
-
-#define _DBG(...)
-static void
-_intel_region_release(struct intel_region **region_handle)
-{
-   struct intel_region *region = *region_handle;
-
-   if (region == NULL) {
-      _DBG("%s NULL\n", __FUNCTION__);
-      return;
-   }
-
-   _DBG("%s %p %d\n", __FUNCTION__, region, region->refcount - 1);
-
-   ASSERT(region->refcount > 0);
-   region->refcount--;
-
-   if (region->refcount == 0) {
-      drm_intel_bo_unreference(region->bo);
-
-      free(region);
-   }
-   *region_handle = NULL;
-}
-
-static void
-_intel_region_reference(struct intel_region **dst, struct intel_region *src)
-{
-   _DBG("%s: %p(%d) -> %p(%d)\n", __FUNCTION__,
-        *dst, *dst ? (*dst)->refcount : 0, src, src ? src->refcount : 0);
-
-   if (src != *dst) {
-      if (*dst)
-         _intel_region_release(dst);
-
-      if (src)
-         src->refcount++;
-      *dst = src;
-   }
-}
-
-/**
- * This function computes masks that may be used to select the bits of the X
- * and Y coordinates that indicate the offset within a tile.  If the region is
- * untiled, the masks are set to 0.
- */
-static void
-_intel_region_get_tile_masks(struct intel_region *region,
-                             uint32_t *mask_x, uint32_t *mask_y,
-                             bool map_stencil_as_y_tiled)
-{
-   int cpp = region->cpp;
-   uint32_t tiling = region->tiling;
-
-   if (map_stencil_as_y_tiled)
-      tiling = I915_TILING_Y;
-
-   switch (tiling) {
-   default:
-      assert(false);
-   case I915_TILING_NONE:
-      *mask_x = *mask_y = 0;
-      break;
-   case I915_TILING_X:
-      *mask_x = 512 / cpp - 1;
-      *mask_y = 7;
-      break;
-   case I915_TILING_Y:
-      *mask_x = 128 / cpp - 1;
-      *mask_y = 31;
-      break;
-   }
-}
-
-/**
- * Compute the offset (in bytes) from the start of the region to the given x
- * and y coordinate.  For tiled regions, caller must ensure that x and y are
- * multiples of the tile size.
- */
-static uint32_t
-_intel_region_get_aligned_offset(struct intel_region *region, uint32_t x,
-                                 uint32_t y, bool map_stencil_as_y_tiled)
-{
-   int cpp = region->cpp;
-   uint32_t pitch = region->pitch;
-   uint32_t tiling = region->tiling;
-
-   if (map_stencil_as_y_tiled) {
-      tiling = I915_TILING_Y;
-
-      /* When mapping a W-tiled stencil buffer as Y-tiled, each 64-high W-tile
-       * gets transformed into a 32-high Y-tile.  Accordingly, the pitch of
-       * the resulting region is twice the pitch of the original region, since
-       * each row in the Y-tiled view corresponds to two rows in the actual
-       * W-tiled surface.  So we need to correct the pitch before computing
-       * the offsets.
-       */
-      pitch *= 2;
-   }
-
-   switch (tiling) {
-   default:
-      assert(false);
-   case I915_TILING_NONE:
-      return y * pitch + x * cpp;
-   case I915_TILING_X:
-      assert((x % (512 / cpp)) == 0);
-      assert((y % 8) == 0);
-      return y * pitch + x / (512 / cpp) * 4096;
-   case I915_TILING_Y:
-      assert((x % (128 / cpp)) == 0);
-      assert((y % 32) == 0);
-      return y * pitch + x / (128 / cpp) * 4096;
-   }
-}
-
-static void
-_intel_miptree_get_image_offset(struct intel_mipmap_tree *mt,
-                                GLuint level, GLuint slice,
-                                GLuint *x, GLuint *y)
-{
-   assert(slice < mt->level[level].depth);
-
-   *x = mt->level[level].slice[slice].x_offset;
-   *y = mt->level[level].slice[slice].y_offset;
-}
diff --git a/src/intel/intel_driver.c b/src/intel/intel_driver.c
index e561725..187c6d0 100644
--- a/src/intel/intel_driver.c
+++ b/src/intel/intel_driver.c
@@ -46,10 +46,11 @@
  *
  */
 
-#if defined(HAS_EGL)
+#if defined(HAS_GL_EGL)
+#define EGL_EGLEXT_PROTOTYPES
 #include "GL/gl.h"
 #include "EGL/egl.h"
-#include "x11/mesa_egl_extension.h"
+#include <EGL/eglext.h>
 #endif
 
 #ifdef HAS_X11
@@ -244,7 +245,7 @@ intel_driver_open(intel_driver_t *intel, cl_context_prop props)
     return CL_DEVICE_NOT_FOUND;
   }
 
-#ifdef HAS_EGL
+#ifdef HAS_GL_EGL
   if (props && props->gl_type == CL_GL_EGL_DISPLAY) {
     assert(props->egl_display);
   }
@@ -536,9 +537,26 @@ static uint32_t intel_buffer_get_tiling_align(cl_context ctx, uint32_t tiling_mo
   return ret;
 }
 
-#if defined(HAS_EGL)
-#include "intel_dri_resource_sharing.h"
+#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;
@@ -627,29 +645,68 @@ intel_alloc_buffer_from_texture_egl(cl_context ctx, unsigned int target,
                                     int miplevel, unsigned int texture,
                                     struct _cl_mem_image *image)
 {
-  cl_buffer bo = (cl_buffer) NULL;
-  struct _intel_dri_share_image_region region;
+  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;
-  EGLint attrib_list[] = { EGL_GL_TEXTURE_ID_MESA, texture,
-                           EGL_GL_TEXTURE_LEVEL_MESA, miplevel,
-                           EGL_GL_TEXTURE_TARGET_MESA, target,
-                           EGL_NONE};
-  ret = eglAcquireResourceMESA(EGL_DISP(ctx), EGL_CTX(ctx),
-                               EGL_GL_TEXTURE_MESA,
-                               &attrib_list[0], &region);
-  if (!ret)
-      goto out;
-
-  bo = (cl_buffer)intel_driver_share_buffer((intel_driver_t *)ctx->drv, "rendering buffer", region.name);
 
-  if (bo == NULL) {
-    eglReleaseResourceMESA(EGL_DISP(ctx), EGL_CTX(ctx), EGL_GL_TEXTURE_MESA, &attrib_list[0]);
-    goto out;
+  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;
   }
-  region.tiling = get_cl_tiling(region.tiling);
-  if (cl_get_clformat_from_texture(region.gl_format, &cl_format) != 0)
+
+  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)
@@ -661,17 +718,22 @@ intel_alloc_buffer_from_texture_egl(cl_context ctx, unsigned int target,
   if (get_mem_type_from_target(target, &image_type) != 0)
     goto error;
 
-  cl_mem_image_init(image, region.w, region.h,
-                    image_type, region.depth, cl_format,
-                    intel_fmt, bpp, region.row_pitch,
-                    region.slice_pitch, region.tiling,
-                    region.tile_x, region.tile_y, region.offset);
-out:
-  return bo;
+  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:
-  cl_buffer_unreference(bo);
-  eglReleaseResourceMESA(EGL_DISP(ctx), EGL_CTX(ctx), EGL_GL_TEXTURE_MESA, &attrib_list[0]);
+  drm_intel_bo_unreference(intel_bo);
+  close(fd);
+  eglDestroyImage(EGL_DISP(ctx), e_image);
   return NULL;
 }
 
@@ -688,16 +750,11 @@ intel_alloc_buffer_from_texture(cl_context ctx, unsigned int target,
 }
 
 static int
-intel_release_buffer_from_texture(cl_context ctx, unsigned int target,
-                                  int miplevel, unsigned int texture)
+intel_release_buffer_from_texture(cl_context ctx, struct _cl_mem_gl_image *gl_image)
 {
   if (IS_EGL_CONTEXT(ctx)) {
-    EGLint attrib_list[] = { EGL_GL_TEXTURE_ID_MESA, texture,
-                           EGL_GL_TEXTURE_LEVEL_MESA, miplevel,
-                           EGL_GL_TEXTURE_TARGET_MESA, target,
-                           EGL_NONE};
-
-    eglReleaseResourceMESA(EGL_DISP(ctx), EGL_CTX(ctx), EGL_GL_TEXTURE_MESA, &attrib_list[0]);
+    close(gl_image->fd);
+    eglDestroyImage(EGL_DISP(ctx), gl_image->egl_image);
     return CL_SUCCESS;
   }
   return -1;
@@ -928,10 +985,9 @@ intel_setup_callbacks(void)
   cl_buffer_alloc = (cl_buffer_alloc_cb *) drm_intel_bo_alloc;
   cl_buffer_alloc_userptr = (cl_buffer_alloc_userptr_cb*) intel_buffer_alloc_userptr;
   cl_buffer_set_tiling = (cl_buffer_set_tiling_cb *) intel_buffer_set_tiling;
-#if defined(HAS_EGL)
+#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;
-  intel_set_cl_gl_callbacks();
 #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;
diff --git a/src/x11/mesa_egl_extension.c b/src/x11/mesa_egl_extension.c
deleted file mode 100644
index 4a3e89c..0000000
--- a/src/x11/mesa_egl_extension.c
+++ /dev/null
@@ -1,306 +0,0 @@
-#include <stdio.h>
-#include "mesa_egl_extension.h"
-#include "mesa_egl_res_share.h"
-#include "src/cl_driver.h"
-
-struct _egl_display;
-struct _egl_resource;
-struct _egl_thread_info;
-struct _egl_config;
-struct _egl_surface;
-struct _egl_driver;
-
-typedef struct _egl_display _EGLDisplay;
-typedef struct _egl_resource _EGLResource;
-typedef struct _egl_thread_info _EGLThreadInfo;
-typedef struct _egl_config _EGLConfig;
-typedef struct _egl_surface _EGLSurface;
-typedef struct _egl_driver _EGLDriver;
-
-/**
- * A resource of a display.
- */
-struct _egl_resource
-{
-   /* which display the resource belongs to */
-   _EGLDisplay *Display;
-   EGLBoolean IsLinked;
-   EGLint RefCount;
-
-   /* used to link resources of the same type */
-   _EGLResource *Next;
-};
-
-/**
- * "Base" class for device driver contexts.
- */
-struct _egl_context
-{
-   /* A context is a display resource */
-   _EGLResource Resource;
-
-   /* The bound status of the context */
-   _EGLThreadInfo *Binding;
-   _EGLSurface *DrawSurface;
-   _EGLSurface *ReadSurface;
-
-   _EGLConfig *Config;
-
-   EGLint ClientAPI; /**< EGL_OPENGL_ES_API, EGL_OPENGL_API, EGL_OPENVG_API */
-   EGLint ClientMajorVersion;
-   EGLint ClientMinorVersion;
-   EGLint Flags;
-   EGLint Profile;
-   EGLint ResetNotificationStrategy;
-
-   /* The real render buffer when a window surface is bound */
-   EGLint WindowRenderBuffer;
-};
-
-typedef struct _egl_context _EGLContext;
-
-struct dri2_egl_display
-{
-   int                       dri2_major;
-   int                       dri2_minor;
-   __DRIscreen              *dri_screen;
-   int                       own_dri_screen;
-   const __DRIconfig       **driver_configs;
-   void                     *driver;
-};
-
-enum _egl_platform_type {
-   _EGL_PLATFORM_WINDOWS,
-   _EGL_PLATFORM_X11,
-   _EGL_PLATFORM_WAYLAND,
-   _EGL_PLATFORM_DRM,
-   _EGL_PLATFORM_FBDEV,
-   _EGL_PLATFORM_NULL,
-   _EGL_PLATFORM_ANDROID,
-
-   _EGL_NUM_PLATFORMS,
-   _EGL_INVALID_PLATFORM = -1
-};
-typedef enum _egl_platform_type _EGLPlatformType;
-
-typedef pthread_mutex_t _EGLMutex;
-
-struct _egl_display
-{
-   /* used to link displays */
-   _EGLDisplay *Next;
-
-   _EGLMutex Mutex;
-
-   _EGLPlatformType Platform; /**< The type of the platform display */
-   void *PlatformDisplay;     /**< A pointer to the platform display */
-
-   _EGLDriver *Driver;        /**< Matched driver of the display */
-   EGLBoolean Initialized;    /**< True if the display is initialized */
-
-   /* options that affect how the driver initializes the display */
-   struct {
-      EGLBoolean TestOnly;    /**< Driver should not set fields when true */
-      EGLBoolean UseFallback; /**< Use fallback driver (sw or less features) */
-   } Options;
-
-   /* these fields are set by the driver during init */
-   void *DriverData;          /**< Driver private data */
-};
-
-static struct dri2_egl_display *
-dri2_egl_display(_EGLDisplay *dpy)
-{
-  return (struct dri2_egl_display *)dpy->DriverData;
-}
-
-static _EGLDisplay *
-_eglLockDisplay(EGLDisplay dpy)
-{
-  return (_EGLDisplay *)dpy;
-}
-
-static _EGLContext *
-_eglLookupContext(EGLContext ctx, EGLDisplay disp)
-{
-  return (_EGLContext *) ctx;
-}
-
-struct dri2_egl_context
-{
-   _EGLContext   base;
-   __DRIcontext *dri_context;
-};
-
-static struct dri2_egl_context *
-dri2_egl_context(_EGLContext *ctx)
-{
-  return (struct dri2_egl_context *)ctx;
-}
-
-static EGLBoolean
-dri2_acquire_texture(_EGLDisplay *disp,
-                     _EGLContext *ctx,
-                     const EGLint *attr_list,
-                     void *user_data)
-{
-   struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
-   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-   GLuint texture = 0;
-   GLenum gl_target = 0;
-   GLint level = 0;
-   GLboolean ret;
-
-   if (_eglParseTextureAttribList(&texture, &gl_target, &level, attr_list) != EGL_SUCCESS)
-      return EGL_FALSE;
-
-   ret = cl_gl_acquire_texture(dri2_dpy->driver,
-                               dri2_ctx->dri_context,
-                               gl_target, level, texture,
-                               user_data);
-   return ret;
-}
-
-static EGLBoolean
-dri2_release_texture(_EGLDisplay *disp, _EGLContext *ctx, const EGLint *attr_list)
-{
-   struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
-   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-   GLuint texture = 0;
-   GLenum gl_target = 0;
-   GLint level = 0;
-   GLboolean ret;
-
-   if (_eglParseTextureAttribList(&texture, &gl_target, &level, attr_list) != EGL_SUCCESS)
-      return EGL_FALSE;
-
-   ret = cl_gl_release_texture(dri2_dpy->driver, dri2_ctx->dri_context,
-                               gl_target, level, texture);
-   return ret;
-}
-
-static EGLBoolean
-dri2_acquire_buffer_object(_EGLDisplay *disp, _EGLContext *ctx, const EGLint *attr_list,
-                           void *user_data)
-{
-   struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
-   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-   GLuint bufobj = 0;
-   GLboolean ret;
-
-   if (_eglParseBufferObjAttribList(&bufobj, attr_list) != EGL_SUCCESS)
-      return EGL_FALSE;
-
-   ret = cl_gl_acquire_buffer_object(dri2_dpy->driver,
-                                     dri2_ctx->dri_context,
-                                     bufobj, user_data);
-   return ret;
-}
-
-static EGLBoolean
-dri2_release_buffer_object(_EGLDisplay *disp, _EGLContext *ctx, const EGLint *attr_list)
-{
-   struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
-   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-   GLuint bufobj = 0;
-   GLboolean ret;
-
-   if (_eglParseBufferObjAttribList(&bufobj, attr_list) != EGL_SUCCESS)
-      return EGL_FALSE;
-
-   ret = cl_gl_release_buffer_object(dri2_dpy->driver,
-                                     dri2_ctx->dri_context,
-                                     bufobj);
-   return ret;
-}
-
-static EGLBoolean
-dri2_acquire_render_buffer(_EGLDisplay *disp,
-                           _EGLContext *ctx,
-                           const EGLint *attr_list,
-                           void *user_data)
-{
-   struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
-   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-   GLuint rb = 0;
-   GLboolean ret;
-
-   if (_eglParseBufferObjAttribList(&rb, attr_list) != EGL_SUCCESS)
-      return EGL_FALSE;
-
-   ret = cl_gl_acquire_render_buffer(dri2_dpy->driver,
-                                     dri2_ctx->dri_context,
-                                     rb, user_data);
-   return ret;
-}
-
-static EGLBoolean
-dri2_release_render_buffer(_EGLDisplay *disp, _EGLContext *ctx, const EGLint *attr_list)
-{
-   struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
-   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-   GLuint rb = 0;
-   GLboolean ret;
-
-   if (_eglParseBufferObjAttribList(&rb, attr_list) != EGL_SUCCESS)
-      return EGL_FALSE;
-
-   ret = cl_gl_release_render_buffer(dri2_dpy->driver,
-                                     dri2_ctx->dri_context,
-                                     rb);
-   return ret;
-}
-
-static EGLBoolean
-dri2_acquire_resource_mesa(_EGLDisplay *disp, _EGLContext *ctx, const EGLenum target,
-                           const EGLint *attrib_list, void *user_data)
-{
-   switch (target) {
-   case EGL_GL_TEXTURE_MESA:
-     return dri2_acquire_texture(disp, ctx, attrib_list, user_data);
-   case EGL_GL_BUFFER_OBJECT_MESA:
-     return dri2_acquire_buffer_object(disp, ctx, attrib_list, user_data);
-   case EGL_GL_RENDER_BUFFER_MESA:
-     return dri2_acquire_render_buffer(disp, ctx, attrib_list, user_data);
-   default:
-      fprintf(stderr, "bad resource target value 0x%04x",
-              target);
-   }
-   return EGL_FALSE;
-}
-
-static EGLBoolean
-dri2_release_resource_mesa(_EGLDisplay *disp, _EGLContext *ctx, const EGLenum target,
-                           const EGLint *attrib_list)
-{
-   switch (target) {
-   case EGL_GL_TEXTURE_MESA:
-     return dri2_release_texture(disp, ctx, attrib_list);
-   case EGL_GL_BUFFER_OBJECT_MESA:
-     return dri2_release_buffer_object(disp, ctx, attrib_list);
-   case EGL_GL_RENDER_BUFFER_MESA:
-     return dri2_release_render_buffer(disp, ctx, attrib_list);
-   default:
-      fprintf(stderr, "bad resource target value 0x%04x",
-              target);
-   }
-   return EGL_FALSE;
-}
-
-EGLBoolean
-eglAcquireResourceMESA(EGLDisplay dpy, EGLContext ctx, EGLenum target, const EGLint *attrib_list, void *user)
-{
-   _EGLDisplay *disp = _eglLockDisplay(dpy);
-   _EGLContext *context = _eglLookupContext(ctx, disp);
-
-   return dri2_acquire_resource_mesa(disp, context, target, attrib_list, user);
-}
-
-EGLBoolean
-eglReleaseResourceMESA(EGLDisplay dpy, EGLContext ctx, EGLenum target, const EGLint *attrib_list)
-{
-   _EGLDisplay *disp = _eglLockDisplay(dpy);
-   _EGLContext *context = _eglLookupContext(ctx, disp);
-
-   return dri2_release_resource_mesa(disp, context, target, attrib_list);
-}
diff --git a/src/x11/mesa_egl_extension.h b/src/x11/mesa_egl_extension.h
deleted file mode 100644
index 39ea134..0000000
--- a/src/x11/mesa_egl_extension.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __MESA_EGL_EXTENSION_H__
-#define __MESA_EGL_EXTENSION_H__
-
-#include <EGL/egl.h>
-#include <GL/gl.h>
-#include <GL/internal/dri_interface.h>
-
-#define EGL_GL_TEXTURE_MESA             0x3300  /* eglAcuireResource target */
-#define EGL_GL_BUFFER_OBJECT_MESA       0x3301  /* eglAcuireResource target */
-#define EGL_GL_RENDER_BUFFER_MESA       0x3302  /* eglAcuireResource target */
-#define EGL_GL_TEXTURE_ID_MESA          0x3303  /* eglAcuireResource attribute */
-#define EGL_GL_TEXTURE_LEVEL_MESA       0x3304  /* eglAcuireResource attribute */
-#define EGL_GL_TEXTURE_TARGET_MESA      0x3305  /* eglAcuireResource attribute */
-#define EGL_GL_BUFFER_OBJECT_ID_MESA    0x3306  /* eglAcuireResource attribute */
-#define EGL_GL_RENDER_BUFFER_ID_MESA    0x3307  /* eglAcuireResource attribute */
-
-EGLBoolean eglAcquireResourceMESA(EGLDisplay dpy, EGLContext ctx, EGLenum target, const EGLint *attrib_list, void * user_data);
-EGLBoolean eglReleaseResourceMESA(EGLDisplay dpy, EGLContext ctx, EGLenum target, const EGLint *attrib_list);
-
-#endif
diff --git a/src/x11/mesa_egl_res_share.c b/src/x11/mesa_egl_res_share.c
deleted file mode 100644
index 93e9454..0000000
--- a/src/x11/mesa_egl_res_share.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2013-2014 Zhigang Gong <zhigang.gong at linux.intel.com>
- * Copyright 2013-2014 Intel, Inc.
- * All Rights Reserved.
- *
- * 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 NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS 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.
- *
- **************************************************************************/
-
-
-#include <assert.h>
-#include <string.h>
-
-#include "mesa_egl_extension.h"
-#include "mesa_egl_res_share.h"
-
-/**
- * Parse the list of share texture attributes and return the proper error code.
- */
-EGLint
-_eglParseTextureAttribList(unsigned int *texture, EGLenum *gl_target, EGLint *level,
-                           const EGLint *attrib_list)
-{
-   EGLint i, err = EGL_SUCCESS;
-
-   *texture = 0;
-   *gl_target = 0;
-   *level = 0;
-
-   if (!attrib_list)
-      return EGL_BAD_ATTRIBUTE;
-
-   for (i = 0; attrib_list[i] != EGL_NONE; i++) {
-      EGLint attr = attrib_list[i++];
-      EGLint val = attrib_list[i];
-
-      switch (attr) {
-      case EGL_GL_TEXTURE_LEVEL_MESA:
-         *level = val;
-         break;
-      case EGL_GL_TEXTURE_ID_MESA:
-         *texture = val;
-         break;
-      case EGL_GL_TEXTURE_TARGET_MESA:
-         *gl_target = val;
-         break;
-      default:
-         /* unknown attrs are ignored */
-         break;
-      }
-   }
-
-   return err;
-}
-
-/**
- * Parse the list of share texture attributes and return the proper error code.
- */
-EGLint
-_eglParseBufferObjAttribList(unsigned int *bufobj, const EGLint *attrib_list)
-{
-   EGLint i, err = EGL_SUCCESS;
-   *bufobj = 0;
-
-   if (!attrib_list)
-      return EGL_BAD_ATTRIBUTE;
-
-   for (i = 0; attrib_list[i] != EGL_NONE; i++) {
-      EGLint attr = attrib_list[i++];
-      EGLint val = attrib_list[i];
-
-      switch (attr) {
-      case EGL_GL_BUFFER_OBJECT_ID_MESA:
-         *bufobj = val;
-         break;
-      default:
-         /* unknown attrs are ignored */
-         break;
-      }
-   }
-   if (*bufobj == 0)
-      err = EGL_BAD_ATTRIBUTE;
-
-   return err;
-}
-
-/**
- * Parse the list of share texture attributes and return the proper error code.
- */
-EGLint
-_eglParseRenderBufferAttribList(unsigned int *rb, const EGLint *attrib_list)
-{
-   EGLint i, err = EGL_SUCCESS;
-   *rb = 0;
-
-   if (!attrib_list)
-      return EGL_BAD_ATTRIBUTE;
-
-   for (i = 0; attrib_list[i] != EGL_NONE; i++) {
-      EGLint attr = attrib_list[i++];
-      EGLint val = attrib_list[i];
-
-      switch (attr) {
-      case EGL_GL_RENDER_BUFFER_ID_MESA:
-         *rb = val;
-         break;
-      default:
-         /* unknown attrs are ignored */
-         break;
-      }
-   }
-   if (*rb == 0)
-      err = EGL_BAD_ATTRIBUTE;
-
-   return err;
-}
diff --git a/src/x11/mesa_egl_res_share.h b/src/x11/mesa_egl_res_share.h
deleted file mode 100644
index 43e746e..0000000
--- a/src/x11/mesa_egl_res_share.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2013-2014 Zhigang Gong <zhigang.gong at linux.intel.com>
- * Copyright 2013-2014 Intel, Inc.
- * All Rights Reserved.
- *
- * 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 NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS 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 EGLRESSHARE_INCLUDED
-#define EGLRESSHARE_INCLUDED
-
-#include <EGL/egl.h>
-
-EGLint
-_eglParseTextureAttribList(unsigned int *texture, EGLenum *gl_target,
-                           EGLint *level, const EGLint *attrib_list);
-EGLint
-_eglParseBufferObjAttribList(unsigned int *bufobj,
-                             const EGLint *attrib_list);
-
-EGLint
-_eglParseRenderBufferAttribList(unsigned int *rb, const EGLint *attrib_list);
-#endif
diff --git a/utests/CMakeLists.txt b/utests/CMakeLists.txt
index 0c3cb00..feeee43 100644
--- a/utests/CMakeLists.txt
+++ b/utests/CMakeLists.txt
@@ -40,7 +40,10 @@ endif (NOT NOT_BUILD_STAND_ALONE_UTEST)
 ###################################################################################
 
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}
-                    ${CMAKE_CURRENT_SOURCE_DIR}/../include)
+                    ${CMAKE_CURRENT_SOURCE_DIR}/../include
+                    ${OPENGL_INCLUDE_DIRS}
+                    ${EGL_INCLUDE_DIRS})
+
 
 ##### Math Function Part:
 EXECUTE_PROCESS(COMMAND mkdir generated -p WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
@@ -58,7 +61,7 @@ configure_file (
   )
 
 #XXX only need GL if required
-link_directories (${LLVM_LIBRARY_DIR} ${OPENGL_LIBDIR} ${DRM_LIBDIR})
+link_directories (${LLVM_LIBRARY_DIR} ${OPENGL_LIBDIR} ${EGL_LIBDIR} ${X11_LIBDIR} ${DRM_LIBDIR})
 
 set (utests_basic_sources
   utest_error.c
@@ -340,13 +343,12 @@ add_custom_target(utest_generator
     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
     )
 
-if (EGL_FOUND AND MESA_SOURCE_FOUND)
+#compiler_fill_gl_image test case also need xlib
+if (OPENGL_FOUND AND EGL_FOUND AND X11_FOUND)
   SET(utests_sources ${utests_sources} compiler_fill_gl_image.cpp)
-  SET(CMAKE_CXX_FLAGS "-DHAS_EGL ${CMAKE_CXX_FLAGS} ${DEF_OCL_PCH_PCM_PATH}")
-  SET(CMAKE_C_FLAGS "-DHAS_EGL ${CMAKE_C_FLAGS} ${DEF_OCL_PCH_PCM_PATH}")
-  SET(UTESTS_REQUIRED_EGL_LIB ${EGL_LIBRARIES})
-else()
-  SET(UTESTS_REQUIRED_EGL_LIB "")
+  SET(CMAKE_CXX_FLAGS "-DHAS_GL_EGL_X11 ${CMAKE_CXX_FLAGS} ${DEF_OCL_PCH_PCM_PATH}")
+  SET(CMAKE_C_FLAGS "-DHAS_GL_EGL_X11 ${CMAKE_C_FLAGS} ${DEF_OCL_PCH_PCM_PATH}")
+  SET(UTESTS_REQUIRED_GL_EGL_X11_LIB ${OPENGL_LIBRARIES} ${EGL_LIBRARIES} ${X11_LIBRARIES})
 endif()
 
 if (USE_STANDALONE_GBE_COMPILER STREQUAL "true")
@@ -362,9 +364,9 @@ endif ()
 ADD_LIBRARY(utests SHARED ${utests_sources})
 
 if (NOT_BUILD_STAND_ALONE_UTEST)
-  TARGET_LINK_LIBRARIES(utests cl m ${OPENGL_LIBRARIES} ${UTESTS_REQUIRED_EGL_LIB} ${CMAKE_THREAD_LIBS_INIT} ${UTESTS_REQUIRED_X11_LIB})
+  TARGET_LINK_LIBRARIES(utests cl m ${UTESTS_REQUIRED_GL_EGL_X11_LIB} ${CMAKE_THREAD_LIBS_INIT} ${UTESTS_REQUIRED_X11_LIB})
 else()
-  TARGET_LINK_LIBRARIES(utests ${OPENCL_LIBRARIES} m ${OPENGL_LIBRARIES} ${UTESTS_REQUIRED_EGL_LIB} ${CMAKE_THREAD_LIBS_INIT} ${UTESTS_REQUIRED_X11_LIB})
+  TARGET_LINK_LIBRARIES(utests ${OPENCL_LIBRARIES} m ${UTESTS_REQUIRED_GL_EGL_X11_LIB} ${CMAKE_THREAD_LIBS_INIT} ${UTESTS_REQUIRED_X11_LIB})
 endif()
 
 ADD_EXECUTABLE(utest_run utest_run.cpp)
diff --git a/utests/compiler_fill_gl_image.cpp b/utests/compiler_fill_gl_image.cpp
index f1eb8e7..b9d74d1 100644
--- a/utests/compiler_fill_gl_image.cpp
+++ b/utests/compiler_fill_gl_image.cpp
@@ -1,36 +1,14 @@
 #include "utest_helper.hpp"
 
-static void read_back(int tex, int width, int height, uint32_t * resultColor)
-{
-  float vertices[8] = {-1, 1, 1, 1, 1, -1, -1, -1};
-  float tex_coords[8] = {0, 0, 1, 0, 1, 1, 0, 1};
-
-  glBindTexture(GL_TEXTURE_2D, tex);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-  glEnable(GL_TEXTURE_2D);
-  glDisable(GL_BLEND);
-  glVertexPointer(2, GL_FLOAT, sizeof(float) * 2, vertices);
-  glEnableClientState(GL_VERTEX_ARRAY);
-  glClientActiveTexture(GL_TEXTURE0);
-  glTexCoordPointer(2, GL_FLOAT, sizeof(float) * 2, tex_coords);
-  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-  glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-  glFlush();
-  OCL_SWAP_EGL_BUFFERS();
-
-  glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, resultColor);
-}
-
 
 static void compiler_fill_gl_image(void)
 {
   const size_t w = EGL_WINDOW_WIDTH;
   const size_t h = EGL_WINDOW_HEIGHT;
-  uint32_t color = 0x123456FF;
-  uint32_t *resultColor;
+  uint32_t color0 = 0x123456FF;
+  uint32_t color1 = 0x789ABCDE;
+  uint32_t *resultColor0;
+  uint32_t *resultColor1;
   GLuint tex;
 
   if (eglContext == EGL_NO_CONTEXT) {
@@ -44,13 +22,15 @@ static void compiler_fill_gl_image(void)
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, NULL);
+  glGenerateMipmap(GL_TEXTURE_2D);
+  glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, w/2, h/2, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, NULL);
 
   OCL_CREATE_KERNEL("test_fill_gl_image");
+  //Create cl image from miplevel 0
   OCL_CREATE_GL_IMAGE(buf[0], 0, GL_TEXTURE_2D, 0, tex);
-
   // Run the kernel
   OCL_SET_ARG(0, sizeof(cl_mem), &buf[0]);
-  OCL_SET_ARG(1, sizeof(color), &color);
+  OCL_SET_ARG(1, sizeof(color0), &color0);
   globals[0] = w;
   globals[1] = h;
   locals[0] = 16;
@@ -59,18 +39,37 @@ static void compiler_fill_gl_image(void)
   OCL_ENQUEUE_ACQUIRE_GL_OBJECTS(0);
   OCL_NDRANGE(2);
   OCL_FLUSH();
+  OCL_ENQUEUE_RELEASE_GL_OBJECTS(0);
 
   // Check result
-  resultColor = new uint32_t[w * h * 4];
-  if (resultColor == NULL)
+  resultColor0 = new uint32_t[w * h];
+  if (resultColor0 == NULL)
     assert(0);
-
-  read_back(tex, w, h, resultColor);
+  glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, resultColor0);
   for (uint32_t j = 0; j < h; ++j)
     for (uint32_t i = 0; i < w; i++)
-      OCL_ASSERT(resultColor[j * w + i] == color);
-  OCL_UNMAP_BUFFER(0);
-  delete[] resultColor;
+      OCL_ASSERT(resultColor0[j * w + i] == color0);
+
+
+  //Create cl image from miplevel 1
+  OCL_CREATE_GL_IMAGE(buf[1], 0, GL_TEXTURE_2D, 1, tex);
+  OCL_SET_ARG(0, sizeof(cl_mem), &buf[1]);
+  OCL_SET_ARG(1, sizeof(color1), &color1);
+  globals[0] = w/2;
+  globals[1] = h/2;
+  OCL_ENQUEUE_ACQUIRE_GL_OBJECTS(1);
+  OCL_NDRANGE(2);
+  OCL_FLUSH();
+  OCL_ENQUEUE_RELEASE_GL_OBJECTS(1);
+
+  // Check result
+  resultColor1 = new uint32_t[(w/2)*(h/2)];
+  glGetTexImage(GL_TEXTURE_2D, 1, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, resultColor1);
+  for (uint32_t j = 0; j < h/2; ++j)
+    for (uint32_t i = 0; i < w/2; i++)
+      OCL_ASSERT(resultColor1[j * (w/2) + i] == color1);
+  delete[] resultColor0;
+  delete[] resultColor1;
 }
 
 MAKE_UTEST_FROM_FUNCTION(compiler_fill_gl_image);
diff --git a/utests/utest_helper.cpp b/utests/utest_helper.cpp
index 70a69cc..d12dccf 100644
--- a/utests/utest_helper.cpp
+++ b/utests/utest_helper.cpp
@@ -57,7 +57,7 @@ __thread size_t locals[3] = {};
 float ULPSIZE_FAST_MATH = 10000.;
 __attribute__ ((visibility ("internal"))) clGetKernelSubGroupInfoKHR_cb* utestclGetKernelSubGroupInfoKHR = NULL;
 
-#ifdef HAS_EGL
+#ifdef HAS_GL_EGL_X11
 Display    *xDisplay;
 EGLDisplay  eglDisplay;
 EGLContext  eglContext = NULL;
@@ -435,7 +435,7 @@ cl_ocl_init(void)
   cl_int status = CL_SUCCESS;
   cl_uint platform_n;
   size_t i;
-#ifdef HAS_EGL
+#ifdef HAS_GL_EGL_X11
   bool hasGLExt = false;
 #endif
   cl_context_properties *props = NULL;
@@ -464,7 +464,7 @@ cl_ocl_init(void)
       GET_DEVICE_STR_INFO(version, VERSION);
       GET_DEVICE_STR_INFO(extensions, EXTENSIONS);
       GET_DEVICE_STR_INFO(opencl_c_version, OPENCL_C_VERSION);
-#ifdef HAS_EGL
+#ifdef HAS_GL_EGL_X11
       if (std::strstr(extensionsStr.c_str(), "cl_khr_gl_sharing")) {
         hasGLExt = true;
       }
@@ -476,7 +476,7 @@ cl_ocl_init(void)
      goto error;
   }
 
-#ifdef HAS_EGL
+#ifdef HAS_GL_EGL_X11
   if (hasGLExt) {
     int i = 0;
     props = new cl_context_properties[7];
@@ -556,7 +556,7 @@ cl_ocl_destroy(void)
 {
   clReleaseCommandQueue(queue);
   clReleaseContext(ctx);
-#ifdef HAS_EGL
+#ifdef HAS_GL_EGL_X11
   if (eglContext != NULL) {
     cl_ocl_destroy_egl_window();
     eglContext = NULL;
diff --git a/utests/utest_helper.hpp b/utests/utest_helper.hpp
index 5f2fea6..034a411 100644
--- a/utests/utest_helper.hpp
+++ b/utests/utest_helper.hpp
@@ -39,13 +39,15 @@
 #define __thread
 #endif
 
-#ifdef HAS_EGL
+#ifdef HAS_GL_EGL_X11
 #define EGL_WINDOW_WIDTH 256
 #define EGL_WINDOW_HEIGHT 256
+#define GL_GLEXT_PROTOTYPES
 #include  <GL/gl.h>
+#include  <GL/glext.h>
 #include  <EGL/egl.h>
 #include  <EGL/eglext.h>
-#include <CL/cl_gl.h>
+#include  <CL/cl_gl.h>
 
 extern EGLDisplay  eglDisplay;
 extern EGLContext  eglContext;
@@ -126,6 +128,9 @@ union uint32_cast {
 #define OCL_ENQUEUE_ACQUIRE_GL_OBJECTS(ID) \
     OCL_CALL(clEnqueueAcquireGLObjects, queue, 1, &buf[ID], 0, 0, 0)
 
+#define OCL_ENQUEUE_RELEASE_GL_OBJECTS(ID) \
+    OCL_CALL(clEnqueueReleaseGLObjects, queue, 1, &buf[ID], 0, 0, 0)
+
 #define OCL_SWAP_EGL_BUFFERS() \
   eglSwapBuffers(eglDisplay, eglSurface);
 
-- 
1.9.1



More information about the Beignet mailing list