From: <eli...@us...> - 2007-05-22 22:30:24
|
Revision: 2827 http://svn.sourceforge.net/java-game-lib/?rev=2827&view=rev Author: elias_naur Date: 2007-05-22 15:30:21 -0700 (Tue, 22 May 2007) Log Message: ----------- Implemented proper buffer reference retaining for complicated functions like glVertexAttribPointer and glTexCoordPointer. Patch by MatthiasM. Modified Paths: -------------- trunk/LWJGL/src/java/org/lwjgl/opengl/BaseReferences.java trunk/LWJGL/src/java/org/lwjgl/opengl/ReferencesStack.java trunk/LWJGL/src/java/org/lwjgl/util/generator/CachedReference.java trunk/LWJGL/src/java/org/lwjgl/util/generator/JavaMethodsGenerator.java trunk/LWJGL/src/java/org/lwjgl/util/generator/ReferencesGeneratorProcessorFactory.java trunk/LWJGL/src/templates/org/lwjgl/opengl/ARB_vertex_program.java trunk/LWJGL/src/templates/org/lwjgl/opengl/ARB_vertex_shader.java trunk/LWJGL/src/templates/org/lwjgl/opengl/GL11.java trunk/LWJGL/src/templates/org/lwjgl/opengl/GL13.java trunk/LWJGL/src/templates/org/lwjgl/opengl/GL20.java trunk/LWJGL/src/templates/org/lwjgl/opengl/NV_vertex_program.java Modified: trunk/LWJGL/src/java/org/lwjgl/opengl/BaseReferences.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/opengl/BaseReferences.java 2007-05-20 17:51:28 UTC (rev 2826) +++ trunk/LWJGL/src/java/org/lwjgl/opengl/BaseReferences.java 2007-05-22 22:30:21 UTC (rev 2827) @@ -31,18 +31,41 @@ */ package org.lwjgl.opengl; +import java.nio.Buffer; +import java.nio.IntBuffer; +import java.util.Arrays; + class BaseReferences { int elementArrayBuffer; int arrayBuffer; + Buffer[] glVertexAttribPointer_buffer; + Buffer[] glTexCoordPointer_buffer; + int glClientActiveTexture; + BaseReferences(ContextCapabilities caps) { + IntBuffer temp = caps.scratch_int_buffer; + + GL11.glGetInteger(ARBVertexShader.GL_MAX_VERTEX_ATTRIBS_ARB, temp); + glVertexAttribPointer_buffer = new Buffer[temp.get(0)]; + + GL11.glGetInteger(GL13.GL_MAX_TEXTURE_UNITS, temp); + glTexCoordPointer_buffer = new Buffer[temp.get(0)]; + } + void clear() { this.elementArrayBuffer = 0; this.arrayBuffer = 0; + this.glClientActiveTexture = 0; + Arrays.fill(glVertexAttribPointer_buffer, null); + Arrays.fill(glTexCoordPointer_buffer, null); } void copy(BaseReferences references) { this.elementArrayBuffer = references.elementArrayBuffer; this.arrayBuffer = references.arrayBuffer; + this.glClientActiveTexture = references.glClientActiveTexture; + System.arraycopy(references.glVertexAttribPointer_buffer, 0, glVertexAttribPointer_buffer, 0, glVertexAttribPointer_buffer.length); + System.arraycopy(references.glTexCoordPointer_buffer, 0, glTexCoordPointer_buffer, 0, glTexCoordPointer_buffer.length); } } Modified: trunk/LWJGL/src/java/org/lwjgl/opengl/ReferencesStack.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/opengl/ReferencesStack.java 2007-05-20 17:51:28 UTC (rev 2826) +++ trunk/LWJGL/src/java/org/lwjgl/opengl/ReferencesStack.java 2007-05-22 22:30:21 UTC (rev 2827) @@ -57,13 +57,14 @@ References[] new_references_stack = new References[references_stack.length + 1]; System.arraycopy(references_stack, 0, new_references_stack, 0, references_stack.length); references_stack = new_references_stack; - references_stack[references_stack.length - 1] = new References(); + references_stack[references_stack.length - 1] = new References(GLContext.getCapabilities()); } ReferencesStack() { + ContextCapabilities caps = GLContext.getCapabilities(); references_stack = new References[1]; stack_pos = 0; for (int i = 0; i < references_stack.length; i++) - references_stack[i] = new References(); + references_stack[i] = new References(caps); } } Modified: trunk/LWJGL/src/java/org/lwjgl/util/generator/CachedReference.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/util/generator/CachedReference.java 2007-05-20 17:51:28 UTC (rev 2826) +++ trunk/LWJGL/src/java/org/lwjgl/util/generator/CachedReference.java 2007-05-22 22:30:21 UTC (rev 2827) @@ -46,4 +46,9 @@ @Target(ElementType.PARAMETER) public @interface CachedReference { + /** If set then this will be used as array index for accessing the stored reference. */ + String index() default ""; + + /** If set then this name will be used for the reference and the reference field will not be auto generated in References. */ + String name() default ""; } Modified: trunk/LWJGL/src/java/org/lwjgl/util/generator/JavaMethodsGenerator.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/util/generator/JavaMethodsGenerator.java 2007-05-20 17:51:28 UTC (rev 2826) +++ trunk/LWJGL/src/java/org/lwjgl/util/generator/JavaMethodsGenerator.java 2007-05-22 22:30:21 UTC (rev 2827) @@ -401,13 +401,21 @@ private static void printParameterCaching(PrintWriter writer, InterfaceDeclaration interface_decl, MethodDeclaration method, Mode mode) { for (ParameterDeclaration param : method.getParameters()) { Class java_type = Utils.getJavaType(param.getType()); + CachedReference cachedReference = param.getAnnotation(CachedReference.class); if (Buffer.class.isAssignableFrom(java_type) && - param.getAnnotation(CachedReference.class) != null && + cachedReference != null && (mode != Mode.BUFFEROBJECT || param.getAnnotation(BufferObject.class) == null) && param.getAnnotation(Result.class) == null) { writer.print("\t\t" + Utils.CHECKS_CLASS_NAME + ".getReferences(caps)."); - writer.print(Utils.getReferenceName(interface_decl, method, param) + " = "); - writer.println(param.getSimpleName() + ";"); + if(cachedReference.name().length() > 0) { + writer.print(cachedReference.name()); + } else { + writer.print(Utils.getReferenceName(interface_decl, method, param)); + } + if(cachedReference.index().length() > 0) { + writer.print("[" + cachedReference.index() + "]"); + } + writer.println(" = " + param.getSimpleName() + ";"); } } } Modified: trunk/LWJGL/src/java/org/lwjgl/util/generator/ReferencesGeneratorProcessorFactory.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/util/generator/ReferencesGeneratorProcessorFactory.java 2007-05-20 17:51:28 UTC (rev 2826) +++ trunk/LWJGL/src/java/org/lwjgl/util/generator/ReferencesGeneratorProcessorFactory.java 2007-05-22 22:30:21 UTC (rev 2827) @@ -108,7 +108,7 @@ private static void generateClearsFromParameters(PrintWriter writer, InterfaceDeclaration interface_decl, MethodDeclaration method) { for (ParameterDeclaration param : method.getParameters()) { CachedReference cached_reference_annotation = param.getAnnotation(CachedReference.class); - if (cached_reference_annotation != null) { + if (cached_reference_annotation != null && cached_reference_annotation.name().length() == 0) { Class nio_type = Utils.getNIOBufferType(param.getType()); String reference_name = Utils.getReferenceName(interface_decl, method, param); writer.println("\t\tthis." + reference_name + " = null;"); @@ -119,7 +119,7 @@ private static void generateCopiesFromParameters(PrintWriter writer, InterfaceDeclaration interface_decl, MethodDeclaration method) { for (ParameterDeclaration param : method.getParameters()) { CachedReference cached_reference_annotation = param.getAnnotation(CachedReference.class); - if (cached_reference_annotation != null) { + if (cached_reference_annotation != null && cached_reference_annotation.name().length() == 0) { Class nio_type = Utils.getNIOBufferType(param.getType()); String reference_name = Utils.getReferenceName(interface_decl, method, param); writer.print("\t\tthis." + reference_name + " = "); @@ -143,7 +143,7 @@ private static void generateReferencesFromParameters(PrintWriter writer, InterfaceDeclaration interface_decl, MethodDeclaration method) { for (ParameterDeclaration param : method.getParameters()) { CachedReference cached_reference_annotation = param.getAnnotation(CachedReference.class); - if (cached_reference_annotation != null) { + if (cached_reference_annotation != null && cached_reference_annotation.name().length() == 0) { Class nio_type = Utils.getNIOBufferType(param.getType()); if (nio_type == null) throw new RuntimeException(param + " in method " + method + " in " + interface_decl + " is annotated with " @@ -167,6 +167,9 @@ writer.println("package org.lwjgl.opengl;"); writer.println(); writer.println("class " + REFERENCES_CLASS_NAME + " extends BaseReferences {"); + writer.println("\t" + REFERENCES_CLASS_NAME + "(ContextCapabilities caps) {"); + writer.println("\t\tsuper(caps);"); + writer.println("\t}"); DeclarationFilter filter = DeclarationFilter.getFilter(InterfaceDeclaration.class); Collection<TypeDeclaration> interface_decls = filter.filter(env.getSpecifiedTypeDeclarations()); for (TypeDeclaration typedecl : interface_decls) { Modified: trunk/LWJGL/src/templates/org/lwjgl/opengl/ARB_vertex_program.java =================================================================== --- trunk/LWJGL/src/templates/org/lwjgl/opengl/ARB_vertex_program.java 2007-05-20 17:51:28 UTC (rev 2826) +++ trunk/LWJGL/src/templates/org/lwjgl/opengl/ARB_vertex_program.java 2007-05-22 22:30:21 UTC (rev 2827) @@ -112,7 +112,7 @@ void glVertexAttrib4NubARB(@GLuint int index, @GLubyte byte x, @GLubyte byte y, @GLubyte byte z, @GLubyte byte w); void glVertexAttribPointerARB(@GLuint int index, int size, @AutoType("buffer") @GLenum int type, boolean normalized, @GLsizei int stride, - @CachedReference + @CachedReference(index="index",name="glVertexAttribPointer_buffer") @BufferObject(BufferKind.ArrayVBO) @Check @Const Modified: trunk/LWJGL/src/templates/org/lwjgl/opengl/ARB_vertex_shader.java =================================================================== --- trunk/LWJGL/src/templates/org/lwjgl/opengl/ARB_vertex_shader.java 2007-05-20 17:51:28 UTC (rev 2826) +++ trunk/LWJGL/src/templates/org/lwjgl/opengl/ARB_vertex_shader.java 2007-05-22 22:30:21 UTC (rev 2827) @@ -122,7 +122,7 @@ void glVertexAttrib4NubARB(@GLuint int index, @GLubyte byte x, @GLubyte byte y, @GLubyte byte z, @GLubyte byte w); void glVertexAttribPointerARB(@GLuint int index, int size, @AutoType("buffer") @GLenum int type, boolean normalized, @GLsizei int stride, - @CachedReference + @CachedReference(index="index",name="glVertexAttribPointer_buffer") @BufferObject(BufferKind.ArrayVBO) @Check @Const Modified: trunk/LWJGL/src/templates/org/lwjgl/opengl/GL11.java =================================================================== --- trunk/LWJGL/src/templates/org/lwjgl/opengl/GL11.java 2007-05-20 17:51:28 UTC (rev 2826) +++ trunk/LWJGL/src/templates/org/lwjgl/opengl/GL11.java 2007-05-22 22:30:21 UTC (rev 2827) @@ -1336,7 +1336,7 @@ void glTexEnviv(@GLenum int target, @GLenum int pname, @Check("4") @Const IntBuffer params); void glTexCoordPointer(int size, @AutoType("pointer") @GLenum int type, @GLsizei int stride, - @CachedReference + @CachedReference(index="GLChecks.getReferences(caps).glClientActiveTexture", name="glTexCoordPointer_buffer") @BufferObject(BufferKind.ArrayVBO) @Check @Const Modified: trunk/LWJGL/src/templates/org/lwjgl/opengl/GL13.java =================================================================== --- trunk/LWJGL/src/templates/org/lwjgl/opengl/GL13.java 2007-05-20 17:51:28 UTC (rev 2826) +++ trunk/LWJGL/src/templates/org/lwjgl/opengl/GL13.java 2007-05-22 22:30:21 UTC (rev 2827) @@ -148,6 +148,7 @@ void glActiveTexture(@GLenum int texture); + @Code("\t\tGLChecks.getReferences(caps).glClientActiveTexture = texture - GL_TEXTURE0;") void glClientActiveTexture(@GLenum int texture); void glCompressedTexImage1D(@GLenum int target, int level, @GLenum int internalformat, @GLsizei int width, int border, @AutoSize("data") @GLsizei int imageSize, Modified: trunk/LWJGL/src/templates/org/lwjgl/opengl/GL20.java =================================================================== --- trunk/LWJGL/src/templates/org/lwjgl/opengl/GL20.java 2007-05-20 17:51:28 UTC (rev 2826) +++ trunk/LWJGL/src/templates/org/lwjgl/opengl/GL20.java 2007-05-22 22:30:21 UTC (rev 2827) @@ -278,7 +278,7 @@ void glVertexAttrib4Nub(@GLuint int index, @GLubyte byte x, @GLubyte byte y, @GLubyte byte z, @GLubyte byte w); void glVertexAttribPointer(@GLuint int index, int size, @AutoType("buffer") @GLenum int type, boolean normalized, @GLsizei int stride, - @CachedReference + @CachedReference(index="index",name="glVertexAttribPointer_buffer") @BufferObject(BufferKind.ArrayVBO) @Check @Const Modified: trunk/LWJGL/src/templates/org/lwjgl/opengl/NV_vertex_program.java =================================================================== --- trunk/LWJGL/src/templates/org/lwjgl/opengl/NV_vertex_program.java 2007-05-20 17:51:28 UTC (rev 2826) +++ trunk/LWJGL/src/templates/org/lwjgl/opengl/NV_vertex_program.java 2007-05-22 22:30:21 UTC (rev 2827) @@ -228,7 +228,7 @@ void glTrackMatrixNV(@GLenum int target, @GLuint int address, @GLenum int matrix, @GLenum int transform); void glVertexAttribPointerNV(@GLuint int index, int size, @GLenum int type, @GLsizei int stride, - @CachedReference + @CachedReference(index="index",name="glVertexAttribPointer_buffer") @BufferObject(BufferKind.ArrayVBO) @Check @Const This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |