OpenGL/OpenCL kernel wird nicht ausgefürt

OP #3913863
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
}
Angehängte Dateien:
Gast #3915921
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).
OP #3917281
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren