diff options
-rw-r--r-- | CMakeLists.txt | 34 | ||||
-rw-r--r-- | examples/CMakeLists.txt | 80 | ||||
-rw-r--r-- | examples/gl_buffer_sharing/gl_buffer_sharing.cpp | 115 | ||||
-rw-r--r-- | kernels/runtime_fill_gl_image.cl | 15 | ||||
-rw-r--r-- | utests/utest_helper.hpp | 2 |
5 files changed, 199 insertions, 47 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 3246567d..e4a4eda7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -195,22 +195,18 @@ ELSE(XFIXES_FOUND) ENDIF(XFIXES_FOUND) ENDIF(X11_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) +pkg_check_modules(OPENGL QUIET gl>=13.0.0) +IF(OPENGL_FOUND) + MESSAGE(STATUS "Looking for OpenGL - found at ${OPENGL_PREFIX} ${OPENGL_VERSION}") +ELSE(OPENGL_FOUND) + MESSAGE(STATUS "Looking for OpenGL (>=13.0.0) - not found, cl_khr_gl_sharing will be disabled") +ENDIF(OPENGL_FOUND) +pkg_check_modules(EGL QUIET egl>=13.0.0) +IF(EGL_FOUND) + MESSAGE(STATUS "Looking for EGL - found at ${EGL_PREFIX} ${EGL_VERSION}") +ELSE(EGL_FOUND) + MESSAGE(STATUS "Looking for EGL (>=13.0.0) - not found, cl_khr_gl_sharing will be disabled") +ENDIF(EGL_FOUND) OPTION(OCLICD_COMPAT "OCL ICD compatibility mode" ON) IF(OCLICD_COMPAT) @@ -281,7 +277,6 @@ IF(NOT X11_FOUND) ENDIF(NOT X11_FOUND) # libva & libva-x11 -#pkg_check_modules(LIBVA REQUIRED libva>=0.36.0) pkg_check_modules(LIBVA REQUIRED libva) pkg_check_modules(LIBVA-X11 REQUIRED libva-x11) set(LIBVA_BUF_SH_DEP false) @@ -303,7 +298,12 @@ IF(LIBVA_FOUND AND LIBVA-X11_FOUND) ELSE(LIBVA_VERSION VERSION_LESS "0.36.0" OR LIBVA-X11_VERSION VERSION_LESS "0.36.0") set(LIBVA_BUF_SH_DEP true) ENDIF(LIBVA_VERSION VERSION_LESS "0.36.0" OR LIBVA-X11_VERSION VERSION_LESS "0.36.0") +ELSE(LIBVA_FOUND AND LIBVA-X11_FOUND) + MESSAGE(STATUS "Example libva_buffer_sharing and v4l2_buffer_sharing will not be built") ENDIF(LIBVA_FOUND AND LIBVA-X11_FOUND) +IF(NOT (OPENGL_FOUND AND EGL_FOUND AND X11_FOUND)) + MESSAGE(STATUS "Example gl_buffer_sharing will not be built") +ENDIF(NOT (OPENGL_FOUND AND EGL_FOUND AND X11_FOUND)) ENDIF(BUILD_EXAMPLES) ADD_SUBDIRECTORY(include) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 850b3d90..a9e35c24 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,44 +1,64 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../utests ${CMAKE_CURRENT_SOURCE_DIR}/../include - ${X11_INCLUDE_DIR}) + ${X11_INCLUDE_DIR} + ${OPENGL_INCLUDE_DIRS} + ${EGL_INCLUDE_DIRS}) + +set (ocl_example_helper_sources + ../utests/utest_error.c + ../utests/utest_assert.cpp + ../utests/utest_file_map.cpp + ../utests/utest_helper.cpp) + +IF(OPENGL_FOUND AND EGL_FOUND AND X11_FOUND) + ADD_DEFINITIONS(-DHAS_GL_EGL_X11) +ENDIF(OPENGL_FOUND AND EGL_FOUND AND X11_FOUND) + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations" ) + +ADD_LIBRARY(ocl_example_helper SHARED ${ocl_example_helper_sources}) + +TARGET_LINK_LIBRARIES(ocl_example_helper cl m ${X11_LIBRARIES} ${OPENGL_LIBRARIES} ${EGL_LIBRARIES}) IF(LIBVA_BUF_SH_DEP OR V4L2_BUF_SH_DEP) -EXECUTE_PROCESS(COMMAND ls "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libva" OUTPUT_VARIABLE LS_RESULT) -IF ("LS_RESULT" STREQUAL "") -EXECUTE_PROCESS(COMMAND git submodule init WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..) -EXECUTE_PROCESS(COMMAND git submodule update WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..) -EXECUTE_PROCESS(COMMAND git checkout master WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libva) -ENDIF ("LS_RESULT" STREQUAL "") + EXECUTE_PROCESS(COMMAND ls "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libva" OUTPUT_VARIABLE LS_RESULT) + IF ("LS_RESULT" STREQUAL "") + EXECUTE_PROCESS(COMMAND git submodule init WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..) + EXECUTE_PROCESS(COMMAND git submodule update WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..) + EXECUTE_PROCESS(COMMAND git checkout master WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libva) + ENDIF ("LS_RESULT" STREQUAL "") -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libva/va - ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libva/test/common) + INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libva/va + ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libva/test/common) -link_directories (${LIBVA_LIBDIR} - ${LIBVA-X11_LIBDIR}) + link_directories (${LIBVA_LIBDIR} + ${LIBVA-X11_LIBDIR}) -set (va_ocl_basic_sources - ../utests/utest_error.c - ../utests/utest_assert.cpp - ../utests/utest_file_map.cpp - ../utests/utest_helper.cpp - ./thirdparty/libva/test/common/va_display.c - ./thirdparty/libva/test/common/va_display_x11.c) + set (va_display_sources + ./thirdparty/libva/test/common/va_display.c + ./thirdparty/libva/test/common/va_display_x11.c) -ADD_DEFINITIONS(-DHAVE_VA_X11) + ADD_DEFINITIONS(-DHAVE_VA_X11) -ADD_LIBRARY(va_ocl_basic SHARED ${va_ocl_basic_sources}) + ADD_LIBRARY(va_display SHARED ${va_display_sources}) -TARGET_LINK_LIBRARIES(va_ocl_basic cl m va va-x11 ${X11_X11_LIB}) + TARGET_LINK_LIBRARIES(va_display cl m va va-x11 ${X11_LIBRARIES}) -IF(LIBVA_BUF_SH_DEP) -ADD_DEFINITIONS(-DINPUT_NV12_DEFAULT="${CMAKE_CURRENT_SOURCE_DIR}/libva_buffer_sharing/256_128.nv12") -ADD_EXECUTABLE(example-libva_buffer_sharing ./libva_buffer_sharing/libva_buffer_sharing.cpp) -TARGET_LINK_LIBRARIES(example-libva_buffer_sharing va_ocl_basic) -ENDIF(LIBVA_BUF_SH_DEP) + IF(LIBVA_BUF_SH_DEP) + ADD_DEFINITIONS(-DINPUT_NV12_DEFAULT="${CMAKE_CURRENT_SOURCE_DIR}/libva_buffer_sharing/256_128.nv12") + ADD_EXECUTABLE(example-libva_buffer_sharing ./libva_buffer_sharing/libva_buffer_sharing.cpp) + TARGET_LINK_LIBRARIES(example-libva_buffer_sharing ocl_example_helper va_display) + ENDIF(LIBVA_BUF_SH_DEP) -IF(V4L2_BUF_SH_DEP) -ADD_EXECUTABLE(example-v4l2_buffer_sharing ./v4l2_buffer_sharing/v4l2_buffer_sharing.cpp) -TARGET_LINK_LIBRARIES(example-v4l2_buffer_sharing va_ocl_basic) -ENDIF(V4L2_BUF_SH_DEP) + IF(V4L2_BUF_SH_DEP) + ADD_EXECUTABLE(example-v4l2_buffer_sharing ./v4l2_buffer_sharing/v4l2_buffer_sharing.cpp) + TARGET_LINK_LIBRARIES(example-v4l2_buffer_sharing ocl_example_helper va_display) + ENDIF(V4L2_BUF_SH_DEP) ENDIF(LIBVA_BUF_SH_DEP OR V4L2_BUF_SH_DEP) + +IF(OPENGL_FOUND AND EGL_FOUND AND X11_FOUND) + ADD_EXECUTABLE(example-gl_buffer_sharing ./gl_buffer_sharing/gl_buffer_sharing.cpp) + TARGET_LINK_LIBRARIES(example-gl_buffer_sharing ocl_example_helper ${OPENGL_LIBRARIES} ${EGL_LIBRARIES}) +ENDIF(OPENGL_FOUND AND EGL_FOUND AND X11_FOUND) diff --git a/examples/gl_buffer_sharing/gl_buffer_sharing.cpp b/examples/gl_buffer_sharing/gl_buffer_sharing.cpp new file mode 100644 index 00000000..2d7e10d4 --- /dev/null +++ b/examples/gl_buffer_sharing/gl_buffer_sharing.cpp @@ -0,0 +1,115 @@ +/* + * Copyright © 2012 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#include "utest_helper.hpp" +#include <stdio.h> + +static cl_int cl_status; + +const size_t w = EGL_WINDOW_WIDTH; +const size_t h = EGL_WINDOW_HEIGHT; +static GLuint tex; + +static void draw(){ + XEvent event; + + float vertices[8] = {-1, 1, 1, 1, 1, -1, -1, -1}; + float tex_coords[8] = {0, 0, 1, 0, 1, 1, 0, 1}; + uint32_t color0 = 0x0000ff00; + + for (;;) + { + XNextEvent(xDisplay, &event); + + if (event.type == Expose) + { + glClearColor(0.0, 1.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + + OCL_SET_ARG(0, sizeof(cl_mem), &buf[0]); + OCL_SET_ARG(1, sizeof(color0), &color0); + globals[0] = w; + globals[1] = h; + locals[0] = 16; + locals[1] = 16; + glFinish(); + OCL_ENQUEUE_ACQUIRE_GL_OBJECTS(0); + OCL_NDRANGE(2); + OCL_ENQUEUE_RELEASE_GL_OBJECTS(0); + OCL_FINISH(); + + 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); + glFinish(); + eglSwapBuffers(eglDisplay, eglSurface); + } + if (event.type == KeyPress) + break; + } +} + + +static void initialize_ocl_gl(){ + + //ocl initialization: basic & create kernel & check extension + printf("\n***********************OpenCL info: ***********************\n"); + if ((cl_status = cl_test_init("runtime_fill_gl_image.cl", "runtime_fill_gl_image", SOURCE)) != 0){ + fprintf(stderr, "cl_test_init error\n"); + exit(1); + } + + if (eglContext == EGL_NO_CONTEXT) { + fprintf(stderr, "There is no valid egl context! Exit!\n"); + exit(1); + } + + XMapWindow(xDisplay, xWindow); + + // Setup kernel and images + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + 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); + + //Create cl image from miplevel 0 + OCL_CREATE_GL_IMAGE(buf[0], 0, GL_TEXTURE_2D, 0, tex); +} + +int main(int argc, char *argv[]) +{ + initialize_ocl_gl(); + + draw(); + + //destroy resource of cl & gl + cl_test_destroy(); + + printf("\nExample run successfully!\n"); +} diff --git a/kernels/runtime_fill_gl_image.cl b/kernels/runtime_fill_gl_image.cl new file mode 100644 index 00000000..79d40543 --- /dev/null +++ b/kernels/runtime_fill_gl_image.cl @@ -0,0 +1,15 @@ +__kernel void +runtime_fill_gl_image(image2d_t img, int color) +{ + int2 coord; + float4 color_v4; + int lgid_x = get_group_id(0); + int lgid_y = get_group_id(1); + int num_groups_x = get_num_groups(0); + int num_groups_y = get_num_groups(1); + + coord.x = get_global_id(0); + coord.y = get_global_id(1); + color_v4 = (float4)( lgid_x/(float)num_groups_x, lgid_y/(float)num_groups_y, 1.0, 1.0); + write_imagef(img, coord, color_v4); +} diff --git a/utests/utest_helper.hpp b/utests/utest_helper.hpp index 1bc810cf..e2a6a884 100644 --- a/utests/utest_helper.hpp +++ b/utests/utest_helper.hpp @@ -52,6 +52,8 @@ extern EGLDisplay eglDisplay; extern EGLContext eglContext; extern EGLSurface eglSurface; +extern Display *xDisplay; +extern Window xWindow; #endif union uint32_cast { |