/* This file is part of jpcsp. Jpcsp is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Jpcsp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Jpcsp. If not, see <http://www.gnu.org/licenses/>. */ package jpcsp.graphics.RE; import static jpcsp.util.Utilities.round2; import static jpcsp.util.Utilities.round4; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.nio.ShortBuffer; import jpcsp.graphics.VideoEngine; public class DirectBufferUtilities { protected static int directBufferSize = 100; protected static ByteBuffer directBuffer = ByteBuffer.allocateDirect(directBufferSize).order(ByteOrder.nativeOrder()); protected static FloatBuffer directFloatBuffer = ByteBuffer.allocateDirect(128 * VideoEngine.SIZEOF_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer(); public static FloatBuffer getDirectBuffer(float[] values) { return getDirectBuffer(values, values.length); } public static FloatBuffer getDirectBuffer(float[] values, int length) { directFloatBuffer.clear(); directFloatBuffer.limit(length); directFloatBuffer.put(values, 0, length); directFloatBuffer.rewind(); return directFloatBuffer; } public static IntBuffer getDirectBuffer(int size, IntBuffer buffer) { if (buffer == null) { return buffer; } size = round4(size); if (buffer.isDirect()) { buffer.limit((size >> 2) + buffer.position()); return buffer; } IntBuffer directBuffer = allocateDirectBuffer(size).asIntBuffer(); directBuffer.put((IntBuffer) ((IntBuffer) buffer).slice().limit(size >> 2)); directBuffer.rewind(); return directBuffer; } public static FloatBuffer getDirectBuffer(int size, FloatBuffer buffer) { if (buffer == null) { return buffer; } size = round4(size); if (buffer.isDirect()) { buffer.limit((size >> 2) + buffer.position()); return buffer; } FloatBuffer directBuffer = allocateDirectBuffer(size).asFloatBuffer(); directBuffer.put((FloatBuffer) ((FloatBuffer) buffer).slice().limit(size >> 2)); directBuffer.rewind(); return directBuffer; } public static ShortBuffer getDirectBuffer(int size, ShortBuffer buffer) { if (buffer == null) { return buffer; } size = round2(size); if (buffer.isDirect()) { buffer.limit((size >> 1) + buffer.position()); return buffer; } ShortBuffer directBuffer = allocateDirectBuffer(size).asShortBuffer(); directBuffer.put((ShortBuffer) ((ShortBuffer) buffer).slice().limit(size >> 1)); directBuffer.rewind(); return directBuffer; } public static ByteBuffer getDirectBuffer(int size, ByteBuffer buffer) { if (buffer == null) { return buffer; } if (buffer.isDirect()) { buffer.limit(size + buffer.position()); return buffer; } ByteBuffer directBuffer = allocateDirectBuffer(size); directBuffer.put((ByteBuffer) ((ByteBuffer) buffer).slice().limit(size)); directBuffer.rewind(); return directBuffer; } private static ByteBuffer getByteBuffer(int size, Buffer buffer, int bufferOffset) { if (buffer instanceof ByteBuffer) { buffer.limit(size); buffer.position(bufferOffset); return (ByteBuffer) buffer; } else if (buffer instanceof IntBuffer) { size = round4(size); ByteBuffer directBuffer = allocateDirectBuffer(size); directBuffer.asIntBuffer().put((IntBuffer) ((IntBuffer) buffer).slice().limit(size >> 2)); directBuffer.position(bufferOffset); return directBuffer; } else if (buffer instanceof ShortBuffer) { size = round2(size); ByteBuffer directBuffer = allocateDirectBuffer(size); directBuffer.asShortBuffer().put((ShortBuffer) ((ShortBuffer) buffer).slice().limit(size >> 1)); directBuffer.position(bufferOffset); return directBuffer; } else if (buffer instanceof FloatBuffer) { size = round4(size); ByteBuffer directBuffer = allocateDirectBuffer(size); directBuffer.asFloatBuffer().put((FloatBuffer) ((FloatBuffer) buffer).slice().limit(size >> 2)); directBuffer.position(bufferOffset); return directBuffer; } throw new IllegalArgumentException(); } public static ByteBuffer getDirectByteBuffer(int size, Buffer buffer, int bufferOffset) { return getDirectBuffer(size, getByteBuffer(size, buffer, bufferOffset)); } public static FloatBuffer getDirectFloatBuffer(int size, Buffer buffer, int bufferOffset) { return getDirectBuffer(size, getByteBuffer(size, buffer, bufferOffset).asFloatBuffer()); } public static IntBuffer getDirectIntBuffer(int size, Buffer buffer, int bufferOffset) { return getDirectBuffer(size, getByteBuffer(size, buffer, bufferOffset).asIntBuffer()); } public static ShortBuffer getDirectShortBuffer(int size, Buffer buffer, int bufferOffset) { return getDirectBuffer(size, getByteBuffer(size, buffer, bufferOffset).asShortBuffer()); } public static ByteBuffer allocateDirectBuffer(int size) { if (size > directBufferSize) { directBufferSize = size; directBuffer = ByteBuffer.allocateDirect(directBufferSize).order(ByteOrder.nativeOrder()); } directBuffer.clear(); directBuffer.limit(size); return directBuffer; } public static ByteBuffer allocateDirectBuffer(ByteBuffer buffer) { if (buffer.isDirect()) { return buffer; } return allocateDirectBuffer(buffer.remaining()); } public static IntBuffer allocateDirectBuffer(IntBuffer buffer) { if (buffer.isDirect()) { return buffer; } return allocateDirectBuffer(buffer.remaining() << 2).asIntBuffer(); } public static ShortBuffer allocateDirectBuffer(ShortBuffer buffer) { if (buffer.isDirect()) { return buffer; } return allocateDirectBuffer(buffer.remaining() << 1).asShortBuffer(); } public static FloatBuffer allocateDirectBuffer(FloatBuffer buffer) { if (buffer.isDirect()) { return buffer; } return allocateDirectBuffer(buffer.remaining() << 2).asFloatBuffer(); } public static void copyBuffer(ByteBuffer dstBuffer, ByteBuffer srcBuffer) { if (dstBuffer != srcBuffer) { srcBuffer.rewind(); dstBuffer.put(srcBuffer); } } public static void copyBuffer(IntBuffer dstBuffer, IntBuffer srcBuffer) { if (dstBuffer != srcBuffer) { srcBuffer.rewind(); dstBuffer.put(srcBuffer); } } public static void copyBuffer(ShortBuffer dstBuffer, ShortBuffer srcBuffer) { if (dstBuffer != srcBuffer) { srcBuffer.rewind(); dstBuffer.put(srcBuffer); } } public static void copyBuffer(FloatBuffer dstBuffer, FloatBuffer srcBuffer) { if (dstBuffer != srcBuffer) { srcBuffer.rewind(); dstBuffer.put(srcBuffer); } } }