[Git][java-team/lwjgl][master] 10 commits: Standards-Version updated to 4.2.1
Emmanuel Bourg
gitlab at salsa.debian.org
Tue Oct 9 23:46:24 BST 2018
Emmanuel Bourg pushed to branch master at Debian Java Maintainers / lwjgl
Commits:
9d6d242b by Emmanuel Bourg at 2018-10-09T19:47:05Z
Standards-Version updated to 4.2.1
- - - - -
7fd81012 by Emmanuel Bourg at 2018-10-09T19:47:37Z
Use salsa.debian.org Vcs-* URLs
- - - - -
10477022 by Emmanuel Bourg at 2018-10-09T19:48:52Z
Wrap and sort
- - - - -
d0804827 by Emmanuel Bourg at 2018-10-09T19:59:30Z
DEP3 patch headers
- - - - -
6e56266a by Emmanuel Bourg at 2018-10-09T20:26:47Z
Simplified the OS X patch
- - - - -
27e9a561 by Emmanuel Bourg at 2018-10-09T20:36:13Z
Simplified the ASM patch
- - - - -
3e4a4c93 by Emmanuel Bourg at 2018-10-09T20:44:21Z
Filter the upstream tarball with the Files-Excluded field in d/copyright
- - - - -
c6d10221 by Emmanuel Bourg at 2018-10-09T20:51:46Z
Simplified debian/rules
- - - - -
dc13727b by Emmanuel Bourg at 2018-10-09T22:44:52Z
Fixed the build failures with Java 9/10/11 (Closes: #893302)
- - - - -
e9807a3f by Emmanuel Bourg at 2018-10-09T22:45:05Z
Upload to unstable
- - - - -
18 changed files:
- debian/changelog
- + debian/clean
- debian/control
- debian/copyright
- debian/patches/allarchs.patch
- + debian/patches/annotation-processor-workaround.patch
- debian/patches/build-failure.patch
- + debian/patches/disable-pack200-task.patch
- + debian/patches/java9-compatibility.patch
- debian/patches/javadoc.patch
- + debian/patches/javah.patch
- debian/patches/no-asm-support.patch
- debian/patches/nomacosx.patch
- debian/patches/ppc64el.patch
- debian/patches/series
- debian/patches/systemjinput.patch
- debian/rules
- debian/watch
Changes:
=====================================
debian/changelog
=====================================
@@ -1,3 +1,14 @@
+lwjgl (2.9.3+dfsg-4) unstable; urgency=medium
+
+ * Team upload.
+ * Fixed the build failures with Java 9/10/11 (Closes: #893302)
+ * Simplified the OS X and ASM patches
+ * Filter the upstream tarball with the Files-Excluded field in d/copyright
+ * Standards-Version updated to 4.2.1
+ * Use salsa.debian.org Vcs-* URLs
+
+ -- Emmanuel Bourg <ebourg at apache.org> Wed, 10 Oct 2018 00:44:57 +0200
+
lwjgl (2.9.3+dfsg-3) unstable; urgency=medium
* Team upload.
=====================================
debian/clean
=====================================
@@ -0,0 +1,8 @@
+bin/
+dist/
+doc/
+libs/
+res/
+src/native/generated/
+src/generated/
+temp/
=====================================
debian/control
=====================================
@@ -4,31 +4,30 @@ Priority: optional
Maintainer: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
Uploaders:
Michael Gilbert <mgilbert at debian.org>,
- tony mancill <tmancill at debian.org>,
+ tony mancill <tmancill at debian.org>
Build-Depends:
- debhelper (>= 11),
- javahelper,
ant,
ant-optional,
- openjdk-8-jdk,
+ debhelper (>= 11),
+ default-jdk,
+ default-jdk-doc,
+ javahelper,
libjinput-java,
- libxrandr-dev,
- libxxf86vm-dev,
libxcursor-dev,
+ libxrandr-dev,
libxt-dev,
-Build-Depends-Indep:
- default-jdk-doc
-Standards-Version: 4.1.5
-Vcs-Git: https://anonscm.debian.org/git/pkg-java/lwjgl.git
-Vcs-Browser: https://anonscm.debian.org/cgit/pkg-java/lwjgl.git
+ libxxf86vm-dev
+Standards-Version: 4.2.1
+Vcs-Git: https://salsa.debian.org/java-team/lwjgl.git
+Vcs-Browser: https://salsa.debian.org/java-team/lwjgl
Homepage: https://www.lwjgl.org
Package: liblwjgl-java
Architecture: all
Depends:
- ${misc:Depends},
libjinput-java,
- liblwjgl-java-jni (>= ${source:Version})
+ liblwjgl-java-jni (>= ${source:Version}),
+ ${misc:Depends}
Description: Lightweight Java Game Library
The Lightweight Java Game Library (LWJGL) is a solution aimed directly at
professional and amateur Java programmers alike to enable commercial quality
@@ -40,9 +39,7 @@ Description: Lightweight Java Game Library
Package: liblwjgl-java-jni
Architecture: any
-Depends:
- ${shlibs:Depends},
- ${misc:Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
Description: Lightweight Java Game Library (jni)
The Lightweight Java Game Library (LWJGL) is a solution aimed directly at
professional and amateur Java programmers alike to enable commercial quality
@@ -57,8 +54,7 @@ Description: Lightweight Java Game Library (jni)
Package: liblwjgl-java-doc
Architecture: all
Section: doc
-Depends:
- ${misc:Depends}
+Depends: ${misc:Depends}
Suggests: liblwjgl-java
Recommends: default-jdk-doc
Description: Lightweight Java Game Library (javadoc)
=====================================
debian/copyright
=====================================
@@ -1,6 +1,10 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0
Upstream-Name: lwjgl - Lightweight Java Game Library
Upstream-Contact: LWJGL developers <info at lwjgl.org>
+Files-Excluded: *.class
+ *.jar
+ src/generated/*
+ src/native/generated/*
Files: *
Copyright: 2002-2015, Lightweight Java Game Library Project
@@ -154,5 +158,3 @@ License: Expat
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
-
-
=====================================
debian/patches/allarchs.patch
=====================================
@@ -1,16 +1,6 @@
-From: Markus Koschany <apo at debian.org>
-Date: Sat, 9 Apr 2016 19:07:56 +0200
-Subject: allarchs
-
-Try to support all Debian architectures.
-
+Description: Try to support all Debian architectures
+Author: Markus Koschany <apo at debian.org>
Forwarded: no
----
- platform_build/linux_ant/build.xml | 36 ++++++++++++++++++++++++++++++++++--
- 1 file changed, 34 insertions(+), 2 deletions(-)
-
-diff --git a/platform_build/linux_ant/build.xml b/platform_build/linux_ant/build.xml
-index e5ce8d1..72eb346 100644
--- a/platform_build/linux_ant/build.xml
+++ b/platform_build/linux_ant/build.xml
@@ -6,12 +6,14 @@
=====================================
debian/patches/annotation-processor-workaround.patch
=====================================
@@ -0,0 +1,17 @@
+Description: Workaround for a regression in the annotation processor with Java 9+
+Author: Emmanuel Bourg <ebourg at apache.org>
+Forwarded: no
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=893302
+--- a/src/java/org/lwjgl/util/generator/GeneratorVisitor.java
++++ b/src/java/org/lwjgl/util/generator/GeneratorVisitor.java
+@@ -300,8 +300,8 @@
+ }
+
+ // TODO: Back-port LWJGL 3's generation file handling (generate in-memory and avoid touching files if nothing has changed)
+- java_writer = new PrintWriter(env.getFiler().createSourceFile(Utils.getQualifiedClassName(e), env.getElementUtils().getPackageOf(e)).openWriter());
+- generateJavaSource(e, java_writer);
++ outputJava.getParentFile().mkdirs();
++ generateJavaSource(e, new PrintWriter(new java.io.FileWriter(outputJava)));
+
+ if ( methods.size() > 0 ) {
+ boolean noNative = true;
=====================================
debian/patches/build-failure.patch
=====================================
@@ -1,16 +1,6 @@
-From: Markus Koschany <apo at debian.org>
-Date: Sat, 9 Apr 2016 19:29:18 +0200
-Subject: build failure
-
-This file doesn't exist and causes a FTBFS.
-
+Description: build-updatesite.xml doesn't exist and causes a build failure
+Author: Markus Koschany <apo at debian.org>
Forwarded: not-needed
----
- build.xml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/build.xml b/build.xml
-index c78b2dc..8d5aa03 100644
--- a/build.xml
+++ b/build.xml
@@ -7,7 +7,7 @@
=====================================
debian/patches/disable-pack200-task.patch
=====================================
@@ -0,0 +1,14 @@
+Description: Disables the pack200 task
+Author: Markus Koschany <apo at debian.org>
+Forwarded: not-needed
+--- a/platform_build/build-applet.xml
++++ b/platform_build/build-applet.xml
+@@ -1,7 +1,7 @@
+ <project name="applet">
+
+ <!-- Create our packer task -->
+- <taskdef name="pack200" classname="com.sun.tools.apache.ant.pack200.Pack200Task" classpath="platform_build/Pack200Task.jar"/>
++ <!--<taskdef name="pack200" classname="com.sun.tools.apache.ant.pack200.Pack200Task" classpath="platform_build/Pack200Task.jar"/>-->
+
+ <target name="applet">
+ <antcall target="-applet">
=====================================
debian/patches/java9-compatibility.patch
=====================================
@@ -0,0 +1,49 @@
+Description: Fixes the compatibility with Java 9 (sun.reflect.FieldAccessor is no longer accessible)
+Author: Emmanuel Bourg <ebourg at pache.org>
+Forwarded: no
+--- a/src/java/org/lwjgl/MemoryUtilSun.java
++++ b/src/java/org/lwjgl/MemoryUtilSun.java
+@@ -37,7 +37,6 @@
+ import java.nio.Buffer;
+
+ import sun.misc.Unsafe;
+-import sun.reflect.FieldAccessor;
+
+ /**
+ * MemoryUtil.Accessor implementations that depend on sun.misc.
+@@ -103,33 +102,4 @@
+
+ }
+
+- /** Implementation using reflection on ByteBuffer, FieldAccessor is used directly. */
+- private static class AccessorReflectFast implements MemoryUtil.Accessor {
+-
+- private final FieldAccessor addressAccessor;
+-
+- AccessorReflectFast() {
+- Field address;
+- try {
+- address = MemoryUtil.getAddressField();
+- } catch (NoSuchFieldException e) {
+- throw new UnsupportedOperationException(e);
+- }
+- address.setAccessible(true);
+-
+- try {
+- Method m = Field.class.getDeclaredMethod("acquireFieldAccessor", boolean.class);
+- m.setAccessible(true);
+- addressAccessor = (FieldAccessor)m.invoke(address, true);
+- } catch (Exception e) {
+- throw new UnsupportedOperationException(e);
+- }
+- }
+-
+- public long getAddress(final Buffer buffer) {
+- return addressAccessor.getLong(buffer);
+- }
+-
+- }
+-
+-}
+\ No newline at end of file
++}
=====================================
debian/patches/javadoc.patch
=====================================
@@ -1,14 +1,6 @@
+Description: Link the javadoc with the system JDK documentation
From: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
-Date: Sat, 9 Apr 2016 18:50:43 +0200
-Subject: javadoc
-
Forwarded: not-needed
----
- build.xml | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/build.xml b/build.xml
-index 7f6bb68..736c91a 100644
--- a/build.xml
+++ b/build.xml
@@ -672,6 +672,7 @@
=====================================
debian/patches/javah.patch
=====================================
@@ -0,0 +1,120 @@
+Description: Generate the native headers with 'javac -h' instead of javah (removed from Java 10)
+Author: Emmanuel Bourg <ebourg at apache.org>
+Forwarded: no
+--- a/build.xml
++++ b/build.xml
+@@ -297,6 +297,7 @@
+
+ <!-- Generates the native headers from source files -->
+ <target name="headers" description="invokes javah on java classes" depends="compile">
++<!--
+ <javah classpath="${lwjgl.bin}" destdir="${lwjgl.src.native}/linux">
+ <class name="org.lwjgl.LinuxSysImplementation" />
+ <class name="org.lwjgl.opengl.LinuxEvent" />
+@@ -373,6 +374,7 @@
+ <class name="org.lwjgl.opengles.GLContext"/>
+ <class name="org.lwjgl.opengles.CallbackUtil"/>
+ </javah>
++-->
+ </target>
+
+ <target name="touch-version">
+@@ -403,21 +405,21 @@
+ </tokenfilter>
+ </filterchain>
+ </loadfile>
+- <loadfile srcfile="${lwjgl.src.native}/windows/org_lwjgl_WindowsSysImplementation.h" property="lwjgl.native.windows.version">
++ <loadfile srcfile="${lwjgl.src.native}/org_lwjgl_WindowsSysImplementation.h" property="lwjgl.native.windows.version">
+ <filterchain>
+ <tokenfilter>
+ <containsstring contains="#define org_lwjgl_WindowsSysImplementation_JNI_VERSION"/>
+ </tokenfilter>
+ </filterchain>
+ </loadfile>
+- <loadfile srcfile="${lwjgl.src.native}/linux/org_lwjgl_LinuxSysImplementation.h" property="lwjgl.native.linux.version">
++ <loadfile srcfile="${lwjgl.src.native}/org_lwjgl_LinuxSysImplementation.h" property="lwjgl.native.linux.version">
+ <filterchain>
+ <tokenfilter>
+ <containsstring contains="#define org_lwjgl_LinuxSysImplementation_JNI_VERSION"/>
+ </tokenfilter>
+ </filterchain>
+ </loadfile>
+- <loadfile srcfile="${lwjgl.src.native}/macosx/org_lwjgl_MacOSXSysImplementation.h" property="lwjgl.native.macosx.version">
++ <loadfile srcfile="${lwjgl.src.native}/org_lwjgl_MacOSXSysImplementation.h" property="lwjgl.native.macosx.version">
+ <filterchain>
+ <tokenfilter>
+ <containsstring contains="#define org_lwjgl_MacOSXSysImplementation_JNI_VERSION"/>
+@@ -464,7 +466,7 @@
+
+ <!-- Compiles the Java source code -->
+ <target name="compile" description="Compiles the java source code" depends="-initialize">
+- <javac debug="yes" destdir="${lwjgl.bin}" source="1.5" target="1.5" classpath="${lwjgl.lib}/jinput.jar:${lwjgl.lib}/AppleJavaExtensions.jar:${lwjgl.lib}/asm-debug-all.jar" taskname="core">
++ <javac debug="yes" destdir="${lwjgl.bin}" source="1.5" target="1.5" classpath="${lwjgl.lib}/jinput.jar:${lwjgl.lib}/AppleJavaExtensions.jar:${lwjgl.lib}/asm-debug-all.jar" taskname="core" nativeHeaderDir="${lwjgl.src.native}">
+ <!--<compilerarg value="-Xlint:unchecked"/>-->
+ <src path="${lwjgl.src}/java/"/>
+ <src path="${lwjgl.src}/generated/"/>
+--- a/src/java/org/lwjgl/LinuxSysImplementation.java
++++ b/src/java/org/lwjgl/LinuxSysImplementation.java
+@@ -43,6 +43,7 @@
+ * $Id$
+ */
+ final class LinuxSysImplementation extends J2SESysImplementation {
++ @java.lang.annotation.Native
+ private static final int JNI_VERSION = 19;
+
+ static {
+--- a/platform_build/linux_ant/build.xml
++++ b/platform_build/linux_ant/build.xml
+@@ -143,6 +143,7 @@
+ <arg value="-I${java.home}/../include/solaris"/>
+ <arg value="-I${native}/common"/>
+ <arg value="-I${native}/common/opengl"/>
++ <arg value="-I${native}"/>
+ <arg value="-I${native}/linux"/>
+ <arg value="-I${native}/linux/opengl"/>
+ <mapper type="glob" from="*.c" to="*.o"/>
+--- a/src/java/org/lwjgl/input/Cursor.java
++++ b/src/java/org/lwjgl/input/Cursor.java
+@@ -51,12 +51,15 @@
+
+ public class Cursor {
+ /** 1 bit transparency for native cursor */
++ @java.lang.annotation.Native
+ public static final int CURSOR_ONE_BIT_TRANSPARENCY = 1;
+
+ /** 8 bit alhpa native cursor */
++ @java.lang.annotation.Native
+ public static final int CURSOR_8_BIT_ALPHA = 2;
+
+ /** animation native cursor */
++ @java.lang.annotation.Native
+ public static final int CURSOR_ANIMATION = 4;
+
+ /** First element to display */
+--- a/src/native/common/org_lwjgl_BufferUtils.c
++++ b/src/native/common/org_lwjgl_BufferUtils.c
+@@ -1,4 +1,3 @@
+-#include "org_lwjgl_BufferUtils.h"
+ #include "common_tools.h"
+
+ JNIEXPORT void JNICALL Java_org_lwjgl_BufferUtils_zeroBuffer0(JNIEnv *env, jclass clazz, jobject buffer, jlong offset, jlong size) {
+--- a/src/native/common/org_lwjgl_opencl_CallbackUtil.c
++++ b/src/native/common/org_lwjgl_opencl_CallbackUtil.c
+@@ -39,7 +39,6 @@
+ #include <jni.h>
+ #include "common_tools.h"
+ #include "extcl.h"
+-#include "org_lwjgl_opencl_CallbackUtil.h"
+
+ static jmethodID contextCallbackJ;
+ static jmethodID memObjectDestructorCallbackJ;
+--- a/src/java/org/lwjgl/MacOSXSysImplementation.java
++++ b/src/java/org/lwjgl/MacOSXSysImplementation.java
+@@ -43,6 +43,7 @@
+ * $Id$
+ */
+ final class MacOSXSysImplementation extends J2SESysImplementation {
++ @java.lang.annotation.Native
+ private static final int JNI_VERSION = 25;
+
+ static {
=====================================
debian/patches/no-asm-support.patch
=====================================
@@ -1,2484 +1,17 @@
-From: Markus Koschany <apo at debian.org>
-Date: Sat, 9 Apr 2016 20:28:48 +0200
-Subject: no asm support
-
-We don't support the optional asm.jar because LWJGL is not compatible with
-libasm-java.
-
+Description: No asm support. We don't support the optional asm.jar because LWJGL is not compatible with libasm-java.
+Author: Markus Koschany <apo at debian.org>
Forwarded: not-needed
----
- .../org/lwjgl/test/mapped/TestMappedObject.java | 87 --
- .../test/opengl/sprites/SpriteShootoutMapped.java | 838 -------------
- .../lwjgl/util/mapped/MappedObjectClassLoader.java | 193 ---
- .../lwjgl/util/mapped/MappedObjectTransformer.java | 1319 --------------------
- 4 files changed, 2437 deletions(-)
- delete mode 100644 src/java/org/lwjgl/test/mapped/TestMappedObject.java
- delete mode 100644 src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutMapped.java
- delete mode 100644 src/java/org/lwjgl/util/mapped/MappedObjectClassLoader.java
- delete mode 100644 src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java
-
-diff --git a/src/java/org/lwjgl/test/mapped/TestMappedObject.java b/src/java/org/lwjgl/test/mapped/TestMappedObject.java
-deleted file mode 100644
-index 0ae560e..0000000
---- a/src/java/org/lwjgl/test/mapped/TestMappedObject.java
-+++ /dev/null
-@@ -1,87 +0,0 @@
--/*
-- * Copyright (c) 2002-2011 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.test.mapped;
--
--import org.lwjgl.util.mapped.MappedObjectClassLoader;
--import org.lwjgl.util.mapped.MappedObjectTransformer;
--
--/** @author Riven */
-- at SuppressWarnings("static-access")
--public class TestMappedObject {
--
-- static {
-- boolean assertsEnabled = false;
-- assert assertsEnabled = true; // Intentional side effect!!!
-- if ( !assertsEnabled )
-- throw new RuntimeException("Asserts must be enabled for this test.");
-- }
--
-- public static void main(String[] args) throws Exception {
-- MappedObjectTransformer.register(MappedFloat.class);
-- MappedObjectTransformer.register(MappedVec2.class);
-- MappedObjectTransformer.register(MappedVec3.class);
-- MappedObjectTransformer.register(MappedSomething.class);
-- MappedObjectTransformer.register(MappedObjectTests3.Xyz.class);
-- MappedObjectTransformer.register(MappedObjectTests4.MappedPointer.class);
-- MappedObjectTransformer.register(MappedObjectTests4.MappedCacheLinePadded.class);
-- MappedObjectTransformer.register(MappedObjectTests4.MappedFieldCacheLinePadded.class);
--
-- if ( MappedObjectClassLoader.fork(TestMappedObject.class, args) ) {
-- return;
-- }
--
-- MappedObjectTests1.testViewField();
--
-- MappedObjectTests2.testFields();
--
-- // MappedObjectBench.benchmarkMapped();
-- // MappedObjectBench.benchmarkInstances();
-- // MappedObjectBench.benchmarkIndirectArray();
-- // MappedObjectBench.benchmarkDirectArray();
-- // MappedObjectBench.benchmarkUnsafe();
--
-- MappedObjectTests3.testMappedBuffer();
-- MappedObjectTests3.testForeach();
-- MappedObjectTests3.testConstructor();
-- MappedObjectTests3.testMappedSet();
--
-- MappedObjectTests4.testLocalView();
-- //MappedObjectTests4.testLWJGL();
-- MappedObjectTests4.testPointer();
-- MappedObjectTests4.testCacheLineAlignment();
-- MappedObjectTests4.testCacheLinePadding();
-- MappedObjectTests4.testCacheLinePaddingPOJO();
--
-- System.out.println("done");
-- }
--
--}
-\ No newline at end of file
-diff --git a/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutMapped.java b/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutMapped.java
-deleted file mode 100644
-index 83805d1..0000000
---- a/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutMapped.java
-+++ /dev/null
-@@ -1,838 +0,0 @@
--/*
-- * Copyright (c) 2002-2011 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.test.opengl.sprites;
--
--import org.lwjgl.BufferUtils;
--import org.lwjgl.LWJGLException;
--import org.lwjgl.Sys;
--import org.lwjgl.input.Keyboard;
--import org.lwjgl.input.Mouse;
--import org.lwjgl.opengl.*;
--import org.lwjgl.util.mapped.MappedObject;
--import org.lwjgl.util.mapped.MappedObjectClassLoader;
--import org.lwjgl.util.mapped.MappedObjectTransformer;
--import org.lwjgl.util.mapped.MappedType;
--
--import java.awt.image.BufferedImage;
--import java.awt.image.Raster;
--import java.io.IOException;
--import java.nio.ByteBuffer;
--import java.util.Random;
--import javax.imageio.ImageIO;
--
--import static org.lwjgl.opengl.EXTTransformFeedback.*;
--import static org.lwjgl.opengl.GL11.*;
--import static org.lwjgl.opengl.GL12.*;
--import static org.lwjgl.opengl.GL15.*;
--import static org.lwjgl.opengl.GL20.*;
--import static org.lwjgl.opengl.GL30.*;
--
--/**
-- * Sprite rendering demo. Three implementations are supported:
-- * a) CPU animation + BufferData VBO update.
-- * b) CPU animation + MapBufferRange VBO update.
-- * c) GPU animation using transform feedback with a vertex shader.
-- *
-- * @author Spasi
-- * @since 18/3/2011
-- */
--public final class SpriteShootoutMapped {
--
-- static final int SCREEN_WIDTH = 800;
-- static final int SCREEN_HEIGHT = 600;
--
-- private static final int ANIMATION_TICKS = 60;
--
-- private boolean run = true;
-- private boolean render = true;
-- private boolean colorMask = true;
-- private boolean animate = true;
-- private boolean smooth;
-- private boolean vsync;
--
-- int ballSize = 42;
-- int ballCount = 100 * 1000;
--
-- private SpriteRenderer renderer;
--
-- // OpenGL stuff
-- private int texID;
-- private int texBigID;
-- private int texSmallID;
--
-- long animateTime;
--
-- private SpriteShootoutMapped() {
-- }
--
-- public static void main(String[] args) {
-- MappedObjectTransformer.register(Pixel4b.class);
-- MappedObjectTransformer.register(Pixel3b.class);
-- MappedObjectTransformer.register(Sprite.class);
-- MappedObjectTransformer.register(SpriteRender.class);
--
-- if ( MappedObjectClassLoader.fork(SpriteShootoutMapped.class, args) )
-- return;
--
-- try {
-- new SpriteShootoutMapped().start();
-- } catch (LWJGLException e) {
-- e.printStackTrace();
-- }
-- }
--
-- private void start() throws LWJGLException {
-- try {
-- initGL();
--
-- final ContextCapabilities caps = GLContext.getCapabilities();
-- if ( !true && (caps.OpenGL30 || caps.GL_EXT_transform_feedback) )
-- renderer = new SpriteRendererTF();
-- else if ( true && caps.GL_ARB_map_buffer_range )
-- renderer = new SpriteRendererMapped();
-- else
-- renderer = new SpriteRendererPlain();
--
-- updateBalls(ballCount);
-- run();
-- } catch (Throwable t) {
-- t.printStackTrace();
-- } finally {
-- destroy();
-- }
-- }
--
-- private void initGL() throws LWJGLException {
-- Display.setLocation((Display.getDisplayMode().getWidth() - SCREEN_WIDTH) / 2,
-- (Display.getDisplayMode().getHeight() - SCREEN_HEIGHT) / 2);
-- Display.setDisplayMode(new DisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT));
-- Display.setTitle("Sprite Shootout");
-- Display.create();
-- //Display.create(new PixelFormat(), new ContextAttribs(4, 1).withProfileCompatibility(true).withDebug(true));
-- //AMDDebugOutput.glDebugMessageCallbackAMD(new AMDDebugOutputCallback());
--
-- if ( !GLContext.getCapabilities().OpenGL20 )
-- throw new RuntimeException("OpenGL 2.0 is required for this demo.");
--
-- // Setup viewport
--
-- glMatrixMode(GL_PROJECTION);
-- glLoadIdentity();
-- glOrtho(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT, -1.0, 1.0);
--
-- glMatrixMode(GL_MODELVIEW);
-- glLoadIdentity();
-- glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
--
-- glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
--
-- // Create textures
--
-- try {
-- texSmallID = createTexture("res/ball_sm.png");
-- texBigID = createTexture("res/ball.png");
-- } catch (IOException e) {
-- e.printStackTrace();
-- System.exit(-1);
-- }
-- texID = texBigID;
--
-- // Setup rendering state
--
-- glEnable(GL_BLEND);
-- glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
--
-- glEnable(GL_ALPHA_TEST);
-- glAlphaFunc(GL_GREATER, 0.0f);
--
-- glColorMask(colorMask, colorMask, colorMask, false);
-- glDepthMask(false);
-- glDisable(GL_DEPTH_TEST);
--
-- // Setup geometry
--
-- glEnableClientState(GL_VERTEX_ARRAY);
--
-- Util.checkGLError();
-- }
--
-- private static int createTexture(final String path) throws IOException {
-- final BufferedImage img = ImageIO.read(SpriteShootoutMapped.class.getClassLoader().getResource(path));
--
-- final int w = img.getWidth();
-- final int h = img.getHeight();
--
-- final ByteBuffer buffer = readImage(img);
--
-- final int texID = glGenTextures();
--
-- glBindTexture(GL_TEXTURE_2D, texID);
-- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
--
-- return texID;
-- }
--
-- public static class Pixel4b extends MappedObject {
--
-- public byte r, g, b, a;
--
-- }
--
-- @MappedType(align = 3)
-- public static class Pixel3b extends MappedObject {
--
-- public byte r, g, b;
--
-- }
--
-- private static ByteBuffer readImage(final BufferedImage img) throws IOException {
-- final Raster raster = img.getRaster();
--
-- final int bands = raster.getNumBands();
--
-- final int w = img.getWidth();
-- final int h = img.getHeight();
--
-- final int count = w * h;
--
-- final byte[] pixels = new byte[count * bands];
-- raster.getDataElements(0, 0, w, h, pixels);
--
-- if ( bands == 4 ) {
-- Pixel4b p = Pixel4b.malloc(count);
--
-- int b = 0;
-- for ( int i = 0; i < count; i++, b += 4 ) {
-- // Pre-multiply alpha
-- final float a = unpackUByte01(pixels[b + 3]);
--
-- p.view = i;
-- p.r = packUByte01(unpackUByte01(pixels[b + 2]) * a);
-- p.g = packUByte01(unpackUByte01(pixels[b + 1]) * a);
-- p.b = packUByte01(unpackUByte01(pixels[b + 0]) * a);
-- p.a = pixels[b + 3];
-- }
--
-- return p.backingByteBuffer();
-- } else if ( bands == 3 ) {
-- Pixel3b p = Pixel3b.malloc(count);
--
-- int b = 0;
-- for ( int i = 0; i < count; i++, b += 3 ) {
-- p.view = i;
-- p.r = pixels[b + 2];
-- p.g = pixels[b + 1];
-- p.b = pixels[b + 0];
-- }
--
-- return p.backingByteBuffer();
-- } else {
-- ByteBuffer p = BufferUtils.createByteBuffer(count * bands);
-- p.put(pixels, 0, p.capacity());
-- p.flip();
-- return p;
-- }
--
-- }
--
-- private static float unpackUByte01(final byte x) {
-- return (x & 0xFF) / 255.0f;
-- }
--
-- private static byte packUByte01(final float x) {
-- return (byte)(x * 255.0f);
-- }
--
-- private void updateBalls(final int count) {
-- System.out.println("NUMBER OF BALLS: " + count);
-- renderer.updateBalls(ballCount);
-- }
--
-- private void run() {
-- long startTime = System.currentTimeMillis() + 5000;
-- long fps = 0;
--
-- long time = Sys.getTime();
-- final int ticksPerUpdate = (int)(Sys.getTimerResolution() / ANIMATION_TICKS);
--
-- renderer.render(false, true, 0);
--
-- while ( run ) {
-- Display.processMessages();
-- handleInput();
--
-- glClear(GL_COLOR_BUFFER_BIT);
--
-- final long currTime = Sys.getTime();
-- final int delta = (int)(currTime - time);
-- if ( smooth || delta >= ticksPerUpdate ) {
-- renderer.render(render, animate, delta);
-- time = currTime;
-- } else
-- renderer.render(render, false, 0);
--
-- Display.update(false);
-- //Display.sync(60);
--
-- if ( startTime > System.currentTimeMillis() ) {
-- fps++;
-- } else {
-- long timeUsed = 5000 + (startTime - System.currentTimeMillis());
-- startTime = System.currentTimeMillis() + 5000;
-- System.out.println("FPS: " + (Math.round(fps / (timeUsed / 1000.0) * 10) / 10.0) + ", Balls: " + ballCount);
-- System.out.println("Animation: " + animateTime / fps);
-- animateTime = 0;
-- fps = 0;
-- }
-- }
-- }
--
-- private void handleInput() {
-- if ( Display.isCloseRequested() )
-- run = false;
--
-- while ( Keyboard.next() ) {
-- if ( Keyboard.getEventKeyState() )
-- continue;
--
-- switch ( Keyboard.getEventKey() ) {
-- case Keyboard.KEY_1:
-- case Keyboard.KEY_2:
-- case Keyboard.KEY_3:
-- case Keyboard.KEY_4:
-- case Keyboard.KEY_5:
-- case Keyboard.KEY_6:
-- case Keyboard.KEY_7:
-- case Keyboard.KEY_8:
-- case Keyboard.KEY_9:
-- case Keyboard.KEY_0:
-- ballCount = 1 << (Keyboard.getEventKey() - Keyboard.KEY_1);
-- updateBalls(ballCount);
-- break;
-- case Keyboard.KEY_ADD:
-- case Keyboard.KEY_SUBTRACT:
-- int mult;
-- if ( Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) )
-- mult = 1000;
-- else if ( Keyboard.isKeyDown(Keyboard.KEY_LMENU) || Keyboard.isKeyDown(Keyboard.KEY_RMENU) )
-- mult = 100;
-- else if ( Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) )
-- mult = 10;
-- else
-- mult = 1;
-- if ( Keyboard.getEventKey() == Keyboard.KEY_SUBTRACT )
-- mult = -mult;
-- ballCount += mult * 100;
-- if ( ballCount <= 0 )
-- ballCount = 1;
-- updateBalls(ballCount);
-- break;
-- case Keyboard.KEY_ESCAPE:
-- run = false;
-- break;
-- case Keyboard.KEY_A:
-- animate = !animate;
-- System.out.println("Animation is now " + (animate ? "on" : "off") + ".");
-- break;
-- case Keyboard.KEY_C:
-- colorMask = !colorMask;
-- glColorMask(colorMask, colorMask, colorMask, false);
-- System.out.println("Color mask is now " + (colorMask ? "on" : "off") + ".");
-- // Disable alpha test when color mask is off, else we get no benefit.
-- if ( colorMask ) {
-- glEnable(GL_BLEND);
-- glEnable(GL_ALPHA_TEST);
-- } else {
-- glDisable(GL_BLEND);
-- glDisable(GL_ALPHA_TEST);
-- }
-- break;
-- case Keyboard.KEY_R:
-- render = !render;
-- System.out.println("Rendering is now " + (render ? "on" : "off") + ".");
-- break;
-- case Keyboard.KEY_S:
-- smooth = !smooth;
-- System.out.println("Smooth animation is now " + (smooth ? "on" : "off") + ".");
-- break;
-- case Keyboard.KEY_T:
-- if ( texID == texBigID ) {
-- texID = texSmallID;
-- ballSize = 16;
-- } else {
-- texID = texBigID;
-- ballSize = 42;
-- }
-- renderer.updateBallSize();
-- glBindTexture(GL_TEXTURE_2D, texID);
-- System.out.println("Now using the " + (texID == texBigID ? "big" : "small") + " texture.");
-- break;
-- case Keyboard.KEY_V:
-- vsync = !vsync;
-- Display.setVSyncEnabled(vsync);
-- System.out.println("VSYNC is now " + (vsync ? "enabled" : "disabled") + ".");
-- break;
-- }
-- }
--
-- while ( Mouse.next() ) ;
-- }
--
-- private void destroy() {
-- Display.destroy();
-- }
--
-- public static class Sprite extends MappedObject {
--
-- public float dx, x;
-- public float dy, y;
--
-- }
--
-- public static class SpriteRender extends MappedObject {
--
-- public float x, y;
--
-- }
--
-- private abstract class SpriteRenderer {
--
-- protected Sprite sprites;
--
-- protected int spriteCount;
--
-- protected int vshID;
-- protected int progID;
--
-- protected void createProgram() {
-- final int fshID = glCreateShader(GL_FRAGMENT_SHADER);
-- glShaderSource(fshID, "uniform sampler2D COLOR_MAP;\n" +
-- "void main(void) {\n" +
-- " gl_FragColor = texture2D(COLOR_MAP, gl_PointCoord);\n" +
-- "}");
-- glCompileShader(fshID);
-- if ( glGetShaderi(fshID, GL_COMPILE_STATUS) == GL_FALSE ) {
-- System.out.println(glGetShaderInfoLog(fshID, glGetShaderi(fshID, GL_INFO_LOG_LENGTH)));
-- throw new RuntimeException("Failed to compile fragment shader.");
-- }
--
-- progID = glCreateProgram();
-- glAttachShader(progID, vshID);
-- glAttachShader(progID, fshID);
-- glLinkProgram(progID);
-- if ( glGetProgrami(progID, GL_LINK_STATUS) == GL_FALSE ) {
-- System.out.println(glGetProgramInfoLog(progID, glGetProgrami(progID, GL_INFO_LOG_LENGTH)));
-- throw new RuntimeException("Failed to link shader program.");
-- }
--
-- glUseProgram(progID);
-- glUniform1i(glGetUniformLocation(progID, "COLOR_MAP"), 0);
--
-- updateBallSize();
--
-- glEnableClientState(GL_VERTEX_ARRAY);
-- }
--
-- public void updateBallSize() {
-- glPointSize(ballSize);
-- }
--
-- public abstract void updateBalls(int count);
--
-- protected abstract void render(boolean render, boolean animate, int delta);
--
-- }
--
-- private abstract class SpriteRendererBatched extends SpriteRenderer {
--
-- protected static final int BALLS_PER_BATCH = 10 * 1000;
--
-- SpriteRendererBatched() {
-- vshID = glCreateShader(GL_VERTEX_SHADER);
-- glShaderSource(vshID, "void main(void) {\n" +
-- " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" +
-- "}");
-- glCompileShader(vshID);
-- if ( glGetShaderi(vshID, GL_COMPILE_STATUS) == GL_FALSE ) {
-- System.out.println(glGetShaderInfoLog(vshID, glGetShaderi(vshID, GL_INFO_LOG_LENGTH)));
-- throw new RuntimeException("Failed to compile vertex shader.");
-- }
--
-- createProgram();
-- }
--
-- public void updateBalls(final int count) {
-- final Random random = new Random();
--
-- final Sprite newSprites = Sprite.malloc(count);
-- if ( sprites != null ) {
-- sprites.view = 0;
-- sprites.copyRange(newSprites, Math.min(count, spriteCount));
-- }
--
-- if ( count > spriteCount ) {
-- for ( int i = spriteCount; i < count; i++ ) {
-- newSprites.view = i;
--
-- newSprites.x = (int)(random.nextFloat() * (SCREEN_WIDTH - ballSize) + ballSize * 0.5f);
-- newSprites.y = (int)(random.nextFloat() * (SCREEN_HEIGHT - ballSize) + ballSize * 0.5f);
-- newSprites.dx = random.nextFloat() * 0.4f - 0.2f;
-- newSprites.dy = random.nextFloat() * 0.4f - 0.2f;
-- }
-- }
--
-- sprites = newSprites;
-- spriteCount = count;
-- }
--
-- protected void animate(
-- final Sprite sprite,
-- final SpriteRender spriteRender,
-- final int ballSize, final int ballIndex, final int batchSize, final int delta
-- ) {
-- final float ballRadius = ballSize * 0.5f;
-- final float boundW = SCREEN_WIDTH - ballRadius;
-- final float boundH = SCREEN_HEIGHT - ballRadius;
--
-- final Sprite[] sprites = sprite.asArray();
-- final SpriteRender[] spritesRender = spriteRender.asArray();
-- for ( int b = ballIndex, r = 0, len = (ballIndex + batchSize); b < len; b++, r++ ) {
-- float dx = sprites[b].dx;
-- float x = sprites[b].x;
--
-- x += dx * delta;
-- if ( x < ballRadius ) {
-- x = ballRadius;
-- dx = -dx;
-- } else if ( x > boundW ) {
-- x = boundW;
-- dx = -dx;
-- }
--
-- sprites[b].dx = dx;
-- sprites[b].x = x;
-- spritesRender[r].x = x;
--
-- float dy = sprites[b].dy;
-- float y = sprites[b].y;
--
-- y += dy * delta;
-- if ( y < ballRadius ) {
-- y = ballRadius;
-- dy = -dy;
-- } else if ( y > boundH ) {
-- y = boundH;
-- dy = -dy;
-- }
--
-- sprites[b].dy = dy;
-- sprites[b].y = y;
-- spritesRender[r].y = y;
-- }
-- }
--
-- }
--
-- private class SpriteRendererPlain extends SpriteRendererBatched {
--
-- private final int DATA_PER_BATCH = BALLS_PER_BATCH * 2 * 4; // balls * 2 floats * 4 bytes
--
-- protected int[] animVBO;
--
-- private SpriteRender spritesRender;
--
-- SpriteRendererPlain() {
-- System.out.println("Shootout Implementation: CPU animation & BufferData");
-- spritesRender = SpriteRender.malloc(BALLS_PER_BATCH);
-- }
--
-- public void updateBalls(final int count) {
-- super.updateBalls(count);
--
-- final int batchCount = count / BALLS_PER_BATCH + (count % BALLS_PER_BATCH == 0 ? 0 : 1);
-- if ( animVBO != null && batchCount == animVBO.length )
-- return;
--
-- final int[] newAnimVBO = new int[batchCount];
-- if ( animVBO != null ) {
-- System.arraycopy(animVBO, 0, newAnimVBO, 0, Math.min(animVBO.length, newAnimVBO.length));
-- for ( int i = newAnimVBO.length; i < animVBO.length; i++ )
-- glDeleteBuffers(animVBO[i]);
-- }
-- for ( int i = animVBO == null ? 0 : animVBO.length; i < newAnimVBO.length; i++ ) {
-- newAnimVBO[i] = glGenBuffers();
-- glBindBuffer(GL_ARRAY_BUFFER, newAnimVBO[i]);
-- }
--
-- animVBO = newAnimVBO;
-- }
--
-- public void render(final boolean render, final boolean animate, final int delta) {
-- int batchSize = Math.min(ballCount, BALLS_PER_BATCH);
-- int ballIndex = 0;
-- int batchIndex = 0;
-- while ( ballIndex < ballCount ) {
-- glBindBuffer(GL_ARRAY_BUFFER, animVBO[batchIndex]);
--
-- if ( animate )
-- animate(ballIndex, batchSize, delta);
--
-- if ( render ) {
-- glVertexPointer(2, GL_FLOAT, 0, 0);
-- glDrawArrays(GL_POINTS, 0, batchSize);
-- }
--
-- ballIndex += batchSize;
-- batchSize = Math.min(ballCount - ballIndex, BALLS_PER_BATCH);
-- batchIndex++;
-- }
-- }
--
-- private void animate(final int ballIndex, final int batchSize, final int delta) {
-- animate(
-- sprites, spritesRender,
-- ballSize, ballIndex, batchSize, delta
-- );
--
-- glBufferData(GL_ARRAY_BUFFER, DATA_PER_BATCH, GL_STREAM_DRAW);
-- glBufferSubData(GL_ARRAY_BUFFER, 0, spritesRender.backingByteBuffer());
-- }
--
-- }
--
-- private class SpriteRendererMapped extends SpriteRendererBatched {
--
-- private StreamVBO animVBO;
--
-- SpriteRendererMapped() {
-- System.out.println("Shootout Implementation: CPU animation & MapBufferRange");
-- }
--
-- public void updateBalls(final int count) {
-- super.updateBalls(count);
--
-- if ( animVBO != null )
-- animVBO.destroy();
--
-- animVBO = new StreamVBO(GL_ARRAY_BUFFER, ballCount * (2 * 4));
-- }
--
-- public void render(final boolean render, final boolean animate, final int delta) {
-- int batchSize = Math.min(ballCount, BALLS_PER_BATCH);
-- int ballIndex = 0;
-- while ( ballIndex < ballCount ) {
-- if ( animate ) {
-- final ByteBuffer buffer = animVBO.map(batchSize * (2 * 4));
--
-- long t0 = System.nanoTime();
-- animate(sprites, SpriteRender.<SpriteRender>map(buffer), ballSize, ballIndex, batchSize, delta);
-- long t1 = System.nanoTime();
--
-- animateTime += t1 - t0;
--
-- animVBO.unmap();
-- }
--
-- if ( render ) {
-- glVertexPointer(2, GL_FLOAT, 0, ballIndex * (2 * 4));
-- glDrawArrays(GL_POINTS, 0, batchSize);
-- }
--
-- ballIndex += batchSize;
-- batchSize = Math.min(ballCount - ballIndex, BALLS_PER_BATCH);
-- }
-- }
--
-- }
--
-- private class SpriteRendererTF extends SpriteRenderer {
--
-- private int progIDTF;
-- private int ballSizeLoc;
-- private int deltaLoc;
--
-- private int[] tfVBO = new int[2];
-- private int currVBO;
--
-- SpriteRendererTF() {
-- System.out.println("Shootout Implementation: TF GPU animation");
--
-- // Transform-feedback program
--
-- final int vshID = glCreateShader(GL_VERTEX_SHADER);
-- glShaderSource(vshID, "#version 130\n" +
-- "const float WIDTH = " + SCREEN_WIDTH + ";\n" +
-- "const float HEIGHT = " + SCREEN_HEIGHT + ";\n" +
-- "uniform float ballSize;\n" + // ballSize / 2
-- "uniform float delta;\n" +
-- "void main(void) {\n" +
-- " vec4 anim = gl_Vertex;\n" +
-- " anim.xy = anim.xy + anim.zw * delta;\n" +
-- " vec2 animC = clamp(anim.xy, vec2(ballSize), vec2(WIDTH - ballSize, HEIGHT - ballSize));\n" +
-- " if ( anim.x != animC.x ) anim.z = -anim.z;\n" +
-- " if ( anim.y != animC.y ) anim.w = -anim.w;\n" +
-- " gl_Position = vec4(animC, anim.zw);\n" +
-- "}");
-- glCompileShader(vshID);
-- if ( glGetShaderi(vshID, GL_COMPILE_STATUS) == GL_FALSE ) {
-- System.out.println(glGetShaderInfoLog(vshID, glGetShaderi(vshID, GL_INFO_LOG_LENGTH)));
-- throw new RuntimeException("Failed to compile vertex shader.");
-- }
--
-- progIDTF = glCreateProgram();
-- glAttachShader(progIDTF, vshID);
-- glTransformFeedbackVaryings(progIDTF, new CharSequence[] { "gl_Position" }, GL_SEPARATE_ATTRIBS);
-- glLinkProgram(progIDTF);
-- if ( glGetProgrami(progIDTF, GL_LINK_STATUS) == GL_FALSE ) {
-- System.out.println(glGetProgramInfoLog(progIDTF, glGetProgrami(progIDTF, GL_INFO_LOG_LENGTH)));
-- throw new RuntimeException("Failed to link shader program.");
-- }
--
-- glUseProgram(progIDTF);
--
-- ballSizeLoc = glGetUniformLocation(progIDTF, "ballSize");
-- deltaLoc = glGetUniformLocation(progIDTF, "delta");
--
-- glUniform1f(ballSizeLoc, ballSize * 0.5f);
--
-- // -----------------
--
-- this.vshID = glCreateShader(GL_VERTEX_SHADER);
-- glShaderSource(this.vshID, "void main(void) {\n" +
-- " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" +
-- "}");
-- glCompileShader(this.vshID);
-- if ( glGetShaderi(this.vshID, GL_COMPILE_STATUS) == GL_FALSE ) {
-- System.out.println(glGetShaderInfoLog(this.vshID, glGetShaderi(this.vshID, GL_INFO_LOG_LENGTH)));
-- throw new RuntimeException("Failed to compile vertex shader.");
-- }
--
-- createProgram();
-- }
--
-- public void updateBallSize() {
-- glUseProgram(progIDTF);
-- glUniform1f(ballSizeLoc, ballSize * 0.5f);
--
-- glUseProgram(progID);
-- super.updateBallSize();
-- }
--
-- private void doUpdateBalls(final int count) {
-- final Random random = new Random();
--
-- final Sprite newSprites = Sprite.malloc(count);
-- if ( sprites != null ) {
-- sprites.view = 0;
-- sprites.copyRange(newSprites, Math.min(count, spriteCount));
-- }
--
-- if ( count > spriteCount ) {
-- for ( int i = spriteCount; i < count; i++ ) {
-- newSprites.view = i;
--
-- newSprites.x = (int)(random.nextFloat() * (SCREEN_WIDTH - ballSize) + ballSize * 0.5f);
-- newSprites.y = (int)(random.nextFloat() * (SCREEN_HEIGHT - ballSize) + ballSize * 0.5f);
-- newSprites.dx = random.nextFloat() * 0.4f - 0.2f;
-- newSprites.dy = random.nextFloat() * 0.4f - 0.2f;
-- }
-- }
--
-- sprites = newSprites;
-- spriteCount = count;
-- }
--
-- public void updateBalls(final int count) {
-- if ( tfVBO[0] != 0 ) {
-- // Fetch current animation state
-- glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sprites.backingByteBuffer());
-- }
--
-- doUpdateBalls(count);
--
-- if ( tfVBO[0] != 0 ) {
-- for ( int i = 0; i < tfVBO.length; i++ )
-- glDeleteBuffers(tfVBO[i]);
-- }
--
-- for ( int i = 0; i < tfVBO.length; i++ ) {
-- tfVBO[i] = glGenBuffers();
-- glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, tfVBO[i]);
-- glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sprites.backingByteBuffer(), GL_STATIC_DRAW);
-- }
--
-- glBindBuffer(GL_ARRAY_BUFFER, tfVBO[0]);
-- glVertexPointer(2, GL_FLOAT, (4 * 4), 0);
-- }
--
-- public void render(final boolean render, final boolean animate, final int delta) {
-- if ( animate ) {
-- glUseProgram(progIDTF);
-- glUniform1f(deltaLoc, delta);
--
-- final int vbo = currVBO;
-- currVBO = 1 - currVBO;
--
-- glBindBuffer(GL_ARRAY_BUFFER, tfVBO[vbo]);
-- glVertexPointer(4, GL_FLOAT, 0, 0);
--
-- glEnable(GL_RASTERIZER_DISCARD);
-- if ( GLContext.getCapabilities().OpenGL30 ) {
-- glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfVBO[1 - vbo]);
--
-- glBeginTransformFeedback(GL_POINTS);
-- glDrawArrays(GL_POINTS, 0, ballCount);
-- glEndTransformFeedback();
-- } else {
-- glBindBufferBaseEXT(GL_TRANSFORM_FEEDBACK_BUFFER_EXT, 0, tfVBO[1 - vbo]);
--
-- glBeginTransformFeedbackEXT(GL_POINTS);
-- glDrawArrays(GL_POINTS, 0, ballCount);
-- glEndTransformFeedbackEXT();
-- }
-- glDisable(GL_RASTERIZER_DISCARD);
--
-- glUseProgram(progID);
-- glVertexPointer(2, GL_FLOAT, (4 * 4), 0);
-- }
--
-- if ( render )
-- glDrawArrays(GL_POINTS, 0, ballCount);
-- }
--
-- }
--
--}
-\ No newline at end of file
-diff --git a/src/java/org/lwjgl/util/mapped/MappedObjectClassLoader.java b/src/java/org/lwjgl/util/mapped/MappedObjectClassLoader.java
-deleted file mode 100644
-index 463823f..0000000
---- a/src/java/org/lwjgl/util/mapped/MappedObjectClassLoader.java
-+++ /dev/null
-@@ -1,193 +0,0 @@
--/*
-- * Copyright (c) 2002-2011 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.util.mapped;
--
--import org.lwjgl.LWJGLUtil;
--
--import java.io.IOException;
--import java.io.InputStream;
--import java.lang.reflect.InvocationTargetException;
--import java.lang.reflect.Method;
--import java.net.URLClassLoader;
--
--/**
-- * This classloader is responsible for applying the bytecode transformation to mapped objects.
-- * The transformation can either be applied using a Java agent, or with the convenient {@link #fork} method.
-- *
-- * @author Riven
-- */
--public class MappedObjectClassLoader extends URLClassLoader {
--
-- static final String MAPPEDOBJECT_PACKAGE_PREFIX = MappedObjectClassLoader.class.getPackage().getName() + ".";
--
-- static boolean FORKED;
--
-- /**
-- * Forks the specified class containing a main method, passing the specified arguments. See
-- * {@link org.lwjgl.test.mapped.TestMappedObject} for example usage.
-- *
-- * @param mainClass the class containing the main method
-- * @param args the arguments to pass
-- *
-- * @return true if the fork was successful.
-- */
-- public static boolean fork(Class<?> mainClass, String[] args) {
-- if ( FORKED ) {
-- return false;
-- }
--
-- FORKED = true;
--
-- try {
-- MappedObjectClassLoader loader = new MappedObjectClassLoader(mainClass);
-- loader.loadMappedObject();
--
-- Class<?> replacedMainClass = loader.loadClass(mainClass.getName());
-- Method mainMethod = replacedMainClass.getMethod("main", String[].class);
-- mainMethod.invoke(null, new Object[] { args });
-- } catch (InvocationTargetException exc) {
-- Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), exc.getCause());
-- } catch (Throwable cause) {
-- throw new Error("failed to fork", cause);
-- }
--
-- return true;
-- }
--
-- private MappedObjectClassLoader(Class<?> mainClass) {
-- super(((URLClassLoader)mainClass.getClassLoader()).getURLs());
-- }
--
-- protected synchronized Class<?> loadMappedObject() throws ClassNotFoundException {
-- final String name = MappedObject.class.getName();
-- String className = name.replace('.', '/');
--
-- byte[] bytecode = readStream(this.getResourceAsStream(className.concat(".class")));
--
-- long t0 = System.nanoTime();
-- bytecode = MappedObjectTransformer.transformMappedObject(bytecode);
-- long t1 = System.nanoTime();
-- total_time_transforming += (t1 - t0);
--
-- if ( MappedObjectTransformer.PRINT_ACTIVITY )
-- printActivity(className, t0, t1);
--
-- Class<?> clazz = super.defineClass(name, bytecode, 0, bytecode.length);
-- resolveClass(clazz);
-- return clazz;
-- }
--
-- private static long total_time_transforming;
--
-- @Override
-- protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
-- if ( name.startsWith("java.")
-- || name.startsWith("javax.")
-- || name.startsWith("sun.")
-- || name.startsWith("sunw.")
-- || name.startsWith("org.objectweb.asm.")
-- )
-- return super.loadClass(name, resolve);
--
-- final String className = name.replace('.', '/');
-- final boolean inThisPackage = name.startsWith(MAPPEDOBJECT_PACKAGE_PREFIX);
--
-- if ( inThisPackage && (
-- name.equals(MappedObjectClassLoader.class.getName())
-- || name.equals((MappedObjectTransformer.class.getName()))
-- || name.equals((CacheUtil.class.getName()))
-- ) )
-- return super.loadClass(name, resolve);
--
-- byte[] bytecode = readStream(this.getResourceAsStream(className.concat(".class")));
--
-- // Classes in this package do not get transformed, but need to go through here because we have transformed MappedObject.
-- if ( !(inThisPackage && name.substring(MAPPEDOBJECT_PACKAGE_PREFIX.length()).indexOf('.') == -1) ) {
-- long t0 = System.nanoTime();
-- final byte[] newBytecode = MappedObjectTransformer.transformMappedAPI(className, bytecode);
-- long t1 = System.nanoTime();
--
-- total_time_transforming += (t1 - t0);
--
-- if ( bytecode != newBytecode ) {
-- bytecode = newBytecode;
-- if ( MappedObjectTransformer.PRINT_ACTIVITY )
-- printActivity(className, t0, t1);
-- }
-- }
--
-- Class<?> clazz = super.defineClass(name, bytecode, 0, bytecode.length);
-- if ( resolve )
-- resolveClass(clazz);
-- return clazz;
-- }
--
-- private static void printActivity(final String className, final long t0, final long t1) {
-- final StringBuilder msg = new StringBuilder(MappedObjectClassLoader.class.getSimpleName() + ": " + className);
--
-- if ( MappedObjectTransformer.PRINT_TIMING )
-- msg.append("\n\ttransforming took " + (t1 - t0) / 1000 + " micros (total: " + (total_time_transforming / 1000 / 1000) + "ms)");
--
-- LWJGLUtil.log(msg);
-- }
--
-- private static byte[] readStream(InputStream in) {
-- byte[] bytecode = new byte[256];
-- int len = 0;
-- try {
-- while ( true ) {
-- if ( bytecode.length == len )
-- bytecode = copyOf(bytecode, len * 2);
-- int got = in.read(bytecode, len, bytecode.length - len);
-- if ( got == -1 )
-- break;
-- len += got;
-- }
-- } catch (IOException exc) {
-- // stop!
-- } finally {
-- try {
-- in.close();
-- } catch (IOException exc) {
-- // ignore...
-- }
-- }
-- return copyOf(bytecode, len);
-- }
--
-- private static byte[] copyOf(byte[] original, int newLength) {
-- byte[] copy = new byte[newLength];
-- System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
-- return copy;
-- }
--
--}
-\ No newline at end of file
-diff --git a/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java b/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java
-deleted file mode 100644
-index c34c14e..0000000
---- a/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java
-+++ /dev/null
-@@ -1,1319 +0,0 @@
--/*
-- * Copyright (c) 2002-2011 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.util.mapped;
--
--import org.lwjgl.BufferUtils;
--import org.lwjgl.LWJGLUtil;
--import org.lwjgl.MemoryUtil;
--import org.objectweb.asm.*;
--import org.objectweb.asm.tree.*;
--import org.objectweb.asm.tree.analysis.*;
--import org.objectweb.asm.tree.analysis.Frame;
--import org.objectweb.asm.util.TraceClassVisitor;
--
--import java.io.PrintWriter;
--import java.io.StringWriter;
--import java.lang.reflect.Field;
--import java.lang.reflect.Modifier;
--import java.nio.Buffer;
--import java.nio.ByteBuffer;
--import java.util.HashMap;
--import java.util.Map;
--
--import static org.objectweb.asm.ClassWriter.*;
--import static org.objectweb.asm.Opcodes.*;
--
--/**
-- * This class implements the bytecode transformation that mapped object go through.
-- * Mapped object classes need to first be registered with the transformer, see {@link #register(Class)}.
-- * <p/>
-- * The transformer supports some debugging tools, enabled through JVM system properties:<br/>
-- * org.lwjgl.util.mapped.PrintTiming=true, prints timing information for the transformation step.<br/>
-- * org.lwjgl.util.mapped.PrintActivity=true, prints activity information.<br/>
-- * org.lwjgl.util.mapped.PrintBytecode=true, prints the transformed bytecode.<br/>
-- * org.lwjgl.util.Debug must also be set to true for the above to work.
-- *
-- * @author Riven
-- */
--public class MappedObjectTransformer {
--
-- static final boolean PRINT_ACTIVITY = LWJGLUtil.DEBUG && LWJGLUtil.getPrivilegedBoolean("org.lwjgl.util.mapped.PrintActivity");
-- static final boolean PRINT_TIMING = PRINT_ACTIVITY && LWJGLUtil.getPrivilegedBoolean("org.lwjgl.util.mapped.PrintTiming");
-- static final boolean PRINT_BYTECODE = LWJGLUtil.DEBUG && LWJGLUtil.getPrivilegedBoolean("org.lwjgl.util.mapped.PrintBytecode");
--
-- static final Map<String, MappedSubtypeInfo> className_to_subtype;
--
-- static final String MAPPED_OBJECT_JVM = jvmClassName(MappedObject.class);
-- static final String MAPPED_HELPER_JVM = jvmClassName(MappedHelper.class);
--
-- static final String MAPPEDSET_PREFIX = jvmClassName(MappedSet.class);
-- static final String MAPPED_SET2_JVM = jvmClassName(MappedSet2.class);
-- static final String MAPPED_SET3_JVM = jvmClassName(MappedSet3.class);
-- static final String MAPPED_SET4_JVM = jvmClassName(MappedSet4.class);
--
-- static final String CACHE_LINE_PAD_JVM = "L" + jvmClassName(CacheLinePad.class) + ";";
--
-- // Public methods
-- static final String VIEWADDRESS_METHOD_NAME = "getViewAddress";
-- static final String NEXT_METHOD_NAME = "next";
-- static final String ALIGN_METHOD_NAME = "getAlign";
-- static final String SIZEOF_METHOD_NAME = "getSizeof";
-- static final String CAPACITY_METHOD_NAME = "capacity"; // Used for .asArray().length
--
-- // Internal methods
-- static final String VIEW_CONSTRUCTOR_NAME = "constructView$LWJGL"; // Used by runViewConstructor
--
-- static final Map<Integer, String> OPCODE_TO_NAME = new HashMap<Integer, String>();
-- static final Map<Integer, String> INSNTYPE_TO_NAME = new HashMap<Integer, String>();
--
-- static boolean is_currently_computing_frames;
--
-- static {
-- getClassEnums(Opcodes.class, OPCODE_TO_NAME, "V1_", "ACC_", "T_", "F_", "MH_");
-- getClassEnums(AbstractInsnNode.class, INSNTYPE_TO_NAME);
--
-- className_to_subtype = new HashMap<String, MappedSubtypeInfo>();
--
-- {
-- // HACK: required for mapped.view++
-- //
-- // because the compiler generates:
-- // => GETFIELD MappedObject.view
-- // => ICONST_1
-- // => IADD
-- // => PUTFIELD MyMappedType.view
-- //
-- // instead of:
-- // => GETFIELD MyMappedType.view
-- // => ICONST_1
-- // => IADD
-- // => PUTFIELD MyMappedType.view
-- //
-- className_to_subtype.put(MAPPED_OBJECT_JVM, new MappedSubtypeInfo(MAPPED_OBJECT_JVM, null, -1, -1, -1, false));
-- }
--
-- final String vmName = System.getProperty("java.vm.name");
-- if ( vmName != null && !vmName.contains("Server") ) {
-- System.err.println("Warning: " + MappedObject.class.getSimpleName() + "s have inferiour performance on Client VMs, please consider switching to a Server VM.");
-- }
-- }
--
-- /**
-- * Registers a class as a mapped object.
-- * The class must extend {@link org.lwjgl.util.mapped.MappedObject} and be annotated with {@link org.lwjgl.util.mapped.MappedField}.
-- *
-- * @param type the mapped object class.
-- */
-- public static void register(Class<? extends MappedObject> type) {
-- if ( MappedObjectClassLoader.FORKED )
-- return;
--
-- final MappedType mapped = type.getAnnotation(MappedType.class);
--
-- if ( mapped != null && mapped.padding() < 0 )
-- throw new ClassFormatError("Invalid mapped type padding: " + mapped.padding());
--
-- if ( type.getEnclosingClass() != null && !Modifier.isStatic(type.getModifiers()) )
-- throw new InternalError("only top-level or static inner classes are allowed");
--
-- final String className = jvmClassName(type);
-- final Map<String, FieldInfo> fields = new HashMap<String, FieldInfo>();
--
-- long sizeof = 0;
-- for ( Field field : type.getDeclaredFields() ) {
-- FieldInfo fieldInfo = registerField(mapped == null || mapped.autoGenerateOffsets(), className, sizeof, field);
-- if ( fieldInfo == null )
-- continue;
--
-- fields.put(field.getName(), fieldInfo);
--
-- sizeof = Math.max(sizeof, fieldInfo.offset + fieldInfo.lengthPadded);
-- }
--
-- int align = 4;
-- int padding = 0;
-- boolean cacheLinePadded = false;
--
-- if ( mapped != null ) {
-- align = mapped.align();
-- if ( mapped.cacheLinePadding() ) {
-- if ( mapped.padding() != 0 )
-- throw new ClassFormatError("Mapped type padding cannot be specified together with cacheLinePadding.");
--
-- final int cacheLineMod = (int)(sizeof % CacheUtil.getCacheLineSize());
-- if ( cacheLineMod != 0 )
-- padding = CacheUtil.getCacheLineSize() - cacheLineMod;
--
-- cacheLinePadded = true;
-- } else
-- padding = mapped.padding();
-- }
--
-- sizeof += padding;
--
-- final MappedSubtypeInfo mappedType = new MappedSubtypeInfo(className, fields, (int)sizeof, align, padding, cacheLinePadded);
-- if ( className_to_subtype.put(className, mappedType) != null )
-- throw new InternalError("duplicate mapped type: " + mappedType.className);
-- }
--
-- private static FieldInfo registerField(final boolean autoGenerateOffsets, final String className, long advancingOffset, final Field field) {
-- if ( Modifier.isStatic(field.getModifiers()) ) // static fields are never mapped
-- return null;
--
-- // we only support primitives and ByteBuffers
-- if ( !field.getType().isPrimitive() && field.getType() != ByteBuffer.class )
-- throw new ClassFormatError("field '" + className + "." + field.getName() + "' not supported: " + field.getType());
--
-- MappedField meta = field.getAnnotation(MappedField.class);
-- if ( meta == null && !autoGenerateOffsets )
-- throw new ClassFormatError("field '" + className + "." + field.getName() + "' missing annotation " + MappedField.class.getName() + ": " + className);
--
-- Pointer pointer = field.getAnnotation(Pointer.class);
-- if ( pointer != null && field.getType() != long.class )
-- throw new ClassFormatError("The @Pointer annotation can only be used on long fields. @Pointer field found: " + className + "." + field.getName() + ": " + field.getType());
--
-- if ( Modifier.isVolatile(field.getModifiers()) && (pointer != null || field.getType() == ByteBuffer.class) )
-- throw new ClassFormatError("The volatile keyword is not supported for @Pointer or ByteBuffer fields. Volatile field found: " + className + "." + field.getName() + ": " + field.getType());
--
-- // quick hack
-- long byteLength;
-- if ( field.getType() == long.class || field.getType() == double.class ) {
-- if ( pointer == null )
-- byteLength = 8;
-- else
-- byteLength = MappedObjectUnsafe.INSTANCE.addressSize();
-- } else if ( field.getType() == double.class )
-- byteLength = 8;
-- else if ( field.getType() == int.class || field.getType() == float.class )
-- byteLength = 4;
-- else if ( field.getType() == char.class || field.getType() == short.class )
-- byteLength = 2;
-- else if ( field.getType() == byte.class )
-- byteLength = 1;
-- else if ( field.getType() == ByteBuffer.class ) {
-- byteLength = meta.byteLength();
-- if ( byteLength < 0 )
-- throw new IllegalStateException("invalid byte length for mapped ByteBuffer field: " + className + "." + field.getName() + " [length=" + byteLength + "]");
-- } else
-- throw new ClassFormatError(field.getType().getName());
--
-- if ( field.getType() != ByteBuffer.class && (advancingOffset % byteLength) != 0 )
-- throw new IllegalStateException("misaligned mapped type: " + className + "." + field.getName());
--
-- CacheLinePad pad = field.getAnnotation(CacheLinePad.class);
--
-- long byteOffset = advancingOffset;
-- if ( meta != null && meta.byteOffset() != -1 ) {
-- if ( meta.byteOffset() < 0 )
-- throw new ClassFormatError("Invalid field byte offset: " + className + "." + field.getName() + " [byteOffset=" + meta.byteOffset() + "]");
-- if ( pad != null )
-- throw new ClassFormatError("A field byte offset cannot be specified together with cache-line padding: " + className + "." + field.getName());
--
-- byteOffset = meta.byteOffset();
-- }
--
-- long byteLengthPadded = byteLength;
-- if ( pad != null ) {
-- // Pad before
-- if ( pad.before() && byteOffset % CacheUtil.getCacheLineSize() != 0 )
-- byteOffset += CacheUtil.getCacheLineSize() - (byteOffset & (CacheUtil.getCacheLineSize() - 1));
--
-- // Pad after
-- if ( pad.after() && (byteOffset + byteLength) % CacheUtil.getCacheLineSize() != 0 )
-- byteLengthPadded += CacheUtil.getCacheLineSize() - (byteOffset + byteLength) % CacheUtil.getCacheLineSize();
--
-- assert !pad.before() || (byteOffset % CacheUtil.getCacheLineSize() == 0);
-- assert !pad.after() || ((byteOffset + byteLengthPadded) % CacheUtil.getCacheLineSize() == 0);
-- }
--
-- if ( PRINT_ACTIVITY )
-- LWJGLUtil.log(MappedObjectTransformer.class.getSimpleName() + ": " + className + "." + field.getName() + " [type=" + field.getType().getSimpleName() + ", offset=" + byteOffset + "]");
--
-- return new FieldInfo(byteOffset, byteLength, byteLengthPadded, Type.getType(field.getType()), Modifier.isVolatile(field.getModifiers()), pointer != null);
-- }
--
-- /** Removes final from methods that will be overriden by subclasses. */
-- static byte[] transformMappedObject(byte[] bytecode) {
-- final ClassWriter cw = new ClassWriter(0);
--
-- ClassVisitor cv = new ClassAdapter(cw) {
--
-- private final String[] DEFINALIZE_LIST = {
-- VIEWADDRESS_METHOD_NAME,
-- NEXT_METHOD_NAME,
-- ALIGN_METHOD_NAME,
-- SIZEOF_METHOD_NAME,
-- CAPACITY_METHOD_NAME,
-- };
--
-- public MethodVisitor visitMethod(int access, final String name, final String desc, final String signature, final String[] exceptions) {
-- for ( String method : DEFINALIZE_LIST ) {
-- if ( name.equals(method) ) {
-- access &= ~ACC_FINAL;
-- break;
-- }
-- }
-- return super.visitMethod(access, name, desc, signature, exceptions);
-- }
-- };
--
-- new ClassReader(bytecode).accept(cv, 0);
-- return cw.toByteArray();
-- }
--
-- static byte[] transformMappedAPI(final String className, byte[] bytecode) {
-- final ClassWriter cw = new ClassWriter(COMPUTE_FRAMES) {
--
-- @Override
-- protected String getCommonSuperClass(String a, String b) {
-- // HACK: prevent user-code static-initialization-blocks to be executed
-- if ( is_currently_computing_frames && !a.startsWith("java/") || !b.startsWith("java/") )
-- return "java/lang/Object";
--
-- return super.getCommonSuperClass(a, b);
-- }
--
-- };
--
-- final TransformationAdapter ta = new TransformationAdapter(cw, className);
--
-- ClassVisitor cv = ta;
-- if ( className_to_subtype.containsKey(className) ) // Do a first pass to generate address getters
-- cv = getMethodGenAdapter(className, cv);
--
-- new ClassReader(bytecode).accept(cv, ClassReader.SKIP_FRAMES);
--
-- if ( !ta.transformed )
-- return bytecode;
--
-- bytecode = cw.toByteArray();
-- if ( PRINT_BYTECODE )
-- printBytecode(bytecode);
--
-- return bytecode;
-- }
--
-- private static ClassAdapter getMethodGenAdapter(final String className, final ClassVisitor cv) {
-- return new ClassAdapter(cv) {
--
-- @Override
-- public void visitEnd() {
-- final MappedSubtypeInfo mappedSubtype = className_to_subtype.get(className);
--
-- generateViewAddressGetter();
-- generateCapacity();
-- generateAlignGetter(mappedSubtype);
-- generateSizeofGetter();
-- generateNext();
--
-- for ( String fieldName : mappedSubtype.fields.keySet() ) {
-- final FieldInfo field = mappedSubtype.fields.get(fieldName);
--
-- if ( field.type.getDescriptor().length() > 1 ) { // ByteBuffer, getter only
-- generateByteBufferGetter(fieldName, field);
-- } else {
-- generateFieldGetter(fieldName, field);
-- generateFieldSetter(fieldName, field);
-- }
-- }
--
-- super.visitEnd();
-- }
--
-- private void generateViewAddressGetter() {
-- MethodVisitor mv = super.visitMethod(ACC_PUBLIC, VIEWADDRESS_METHOD_NAME, "(I)J", null, null);
-- mv.visitCode();
-- mv.visitVarInsn(ALOAD, 0);
-- mv.visitFieldInsn(GETFIELD, MAPPED_OBJECT_JVM, "baseAddress", "J");
-- mv.visitVarInsn(ILOAD, 1);
-- mv.visitFieldInsn(GETSTATIC, className, "SIZEOF", "I");
-- mv.visitInsn(IMUL);
-- mv.visitInsn(I2L);
-- mv.visitInsn(LADD);
-- if ( MappedObject.CHECKS ) {
-- mv.visitInsn(DUP2);
-- mv.visitVarInsn(ALOAD, 0);
-- mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, "checkAddress", "(JL" + MAPPED_OBJECT_JVM + ";)V");
-- }
-- mv.visitInsn(LRETURN);
-- mv.visitMaxs(3, 2);
-- mv.visitEnd();
-- }
--
-- private void generateCapacity() {
-- // return (backingByteBuffer().capacity() + (int)(MemoryUtil.getAddress0(backingByteBuffer()) - baseAddress)) / SIZEOF;
-- MethodVisitor mv = super.visitMethod(ACC_PUBLIC, CAPACITY_METHOD_NAME, "()I", null, null);
-- mv.visitCode();
-- mv.visitVarInsn(ALOAD, 0);
-- mv.visitMethodInsn(INVOKEVIRTUAL, MAPPED_OBJECT_JVM, "backingByteBuffer", "()L" + jvmClassName(ByteBuffer.class) + ";");
-- mv.visitInsn(DUP);
-- mv.visitMethodInsn(INVOKEVIRTUAL, jvmClassName(ByteBuffer.class), "capacity", "()I");
-- mv.visitInsn(SWAP);
-- mv.visitMethodInsn(INVOKESTATIC, jvmClassName(MemoryUtil.class), "getAddress0", "(L" + jvmClassName(Buffer.class) + ";)J");
-- mv.visitVarInsn(ALOAD, 0);
-- mv.visitFieldInsn(GETFIELD, MAPPED_OBJECT_JVM, "baseAddress", "J");
-- mv.visitInsn(LSUB);
-- mv.visitInsn(L2I);
-- mv.visitInsn(IADD);
-- mv.visitFieldInsn(GETSTATIC, className, "SIZEOF", "I");
-- mv.visitInsn(IDIV);
-- mv.visitInsn(IRETURN);
-- mv.visitMaxs(3, 1);
-- mv.visitEnd();
-- }
--
-- private void generateAlignGetter(final MappedSubtypeInfo mappedSubtype) {
-- MethodVisitor mv = super.visitMethod(ACC_PUBLIC, ALIGN_METHOD_NAME, "()I", null, null);
-- mv.visitCode();
-- visitIntNode(mv, mappedSubtype.sizeof);
-- mv.visitInsn(IRETURN);
-- mv.visitMaxs(1, 1);
-- mv.visitEnd();
-- }
--
-- private void generateSizeofGetter() {
-- MethodVisitor mv = super.visitMethod(ACC_PUBLIC, SIZEOF_METHOD_NAME, "()I", null, null);
-- mv.visitCode();
-- mv.visitFieldInsn(GETSTATIC, className, "SIZEOF", "I");
-- mv.visitInsn(IRETURN);
-- mv.visitMaxs(1, 1);
-- mv.visitEnd();
-- }
--
-- private void generateNext() {
-- MethodVisitor mv = super.visitMethod(ACC_PUBLIC, NEXT_METHOD_NAME, "()V", null, null);
-- mv.visitCode();
-- mv.visitVarInsn(ALOAD, 0);
-- mv.visitInsn(DUP);
-- mv.visitFieldInsn(GETFIELD, MAPPED_OBJECT_JVM, "viewAddress", "J");
-- mv.visitFieldInsn(GETSTATIC, className, "SIZEOF", "I");
-- mv.visitInsn(I2L);
-- mv.visitInsn(LADD);
-- mv.visitMethodInsn(INVOKEVIRTUAL, className, "setViewAddress", "(J)V");
-- mv.visitInsn(RETURN);
-- mv.visitMaxs(3, 1);
-- mv.visitEnd();
-- }
--
-- private void generateByteBufferGetter(final String fieldName, final FieldInfo field) {
-- MethodVisitor mv = super.visitMethod(ACC_PUBLIC | ACC_STATIC, getterName(fieldName), "(L" + className + ";I)" + field.type.getDescriptor(), null, null);
-- mv.visitCode();
-- mv.visitVarInsn(ALOAD, 0);
-- mv.visitVarInsn(ILOAD, 1);
-- mv.visitMethodInsn(INVOKEVIRTUAL, className, VIEWADDRESS_METHOD_NAME, "(I)J");
-- visitIntNode(mv, (int)field.offset);
-- mv.visitInsn(I2L);
-- mv.visitInsn(LADD);
-- visitIntNode(mv, (int)field.length);
-- mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, "newBuffer", "(JI)L" + jvmClassName(ByteBuffer.class) + ";");
-- mv.visitInsn(ARETURN);
-- mv.visitMaxs(3, 2);
-- mv.visitEnd();
-- }
--
-- private void generateFieldGetter(final String fieldName, final FieldInfo field) {
-- MethodVisitor mv = super.visitMethod(ACC_PUBLIC | ACC_STATIC, getterName(fieldName), "(L" + className + ";I)" + field.type.getDescriptor(), null, null);
-- mv.visitCode();
-- mv.visitVarInsn(ALOAD, 0);
-- mv.visitVarInsn(ILOAD, 1);
-- mv.visitMethodInsn(INVOKEVIRTUAL, className, VIEWADDRESS_METHOD_NAME, "(I)J");
-- visitIntNode(mv, (int)field.offset);
-- mv.visitInsn(I2L);
-- mv.visitInsn(LADD);
-- mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "get", "(J)" + field.type.getDescriptor());
-- mv.visitInsn(field.type.getOpcode(IRETURN));
-- mv.visitMaxs(3, 2);
-- mv.visitEnd();
-- }
--
-- private void generateFieldSetter(final String fieldName, final FieldInfo field) {
-- MethodVisitor mv = super.visitMethod(ACC_PUBLIC | ACC_STATIC, setterName(fieldName), "(L" + className + ";I" + field.type.getDescriptor() + ")V", null, null);
-- mv.visitCode();
-- int load = 0;
-- switch ( field.type.getSort() ) {
-- case Type.BOOLEAN:
-- case Type.CHAR:
-- case Type.BYTE:
-- case Type.SHORT:
-- case Type.INT:
-- load = ILOAD;
-- break;
-- case Type.FLOAT:
-- load = FLOAD;
-- break;
-- case Type.LONG:
-- load = LLOAD;
-- break;
-- case Type.DOUBLE:
-- load = DLOAD;
-- break;
-- }
-- mv.visitVarInsn(load, 2);
-- mv.visitVarInsn(ALOAD, 0);
-- mv.visitVarInsn(ILOAD, 1);
-- mv.visitMethodInsn(INVOKEVIRTUAL, className, VIEWADDRESS_METHOD_NAME, "(I)J");
-- visitIntNode(mv, (int)field.offset);
-- mv.visitInsn(I2L);
-- mv.visitInsn(LADD);
-- mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "put", "(" + field.type.getDescriptor() + "J)V");
-- mv.visitInsn(RETURN);
-- mv.visitMaxs(4, 4);
-- mv.visitEnd();
-- }
--
-- };
-- }
--
-- private static class TransformationAdapter extends ClassAdapter {
--
-- final String className;
--
-- boolean transformed;
--
-- TransformationAdapter(final ClassVisitor cv, final String className) {
-- super(cv);
-- this.className = className;
-- }
--
-- @Override
-- public FieldVisitor visitField(final int access, final String name, final String desc, final String signature, final Object value) {
-- // remove redirected fields
-- final MappedSubtypeInfo mappedSubtype = className_to_subtype.get(className);
-- if ( mappedSubtype != null && mappedSubtype.fields.containsKey(name) ) {
-- if ( PRINT_ACTIVITY )
-- LWJGLUtil.log(MappedObjectTransformer.class.getSimpleName() + ": discarding field: " + className + "." + name + ":" + desc);
-- return null;
-- }
--
-- if ( (access & ACC_STATIC) == 0 ) {
-- return new FieldNode(access, name, desc, signature, value) {
-- public void visitEnd() {
-- if ( visibleAnnotations == null ) { // early-out
-- accept(cv);
-- return;
-- }
--
-- boolean before = false;
-- boolean after = false;
-- int byteLength = 0;
-- for ( AnnotationNode pad : visibleAnnotations ) {
-- if ( CACHE_LINE_PAD_JVM.equals(pad.desc) ) {
-- if ( "J".equals(desc) || "D".equals(desc) )
-- byteLength = 8;
-- else if ( "I".equals(desc) || "F".equals(desc) )
-- byteLength = 4;
-- else if ( "S".equals(desc) || "C".equals(desc) )
-- byteLength = 2;
-- else if ( "B".equals(desc) || "Z".equals(desc) )
-- byteLength = 1;
-- else
-- throw new ClassFormatError("The @CacheLinePad annotation cannot be used on non-primitive fields: " + className + "." + name);
--
-- transformed = true;
--
-- after = true;
-- if ( pad.values != null ) {
-- for ( int i = 0; i < pad.values.size(); i += 2 ) {
-- final boolean value = pad.values.get(i + 1).equals(Boolean.TRUE);
-- if ( "before".equals(pad.values.get(i)) )
-- before = value;
-- else
-- after = value;
-- }
-- }
-- break;
-- }
-- }
--
-- /*
-- We make the fields public to force the JVM to keep the fields in the object.
-- Instead of using only longs or integers, we use the same type as the original
-- field. That's because modern JVMs usually reorder fields by type:
-- longs, then doubles, then integers, then booleans, etc. This way it's more
-- likely that the padding will work as expected.
-- */
--
-- if ( before ) {
-- final int count = CacheUtil.getCacheLineSize() / byteLength - 1;
-- for ( int i = count; i >= 1; i-- )
-- cv.visitField(access | ACC_PUBLIC | ACC_SYNTHETIC, name + "$PAD_" + i, desc, signature, null);
-- }
--
-- accept(cv);
--
-- if ( after ) {
-- final int count = CacheUtil.getCacheLineSize() / byteLength - 1;
-- for ( int i = 1; i <= count; i++ )
-- cv.visitField(access | ACC_PUBLIC | ACC_SYNTHETIC, name + "$PAD" + i, desc, signature, null);
-- }
-- }
-- };
-- } else
-- return super.visitField(access, name, desc, signature, value);
-- }
--
-- @Override
-- public MethodVisitor visitMethod(final int access, String name, final String desc, final String signature, final String[] exceptions) {
-- // Move MappedSubtype constructors to another method
-- if ( "<init>".equals(name) ) {
-- final MappedSubtypeInfo mappedSubtype = className_to_subtype.get(className);
-- if ( mappedSubtype != null ) {
-- if ( !"()V".equals(desc) )
-- throw new ClassFormatError(className + " can only have a default constructor, found: " + desc);
--
-- final MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
-- mv.visitVarInsn(ALOAD, 0);
-- mv.visitMethodInsn(INVOKESPECIAL, MAPPED_OBJECT_JVM, "<init>", "()V");
-- mv.visitInsn(RETURN);
-- mv.visitMaxs(0, 0);
--
-- // put the method body in another method
-- name = VIEW_CONSTRUCTOR_NAME;
-- }
-- }
--
-- final MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
-- return new MethodNode(access, name, desc, signature, exceptions) {
--
-- /** When true, the method has touched a mapped object and needs to be transformed. We track this
-- * so we can skip the expensive frame analysis and tree API usage. */
-- boolean needsTransformation;
--
-- @Override
-- public void visitMaxs(int a, int b) {
-- try {
-- is_currently_computing_frames = true;
-- super.visitMaxs(a, b);
-- } finally {
-- is_currently_computing_frames = false;
-- }
-- }
--
-- @Override
-- public void visitFieldInsn(final int opcode, final String owner, final String name, final String desc) {
-- if ( className_to_subtype.containsKey(owner) || owner.startsWith(MAPPEDSET_PREFIX) )
-- needsTransformation = true;
--
-- super.visitFieldInsn(opcode, owner, name, desc);
-- }
--
-- @Override
-- public void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) {
-- if ( className_to_subtype.containsKey(owner) )
-- needsTransformation = true;
--
-- super.visitMethodInsn(opcode, owner, name, desc);
-- }
--
-- @Override
-- public void visitEnd() {
-- if ( needsTransformation ) { // Early-out for methods that do not touch a mapped object.
-- //System.err.println("\nTRANSFORMING: " + className + "." + name + desc);
-- transformed = true;
-- try {
-- transformMethod(analyse());
-- } catch (Exception e) {
-- throw new RuntimeException(e);
-- }
-- }
--
-- // Pass the instruction stream to the adapter's MethodVisitor
-- accept(mv);
-- }
--
-- private Frame<BasicValue>[] analyse() throws AnalyzerException {
-- final Analyzer<BasicValue> a = new Analyzer<BasicValue>(new SimpleVerifier());
-- a.analyze(className, this);
-- return a.getFrames();
-- }
--
-- private void transformMethod(final Frame<BasicValue>[] frames) {
-- final InsnList instructions = this.instructions;
--
-- final Map<Integer, MappedSubtypeInfo> arrayVars = new HashMap<Integer, MappedSubtypeInfo>();
--
-- /*
-- We need this map because we insert/remove instructions from the stream and we need a way
-- to match each original instruction with the corresponding frame.
-- TODO: Can we keep track of everything more efficiently without a map?
-- */
-- final Map<AbstractInsnNode, Frame<BasicValue>> frameMap = new HashMap<AbstractInsnNode, Frame<BasicValue>>();
-- for ( int i = 0; i < frames.length; i++ )
-- frameMap.put(instructions.get(i), frames[i]);
--
-- for ( int i = 0; i < instructions.size(); i++ ) { // f is a separate cursor for frames
-- final AbstractInsnNode instruction = instructions.get(i);
--
-- //System.out.println("MAIN LOOP #" + i + " - " + getOpcodeName(instruction));
--
-- switch ( instruction.getType() ) {
-- case AbstractInsnNode.VAR_INSN:
-- if ( instruction.getOpcode() == ALOAD ) {
-- VarInsnNode varInsn = (VarInsnNode)instruction;
-- final MappedSubtypeInfo mappedSubtype = arrayVars.get(varInsn.var);
-- if ( mappedSubtype != null )
-- i = transformArrayAccess(instructions, i, frameMap, varInsn, mappedSubtype, varInsn.var);
-- }
-- break;
-- case AbstractInsnNode.FIELD_INSN:
-- FieldInsnNode fieldInsn = (FieldInsnNode)instruction;
--
-- final InsnList list = transformFieldAccess(fieldInsn);
-- if ( list != null )
-- i = replace(instructions, i, instruction, list);
--
-- break;
-- case AbstractInsnNode.METHOD_INSN:
-- MethodInsnNode methodInsn = (MethodInsnNode)instruction;
-- final MappedSubtypeInfo mappedType = className_to_subtype.get(methodInsn.owner);
-- if ( mappedType != null )
-- i = transformMethodCall(instructions, i, frameMap, methodInsn, mappedType, arrayVars);
-- break;
-- }
-- }
-- }
-- };
-- }
-- }
--
-- static int transformMethodCall(final InsnList instructions, int i, final Map<AbstractInsnNode, Frame<BasicValue>> frameMap, final MethodInsnNode methodInsn, final MappedSubtypeInfo mappedType, final Map<Integer, MappedSubtypeInfo> arrayVars) {
-- switch ( methodInsn.getOpcode() ) {
-- case INVOKEVIRTUAL:
-- if ( "asArray".equals(methodInsn.name) && methodInsn.desc.equals("()[L" + MAPPED_OBJECT_JVM + ";") ) {
-- // Go forward and store the local variable index.
-- // We only allow this pattern: INVOKEVIRTUAL -> CHECKCAST -> ASTORE.
-- // We remove the first two and store the target MappedSubtype in the ASTORE variable
-- AbstractInsnNode nextInstruction;
-- checkInsnAfterIsArray(nextInstruction = methodInsn.getNext(), CHECKCAST);
-- checkInsnAfterIsArray(nextInstruction = nextInstruction.getNext(), ASTORE);
--
-- final Frame<BasicValue> frame = frameMap.get(nextInstruction);
-- final String targetType = frame.getStack(frame.getStackSize() - 1).getType().getElementType().getInternalName();
-- if ( !methodInsn.owner.equals(targetType) ) {
-- /*
-- This may happen with the current API, like so:
-- MappedA foo = MappedA.malloc(...);
-- MappedB[] cursor = foo.asArray();
-- We have to parameterize MappedObject to avoid this.
-- */
-- throw new ClassCastException("Source: " + methodInsn.owner + " - Target: " + targetType);
-- }
--
-- final VarInsnNode varInstruction = (VarInsnNode)nextInstruction;
--
-- arrayVars.put(varInstruction.var, mappedType);
--
-- instructions.remove(methodInsn.getNext()); // Remove CHECKCAST
-- instructions.remove(methodInsn); // Remove INVOKEVIRTUAL
-- }
--
-- if ( "dup".equals(methodInsn.name) && methodInsn.desc.equals("()L" + MAPPED_OBJECT_JVM + ";") ) {
-- i = replace(instructions, i, methodInsn, generateDupInstructions(methodInsn));
-- break;
-- }
--
-- if ( "slice".equals(methodInsn.name) && methodInsn.desc.equals("()L" + MAPPED_OBJECT_JVM + ";") ) {
-- i = replace(instructions, i, methodInsn, generateSliceInstructions(methodInsn));
-- break;
-- }
--
-- if ( "runViewConstructor".equals(methodInsn.name) && "()V".equals(methodInsn.desc) ) {
-- i = replace(instructions, i, methodInsn, generateRunViewConstructorInstructions(methodInsn));
-- break;
-- }
--
-- if ( "copyTo".equals(methodInsn.name) && methodInsn.desc.equals("(L" + MAPPED_OBJECT_JVM + ";)V") ) {
-- i = replace(instructions, i, methodInsn, generateCopyToInstructions(mappedType));
-- break;
-- }
--
-- if ( "copyRange".equals(methodInsn.name) && methodInsn.desc.equals("(L" + MAPPED_OBJECT_JVM + ";I)V") ) {
-- i = replace(instructions, i, methodInsn, generateCopyRangeInstructions(mappedType));
-- break;
-- }
--
-- break;
-- case INVOKESPECIAL:
-- // super() in VIEW_CONSTRUCTOR_NAME, remove
-- if ( methodInsn.owner.equals(MAPPED_OBJECT_JVM) && "<init>".equals(methodInsn.name) && "()V".equals(methodInsn.desc) ) {
-- instructions.remove(methodInsn.getPrevious()); // ALOAD
-- instructions.remove(methodInsn); // INVOKESPECIAL
--
-- i -= 2;
-- }
-- break;
-- case INVOKESTATIC:
-- boolean isMapDirectMethod = "map".equals(methodInsn.name) && methodInsn.desc.equals("(JI)L" + MAPPED_OBJECT_JVM + ";");
-- boolean isMapBufferMethod = "map".equals(methodInsn.name) && methodInsn.desc.equals("(Ljava/nio/ByteBuffer;)L" + MAPPED_OBJECT_JVM + ";");
-- boolean isMallocMethod = "malloc".equals(methodInsn.name) && methodInsn.desc.equals("(I)L" + MAPPED_OBJECT_JVM + ";");
--
-- if ( (isMapDirectMethod || isMapBufferMethod) || isMallocMethod )
-- i = replace(instructions, i, methodInsn, generateMapInstructions(mappedType, methodInsn.owner, isMapDirectMethod, isMallocMethod));
-- break;
-- }
--
-- return i;
-- }
--
-- private static InsnList generateCopyRangeInstructions(final MappedSubtypeInfo mappedType) {
-- final InsnList list = new InsnList();
--
-- // stack: instances, target, this
-- list.add(getIntNode(mappedType.sizeof));
-- // stack: sizeof, instances, target, this
-- list.add(new InsnNode(IMUL));
-- // stack: bytes, target, this
-- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "copy", "(L" + MAPPED_OBJECT_JVM + ";L" + MAPPED_OBJECT_JVM + ";I)V"));
-- // stack: -
--
-- return list;
-- }
--
-- private static InsnList generateCopyToInstructions(final MappedSubtypeInfo mappedType) {
-- final InsnList list = new InsnList();
--
-- // stack: target, this
-- list.add(getIntNode(mappedType.sizeof - mappedType.padding));
-- // stack: sizeof, target, this
-- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "copy", "(L" + MAPPED_OBJECT_JVM + ";L" + MAPPED_OBJECT_JVM + ";I)V"));
-- // stack: -
--
-- return list;
-- }
--
-- private static InsnList generateRunViewConstructorInstructions(final MethodInsnNode methodInsn) {
-- final InsnList list = new InsnList();
--
-- // stack: this
-- list.add(new InsnNode(DUP));
-- // stack: this, this
-- list.add(new MethodInsnNode(INVOKEVIRTUAL, methodInsn.owner, VIEW_CONSTRUCTOR_NAME, "()V"));
-- // stack: this
--
-- return list;
-- }
--
-- private static InsnList generateSliceInstructions(final MethodInsnNode methodInsn) {
-- final InsnList list = new InsnList();
--
-- // stack: this
-- list.add(new TypeInsnNode(NEW, methodInsn.owner));
-- // stack: new, this
-- list.add(new InsnNode(DUP));
-- // stack: new, new, this
-- list.add(new MethodInsnNode(INVOKESPECIAL, methodInsn.owner, "<init>", "()V"));
-- // stack: new, this
-- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "slice", "(L" + MAPPED_OBJECT_JVM + ";L" + MAPPED_OBJECT_JVM + ";)L" + MAPPED_OBJECT_JVM + ";"));
-- // stack: new
--
-- return list;
-- }
--
-- private static InsnList generateDupInstructions(final MethodInsnNode methodInsn) {
-- final InsnList list = new InsnList();
--
-- // stack: this
-- list.add(new TypeInsnNode(NEW, methodInsn.owner));
-- // stack: new, this
-- list.add(new InsnNode(DUP));
-- // stack: new, new, this
-- list.add(new MethodInsnNode(INVOKESPECIAL, methodInsn.owner, "<init>", "()V"));
-- // stack: new, this
-- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "dup", "(L" + MAPPED_OBJECT_JVM + ";L" + MAPPED_OBJECT_JVM + ";)L" + MAPPED_OBJECT_JVM + ";"));
-- // stack: new
--
-- return list;
-- }
--
-- private static InsnList generateMapInstructions(final MappedSubtypeInfo mappedType, final String className, final boolean mapDirectMethod, final boolean mallocMethod) {
-- final InsnList trg = new InsnList();
--
-- if ( mallocMethod ) {
-- // stack: count
-- trg.add(getIntNode(mappedType.sizeof));
-- // stack: sizeof, count
-- trg.add(new InsnNode(IMUL));
-- // stack: bytes
-- trg.add(new MethodInsnNode(INVOKESTATIC, mappedType.cacheLinePadded ? jvmClassName(CacheUtil.class) : jvmClassName(BufferUtils.class), "createByteBuffer", "(I)L" + jvmClassName(ByteBuffer.class) + ";"));
-- // stack: buffer
-- } else if ( mapDirectMethod ) {
-- // stack: capacity, address
-- trg.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "newBuffer", "(JI)L" + jvmClassName(ByteBuffer.class) + ";"));
-- // stack: buffer
-- }
--
-- // stack: buffer
-- trg.add(new TypeInsnNode(NEW, className));
-- // stack: new, buffer
-- trg.add(new InsnNode(DUP));
-- // stack: new, new, buffer
-- trg.add(new MethodInsnNode(INVOKESPECIAL, className, "<init>", "()V"));
-- // stack: new, buffer
-- trg.add(new InsnNode(DUP_X1));
-- // stack: new, buffer, new
-- trg.add(new InsnNode(SWAP));
-- // stack: buffer, new, new
-- trg.add(getIntNode(mappedType.align));
-- // stack: int, buffer, new, new
-- trg.add(getIntNode(mappedType.sizeof));
-- // stack: int, int, buffer, new, new
-- trg.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "setup", "(L" + MAPPED_OBJECT_JVM + ";Ljava/nio/ByteBuffer;II)V"));
-- // stack: new
--
-- return trg;
-- }
--
-- static InsnList transformFieldAccess(final FieldInsnNode fieldInsn) {
-- final MappedSubtypeInfo mappedSubtype;
-- mappedSubtype = className_to_subtype.get(fieldInsn.owner);
-- if ( mappedSubtype == null ) { // early out
-- // MappedSet.view
-- outer:
-- if ( "view".equals(fieldInsn.name) && fieldInsn.owner.startsWith(MAPPEDSET_PREFIX) )
-- return generateSetViewInstructions(fieldInsn);
--
-- return null; // early out
-- }
--
-- if ( "SIZEOF".equals(fieldInsn.name) )
-- return generateSIZEOFInstructions(fieldInsn, mappedSubtype);
--
-- if ( "view".equals(fieldInsn.name) )
-- return generateViewInstructions(fieldInsn, mappedSubtype);
--
-- if ( "baseAddress".equals(fieldInsn.name) || "viewAddress".equals(fieldInsn.name) ) {
-- return generateAddressInstructions(fieldInsn);
-- }
--
-- final FieldInfo field = mappedSubtype.fields.get(fieldInsn.name);
-- if ( field == null ) // early out
-- return null;
--
-- // now we're going to transform ByteBuffer-typed field access
-- if ( fieldInsn.desc.equals("L" + jvmClassName(ByteBuffer.class) + ";") )
-- return generateByteBufferInstructions(fieldInsn, mappedSubtype, field.offset);
--
-- // we're now going to transform the field access
-- return generateFieldInstructions(fieldInsn, field);
-- }
--
-- private static InsnList generateSetViewInstructions(final FieldInsnNode fieldInsn) {
-- if ( fieldInsn.getOpcode() == GETFIELD )
-- throwAccessErrorOnReadOnlyField(fieldInsn.owner, fieldInsn.name);
-- if ( fieldInsn.getOpcode() != PUTFIELD )
-- throw new InternalError();
--
-- final InsnList list = new InsnList();
--
-- // stack: index, this
-- if ( MAPPED_SET2_JVM.equals(fieldInsn.owner) )
-- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_views", "(L" + MAPPED_SET2_JVM + ";I)V"));
-- else if ( MAPPED_SET3_JVM.equals(fieldInsn.owner) )
-- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_views", "(L" + MAPPED_SET3_JVM + ";I)V"));
-- else if ( MAPPED_SET4_JVM.equals(fieldInsn.owner) )
-- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_views", "(L" + MAPPED_SET4_JVM + ";I)V"));
-- else
-- throw new InternalError();
-- // stack: -
--
-- return list;
-- }
--
-- private static InsnList generateSIZEOFInstructions(final FieldInsnNode fieldInsn, final MappedSubtypeInfo mappedSubtype) {
-- if ( !"I".equals(fieldInsn.desc) )
-- throw new InternalError();
--
-- final InsnList list = new InsnList();
--
-- if ( fieldInsn.getOpcode() == GETSTATIC ) {
-- list.add(getIntNode(mappedSubtype.sizeof));
-- return list;
-- }
--
-- if ( fieldInsn.getOpcode() == PUTSTATIC )
-- throwAccessErrorOnReadOnlyField(fieldInsn.owner, fieldInsn.name);
--
-- throw new InternalError();
-- }
--
-- private static InsnList generateViewInstructions(final FieldInsnNode fieldInsn, final MappedSubtypeInfo mappedSubtype) {
-- if ( !"I".equals(fieldInsn.desc) )
-- throw new InternalError();
--
-- final InsnList list = new InsnList();
--
-- if ( fieldInsn.getOpcode() == GETFIELD ) {
-- if ( mappedSubtype.sizeof_shift != 0 ) {
-- // stack: instance
-- list.add(getIntNode(mappedSubtype.sizeof_shift));
-- // stack: sizeof, instance
-- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "get_view_shift", "(L" + MAPPED_OBJECT_JVM + ";I)I"));
-- // stack: view
-- } else {
-- // stack: instance
-- list.add(getIntNode(mappedSubtype.sizeof));
-- // stack: sizeof, instance
-- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "get_view", "(L" + MAPPED_OBJECT_JVM + ";I)I"));
-- // stack: view
-- }
-- return list;
-- }
--
-- if ( fieldInsn.getOpcode() == PUTFIELD ) {
-- if ( mappedSubtype.sizeof_shift != 0 ) {
-- // stack: view, instance
-- list.add(getIntNode(mappedSubtype.sizeof_shift));
-- // stack: sizeof, view, instance
-- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_view_shift", "(L" + MAPPED_OBJECT_JVM + ";II)V"));
-- // stack: -
-- } else {
-- // stack: view, instance
-- list.add(getIntNode(mappedSubtype.sizeof));
-- // stack: sizeof, view, instance
-- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_view", "(L" + MAPPED_OBJECT_JVM + ";II)V"));
-- // stack: -
-- }
-- return list;
-- }
--
-- throw new InternalError();
-- }
--
-- private static InsnList generateAddressInstructions(final FieldInsnNode fieldInsn) {
-- if ( !"J".equals(fieldInsn.desc) )
-- throw new IllegalStateException();
--
-- if ( fieldInsn.getOpcode() == GETFIELD ) // do not change a thing
-- return null;
--
-- if ( fieldInsn.getOpcode() == PUTFIELD )
-- throwAccessErrorOnReadOnlyField(fieldInsn.owner, fieldInsn.name);
--
-- throw new InternalError();
-- }
--
-- private static InsnList generateByteBufferInstructions(final FieldInsnNode fieldInsn, final MappedSubtypeInfo mappedSubtype, final long fieldOffset) {
-- if ( fieldInsn.getOpcode() == PUTFIELD )
-- throwAccessErrorOnReadOnlyField(fieldInsn.owner, fieldInsn.name);
--
-- if ( fieldInsn.getOpcode() == GETFIELD ) {
-- final InsnList list = new InsnList();
--
-- // stack: ref
-- list.add(new FieldInsnNode(GETFIELD, mappedSubtype.className, "viewAddress", "J"));
-- // stack: long
-- list.add(new LdcInsnNode(fieldOffset));
-- // stack: long, long
-- list.add(new InsnNode(LADD));
-- // stack: long
-- list.add(new LdcInsnNode(mappedSubtype.fields.get(fieldInsn.name).length));
-- // stack: long, long
-- list.add(new InsnNode(L2I));
-- // stack: int, long
-- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "newBuffer", "(JI)L" + jvmClassName(ByteBuffer.class) + ";"));
-- // stack: buffer
--
-- return list;
-- }
--
-- throw new InternalError();
-- }
--
-- private static InsnList generateFieldInstructions(final FieldInsnNode fieldInsn, final FieldInfo field) {
-- final InsnList list = new InsnList();
--
-- if ( fieldInsn.getOpcode() == PUTFIELD ) {
-- // stack: value, ref
-- list.add(getIntNode((int)field.offset));
-- // stack: fieldOffset, value, ref
-- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "put", "(L" + MAPPED_OBJECT_JVM + ";" + fieldInsn.desc + "I)V"));
-- // stack -
-- return list;
-- }
--
-- if ( fieldInsn.getOpcode() == GETFIELD ) {
-- // stack: ref
-- list.add(getIntNode((int)field.offset));
-- // stack: fieldOffset, ref
-- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "get", "(L" + MAPPED_OBJECT_JVM + ";I)" + fieldInsn.desc));
-- // stack: -
-- return list;
-- }
--
-- throw new InternalError();
-- }
--
-- static int transformArrayAccess(final InsnList instructions, int i, final Map<AbstractInsnNode, Frame<BasicValue>> frameMap, final VarInsnNode loadInsn, final MappedSubtypeInfo mappedSubtype, final int var) {
-- // We need to go forward in time to find how we use the array var
-- final int loadStackSize = frameMap.get(loadInsn).getStackSize() + 1;
--
-- AbstractInsnNode nextInsn = loadInsn;
--
-- while ( true ) {
-- nextInsn = nextInsn.getNext();
-- if ( nextInsn == null )
-- throw new InternalError();
--
-- Frame<BasicValue> frame = frameMap.get(nextInsn);
-- if ( frame == null )
-- continue;
--
-- int stackSize = frame.getStackSize();
--
-- if ( stackSize == loadStackSize + 1 && nextInsn.getOpcode() == AALOAD ) {
-- final AbstractInsnNode aaLoadInsn = nextInsn;
--
-- while ( true ) {
-- nextInsn = nextInsn.getNext();
-- if ( nextInsn == null )
-- break;
--
-- frame = frameMap.get(nextInsn);
-- if ( frame == null )
-- continue;
-- stackSize = frame.getStackSize();
--
-- if ( stackSize == loadStackSize + 1 && nextInsn.getOpcode() == PUTFIELD ) {
-- final FieldInsnNode fieldInsn = (FieldInsnNode)nextInsn;
--
-- // stack: value, view, ref
-- instructions.insert(nextInsn, new MethodInsnNode(INVOKESTATIC, mappedSubtype.className, setterName(fieldInsn.name), "(L" + mappedSubtype.className + ";I" + fieldInsn.desc + ")V"));
-- // stack: -
-- instructions.remove(nextInsn);
--
-- break;
-- } else if ( stackSize == loadStackSize && nextInsn.getOpcode() == GETFIELD ) {
-- final FieldInsnNode fieldInsn = (FieldInsnNode)nextInsn;
--
-- // stack: view, ref
-- instructions.insert(nextInsn, new MethodInsnNode(INVOKESTATIC, mappedSubtype.className, getterName(fieldInsn.name), "(L" + mappedSubtype.className + ";I)" + fieldInsn.desc));
-- // stack: value
-- instructions.remove(nextInsn);
--
-- break;
-- } else if ( stackSize == loadStackSize && nextInsn.getOpcode() == DUP && nextInsn.getNext().getOpcode() == GETFIELD ) {
-- // May happen with operator+assignment (e.g. cursor[i].value += 10)
-- final FieldInsnNode fieldInsn = (FieldInsnNode)nextInsn.getNext();
--
-- final MethodInsnNode getter = new MethodInsnNode(INVOKESTATIC, mappedSubtype.className, getterName(fieldInsn.name), "(L" + mappedSubtype.className + ";I)" + fieldInsn.desc);
--
-- // stack: view, ref
-- instructions.insert(nextInsn, new InsnNode(DUP2));
-- // stack: view, ref, view, ref
-- instructions.insert(nextInsn.getNext(), getter);
-- // stack: value, view, ref
--
-- instructions.remove(nextInsn);
-- instructions.remove(fieldInsn);
--
-- nextInsn = getter;
-- continue;
-- } else if ( stackSize < loadStackSize )
-- throw new ClassFormatError("Invalid " + mappedSubtype.className + " view array usage detected: " + getOpcodeName(nextInsn));
-- }
--
-- instructions.remove(aaLoadInsn);
--
-- return i;
-- } else if ( stackSize == loadStackSize && nextInsn.getOpcode() == ARRAYLENGTH ) {
-- if ( LWJGLUtil.DEBUG && loadInsn.getNext() != nextInsn )
-- throw new InternalError();
--
-- instructions.remove(nextInsn);
-- loadInsn.var = var;
-- instructions.insert(loadInsn, new MethodInsnNode(INVOKEVIRTUAL, mappedSubtype.className, CAPACITY_METHOD_NAME, "()I"));
--
-- return i + 1;
-- } else if ( stackSize < loadStackSize ) // Consumed by something other than AALOAD or ARRAYLENGTH
-- throw new ClassFormatError("Invalid " + mappedSubtype.className + " view array usage detected: " + getOpcodeName(nextInsn));
-- }
-- }
--
-- private static class FieldInfo {
--
-- final long offset;
-- final long length;
-- final long lengthPadded;
-- final Type type;
-- final boolean isVolatile;
-- final boolean isPointer;
--
-- FieldInfo(final long offset, final long length, final long lengthPadded, final Type type, final boolean isVolatile, final boolean isPointer) {
-- this.offset = offset;
-- this.length = length;
-- this.lengthPadded = lengthPadded;
-- this.type = type;
-- this.isVolatile = isVolatile;
-- this.isPointer = isPointer;
-- }
--
-- String getAccessType() {
-- return isPointer ? "a" : type.getDescriptor().toLowerCase() + (isVolatile ? "v" : "");
-- }
--
-- }
--
-- private static class MappedSubtypeInfo {
--
-- final String className;
--
-- final int sizeof;
-- final int sizeof_shift;
-- final int align;
-- final int padding;
-- final boolean cacheLinePadded;
--
-- final Map<String, FieldInfo> fields;
--
-- MappedSubtypeInfo(String className, Map<String, FieldInfo> fields, int sizeof, int align, int padding, final boolean cacheLinePadded) {
-- this.className = className;
--
-- this.sizeof = sizeof;
-- if ( ((sizeof - 1) & sizeof) == 0 )
-- this.sizeof_shift = getPoT(sizeof);
-- else
-- this.sizeof_shift = 0;
-- this.align = align;
-- this.padding = padding;
-- this.cacheLinePadded = cacheLinePadded;
--
-- this.fields = fields;
-- }
--
-- private static int getPoT(int value) {
-- int pot = -1;
-- while ( value > 0 ) {
-- pot++;
-- value >>= 1;
-- }
-- return pot;
-- }
--
-- }
--
-- // -------------------------------------------------------
-- // -------------------[ MACROS & UTILS ]------------------
-- // -------------------------------------------------------
--
-- private static void getClassEnums(final Class clazz, final Map<Integer, String> map, final String... prefixFilters) {
-- try {
-- OUTER:
-- for ( Field field : clazz.getFields() ) {
-- if ( !Modifier.isStatic(field.getModifiers()) || field.getType() != int.class )
-- continue;
--
-- for ( String filter : prefixFilters ) {
-- if ( field.getName().startsWith(filter) )
-- continue OUTER;
-- }
--
-- if ( map.put((Integer)field.get(null), field.getName()) != null )
-- throw new IllegalStateException();
-- }
-- } catch (Exception e) {
-- e.printStackTrace();
-- }
-- }
--
-- static String getOpcodeName(final AbstractInsnNode insn) {
-- final String op = OPCODE_TO_NAME.get(insn.getOpcode());
-- return INSNTYPE_TO_NAME.get(insn.getType()) + ": " + insn.getOpcode() + (op == null ? "" : " [" + OPCODE_TO_NAME.get(insn.getOpcode()) + "]");
-- }
--
-- static String jvmClassName(Class<?> type) {
-- return type.getName().replace('.', '/');
-- }
--
-- static String getterName(final String fieldName) {
-- return "get$" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1) + "$LWJGL";
-- }
--
-- static String setterName(final String fieldName) {
-- return "set$" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1) + "$LWJGL";
-- }
--
-- private static void checkInsnAfterIsArray(final AbstractInsnNode instruction, final int opcode) {
-- if ( instruction == null )
-- throw new ClassFormatError("Unexpected end of instructions after .asArray() method.");
--
-- if ( instruction.getOpcode() != opcode )
-- throw new ClassFormatError("The result of .asArray() must be stored to a local variable. Found: " + getOpcodeName(instruction));
-- }
--
-- static AbstractInsnNode getIntNode(final int value) {
-- if ( value <= 5 && -1 <= value )
-- return new InsnNode(ICONST_M1 + value + 1);
--
-- if ( value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE )
-- return new IntInsnNode(BIPUSH, value);
--
-- if ( value >= Short.MIN_VALUE && value <= Short.MAX_VALUE )
-- return new IntInsnNode(SIPUSH, value);
--
-- return new LdcInsnNode(value);
-- }
--
-- static void visitIntNode(final MethodVisitor mv, final int value) {
-- if ( value <= 5 && -1 <= value )
-- mv.visitInsn(ICONST_M1 + value + 1);
-- else if ( value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE )
-- mv.visitIntInsn(BIPUSH, value);
-- else if ( value >= Short.MIN_VALUE && value <= Short.MAX_VALUE )
-- mv.visitIntInsn(SIPUSH, value);
-- else
-- mv.visitLdcInsn(value);
-- }
--
-- /** Replace an instruction with a list of instructions. */
-- static int replace(final InsnList instructions, final int i, final AbstractInsnNode location, final InsnList list) {
-- final int size = list.size();
--
-- instructions.insert(location, list);
-- instructions.remove(location);
--
-- return i + (size - 1);
-- }
--
-- private static void throwAccessErrorOnReadOnlyField(String className, String fieldName) {
-- throw new IllegalAccessError("The " + className + "." + fieldName + " field is final.");
-- }
--
-- private static void printBytecode(byte[] bytecode) {
-- StringWriter sw = new StringWriter();
-- ClassVisitor tracer = new TraceClassVisitor(new ClassWriter(0), new PrintWriter(sw));
-- new ClassReader(bytecode).accept(tracer, 0);
-- String dump = sw.toString();
--
-- LWJGLUtil.log(dump);
-- }
--
--}
-\ No newline at end of file
+--- a/build.xml
++++ b/build.xml
+@@ -476,8 +476,10 @@
+ <include name="org/lwjgl/opencl/**"/>
+ <include name="org/lwjgl/util/**"/>
+ <exclude name="org/lwjgl/util/generator/**"/>
++ <exclude name="org/lwjgl/util/mapped/MappedObjectClassLoader.java"/>
++ <exclude name="org/lwjgl/util/mapped/MappedObjectTransformer.java"/>
+ </javac>
+- <javac debug="yes" srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" includes="org/lwjgl/test/**" source="1.5" target="1.5" taskname="test" />
++ <javac debug="yes" srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" includes="org/lwjgl/test/**" source="1.5" target="1.5" taskname="test" excludes="**/TestMappedObject.java,**/SpriteShootoutMapped.java"/>
+ <javac debug="yes" srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" includes="org/lwjgl/examples/**" source="1.5" target="1.5" taskname="examples" />
+ </target>
+
=====================================
debian/patches/nomacosx.patch
=====================================
@@ -1,109 +1,24 @@
-From: Markus Koschany <apo at debian.org>
-Date: Sat, 9 Apr 2016 18:59:10 +0200
-Subject: nomacosx
-
-We don't support MacOSX.
-
+Description: Disables Mac OS X support
+Author: Markus Koschany <apo at debian.org>
Forwarded: not-needed
----
- build.xml | 12 ++++++------
- platform_build/build-applet.xml | 4 ++--
- src/java/org/lwjgl/MacOSXSysImplementation.java | 4 ++--
- 3 files changed, 10 insertions(+), 10 deletions(-)
-
-diff --git a/build.xml b/build.xml
-index 736c91a..2b5105e 100644
---- a/build.xml
-+++ b/build.xml
-@@ -331,7 +331,7 @@
- <class name="org.lwjgl.opengl.WindowsPeerInfo"/>
- </javah>
-
-- <javah classpath="${lwjgl.bin}" destdir="${lwjgl.src.native}/macosx">
-+ <!--<javah classpath="${lwjgl.bin}" destdir="${lwjgl.src.native}/macosx">
- <class name="org.lwjgl.MacOSXSysImplementation" />
- <class name="org.lwjgl.opengl.MacOSXCanvasPeerInfo" />
- <class name="org.lwjgl.opengl.MacOSXPeerInfo" />
-@@ -341,7 +341,7 @@
- <class name="org.lwjgl.opengl.MacOSXNativeKeyboard" />
- <class name="org.lwjgl.opengl.MacOSXNativeMouse" />
- <class name="org.lwjgl.opengl.MacOSXMouseEventQueue" />
-- </javah>
-+ </javah>-->
-
- <javah classpath="${lwjgl.bin}" destdir="${lwjgl.src.headers}">
- <class name="org.lwjgl.opengl.AWTSurfaceLock" />
-@@ -394,13 +394,13 @@
- </tokenfilter>
- </filterchain>
- </loadfile>
-- <loadfile srcfile="${lwjgl.src}/java/org/lwjgl/MacOSXSysImplementation.java" property="lwjgl.java.macosx.version">
-+ <!--<loadfile srcfile="${lwjgl.src}/java/org/lwjgl/MacOSXSysImplementation.java" property="lwjgl.java.macosx.version">
- <filterchain>
- <tokenfilter>
- <containsstring contains="JNI_VERSION ="/>
- </tokenfilter>
- </filterchain>
-- </loadfile>
-+ </loadfile>-->
- <loadfile srcfile="${lwjgl.src.native}/windows/org_lwjgl_WindowsSysImplementation.h" property="lwjgl.native.windows.version">
- <filterchain>
- <tokenfilter>
-@@ -415,13 +415,13 @@
- </tokenfilter>
- </filterchain>
- </loadfile>
-- <loadfile srcfile="${lwjgl.src.native}/macosx/org_lwjgl_MacOSXSysImplementation.h" property="lwjgl.native.macosx.version">
-+ <!--<loadfile srcfile="${lwjgl.src.native}/macosx/org_lwjgl_MacOSXSysImplementation.h" property="lwjgl.native.macosx.version">
- <filterchain>
- <tokenfilter>
- <containsstring contains="#define org_lwjgl_MacOSXSysImplementation_JNI_VERSION"/>
- </tokenfilter>
- </filterchain>
-- </loadfile>
-+ </loadfile>-->
- <echo>
- lwjgl.java.windows.version = ${lwjgl.java.windows.version}
- lwjgl.native.windows.version = ${lwjgl.native.windows.version}
-diff --git a/platform_build/build-applet.xml b/platform_build/build-applet.xml
-index 588347d..5f95b13 100644
---- a/platform_build/build-applet.xml
-+++ b/platform_build/build-applet.xml
-@@ -1,7 +1,7 @@
- <project name="applet">
-
- <!-- Create our packer task -->
-- <taskdef name="pack200" classname="com.sun.tools.apache.ant.pack200.Pack200Task" classpath="platform_build/Pack200Task.jar"/>
-+ <!--<taskdef name="pack200" classname="com.sun.tools.apache.ant.pack200.Pack200Task" classpath="platform_build/Pack200Task.jar"/>-->
-
- <target name="applet">
- <antcall target="-applet">
-@@ -144,4 +144,4 @@
- <param name="output" value="applet/advance/solaris_natives.jar.lzma"/>
- </antcall>
- </target>
--</project>
-\ No newline at end of file
-+</project>
-diff --git a/src/java/org/lwjgl/MacOSXSysImplementation.java b/src/java/org/lwjgl/MacOSXSysImplementation.java
-index b92cdee..599abe2 100644
--- a/src/java/org/lwjgl/MacOSXSysImplementation.java
+++ b/src/java/org/lwjgl/MacOSXSysImplementation.java
-@@ -31,7 +31,7 @@
+@@ -31,7 +31,6 @@
*/
package org.lwjgl;
-import com.apple.eio.FileManager;
-+//import com.apple.eio.FileManager;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.PrivilegedExceptionAction;
-@@ -57,7 +57,7 @@ final class MacOSXSysImplementation extends J2SESysImplementation {
+@@ -57,8 +56,8 @@
public boolean openURL(String url) {
try {
- FileManager.openURL(url);
-+ //FileManager.openURL(url);
- return true;
+- return true;
++ LWJGLUtil.log("LWJGL build for Debian doesn't support OS X system integration");
++ return false;
} catch (Exception e) {
LWJGLUtil.log("Exception occurred while trying to invoke browser: " + e);
+ return false;
=====================================
debian/patches/ppc64el.patch
=====================================
@@ -1,17 +1,6 @@
-From: Markus Koschany <apo at debian.org>
-Date: Sat, 9 Apr 2016 19:13:26 +0200
-Subject: ppc64el
-
-Support the ppc64el platform. Not absolutely sure if this is still needed
-though.
-
+Description: Support the ppc64el platform. Not absolutely sure if this is still needed though.
+Author: Markus Koschany <apo at debian.org>
Forwarded: not-needed
----
- platform_build/linux_ant/build.xml | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/platform_build/linux_ant/build.xml b/platform_build/linux_ant/build.xml
-index 72eb346..2e9a22e 100644
--- a/platform_build/linux_ant/build.xml
+++ b/platform_build/linux_ant/build.xml
@@ -23,6 +23,10 @@
=====================================
debian/patches/series
=====================================
@@ -1,7 +1,11 @@
javadoc.patch
nomacosx.patch
+disable-pack200-task.patch
allarchs.patch
ppc64el.patch
systemjinput.patch
build-failure.patch
no-asm-support.patch
+java9-compatibility.patch
+annotation-processor-workaround.patch
+javah.patch
=====================================
debian/patches/systemjinput.patch
=====================================
@@ -1,16 +1,6 @@
-From: Markus Koschany <apo at debian.org>
-Date: Sat, 9 Apr 2016 19:19:25 +0200
-Subject: systemjinput
-
-Use Debian's jinput.jar.
-
+Description: Use Debian's jinput.jar
+Author: Markus Koschany <apo at debian.org>
Forwarded: not-needed
----
- build.xml | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/build.xml b/build.xml
-index 2b5105e..c78b2dc 100644
--- a/build.xml
+++ b/build.xml
@@ -138,6 +138,7 @@
=====================================
debian/rules
=====================================
@@ -1,15 +1,5 @@
#!/usr/bin/make -f
-NAME := $(shell dpkg-parsechangelog| sed -n '/^Source/{s/Source: \(.*\)/\1/p}')
-VERSION := $(shell dpkg-parsechangelog| sed -n '/^Version/{s/Version: \(.*\)-[0-9]*$$/\1/;s/+dfsg//p}')
-TMPDIR := $(NAME)-$(VERSION)
-TAR := ../$(NAME)_$(VERSION).orig.tar.gz
-TARDFSG := ../$(NAME)_$(VERSION)+dfsg.orig.tar.gz
-
-DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
-export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-$(DEB_HOST_ARCH)
-export PATH:=$(JAVA_HOME)/bin:$(PATH)
-
# NOTE: jutils is explicitly included here (without a depends in our control
# file) because jinput.jar lacks jutils in its own "Class-Path" (bug #626002)
# 2016-04-09: Although #626002 appears to be fixed jutils.jar is still required
@@ -21,28 +11,10 @@ export DEB_BUILD_MAINT_OPTIONS = hardening=+all
dh $@ --with javahelper
override_dh_auto_build:
- ant jars
- ant compile_native
- ant javadoc
+ dh_auto_build -- jars compile_native javadoc
override_dh_auto_install:
- jh_installjavadoc -plib$(NAME)-java-doc doc/javadoc
+ jh_installjavadoc -pliblwjgl-java-doc doc/javadoc
override_dh_auto_clean:
find src/native/ -name '*org_lwjgl_*.h' -delete
- rm -rf src/native/generated src/generated doc bin libs dist res temp
- jh_clean
-
-get-orig-source:
- rm -f $(TAR)
- uscan --verbose --download-version $(VERSION) \
- --force-download --repack --no-symlink --rename
- mkdir $(TMPDIR) && tar -C $(TMPDIR) -zxf $(TAR) && rm $(TAR)
- cd $(TMPDIR) && find . -type f -exec fromdos {} \;
- echo "The following files will not be included in Debian tarball:"
- cd $(TMPDIR) && find . \( -name '*.class' -o -name '*.jar' \
- -o -path './src/generated/*' -o -path './src/native/generated/*' \) \
- -print -delete
- ZIP=--best tar --exclude-vcs --exclude src/generated \
- --exclude src/native/generated -zcf $(TARDFSG) $(TMPDIR)
- rm -rf $(TMPDIR)
=====================================
debian/watch
=====================================
@@ -1,3 +1,3 @@
version=4
-opts="dversionmangle=s/\+dfsg//" \
+opts="repack,compression=xz,dversionmangle=s/\+dfsg//" \
http://sf.net/java-game-lib/lwjgl-source-(\d.*).zip
View it on GitLab: https://salsa.debian.org/java-team/lwjgl/compare/311e2f126da5df3deed7c165aa01796abfd73fc7...e9807a3f4331697f990a99479804b6083e1f2a2a
--
View it on GitLab: https://salsa.debian.org/java-team/lwjgl/compare/311e2f126da5df3deed7c165aa01796abfd73fc7...e9807a3f4331697f990a99479804b6083e1f2a2a
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-java-commits/attachments/20181009/7535996f/attachment.html>
More information about the pkg-java-commits
mailing list