1

データを cl::BufferGL 変数 (GPU 上) に書き込み、それを使用して描画することはできますが、ホストに読み戻すときに間違った値を取得しました。GL_CL 相互運用機能を含む AMD SDK からいくつかの例を実行しましたが、すべて問題ありません。cl::Buffer を読み書きできます。つまり、ホストからデバイスにコピーし、デバイスからホストにコピーできます。

ソース コードはlinkでホストされています。

cl::Buffer を作成するには、以下の手順を実行します (順番に、cl_gl コンテキストを取得した後)。

  1. glGenBuffer
  2. glBindBuffer
  3. glBufferData
  4. clCreateFromGLBuffer
  5. glBindBuffer (0 にバインド、またはアンバインド)

プログラムは次を使用して記述されます。

  • C++
  • Ubuntu 12.06 64 ビット、カーネル 3.2.0-29-generic
  • OpenCL 1.2
  • ドライバー 1124.2 (AMD のバイナリ ドライバー、Catalyst 13.4)
  • AMD APPSDK v2.8
  • OpenGL バージョン: 4.2.12217
  • グリュー
  • 食欲不振

編集: エラーを再現するコード ブロックを作成しました

// 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
GLint  number = 5;
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) );
CHk_ERR( glBindBuffer(GL_ARRAY_BUFFER, 0) );
glFinish();

if ( glGetError() != GL_NO_ERROR ) { printf("File: %s:%d\n", __FILE__, __LINE__);  }

// 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
if ( clEnqueueAcquireGLObjects( (cq)(), 1, &(mem), 0, NULL, NULL ) != CL_SUCCESS ){
    std::cout << "ERROR!";
}

// Read buffer
GLint value;
cq.enqueueReadBuffer( mem, CL_TRUE, 0, size, &value );
std::cout << "Value: " << value << std::endl;

どんな助けでも大歓迎です!!

4

0 に答える 0