Which version is this patch required? I think it introduce a new dependence, suppose someone has an old verion libegl, will cause build error, even if doesn’t need cl_khr_gl_sharing extension. Can you add an libegl version check to cmake to avoid it?
> -----Original Message----- > From: Weng, Chuanbo > Sent: Monday, September 5, 2016 11:10 > To: Yang, Rong R <[email protected]>; [email protected] > Subject: RE: [Beignet] [PATCH] Runtime: re-enable cl_khr_gl_sharing with > existing egl extension. > > This is because of your egl version. > Please build and install latest mesa code from upstream: > https://cgit.freedesktop.org/mesa/mesa/ > With the following commands: > ./autogen.sh --with-dri-drivers="swrast,i965" --with-gallium-drivers="" -- > enable-gles1 --enable-gles2 --with-egl-platforms="x11,drm" > make > make install > > -----Original Message----- > From: Yang, Rong R > Sent: Thursday, September 1, 2016 2:04 PM > To: Weng, Chuanbo <[email protected]>; > [email protected] > Cc: Weng, Chuanbo <[email protected]> > Subject: RE: [Beignet] [PATCH] Runtime: re-enable cl_khr_gl_sharing with > existing egl extension. > > After install libegl, there is a build error: > error: unknown type name ‘EGLImage’ > > > -----Original Message----- > > From: Beignet [mailto:[email protected]] On Behalf > Of > > Chuanbo Weng > > Sent: Wednesday, August 31, 2016 0:56 > > To: [email protected] > > Cc: Weng, Chuanbo <[email protected]> > > Subject: [Beignet] [PATCH] 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. > > > > Signed-off-by: Chuanbo Weng <[email protected]> > > --- > > CMake/FindMesaSrc.cmake | 26 --- > > CMakeLists.txt | 8 - > > src/CMakeLists.txt | 11 +- > > src/cl_driver.h | 32 +-- > > src/cl_driver_defs.c | 7 - > > src/cl_gl_api.c | 17 +- > > 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 | 132 +++++++++---- > > 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 | 2 +- > > utests/compiler_fill_gl_image.cpp | 69 ++++--- > > utests/utest_helper.hpp | 7 +- > > 20 files changed, 174 insertions(+), 1067 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..472c922 100644 > > --- a/CMakeLists.txt > > +++ b/CMakeLists.txt > > @@ -214,14 +214,6 @@ 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) > > - > > Find_Package(OCLIcd) > > IF(OCLIcd_FOUND) > > MESSAGE(STATUS "Looking for OCL ICD header file - found") > > diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt > > index a002865..bf1e9ae 100644 > > --- a/src/CMakeLists.txt > > +++ b/src/CMakeLists.txt > > @@ -3,7 +3,6 @@ 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}) > > > > macro (MakeKernelBinStr KERNEL_PATH KERNEL_FILES) > > @@ -108,14 +107,14 @@ 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) > > +if (EGL_FOUND) > > + set (OPENCL_SRC ${OPENCL_SRC} cl_mem_gl.c cl_gl_api.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 "${EGL_LIBRARIES}") > > +else(EGL_FOUND) > > SET(OPTIONAL_EGL_LIBRARY "") > > -endif (EGL_FOUND AND MESA_SOURCE_FOUND) > > +endif (EGL_FOUND) > > > > if (OCLIcd_FOUND) > > set (OPENCL_SRC ${OPENCL_SRC} cl_khr_icd.c) > > 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_gl_api.c b/src/cl_gl_api.c > > index 519aab6..e89bb15 100644 > > --- a/src/cl_gl_api.c > > +++ b/src/cl_gl_api.c > > @@ -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.h b/src/cl_mem.h > > index c8f256d..ae85b73 100644 > > --- a/src/cl_mem.h > > +++ b/src/cl_mem.h > > @@ -26,6 +26,9 @@ > > #include "cl_khr_icd.h" > > #include <assert.h> > > #include <pthread.h> > > +#if defined(HAS_EGL) > > +#include "EGL/egl.h" > > +#endif > > > > #ifndef CL_VERSION_1_2 > > #define CL_MEM_OBJECT_IMAGE1D 0x10F4 > > @@ -118,9 +121,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_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, ®ion->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, ®ion->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..6d3337a 100644 > > --- a/src/intel/intel_driver.c > > +++ b/src/intel/intel_driver.c > > @@ -47,9 +47,10 @@ > > */ > > > > #if defined(HAS_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 > > @@ -537,8 +538,25 @@ static uint32_t > > intel_buffer_get_tiling_align(cl_context ctx, uint32_t tiling_mo > > } > > > > #if defined(HAS_EGL) > > -#include "intel_dri_resource_sharing.h" > > +#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], ®ion); > > - 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, > > ¶m_value); > > + info.w = param_value; > > + glGetTexLevelParameteriv(target, miplevel, GL_TEXTURE_HEIGHT, > > ¶m_value); > > + info.h = param_value; > > + glGetTexLevelParameteriv(target, miplevel, GL_TEXTURE_DEPTH, > > ¶m_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, ¶m_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; > > @@ -931,7 +988,6 @@ intel_setup_callbacks(void) > > #if defined(HAS_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 <[email protected]> > > - * 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 <[email protected]> > > - * 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..e7da976 100644 > > --- a/utests/CMakeLists.txt > > +++ b/utests/CMakeLists.txt > > @@ -340,7 +340,7 @@ add_custom_target(utest_generator > > WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} > > ) > > > > -if (EGL_FOUND AND MESA_SOURCE_FOUND) > > +if (EGL_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}") > > 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.hpp b/utests/utest_helper.hpp > > index 5f2fea6..213766f 100644 > > --- a/utests/utest_helper.hpp > > +++ b/utests/utest_helper.hpp > > @@ -42,10 +42,12 @@ > > #ifdef HAS_EGL > > #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 > > [email protected] > > https://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/beignet
