I have tried PBO access. Fo future readers
I have based my solution on example from AMD SDK samples
unsigned int pbo;
/*
* Create pixel-buffer object
*/
glGenBuffers(1, &pbo);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, pbo);
// initialize buffer object
unsigned int size = width * height * sizeof(cl_uchar4);
// buffer data
glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, size, NULL, GL_STREAM_DRAW_ARB);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
// Create OpenCL buffer from GL PBO
outputImageBuffer = clCreateFromGLBuffer(context,
CL_MEM_WRITE_ONLY,
pbo,
&status);
CHECK_OPENCL_ERROR(status, "clCreateFromGLBuffer failed. (outputImageBuffer)");
// Acquire GL buffer
cl_event acquireEvt;
status = clEnqueueAcquireGLObjects(commandQueue,
1,
&outputImageBuffer,
0,
0,
&acquireEvt);
CHECK_OPENCL_ERROR(status, "clEnqueueAcquireGLObjects failed.");
// outBuffer imager
status = clSetKernelArg(
horizontalKernel,
1,
sizeof(cl_mem),
&outputImageBuffer);
CHECK_OPENCL_ERROR(status, "clSetKernelArg failed. (outputImageBuffer)");
..... kick off OpenCL kernel
// Now OpenGL gets control of outputImageBuffer
cl_event releaseGLEvt;
status = clEnqueueReleaseGLObjects(commandQueue,
1,
&outputImageBuffer,
0,
0,
&releaseGLEvt);
CHECK_OPENCL_ERROR(status, "clEnqueueReleaseGLObjects failed.");
// Bind PBO and texture
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, pbo);
glBindTexture(GL_TEXTURE_2D, textureID);
// Copy pixels from pbo to texture
glTexSubImage2D(GL_TEXTURE_2D,
0,
0,
0,
width,
height,
GL_RGBA,
GL_UNSIGNED_BYTE,
NULL);