diff options
author | Sven Gothel <[email protected]> | 2015-03-11 15:33:10 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2015-03-11 15:33:10 +0100 |
commit | 68391b118e93170c568edc21edad7f6b0c1f97a3 (patch) | |
tree | c0fd4e18d0bca4f1ca0875bf2d1d0df430afd09d /src/jogl | |
parent | cd92c17175db0c3a3a04b5b327cfcb887bf8a7d7 (diff) |
Bug 1135: Complete GLBufferObjectTracker for GL 4.5 using GlueGen's DelegateImplementation/ReturnsOpaque (Bug 1144)
Using GlueGen's new DelegateImplementation/ReturnsOpaque feature (Bug 1144)
allows us to drop manually C implementation stubs, while simply delegating
into the renamed private generated variant using the manual stub.
Completed glBufferStorage and glNamedBufferStorage for GL 4.4
while subsuming DSA's of GL 4.5 and GL_EXT_direct_state_access
(only the single functions, otherwise extension is not compatible).
Diffstat (limited to 'src/jogl')
4 files changed, 58 insertions, 54 deletions
diff --git a/src/jogl/classes/com/jogamp/gluegen/opengl/GLConfiguration.java b/src/jogl/classes/com/jogamp/gluegen/opengl/GLConfiguration.java index 878d7da37..d6f72ee29 100644 --- a/src/jogl/classes/com/jogamp/gluegen/opengl/GLConfiguration.java +++ b/src/jogl/classes/com/jogamp/gluegen/opengl/GLConfiguration.java @@ -290,10 +290,10 @@ public class GLConfiguration extends ProcAddressConfiguration { } } if( ignoreExtension ) { - LOG.log(INFO, getASTLocusTag(symbol), "Ignored symbol {0} of all extensions <{1}>", symbol.getAliasedString(), symExtensionNames); + LOG.log(INFO, getASTLocusTag(symbol), "Ignored symbol {0} of all extensions <{1}>", symbol, symExtensionNames); } else if( ignoredSymExtensionNames.size() > 0 ) { LOG.log(INFO, getASTLocusTag(symbol), "Not ignored symbol {0}; Ignored in <{1}>, but active in <{2}>", - symbol.getAliasedString(), ignoredSymExtensionNames, notIgnoredSymExtensionNames); + symbol, ignoredSymExtensionNames, notIgnoredSymExtensionNames); } } if( !ignoreExtension ) { @@ -307,14 +307,14 @@ public class GLConfiguration extends ProcAddressConfiguration { extSuffix = GLNameResolver.getExtensionSuffix(name, isGLFunc); if (getDropUniqVendorExtensions(extSuffix)) { LOG.log(INFO, getASTLocusTag(symbol), "Ignore UniqVendorEXT: {0}, vendor {1}, isGLFunc {2}, isGLEnum {3}", - symbol.getAliasedString(), extSuffix, isGLFunc, isGLEnum); + symbol, extSuffix, isGLFunc, isGLEnum); ignoreExtension = true; } } } if (!ignoreExtension) { LOG.log(INFO, getASTLocusTag(symbol), "Not ignored UniqVendorEXT: {0}, vendor {1}, isGLFunc {2}, isGLEnum {3}", - symbol.getAliasedString(), extSuffix, isGLFunc, isGLEnum); + symbol, extSuffix, isGLFunc, isGLEnum); } } if( ignoreExtension ) { @@ -326,8 +326,7 @@ public class GLConfiguration extends ProcAddressConfiguration { for(final Iterator<String> i=symExtensionNames.iterator(); i.hasNext(); ) { final String extensionName = i.next(); if ( extensionName != null && forcedExtensions.contains(extensionName) ) { - LOG.log(INFO, getASTLocusTag(symbol), "Not ignored symbol {0} of extension <{1}>", - symbol.getAliasedString(), extensionName); + LOG.log(INFO, getASTLocusTag(symbol), "Not ignored symbol {0} of extension <{1}>", symbol, extensionName); return true; } } diff --git a/src/jogl/classes/com/jogamp/gluegen/opengl/nativesig/NativeSignatureEmitter.java b/src/jogl/classes/com/jogamp/gluegen/opengl/nativesig/NativeSignatureEmitter.java index 44e52e2fa..c1c2aa12b 100644 --- a/src/jogl/classes/com/jogamp/gluegen/opengl/nativesig/NativeSignatureEmitter.java +++ b/src/jogl/classes/com/jogamp/gluegen/opengl/nativesig/NativeSignatureEmitter.java @@ -51,7 +51,6 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Set; /** * Emitter producing NativeSignature attributes. @@ -61,10 +60,10 @@ import java.util.Set; public class NativeSignatureEmitter extends GLEmitter { @Override - protected List<? extends FunctionEmitter> generateMethodBindingEmitters(final Set<MethodBinding> methodBindingSet, final FunctionSymbol sym) throws Exception { + protected List<? extends FunctionEmitter> generateMethodBindingEmitters(final FunctionSymbol sym) throws Exception { // Allow superclass to do most of the work for us - final List<? extends FunctionEmitter> res = super.generateMethodBindingEmitters(methodBindingSet, sym); + final List<? extends FunctionEmitter> res = super.generateMethodBindingEmitters(sym); // Filter out all non-JavaMethodBindingEmitters for (final Iterator<? extends FunctionEmitter> iter = res.iterator(); iter.hasNext();) { diff --git a/src/jogl/classes/com/jogamp/opengl/GLBufferStorage.java b/src/jogl/classes/com/jogamp/opengl/GLBufferStorage.java index 5db97d42f..35ecf8799 100644 --- a/src/jogl/classes/com/jogamp/opengl/GLBufferStorage.java +++ b/src/jogl/classes/com/jogamp/opengl/GLBufferStorage.java @@ -27,6 +27,7 @@ */ package com.jogamp.opengl; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.IntBuffer; @@ -40,9 +41,10 @@ import java.nio.IntBuffer; * <p> * Buffer storage is created via: * <ul> - * <li><code>glBufferStorage</code> - storage creation with target</li> - * <li>{@link GL#glBufferData(int, long, java.nio.Buffer, int)} - storage recreation with target</li> - * <li>{@link GL2#glNamedBufferDataEXT(int, long, java.nio.Buffer, int)} - storage recreation, direct</li> + * <li>{@link GL#glBufferData(int, long, java.nio.Buffer, int)} - storage creation via target</li> + * <li>{@link GL2#glNamedBufferData(int, long, java.nio.Buffer, int)} - storage creation, direct</li> + * <li>{@link GL4#glBufferStorage(int, long, Buffer, int)} - storage creation via target</li> + * <li>{@link GL4#glNamedBufferStorage(int, long, Buffer, int)} - storage creation, direct</li> * </ul> * Note that storage <i>recreation</i> as mentioned above also invalidate a previous storage instance, * i.e. disposed the buffer's current storage if exist and attaches a new storage instance. @@ -52,7 +54,9 @@ import java.nio.IntBuffer; * <ul> * <li>{@link GL#glDeleteBuffers(int, IntBuffer)} - explicit, direct, via {@link #notifyBuffersDeleted(int, IntBuffer)} or {@link #notifyBuffersDeleted(int, int[], int)}</li> * <li>{@link GL#glBufferData(int, long, java.nio.Buffer, int)} - storage recreation via target</li> - * <li>{@link GL2#glNamedBufferDataEXT(int, long, java.nio.Buffer, int)} - storage recreation, direct</li> + * <li>{@link GL2#glNamedBufferData(int, long, java.nio.Buffer, int)} - storage recreation, direct</li> + * <li>{@link GL4#glBufferStorage(int, long, Buffer, int)} - storage recreation via target</li> + * <li>{@link GL4#glNamedBufferStorage(int, long, Buffer, int)} - storage recreation, direct</li> * </ul> * </p> * <p> @@ -112,7 +116,7 @@ public abstract class GLBufferStorage { * created via {@link GL#glBufferData(int, long, java.nio.Buffer, int)}. * <p> * Returns <code>false</code> if buffer's storage is immutable, i.e. - * created via <code>glBufferStorage</code>. FIXME: Add GL 4.4 support! + * created via {@link GL4#glBufferStorage(int, long, Buffer, int)}. * </p> * @return */ diff --git a/src/jogl/classes/jogamp/opengl/GLBufferObjectTracker.java b/src/jogl/classes/jogamp/opengl/GLBufferObjectTracker.java index 2fa282d6e..89b23139f 100644 --- a/src/jogl/classes/jogamp/opengl/GLBufferObjectTracker.java +++ b/src/jogl/classes/jogamp/opengl/GLBufferObjectTracker.java @@ -47,9 +47,10 @@ import com.jogamp.common.util.PropertyAccess; * <p> * Buffer storage is created via * <ul> - * <li><code>glBufferStorage</code> - storage creation with target via {@link #createBufferStorage(GLBufferStateTracker, GL, int, long, Buffer, int, int, CreateStorageDispatch, long)}</li> * <li>{@link GL#glBufferData(int, long, java.nio.Buffer, int)} - storage recreation with target via {@link #createBufferStorage(GLBufferStateTracker, GL, int, long, Buffer, int, int, CreateStorageDispatch, long)}</li> - * <li>{@link GL2#glNamedBufferDataEXT(int, long, java.nio.Buffer, int)} - storage recreation, direct, via {@link #createBufferStorage(GL, int, long, Buffer, int, CreateStorageDispatch, long)}</li> + * <li>{@link GL2#glNamedBufferData(int, long, java.nio.Buffer, int)} - storage recreation, direct, via {@link #createBufferStorage(GL, int, long, Buffer, int, CreateStorageDispatch, long)}</li> + * <li>{@link GL4#glBufferStorage(int, long, Buffer, int)} - storage creation with target via {@link #createBufferStorage(GLBufferStateTracker, GL, int, long, Buffer, int, int, CreateStorageDispatch, long)}</li> + * <li>{@link GL4#glNamedBufferStorage(int, long, Buffer, int)} - storage recreation, direct, via {@link #createBufferStorage(GL, int, long, Buffer, int, CreateStorageDispatch, long)}</li> * </ul> * Note that storage <i>recreation</i> as mentioned above also invalidate a previous storage instance, * i.e. disposed the buffer's current storage if exist and attaches a new storage instance. @@ -59,7 +60,9 @@ import com.jogamp.common.util.PropertyAccess; * <ul> * <li>{@link GL#glDeleteBuffers(int, IntBuffer)} - explicit, direct, via {@link #notifyBuffersDeleted(int, IntBuffer)} or {@link #notifyBuffersDeleted(int, int[], int)}</li> * <li>{@link GL#glBufferData(int, long, java.nio.Buffer, int)} - storage recreation via target</li> - * <li>{@link GL2#glNamedBufferDataEXT(int, long, java.nio.Buffer, int)} - storage recreation, direct</li> + * <li>{@link GL2#glNamedBufferData(int, long, java.nio.Buffer, int)} - storage recreation, direct</li> + * <li>{@link GL4#glBufferStorage(int, long, Buffer, int)} - storage recreation via target</li> + * <li>{@link GL4#glNamedBufferStorage(int, long, Buffer, int)} - storage recreation, direct</li> * </ul> * </p> * @@ -130,18 +133,19 @@ public class GLBufferObjectTracker { } public static interface CreateStorageDispatch { - void create(final int targetOrBufferName, final long size, final Buffer data, final int mutableUsageOrImmutableFlags, final long glProcAddress); + void create(final int targetOrBufferName, final long size, final Buffer data, final int mutableUsageOrImmutableFlags); } /** - * Must be called when [re]creating the GL buffer object via <code>glBufferStorage</code> and {@link GL#glBufferData(int, long, java.nio.Buffer, int)}, + * Must be called when [re]creating the GL buffer object via {@link GL#glBufferData(int, long, java.nio.Buffer, int)} + * and {@link GL4#glBufferStorage(int, long, Buffer, int)}, * i.e. implies destruction of the buffer. * * @param bufferStateTracker * @param caller * @param target * @param size - * @param mutableUsage <code>glBufferData</code>, <code>glNamedBufferDataEXT</code> usage + * @param mutableUsage <code>glBufferData</code>, <code>glNamedBufferData</code> usage * @param immutableFlags <code>glBufferStorage</code> flags * @throws GLException if buffer is not bound to target * @throws GLException if size is less-or-eqaul zero for <code>glBufferStorage</code>, or size is less-than zero otherwise @@ -149,7 +153,7 @@ public class GLBufferObjectTracker { */ public synchronized final void createBufferStorage(final GLBufferStateTracker bufferStateTracker, final GL caller, final int target, final long size, final Buffer data, final int mutableUsage, final int immutableFlags, - final CreateStorageDispatch dispatch, final long glProcAddress) throws GLException { + final CreateStorageDispatch dispatch) throws GLException { final int glerrPre = caller.glGetError(); // clear if (DEBUG && GL.GL_NO_ERROR != glerrPre) { System.err.printf("%s.%s glerr-pre 0x%X%n", msgClazzName, msgCreateBound, glerrPre); @@ -159,13 +163,13 @@ public class GLBufferObjectTracker { throw new GLException(String.format("%s: Buffer for target 0x%X not bound", GL_INVALID_OPERATION, target)); } final boolean mutableBuffer = 0 != mutableUsage; - final boolean invalidSize = ( mutableBuffer && 0 > size ) // glBufferData, glNamedBufferDataEXT + final boolean invalidSize = ( mutableBuffer && 0 > size ) // glBufferData, glNamedBufferData || ( !mutableBuffer && 0 >= size ); // glBufferStorage if( invalidSize ) { throw new GLException(String.format("%s: Invalid size %d for buffer %d on target 0x%X", GL_INVALID_VALUE, size, bufferName, target)); } - dispatch.create(target, size, data, mutableBuffer ? mutableUsage : immutableFlags, glProcAddress); + dispatch.create(target, size, data, mutableBuffer ? mutableUsage : immutableFlags); final int glerrPost = caller.glGetError(); // be safe, catch failure! if(GL.GL_NO_ERROR != glerrPost) { throw new GLException(String.format("GL-Error 0x%X while creating %s storage for target 0x%X -> buffer %d of size %d with data %s", @@ -187,7 +191,8 @@ public class GLBufferObjectTracker { } /** - * Must be called when [re]creating the GL buffer object via {@link GL2#glNamedBufferDataEXT(int, long, java.nio.Buffer, int)}, + * Must be called when [re]creating the GL buffer object via {@link GL2#glNamedBufferData(int, long, java.nio.Buffer, int)} + * and {@link GL4#glNamedBufferStorage(int, long, Buffer, int)}, * i.e. implies destruction of the buffer. * * @param bufferName @@ -198,19 +203,19 @@ public class GLBufferObjectTracker { */ public synchronized final void createBufferStorage(final GL caller, final int bufferName, final long size, final Buffer data, final int mutableUsage, final int immutableFlags, - final CreateStorageDispatch dispatch, final long glProcAddress) throws GLException { + final CreateStorageDispatch dispatch) throws GLException { final int glerrPre = caller.glGetError(); // clear if (DEBUG && GL.GL_NO_ERROR != glerrPre) { System.err.printf("%s.%s glerr-pre 0x%X%n", msgClazzName, msgCreateNamed, glerrPre); } - if ( 0 > size ) { // glBufferData, glNamedBufferDataEXT + if ( 0 > size ) { // glBufferData, glNamedBufferData throw new GLException(String.format("%s: Invalid size %d for buffer %d", GL_INVALID_VALUE, size, bufferName)); } final boolean mutableBuffer = 0 != mutableUsage; if( !mutableBuffer ) { - throw new InternalError("Immutable glNamedBufferStorageEXT not supported yet"); + throw new InternalError("Immutable glNamedBufferStorage not supported yet"); } - dispatch.create(bufferName, size, data, mutableUsage, glProcAddress); + dispatch.create(bufferName, size, data, mutableUsage); final int glerrPost = caller.glGetError(); // be safe, catch failure! if(GL.GL_NO_ERROR != glerrPost) { throw new GLException(String.format("GL-Error 0x%X while creating %s storage for buffer %d of size %d with data %s", @@ -278,10 +283,10 @@ public class GLBufferObjectTracker { ByteBuffer allocNioByteBuffer(final long addr, final long length); } public static interface MapBufferRangeDispatch extends MapBufferDispatch { - long mapBuffer(final int targetOrBufferName, final long offset, final long length, final int access, final long glProcAddress); + long mapBuffer(final int targetOrBufferName, final long offset, final long length, final int access); } public static interface MapBufferAllDispatch extends MapBufferDispatch { - long mapBuffer(final int targetOrBufferName, final int access, final long glProcAddress); + long mapBuffer(final int targetOrBufferName, final int access); } private static final String GL_INVALID_OPERATION = "GL_INVALID_OPERATION"; @@ -296,8 +301,8 @@ public class GLBufferObjectTracker { */ public synchronized final GLBufferStorage mapBuffer(final GLBufferStateTracker bufferStateTracker, final GL caller, final int target, final int access, - final MapBufferAllDispatch dispatch, final long glProcAddress) throws GLException { - return this.mapBufferImpl(bufferStateTracker, caller, target, false /* useRange */, 0 /* offset */, 0 /* length */, access, dispatch, glProcAddress); + final MapBufferAllDispatch dispatch) throws GLException { + return this.mapBufferImpl(bufferStateTracker, caller, target, false /* useRange */, 0 /* offset */, 0 /* length */, access, dispatch); } /** * Must be called when mapping GL buffer objects via {@link GL#mapBufferRange(int, long, long, int)}. @@ -309,8 +314,8 @@ public class GLBufferObjectTracker { */ public synchronized final GLBufferStorage mapBuffer(final GLBufferStateTracker bufferStateTracker, final GL caller, final int target, final long offset, final long length, final int access, - final MapBufferRangeDispatch dispatch, final long glProcAddress) throws GLException { - return this.mapBufferImpl(bufferStateTracker, caller, target, true /* useRange */, offset, length, access, dispatch, glProcAddress); + final MapBufferRangeDispatch dispatch) throws GLException { + return this.mapBufferImpl(bufferStateTracker, caller, target, true /* useRange */, offset, length, access, dispatch); } /** * Must be called when mapping GL buffer objects via {@link GL2#mapNamedBuffer(int, int)}. @@ -318,9 +323,8 @@ public class GLBufferObjectTracker { * @throws GLException if buffer is already mapped * @throws GLException if buffer has invalid store size, i.e. less-than zero */ - public synchronized final GLBufferStorage mapBuffer(final int bufferName, final int access, final MapBufferAllDispatch dispatch, - final long glProcAddress) throws GLException { - return this.mapBufferImpl(0 /* target */, bufferName, true /* isNamedBuffer */, false /* useRange */, 0 /* offset */, 0 /* length */, access, dispatch, glProcAddress); + public synchronized final GLBufferStorage mapBuffer(final int bufferName, final int access, final MapBufferAllDispatch dispatch) throws GLException { + return this.mapBufferImpl(0 /* target */, bufferName, true /* isNamedBuffer */, false /* useRange */, 0 /* offset */, 0 /* length */, access, dispatch); } /** * Must be called when mapping GL buffer objects via {@link GL2#mapNamedBufferRange(int, long, long, int)}. @@ -329,9 +333,8 @@ public class GLBufferObjectTracker { * @throws GLException if buffer has invalid store size, i.e. less-than zero * @throws GLException if buffer mapping range does not fit, incl. offset */ - public synchronized final GLBufferStorage mapBuffer(final int bufferName, final long offset, final long length, final int access, final MapBufferRangeDispatch dispatch, - final long glProcAddress) throws GLException { - return this.mapBufferImpl(0 /* target */, bufferName, true /* isNamedBuffer */, true /* useRange */, offset, length, access, dispatch, glProcAddress); + public synchronized final GLBufferStorage mapBuffer(final int bufferName, final long offset, final long length, final int access, final MapBufferRangeDispatch dispatch) throws GLException { + return this.mapBufferImpl(0 /* target */, bufferName, true /* isNamedBuffer */, true /* useRange */, offset, length, access, dispatch); } /** * @throws GLException if buffer is not bound to target @@ -343,12 +346,12 @@ public class GLBufferObjectTracker { private synchronized final GLBufferStorage mapBufferImpl(final GLBufferStateTracker bufferStateTracker, final GL caller, final int target, final boolean useRange, final long offset, final long length, final int access, - final MapBufferDispatch dispatch, final long glProcAddress) throws GLException { + final MapBufferDispatch dispatch) throws GLException { final int bufferName = bufferStateTracker.getBoundBufferObject(target, caller); if( 0 == bufferName ) { throw new GLException(String.format("%s.%s: %s Buffer for target 0x%X not bound", msgClazzName, msgMapBuffer, GL_INVALID_OPERATION, target)); } - return this.mapBufferImpl(target, bufferName, false /* isNamedBuffer */, useRange, offset, length, access, dispatch, glProcAddress); + return this.mapBufferImpl(target, bufferName, false /* isNamedBuffer */, useRange, offset, length, access, dispatch); } /** * <p> @@ -365,8 +368,7 @@ public class GLBufferObjectTracker { * @throws GLException if buffer mapping range does not fit, incl. optional offset */ private synchronized final GLBufferStorage mapBufferImpl(final int target, final int bufferName, final boolean isNamedBuffer, final boolean useRange, long offset, - long length, final int access, final MapBufferDispatch dispatch, - final long glProcAddress) throws GLException { + long length, final int access, final MapBufferDispatch dispatch) throws GLException { final GLBufferStorageImpl store = (GLBufferStorageImpl)bufferName2StorageMap.get(bufferName); if ( null == store ) { throw new GLException("Buffer with name "+bufferName+" not tracked"); @@ -394,15 +396,15 @@ public class GLBufferObjectTracker { final long addr; if( isNamedBuffer ) { if( useRange ) { - addr = ((MapBufferRangeDispatch)dispatch).mapBuffer(bufferName, offset, length, access, glProcAddress); + addr = ((MapBufferRangeDispatch)dispatch).mapBuffer(bufferName, offset, length, access); } else { - addr = ((MapBufferAllDispatch)dispatch).mapBuffer(bufferName, access, glProcAddress); + addr = ((MapBufferAllDispatch)dispatch).mapBuffer(bufferName, access); } } else { if( useRange ) { - addr = ((MapBufferRangeDispatch)dispatch).mapBuffer(target, offset, length, access, glProcAddress); + addr = ((MapBufferRangeDispatch)dispatch).mapBuffer(target, offset, length, access); } else { - addr = ((MapBufferAllDispatch)dispatch).mapBuffer(target, access, glProcAddress); + addr = ((MapBufferAllDispatch)dispatch).mapBuffer(target, access); } } // GL's map-buffer implementation always returns NULL on error, @@ -425,7 +427,7 @@ public class GLBufferObjectTracker { } public static interface UnmapBufferDispatch { - boolean unmap(final int targetOrBufferName, final long glProcAddress); + boolean unmap(final int targetOrBufferName); } /** @@ -437,7 +439,7 @@ public class GLBufferObjectTracker { */ public synchronized final boolean unmapBuffer(final GLBufferStateTracker bufferStateTracker, final GL caller, final int target, - final UnmapBufferDispatch dispatch, final long glProcAddress) { + final UnmapBufferDispatch dispatch) { final int bufferName = bufferStateTracker.getBoundBufferObject(target, caller); final GLBufferStorageImpl store; if( 0 == bufferName ) { @@ -453,7 +455,7 @@ public class GLBufferObjectTracker { ExceptionUtils.dumpStack(System.err); } } - final boolean res = dispatch.unmap(target, glProcAddress); + final boolean res = dispatch.unmap(target); if( res && null != store ) { store.setMappedBuffer(null); } @@ -466,20 +468,20 @@ public class GLBufferObjectTracker { return res; } /** - * Must be called when unmapping GL buffer objects via {@link GL2#glUnmapNamedBufferEXT(int)}. + * Must be called when unmapping GL buffer objects via {@link GL2#glUnmapNamedBuffer(int)}. * <p> * Only clear mapped buffer reference of {@link GLBufferStorage} * if native unmapping was successful. * </p> */ public synchronized final boolean unmapBuffer(final int bufferName, - final UnmapBufferDispatch dispatch, final long glProcAddress) { + final UnmapBufferDispatch dispatch) { final GLBufferStorageImpl store = (GLBufferStorageImpl) bufferName2StorageMap.get(bufferName); if (DEBUG && null == store ) { System.err.printf("%s: %s.%s: Buffer %d not tracked%n", warning, msgClazzName, msgUnmapped, bufferName); ExceptionUtils.dumpStack(System.err); } - final boolean res = dispatch.unmap(bufferName, glProcAddress); + final boolean res = dispatch.unmap(bufferName); if( res && null != store ) { store.setMappedBuffer(null); } |