OpenCL/OpenGL interoperability error

Started by
0 comments, last by tmarques4 11 years ago

Hello,

I'm trying to establish interop between CL and GL, the tutorials are very straightforward and everything looks to be set correctly, however, when I try to get a cl_mem from a VBO index, the error CL_INVALID_GL_OBJECT appears and I don't know what I'm doing wrong.


#include <SDL/SDL.h>
#include <GL/glew.h>
#include <GL/glx.h>
#include <stdio.h>

#ifdef __APPLE__
	#include <OpenCL/opencl.h>
#else
	#include <CL/cl.h>
	#include <CL/cl_gl.h>
#endif

//#define FULLSCREEN

int main(int argc, char *argv[])
{

	//******************
	//Setting up window.
	//******************

	int videoFlags;
	SDL_VideoInfo *videoInfo;

	SDL_Init(SDL_INIT_VIDEO);
	videoInfo = (SDL_VideoInfo *)SDL_GetVideoInfo();
	if(!videoInfo)
	{
		printf("Error: SDL failed to determine video info.");
		return false;
	}

	videoFlags = SDL_OPENGL | SDL_GL_DOUBLEBUFFER | SDL_HWSURFACE;
	#ifdef FULLSCREEN
		videoFlags += SDL_FULLSCREEN;
	#endif

	SDL_SetVideoMode(videoInfo->current_w,
			 videoInfo->current_h,
			 videoInfo->vfmt->BitsPerPixel,
			 videoFlags);

	//************************
	//Setting up openGL state.
	//************************

	glewInit();

	//******************************************************
	//Setting up openCL state and share context with openGL.
	//******************************************************

	cl_int state;
	cl_platform_id platform[100];
	cl_context context;
	cl_device_id devices[100];

	//Get platform.
	cl_uint numberOfPlatforms = 0;
	if(clGetPlatformIDs(100, platform, &numberOfPlatforms) != CL_SUCCESS)
	{
		printf("OpenCL Error: Platform couldn't be found.\n");
		return 0;
	}
	else
	{
		printf("%i platforms found.\n", numberOfPlatforms);
	}

	//Parameters needed to bind OpenGL's context to OpenCL's.
	cl_context_properties properties[] = {	CL_GL_CONTEXT_KHR, (cl_context_properties) glXGetCurrentContext(),
						CL_GLX_DISPLAY_KHR, (cl_context_properties) glXGetCurrentDisplay(),
						CL_CONTEXT_PLATFORM, (cl_context_properties) platform[0],
						0};

	//Find openGL devices.
	typedef CL_API_ENTRY cl_int (CL_API_CALL *CLpointer)(const cl_context_properties *properties, cl_gl_context_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret);
	CL_API_ENTRY cl_int (CL_API_CALL *myCLGetGLContextInfoKHR)(const cl_context_properties *properties, cl_gl_context_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) = (CLpointer)clGetExtensionFunctionAddressForPlatform(platform[0], "clGetGLContextInfoKHR");

	size_t size;
	state = myCLGetGLContextInfoKHR(properties, CL_DEVICES_FOR_GL_CONTEXT_KHR, 100*sizeof(cl_device_id), devices, &size);

	if(state != CL_SUCCESS)
	{
		printf("OpenCL Error: Devices couldn't be resolved.\n");
		return 0;
	}
	else
	{
		printf("%i devices support OpenGL/OpenCL interoperability.\n", (int)(size/sizeof(cl_device_id)));
	}

	//Create context.
	context = clCreateContext(properties, 1, &devices[0], NULL, NULL, &state);
	if(state != CL_SUCCESS)
	{
		printf("OpenCL Error: Context couldn't be created.\n");
		return 0;
	}
	else
	{
		printf("Context succesfully created.\n");
	}

	//Create VBO and grant read and write access to openCL.
	GLuint vbo;
	glGenBuffers(1, &vbo);
	glBindBuffer(GL_ARRAY_BUFFER, vbo);
	glBufferData(GL_ARRAY_BUFFER, 400, NULL, GL_STATIC_DRAW);
	cl_mem mem = clCreateFromGLBuffer(context, CL_MEM_WRITE_ONLY, vbo, &state);
	if(state != CL_SUCCESS)
	{
		printf("Error creating memory object from VBO! (CL_INVALID_GL_OBJECT = -60) and (state = %i)\n", state);
	}
	else
	{
		printf("Memory object created succesfully from VBO!\n");
	}

	printf("GLCL finished. Bye!");
	return 0;
}

Has anyone ever encoutered this issue and dealt with it successfully? I'm trying AMD forums to get a solution but so far I have found nothing useful.

I'm running this program in Ubuntu and the programming language is CPP, I've managed to get an OpenCL program working, the problem is getting OpenCL to acess OpenGL objects. Also, I'm using SDL to construct the OpenGL window.

Thanks and best regards!

Tiago.MWeb Developer - Aspiring CG Programmer
Advertisement

Ok, so I was able to solve the issue myself by searching the AMD forums.

Here's the solution if anyone else stumbles upon this:

My program was linking to OpenCL from "/opt/AMDAPP/lib/x86_64/libOpenCL.so" so, instead, I tried linking to "usr/lib/fglrx/libOpenCL.so" and it worked. Now I can build the context and acess OpenGL VBOs.

Tiago.MWeb Developer - Aspiring CG Programmer

This topic is closed to new replies.

Advertisement