diff options
author | Sven Gothel <[email protected]> | 2023-06-16 00:43:11 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2023-06-16 00:43:11 +0200 |
commit | 03c548d96e5c81d0fc39503fe3042cf03e0a75e2 (patch) | |
tree | 604aa5b285e5f0476727f0d9b3d23aaf557833a3 /src/java/com/jogamp/common/nio/AbstractBuffer.java | |
parent | ffd0c48999daa2b321a00fb9ad7ba175734486e3 (diff) |
GlueGen Struct [1]: Enhance com.jogamp.common.nio.* to serve a most native-free-code Struct-Code generation
Recfactored all NIO buffer utils to Buffers, i.e. buffer <-> address, memcpy, strnlen, etc
Buffers:
- Added copyNativeToDirectByteBuffer(..), allowing to copy a native memory slice into a direct buffer.
- Added typeNameToBufferClass(String) and sizeOfBufferElem(Class<? extends Buffer>)
- Completed slize2<Type>(..) buffer-mapping methods
- Exposure of safe getDirectByteBuffer(..) w/ null-check (package private)
Added NativeBuffer.storeDirectAddress(..), allowing to write the array address into a native buffer (struct, etc),
allowing to referencing the ElementBuffer (linear array of elements) and PointerBuffer (array of pointer).
Hint: This can be read via PointerBuffer.wrap(..).get(0)
Added ElementBuffer (a NativeBuffer) mapping an array of elements,
completing native abstraction next to PointerBuffer (array of pointer).
ElementBuffer can dereference an existing element-array by native address via ElementBuffer.derefPointer(..).
Views of its content can be directly accessed via ElementBuffer.slice(..).
+++
These utilities and buffer abstractions will allow to reuse code and simplify the GlueGen struct get/set implementations
and help to reduce native code injection.
Diffstat (limited to 'src/java/com/jogamp/common/nio/AbstractBuffer.java')
-rw-r--r-- | src/java/com/jogamp/common/nio/AbstractBuffer.java | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/src/java/com/jogamp/common/nio/AbstractBuffer.java b/src/java/com/jogamp/common/nio/AbstractBuffer.java index a774c39..b31929b 100644 --- a/src/java/com/jogamp/common/nio/AbstractBuffer.java +++ b/src/java/com/jogamp/common/nio/AbstractBuffer.java @@ -1,5 +1,5 @@ /** - * Copyright 2010 JogAmp Community. All rights reserved. + * Copyright 2010-2023 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: @@ -34,6 +34,9 @@ package com.jogamp.common.nio; import com.jogamp.common.os.*; import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; /** * @author Sven Gothel @@ -41,6 +44,8 @@ import java.nio.Buffer; */ @SuppressWarnings("rawtypes") public abstract class AbstractBuffer<B extends AbstractBuffer> implements NativeBuffer<B> { + /** Platform dependent pointer size in bytes, i.e. 32bit or 64bit wide, depending of the CPU pointer width. */ + public static final int POINTER_SIZE; protected final Buffer buffer; protected final int elementSize; @@ -49,6 +54,7 @@ public abstract class AbstractBuffer<B extends AbstractBuffer> implements Native static { Platform.initSingleton(); // loads native gluegen_rt library + POINTER_SIZE = Platform.is32Bit() ? Buffers.SIZEOF_INT : Buffers.SIZEOF_LONG ; } /** @@ -118,11 +124,44 @@ public abstract class AbstractBuffer<B extends AbstractBuffer> implements Native public final Buffer getBuffer() { return buffer; } - @Override public final boolean isDirect() { return buffer.isDirect(); } + @Override + public long getDirectBufferAddress() { + if( isDirect() ) { + return Buffers.getDirectBufferAddressImpl(buffer); + } else { + return 0; + } + } + @Override + public void storeDirectAddress(final ByteBuffer directDest) { + final long addr = getDirectBufferAddress(); + switch(POINTER_SIZE) { + case 4: + directDest.putInt(0, (int) ( addr & 0x00000000FFFFFFFFL ) ); + break; + case 8: + directDest.putLong(0, addr); + break; + } + directDest.position(directDest.position()+POINTER_SIZE); + } + + @Override + public void storeDirectAddress(final ByteBuffer directDest, final int destBytePos) { + final long addr = getDirectBufferAddress(); + switch(POINTER_SIZE) { + case 4: + directDest.putInt(destBytePos, (int) ( addr & 0x00000000FFFFFFFFL ) ); + break; + case 8: + directDest.putLong(destBytePos, addr); + break; + } + } @Override public final boolean hasArray() { @@ -143,9 +182,11 @@ public abstract class AbstractBuffer<B extends AbstractBuffer> implements Native return buffer.array(); } + protected String toSubString() { + return "[direct["+isDirect()+", addr 0x"+Long.toHexString(getDirectBufferAddress())+"], hasArray "+hasArray()+", capacity "+capacity+", position "+position+", elementSize "+elementSize+", buffer[capacity "+buffer.capacity()+", lim "+buffer.limit()+", pos "+buffer.position()+"]]"; + } @Override public String toString() { - return "AbstractBuffer[direct "+isDirect()+", hasArray "+hasArray()+", capacity "+capacity+", position "+position+", elementSize "+elementSize+", buffer[capacity "+buffer.capacity()+", lim "+buffer.limit()+", pos "+buffer.position()+"]]"; + return "AbstractBuffer"+toSubString(); } - } |