cancel
Showing results for 
Search instead for 
Did you mean: 

OpenCL

lucasribeiro
Adept II

Re: Getting wrong values returned from cl::BufferGL after a upgrade from HD6790 to HD7850!!

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,




0 Kudos
Reply
himanshu_gautam
Grandmaster

Re: Getting wrong values returned from cl::BufferGL after a upgrade from HD6790 to HD7850!!

Sure, Will wait for your post..

And, Congrats on your successful youtube demo!

-

Bruhaspati

0 Kudos
Reply
lucasribeiro
Adept II

Re: Getting wrong values returned from  cl::BufferGL after a upgrade from HD6790 to HD7850!!

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

0 Kudos
Reply
himanshu_gautam
Grandmaster

Re: Getting wrong values returned from cl::BufferGL after a upgrade from HD6790 to HD7850!!

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

0 Kudos
Reply