Forum: PC-Programmierung OpenGL/OpenCL kernel wird nicht ausgefürt


von Daniel A. (daniel-a)


Angehängte Dateien:

Lesenswert?

Ich habe schon einiges mit OpenGL gemacht, und wollte jetzt etwas mit 
OpenCL ausprobieren.
Meine Idee war es, das Doublebuffering auszuschalten, und dieses mit 
einem Renderbuffer-Object und einem Framebuffer-Object zu simulieren, um 
den Renderbuffer in OpenCL nutzen zu können.
Es scheint alles bestens zu funktionieren, mit gDEBugger und AMD CodeX 
konnte ich sehen, dass alle OpenGL und OpenCL Funktionen in der 
erwarteten Reihenfolge ausgeführt werden, es gibt keine Fehlermeldungen, 
Compilerflags -Wall -Wextra -pedantic und -Werror sind gesetzt, aber das 
Fenster ist grün statt rot.

Der Kernel scheint entweder nicht ausgeführt zu werden, oder aber nichts 
zu tun.

Ich kann den Fehler einfach nicht finden. Könnte mir bitte jemand einen 
hinweis geben?

Einige infos zu meinem PC:
1
  gcc (Ubuntu 4.9.2-0ubuntu1~14.04) 4.9.2
2
3
  CL_DEVICE_NAME:        GeForce GT 650M
4
  CL_DEVICE_VENDOR:      NVIDIA Corporation
5
  CL_DEVICE_VERSION:     OpenCL 1.1 CUDA
6
  CL_DEVICE_TYPE:        CL_DEVICE_TYPE_GPU
7
  CL_DRIVER_VERSION:     331.38
8
  CL_DEVICE_PROFILE:     FULL_PROFILE
9
  CL_DEVICE_MAX_COMPUTE_UNITS:   2
10
  CL_DEVICE_MAX_CLOCK_FREQUENCY:         835
11
  CL_DEVICE_MEM_BASE_ADDR_ALIGN:         4096
12
  CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE:    128

main loop (verkleinert, vollständige Version ist im Anhang):
1
  while(1){
2
3
    size_t fb_size[] = {
4
      w->winWidth,w->winHeight,0
5
    };
6
7
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, w->buffer.gl_frame);
8
    glClear(GL_COLOR_BUFFER_BIT);
9
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0 );
10
11
12
    glFinish();
13
    clEnqueueAcquireGLObjects(w->clCommandQueue,1,&w->buffer.cl_color,0,0,0);
14
15
16
    clSetKernelArg(w->kernel.raytracer_drawScene, 0, sizeof(cl_mem), &w->buffer.cl_color);
17
    clEnqueueNDRangeKernel( w->clCommandQueue, w->kernel.raytracer_drawScene, 1, 0, fb_size, 0, 0, 0, 0 );
18
19
20
    clEnqueueReleaseGLObjects(w->clCommandQueue,1,&w->buffer.cl_color,0,0,0);
21
    clFinish(w->clCommandQueue);
22
23
24
    glBlitFramebuffer(0,0,w->winWidth, w->winHeight,0,0,w->winWidth, w->winHeight,GL_COLOR_BUFFER_BIT,GL_NEAREST);
25
26
  }

Der OpenCL kernel:
1
kernel void raytracer_drawScene(global write_only image2d_t fb){
2
3
  const int2 xy = {
4
    get_global_id(0),
5
    get_global_id(1)
6
  };
7
8
  const uint4 color = { 255,0, 0, 127 };
9
10
  write_imageui(fb, xy, color);
11
12
}

von Daniel A. (daniel-a)


Lesenswert?

Ich konnte den Fehler immernochnicht finden, und würde mich sehr über 
eine Antwort freuen.

Da die Frage womöglich nicht ideal für ein Mikrocontroller forum ist, 
bin ich auch sehr an Erfahrungsberichten über foren mit Spezialisierung 
auf OpenCL und OpenGL interessiert.

von mar IO (Gast)


Lesenswert?

Kann dir leider ned weiterhelfen. Auch Foren kenn ich dazu keine, aber 
einfach mal den Standard ausprobieren:
- OpenCL ist von der Khronos Group. Einfach mal da nach einem Forum 
suchen (gibt es, hab gerade gekuckt).
- Bei Stackoverflow sind sicherlich auch Leute unterwegs, die davon 
Ahnung haben (OpenCL-Tag hat z.Z. 2615 Threads).

von Eric B. (beric)


Lesenswert?

Daniel A. schrieb:
> const uint4 color = { 255,0, 0, 127 };

Was passiert wenn du da mal
{0, 255, 0, 127 } reinschreibst? Immer noch grün?

von Daniel A. (daniel-a)


Lesenswert?

mar IO schrieb:
> Auch Foren kenn ich dazu keine, aber
> einfach mal den Standard ausprobieren

Trotzdem Danke, ich denke dass werde ich tun.

Eric B. schrieb:
> Was passiert wenn du da mal
> {0, 255, 0, 127 } reinschreibst? Immer noch grün?

Ja. Das grün kommt von glClear(GL_COLOR_BUFFER_BIT)
Mit glClearColor hab ich grün angegeben. Es sollte danach aber nach 
clEnqueueNDRangeKernel mit Rot übermalt werden. Auskommentieren von 
glClearColor führt dazu, dass der zufällige initiale Inhalt des Buffers 
im Fenster Sichtbar wird. Auskommentieren von glBlitFramebuffer führt zu 
einem blauen Fenster.

von Daniel A. (daniel-a)


Angehängte Dateien:

Lesenswert?

Ich habe ein lauffähiges Minimalbeispiel erstellt, welches das selbe 
Verhalten zeigt. Es befindet sich im Anhang.

Systemanforderungen:
 * Linux
 * C-Compiler mit C99 Support
 * OpenGL >= 3.3
 * OpenCL >= 1.1

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.