diff --git a/src/java/org/lwjgl/NondirectBufferWrapper.java b/src/java/org/lwjgl/NondirectBufferWrapper.java deleted file mode 100644 index 72825e32..00000000 --- a/src/java/org/lwjgl/NondirectBufferWrapper.java +++ /dev/null @@ -1,409 +0,0 @@ -/* - * Copyright (c) 2002-2008 LWJGL Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'LWJGL' nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.lwjgl; - -import java.nio.ByteBuffer; -import java.nio.ShortBuffer; -import java.nio.IntBuffer; -import java.nio.FloatBuffer; -import java.nio.LongBuffer; -import java.nio.DoubleBuffer; -import java.nio.ByteOrder; - -/** - * Utility class to cache thread local direct buffers so when we are passed a non-direct buffer, - * we can put its contents into a cached direct buffer and use that at the native side instead. - * - * Internal class, don't use. - * @author elias_naur - * @version $Revision: 2762 $ - * $Id: BufferChecks.java 2762 2007-04-11 16:13:05Z elias_naur $ - */ -public final class NondirectBufferWrapper { - private static final int INITIAL_BUFFER_SIZE = 1; - - private static final ThreadLocal thread_buffer = new ThreadLocal() { - protected CachedBuffers initialValue() { - return new CachedBuffers(INITIAL_BUFFER_SIZE); - } - }; - - private static CachedBuffers getCachedBuffers(int minimum_byte_size) { - CachedBuffers buffers = thread_buffer.get(); - int current_byte_size = buffers.byte_buffer.capacity(); - if (minimum_byte_size > current_byte_size) { - buffers = new CachedBuffers(minimum_byte_size); - thread_buffer.set(buffers); - } - return buffers; - } - - public static ByteBuffer wrapNoCopyBuffer(ByteBuffer buf, int size) { - BufferChecks.checkBufferSize(buf, size); - return wrapNoCopyDirect(buf); - } - - public static ShortBuffer wrapNoCopyBuffer(ShortBuffer buf, int size) { - BufferChecks.checkBufferSize(buf, size); - return wrapNoCopyDirect(buf); - } - - public static IntBuffer wrapNoCopyBuffer(IntBuffer buf, int size) { - BufferChecks.checkBufferSize(buf, size); - return wrapNoCopyDirect(buf); - } - - public static LongBuffer wrapNoCopyBuffer(LongBuffer buf, int size) { - BufferChecks.checkBufferSize(buf, size); - return wrapNoCopyDirect(buf); - } - - public static FloatBuffer wrapNoCopyBuffer(FloatBuffer buf, int size) { - BufferChecks.checkBufferSize(buf, size); - return wrapNoCopyDirect(buf); - } - - public static DoubleBuffer wrapNoCopyBuffer(DoubleBuffer buf, int size) { - BufferChecks.checkBufferSize(buf, size); - return wrapNoCopyDirect(buf); - } - - public static ByteBuffer wrapBuffer(ByteBuffer buf, int size) { - BufferChecks.checkBufferSize(buf, size); - return wrapDirect(buf); - } - - public static ShortBuffer wrapBuffer(ShortBuffer buf, int size) { - BufferChecks.checkBufferSize(buf, size); - return wrapDirect(buf); - } - - public static IntBuffer wrapBuffer(IntBuffer buf, int size) { - BufferChecks.checkBufferSize(buf, size); - return wrapDirect(buf); - } - - public static LongBuffer wrapBuffer(LongBuffer buf, int size) { - BufferChecks.checkBufferSize(buf, size); - return wrapDirect(buf); - } - - public static FloatBuffer wrapBuffer(FloatBuffer buf, int size) { - BufferChecks.checkBufferSize(buf, size); - return wrapDirect(buf); - } - - public static DoubleBuffer wrapBuffer(DoubleBuffer buf, int size) { - BufferChecks.checkBufferSize(buf, size); - return wrapDirect(buf); - } - - public static ByteBuffer wrapDirect(ByteBuffer buffer) { - if (!buffer.isDirect()) - return doWrap(buffer); - return buffer; - } - - public static ShortBuffer wrapDirect(ShortBuffer buffer) { - if (!buffer.isDirect()) - return doWrap(buffer); - return buffer; - } - - public static FloatBuffer wrapDirect(FloatBuffer buffer) { - if (!buffer.isDirect()) - return doWrap(buffer); - return buffer; - } - - public static IntBuffer wrapDirect(IntBuffer buffer) { - if (!buffer.isDirect()) - return doWrap(buffer); - return buffer; - } - - public static LongBuffer wrapDirect(LongBuffer buffer) { - if (!buffer.isDirect()) - return doWrap(buffer); - return buffer; - } - - public static DoubleBuffer wrapDirect(DoubleBuffer buffer) { - if (!buffer.isDirect()) - return doWrap(buffer); - return buffer; - } - - public static ByteBuffer wrapNoCopyDirect(ByteBuffer buffer) { - if (!buffer.isDirect()) - return doNoCopyWrap(buffer); - return buffer; - } - - public static ShortBuffer wrapNoCopyDirect(ShortBuffer buffer) { - if (!buffer.isDirect()) - return doNoCopyWrap(buffer); - return buffer; - } - - public static FloatBuffer wrapNoCopyDirect(FloatBuffer buffer) { - if (!buffer.isDirect()) - return doNoCopyWrap(buffer); - return buffer; - } - - public static IntBuffer wrapNoCopyDirect(IntBuffer buffer) { - if (!buffer.isDirect()) - return doNoCopyWrap(buffer); - return buffer; - } - - public static LongBuffer wrapNoCopyDirect(LongBuffer buffer) { - if (!buffer.isDirect()) - return doNoCopyWrap(buffer); - return buffer; - } - - public static DoubleBuffer wrapNoCopyDirect(DoubleBuffer buffer) { - if (!buffer.isDirect()) - return doNoCopyWrap(buffer); - return buffer; - } - - public static void copy(ByteBuffer src, ByteBuffer dst) { - if (dst != null && !dst.isDirect()) { - int saved_position = dst.position(); - dst.put(src); - dst.position(saved_position); - } - } - - public static void copy(ShortBuffer src, ShortBuffer dst) { - if (dst != null && !dst.isDirect()) { - int saved_position = dst.position(); - dst.put(src); - dst.position(saved_position); - } - } - - public static void copy(IntBuffer src, IntBuffer dst) { - if (dst != null && !dst.isDirect()) { - int saved_position = dst.position(); - dst.put(src); - dst.position(saved_position); - } - } - - public static void copy(FloatBuffer src, FloatBuffer dst) { - if (dst != null && !dst.isDirect()) { - int saved_position = dst.position(); - dst.put(src); - dst.position(saved_position); - } - } - - public static void copy(LongBuffer src, LongBuffer dst) { - if (dst != null && !dst.isDirect()) { - int saved_position = dst.position(); - dst.put(src); - dst.position(saved_position); - } - } - - public static void copy(DoubleBuffer src, DoubleBuffer dst) { - if (dst != null && !dst.isDirect()) { - int saved_position = dst.position(); - dst.put(src); - dst.position(saved_position); - } - } - - private static ByteBuffer doNoCopyWrap(ByteBuffer buffer) { - ByteBuffer direct_buffer = lookupBuffer(buffer); - direct_buffer.limit(buffer.limit()); - direct_buffer.position(buffer.position()); - return direct_buffer; - } - - private static ShortBuffer doNoCopyWrap(ShortBuffer buffer) { - ShortBuffer direct_buffer = lookupBuffer(buffer); - direct_buffer.limit(buffer.limit()); - direct_buffer.position(buffer.position()); - return direct_buffer; - } - - private static IntBuffer doNoCopyWrap(IntBuffer buffer) { - IntBuffer direct_buffer = lookupBuffer(buffer); - direct_buffer.limit(buffer.limit()); - direct_buffer.position(buffer.position()); - return direct_buffer; - } - - private static FloatBuffer doNoCopyWrap(FloatBuffer buffer) { - FloatBuffer direct_buffer = lookupBuffer(buffer); - direct_buffer.limit(buffer.limit()); - direct_buffer.position(buffer.position()); - return direct_buffer; - } - - private static LongBuffer doNoCopyWrap(LongBuffer buffer) { - LongBuffer direct_buffer = lookupBuffer(buffer); - direct_buffer.limit(buffer.limit()); - direct_buffer.position(buffer.position()); - return direct_buffer; - } - - private static DoubleBuffer doNoCopyWrap(DoubleBuffer buffer) { - DoubleBuffer direct_buffer = lookupBuffer(buffer); - direct_buffer.limit(buffer.limit()); - direct_buffer.position(buffer.position()); - return direct_buffer; - } - - private static ByteBuffer lookupBuffer(ByteBuffer buffer) { - return getCachedBuffers(buffer.remaining()).byte_buffer; - } - - private static ByteBuffer doWrap(ByteBuffer buffer) { - ByteBuffer direct_buffer = lookupBuffer(buffer); - direct_buffer.clear(); - int saved_position = buffer.position(); - direct_buffer.put(buffer); - buffer.position(saved_position); - direct_buffer.flip(); - return direct_buffer; - } - - private static ShortBuffer lookupBuffer(ShortBuffer buffer) { - CachedBuffers buffers = getCachedBuffers(buffer.remaining()*2); - return buffer.order() == ByteOrder.LITTLE_ENDIAN ? buffers.short_buffer_little : buffers.short_buffer_big; - } - - private static ShortBuffer doWrap(ShortBuffer buffer) { - ShortBuffer direct_buffer = lookupBuffer(buffer); - direct_buffer.clear(); - int saved_position = buffer.position(); - direct_buffer.put(buffer); - buffer.position(saved_position); - direct_buffer.flip(); - return direct_buffer; - } - - private static FloatBuffer lookupBuffer(FloatBuffer buffer) { - CachedBuffers buffers = getCachedBuffers(buffer.remaining()*4); - return buffer.order() == ByteOrder.LITTLE_ENDIAN ? buffers.float_buffer_little : buffers.float_buffer_big; - } - - private static FloatBuffer doWrap(FloatBuffer buffer) { - FloatBuffer direct_buffer = lookupBuffer(buffer); - direct_buffer.clear(); - int saved_position = buffer.position(); - direct_buffer.put(buffer); - buffer.position(saved_position); - direct_buffer.flip(); - return direct_buffer; - } - - private static IntBuffer lookupBuffer(IntBuffer buffer) { - CachedBuffers buffers = getCachedBuffers(buffer.remaining()*4); - return buffer.order() == ByteOrder.LITTLE_ENDIAN ? buffers.int_buffer_little : buffers.int_buffer_big; - } - - private static IntBuffer doWrap(IntBuffer buffer) { - IntBuffer direct_buffer = lookupBuffer(buffer); - direct_buffer.clear(); - int saved_position = buffer.position(); - direct_buffer.put(buffer); - buffer.position(saved_position); - direct_buffer.flip(); - return direct_buffer; - } - - private static LongBuffer lookupBuffer(LongBuffer buffer) { - CachedBuffers buffers = getCachedBuffers(buffer.remaining()*8); - return buffer.order() == ByteOrder.LITTLE_ENDIAN ? buffers.long_buffer_little : buffers.long_buffer_big; - } - - private static LongBuffer doWrap(LongBuffer buffer) { - LongBuffer direct_buffer = lookupBuffer(buffer); - direct_buffer.clear(); - int saved_position = buffer.position(); - direct_buffer.put(buffer); - buffer.position(saved_position); - direct_buffer.flip(); - return direct_buffer; - } - - private static DoubleBuffer lookupBuffer(DoubleBuffer buffer) { - CachedBuffers buffers = getCachedBuffers(buffer.remaining()*8); - return buffer.order() == ByteOrder.LITTLE_ENDIAN ? buffers.double_buffer_little : buffers.double_buffer_big; - } - - private static DoubleBuffer doWrap(DoubleBuffer buffer) { - DoubleBuffer direct_buffer = lookupBuffer(buffer); - direct_buffer.clear(); - int saved_position = buffer.position(); - direct_buffer.put(buffer); - buffer.position(saved_position); - direct_buffer.flip(); - return direct_buffer; - } - - private static final class CachedBuffers { - private final ByteBuffer byte_buffer; - private final ShortBuffer short_buffer_big; - private final IntBuffer int_buffer_big; - private final FloatBuffer float_buffer_big; - private final LongBuffer long_buffer_big; - private final DoubleBuffer double_buffer_big; - private final ShortBuffer short_buffer_little; - private final IntBuffer int_buffer_little; - private final FloatBuffer float_buffer_little; - private final LongBuffer long_buffer_little; - private final DoubleBuffer double_buffer_little; - - private CachedBuffers(int size) { - this.byte_buffer = ByteBuffer.allocateDirect(size); - this.short_buffer_big = byte_buffer.asShortBuffer(); - this.int_buffer_big = byte_buffer.asIntBuffer(); - this.float_buffer_big = byte_buffer.asFloatBuffer(); - this.long_buffer_big = byte_buffer.asLongBuffer(); - this.double_buffer_big = byte_buffer.asDoubleBuffer(); - this.byte_buffer.order(ByteOrder.LITTLE_ENDIAN); - this.short_buffer_little = byte_buffer.asShortBuffer(); - this.int_buffer_little = byte_buffer.asIntBuffer(); - this.float_buffer_little = byte_buffer.asFloatBuffer(); - this.long_buffer_little = byte_buffer.asLongBuffer(); - this.double_buffer_little = byte_buffer.asDoubleBuffer(); - } - } -} diff --git a/src/java/org/lwjgl/input/Cursor.java b/src/java/org/lwjgl/input/Cursor.java index 7f257f63..bdb776d6 100644 --- a/src/java/org/lwjgl/input/Cursor.java +++ b/src/java/org/lwjgl/input/Cursor.java @@ -33,10 +33,10 @@ package org.lwjgl.input; import java.nio.IntBuffer; +import org.lwjgl.BufferChecks; import org.lwjgl.BufferUtils; import org.lwjgl.LWJGLException; import org.lwjgl.LWJGLUtil; -import org.lwjgl.NondirectBufferWrapper; import org.lwjgl.Sys; /** @@ -86,9 +86,9 @@ public class Cursor { synchronized (OpenGLPackageAccess.global_lock) { if ((getCapabilities() & CURSOR_ONE_BIT_TRANSPARENCY) == 0) throw new LWJGLException("Native cursors not supported"); - images = NondirectBufferWrapper.wrapBuffer(images, width*height*numImages); + BufferChecks.checkBufferSize(images, width*height*numImages); if (delays != null) - delays = NondirectBufferWrapper.wrapBuffer(delays, numImages); + BufferChecks.checkBufferSize(delays, numImages); if (!Mouse.isCreated()) throw new IllegalStateException("Mouse must be created before creating cursor objects"); if (width*height*numImages > images.remaining()) diff --git a/src/java/org/lwjgl/util/generator/JavaMethodsGenerator.java b/src/java/org/lwjgl/util/generator/JavaMethodsGenerator.java index 8e5f4f65..78ecd951 100644 --- a/src/java/org/lwjgl/util/generator/JavaMethodsGenerator.java +++ b/src/java/org/lwjgl/util/generator/JavaMethodsGenerator.java @@ -599,22 +599,6 @@ public class JavaMethodsGenerator { } } - private static void printNondirectParameterCopies(PrintWriter writer, MethodDeclaration method, Mode mode) { - for (ParameterDeclaration param : method.getParameters()) { - Class java_type = Utils.getJavaType(param.getType()); - if (Utils.isAddressableType(java_type) && - (mode != Mode.BUFFEROBJECT || param.getAnnotation(BufferObject.class) == null) && - (mode != Mode.AUTOS || getAutoTypeParameter(method, param) == null) && - param.getAnnotation(Result.class) == null) { - if (Buffer.class.isAssignableFrom(java_type)) { - boolean out_parameter = param.getAnnotation(OutParameter.class) != null; - if (out_parameter) - writer.println("\t\tNondirectBufferWrapper.copy(" + param.getSimpleName() + ", " + param.getSimpleName() + SAVED_PARAMETER_POSTFIX + ");"); - } - } - } - } - private static void printParameterChecks(PrintWriter writer, MethodDeclaration method, Map typeinfos, Mode mode, final boolean generate_error_checks) { if ( mode == Mode.NORMAL ) { final GenerateAutos gen_autos_annotation = method.getAnnotation(GenerateAutos.class); @@ -650,10 +634,9 @@ public class JavaMethodsGenerator { can_be_null = check_annotation.canBeNull(); } if ((Buffer.class.isAssignableFrom(java_type) || PointerBuffer.class.isAssignableFrom(java_type)) && param.getAnnotation(Constant.class) == null) { - boolean indirect_buffer_allowed = false && param.getAnnotation(CachedReference.class) == null; // DISABLED: indirect buffer support boolean out_parameter = param.getAnnotation(OutParameter.class) != null; TypeInfo typeinfo = typeinfos.get(param); - printParameterCheck(writer, method, param.getSimpleName(), typeinfo.getType().getSimpleName(), check_value, can_be_null, param.getAnnotation(NullTerminated.class), indirect_buffer_allowed, out_parameter, generate_error_checks); + printParameterCheck(writer, method, param.getSimpleName(), typeinfo.getType().getSimpleName(), check_value, can_be_null, param.getAnnotation(NullTerminated.class), out_parameter, generate_error_checks); } else if ( String.class.equals(java_type)) { if (!can_be_null) writer.println("\t\tBufferChecks.checkNotNull(" + param.getSimpleName() + ");"); @@ -664,13 +647,10 @@ public class JavaMethodsGenerator { } } if (method.getAnnotation(CachedResult.class) != null) - printParameterCheck(writer, method, Utils.CACHED_BUFFER_NAME, null, null, true, null, false, false, generate_error_checks); + printParameterCheck(writer, method, Utils.CACHED_BUFFER_NAME, null, null, true, null, false, generate_error_checks); } - private static void printParameterCheck(PrintWriter writer, MethodDeclaration method, String name, String type, String check_value, boolean can_be_null, NullTerminated null_terminated, boolean indirect_buffer_allowed, boolean out_parameter, final boolean generate_error_checks) { - if (indirect_buffer_allowed && out_parameter) { - writer.println("\t\t" + type + " " + name + SAVED_PARAMETER_POSTFIX + " = " + name + ";"); - } + private static void printParameterCheck(PrintWriter writer, MethodDeclaration method, String name, String type, String check_value, boolean can_be_null, NullTerminated null_terminated, boolean out_parameter, boolean generate_error_checks) { String tabs; if (can_be_null) { writer.print("\t\tif (" + name + " != null)"); @@ -681,12 +661,7 @@ public class JavaMethodsGenerator { tabs = "\t\t\t"; } else tabs = "\t\t"; - if (indirect_buffer_allowed) { - writer.print(tabs + name + " = NondirectBufferWrapper.wrap"); - if (out_parameter) - writer.print("NoCopy"); - } else - writer.print(tabs + "BufferChecks.check"); + writer.print(tabs + "BufferChecks.check"); if (check_value != null && check_value.length() > 0) { writer.print("Buffer"); if ( "Buffer".equals(type) )