-
-
Save vchuravy/107bed109811a0104a77 to your computer and use it in GitHub Desktop.
OpenCL OpenGL interop test
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
cmake_minimum_required (VERSION 2.6) | |
project (ogltest) | |
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}) | |
find_package(PkgConfig REQUIRED) | |
pkg_search_module(GLFW REQUIRED glfw3) | |
find_package(OpenGL REQUIRED) | |
if(NOT OPENGL_FOUND) | |
message("ERROR: OpenGL not found") | |
endif(NOT OPENGL_FOUND) | |
set(GL_LIBRARY GL GLU X11) | |
find_package(OpenCL REQUIRED) | |
if(NOT OPENCL_FOUND) | |
message("ERROR: OpenCL not found") | |
endif(NOT OPENCL_FOUND) | |
add_executable(gltest gltest.c) | |
include_directories(${GLFW_INCLUDE_DIRS} ${OPENCL_INCLUDE_DIRS}) | |
target_link_libraries(gltest ${GLFW_LIBRARIES} ${GL_LIBRARY} ${OPENCL_LIBRARIES}) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# - Try to find OpenCL | |
# This module tries to find an OpenCL implementation on your system. It supports | |
# AMD / ATI, Apple and NVIDIA implementations, but should work, too. | |
# | |
# To set manually the paths, define these environment variables: | |
# OpenCL_INCPATH - Include path (e.g. OpenCL_INCPATH=/opt/cuda/4.0/cuda/include) | |
# OpenCL_LIBPATH - Library path (e.h. OpenCL_LIBPATH=/usr/lib64/nvidia) | |
# | |
# Once done this will define | |
# OPENCL_FOUND - system has OpenCL | |
# OPENCL_INCLUDE_DIRS - the OpenCL include directory | |
# OPENCL_LIBRARIES - link these to use OpenCL | |
# | |
# WIN32 should work, but is untested | |
FIND_PACKAGE(PackageHandleStandardArgs) | |
SET (OPENCL_VERSION_STRING "0.1.0") | |
SET (OPENCL_VERSION_MAJOR 0) | |
SET (OPENCL_VERSION_MINOR 1) | |
SET (OPENCL_VERSION_PATCH 0) | |
IF (APPLE) | |
FIND_LIBRARY(OPENCL_LIBRARIES OpenCL DOC "OpenCL lib for OSX") | |
FIND_PATH(OPENCL_INCLUDE_DIRS OpenCL/cl.h DOC "Include for OpenCL on OSX") | |
FIND_PATH(_OPENCL_CPP_INCLUDE_DIRS OpenCL/cl.hpp DOC "Include for OpenCL CPP bindings on OSX") | |
ELSE (APPLE) | |
IF (WIN32) | |
FIND_PATH(OPENCL_INCLUDE_DIRS CL/cl.h) | |
FIND_PATH(_OPENCL_CPP_INCLUDE_DIRS CL/cl.hpp) | |
# The AMD SDK currently installs both x86 and x86_64 libraries | |
# This is only a hack to find out architecture | |
IF( ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64" ) | |
SET(OPENCL_LIB_DIR "$ENV{ATISTREAMSDKROOT}/lib/x86_64") | |
ELSE (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64") | |
SET(OPENCL_LIB_DIR "$ENV{ATISTREAMSDKROOT}/lib/x86") | |
ENDIF( ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64" ) | |
FIND_LIBRARY(OPENCL_LIBRARIES OpenCL.lib PATHS ${OPENCL_LIB_DIR} ENV OpenCL_LIBPATH) | |
GET_FILENAME_COMPONENT(_OPENCL_INC_CAND ${OPENCL_LIB_DIR}/../../include ABSOLUTE) | |
# On Win32 search relative to the library | |
FIND_PATH(OPENCL_INCLUDE_DIRS CL/cl.h PATHS "${_OPENCL_INC_CAND}" ENV OpenCL_INCPATH) | |
FIND_PATH(_OPENCL_CPP_INCLUDE_DIRS CL/cl.hpp PATHS "${_OPENCL_INC_CAND}" ENV OpenCL_INCPATH) | |
ELSE (WIN32) | |
# Unix style platforms | |
FIND_LIBRARY(OPENCL_LIBRARIES OpenCL | |
PATHS ENV LD_LIBRARY_PATH ENV OpenCL_LIBPATH | |
) | |
GET_FILENAME_COMPONENT(OPENCL_LIB_DIR ${OPENCL_LIBRARIES} PATH) | |
GET_FILENAME_COMPONENT(_OPENCL_INC_CAND ${OPENCL_LIB_DIR}/../../include ABSOLUTE) | |
# The AMD SDK currently does not place its headers | |
# in /usr/include, therefore also search relative | |
# to the library | |
FIND_PATH(OPENCL_INCLUDE_DIRS CL/cl.h PATHS ${_OPENCL_INC_CAND} "/usr/local/cuda/include" "/opt/AMDAPP/include" ENV OpenCL_INCPATH) | |
FIND_PATH(_OPENCL_CPP_INCLUDE_DIRS CL/cl.hpp PATHS ${_OPENCL_INC_CAND} "/usr/local/cuda/include" "/opt/AMDAPP/include" ENV OpenCL_INCPATH) | |
ENDIF (WIN32) | |
ENDIF (APPLE) | |
FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenCL DEFAULT_MSG OPENCL_LIBRARIES OPENCL_INCLUDE_DIRS) | |
IF(_OPENCL_CPP_INCLUDE_DIRS) | |
SET( OPENCL_HAS_CPP_BINDINGS TRUE ) | |
LIST( APPEND OPENCL_INCLUDE_DIRS ${_OPENCL_CPP_INCLUDE_DIRS} ) | |
# This is often the same, so clean up | |
LIST( REMOVE_DUPLICATES OPENCL_INCLUDE_DIRS ) | |
ENDIF(_OPENCL_CPP_INCLUDE_DIRS) | |
MARK_AS_ADVANCED( | |
OPENCL_INCLUDE_DIRS | |
) | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <GLFW/glfw3.h> | |
#include <stdlib.h> | |
#include <stdio.h> | |
#include <CL/cl.h> | |
#include <CL/cl_gl.h> | |
static void error_callback(int error, const char* description) | |
{ | |
fputs(description, stderr); | |
} | |
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) | |
{ | |
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) | |
glfwSetWindowShouldClose(window, GL_TRUE); | |
} | |
int main(void) | |
{ | |
GLFWwindow* window; | |
glfwSetErrorCallback(error_callback); | |
if (!glfwInit()) | |
exit(EXIT_FAILURE); | |
window = glfwCreateWindow(512, 512, "Simple example", NULL, NULL); | |
if (!window) | |
{ | |
glfwTerminate(); | |
exit(EXIT_FAILURE); | |
} | |
glfwMakeContextCurrent(window); | |
glfwSetKeyCallback(window, key_callback); | |
int width, height; | |
glfwGetFramebufferSize(window, &width, &height); | |
glEnable(GL_TEXTURE_2D); | |
int texture[1]; | |
glGenTextures(1, &texture[0]); | |
glBindTexture(GL_TEXTURE_2D, texture[0]); // 2d texture (x and y size) | |
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // scale linearly when image bigger than texture | |
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // scale linearly when image smalled than texture | |
// 2d texture, level of detail 0 (normal), 3 components (red, green, blue), x size from image, y size from image, | |
// border 0 (normal), rgb color data, unsigned byte data, and finally the data itself. | |
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); | |
// Init OpenCL | |
cl_platform_id platform_id = NULL; | |
cl_device_id device_id = NULL; | |
cl_uint ret_num_devices; | |
cl_uint ret_num_platforms; | |
cl_int ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms); | |
ret = clGetDeviceIDs( platform_id, CL_DEVICE_TYPE_DEFAULT, 1, | |
&device_id, &ret_num_devices); | |
cl_context_properties properties[] = { | |
CL_CONTEXT_PLATFORM, (cl_context_properties)platform_id, | |
CL_GL_CONTEXT_KHR, (cl_context_properties)glXGetCurrentContext(), | |
CL_GLX_DISPLAY_KHR, (cl_context_properties)glXGetCurrentDisplay(), | |
0 | |
}; | |
cl_context ctx = clCreateContext(properties, 1, &device_id, NULL, NULL, &ret); | |
if(ret != 0) | |
printf("Context creation => OpenCL error: %d\n", ret); | |
// Create a command queue | |
cl_command_queue queue = clCreateCommandQueue(ctx, device_id, 0, &ret); | |
//Create Image | |
cl_mem image = clCreateFromGLTexture2D(ctx, CL_MEM_READ_WRITE, GL_TEXTURE_2D, 0, texture[0], &ret); | |
if(ret != 0) | |
printf("Texture creation => OpenCL error: %d\n", ret); | |
// Create Buffer RGB * width * height | |
cl_mem buffer = clCreateBuffer(ctx, CL_MEM_WRITE_ONLY, 3 * width * height, NULL, &ret); | |
if(ret != 0) | |
printf("Buffer creation => OpenCL error: %d\n", ret); | |
while (!glfwWindowShouldClose(window)) | |
{ | |
float ratio; | |
ratio = width / (float) height; | |
glViewport(0, 0, width, height); | |
glClear(GL_COLOR_BUFFER_BIT); | |
glMatrixMode(GL_PROJECTION); | |
glLoadIdentity(); | |
glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f); | |
glMatrixMode(GL_MODELVIEW); | |
glLoadIdentity(); | |
glRotatef(0.f, 0.f, 0.f, 1.f); | |
glBindTexture(GL_TEXTURE_2D, texture[0]); | |
glBegin(GL_QUADS); | |
glColor3f(1.f, 0.f, 0.f); | |
glVertex3f(-1.f, -1.f, 0.f); | |
glColor3f(0.f, 1.f, 0.f); | |
glVertex3f(-1.f, 1.f, 0.f); | |
glColor3f(0.f, 0.f, 1.f); | |
glVertex3f(1.f, 1.f, 0.f); | |
glColor3f(0.f, 0.f, 1.f); | |
glVertex3f(1.f, -1.f, 0.f); | |
glEnd(); | |
glfwSwapBuffers(window); | |
glfwPollEvents(); | |
} | |
ret = clFlush(queue); | |
ret = clFinish(queue); | |
ret = clReleaseMemObject(image); | |
ret = clReleaseMemObject(buffer); | |
ret = clReleaseCommandQueue(queue); | |
ret = clReleaseContext(ctx); | |
glfwDestroyWindow(window); | |
glfwTerminate(); | |
exit(EXIT_SUCCESS); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment