1

私は最近、Windows から Linux (Debian、64 ビット) に移行し、GPGPU 開発環境を稼働させようとしているので、Windows で動作するプログラムをテストしています。

コンパイルとリンクはうまくいきますが、プログラムを実行すると奇妙なエラーが発生します。glew と freeglut を使用しています。

最初のスニペット: OpenGL のみ

i = 1;
info = PROGRAM_NAME;
glutInitContextVersion(4,2);
glutInit(&i, &info);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(W_SIZEX, W_SIZEY);
glutInitWindowPosition(W_POSX, W_POSY);
glutCreateWindow(info);
glClearColor(1.0,1.0,1.0,0);
/**/
printf("Before glewInit: %i\n", glGetError());
/**/    
printf("glewInit returns: %i\n", glewInit());
/**/
printf("After glewInit: %i\n", glGetError());
/**/

そこから、次の出力が得られます。

Before glewInit: 0
glewInit returns: 0
After glewInit: 1280

これは無効な列挙エラーです。何が原因なのかはわかりませんが、プログラムの実行の後半で発生する次のエラーに関連している可能性があります。

2 番目のスニペット: OpenCL と OpenGL の相互運用

/* BUFFERS */
(*BFR).C[0] = clCreateBuffer(*CTX, CL_MEM_READ_WRITE, SD, 0, 0);
(*BFR).C[1] = clCreateBuffer(*CTX, CL_MEM_READ_WRITE, SD, 0, &i);
dcl(i);

glGenBuffers(2, (*BFR).G);

glBindBuffer(GL_ARRAY_BUFFER, (*BFR).G[0]);
glBufferData(GL_ARRAY_BUFFER, SI, 0, GL_DYNAMIC_DRAW);
(*BFR).D[0] = clCreateFromGLBuffer(*CTX, CL_MEM_WRITE_ONLY, (*BFR).G[0], &i);
dcl(i);
glBindBuffer(GL_ARRAY_BUFFER, 0);

ここで、dcl(int) メソッドは CL エラー コードをデコードするだけです。これを実行すると、clCreateFromGLBuffer() から CL_INVALID_GL_OBJECT エラーが発生します。ただし、OpenGL には、問題のバッファの生成、バインド、またはバインド解除に関する問題はありません。OpenCL コンテキストは明らかに有効であり、作成またはクエリでエラーは発生しません。すべてが Windows 7 64 ビットの VS2010 で動作します。

コンパイルの詳細

関連するインクルードは次のとおりです。

/* OPENGL */
#include "GL/glew.h"
#include "GL/freeglut.h"

/* OPENCL */
#include "CL/cl.h"
#include "CL/cl_gl.h"

私はGCCを使用しており、次のようにリンクしています:

gcc -w -I./include CLGL.c -o ~/Templates/GOL-CLGL/run/a.out -lGLEW -lGLU -lglut -lGL -lOpenCL;

コンパイルとリンクの結果、エラーは発生しません (ポインターの乱用に関する多くの警告が表示されますが、それが原因であるとは思えません)。

現在、これをデバッグする方法についてのアイデアがありません。誰でもさらなる手順を提案できますか?

4

1 に答える 1

2

私も最近この問題を抱えていたので、ここに答えがあります:

OpenGL:glGetError()は、glewInit()の呼び出し後に無効な列挙型を返します

したがって、そのエラーを破棄できます。

于 2012-12-26T21:06:40.767 に答える