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

Yang, Rong R rong.r.yang at intel.com
Mon Sep 12 08:42:43 UTC 2016


LGTM, thanks, will push it later.

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Chuanbo Weng
> Sent: Wednesday, September 7, 2016 18:59
> To: beignet at lists.freedesktop.org
> Cc: Weng, Chuanbo <chuanbo.weng at intel.com>
> Subject: [Beignet] [PATCH v2] Runtime: re-enable cl_khr_gl_sharing with
> existing egl extension.
> 
> 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
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list