From: <sp...@us...> - 2010-03-14 00:20:01
|
Revision: 3286 http://java-game-lib.svn.sourceforge.net/java-game-lib/?rev=3286&view=rev Author: spasi Date: 2010-03-14 00:19:48 +0000 (Sun, 14 Mar 2010) Log Message: ----------- Added Charset encoding to StringUtils Changed shader tests to use the String APIs Finished ARB_uniform_buffer_object shader test Fixed native code compiler warnings Made the generator check file timestamps to avoid unnecessary 3+ min builds Modified Paths: -------------- trunk/LWJGL/platform_build/build-definitions.xml trunk/LWJGL/src/java/org/lwjgl/opengl/StringUtils.java trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/Shader.java trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderFP.java trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderFSH.java trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderUNI.java trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderVP.java trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderVSH.java trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShadersTest.java trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/shaderUNI.vsh trunk/LWJGL/src/java/org/lwjgl/util/generator/GeneratorVisitor.java trunk/LWJGL/src/java/org/lwjgl/util/generator/NativeMethodStubsGenerator.java Modified: trunk/LWJGL/platform_build/build-definitions.xml =================================================================== --- trunk/LWJGL/platform_build/build-definitions.xml 2010-03-13 00:45:44 UTC (rev 3285) +++ trunk/LWJGL/platform_build/build-definitions.xml 2010-03-14 00:19:48 UTC (rev 3286) @@ -49,6 +49,7 @@ <include name="org/lwjgl/test/opengl/shaders/shaderFSH.vsh" /> <include name="org/lwjgl/test/opengl/shaders/shaderVP.vp" /> <include name="org/lwjgl/test/opengl/shaders/shaderVSH.vsh" /> + <include name="org/lwjgl/test/opengl/shaders/shaderUNI.vsh" /> </fileset> <!-- Files to include in the lwjgl_util.jar file --> Modified: trunk/LWJGL/src/java/org/lwjgl/opengl/StringUtils.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/opengl/StringUtils.java 2010-03-13 00:45:44 UTC (rev 3285) +++ trunk/LWJGL/src/java/org/lwjgl/opengl/StringUtils.java 2010-03-14 00:19:48 UTC (rev 3286) @@ -34,7 +34,10 @@ import org.lwjgl.BufferUtils; import java.nio.ByteBuffer; +import java.nio.CharBuffer; import java.nio.IntBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetEncoder; /** @author spasi */ final class StringUtils { @@ -60,6 +63,14 @@ } }; + private static final ThreadLocal infiniteSeqTL = new ThreadLocal() { + protected Object initialValue() { + return new InfiniteCharSequence(); + } + }; + + private static CharsetEncoder encoder = Charset.forName("US-ASCII").newEncoder(); + private StringUtils() { } @@ -129,14 +140,17 @@ return lengths; } - /* + static InfiniteCharSequence getInfiniteSeq() { + return (InfiniteCharSequence)infiniteSeqTL.get(); + } + + /** * Reads a byte string from the specified buffer. * * @param buffer * * @return the buffer as a String. */ - static String getString(final ByteBuffer buffer) { final int length = buffer.remaining(); final char[] charArray = getArray(length); @@ -147,6 +161,12 @@ return new String(charArray, 0, length); } + private static void encode(final ByteBuffer buffer, final CharSequence string) { + final InfiniteCharSequence infiniteSeq = getInfiniteSeq(); + infiniteSeq.setString(string); + encoder.encode(infiniteSeq.buffer, buffer, true); + } + /** * Returns a buffer containing the specified string as bytes. * @@ -157,8 +177,7 @@ static ByteBuffer getBuffer(final CharSequence string) { final ByteBuffer buffer = getBuffer(string.length()); - for ( int i = 0; i < string.length(); i++ ) - buffer.put((byte)string.charAt(i)); + encode(buffer, string); buffer.flip(); return buffer; @@ -174,8 +193,7 @@ static ByteBuffer getBufferOffset(final CharSequence string, final int offset) { final ByteBuffer buffer = getBufferOffset(offset + string.length()); - for ( int i = 0; i < string.length(); i++ ) - buffer.put((byte)string.charAt(i)); + encode(buffer, string); buffer.flip(); return buffer; @@ -191,14 +209,21 @@ static ByteBuffer getBufferNT(final CharSequence string) { final ByteBuffer buffer = getBuffer(string.length() + 1); - for ( int i = 0; i < string.length(); i++ ) - buffer.put((byte)string.charAt(i)); + encode(buffer, string); buffer.put((byte)0); buffer.flip(); return buffer; } + private static int getTotalLength(final CharSequence[] strings) { + int length = 0; + for ( int i = 0; i < strings.length; i++ ) + length += strings[i].length(); + + return length; + } + /** * Returns a buffer containing the specified strings as bytes. * @@ -207,17 +232,14 @@ * @return the Strings as a ByteBuffer */ static ByteBuffer getBuffer(final CharSequence[] strings) { - int length = 0; - for ( int i = 0; i < strings.length; i++ ) - length += strings[i].length(); + final ByteBuffer buffer = getBuffer(getTotalLength(strings)); - final ByteBuffer buffer = getBuffer(length); - + final InfiniteCharSequence infiniteSeq = getInfiniteSeq(); for ( int i = 0; i < strings.length; i++ ) { - final CharSequence string = strings[i]; - for ( int j = 0; j < string.length(); j++ ) - buffer.put((byte)string.charAt(i)); + infiniteSeq.setString(strings[i]); + encoder.encode(infiniteSeq.buffer, buffer, true); } + infiniteSeq.clear(); buffer.flip(); return buffer; @@ -231,18 +253,15 @@ * @return the Strings as a ByteBuffer */ static ByteBuffer getBufferNT(final CharSequence[] strings) { - int length = 0; - for ( int i = 0; i < strings.length; i++ ) - length += strings[i].length() + 1; + final ByteBuffer buffer = getBuffer(getTotalLength(strings) + strings.length); - final ByteBuffer buffer = getBuffer(length); - + final InfiniteCharSequence infiniteSeq = getInfiniteSeq(); for ( int i = 0; i < strings.length; i++ ) { - final CharSequence string = strings[i]; - for ( int j = 0; j < string.length(); j++ ) - buffer.put((byte)string.charAt(i)); + infiniteSeq.setString(strings[i]); + encoder.encode(infiniteSeq.buffer, buffer, true); buffer.put((byte)0); } + infiniteSeq.clear(); buffer.flip(); return buffer; @@ -265,4 +284,41 @@ return buffer; } + /** + * A mutable CharSequence with very large initial length. We can wrap this in a re-usable CharBuffer for decoding. + * We cannot subclass CharBuffer because of {@link CharBuffer#toString(int,int)}. + */ + private static class InfiniteCharSequence implements CharSequence { + + final CharBuffer buffer; + + CharSequence string; + + InfiniteCharSequence() { + buffer = CharBuffer.wrap(this); + } + + void setString(final CharSequence string) { + this.string = string; + this.buffer.position(0); + this.buffer.limit(string.length()); + } + + void clear() { + this.string = null; + } + + public int length() { + return Integer.MAX_VALUE; + } + + public char charAt(final int index) { + return string.charAt(index); + } + + public CharSequence subSequence(final int start, final int end) { + return string.subSequence(start, end); + } + } + } \ No newline at end of file Modified: trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/Shader.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/Shader.java 2010-03-13 00:45:44 UTC (rev 3285) +++ trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/Shader.java 2010-03-14 00:19:48 UTC (rev 3286) @@ -1,31 +1,31 @@ -/* +/* * Copyright (c) 2002-2008 LWJGL Project * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are + * modification, are permitted provided that the following conditions are * met: - * - * * Redistributions of source code must retain the above copyright + * + * * 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 + * * 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 + * 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 + * 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. */ @@ -73,8 +73,8 @@ return int_buffer.get(0); } - protected static ByteBuffer getShaderText(String file) { - ByteBuffer shader = null; + protected static String getShaderText(String file) { + String shader = null; try { ClassLoader loader = ShadersTest.class.getClassLoader(); @@ -93,10 +93,10 @@ fileBuffer.flip(); - shader = BufferUtils.createByteBuffer(fileBuffer.limit()); - shader.put(fileBuffer); + byte[] array = new byte[fileBuffer.remaining()]; + fileBuffer.get(array); + shader = new String(array); - shader.clear(); fileBuffer.clear(); } catch (IOException e) { ShadersTest.kill("Failed to read the shader source file: " + file, e); @@ -105,17 +105,13 @@ return shader; } - protected static void checkProgramError(String programFile, ByteBuffer programSource) { + protected static void checkProgramError(String programFile, String programSource) { if ( GL11.glGetError() == GL11.GL_INVALID_OPERATION ) { - programSource.clear(); - final byte[] bytes = new byte[programSource.capacity()]; - programSource.get(bytes); - final int errorPos = glGetInteger(ARBProgram.GL_PROGRAM_ERROR_POSITION_ARB); int lineStart = 0; int lineEnd = -1; - for ( int i = 0; i < bytes.length; i++ ) { - if ( bytes[i] == '\n' ) { + for ( int i = 0; i < programSource.length(); i++ ) { + if ( programSource.charAt(i) == '\n' ) { if ( i <= errorPos ) { lineStart = i + 1; } else { @@ -126,29 +122,17 @@ } if ( lineEnd == -1 ) - lineEnd = bytes.length; + lineEnd = programSource.length(); ShadersTest.kill("Low-level program error in file: " + programFile - + "\n\tError line: " + new String(bytes, lineStart, lineEnd - lineStart) + + "\n\tError line: " + programSource.substring(lineStart, lineEnd) + "\n\tError message: " + GL11.glGetString(ARBProgram.GL_PROGRAM_ERROR_STRING_ARB)); } } protected static int getUniformLocation(int ID, String name) { - fileBuffer.clear(); + final int location = ARBShaderObjects.glGetUniformLocationARB(ID, name); - int length = name.length(); - - char[] charArray = new char[length]; - name.getChars(0, length, charArray, 0); - - for ( int i = 0; i < length; i++ ) - fileBuffer.put((byte)charArray[i]); - fileBuffer.put((byte)0); // Must be null-terminated. - fileBuffer.flip(); - - final int location = ARBShaderObjects.glGetUniformLocationARB(ID, fileBuffer); - if ( location == -1 ) throw new IllegalArgumentException("The uniform \"" + name + "\" does not exist in the Shader Program."); @@ -159,42 +143,25 @@ ARBShaderObjects.glGetObjectParameterARB(ID, ARBShaderObjects.GL_OBJECT_INFO_LOG_LENGTH_ARB, programBuffer); final int logLength = programBuffer.get(0); - if ( logLength <= 1 ) return; - final ByteBuffer log = BufferUtils.createByteBuffer(logLength); - - ARBShaderObjects.glGetInfoLogARB(ID, null, log); - - final char[] charArray = new char[logLength]; - for ( int i = 0; i < logLength; i++ ) - charArray[i] = (char)log.get(); - System.out.println("\nInfo Log of Shader Object: " + file); System.out.println("--------------------------"); - System.out.println(new String(charArray, 0, logLength)); + System.out.println(ARBShaderObjects.glGetInfoLogARB(ID, logLength)); + } protected static void printShaderProgramInfoLog(int ID) { ARBShaderObjects.glGetObjectParameterARB(ID, ARBShaderObjects.GL_OBJECT_INFO_LOG_LENGTH_ARB, programBuffer); final int logLength = programBuffer.get(0); - if ( logLength <= 1 ) return; - final ByteBuffer log = BufferUtils.createByteBuffer(logLength); - - ARBShaderObjects.glGetInfoLogARB(ID, null, log); - - final char[] charArray = new char[logLength]; - for ( int i = 0; i < logLength; i++ ) - charArray[i] = (char)log.get(); - System.out.println("\nShader Program Info Log: "); System.out.println("--------------------------"); - System.out.println(new String(charArray, 0, logLength)); + System.out.println(ARBShaderObjects.glGetInfoLogARB(ID, logLength)); } } Modified: trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderFP.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderFP.java 2010-03-13 00:45:44 UTC (rev 3285) +++ trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderFP.java 2010-03-14 00:19:48 UTC (rev 3286) @@ -1,31 +1,31 @@ -/* +/* * Copyright (c) 2002-2008 LWJGL Project * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are + * modification, are permitted provided that the following conditions are * met: - * - * * Redistributions of source code must retain the above copyright + * + * * 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 + * * 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 + * 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 + * 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. */ @@ -38,8 +38,6 @@ package org.lwjgl.test.opengl.shaders; -import java.nio.ByteBuffer; - import org.lwjgl.opengl.ARBFragmentProgram; import org.lwjgl.opengl.ARBProgram; import org.lwjgl.opengl.ARBVertexProgram; @@ -48,12 +46,12 @@ final class ShaderFP extends Shader { final String vpFile; - final ByteBuffer vpSource; + final String vpSource; final int vpID; final String fpFile; - final ByteBuffer fpSource; + final String fpSource; final int fpID; Modified: trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderFSH.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderFSH.java 2010-03-13 00:45:44 UTC (rev 3285) +++ trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderFSH.java 2010-03-14 00:19:48 UTC (rev 3286) @@ -1,31 +1,31 @@ -/* +/* * Copyright (c) 2002-2008 LWJGL Project * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are + * modification, are permitted provided that the following conditions are * met: - * - * * Redistributions of source code must retain the above copyright + * + * * 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 + * * 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 + * 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 + * 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. */ @@ -38,8 +38,6 @@ package org.lwjgl.test.opengl.shaders; -import java.nio.ByteBuffer; - import org.lwjgl.opengl.ARBFragmentShader; import org.lwjgl.opengl.ARBShaderObjects; import org.lwjgl.opengl.ARBVertexShader; @@ -48,12 +46,12 @@ final class ShaderFSH extends Shader { final String vshFile; - final ByteBuffer vshSource; + final String vshSource; final int vshID; final String fshFile; - final ByteBuffer fshSource; + final String fshSource; final int fshID; Modified: trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderUNI.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderUNI.java 2010-03-13 00:45:44 UTC (rev 3285) +++ trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderUNI.java 2010-03-14 00:19:48 UTC (rev 3286) @@ -38,24 +38,28 @@ package org.lwjgl.test.opengl.shaders; import org.lwjgl.BufferUtils; -import org.lwjgl.opengl.ARBUniformBufferObject; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.*; -import java.nio.ByteBuffer; +import java.nio.FloatBuffer; import java.nio.IntBuffer; final class ShaderUNI extends Shader { final String file; - final ByteBuffer source; + final String source; final int shaderID; final int programID; - final int uniformA; - final int uniformB; + final int bufferID; + final FloatBuffer buffer; + final int uniformA_index; + final int uniformA_offset; + + final int uniformB_index; + final int uniformB_offset; + ShaderUNI(final String shaderFile) { file = shaderFile; source = getShaderText(shaderFile); @@ -81,39 +85,74 @@ if ( programBuffer.get(0) == GL11.GL_FALSE ) ShadersTest.kill("A linking error occured in a shader program."); - uniformA = getUniformLocation(programID, "uniformA"); - uniformB = getUniformLocation(programID, "uniformB"); + final String[] uniformNames = { "uniformA", "uniformB" }; - String[] uniformNames = { "uniformA", "uniformB" }; - IntBuffer tmp = BufferUtils.createIntBuffer(uniformNames.length); + IntBuffer indexes = BufferUtils.createIntBuffer(uniformNames.length); + IntBuffer params = BufferUtils.createIntBuffer(uniformNames.length); + IntBuffer getBuffer = BufferUtils.createIntBuffer(16); + IntBuffer buffers = BufferUtils.createIntBuffer(1); - ARBUniformBufferObject.glGetUniformIndices(programID, toByteBuffer(uniformNames), tmp); + // Get uniform block index and data size + final int blockIndex = ARBUniformBufferObject.glGetUniformBlockIndex(programID, "test"); + ARBUniformBufferObject.glGetActiveUniformBlock(programID, blockIndex, ARBUniformBufferObject.GL_UNIFORM_BLOCK_DATA_SIZE, getBuffer); + final int blockSize = getBuffer.get(0); - System.out.println("uniformA index = " + tmp.get(0)); - System.out.println("uniformB index = " + tmp.get(1)); - } + System.out.println("blockSize = " + blockSize); - private static ByteBuffer toByteBuffer(String[] strs) { - int length = 0; - for ( int i = 0; i < strs.length; i++ ) - length += strs[i].length() + 1; // +1 for the NULL-character + // Create uniform buffer object and allocate a ByteBuffer + GL15.glGenBuffers(buffers); + bufferID = buffers.get(0); + GL15.glBindBuffer(ARBUniformBufferObject.GL_UNIFORM_BUFFER, bufferID); + GL15.glBufferData(ARBUniformBufferObject.GL_UNIFORM_BUFFER, blockSize, GL15.GL_DYNAMIC_DRAW); + buffer = BufferUtils.createFloatBuffer(blockSize); - final ByteBuffer buff = BufferUtils.createByteBuffer(length); - for ( int i = 0; i < strs.length; i++ ) { - buff.put(strs[i].getBytes()); - buff.put((byte)0); // The ending NULL-character - } - buff.flip(); + // Attach UBO and associate uniform block to binding point 0 + ARBUniformBufferObject.glBindBufferBase(ARBUniformBufferObject.GL_UNIFORM_BUFFER, 0, bufferID); + ARBUniformBufferObject.glUniformBlockBinding(programID, blockIndex, 0); - return buff; + // Get uniform information + ARBUniformBufferObject.glGetUniformIndices(programID, uniformNames, indexes); + uniformA_index = indexes.get(0); + uniformB_index = indexes.get(1); + + ARBUniformBufferObject.glGetActiveUniforms(programID, indexes, ARBUniformBufferObject.GL_UNIFORM_OFFSET, params); + uniformA_offset = params.get(0); + uniformB_offset = params.get(1); + + System.out.println("\nuniformA index = " + uniformA_index); + System.out.println("uniformB index = " + uniformB_index); + + System.out.println("\nuniformA offset = " + uniformA_offset + " - should be 0 for std140"); + System.out.println("uniformB offset = " + uniformB_offset + " - should be 16 for std140"); + + Util.checkGLError(); } void render() { GL20.glUseProgram(programID); - GL20.glUniform2f(uniformA, ShadersTest.getSin(), ShadersTest.getSpecularity() * 8.0f); - GL20.glUniform3f(uniformB, 0.0f, 0.7f, 0.0f); + //* -- std140 layout + // Uniform A + buffer.put(0, ShadersTest.getSin()).put(1, ShadersTest.getSpecularity() * 8.0f); + // Uniform B - str140 alignment at 16 bytes + buffer.put(4, 0.0f).put(5, 0.7f).put(6, 0.0f); + GL15.glBindBuffer(ARBUniformBufferObject.GL_UNIFORM_BUFFER, bufferID); + GL15.glBufferData(ARBUniformBufferObject.GL_UNIFORM_BUFFER, buffer, GL15.GL_DYNAMIC_DRAW); + //*/ + + /* -- non-std140 layout + // Uniform A + buffer.put(ShadersTest.getSin()).put(ShadersTest.getSpecularity() * 8.0f); + buffer.flip(); + GL15.glBufferSubData(ARBUniformBufferObject.GL_UNIFORM_BUFFER, uniformA_offset, buffer); + // Uniform B + buffer.clear(); + buffer.put(0.0f).put(0.7f).put(0.0f); + buffer.flip(); + GL15.glBufferSubData(ARBUniformBufferObject.GL_UNIFORM_BUFFER, uniformB_offset, buffer); + //*/ + ShadersTest.renderObject(); GL20.glUseProgram(0); Modified: trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderVP.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderVP.java 2010-03-13 00:45:44 UTC (rev 3285) +++ trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderVP.java 2010-03-14 00:19:48 UTC (rev 3286) @@ -1,31 +1,31 @@ -/* +/* * Copyright (c) 2002-2008 LWJGL Project * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are + * modification, are permitted provided that the following conditions are * met: - * - * * Redistributions of source code must retain the above copyright + * + * * 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 + * * 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 + * 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 + * 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. */ @@ -38,8 +38,6 @@ package org.lwjgl.test.opengl.shaders; -import java.nio.ByteBuffer; - import org.lwjgl.opengl.ARBProgram; import org.lwjgl.opengl.ARBVertexProgram; import org.lwjgl.opengl.GL11; @@ -47,7 +45,7 @@ final class ShaderVP extends Shader { final String file; - final ByteBuffer source; + final String source; final int ID; Modified: trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderVSH.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderVSH.java 2010-03-13 00:45:44 UTC (rev 3285) +++ trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShaderVSH.java 2010-03-14 00:19:48 UTC (rev 3286) @@ -1,31 +1,31 @@ -/* +/* * Copyright (c) 2002-2008 LWJGL Project * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are + * modification, are permitted provided that the following conditions are * met: - * - * * Redistributions of source code must retain the above copyright + * + * * 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 + * * 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 + * 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 + * 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. */ @@ -47,7 +47,7 @@ final class ShaderVSH extends Shader { final String file; - final ByteBuffer source; + final String source; final int shaderID; final int programID; Modified: trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShadersTest.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShadersTest.java 2010-03-13 00:45:44 UTC (rev 3285) +++ trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/ShadersTest.java 2010-03-14 00:19:48 UTC (rev 3286) @@ -141,35 +141,37 @@ kill(e.getMessage()); } + final ContextCapabilities caps = GLContext.getCapabilities(); + if ( "NONE".equalsIgnoreCase(args[0]) ) { shader = null; } else if ( "VP".equalsIgnoreCase(args[0]) ) { - if ( !GLContext.getCapabilities().GL_ARB_vertex_program ) + if ( !caps.GL_ARB_vertex_program ) kill("The ARB_vertex_program extension is not supported."); shader = new ShaderVP("shaderVP.vp"); } else if ( "FP".equalsIgnoreCase(args[0]) ) { - if ( !GLContext.getCapabilities().GL_ARB_vertex_program ) + if ( !caps.GL_ARB_vertex_program ) kill("The ARB_vertex_program extension is not supported."); - if ( !GLContext.getCapabilities().GL_ARB_fragment_program ) + if ( !caps.GL_ARB_fragment_program ) kill("The ARB_fragment_program extension is not supported."); shader = new ShaderFP("shaderFP.vp", "shaderFP.fp"); } else if ( "VSH".equalsIgnoreCase(args[0]) ) { - if ( !GLContext.getCapabilities().GL_ARB_vertex_shader ) + if ( !caps.GL_ARB_vertex_shader ) kill("The ARB_vertex_shader extension is not supported."); shader = new ShaderVSH("shaderVSH.vsh"); } else if ( "FSH".equalsIgnoreCase(args[0]) ) { - if ( !GLContext.getCapabilities().GL_ARB_vertex_shader ) + if ( !caps.GL_ARB_vertex_shader ) kill("The ARB_vertex_shader extension is not supported."); - if ( !GLContext.getCapabilities().GL_ARB_fragment_shader ) + if ( !caps.GL_ARB_fragment_shader ) kill("The ARB_fragment_shader extension is not supported."); shader = new ShaderFSH("shaderFSH.vsh", "shaderFSH.fsh"); } else if ("UNI".equalsIgnoreCase(args[0]) ) { - if ( !GLContext.getCapabilities().OpenGL31 ) - kill("OpenGL version 3.1 is not supported."); + if ( !(caps.OpenGL31 || caps.GL_ARB_uniform_buffer_object) ) + kill("Neither OpenGL version 3.1 nor ARB_uniform_buffer_object are supported."); shader = new ShaderUNI("shaderUNI.vsh"); } else { @@ -316,6 +318,7 @@ System.out.println("vsh\t- Use ARB_vertex_shader (GLSL) only."); System.out.println("fp\t- Use ARB_vertex_program + ARB_fragment_program (low-level)."); System.out.println("fsh\t- Use ARB_vertex_shader + ARB_fragment_shader (GLSL)."); + System.out.println("uni\t- Use ARB_uniform_buffer_object to update shader uniforms (GLSL)."); cleanup(); System.exit(-1); Modified: trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/shaderUNI.vsh =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/shaderUNI.vsh 2010-03-13 00:45:44 UTC (rev 3285) +++ trunk/LWJGL/src/java/org/lwjgl/test/opengl/shaders/shaderUNI.vsh 2010-03-14 00:19:48 UTC (rev 3286) @@ -1,7 +1,10 @@ #version 140 +#extension GL_ARB_uniform_buffer_object : enable -uniform vec2 uniformA; -uniform vec3 uniformB; +layout(std140) uniform test { + vec2 uniformA; + vec3 uniformB; +}; void main(void) { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; Modified: trunk/LWJGL/src/java/org/lwjgl/util/generator/GeneratorVisitor.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/util/generator/GeneratorVisitor.java 2010-03-13 00:45:44 UTC (rev 3285) +++ trunk/LWJGL/src/java/org/lwjgl/util/generator/GeneratorVisitor.java 2010-03-14 00:19:48 UTC (rev 3286) @@ -250,6 +250,12 @@ public void visitInterfaceDeclaration(InterfaceDeclaration d) { try { + // Skip this class if the output exists and the input has not been modified. + File input = d.getPosition().file(); + File output = new File(env.getOptions().get("-s") + '/' + d.getPackage().getQualifiedName().replace('.', '/'), Utils.getSimpleClassName(d) + ".java"); + if ( output.exists() && input.lastModified() < output.lastModified() ) + return; + if (d.getMethods().size() > 0 || d.getFields().size() > 0) generateJavaSource(d); if (d.getMethods().size() > 0) Modified: trunk/LWJGL/src/java/org/lwjgl/util/generator/NativeMethodStubsGenerator.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/util/generator/NativeMethodStubsGenerator.java 2010-03-13 00:45:44 UTC (rev 3285) +++ trunk/LWJGL/src/java/org/lwjgl/util/generator/NativeMethodStubsGenerator.java 2010-03-14 00:19:48 UTC (rev 3286) @@ -161,7 +161,7 @@ } else if (String.class.equals(java_result_type)) { writer.print("NewStringNativeUnsigned(env, "); } else if ( method.getAnnotation(GLpointer.class) != null ) { - writer.print("(jlong)"); + writer.print("(intptr_t)"); } writer.print(Utils.RESULT_VAR_NAME); if (Buffer.class.isAssignableFrom(java_result_type)) { @@ -192,8 +192,8 @@ } private static void generateCallParameter(PrintWriter writer, TypeMap type_map, ParameterDeclaration param) { - boolean is_indirect = param.getAnnotation(Indirect.class) != null || param.getAnnotation(StringList.class) != null; - if (is_indirect) { + boolean is_indirect = param.getAnnotation(Indirect.class) != null; + if (is_indirect || param.getAnnotation(StringList.class) != null) { writer.print("("); NativeTypeTranslator translator = new NativeTypeTranslator(type_map, param); param.getType().accept(translator); @@ -201,7 +201,7 @@ writer.print("*)"); } if ( param.getAnnotation(GLpointer.class) != null ) - writer.print("(" + param.getAnnotation(GLpointer.class).value() + ")"); + writer.print("(" + param.getAnnotation(GLpointer.class).value() + ")(intptr_t)"); if (param.getAnnotation(Result.class) != null || is_indirect) writer.print("&"); if (param.getAnnotation(Result.class) != null) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |