Hello Bruhaspati
I could not solve the problem yet. The code was running fine on my old HD6790 and still runs fine on a nvidia video card (video on youtube showing a simulation done with the code). The problem appeared when I updated to a GCN´s architecture.
In relation to reproducing the problem, It´s gonna take a while for me to isolate the problem. So, as soon as I get it done, I´ll write it down here.
Thanks,
Sure, Will wait for your post..
And, Congrats on your successful youtube demo!
-
Bruhaspati
Hi Bruhaspati,
Could you please take a look at the code fragment below and point out what is wrong, or at least an insight. I did not have time to isolate the problem yet.
// Terminates OpenCL commands
cl_int status = 0;
status = clFinish( (cq)() );
if ( status != CL_SUCCESS ) { printf("File: %s:%d\n", __FILE__, __LINE__); }
// Create Vertex buffer object
typedef GLfloat NumType;
NumType number = 50;
GLuint buffer;
CHk_ERR( glGenBuffers( 1, &buffer ));
CHk_ERR( glBindBuffer( GL_ARRAY_BUFFER, buffer ) );
// initialize buffer object
GLsizeiptr size = static_cast<GLsizeiptr>(sizeof(number));
const GLvoid * data = static_cast<const GLvoid *>(&number);
CHk_ERR( glBufferData( GL_ARRAY_BUFFER, size, data, GL_DYNAMIC_DRAW) );
// Check the size of the created buffer
GLint createdDataSize;
glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &createdDataSize);
if ( glGetError() != GL_NO_ERROR ) { printf("File: %s:%d\n", __FILE__, __LINE__); }
if ( createdDataSize != static_cast<NumType>(size) ) { printf("File: %s:%d\n", __FILE__, __LINE__); }
// Get the data back just to test if it was really written
NumType dataDownloaded = 0;
CHk_ERR( glGetBufferSubData( GL_ARRAY_BUFFER, 0, size, &dataDownloaded ) );
std::cout << "Value (through GL API): " << dataDownloaded << std::endl;
glFinish();
// create OpenCL buffer from GL VBO
cl_mem mem = clCreateFromGLBuffer( (context)(), CL_MEM_READ_WRITE, buffer, &status );
if ( status != CL_SUCCESS ) { printf("File: %s:%d\n", __FILE__, __LINE__); }
// Acquire OpenCL memory objects that have been created from OpenGL objects
status = clEnqueueAcquireGLObjects( (cq)(), 1, &(mem), 0, 0, NULL );
if ( status != CL_SUCCESS ){
std::cout << "ERROR!";
}
clFinish((cq)());
// Write buffer using OpenCL API
NumType value = 35;
status = clEnqueueWriteBuffer( (cq)(), mem, CL_TRUE, 0, size, &value, 0, 0, NULL);
if ( status != CL_SUCCESS ) { printf("File: %s:%d\n", __FILE__, __LINE__); }
clFinish((cq)());
// Read buffer using OpenCL API
value = 4;
status = clEnqueueReadBuffer( (cq)(), mem, CL_TRUE, 0, size, &value, 0, 0, NULL );
if ( status != CL_SUCCESS ) { printf("File: %s:%d\n", __FILE__, __LINE__); }
std::cout << "Value (through CL API): " << value << std::endl;
// Read buffer using OpenGL API
CHk_ERR( glGetBufferSubData( GL_ARRAY_BUFFER, 0, size, &dataDownloaded ) );
std::cout << "Value (through GL API): " << dataDownloaded << std::endl;
glFinish();
Running this code, I get the following output:
Value (through GL API): 50
Value (through CL API): -8.8224e+18
Value (through GL API): 50
Thanks,
Lucas Ribeiro
Hi
As i seen the sample OpenCL-GL program the flow is fine. but i have doubt inusing CLFinish(). Could you please comment the two clFinish() function mentioned before writing and reading the OpenCL buffer.
I am not an xpert in OpenGL. I am just doubting.
Check and let me know . If you find any other solutions also please post here.
Thanks