Some code from AMD sample. Try to adapt it.
int SimpleGLSample::initializeGLAndGetCLContext(cl_platform_id platform,
cl_context &context,
cl_device_id &interopDevice)
{
#ifndef _WIN32
cl_int status = SDK_SUCCESS;
int numDevices;
displayName = XOpenDisplay(NULL);
int screenNumber = ScreenCount(displayName);
std::cout<<"Number of displays "<<screenNumber<<std::endl;
XCloseDisplay(displayName);
for (int i = 0; i < screenNumber; i++)
{
if (sampleArgs->isDeviceIdEnabled())
{
if (i < sampleArgs->deviceId)
{
continue;
}
}
char disp[100];
sprintf(disp, "DISPLAY=:0.%d", i);
putenv(disp);
displayName = XOpenDisplay(0);
int nelements;
GLXFBConfig *fbc = glXChooseFBConfig(displayName, DefaultScreen(displayName), 0,
&nelements);
if(fbc == NULL)
{
std::cout << "ERROR:" ;
std::cout << "Unable to find any frame buffer configuration..";
std::cout << std::endl;
std::cout << "glxChooseFBConfig returned NULL pointer." << std::endl;
return SDK_FAILURE;
}
static int attributeList[] = { GLX_RGBA,
GLX_DOUBLEBUFFER,
GLX_RED_SIZE,
1,
GLX_GREEN_SIZE,
1,
GLX_BLUE_SIZE,
1,
None
};
XVisualInfo *vi = glXChooseVisual(displayName,
DefaultScreen(displayName),
attributeList);
XSetWindowAttributes swa;
swa.colormap = XCreateColormap(displayName, RootWindow(displayName, vi->screen),
vi->visual, AllocNone);
swa.border_pixel = 0;
swa.event_mask = StructureNotifyMask;
win = XCreateWindow(displayName,
RootWindow(displayName, vi->screen),
10,
10,
WINDOW_WIDTH,
WINDOW_HEIGHT,
0,
vi->depth,
InputOutput,
vi->visual,
CWBorderPixel|CWColormap|CWEventMask,
&swa);
XMapWindow (displayName, win);
std::cout << "glXCreateContextAttribsARB "
<< (void*) glXGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB")
<< std::endl;
GLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB =
(GLXCREATECONTEXTATTRIBSARBPROC)
glXGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB");
int attribs[] =
{
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
GLX_CONTEXT_MINOR_VERSION_ARB, 0,
0
};
GLXContext ctx = glXCreateContextAttribsARB(displayName, *fbc, 0, true,
attribs);
if(!ctx)
{
std::cout << "ERROR:GL context creation failed." << std::endl;
return SDK_FAILURE;
}
glXMakeCurrent (displayName, win, ctx);
gGlCtx = glXGetCurrentContext();
cl_context_properties cpsGL[] = { CL_CONTEXT_PLATFORM, (cl_context_properties)platform,
CL_GLX_DISPLAY_KHR, (intptr_t) glXGetCurrentDisplay(),
CL_GL_CONTEXT_KHR, (intptr_t) gGlCtx, 0
};
if (!clGetGLContextInfoKHR)
{
clGetGLContextInfoKHR = (clGetGLContextInfoKHR_fn)
clGetExtensionFunctionAddressForPlatform(platform, "clGetGLContextInfoKHR");
if (!clGetGLContextInfoKHR)
{
std::cout << "Failed to query proc address for clGetGLContextInfoKHR";
}
}
size_t deviceSize = 0;
status = clGetGLContextInfoKHR(cpsGL,
CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR,
0,
NULL,
&deviceSize);
CHECK_OPENCL_ERROR(status, "clGetGLContextInfoKHR failed!!");
numDevices = (deviceSize / sizeof(cl_device_id));
std::cout<<"Number of interoperable devices "<<numDevices<<std::endl;
if (numDevices == 0)
{
//glXMakeCurrent(glXGetCurrentDisplay(), glXGetCurrentDrawable(), 0 );
glXDestroyContext(glXGetCurrentDisplay(), gGlCtx);
gGlCtx=NULL;
continue;
}
else
{
//Interoperable device found
break;
}
}
if (numDevices == 0)
{
std::cout << "Interoperable device not found."
<< std::endl;
return SDK_EXPECTED_FAILURE;
}
cl_context_properties cpsGL[] = { CL_CONTEXT_PLATFORM, (cl_context_properties)platform,
CL_GLX_DISPLAY_KHR, (intptr_t) glXGetCurrentDisplay(),
CL_GL_CONTEXT_KHR, (intptr_t) gGlCtx, 0
};
if (sampleArgs->deviceType.compare("gpu") == 0)
{
status = clGetGLContextInfoKHR( cpsGL,
CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR,
sizeof(cl_device_id),
&interopDeviceId,
NULL);
CHECK_OPENCL_ERROR(status, "clGetGLContextInfoKHR failed!!");
std::cout<<"Interop Device ID is "<<interopDeviceId<<std::endl;
// Create OpenCL context from device's id
context = clCreateContext(cpsGL,
1,
&interopDeviceId,
0,
0,
&status);
CHECK_OPENCL_ERROR(status, "clCreateContext failed.");
}
else
{
context = clCreateContextFromType(cpsGL,
CL_DEVICE_TYPE_CPU,
NULL,
NULL,
&status);
CHECK_OPENCL_ERROR(status, "clCreateContextFromType failed!!");
}
// GL init
glewInit();
if (! glewIsSupported("GL_VERSION_2_0 " "GL_ARB_pixel_buffer_object"))
{
std::cout << "Support for necessary OpenGL extensions missing."
<< std::endl;
return SDK_FAILURE;
}
glEnable(GL_TEXTURE_2D);
glClearColor(0.0, 0.0, 0.0, 1.0);
glDisable(GL_DEPTH_TEST);
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(
60.0,
(GLfloat)WINDOW_WIDTH / (GLfloat) WINDOW_HEIGHT,
0.1,
10.0);
#endif
return SDK_SUCCESS;
}
You probably only need these lines:
gGlCtx = glXGetCurrentContext();
cl_context_properties cpsGL[] = { CL_CONTEXT_PLATFORM, (cl_context_properties)platform,
CL_GLX_DISPLAY_KHR, (intptr_t) glXGetCurrentDisplay(),
CL_GL_CONTEXT_KHR, (intptr_t) gGlCtx, 0
};