aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/jogamp/opencl/CLBuffer.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/jogamp/opencl/CLBuffer.java')
-rw-r--r--src/com/jogamp/opencl/CLBuffer.java55
1 files changed, 54 insertions, 1 deletions
diff --git a/src/com/jogamp/opencl/CLBuffer.java b/src/com/jogamp/opencl/CLBuffer.java
index 5a2a37e7..e2c74c7d 100644
--- a/src/com/jogamp/opencl/CLBuffer.java
+++ b/src/com/jogamp/opencl/CLBuffer.java
@@ -1,15 +1,22 @@
package com.jogamp.opencl;
+import com.jogamp.common.nio.Buffers;
+import java.util.List;
+import com.jogamp.common.nio.PointerBuffer;
+import com.jogamp.opencl.CLMemory.Mem;
import java.nio.Buffer;
+import java.util.ArrayList;
import static com.jogamp.opencl.CLException.*;
/**
- *
+ * OpenCL buffer object.
* @author Michael Bien
*/
public class CLBuffer<B extends Buffer> extends CLMemory<B> {
+ private List<CLBuffer<B>> childs;
+
protected CLBuffer(CLContext context, long id, int flags) {
super(context, id, flags);
}
@@ -51,6 +58,52 @@ public class CLBuffer<B extends Buffer> extends CLMemory<B> {
return new CLBuffer<B>(context, directBuffer, id, flags);
}
+
+ /**
+ * Creates a sub buffer with the specified region from this buffer.
+ */
+ public CLBuffer<B> createSubBuffer(int origin, int size, Mem... flags) {
+ PointerBuffer info = PointerBuffer.allocateDirect(2);
+ info.put(origin).put(size).rewind();
+ int bitset = Mem.flagsToInt(flags);
+
+ int[] err = new int[1];
+ long subID = cl.clCreateSubBuffer(ID, bitset, CL.CL_BUFFER_CREATE_TYPE_REGION, info.getBuffer(), err, 0);
+ checkForError(err[0], "can not create sub buffer");
+
+ B slice = null;
+ if(buffer != null) {
+ slice = (B)Buffers.slice(buffer, origin, size);
+ }
+
+ CLSubBuffer<B> clSubBuffer = new CLSubBuffer<B>(this, origin, slice, subID, bitset);
+ if(childs == null) {
+ childs = new ArrayList<CLBuffer<B>>();
+ }
+ childs.add(clSubBuffer);
+ return clSubBuffer;
+ }
+
+ @Override
+ public void release() {
+ if(childs != null) {
+ for (CLBuffer<B> child : childs) {
+ child.release();
+ }
+ }
+ super.release();
+ }
+
+ void onReleaseSubBuffer(CLSubBuffer sub) {
+ childs.remove(sub);
+ }
+
+ /**
+ * Returns true if this is a sub buffer.
+ */
+ public boolean isSubBuffer() {
+ return false;
+ }
@Override
public <T extends Buffer> CLBuffer<T> cloneWith(T directBuffer) {