1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
package com.mbien.opencl;
import java.nio.Buffer;
import com.mbien.opencl.CLMemory.Mem;
import com.sun.gluegen.runtime.PointerBuffer;
import com.sun.opengl.impl.GLContextImpl;
import com.sun.opengl.impl.macosx.cgl.MacOSXCGLContext;
import com.sun.opengl.impl.windows.wgl.WindowsWGLContext;
import com.sun.opengl.impl.x11.glx.X11GLXContext;
import javax.media.nativewindow.DefaultGraphicsConfiguration;
import javax.media.opengl.GLContext;
import static com.mbien.opencl.CLGLI.*;
/**
*
* @author Michael Bien
*/
public final class CLGLContext extends CLContext {
final long glContextID;
private CLGLContext(long clContextID, long glContextID) {
super(clContextID);
this.glContextID = glContextID;
}
public static CLGLContext create(GLContext glContext) {
//UNIX
//cl_context_properties props[] = {
// CL_GL_CONTEXT_KHR, (cl_context_properties)glXGetCurrentContext(),
// CL_GLX_DISPLAY_KHR, (cl_context_properties) glXGetCurrentDisplay(),
// CL_CONTEXT_PLATFORM, (cl_context_properties)cpPlatform, 0};
//WIN32
//cl_context_properties props[] = {
// CL_GL_CONTEXT_KHR, (cl_context_properties)TODO0,
// CL_WGL_HDC_KHR, (cl_context_properties)TODO 0,
// CL_CONTEXT_PLATFORM, (cl_context_properties)cpPlatform, 0};
//MACOSX
//cl_context_properties props[] = {
// CL_CGL_SHAREGROUP_KHR, (cl_context_properties)TODO 0,
// CL_CONTEXT_PLATFORM, (cl_context_properties)cpPlatform, 0};
long glID = 0;
GLContextImpl ctxImpl = (GLContextImpl)glContext;
DefaultGraphicsConfiguration config = (DefaultGraphicsConfiguration)ctxImpl.getDrawableImpl()
.getNativeWindow().getGraphicsConfiguration().getNativeGraphicsConfiguration();
PointerBuffer properties = PointerBuffer.allocateDirect(5);
if(glContext instanceof X11GLXContext) {
long handle = config.getScreen().getDevice().getHandle();
glID = ((X11GLXContext)glContext).getContext();
properties.put(CLGLI.CL_GL_CONTEXT_KHR).put(glID)
.put(CLGLI.CL_GLX_DISPLAY_KHR).put(handle);
}else if(glContext instanceof WindowsWGLContext) {
// TODO test on windows
throw new RuntimeException("cl-gl interoperability on windows not yet implemented");
}else if(glContext instanceof MacOSXCGLContext) {
// TODO test on mac
throw new RuntimeException("cl-gl interoperability on mac not yet implemented");
}else{
throw new RuntimeException("unsupported GLContext: "+glContext);
}
properties.put(0).rewind(); // 0 terminated array
long clID = createContextFromType(properties, CL_DEVICE_TYPE_ALL);
return new CLGLContext(clID, glID);
}
public final <B extends Buffer> CLGLBuffer<B> createFromGLBuffer(B directBuffer, int glBuffer, Mem... flags) {
return createFromGLBuffer(directBuffer, glBuffer, Mem.flagsToInt(flags));
}
public final <B extends Buffer> CLGLBuffer<B> createFromGLBuffer(B directBuffer, int glBuffer, int flags) {
CLGLBuffer<B> buffer = CLGLBuffer.create(this, directBuffer, flags, glBuffer);
memoryObjects.add(buffer);
return buffer;
}
}
|