summaryrefslogtreecommitdiffstats
path: root/src/com/jogamp/opencl/gl
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/jogamp/opencl/gl')
-rw-r--r--src/com/jogamp/opencl/gl/CLGLBuffer.java29
-rw-r--r--src/com/jogamp/opencl/gl/CLGLContext.java42
2 files changed, 54 insertions, 17 deletions
diff --git a/src/com/jogamp/opencl/gl/CLGLBuffer.java b/src/com/jogamp/opencl/gl/CLGLBuffer.java
index 86fef680..148aa83d 100644
--- a/src/com/jogamp/opencl/gl/CLGLBuffer.java
+++ b/src/com/jogamp/opencl/gl/CLGLBuffer.java
@@ -28,9 +28,10 @@
package com.jogamp.opencl.gl;
-import com.jogamp.opencl.CL;
import com.jogamp.opencl.CLBuffer;
+import com.jogamp.opencl.CLCommandQueue;
import com.jogamp.opencl.CLContext;
+import com.jogamp.opencl.CLException;
import java.nio.Buffer;
import javax.media.opengl.GLContext;
@@ -48,22 +49,22 @@ public final class CLGLBuffer<B extends Buffer> extends CLBuffer<B> implements C
*/
public final int GLID;
- private CLGLBuffer(CLContext context, B directBuffer, long id, int glObject, int flags) {
- super(context, directBuffer, getSizeImpl(context.getCL(), id), id, flags);
+ private CLGLBuffer(CLContext context, B directBuffer, long id, int glObject, long size, int flags) {
+ super(context, directBuffer, size, id, flags);
this.GLID = glObject;
}
- static <B extends Buffer> CLGLBuffer<B> create(CLContext context, B directBuffer, int flags, int glObject) {
+ static <B extends Buffer> CLGLBuffer<B> create(CLContext context, B directBuffer, long size, int flags, int glObject) {
checkBuffer(directBuffer, flags);
- CL cl = getCL(context);
- int[] result = new int[1];
- CLGLI clgli = (CLGLI)cl;
+ CLGLI clgli = (CLGLI)getCL(context);
+ int[] result = new int[1];
long id = clgli.clCreateFromGLBuffer(context.ID, flags, glObject, result, 0);
+ CLException.checkForError(result[0], "can not create CLGLObject from #"+glObject);
- return new CLGLBuffer<B>(context, directBuffer, id, glObject, flags);
+ return new CLGLBuffer<B>(context, directBuffer, id, glObject, size, flags);
}
static <B extends Buffer> void checkBuffer(B directBuffer, int flags) throws IllegalArgumentException {
@@ -75,6 +76,16 @@ public final class CLGLBuffer<B extends Buffer> extends CLBuffer<B> implements C
}
}
+ /**
+ * Updates the size of this CLGLBuffer by querying OpenGL.
+ * This method may only be called if this memory object has been acquired by calling
+ * {@link CLCommandQueue#putAcquireGLObject(com.jogamp.opencl.gl.CLGLObject)}.
+ */
+ public void updateSize() {
+ size = getSizeImpl(cl, ID);
+ initCLCapacity();
+ }
+
public int getGLObjectID() {
return GLID;
}
@@ -94,7 +105,7 @@ public final class CLGLBuffer<B extends Buffer> extends CLBuffer<B> implements C
@Override
public <T extends Buffer> CLGLBuffer<T> cloneWith(T directBuffer) {
- return new CLGLBuffer<T>(context, directBuffer, ID, GLID, FLAGS);
+ return new CLGLBuffer<T>(context, directBuffer, ID, GLID, size, FLAGS);
}
@Override
diff --git a/src/com/jogamp/opencl/gl/CLGLContext.java b/src/com/jogamp/opencl/gl/CLGLContext.java
index f8ca70af..6482f041 100644
--- a/src/com/jogamp/opencl/gl/CLGLContext.java
+++ b/src/com/jogamp/opencl/gl/CLGLContext.java
@@ -201,20 +201,46 @@ public final class CLGLContext extends CLContext {
}
// Buffers
- public final CLGLBuffer<?> createFromGLBuffer(int glBuffer, Mem... flags) {
- return createFromGLBuffer(null, glBuffer, Mem.flagsToInt(flags));
+ /**
+ * Creates a CLGLBuffer for memory sharing with the specified OpenGL buffer.
+ * @param glBuffer The OpenGL buffer handle like a vertex buffer or pixel buffer object.
+ * @param glBufferSize The size of the OpenGL buffer in bytes
+ * @param flags optional flags.
+ */
+ public final CLGLBuffer<?> createFromGLBuffer(int glBuffer, long glBufferSize, Mem... flags) {
+ return createFromGLBuffer(null, glBuffer, glBufferSize, Mem.flagsToInt(flags));
}
- public final CLGLBuffer<?> createFromGLBuffer(int glBuffer, int flags) {
- return createFromGLBuffer(null, glBuffer, flags);
+ /**
+ * Creates a CLGLBuffer for memory sharing with the specified OpenGL buffer.
+ * @param glBuffer The OpenGL buffer handle like a vertex buffer or pixel buffer object.
+ * @param glBufferSize The size of the OpenGL buffer in bytes
+ * @param flags optional flags.
+ */
+ public final CLGLBuffer<?> createFromGLBuffer(int glBuffer, long glBufferSize, int flags) {
+ return createFromGLBuffer(null, glBuffer, glBufferSize, flags);
}
- public final <B extends Buffer> CLGLBuffer<B> createFromGLBuffer(B directBuffer, int glBuffer, Mem... flags) {
- return createFromGLBuffer(directBuffer, glBuffer, Mem.flagsToInt(flags));
+ /**
+ * Creates a CLGLBuffer for memory sharing with the specified OpenGL buffer.
+ * @param directBuffer A direct allocated NIO buffer for data transfers between java and OpenCL.
+ * @param glBuffer The OpenGL buffer handle like a vertex buffer or pixel buffer object.
+ * @param glBufferSize The size of the OpenGL buffer in bytes
+ * @param flags optional flags.
+ */
+ public final <B extends Buffer> CLGLBuffer<B> createFromGLBuffer(B directBuffer, int glBuffer, long glBufferSize, Mem... flags) {
+ return createFromGLBuffer(directBuffer, glBuffer, glBufferSize, 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);
+ /**
+ * Creates a CLGLBuffer for memory sharing with the specified OpenGL buffer.
+ * @param directBuffer A direct allocated NIO buffer for data transfers between java and OpenCL.
+ * @param glBuffer The OpenGL buffer handle like a vertex buffer or pixel buffer object.
+ * @param glBufferSize The size of the OpenGL buffer in bytes
+ * @param flags optional flags.
+ */
+ public final <B extends Buffer> CLGLBuffer<B> createFromGLBuffer(B directBuffer, int glBuffer, long glBufferSize, int flags) {
+ CLGLBuffer<B> buffer = CLGLBuffer.create(this, directBuffer, glBufferSize, flags, glBuffer);
memoryObjects.add(buffer);
return buffer;
}