summaryrefslogtreecommitdiffstats
path: root/src/com/mbien/opencl/gl
diff options
context:
space:
mode:
authorMichael Bien <[email protected]>2010-03-08 17:08:03 +0100
committerMichael Bien <[email protected]>2010-03-08 17:08:03 +0100
commite081f13ca50353a7a9c34438a2f81d38e03e88a7 (patch)
tree7948e78a8e73fb4de5340a80075d35a8a1499c1f /src/com/mbien/opencl/gl
parent5ad19147a76f80635dcae18693929edbf1da2cbf (diff)
introduced gl package and moved all interoperability functionality into it.
Diffstat (limited to 'src/com/mbien/opencl/gl')
-rw-r--r--src/com/mbien/opencl/gl/CLGLBuffer.java68
-rw-r--r--src/com/mbien/opencl/gl/CLGLContext.java229
-rw-r--r--src/com/mbien/opencl/gl/CLGLImage2d.java65
-rw-r--r--src/com/mbien/opencl/gl/CLGLObject.java24
-rw-r--r--src/com/mbien/opencl/gl/CLGLTexture.java23
-rw-r--r--src/com/mbien/opencl/gl/CLGLTexture2d.java65
-rw-r--r--src/com/mbien/opencl/gl/CLGLTexture3d.java74
7 files changed, 548 insertions, 0 deletions
diff --git a/src/com/mbien/opencl/gl/CLGLBuffer.java b/src/com/mbien/opencl/gl/CLGLBuffer.java
new file mode 100644
index 00000000..54e849ff
--- /dev/null
+++ b/src/com/mbien/opencl/gl/CLGLBuffer.java
@@ -0,0 +1,68 @@
+package com.mbien.opencl.gl;
+
+import com.mbien.opencl.CL;
+import com.mbien.opencl.CLBuffer;
+import com.mbien.opencl.CLContext;
+import com.mbien.opencl.CLGLI;
+import com.mbien.opencl.CLMemory.GLObjectType;
+import java.nio.Buffer;
+
+
+/**
+ * Shared buffer between OpenGL and OpenCL contexts.
+ * @author Michael Bien
+ */
+public final class CLGLBuffer<B extends Buffer> extends CLBuffer<B> implements CLGLObject {
+
+
+ /**
+ * The OpenGL object handle.
+ */
+ public final int GLID;
+
+ private CLGLBuffer(CLContext context, B directBuffer, long id, int glObject) {
+ super(context, directBuffer, id);
+ this.GLID = glObject;
+ }
+
+
+ static <B extends Buffer> CLGLBuffer<B> create(CLContext context, B directBuffer, int flags, int glObject) {
+ checkBuffer(directBuffer, flags);
+
+ CL cl = getCL(context);
+ int[] result = new int[1];
+ CLGLI clgli = (CLGLI)cl;
+
+ long id = clgli.clCreateFromGLBuffer(context.ID, flags, glObject, result, 0);
+
+ return new CLGLBuffer<B>(context, directBuffer, id, glObject);
+ }
+
+ static <B extends Buffer> void checkBuffer(B directBuffer, int flags) throws IllegalArgumentException {
+ if (directBuffer != null && !directBuffer.isDirect()) {
+ throw new IllegalArgumentException("buffer is not a direct buffer");
+ }
+ if (isHostPointerFlag(flags)) {
+ throw new IllegalArgumentException("CL_MEM_COPY_HOST_PTR or CL_MEM_USE_HOST_PTR can not be used with OpenGL Buffers.");
+ }
+ }
+
+ public int getGLObjectID() {
+ return GLID;
+ }
+
+ public GLObjectType getGLObjectType() {
+ return GLObjectType.GL_OBJECT_BUFFER;
+ }
+
+ @Override
+ public <T extends Buffer> CLGLBuffer<T> cloneWith(T directBuffer) {
+ return new CLGLBuffer<T>(context, directBuffer, ID, GLID);
+ }
+
+ @Override
+ public String toString() {
+ return "CLGLBuffer [id: " + ID+" glID: "+GLID+"]";
+ }
+
+}
diff --git a/src/com/mbien/opencl/gl/CLGLContext.java b/src/com/mbien/opencl/gl/CLGLContext.java
new file mode 100644
index 00000000..23539049
--- /dev/null
+++ b/src/com/mbien/opencl/gl/CLGLContext.java
@@ -0,0 +1,229 @@
+package com.mbien.opencl.gl;
+
+import com.mbien.opencl.CLContext;
+import com.mbien.opencl.CLDevice;
+import java.nio.Buffer;
+import com.mbien.opencl.CLMemory.Mem;
+import com.mbien.opencl.CLPlatform;
+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.*;
+
+/**
+ * OpenCL Context supporting JOGL-JOCL interoperablity.
+ * @author Michael Bien
+ */
+public final class CLGLContext extends CLContext {
+
+ final long glID;
+
+ private CLGLContext(CLPlatform platform, long clContextID, long glContextID) {
+ super(platform, clContextID);
+ this.glID = glContextID;
+ }
+
+ /**
+ * Creates a shared context on all available devices (CL_DEVICE_TYPE_ALL).
+ */
+ public static CLGLContext create(GLContext glContext) {
+ return create(glContext, (CLPlatform)null, CLDevice.Type.ALL);
+ }
+
+ /**
+ * Creates a shared context on the specified platform on all available devices (CL_DEVICE_TYPE_ALL).
+ */
+ public static CLGLContext create(GLContext glContext, CLPlatform platform) {
+ return create(glContext, platform, CLDevice.Type.ALL);
+ }
+
+ /**
+ * Creates a shared context on the specified platform and with the specified
+ * device types.
+ */
+ public static CLGLContext create(GLContext glContext, CLDevice.Type... deviceTypes) {
+ return create(glContext, null, deviceTypes);
+ }
+
+ /**
+ * Creates a shared context on the specified devices.
+ * The platform to be used is implementation dependent.
+ */
+ public static CLGLContext create(GLContext glContext, CLDevice... devices) {
+ return create(glContext, null, devices);
+ }
+
+ /**
+ * Creates a shared context on the specified platform and with the specified
+ * device types.
+ */
+ public static CLGLContext create(GLContext glContext, CLPlatform platform, CLDevice.Type... deviceTypes) {
+
+ if(platform == null) {
+ platform = CLPlatform.getDefault();
+ }
+
+ long[] glID = new long[1];
+ PointerBuffer properties = setupContextProperties(platform, glContext, glID);
+ long clID = createContextFromType(properties, toDeviceBitmap(deviceTypes));
+
+ return new CLGLContext(platform, clID, glID[0]);
+
+ }
+
+ /**
+ * Creates a shared context on the specified platform and with the specified
+ * devices.
+ */
+ public static CLGLContext create(GLContext glContext, CLPlatform platform, CLDevice... devices) {
+
+ if(platform == null) {
+ platform = CLPlatform.getDefault();
+ }
+
+ long[] glID = new long[1];
+ PointerBuffer properties = setupContextProperties(platform, glContext, glID);
+ long clID = createContext(properties, devices);
+
+ CLGLContext context = new CLGLContext(platform, clID, glID[0]);
+ if(devices != null) {
+ for (int i = 0; i < devices.length; i++) {
+ context.overrideContext(devices[i]);
+ }
+ }
+ return context;
+ }
+
+
+ private static PointerBuffer setupContextProperties(CLPlatform platform, GLContext glContext, long[] glID) {
+
+ if(platform == null) {
+ throw new RuntimeException("no OpenCL installation found");
+ }
+
+ GLContextImpl ctxImpl = (GLContextImpl)glContext;
+
+ DefaultGraphicsConfiguration config = (DefaultGraphicsConfiguration)ctxImpl.getDrawableImpl()
+ .getNativeWindow().getGraphicsConfiguration().getNativeGraphicsConfiguration();
+
+ PointerBuffer properties;
+ if(glContext instanceof X11GLXContext) {
+ properties = PointerBuffer.allocateDirect(7);
+ long handle = config.getScreen().getDevice().getHandle();
+ glID[0] = ((X11GLXContext)glContext).getContext();
+ properties.put(CL_GL_CONTEXT_KHR).put(glID[0])
+ .put(CL_GLX_DISPLAY_KHR).put(handle)
+ .put(CL_CONTEXT_PLATFORM).put(platform.ID);
+ }else if(glContext instanceof WindowsWGLContext) {
+ // TODO test on windows
+ //WIN32
+ //cl_context_properties props[] = {
+ // CL_GL_CONTEXT_KHR, (cl_context_properties)0,
+ // CL_WGL_HDC_KHR, (cl_context_properties)0,
+ // CL_CONTEXT_PLATFORM, (cl_context_properties)cpPlatform, 0};
+ properties = PointerBuffer.allocateDirect(7);
+ long handle = config.getScreen().getDevice().getHandle();
+ glID[0] = ((WindowsWGLContext)glContext).getHGLRC();
+ properties.put(CL_GL_CONTEXT_KHR).put(glID[0])
+ .put(CL_WGL_HDC_KHR).put(handle)
+ .put(CL_CONTEXT_PLATFORM).put(platform.ID);
+ }else if(glContext instanceof MacOSXCGLContext) {
+ // TODO test on mac
+ //MACOSX
+ //cl_context_properties props[] = {
+ // CL_CGL_SHAREGROUP_KHR, (cl_context_properties)0,
+ // CL_CONTEXT_PLATFORM, (cl_context_properties)cpPlatform, 0};
+ properties = PointerBuffer.allocateDirect(5);
+ glID[0] = ((MacOSXCGLContext)glContext).getCGLContext();
+ properties.put(CL_CGL_SHAREGROUP_KHR).put(glID[0])
+ .put(CL_CONTEXT_PLATFORM).put(platform.ID);
+ }else{
+ throw new RuntimeException("unsupported GLContext: "+glContext);
+ }
+
+ return properties.put(0).rewind(); // 0 terminated array
+ }
+
+ // Buffers
+ public final CLGLBuffer<?> createFromGLBuffer(int glBuffer, Mem... flags) {
+ return createFromGLBuffer(null, glBuffer, Mem.flagsToInt(flags));
+ }
+
+ public final CLGLBuffer<?> createFromGLBuffer(int glBuffer, int flags) {
+ return createFromGLBuffer(null, glBuffer, flags);
+ }
+
+ 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;
+ }
+
+ // Renderbuffers
+ public final CLGLImage2d<?> createFromGLRenderbuffer(int glBuffer, Mem... flags) {
+ return createFromGLRenderbuffer(null, glBuffer, Mem.flagsToInt(flags));
+ }
+
+ public final CLGLImage2d<?> createFromGLRenderbuffer(int glBuffer, int flags) {
+ return createFromGLRenderbuffer(null, glBuffer, flags);
+ }
+
+ public final <B extends Buffer> CLGLImage2d<B> createFromGLRenderbuffer(B directBuffer, int glBuffer, Mem... flags) {
+ return createFromGLRenderbuffer(directBuffer, glBuffer, Mem.flagsToInt(flags));
+ }
+
+ public final <B extends Buffer> CLGLImage2d<B> createFromGLRenderbuffer(B directBuffer, int glBuffer, int flags) {
+ CLGLImage2d<B> buffer = CLGLImage2d.createFromGLRenderbuffer(this, directBuffer, flags, glBuffer);
+ memoryObjects.add(buffer);
+ return buffer;
+ }
+
+ //2d Textures
+ public final CLGLTexture2d<?> createFromGLTexture2d(int target, int texture, int mipmap, Mem... flags) {
+ return createFromGLTexture2d(null, target, texture, mipmap, Mem.flagsToInt(flags));
+ }
+
+ public final CLGLTexture2d<?> createFromGLTexture2d(int target, int texture, int mipmap, int flags) {
+ return createFromGLTexture2d(null, target, texture, mipmap, flags);
+ }
+
+ public final <B extends Buffer> CLGLTexture2d<B> createFromGLTexture2d(B directBuffer, int target, int texture, int mipmap, Mem... flags) {
+ return createFromGLTexture2d(directBuffer, target, texture, mipmap, Mem.flagsToInt(flags));
+ }
+
+ public final <B extends Buffer> CLGLTexture2d<B> createFromGLTexture2d(B directBuffer, int target, int texture, int mipmap, int flags) {
+ CLGLTexture2d<B> buffer = CLGLTexture2d.createFromGLTexture2d(this, directBuffer, target, texture, mipmap, flags);
+ memoryObjects.add(buffer);
+ return buffer;
+ }
+
+ //3d Textures
+ public final CLGLTexture3d<?> createFromGLTexture3d(int target, int texture, int mipmap, Mem... flags) {
+ return createFromGLTexture3d(null, target, texture, mipmap, Mem.flagsToInt(flags));
+ }
+
+ public final CLGLTexture3d<?> createFromGLTexture3d(int target, int texture, int mipmap, int flags) {
+ return createFromGLTexture3d(null, target, texture, mipmap, flags);
+ }
+
+ public final <B extends Buffer> CLGLTexture3d<B> createFromGLTexture3d(B directBuffer, int target, int texture, int mipmap, Mem... flags) {
+ return createFromGLTexture3d(directBuffer, target, texture, mipmap, Mem.flagsToInt(flags));
+ }
+
+ public final <B extends Buffer> CLGLTexture3d<B> createFromGLTexture3d(B directBuffer, int target, int texture, int mipmap, int flags) {
+ CLGLTexture3d<B> buffer = CLGLTexture3d.createFromGLTexture3d(this, directBuffer, target, texture, mipmap, flags);
+ memoryObjects.add(buffer);
+ return buffer;
+ }
+
+
+}
diff --git a/src/com/mbien/opencl/gl/CLGLImage2d.java b/src/com/mbien/opencl/gl/CLGLImage2d.java
new file mode 100644
index 00000000..ab5f1c95
--- /dev/null
+++ b/src/com/mbien/opencl/gl/CLGLImage2d.java
@@ -0,0 +1,65 @@
+package com.mbien.opencl.gl;
+
+import com.mbien.opencl.CL;
+import com.mbien.opencl.CLContext;
+import com.mbien.opencl.CLGLI;
+import com.mbien.opencl.CLImage2d;
+import com.mbien.opencl.CLImageFormat;
+import com.mbien.opencl.CLMemory.GLObjectType;
+import com.mbien.opencl.impl.CLImageFormatImpl;
+import java.nio.Buffer;
+
+import static com.mbien.opencl.CL.*;
+
+/**
+ * 2D OpenCL image representing an OpenGL renderbuffer.
+ * @author Michael Bien
+ */
+public class CLGLImage2d<B extends Buffer> extends CLImage2d<B> implements CLGLObject {
+
+ /**
+ * The OpenGL object handle.
+ */
+ public final int GLID;
+
+ protected CLGLImage2d(CLContext context, B directBuffer, CLImageFormat format, CLImageInfoAccessor accessor, int width, int height, long id, int glid) {
+ super(context, directBuffer, format, accessor, width, height, id);
+ this.GLID = glid;
+ }
+
+ static <B extends Buffer> CLGLImage2d<B> createFromGLRenderbuffer(CLContext context, B directBuffer, int flags, int glObject) {
+
+ CLGLBuffer.checkBuffer(directBuffer, flags);
+
+ CL cl = getCL(context);
+ int[] result = new int[1];
+ CLGLI clgli = (CLGLI)cl;
+
+ long id = clgli.clCreateFromGLRenderbuffer(context.ID, flags, glObject, result, 0);
+
+ return createImage(context, id, directBuffer, glObject);
+ }
+
+ static <B extends Buffer> CLGLImage2d<B> createImage(CLContext context, long id, B directBuffer, int glObject) {
+ CLImageInfoAccessor accessor = new CLImageInfoAccessor(getCL(context), id);
+
+ CLImageFormat format = createUninitializedImageFormat();
+ accessor.getInfo(CL_IMAGE_FORMAT, CLImageFormatImpl.size(), format.getFormatImpl().getBuffer(), null);
+
+ int width = (int)accessor.getLong(CL_IMAGE_WIDTH);
+ int height = (int)accessor.getLong(CL_IMAGE_HEIGHT);
+
+ return new CLGLImage2d<B>(context, directBuffer, format, accessor, width, height, id, glObject);
+ }
+
+ @Override
+ public GLObjectType getGLObjectType() {
+ return GLObjectType.GL_OBJECT_RENDERBUFFER;
+ }
+
+ @Override
+ public int getGLObjectID() {
+ return GLID;
+ }
+
+}
diff --git a/src/com/mbien/opencl/gl/CLGLObject.java b/src/com/mbien/opencl/gl/CLGLObject.java
new file mode 100644
index 00000000..51a730ed
--- /dev/null
+++ b/src/com/mbien/opencl/gl/CLGLObject.java
@@ -0,0 +1,24 @@
+/*
+ * Created on Friday, February 26 2010
+ */
+package com.mbien.opencl.gl;
+
+import com.mbien.opencl.CLMemory.GLObjectType;
+
+/**
+ *
+ * @author Michael Bien
+ */
+interface CLGLObject {
+
+ /**
+ * Returns the OpenGL object id of this shared object.
+ */
+ public int getGLObjectID();
+
+ /**
+ * Returns the OpenGL buffer type of this shared object.
+ */
+ public GLObjectType getGLObjectType();
+
+}
diff --git a/src/com/mbien/opencl/gl/CLGLTexture.java b/src/com/mbien/opencl/gl/CLGLTexture.java
new file mode 100644
index 00000000..49fe4cb2
--- /dev/null
+++ b/src/com/mbien/opencl/gl/CLGLTexture.java
@@ -0,0 +1,23 @@
+/*
+ * Created on Friday, February 26 2010
+ */
+
+package com.mbien.opencl.gl;
+
+/**
+ *
+ * @author Michael Bien
+ */
+interface CLGLTexture {
+
+ /**
+ * Returns the OpenGL texture target of this texture.
+ */
+ public int getTextureTarget();
+
+ /**
+ * Returns the OpenGL mipmap level of this texture.
+ */
+ public int getMipMapLevel();
+
+}
diff --git a/src/com/mbien/opencl/gl/CLGLTexture2d.java b/src/com/mbien/opencl/gl/CLGLTexture2d.java
new file mode 100644
index 00000000..2dbb09d9
--- /dev/null
+++ b/src/com/mbien/opencl/gl/CLGLTexture2d.java
@@ -0,0 +1,65 @@
+package com.mbien.opencl.gl;
+
+import com.mbien.opencl.CL;
+import com.mbien.opencl.CLContext;
+import com.mbien.opencl.CLGLI;
+import com.mbien.opencl.CLImageFormat;
+import com.mbien.opencl.CLMemory.GLObjectType;
+import com.mbien.opencl.impl.CLImageFormatImpl;
+import java.nio.Buffer;
+
+import static com.mbien.opencl.CL.*;
+
+/**
+ * 2D OpenCL image representing an 2D OpenGL texture.
+ * @author Michael Bien
+ */
+public class CLGLTexture2d<B extends Buffer> extends CLGLImage2d<B> implements CLGLTexture {
+
+ public final int target;
+
+ public final int mipMapLevel;
+
+ public CLGLTexture2d(CLContext context, B directBuffer, CLImageFormat format, CLImageInfoAccessor accessor, int target, int mipLevel, int width, int height, long id, int glid) {
+ super(context, directBuffer, format, accessor, width, height, id, glid);
+ this.target = target;
+ this.mipMapLevel = mipLevel;
+ }
+
+ static <B extends Buffer> CLGLTexture2d<B> createFromGLTexture2d(CLContext context, B directBuffer, int target, int texture, int mipLevel, int flags) {
+
+ CLGLBuffer.checkBuffer(directBuffer, flags);
+
+ CL cl = getCL(context);
+ int[] result = new int[1];
+ CLGLI clgli = (CLGLI)cl;
+
+ long id = clgli.clCreateFromGLTexture2D(context.ID, flags, target, mipLevel, texture, result, 0);
+
+ CLImageInfoAccessor accessor = new CLImageInfoAccessor(cl, id);
+
+ CLImageFormat format = createUninitializedImageFormat();
+ accessor.getInfo(CL_IMAGE_FORMAT, CLImageFormatImpl.size(), format.getFormatImpl().getBuffer(), null);
+
+ int width = (int)accessor.getLong(CL_IMAGE_WIDTH);
+ int height = (int)accessor.getLong(CL_IMAGE_HEIGHT);
+
+ return new CLGLTexture2d<B>(context, directBuffer, format, accessor, target, mipLevel, width, height, id, width);
+
+ }
+
+ public int getTextureTarget() {
+ return target;
+ }
+
+ public int getMipMapLevel() {
+ return mipMapLevel;
+ }
+
+ @Override
+ public GLObjectType getGLObjectType() {
+ return GLObjectType.GL_OBJECT_TEXTURE2D;
+ }
+
+
+}
diff --git a/src/com/mbien/opencl/gl/CLGLTexture3d.java b/src/com/mbien/opencl/gl/CLGLTexture3d.java
new file mode 100644
index 00000000..6c68b92a
--- /dev/null
+++ b/src/com/mbien/opencl/gl/CLGLTexture3d.java
@@ -0,0 +1,74 @@
+package com.mbien.opencl.gl;
+
+import com.mbien.opencl.CL;
+import com.mbien.opencl.CLContext;
+import com.mbien.opencl.CLGLI;
+import com.mbien.opencl.CLImage3d;
+import com.mbien.opencl.CLImageFormat;
+import com.mbien.opencl.CLMemory.GLObjectType;
+import com.mbien.opencl.impl.CLImageFormatImpl;
+import java.nio.Buffer;
+
+import static com.mbien.opencl.CL.*;
+
+/**
+ * 3D OpenCL image representing an 3D OpenGL texture.
+ * @author Michael Bien
+ */
+public class CLGLTexture3d<B extends Buffer> extends CLImage3d<B> implements CLGLObject, CLGLTexture {
+
+ /**
+ * The OpenGL object handle.
+ */
+ public final int GLID;
+
+ public final int target;
+
+ public final int mipMapLevel;
+
+ private CLGLTexture3d(CLContext context, B directBuffer, CLImageFormat format, CLImageInfoAccessor accessor, int target, int mipLevel, int width, int height, int depth, long id, int glid) {
+ super(context, directBuffer, format, accessor, width, height, depth, id);
+ this.GLID = glid;
+ this.target = target;
+ this.mipMapLevel = mipLevel;
+ }
+
+ static <B extends Buffer> CLGLTexture3d<B> createFromGLTexture3d(CLContext context, B directBuffer, int flags, int target, int mipLevel, int texture) {
+
+ CLGLBuffer.checkBuffer(directBuffer, flags);
+
+ CL cl = getCL(context);
+ int[] result = new int[1];
+ CLGLI clgli = (CLGLI)cl;
+
+ long id = clgli.clCreateFromGLTexture3D(context.ID, flags, target, mipLevel, texture, result, 0);
+
+ CLImageInfoAccessor accessor = new CLImageInfoAccessor(cl, id);
+
+ CLImageFormat format = createUninitializedImageFormat();
+ accessor.getInfo(CL_IMAGE_FORMAT, CLImageFormatImpl.size(), format.getFormatImpl().getBuffer(), null);
+
+ int width = (int)accessor.getLong(CL_IMAGE_WIDTH);
+ int height = (int)accessor.getLong(CL_IMAGE_HEIGHT);
+ int depth = (int)accessor.getLong(CL_IMAGE_DEPTH);
+
+ return new CLGLTexture3d<B>(context, directBuffer, format, accessor, target, mipLevel, width, height, depth, id, texture);
+ }
+
+ public int getGLObjectID() {
+ return GLID;
+ }
+
+ public int getTextureTarget() {
+ return target;
+ }
+
+ public int getMipMapLevel() {
+ return mipMapLevel;
+ }
+
+ public GLObjectType getGLObjectType() {
+ return GLObjectType.GL_OBJECT_TEXTURE3D;
+ }
+
+}