aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenneth Russel <[email protected]>2005-10-24 19:21:03 +0000
committerKenneth Russel <[email protected]>2005-10-24 19:21:03 +0000
commitd6f9dbc493df725d3d574403549de142c5e1222a (patch)
tree8eb152b0627f8d1897a27c5204d6ce2efb4963e4 /src
parent42843c3290d64c41c9c8a18b93f5ad3c00d35ddc (diff)
Merged JSR-231 branch on to the main JOGL trunk. The main trunk now
contains the evolving JSR-231 Reference Implementation and the JSR-231 branch is permanently closed. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@401 232f8b59-042b-4e1e-8c03-345bb8c30851
Diffstat (limited to 'src')
-rw-r--r--src/classes/com/sun/gluegen/ArrayTypes.java (renamed from src/net/java/games/gluegen/ArrayTypes.java)2
-rw-r--r--src/classes/com/sun/gluegen/CMethodBindingEmitter.java (renamed from src/net/java/games/gluegen/CMethodBindingEmitter.java)707
-rw-r--r--src/classes/com/sun/gluegen/CodeGenUtils.java (renamed from src/net/java/games/gluegen/CodeGenUtils.java)4
-rw-r--r--src/classes/com/sun/gluegen/CommentEmitter.java (renamed from src/net/java/games/gluegen/CommentEmitter.java)2
-rw-r--r--src/classes/com/sun/gluegen/DebugEmitter.java (renamed from src/net/java/games/gluegen/DebugEmitter.java)4
-rw-r--r--src/classes/com/sun/gluegen/FunctionEmitter.java (renamed from src/net/java/games/gluegen/FunctionEmitter.java)2
-rw-r--r--src/classes/com/sun/gluegen/GlueEmitter.java (renamed from src/net/java/games/gluegen/GlueEmitter.java)4
-rw-r--r--src/classes/com/sun/gluegen/GlueEmitterControls.java (renamed from src/net/java/games/gluegen/GlueEmitterControls.java)6
-rw-r--r--src/classes/com/sun/gluegen/GlueGen.java (renamed from src/net/java/games/gluegen/GlueGen.java)19
-rw-r--r--src/classes/com/sun/gluegen/JavaConfiguration.java (renamed from src/net/java/games/gluegen/JavaConfiguration.java)416
-rw-r--r--src/classes/com/sun/gluegen/JavaEmitter.java (renamed from src/net/java/games/gluegen/JavaEmitter.java)774
-rw-r--r--src/classes/com/sun/gluegen/JavaMethodBindingEmitter.java720
-rw-r--r--src/classes/com/sun/gluegen/JavaType.java (renamed from src/net/java/games/gluegen/JavaType.java)177
-rw-r--r--src/classes/com/sun/gluegen/MethodBinding.java (renamed from src/net/java/games/gluegen/MethodBinding.java)303
-rw-r--r--src/classes/com/sun/gluegen/ReferencedStructs.java (renamed from src/net/java/games/gluegen/ReferencedStructs.java)4
-rw-r--r--src/classes/com/sun/gluegen/StructLayout.java (renamed from src/net/java/games/gluegen/StructLayout.java)5
-rw-r--r--src/classes/com/sun/gluegen/TypeInfo.java (renamed from src/net/java/games/gluegen/TypeInfo.java)2
-rw-r--r--src/classes/com/sun/gluegen/ant/GlueGenTask.java (renamed from src/net/java/games/gluegen/ant/GlueGenTask.java)14
-rw-r--r--src/classes/com/sun/gluegen/ant/StaticGLGenTask.java (renamed from src/net/java/games/gluegen/ant/StaticGLGenTask.java)14
-rw-r--r--src/classes/com/sun/gluegen/cgram/CSymbolTable.java (renamed from src/net/java/games/gluegen/cgram/CSymbolTable.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/CToken.java (renamed from src/net/java/games/gluegen/cgram/CToken.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/Define.java (renamed from src/net/java/games/gluegen/cgram/Define.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/GnuCEmitter.g (renamed from src/net/java/games/gluegen/cgram/GnuCEmitter.g)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/GnuCParser.g (renamed from src/net/java/games/gluegen/cgram/GnuCParser.g)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/GnuCTreeParser.g (renamed from src/net/java/games/gluegen/cgram/GnuCTreeParser.g)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/HeaderParser.g (renamed from src/net/java/games/gluegen/cgram/HeaderParser.g)4
-rw-r--r--src/classes/com/sun/gluegen/cgram/LineObject.java (renamed from src/net/java/games/gluegen/cgram/LineObject.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/PreprocessorInfoChannel.java (renamed from src/net/java/games/gluegen/cgram/PreprocessorInfoChannel.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/StdCParser.g (renamed from src/net/java/games/gluegen/cgram/StdCParser.g)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/TNode.java (renamed from src/net/java/games/gluegen/cgram/TNode.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/TNodeFactory.java (renamed from src/net/java/games/gluegen/cgram/TNodeFactory.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/ArrayType.java (renamed from src/net/java/games/gluegen/cgram/types/ArrayType.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/BitType.java (renamed from src/net/java/games/gluegen/cgram/types/BitType.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/CVAttributes.java (renamed from src/net/java/games/gluegen/cgram/types/CVAttributes.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/CompoundType.java (renamed from src/net/java/games/gluegen/cgram/types/CompoundType.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/CompoundTypeKind.java (renamed from src/net/java/games/gluegen/cgram/types/CompoundTypeKind.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/DoubleType.java (renamed from src/net/java/games/gluegen/cgram/types/DoubleType.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/EnumType.java (renamed from src/net/java/games/gluegen/cgram/types/EnumType.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/Field.java (renamed from src/net/java/games/gluegen/cgram/types/Field.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/FloatType.java (renamed from src/net/java/games/gluegen/cgram/types/FloatType.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/FunctionSymbol.java (renamed from src/net/java/games/gluegen/cgram/types/FunctionSymbol.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/FunctionType.java (renamed from src/net/java/games/gluegen/cgram/types/FunctionType.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/IntType.java (renamed from src/net/java/games/gluegen/cgram/types/IntType.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/MachineDescription.java (renamed from src/net/java/games/gluegen/cgram/types/MachineDescription.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/MachineDescription32Bit.java (renamed from src/net/java/games/gluegen/cgram/types/MachineDescription32Bit.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/MachineDescription64Bit.java (renamed from src/net/java/games/gluegen/cgram/types/MachineDescription64Bit.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/PointerType.java (renamed from src/net/java/games/gluegen/cgram/types/PointerType.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/PrimitiveType.java (renamed from src/net/java/games/gluegen/cgram/types/PrimitiveType.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/Type.java (renamed from src/net/java/games/gluegen/cgram/types/Type.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/TypeDictionary.java (renamed from src/net/java/games/gluegen/cgram/types/TypeDictionary.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/TypeVisitor.java (renamed from src/net/java/games/gluegen/cgram/types/TypeVisitor.java)2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/VoidType.java (renamed from src/net/java/games/gluegen/cgram/types/VoidType.java)2
-rw-r--r--src/classes/com/sun/gluegen/opengl/BuildComposablePipeline.java (renamed from src/net/java/games/gluegen/opengl/BuildComposablePipeline.java)6
-rw-r--r--src/classes/com/sun/gluegen/opengl/BuildStaticGLInfo.java (renamed from src/net/java/games/gluegen/opengl/BuildStaticGLInfo.java)185
-rw-r--r--src/classes/com/sun/gluegen/opengl/ConvertFromGL4Java.java (renamed from src/net/java/games/gluegen/opengl/ConvertFromGL4Java.java)4
-rwxr-xr-x[-rw-r--r--]src/classes/com/sun/gluegen/opengl/GLCMethodBindingEmitter.java (renamed from src/net/java/games/gluegen/opengl/CGLPAWrapperEmitter.java)210
-rw-r--r--src/classes/com/sun/gluegen/opengl/GLEmitter.java (renamed from src/net/java/games/gluegen/opengl/GLEmitter.java)326
-rwxr-xr-xsrc/classes/com/sun/gluegen/opengl/GLJavaMethodBindingEmitter.java163
-rw-r--r--src/classes/com/sun/gluegen/pcpp/PCPP.java (renamed from src/net/java/games/gluegen/pcpp/PCPP.java)28
-rw-r--r--src/classes/com/sun/gluegen/runtime/BufferFactory.java164
-rw-r--r--src/classes/com/sun/gluegen/runtime/ProcAddressHelper.java (renamed from src/net/java/games/gluegen/runtime/ProcAddressHelper.java)2
-rw-r--r--src/classes/com/sun/gluegen/runtime/StructAccessor.java (renamed from src/net/java/games/gluegen/runtime/StructAccessor.java)2
-rw-r--r--src/classes/com/sun/opengl/cg/CgException.java (renamed from src/net/java/games/cg/CgException.java)2
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/Debug.java (renamed from src/net/java/games/jogl/impl/Debug.java)4
-rw-r--r--src/classes/com/sun/opengl/impl/FunctionAvailabilityCache.java (renamed from src/net/java/games/jogl/impl/FunctionAvailabilityCache.java)38
-rw-r--r--src/classes/com/sun/opengl/impl/GLContextImpl.java270
-rw-r--r--src/classes/com/sun/opengl/impl/GLContextLock.java118
-rw-r--r--src/classes/com/sun/opengl/impl/GLContextShareSet.java (renamed from src/net/java/games/jogl/impl/GLContextShareSet.java)6
-rw-r--r--src/classes/com/sun/opengl/impl/GLDrawableFactoryImpl.java104
-rw-r--r--src/classes/com/sun/opengl/impl/GLDrawableHelper.java150
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/GLDrawableImpl.java (renamed from src/net/java/games/jogl/impl/GLContextInitActionPair.java)22
-rw-r--r--src/classes/com/sun/opengl/impl/GLPbufferImpl.java (renamed from src/net/java/games/jogl/impl/GLPbufferImpl.java)135
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/GLUquadricImpl.java (renamed from src/net/java/games/jogl/impl/GLUquadricImpl.java)27
-rw-r--r--src/classes/com/sun/opengl/impl/InternalBufferUtils.java (renamed from src/net/java/games/jogl/impl/InternalBufferUtils.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/JAWT_PlatformInfo.java (renamed from src/net/java/games/jogl/impl/JAWT_PlatformInfo.java)2
-rwxr-xr-xsrc/classes/com/sun/opengl/impl/Java2D.java215
-rw-r--r--src/classes/com/sun/opengl/impl/NativeLibLoader.java (renamed from src/net/java/games/jogl/impl/NativeLibLoader.java)7
-rwxr-xr-xsrc/classes/com/sun/opengl/impl/Project.java (renamed from src/net/java/games/jogl/impl/Project.java)125
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/Util.java (renamed from src/net/java/games/jogl/impl/Util.java)6
-rw-r--r--src/classes/com/sun/opengl/impl/error/Error.java (renamed from src/net/java/games/jogl/impl/error/Error.java)19
-rw-r--r--src/classes/com/sun/opengl/impl/glue/Glue.java (renamed from src/net/java/games/jogl/impl/glue/Glue.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/macosx/MacOSXDummyGLContext.java (renamed from src/net/java/games/jogl/impl/macosx/MacOSXDummyGLContext.java)49
-rw-r--r--src/classes/com/sun/opengl/impl/macosx/MacOSXGLContext.java (renamed from src/net/java/games/jogl/impl/macosx/MacOSXGLContext.java)213
-rw-r--r--src/classes/com/sun/opengl/impl/macosx/MacOSXGLDrawable.java78
-rw-r--r--src/classes/com/sun/opengl/impl/macosx/MacOSXGLDrawableFactory.java141
-rw-r--r--src/classes/com/sun/opengl/impl/macosx/MacOSXOffscreenGLContext.java64
-rw-r--r--src/classes/com/sun/opengl/impl/macosx/MacOSXOffscreenGLDrawable.java (renamed from src/native/jogl/BufferUtils.c)33
-rw-r--r--src/classes/com/sun/opengl/impl/macosx/MacOSXOnscreenGLContext.java (renamed from src/net/java/games/gluegen/CMethodBindingImplEmitter.java)97
-rw-r--r--src/classes/com/sun/opengl/impl/macosx/MacOSXOnscreenGLDrawable.java228
-rw-r--r--src/classes/com/sun/opengl/impl/macosx/MacOSXPbufferGLContext.java101
-rw-r--r--src/classes/com/sun/opengl/impl/macosx/MacOSXPbufferGLDrawable.java160
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/BuildMipmap.java (renamed from src/net/java/games/jogl/impl/mipmap/BuildMipmap.java)73
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Extract.java (renamed from src/net/java/games/jogl/impl/mipmap/Extract.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Extract1010102.java (renamed from src/net/java/games/jogl/impl/mipmap/Extract1010102.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Extract1555rev.java (renamed from src/net/java/games/jogl/impl/mipmap/Extract1555rev.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Extract2101010rev.java (renamed from src/net/java/games/jogl/impl/mipmap/Extract2101010rev.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Extract233rev.java (renamed from src/net/java/games/jogl/impl/mipmap/Extract233rev.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Extract332.java (renamed from src/net/java/games/jogl/impl/mipmap/Extract332.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Extract4444.java (renamed from src/net/java/games/jogl/impl/mipmap/Extract4444.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Extract4444rev.java (renamed from src/net/java/games/jogl/impl/mipmap/Extract4444rev.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Extract5551.java (renamed from src/net/java/games/jogl/impl/mipmap/Extract5551.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Extract565.java (renamed from src/net/java/games/jogl/impl/mipmap/Extract565.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Extract565rev.java (renamed from src/net/java/games/jogl/impl/mipmap/Extract565rev.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Extract8888.java (renamed from src/net/java/games/jogl/impl/mipmap/Extract8888.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Extract8888rev.java (renamed from src/net/java/games/jogl/impl/mipmap/Extract8888rev.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/ExtractFloat.java (renamed from src/net/java/games/jogl/impl/mipmap/ExtractFloat.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/ExtractPrimitive.java (renamed from src/net/java/games/jogl/impl/mipmap/ExtractPrimitive.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/ExtractSByte.java (renamed from src/net/java/games/jogl/impl/mipmap/ExtractSByte.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/ExtractSInt.java (renamed from src/net/java/games/jogl/impl/mipmap/ExtractSInt.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/ExtractSShort.java (renamed from src/net/java/games/jogl/impl/mipmap/ExtractSShort.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/ExtractUByte.java (renamed from src/net/java/games/jogl/impl/mipmap/ExtractUByte.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/ExtractUInt.java (renamed from src/net/java/games/jogl/impl/mipmap/ExtractUInt.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/ExtractUShort.java (renamed from src/net/java/games/jogl/impl/mipmap/ExtractUShort.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/HalveImage.java (renamed from src/net/java/games/jogl/impl/mipmap/HalveImage.java)4
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Image.java (renamed from src/net/java/games/jogl/impl/mipmap/Image.java)4
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Mipmap.java (renamed from src/net/java/games/jogl/impl/mipmap/Mipmap.java)101
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/PixelStorageModes.java (renamed from src/net/java/games/jogl/impl/mipmap/PixelStorageModes.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/ScaleInternal.java (renamed from src/net/java/games/jogl/impl/mipmap/ScaleInternal.java)62
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/Type_Widget.java (renamed from src/net/java/games/jogl/impl/mipmap/Type_Widget.java)2
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/nurbs/README-PORTING.txt (renamed from src/net/java/games/jogl/impl/nurbs/README-PORTING.txt)0
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/nurbs/internals/Arc.java (renamed from src/net/java/games/jogl/impl/nurbs/internals/Arc.java)0
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/nurbs/internals/ArcTesselator.java (renamed from src/net/java/games/jogl/impl/nurbs/internals/ArcTesselator.java)0
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/nurbs/internals/Backend.java (renamed from src/net/java/games/jogl/impl/nurbs/internals/Backend.java)0
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/nurbs/internals/BasicCurveEvaluator.java (renamed from src/net/java/games/jogl/impl/nurbs/internals/BasicCurveEvaluator.java)0
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/nurbs/internals/BasicSurfaceEvaluator.java (renamed from src/net/java/games/jogl/impl/nurbs/internals/BasicSurfaceEvaluator.java)0
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/nurbs/internals/BezierArc.java (renamed from src/net/java/games/jogl/impl/nurbs/internals/BezierArc.java)0
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/nurbs/internals/Bin.java (renamed from src/net/java/games/jogl/impl/nurbs/internals/Bin.java)0
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/nurbs/internals/CachingEvaluator.java (renamed from src/net/java/games/jogl/impl/nurbs/internals/CachingEvaluator.java)0
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/nurbs/internals/Defines.java (renamed from src/net/java/games/jogl/impl/nurbs/internals/Defines.java)0
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/nurbs/internals/NurbsConsts.java (renamed from src/net/java/games/jogl/impl/nurbs/internals/NurbsConsts.java)0
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/nurbs/internals/NurbsException.java (renamed from src/net/java/games/jogl/impl/nurbs/internals/NurbsException.java)0
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/nurbs/internals/Subdivider.java (renamed from src/net/java/games/jogl/impl/nurbs/internals/Subdivider.java)0
-rw-r--r--src/classes/com/sun/opengl/impl/registry/Registry.java (renamed from src/net/java/games/jogl/impl/registry/Registry.java)6
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/ActiveRegion.java (renamed from src/net/java/games/jogl/impl/tesselator/ActiveRegion.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/CachedVertex.java (renamed from src/net/java/games/jogl/impl/tesselator/CachedVertex.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/Dict.java (renamed from src/net/java/games/jogl/impl/tesselator/Dict.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/DictNode.java (renamed from src/net/java/games/jogl/impl/tesselator/DictNode.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/GLUface.java (renamed from src/net/java/games/jogl/impl/tesselator/GLUface.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/GLUhalfEdge.java (renamed from src/net/java/games/jogl/impl/tesselator/GLUhalfEdge.java)6
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/GLUmesh.java (renamed from src/net/java/games/jogl/impl/tesselator/GLUmesh.java)8
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/GLUtessellatorImpl.java (renamed from src/net/java/games/jogl/impl/tesselator/GLUtesselatorImpl.java)63
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/GLUvertex.java (renamed from src/net/java/games/jogl/impl/tesselator/GLUvertex.java)4
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/Geom.java (renamed from src/net/java/games/jogl/impl/tesselator/Geom.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/Mesh.java (renamed from src/net/java/games/jogl/impl/tesselator/Mesh.java)158
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/Normal.java (renamed from src/net/java/games/jogl/impl/tesselator/Normal.java)29
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/PriorityQ.java (renamed from src/net/java/games/jogl/impl/tesselator/PriorityQ.java)4
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/PriorityQHeap.java (renamed from src/net/java/games/jogl/impl/tesselator/PriorityQHeap.java)38
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/PriorityQSort.java (renamed from src/net/java/games/jogl/impl/tesselator/PriorityQSort.java)26
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/Render.java (renamed from src/net/java/games/jogl/impl/tesselator/Render.java)61
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/Sweep.java (renamed from src/net/java/games/jogl/impl/tesselator/Sweep.java)61
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/TessMono.java (renamed from src/net/java/games/jogl/impl/tesselator/TessMono.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/tessellator/TessState.java (renamed from src/net/java/games/jogl/impl/tesselator/TessState.java)2
-rw-r--r--src/classes/com/sun/opengl/impl/windows/WindowsDummyGLDrawable.java (renamed from src/net/java/games/jogl/impl/GLDrawableHelper.java)71
-rwxr-xr-xsrc/classes/com/sun/opengl/impl/windows/WindowsExternalGLContext.java77
-rwxr-xr-xsrc/classes/com/sun/opengl/impl/windows/WindowsExternalGLDrawable.java69
-rw-r--r--src/classes/com/sun/opengl/impl/windows/WindowsGLContext.java286
-rw-r--r--src/classes/com/sun/opengl/impl/windows/WindowsGLDrawable.java502
-rw-r--r--src/classes/com/sun/opengl/impl/windows/WindowsGLDrawableFactory.java223
-rw-r--r--src/classes/com/sun/opengl/impl/windows/WindowsOffscreenGLContext.java (renamed from src/net/java/games/jogl/impl/macosx/MacOSXGLContextFactory.java)39
-rw-r--r--src/classes/com/sun/opengl/impl/windows/WindowsOffscreenGLDrawable.java (renamed from src/net/java/games/jogl/impl/windows/WindowsOffscreenGLContext.java)123
-rw-r--r--src/classes/com/sun/opengl/impl/windows/WindowsOnscreenGLContext.java (renamed from src/net/java/games/jogl/impl/macosx/MacOSXOffscreenGLContext.java)96
-rw-r--r--src/classes/com/sun/opengl/impl/windows/WindowsOnscreenGLDrawable.java198
-rw-r--r--src/classes/com/sun/opengl/impl/windows/WindowsPbufferGLContext.java163
-rw-r--r--src/classes/com/sun/opengl/impl/windows/WindowsPbufferGLDrawable.java399
-rwxr-xr-x[-rw-r--r--]src/classes/com/sun/opengl/impl/x11/X11ExternalGLContext.java (renamed from src/net/java/games/jogl/GLContextHelper.java)57
-rwxr-xr-xsrc/classes/com/sun/opengl/impl/x11/X11ExternalGLDrawable.java212
-rw-r--r--src/classes/com/sun/opengl/impl/x11/X11GLContext.java301
-rw-r--r--src/classes/com/sun/opengl/impl/x11/X11GLDrawable.java172
-rw-r--r--src/classes/com/sun/opengl/impl/x11/X11GLDrawableFactory.java (renamed from src/net/java/games/jogl/impl/x11/X11GLContextFactory.java)225
-rw-r--r--src/classes/com/sun/opengl/impl/x11/X11OffscreenGLContext.java74
-rw-r--r--src/classes/com/sun/opengl/impl/x11/X11OffscreenGLDrawable.java143
-rw-r--r--src/classes/com/sun/opengl/impl/x11/X11OnscreenGLContext.java (renamed from src/net/java/games/gluegen/runtime/BufferFactory.java)78
-rw-r--r--src/classes/com/sun/opengl/impl/x11/X11OnscreenGLDrawable.java (renamed from src/net/java/games/jogl/impl/x11/X11OnscreenGLContext.java)164
-rw-r--r--src/classes/com/sun/opengl/impl/x11/X11PbufferGLContext.java151
-rw-r--r--src/classes/com/sun/opengl/impl/x11/X11PbufferGLDrawable.java264
-rw-r--r--[-rwxr-xr-x]src/classes/com/sun/opengl/impl/x11/X11SunJDKReflection.java (renamed from src/net/java/games/jogl/impl/x11/X11SunJDKReflection.java)2
-rwxr-xr-xsrc/classes/com/sun/opengl/utils/Animator.java308
-rw-r--r--src/classes/com/sun/opengl/utils/BitmapCharRec.java (renamed from src/net/java/games/jogl/util/BitmapCharRec.java)2
-rw-r--r--src/classes/com/sun/opengl/utils/BitmapFontRec.java (renamed from src/net/java/games/jogl/util/BitmapFontRec.java)2
-rw-r--r--src/classes/com/sun/opengl/utils/BufferUtils.java266
-rw-r--r--src/classes/com/sun/opengl/utils/CoordRec.java (renamed from src/net/java/games/jogl/util/CoordRec.java)2
-rwxr-xr-xsrc/classes/com/sun/opengl/utils/FPSAnimator.java99
-rw-r--r--src/classes/com/sun/opengl/utils/GLUT.java (renamed from src/net/java/games/jogl/util/GLUT.java)152
-rw-r--r--src/classes/com/sun/opengl/utils/GLUTBitmap8x13.java (renamed from src/net/java/games/jogl/util/GLUTBitmap8x13.java)2
-rw-r--r--src/classes/com/sun/opengl/utils/GLUTBitmap9x15.java (renamed from src/net/java/games/jogl/util/GLUTBitmap9x15.java)2
-rw-r--r--src/classes/com/sun/opengl/utils/GLUTBitmapHelvetica10.java (renamed from src/net/java/games/jogl/util/GLUTBitmapHelvetica10.java)2
-rw-r--r--src/classes/com/sun/opengl/utils/GLUTBitmapHelvetica12.java (renamed from src/net/java/games/jogl/util/GLUTBitmapHelvetica12.java)2
-rw-r--r--src/classes/com/sun/opengl/utils/GLUTBitmapHelvetica18.java (renamed from src/net/java/games/jogl/util/GLUTBitmapHelvetica18.java)2
-rw-r--r--src/classes/com/sun/opengl/utils/GLUTBitmapTimesRoman10.java (renamed from src/net/java/games/jogl/util/GLUTBitmapTimesRoman10.java)2
-rw-r--r--src/classes/com/sun/opengl/utils/GLUTBitmapTimesRoman24.java (renamed from src/net/java/games/jogl/util/GLUTBitmapTimesRoman24.java)2
-rw-r--r--src/classes/com/sun/opengl/utils/GLUTStrokeMonoRoman.java (renamed from src/net/java/games/jogl/util/GLUTStrokeMonoRoman.java)2
-rw-r--r--src/classes/com/sun/opengl/utils/GLUTStrokeRoman.java (renamed from src/net/java/games/jogl/util/GLUTStrokeRoman.java)2
-rw-r--r--src/classes/com/sun/opengl/utils/StrokeCharRec.java (renamed from src/net/java/games/jogl/util/StrokeCharRec.java)2
-rw-r--r--src/classes/com/sun/opengl/utils/StrokeFontRec.java (renamed from src/net/java/games/jogl/util/StrokeFontRec.java)2
-rw-r--r--src/classes/com/sun/opengl/utils/StrokeRec.java (renamed from src/net/java/games/jogl/util/StrokeRec.java)2
-rw-r--r--src/classes/com/sun/opengl/utils/Version.java (renamed from src/net/java/games/jogl/Version.java)4
-rw-r--r--src/classes/javax/media/opengl/ComponentEvents.java (renamed from src/net/java/games/jogl/ComponentEvents.java)2
-rw-r--r--src/classes/javax/media/opengl/DefaultGLCapabilitiesChooser.java (renamed from src/net/java/games/jogl/DefaultGLCapabilitiesChooser.java)4
-rw-r--r--src/classes/javax/media/opengl/GLAutoDrawable.java117
-rw-r--r--src/classes/javax/media/opengl/GLCanvas.java (renamed from src/net/java/games/jogl/GLCanvas.java)184
-rw-r--r--src/classes/javax/media/opengl/GLCapabilities.java (renamed from src/net/java/games/jogl/GLCapabilities.java)2
-rw-r--r--src/classes/javax/media/opengl/GLCapabilitiesChooser.java (renamed from src/net/java/games/jogl/GLCapabilitiesChooser.java)2
-rw-r--r--src/classes/javax/media/opengl/GLContext.java159
-rw-r--r--src/classes/javax/media/opengl/GLDrawable.java118
-rw-r--r--src/classes/javax/media/opengl/GLDrawableFactory.java282
-rw-r--r--src/classes/javax/media/opengl/GLEventListener.java (renamed from src/net/java/games/jogl/GLEventListener.java)33
-rw-r--r--src/classes/javax/media/opengl/GLException.java (renamed from src/net/java/games/jogl/GLException.java)2
-rw-r--r--src/classes/javax/media/opengl/GLJPanel.java877
-rw-r--r--src/classes/javax/media/opengl/GLPbuffer.java (renamed from src/net/java/games/jogl/GLPbuffer.java)25
-rwxr-xr-xsrc/classes/javax/media/opengl/Threading.java215
-rwxr-xr-xsrc/classes/javax/media/opengl/glu/GLUquadric.java (renamed from src/net/java/games/jogl/GLUquadric.java)2
-rwxr-xr-x[-rw-r--r--]src/classes/javax/media/opengl/glu/GLUtessellator.java (renamed from src/net/java/games/jogl/GLUtesselator.java)12
-rwxr-xr-x[-rw-r--r--]src/classes/javax/media/opengl/glu/GLUtessellatorCallback.java (renamed from src/net/java/games/jogl/GLUtesselatorCallback.java)145
-rwxr-xr-x[-rw-r--r--]src/classes/javax/media/opengl/glu/GLUtessellatorCallbackAdapter.java (renamed from src/net/java/games/jogl/GLUtesselatorCallbackAdapter.java)12
-rw-r--r--src/native/jogl/InternalBufferUtils.c2
-rw-r--r--src/native/jogl/JAWT_DrawingSurfaceInfo.c8
-rw-r--r--src/native/jogl/MacOSXWindowSystemInterface.m18
-rw-r--r--src/net/java/games/gluegen/JavaMethodBindingEmitter.java269
-rw-r--r--src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java263
-rw-r--r--src/net/java/games/gluegen/opengl/JavaGLPAWrapperEmitter.java180
-rw-r--r--src/net/java/games/jogl/Animator.java158
-rw-r--r--src/net/java/games/jogl/GLDrawable.java219
-rw-r--r--src/net/java/games/jogl/GLDrawableFactory.java195
-rw-r--r--src/net/java/games/jogl/GLJPanel.java730
-rw-r--r--src/net/java/games/jogl/impl/GLContext.java764
-rw-r--r--src/net/java/games/jogl/impl/GLContextFactory.java105
-rwxr-xr-xsrc/net/java/games/jogl/impl/GLContextStack.java127
-rwxr-xr-xsrc/net/java/games/jogl/impl/SingleThreadedWorkaround.java115
-rw-r--r--src/net/java/games/jogl/impl/macosx/MacOSXOnscreenGLContext.java248
-rw-r--r--src/net/java/games/jogl/impl/macosx/MacOSXPbufferGLContext.java203
-rw-r--r--src/net/java/games/jogl/impl/windows/WindowsGLContext.java717
-rw-r--r--src/net/java/games/jogl/impl/windows/WindowsGLContextFactory.java361
-rw-r--r--src/net/java/games/jogl/impl/windows/WindowsOnscreenGLContext.java228
-rw-r--r--src/net/java/games/jogl/impl/windows/WindowsPbufferGLContext.java529
-rw-r--r--src/net/java/games/jogl/impl/x11/X11GLContext.java410
-rw-r--r--src/net/java/games/jogl/impl/x11/X11OffscreenGLContext.java175
-rw-r--r--src/net/java/games/jogl/impl/x11/X11PbufferGLContext.java343
-rw-r--r--src/net/java/games/jogl/util/BufferUtils.java121
238 files changed, 12032 insertions, 9122 deletions
diff --git a/src/net/java/games/gluegen/ArrayTypes.java b/src/classes/com/sun/gluegen/ArrayTypes.java
index 1a75f7306..7e5dd9597 100644
--- a/src/net/java/games/gluegen/ArrayTypes.java
+++ b/src/classes/com/sun/gluegen/ArrayTypes.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
import java.nio.*;
diff --git a/src/net/java/games/gluegen/CMethodBindingEmitter.java b/src/classes/com/sun/gluegen/CMethodBindingEmitter.java
index f8afd06e4..70877ff5e 100644
--- a/src/net/java/games/gluegen/CMethodBindingEmitter.java
+++ b/src/classes/com/sun/gluegen/CMethodBindingEmitter.java
@@ -37,13 +37,13 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
import java.util.*;
import java.io.*;
import java.text.MessageFormat;
-import net.java.games.gluegen.cgram.types.*;
+import com.sun.gluegen.cgram.types.*;
/** Emits the C-side component of the Java<->C JNI binding. */
public class CMethodBindingEmitter extends FunctionEmitter
@@ -55,7 +55,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
protected static final String arrayRes = "_array_res";
protected static final String arrayIdx = "_array_idx";
- private MethodBinding binding;
+ protected MethodBinding binding;
/** Name of the package in which the corresponding Java method resides.*/
private String packageName;
@@ -75,6 +75,10 @@ public class CMethodBindingEmitter extends FunctionEmitter
*/
private boolean isJavaMethodStatic;
+ // Flags which change various aspects of glue code generation
+ protected boolean forImplementingMethodCall;
+ protected boolean forIndirectBufferAndArrayImplementation;
+
/**
* Optional List of Strings containing temporary C variables to declare.
*/
@@ -115,11 +119,13 @@ public class CMethodBindingEmitter extends FunctionEmitter
* being bound.
*/
public CMethodBindingEmitter(MethodBinding binding,
- boolean isOverloadedBinding,
+ PrintWriter output,
String javaPackageName,
String javaClassName,
+ boolean isOverloadedBinding,
boolean isJavaMethodStatic,
- PrintWriter output)
+ boolean forImplementingMethodCall,
+ boolean forIndirectBufferAndArrayImplementation)
{
super(output);
@@ -132,13 +138,17 @@ public class CMethodBindingEmitter extends FunctionEmitter
this.className = javaClassName;
this.isOverloadedBinding = isOverloadedBinding;
this.isJavaMethodStatic = isJavaMethodStatic;
+
+ this.forImplementingMethodCall = forImplementingMethodCall;
+ this.forIndirectBufferAndArrayImplementation = forIndirectBufferAndArrayImplementation;
+
setCommentEmitter(defaultCommentEmitter);
}
public final MethodBinding getBinding() { return binding; }
public String getName() {
- return binding.getName();
+ return binding.getRenamedMethodName();
}
/**
@@ -151,8 +161,8 @@ public class CMethodBindingEmitter extends FunctionEmitter
/**
* If this function returns a void* encapsulated in a
- * java.nio.Buffer, sets the expression for the capacity of the
- * returned Buffer.
+ * java.nio.Buffer (or compound type wrapper), sets the expression
+ * for the capacity of the returned Buffer.
*
* @param expression a MessageFormat which, when applied to an array
* of type String[] that contains each of the arguments names of the
@@ -162,18 +172,20 @@ public class CMethodBindingEmitter extends FunctionEmitter
* returned from this method.
*
* @throws IllegalArgumentException if the <code>
- * binding.getJavaReturnType().isNIOBuffer() == false
+ * binding.getJavaReturnType().isNIOBuffer() == false and
+ * binding.getJavaReturnType().isCompoundTypeWrapper() == false
* </code>
*/
public final void setReturnValueCapacityExpression(MessageFormat expression)
{
returnValueCapacityExpression = expression;
- if (!binding.getJavaReturnType().isNIOBuffer())
+ if (!binding.getJavaReturnType().isNIOBuffer() &&
+ !binding.getJavaReturnType().isCompoundTypeWrapper())
{
throw new IllegalArgumentException(
"Cannot specify return value capacity for a method that does not " +
- "return java.nio.Buffer: \"" + binding + "\"");
+ "return java.nio.Buffer or a compound type wrapper: \"" + binding + "\"");
}
}
@@ -204,7 +216,8 @@ public class CMethodBindingEmitter extends FunctionEmitter
{
returnValueLengthExpression = expression;
- if (!binding.getJavaReturnType().isArray())
+ if (!binding.getJavaReturnType().isArray() &&
+ !binding.getJavaReturnType().isArrayOfCompoundTypeWrappers())
{
throw new IllegalArgumentException(
"Cannot specify return value length for a method that does not " +
@@ -272,6 +285,12 @@ public class CMethodBindingEmitter extends FunctionEmitter
*/
public final boolean getIsJavaMethodStatic() { return isJavaMethodStatic; }
+ /**
+ * Is this CMethodBindingEmitter implementing the case of an
+ * indirect buffer or array being passed down to C code?
+ */
+ public final boolean forIndirectBufferAndArrayImplementation() { return forIndirectBufferAndArrayImplementation; }
+
protected void emitReturnType(PrintWriter writer)
{
writer.print("JNIEXPORT ");
@@ -290,15 +309,26 @@ public class CMethodBindingEmitter extends FunctionEmitter
if (isOverloadedBinding)
{
writer.print(jniMangle(binding));
- //System.err.println("OVERLOADED MANGLING FOR " + binding.getName() +
+ //System.err.println("OVERLOADED MANGLING FOR " + getName() +
// " = " + jniMangle(binding));
}
else
{
- writer.print(jniMangle(binding.getName()));
+ writer.print(jniMangle(getName()));
//System.err.println(" NORMAL MANGLING FOR " + binding.getName() +
- // " = " + jniMangle(binding.getName()));
+ // " = " + jniMangle(getName()));
+ }
+ }
+
+ protected String getImplSuffix() {
+ if (forImplementingMethodCall) {
+ if (forIndirectBufferAndArrayImplementation) {
+ return "1";
+ } else {
+ return "0";
+ }
}
+ return "";
}
protected int emitArguments(PrintWriter writer)
@@ -338,8 +368,15 @@ public class CMethodBindingEmitter extends FunctionEmitter
writer.print(" ");
writer.print(binding.getArgumentName(i));
++numEmitted;
- }
+ if (javaArgType.isPrimitiveArray() ||
+ javaArgType.isNIOBuffer()) {
+ writer.print(", jint " + byteOffsetArgName(i));
+ } else if (javaArgType.isNIOBufferArray()) {
+ writer.print(", jintArray " +
+ byteOffsetArrayArgName(i));
+ }
+ }
return numEmitted;
}
@@ -378,7 +415,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
continue;
}
- if (type.isArray() || type.isNIOBuffer()) {
+ if (type.isArray() || type.isNIOBuffer() || type.isCompoundTypeWrapper()) {
String convName = pointerConversionArgumentName(i);
// handle array/buffer argument types
boolean needsDataCopy =
@@ -393,6 +430,10 @@ public class CMethodBindingEmitter extends FunctionEmitter
writer.println(" jobject _tmpObj;");
writer.println(" int _copyIndex;");
writer.println(" jsize _tmpArrayLen;");
+
+ // Pointer to the data in the Buffer, taking the offset into account
+ writer.println(" int * _offsetHandle = NULL;");
+
emittedDataCopyTemps = true;
}
} else if (type.isString()) {
@@ -413,37 +454,36 @@ public class CMethodBindingEmitter extends FunctionEmitter
// Note we must respect const/volatile for return argument
writer.print(binding.getCSymbol().getReturnType().getName(true));
writer.println(" _res;");
- if (javaReturnType.isArray()) {
- if (javaReturnType.isNIOByteBufferArray()) {
- writer.print(" int ");
- writer.print(arrayResLength);
- writer.println(";");
- writer.print(" int ");
- writer.print(arrayIdx);
- writer.println(";");
- writer.print(" jobjectArray ");
- writer.print(arrayRes);
- writer.println(";");
- } else {
- writer.print(" int ");
- writer.print(arrayResLength);
- writer.println(";");
-
- Class componentType = javaReturnType.getJavaClass().getComponentType();
- if (componentType.isArray()) {
- throw new RuntimeException("Multi-dimensional arrays not supported yet");
- }
+ if (javaReturnType.isNIOByteBufferArray() ||
+ javaReturnType.isArrayOfCompoundTypeWrappers()) {
+ writer.print(" int ");
+ writer.print(arrayResLength);
+ writer.println(";");
+ writer.print(" int ");
+ writer.print(arrayIdx);
+ writer.println(";");
+ writer.print(" jobjectArray ");
+ writer.print(arrayRes);
+ writer.println(";");
+ } else if (javaReturnType.isArray()) {
+ writer.print(" int ");
+ writer.print(arrayResLength);
+ writer.println(";");
- String javaTypeName = componentType.getName();
- capitalizedComponentType =
- "" + Character.toUpperCase(javaTypeName.charAt(0)) + javaTypeName.substring(1);
- String javaArrayTypeName = "j" + javaTypeName + "Array";
- writer.print(" ");
- writer.print(javaArrayTypeName);
- writer.print(" ");
- writer.print(arrayRes);
- writer.println(";");
+ Class componentType = javaReturnType.getJavaClass().getComponentType();
+ if (componentType.isArray()) {
+ throw new RuntimeException("Multi-dimensional arrays not supported yet");
}
+
+ String javaTypeName = componentType.getName();
+ capitalizedComponentType =
+ "" + Character.toUpperCase(javaTypeName.charAt(0)) + javaTypeName.substring(1);
+ String javaArrayTypeName = "j" + javaTypeName + "Array";
+ writer.print(" ");
+ writer.print(javaArrayTypeName);
+ writer.print(" ");
+ writer.print(arrayRes);
+ writer.println(";");
}
}
}
@@ -460,6 +500,17 @@ public class CMethodBindingEmitter extends FunctionEmitter
}
}
+ /** Checks a type (expected to be pointer-to-pointer) for const-ness */
+ protected boolean isConstPtrPtr(Type type) {
+ if (type.pointerDepth() != 2) {
+ return false;
+ }
+ if (type.asPointer().getTargetType().asPointer().getTargetType().isConst()) {
+ return true;
+ }
+ return false;
+ }
+
/**
* Code to init the variables that were declared in
* emitBodyVariableDeclarations(), PRIOR TO calling the actual C
@@ -477,7 +528,8 @@ public class CMethodBindingEmitter extends FunctionEmitter
binding.getContainingType(),
binding.getContainingCType(),
JavaMethodBindingEmitter.javaThisArgumentName(),
- CMethodBindingEmitter.cThisArgumentName());
+ CMethodBindingEmitter.cThisArgumentName(),
+ null);
}
for (int i = 0; i < binding.getNumArguments(); i++) {
@@ -485,11 +537,14 @@ public class CMethodBindingEmitter extends FunctionEmitter
if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) {
continue;
}
- if (type.isNIOBuffer()) {
+
+ if (type.isCompoundTypeWrapper() ||
+ (type.isNIOBuffer() && !forIndirectBufferAndArrayImplementation)) {
emitPointerConversion(writer, binding, type,
binding.getCArgumentType(i),
binding.getArgumentName(i),
- pointerConversionArgumentName(i));
+ pointerConversionArgumentName(i),
+ byteOffsetArgName(i));
}
}
}
@@ -502,9 +557,9 @@ public class CMethodBindingEmitter extends FunctionEmitter
continue;
}
- if (javaArgType.isArray()) {
+ if (javaArgType.isArray() ||
+ (javaArgType.isNIOBuffer() && forIndirectBufferAndArrayImplementation)) {
boolean needsDataCopy = javaArgTypeNeedsDataCopy(javaArgType);
- Class subArrayElementJavaType = javaArgType.getJavaClass().getComponentType();
// We only defer the emission of GetPrimitiveArrayCritical
// calls that won't be matched up until after the function
@@ -529,15 +584,17 @@ public class CMethodBindingEmitter extends FunctionEmitter
writer.print(" ");
writer.print(convName);
writer.print(" = (");
- if (javaArgType.isArray() &&
- javaArgType.getJavaClass().getComponentType() == java.lang.String.class) {
+ if (javaArgType.isStringArray()) {
// java-side type is String[]
cArgTypeName = "jstring *";
}
writer.print(cArgTypeName);
- writer.print(") (*env)->GetPrimitiveArrayCritical(env, ");
+ writer.print(") (((char*) (*env)->GetPrimitiveArrayCritical(env, ");
writer.print(binding.getArgumentName(i));
- writer.println(", NULL);");
+ writer.println(", NULL)) + " + byteOffsetArgName(i) + ");");
+//if(cargtypename is void*)
+// _ptrX = ((char*)convName + index1*sizeof(thisArgsJavaType));
+
} else {
// Handle the case where the array elements are of a type that needs a
// data copy operation to convert from the java memory model to the C
@@ -545,7 +602,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
//
// FIXME: should factor out this whole block of code into a separate
// method for clarity and maintenance purposes
- if (cArgType.toString().indexOf("const") == -1) {
+ if (!isConstPtrPtr(cArgType)) {
// FIXME: if the arg type is non-const, the sematics might be that
// the function modifies the argument -- we don't yet support
// this.
@@ -592,34 +649,43 @@ public class CMethodBindingEmitter extends FunctionEmitter
arrayLenName,
"Could not allocate buffer for copying data in argument \\\""+binding.getArgumentName(i)+"\\\"");
+ // Get the handle for the byte offset array sent down for Buffers
+ // FIXME: not 100% sure this is correct with respect to the
+ // JNI spec because it may be illegal to call
+ // GetObjectArrayElement while in a critical section. May
+ // need to do another loop and add in the offsets.
+ if (javaArgType.isNIOBufferArray()) {
+ writer.println
+ (" _offsetHandle = (int *) (*env)->GetPrimitiveArrayCritical(env, " +
+ byteOffsetArrayArgName(i) +
+ ", NULL);");
+ }
+
// process each element in the array
writer.println(" for (_copyIndex = 0; _copyIndex < "+arrayLenName+"; ++_copyIndex) {");
// get each array element
writer.println(" /* get each element of the array argument \"" + binding.getArgumentName(i) + "\" */");
- String subArrayElementJNITypeString = jniType(subArrayElementJavaType);
- writer.print(" _tmpObj = (");
- writer.print(subArrayElementJNITypeString);
- writer.print(") (*env)->GetObjectArrayElement(env, ");
+ writer.print(" _tmpObj = (*env)->GetObjectArrayElement(env, ");
writer.print(binding.getArgumentName(i));
writer.println(", _copyIndex);");
- if (subArrayElementJNITypeString == "jstring")
- {
+ if (javaArgType.isStringArray()) {
writer.print(" ");
emitGetStringUTFChars(writer,
"(jstring) _tmpObj",
- convName+"_copy[_copyIndex]");
- }
- else if (isNIOBufferClass(subArrayElementJavaType))
- {
+ convName+"_copy[_copyIndex]",
+ true);
+ } else if (javaArgType.isNIOBufferArray()) {
+ /* We always assume an integer "byte offset" argument follows any Buffer
+ in the method binding. */
emitGetDirectBufferAddress(writer,
"_tmpObj",
cArgElementType.getName(),
- convName + "_copy[_copyIndex]");
- }
- else
- {
+ convName + "_copy[_copyIndex]",
+ "_offsetHandle[_copyIndex]",
+ true);
+ } else {
// Question: do we always need to copy the sub-arrays, or just
// GetPrimitiveArrayCritical on each jobjectarray element and
// assign it to the appropriate elements at pointer depth 1?
@@ -627,29 +693,35 @@ public class CMethodBindingEmitter extends FunctionEmitter
// Malloc enough space to hold a copy of each sub-array
writer.print(" ");
emitMalloc(
- writer,
- convName+"_copy[_copyIndex]",
- cArgElementType.getTargetType().getName(), // assumes cArgPtrType is ptr-to-ptr-to-primitive !!
- "(*env)->GetArrayLength(env, _tmpObj)",
- "Could not allocate buffer during copying of data in argument \\\""+binding.getArgumentName(i)+"\\\"");
+ writer,
+ convName+"_copy[_copyIndex]",
+ cArgElementType.getTargetType().getName(), // assumes cArgPtrType is ptr-to-ptr-to-primitive !!
+ "(*env)->GetArrayLength(env, _tmpObj)",
+ "Could not allocate buffer during copying of data in argument \\\""+binding.getArgumentName(i)+"\\\"");
// FIXME: copy the data (use matched Get/ReleasePrimitiveArrayCritical() calls)
if (true) throw new RuntimeException(
- "Cannot yet handle type \"" + cArgType.getName() +
- "\"; need to add support for copying ptr-to-ptr-to-primitiveType subarrays");
+ "Cannot yet handle type \"" + cArgType.getName() +
+ "\"; need to add support for copying ptr-to-ptr-to-primitiveType subarrays");
}
writer.println(" }");
+ if (javaArgType.isNIOBufferArray()) {
+ writer.println
+ (" (*env)->ReleasePrimitiveArrayCritical(env, " +
+ byteOffsetArrayArgName(i) +
+ ", _offsetHandle, JNI_ABORT);");
+ }
+
writer.println();
} // end of data copy
if (EMIT_NULL_CHECKS) {
writer.println(" }");
}
-
} else if (javaArgType.isString()) {
- if (emittingPrimitiveArrayCritical) {
+ if (!emittingPrimitiveArrayCritical) {
continue;
}
@@ -661,7 +733,8 @@ public class CMethodBindingEmitter extends FunctionEmitter
emitGetStringUTFChars(writer,
binding.getArgumentName(i),
- "_UTF8" + binding.getArgumentName(i));
+ "_UTF8" + binding.getArgumentName(i),
+ false);
if (EMIT_NULL_CHECKS) {
writer.println(" }");
@@ -688,9 +761,10 @@ public class CMethodBindingEmitter extends FunctionEmitter
if (javaArgType.isJNIEnv() || binding.isArgumentThisPointer(i)) {
continue;
}
- if (javaArgType.isArray()) {
+
+ if (javaArgType.isArray() ||
+ (javaArgType.isNIOBuffer() && forIndirectBufferAndArrayImplementation)) {
boolean needsDataCopy = javaArgTypeNeedsDataCopy(javaArgType);
- Class subArrayElementJavaType = javaArgType.getJavaClass().getComponentType();
if ((!needsDataCopy && !emittingPrimitiveArrayCritical) ||
(needsDataCopy && emittingPrimitiveArrayCritical)) {
@@ -736,7 +810,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
// Only need to perform cleanup for individual array
// elements if they are not direct buffers
- if (!isNIOBufferClass(subArrayElementJavaType)) {
+ if (!javaArgType.isNIOBufferArray()) {
// Re-fetch length of array that was copied
String arrayLenName = "_tmpArrayLen";
writer.print(" ");
@@ -759,14 +833,11 @@ public class CMethodBindingEmitter extends FunctionEmitter
// get each array element
writer.println(" /* free each element of " +convName +"_copy */");
- String subArrayElementJNITypeString = jniType(subArrayElementJavaType);
- writer.print(" _tmpObj = (");
- writer.print(subArrayElementJNITypeString);
- writer.print(") (*env)->GetObjectArrayElement(env, ");
+ writer.print(" _tmpObj = (*env)->GetObjectArrayElement(env, ");
writer.print(binding.getArgumentName(i));
writer.println(", _copyIndex);");
- if (subArrayElementJNITypeString == "jstring") {
+ if (javaArgType.isStringArray()) {
writer.print(" (*env)->ReleaseStringUTFChars(env, ");
writer.print("(jstring) _tmpObj");
writer.print(", ");
@@ -818,24 +889,9 @@ public class CMethodBindingEmitter extends FunctionEmitter
}
}
- protected void emitBodyCallCFunction(PrintWriter writer)
- {
- // Make the call to the actual C function
- writer.print(" ");
-
- // WARNING: this code assumes that the return type has already been
- // typedef-resolved.
- Type cReturnType = binding.getCReturnType();
-
- if (!cReturnType.isVoid()) {
- writer.print("_res = ");
- }
- if (binding.hasContainingType()) {
- // Call through function pointer
- writer.print(CMethodBindingEmitter.cThisArgumentName() + "->");
- }
- writer.print(binding.getCSymbol().getName());
- writer.print("(");
+ /** Returns the number of arguments passed so calling code knows
+ whether to print a comma */
+ protected int emitBodyPassCArguments(PrintWriter writer) {
for (int i = 0; i < binding.getNumArguments(); i++) {
if (i != 0) {
writer.print(", ");
@@ -861,7 +917,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
if (binding.getCArgumentType(i).isPointer() && binding.getJavaArgumentType(i).isPrimitive()) {
writer.print("(intptr_t) ");
}
- if (javaArgType.isArray() || javaArgType.isNIOBuffer()) {
+ if (javaArgType.isArray() || javaArgType.isNIOBuffer() || javaArgType.isCompoundTypeWrapper()) {
writer.print(pointerConversionArgumentName(i));
if (javaArgTypeNeedsDataCopy(javaArgType)) {
writer.print("_copy");
@@ -872,6 +928,28 @@ public class CMethodBindingEmitter extends FunctionEmitter
}
}
}
+ return binding.getNumArguments();
+ }
+
+ protected void emitBodyCallCFunction(PrintWriter writer) {
+
+ // Make the call to the actual C function
+ writer.print(" ");
+
+ // WARNING: this code assumes that the return type has already been
+ // typedef-resolved.
+ Type cReturnType = binding.getCReturnType();
+
+ if (!cReturnType.isVoid()) {
+ writer.print("_res = ");
+ }
+ if (binding.hasContainingType()) {
+ // Call through function pointer
+ writer.print(CMethodBindingEmitter.cThisArgumentName() + "->");
+ }
+ writer.print(binding.getCSymbol().getName());
+ writer.print("(");
+ emitBodyPassCArguments(writer);
writer.println(");");
}
@@ -887,9 +965,6 @@ public class CMethodBindingEmitter extends FunctionEmitter
}
}
- // FIXME: refactor this so that subclasses (in particular,
- // net.java.games.gluegen.opengl.CGLPAWrapperEmitter) don't have to copy the whole
- // method
protected void emitBodyReturnResult(PrintWriter writer)
{
// WARNING: this code assumes that the return type has already been
@@ -907,7 +982,8 @@ public class CMethodBindingEmitter extends FunctionEmitter
writer.print("(" + javaReturnType.jniTypeName() + ") (intptr_t) ");
}
writer.println("_res;");
- } else if (javaReturnType.isNIOBuffer()) {
+ } else if (javaReturnType.isNIOBuffer() ||
+ javaReturnType.isCompoundTypeWrapper()) {
writer.println(" if (_res == NULL) return NULL;");
writer.print(" return (*env)->NewDirectByteBuffer(env, _res, ");
// See whether capacity has been specified
@@ -925,7 +1001,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
cReturnType.asPointer().getTargetType().isCompound()) {
sz = cReturnType.asPointer().getTargetType().getSize();
if (sz == -1) {
- throw new InternalError(
+ throw new RuntimeException(
"Error emitting code for compound return type "+
"for function \"" + binding + "\": " +
"Structs to be emitted should have been laid out by this point " +
@@ -946,64 +1022,67 @@ public class CMethodBindingEmitter extends FunctionEmitter
} else if (javaReturnType.isString()) {
writer.print(" if (_res == NULL) return NULL;");
writer.println(" return (*env)->NewStringUTF(env, _res);");
- } else if (javaReturnType.isArray()) {
- if (javaReturnType.isNIOByteBufferArray()) {
- writer.println(" if (_res == NULL) return NULL;");
- if (returnValueLengthExpression == null) {
- throw new RuntimeException("Error while generating C code: no length specified for array returned from function " +
- binding);
- }
- String[] argumentNames = new String[binding.getNumArguments()];
- for (int i = 0; i < binding.getNumArguments(); i++) {
- argumentNames[i] = binding.getArgumentName(i);
- }
- writer.println(" " + arrayResLength + " = " + returnValueLengthExpression.format(argumentNames) + ";");
- writer.println(" " + arrayRes + " = (*env)->NewObjectArray(env, " + arrayResLength + ", (*env)->FindClass(env, \"java/nio/ByteBuffer\"), NULL);");
- writer.println(" for (" + arrayIdx + " = 0; " + arrayIdx + " < " + arrayResLength + "; " + arrayIdx + "++) {");
- Type retType = binding.getCSymbol().getReturnType();
- Type baseType;
- if (retType.isPointer()) {
- baseType = retType.asPointer().getTargetType().asPointer().getTargetType();
- } else {
- baseType = retType.asArray().getElementType().asPointer().getTargetType();
- }
- int sz = baseType.getSize();
- if (sz < 0)
- sz = 0;
- writer.println(" (*env)->SetObjectArrayElement(env, " + arrayRes + ", " + arrayIdx +
- ", (*env)->NewDirectByteBuffer(env, _res[" + arrayIdx + "], " + sz + "));");
- writer.println(" }");
- writer.println(" return " + arrayRes + ";");
+ } else if (javaReturnType.isArrayOfCompoundTypeWrappers() ||
+ (javaReturnType.isArray() && javaReturnType.isNIOByteBufferArray())) {
+ writer.println(" if (_res == NULL) return NULL;");
+ if (returnValueLengthExpression == null) {
+ throw new RuntimeException("Error while generating C code: no length specified for array returned from function " +
+ binding);
+ }
+ String[] argumentNames = new String[binding.getNumArguments()];
+ for (int i = 0; i < binding.getNumArguments(); i++) {
+ argumentNames[i] = binding.getArgumentName(i);
+ }
+ writer.println(" " + arrayResLength + " = " + returnValueLengthExpression.format(argumentNames) + ";");
+ writer.println(" " + arrayRes + " = (*env)->NewObjectArray(env, " + arrayResLength + ", (*env)->FindClass(env, \"java/nio/ByteBuffer\"), NULL);");
+ writer.println(" for (" + arrayIdx + " = 0; " + arrayIdx + " < " + arrayResLength + "; " + arrayIdx + "++) {");
+ Type retType = binding.getCSymbol().getReturnType();
+ Type baseType;
+ if (retType.isPointer()) {
+ baseType = retType.asPointer().getTargetType().asPointer().getTargetType();
} else {
- // FIXME: must have user provide length of array in .cfg file
- // by providing a constant value, input parameter, or
- // expression which computes the array size (already present
- // as ReturnValueCapacity, not yet implemented / tested here)
-
- throw new RuntimeException(
- "Could not emit native code for function \"" + binding +
- "\": array return values for non-char types not implemented yet");
-
- // FIXME: This is approximately what will be required here
- //
- //writer.print(" ");
- //writer.print(arrayRes);
- //writer.print(" = (*env)->New");
- //writer.print(capitalizedComponentType);
- //writer.print("Array(env, ");
- //writer.print(arrayResLength);
- //writer.println(");");
- //writer.print(" (*env)->Set");
- //writer.print(capitalizedComponentType);
- //writer.print("ArrayRegion(env, ");
- //writer.print(arrayRes);
- //writer.print(", 0, ");
- //writer.print(arrayResLength);
- //writer.println(", _res);");
- //writer.print(" return ");
- //writer.print(arrayRes);
- //writer.println(";");
+ baseType = retType.asArray().getElementType().asPointer().getTargetType();
}
+ int sz = baseType.getSize();
+ if (sz < 0)
+ sz = 0;
+ writer.println(" (*env)->SetObjectArrayElement(env, " + arrayRes + ", " + arrayIdx +
+ ", (*env)->NewDirectByteBuffer(env, _res[" + arrayIdx + "], " + sz + "));");
+ writer.println(" }");
+ writer.println(" return " + arrayRes + ";");
+ } else if (javaReturnType.isArray()) {
+ // FIXME: must have user provide length of array in .cfg file
+ // by providing a constant value, input parameter, or
+ // expression which computes the array size (already present
+ // as ReturnValueCapacity, not yet implemented / tested here)
+
+ throw new RuntimeException(
+ "Could not emit native code for function \"" + binding +
+ "\": array return values for non-char types not implemented yet");
+
+ // FIXME: This is approximately what will be required here
+ //
+ //writer.print(" ");
+ //writer.print(arrayRes);
+ //writer.print(" = (*env)->New");
+ //writer.print(capitalizedComponentType);
+ //writer.print("Array(env, ");
+ //writer.print(arrayResLength);
+ //writer.println(");");
+ //writer.print(" (*env)->Set");
+ //writer.print(capitalizedComponentType);
+ //writer.print("ArrayRegion(env, ");
+ //writer.print(arrayRes);
+ //writer.print(", 0, ");
+ //writer.print(arrayResLength);
+ //writer.println(", _res);");
+ //writer.print(" return ");
+ //writer.print(arrayRes);
+ //writer.println(";");
+ } else {
+ System.err.print("Unhandled return type: ");
+ javaReturnType.dump();
+ throw new RuntimeException("Unhandled return type");
}
}
}
@@ -1019,26 +1098,57 @@ public class CMethodBindingEmitter extends FunctionEmitter
protected String jniMangle(MethodBinding binding) {
StringBuffer buf = new StringBuffer();
- buf.append(jniMangle(binding.getName()));
+ buf.append(jniMangle(getName()));
+ buf.append(getImplSuffix());
buf.append("__");
+ if (binding.hasContainingType()) {
+ // "this" argument always comes down in argument 0 as direct buffer
+ jniMangle(java.nio.ByteBuffer.class, buf, true);
+ }
for (int i = 0; i < binding.getNumArguments(); i++) {
+ if (binding.isArgumentThisPointer(i)) {
+ continue;
+ }
JavaType type = binding.getJavaArgumentType(i);
- Class c = type.getJavaClass();
- if (c != null) {
- jniMangle(c, buf);
+ if (type.isVoid()) {
+ // We should only see "void" as the first argument of a 1-argument function
+ // FIXME: should normalize this in the parser
+ if ((i != 0) || (binding.getNumArguments() > 1)) {
+ throw new RuntimeException("Saw illegal \"void\" argument while emitting \"" + getName() + "\"");
+ }
} else {
- // FIXME: add support for char* -> String conversion
- throw new RuntimeException("Unknown kind of JavaType: name="+type.getName());
+ Class c = type.getJavaClass();
+ if (c != null) {
+ jniMangle(c, buf, false);
+ // If Buffer offset arguments were added, we need to mangle the JNI for the
+ // extra arguments
+ if (type.isNIOBuffer()) {
+ jniMangle(Integer.TYPE, buf, false);
+ } else if (type.isNIOBufferArray()) {
+ int[] intArrayType = new int[0];
+ c = intArrayType.getClass();
+ jniMangle(c , buf, true);
+ }
+ if (type.isPrimitiveArray()) {
+ jniMangle(Integer.TYPE, buf, false);
+ }
+ } else if (type.isCompoundTypeWrapper()) {
+ // Mangle wrappers for C structs as ByteBuffer
+ jniMangle(java.nio.ByteBuffer.class, buf, true);
+ } else if (type.isJNIEnv()) {
+ // These are not exposed at the Java level
+ } else {
+ // FIXME: add support for char* -> String conversion
+ throw new RuntimeException("Unknown kind of JavaType: name="+type.getName());
+ }
}
}
+
return buf.toString();
}
- protected void jniMangle(Class c, StringBuffer res) {
- if (c.isArray()) {
- res.append("_3");
- jniMangle(c.getComponentType(), res);
- } else if (c.isPrimitive()) {
+ protected void jniMangle(Class c, StringBuffer res, boolean syntheticArgument) {
+ if (c.isPrimitive()) {
if (c == Boolean.TYPE) res.append("Z");
else if (c == Byte.TYPE) res.append("B");
else if (c == Character.TYPE) res.append("C");
@@ -1047,29 +1157,40 @@ public class CMethodBindingEmitter extends FunctionEmitter
else if (c == Long.TYPE) res.append("J");
else if (c == Float.TYPE) res.append("F");
else if (c == Double.TYPE) res.append("D");
- else throw new InternalError("Illegal primitive type");
+ else throw new RuntimeException("Illegal primitive type \"" + c.getName() + "\"");
} else {
- res.append("L");
- res.append(c.getName().replace('.', '_'));
- res.append("_2");
+ // Arrays and NIO Buffers are always passed down as java.lang.Object.
+ // The only arrays that show up as true arrays in the signature
+ // are the synthetic byte offset arrays created when passing
+ // down arrays of direct Buffers. Compound type wrappers are
+ // passed down as ByteBuffers (no good reason, just to avoid
+ // accidental conflation) so we mangle them differently.
+ if (syntheticArgument) {
+ if (c.isArray()) {
+ res.append("_3");
+ jniMangle(c.getComponentType(), res, false);
+ } else {
+ res.append("L");
+ res.append(c.getName().replace('.', '_'));
+ res.append("_2");
+ }
+ } else {
+ if (c.isArray()) {
+ res.append("_3");
+ jniMangle(c.getComponentType(), res, false);
+ } else if (c == java.lang.String.class) {
+ res.append("L");
+ res.append(c.getName().replace('.', '_'));
+ res.append("_2");
+ } else {
+ res.append("L");
+ res.append("java_lang_Object");
+ res.append("_2");
+ }
+ }
}
}
- private String jniType(Class javaType)
- {
- if (javaType.isPrimitive()) {
- return "j" + javaType.getName();
- } else if (javaType == java.lang.String.class) {
- return "jstring";
- } else if (isNIOBufferClass(javaType)) {
- return "jobject";
- } else {
- throw new RuntimeException(
- "Could not determine JNI type for Java class \"" +
- javaType.getName() + "\"; was not String, primitive or direct buffer");
- }
- }
-
private void emitOutOfMemoryCheck(PrintWriter writer, String varName,
String errorMessage)
{
@@ -1079,7 +1200,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
writer.println(" (*env)->ThrowNew(env, (*env)->FindClass(env, \"java/lang/OutOfMemoryError\"),");
writer.print(" \"" + errorMessage);
writer.print(" in native dispatcher for \\\"");
- writer.print(binding.getName());
+ writer.print(getName());
writer.println("\\\"\");");
writer.print(" return");
if (!binding.getJavaReturnType().isVoid()) {
@@ -1114,11 +1235,14 @@ public class CMethodBindingEmitter extends FunctionEmitter
private void emitGetStringUTFChars(PrintWriter writer,
String sourceVarName,
- String receivingVarName)
+ String receivingVarName,
+ boolean emitElseClause)
{
- writer.print(" if (");
- writer.print(sourceVarName);
- writer.println(" != NULL) {");
+ if (EMIT_NULL_CHECKS) {
+ writer.print(" if (");
+ writer.print(sourceVarName);
+ writer.println(" != NULL) {");
+ }
writer.print(" ");
writer.print(receivingVarName);
writer.print(" = (*env)->GetStringUTFChars(env, ");
@@ -1131,38 +1255,57 @@ public class CMethodBindingEmitter extends FunctionEmitter
writer, receivingVarName,
"Failed to get UTF-8 chars for argument \\\""+sourceVarName+"\\\"");
}
- writer.println(" } else {");
- writer.print(" ");
- writer.print(receivingVarName);
- writer.println(" = NULL;");
- writer.println(" }");
+ if (EMIT_NULL_CHECKS) {
+ writer.print(" }");
+ if (emitElseClause) {
+ writer.print(" else {");
+ writer.print(" ");
+ writer.print(receivingVarName);
+ writer.println(" = NULL;");
+ writer.println(" }");
+ } else {
+ writer.println();
+ }
+ }
}
+
+
private void emitGetDirectBufferAddress(PrintWriter writer,
String sourceVarName,
String receivingVarTypeString,
- String receivingVarName) {
+ String receivingVarName,
+ String byteOffsetVarName,
+ boolean emitElseClause) {
if (EMIT_NULL_CHECKS) {
- writer.print(" if (");
+ writer.print(" if (");
writer.print(sourceVarName);
writer.println(" != NULL) {");
+ writer.print(" ");
}
- writer.print(" ");
+
+ writer.print(" ");
writer.print(receivingVarName);
writer.print(" = (");
writer.print(receivingVarTypeString);
- writer.print(") (*env)->GetDirectBufferAddress(env, ");
+
+ writer.print(") (((char*) (*env)->GetDirectBufferAddress(env, ");
writer.print(sourceVarName);
- writer.println(");");
+ writer.println(")) + " + ((byteOffsetVarName != null) ? byteOffsetVarName : "0") + ");");
+
if (EMIT_NULL_CHECKS) {
- writer.println(" } else {");
- writer.print(" ");
- writer.print(receivingVarName);
- writer.println(" = NULL;");
- writer.println(" }");
+ writer.print(" }");
+ if (emitElseClause) {
+ writer.println(" else {");
+ writer.print(" ");
+ writer.print(receivingVarName);
+ writer.println(" = NULL;");
+ writer.println(" }");
+ } else {
+ writer.println();
+ }
}
}
-
// Note: if the data in the Type needs to be converted from the Java memory
// model to the C memory model prior to calling any C-side functions, then
@@ -1180,80 +1323,54 @@ public class CMethodBindingEmitter extends FunctionEmitter
//
// Note that we don't need to obey const/volatile for outgoing arguments
//
- if (javaType.isNIOBuffer())
- {
+ if (javaType.isNIOBuffer()) {
ptrTypeString = cType.getName();
- }
- else if (javaType.isArray()) {
+ } else if (javaType.isArray()) {
needsDataCopy = javaArgTypeNeedsDataCopy(javaType);
- // It's an array; get the type of the elements in the array
- Class elementType = javaType.getJavaClass().getComponentType();
- if (elementType.isPrimitive())
- {
+ if (javaType.isPrimitiveArray() ||
+ javaType.isNIOBufferArray()) {
ptrTypeString = cType.getName();
- }
- else if (elementType == java.lang.String.class)
- {
- ptrTypeString = "jstring";
- }
- else if (elementType.isArray())
- {
- Class subElementType = elementType.getComponentType();
- if (subElementType.isPrimitive())
- {
- // type is pointer to pointer to primitive
- ptrTypeString = cType.getName();
- }
- else
- {
+ } else if (!javaType.isStringArray()) {
+ Class elementType = javaType.getJavaClass().getComponentType();
+ if (elementType.isArray()) {
+ Class subElementType = elementType.getComponentType();
+ if (subElementType.isPrimitive()) {
+ // type is pointer to pointer to primitive
+ ptrTypeString = cType.getName();
+ } else {
+ // type is pointer to pointer of some type we don't support (maybe
+ // it's an array of pointers to structs?)
+ throw new RuntimeException("Unsupported pointer type: \"" + cType.getName() + "\"");
+ }
+ } else {
// type is pointer to pointer of some type we don't support (maybe
// it's an array of pointers to structs?)
throw new RuntimeException("Unsupported pointer type: \"" + cType.getName() + "\"");
}
-
- }
- else if (isNIOBufferClass(elementType))
- {
- // type is an array of direct buffers of some sort
- ptrTypeString = cType.getName();
}
- else
- {
- // Type is pointer to something we can't/don't handle
- throw new RuntimeException("Unsupported pointer type: \"" + cType.getName() + "\"");
- }
- }
- else if (javaType.isArrayOfCompoundTypeWrappers())
- {
+ } else if (javaType.isArrayOfCompoundTypeWrappers()) {
// FIXME
throw new RuntimeException("Outgoing arrays of StructAccessors not yet implemented");
- }
- else
- {
+ } else {
ptrTypeString = cType.getName();
}
- if (!needsDataCopy)
- {
+ if (!needsDataCopy) {
// declare the pointer variable
writer.print(" ");
writer.print(ptrTypeString);
writer.print(" ");
writer.print(cVariableName);
writer.println(" = NULL;");
- }
- else
- {
+ } else {
// Declare a variable to hold a copy of the argument data in which the
// incoming data has been properly laid out in memory to match the C
// memory model
- //writer.print(" const ");
Class elementType = javaType.getJavaClass().getComponentType();
- if (javaType.isArray() &&
- javaType.getJavaClass().getComponentType() == java.lang.String.class) {
+ if (javaType.isStringArray()) {
writer.print(" const char **");
} else {
- writer.print(ptrTypeString);
+ writer.print(" " + ptrTypeString);
}
writer.print(" ");
writer.print(cVariableName);
@@ -1270,33 +1387,33 @@ public class CMethodBindingEmitter extends FunctionEmitter
JavaType type,
Type cType,
String incomingArgumentName,
- String cVariableName) {
+ String cVariableName,
+ String byteOffsetVarName) {
+ // Compound type wrappers do not get byte offsets added on
+ if (type.isCompoundTypeWrapper()) {
+ byteOffsetVarName = null;
+ }
+
emitGetDirectBufferAddress(writer,
incomingArgumentName,
cType.getName(),
- cVariableName);
+ cVariableName,
+ byteOffsetVarName,
+ false);
+ }
- /*
- if (EMIT_NULL_CHECKS) {
- writer.print(" if (");
- writer.print(incomingArgumentName);
- writer.println(" != NULL) {");
- }
-
- writer.print(" ");
- writer.print(cVariableName);
- writer.print(" = (");
- writer.print(cType.getName());
- writer.print(") (*env)->GetDirectBufferAddress(env, ");
- writer.print(incomingArgumentName);
- writer.println(");");
-
- if (EMIT_NULL_CHECKS) {
- writer.println(" }");
- }
- */
+ protected String byteOffsetArgName(int i) {
+ return byteOffsetArgName(binding.getArgumentName(i));
}
+ protected String byteOffsetArgName(String s) {
+ return s + "_byte_offset";
+ }
+
+ protected String byteOffsetArrayArgName(int i) {
+ return binding.getArgumentName(i) + "_byte_offset_array";
+ }
+
protected String pointerConversionArgumentName(int i) {
return "_ptr" + i;
}
@@ -1328,16 +1445,10 @@ public class CMethodBindingEmitter extends FunctionEmitter
protected boolean javaArgTypeNeedsDataCopy(JavaType javaArgType) {
if (javaArgType.isArray()) {
- Class subArrayElementJavaType = javaArgType.getJavaClass().getComponentType();
- return (subArrayElementJavaType.isArray() ||
- subArrayElementJavaType == java.lang.String.class ||
- isNIOBufferClass(subArrayElementJavaType));
+ return (javaArgType.isNIOBufferArray() ||
+ javaArgType.isStringArray() ||
+ javaArgType.getJavaClass().getComponentType().isArray());
}
return false;
}
-
- protected static boolean isNIOBufferClass(Class c) {
- return java.nio.Buffer.class.isAssignableFrom(c);
- }
}
-
diff --git a/src/net/java/games/gluegen/CodeGenUtils.java b/src/classes/com/sun/gluegen/CodeGenUtils.java
index b89994cdf..553ef26b3 100644
--- a/src/net/java/games/gluegen/CodeGenUtils.java
+++ b/src/classes/com/sun/gluegen/CodeGenUtils.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
import java.io.*;
import java.util.*;
@@ -94,7 +94,7 @@ public class CodeGenUtils
w.print(imports[i]);
w.println(';');
}
- w.println("import net.java.games.gluegen.runtime.*;");
+ w.println("import com.sun.gluegen.runtime.*;");
w.println();
diff --git a/src/net/java/games/gluegen/CommentEmitter.java b/src/classes/com/sun/gluegen/CommentEmitter.java
index 10256acba..30004f8bc 100644
--- a/src/net/java/games/gluegen/CommentEmitter.java
+++ b/src/classes/com/sun/gluegen/CommentEmitter.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
import java.io.*;
diff --git a/src/net/java/games/gluegen/DebugEmitter.java b/src/classes/com/sun/gluegen/DebugEmitter.java
index c8e8b3869..bbcde0e0d 100644
--- a/src/net/java/games/gluegen/DebugEmitter.java
+++ b/src/classes/com/sun/gluegen/DebugEmitter.java
@@ -37,11 +37,11 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
import java.util.*;
-import net.java.games.gluegen.cgram.types.*;
+import com.sun.gluegen.cgram.types.*;
/** Debug emitter which prints the parsing results to standard output. */
diff --git a/src/net/java/games/gluegen/FunctionEmitter.java b/src/classes/com/sun/gluegen/FunctionEmitter.java
index 77a79b6fc..baf08b93a 100644
--- a/src/net/java/games/gluegen/FunctionEmitter.java
+++ b/src/classes/com/sun/gluegen/FunctionEmitter.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
import java.util.*;
import java.io.*;
diff --git a/src/net/java/games/gluegen/GlueEmitter.java b/src/classes/com/sun/gluegen/GlueEmitter.java
index 00147dfd2..d6f5fede8 100644
--- a/src/net/java/games/gluegen/GlueEmitter.java
+++ b/src/classes/com/sun/gluegen/GlueEmitter.java
@@ -37,10 +37,10 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
import java.util.*;
-import net.java.games.gluegen.cgram.types.*;
+import com.sun.gluegen.cgram.types.*;
/** Specifies the interface by which GlueGen requests glue code to be
generated. Can be replaced to generate glue code for other
diff --git a/src/net/java/games/gluegen/GlueEmitterControls.java b/src/classes/com/sun/gluegen/GlueEmitterControls.java
index 15df83654..46ff9fd91 100644
--- a/src/net/java/games/gluegen/GlueEmitterControls.java
+++ b/src/classes/com/sun/gluegen/GlueEmitterControls.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
/** Specifies the interface by which a GlueEmitter can request
additional information from the glue generator. */
@@ -46,4 +46,8 @@ public interface GlueEmitterControls {
/** Requests emission of an accessor for a struct that will not be
referenced by any functions or other structs. */
public void forceStructEmission(String typedefName);
+
+ /** Finds the full path name of the specified header file based on
+ the include directories specified on the command line. */
+ public String findHeaderFile(String headerFileName);
}
diff --git a/src/net/java/games/gluegen/GlueGen.java b/src/classes/com/sun/gluegen/GlueGen.java
index 442f6405b..c192ae8cd 100644
--- a/src/net/java/games/gluegen/GlueGen.java
+++ b/src/classes/com/sun/gluegen/GlueGen.java
@@ -37,26 +37,31 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
import java.io.*;
import java.util.*;
import antlr.*;
import antlr.collections.*;
-import net.java.games.gluegen.cgram.*;
-import net.java.games.gluegen.cgram.types.*;
-import net.java.games.gluegen.pcpp.*;
+import com.sun.gluegen.cgram.*;
+import com.sun.gluegen.cgram.types.*;
+import com.sun.gluegen.pcpp.*;
/** Glue code generator for C functions and data structures. */
public class GlueGen implements GlueEmitterControls {
private java.util.List forcedStructNames = new ArrayList();
+ private PCPP preprocessor;
public void forceStructEmission(String typedefName) {
forcedStructNames.add(typedefName);
}
+ public String findHeaderFile(String headerFileName) {
+ return preprocessor.findFile(headerFileName);
+ }
+
public void run(String[] args) {
try {
Reader reader = null;
@@ -99,7 +104,7 @@ public class GlueGen implements GlueEmitterControls {
}
}
- final PCPP preprocessor = new PCPP(includePaths);
+ preprocessor = new PCPP(includePaths);
PipedInputStream ppIn = new PipedInputStream();
final PipedOutputStream ppOut = new PipedOutputStream(ppIn);
preprocessor.setOut(ppOut);
@@ -311,8 +316,8 @@ public class GlueGen implements GlueEmitterControls {
System.out.println("passing input through minimal pseudo-C-preprocessor. Use -I");
System.out.println("command-line arguments to specify the search path for #includes.");
System.out.println("Emitter class name can be specified with -E option: i.e.,");
- System.out.println("-Enet.java.games.gluegen.JavaEmitter (the default). Use");
- System.out.println("-Enet.java.games.gluegen.DebugEmitter to print recognized entities");
+ System.out.println("-Ecom.sun.gluegen.JavaEmitter (the default). Use");
+ System.out.println("-Ecom.sun.gluegen.DebugEmitter to print recognized entities");
System.out.println("(#define directives to constant numbers, typedefs, and function");
System.out.println("declarations) to standard output. Emitter-specific configuration");
System.out.println("file or files can be specified with -C option; e.g,");
diff --git a/src/net/java/games/gluegen/JavaConfiguration.java b/src/classes/com/sun/gluegen/JavaConfiguration.java
index 8722725df..a48582a3f 100644
--- a/src/net/java/games/gluegen/JavaConfiguration.java
+++ b/src/classes/com/sun/gluegen/JavaConfiguration.java
@@ -37,18 +37,19 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
import java.io.*;
import java.util.*;
import java.util.regex.*;
-import net.java.games.gluegen.cgram.types.*;
+import com.sun.gluegen.cgram.types.*;
/** Parses and provides access to the contents of .cfg files for the
JavaEmitter. */
public class JavaConfiguration {
+
private int nestedReads;
private String packageName;
private String implPackageName;
@@ -85,6 +86,7 @@ public class JavaConfiguration {
* checks fail. Defaults to RuntimeException.
*/
private String runtimeExceptionType = "RuntimeException";
+ private Map/*<String,Integer>*/ accessControl = new HashMap();
private Map/*<String,TypeInfo>*/ typeInfoMap = new HashMap();
private Set/*<String>*/ returnsString = new HashSet();
private Map/*<String, String>*/ returnedArrayLengths = new HashMap();
@@ -94,24 +96,16 @@ public class JavaConfiguration {
*/
private Map/*<String,List<Integer>>*/ argumentsAreString = new HashMap();
private Set/*<Pattern>*/ ignores = new HashSet();
+ private Map/*<String,Pattern>*/ ignoreMap = new HashMap();
private Set/*<Pattern>*/ ignoreNots = new HashSet();
private Set/*<Pattern>*/ unimplemented = new HashSet();
- private Set/*<String>*/ nioOnly = new HashSet();
- /** See {@link #nioMode} */
- public static final int NIO_MODE_VOID_ONLY = 1;
- /** See {@link #nioMode} */
- public static final int NIO_MODE_ALL_POINTERS = 2;
- private int nioMode = NIO_MODE_VOID_ONLY;
- private Set/*<String>*/ noNio = new HashSet();
- private Set/*<String>*/ forcedNio = new HashSet();
- private boolean flattenNIOVariants = true;
+ private Set/*<String>*/ nioDirectOnly = new HashSet();
private Set/*<String>*/ manuallyImplement = new HashSet();
private Map/*<String,List<String>>*/ customJavaCode = new HashMap();
private Map/*<String,List<String>>*/ classJavadoc = new HashMap();
private Map/*<String,String>*/ structPackages = new HashMap();
private List/*<String>*/ customCCode = new ArrayList();
private List/*<String>*/ forcedStructs = new ArrayList();
- private Map/*<String,List<Integer>>*/ mirroredArgs = new HashMap();
private Map/*<String, String>*/ returnValueCapacities = new HashMap();
private Map/*<String, String>*/ returnValueLengths = new HashMap();
private Map/*<String, List<String>>*/ temporaryCVariableDeclarations = new HashMap();
@@ -119,6 +113,9 @@ public class JavaConfiguration {
private Map/*<String,List<String>>*/ extendedInterfaces = new HashMap();
private Map/*<String,List<String>>*/ implementedInterfaces = new HashMap();
private Map/*<String,String>*/ javaTypeRenames = new HashMap();
+ private Map/*<String,String>*/ javaMethodRenames = new HashMap();
+ private Map/*<String,List<String>>*/ javaPrologues = new HashMap();
+ private Map/*<String,List<String>>*/ javaEpilogues = new HashMap();
/** Reads the configuration file.
@param filename path to file that should be read
@@ -182,10 +179,10 @@ public class JavaConfiguration {
"\"Style AllStatic\"");
}
- if (className == null) {
+ if (className == null && (emissionStyle() != JavaEmitter.IMPL_ONLY)) {
throw new RuntimeException("Output class name was not specified in configuration file");
}
- if (packageName == null) {
+ if (packageName == null && (emissionStyle() != JavaEmitter.IMPL_ONLY)) {
throw new RuntimeException("Output package name was not specified in configuration file");
}
@@ -198,11 +195,17 @@ public class JavaConfiguration {
if (implClassName == null) {
// implClassName defaults to "<className>Impl" if ImplJavaClass
// directive is not used
+ if (className == null) {
+ throw new RuntimeException("If ImplJavaClass is not specified, must specify JavaClass");
+ }
implClassName = className + "Impl";
}
if (implPackageName == null) {
// implPackageName defaults to "<packageName>.impl" if ImplPackage
// directive is not used
+ if (packageName == null) {
+ throw new RuntimeException("If ImplPackageName is not specified, must specify PackageName");
+ }
implPackageName = packageName + ".impl";
}
}
@@ -225,6 +228,16 @@ public class JavaConfiguration {
public boolean nativeOutputUsesJavaHierarchy() { return nativeOutputUsesJavaHierarchy; }
/** Returns the code emission style (constants in JavaEmitter) parsed from the configuration file. */
public int emissionStyle() { return emissionStyle; }
+ /** Returns the access control for the emitted Java method. Returns one of JavaEmitter.ACC_PUBLIC, JavaEmitter.ACC_PROTECTED, JavaEmitter.ACC_PRIVATE, or JavaEmitter.ACC_PACKAGE_PRIVATE. */
+ public int accessControl(String methodName) {
+ Integer ret = (Integer) accessControl.get(methodName);
+ if (ret != null) {
+ return ret.intValue();
+ }
+ // Default access control is public
+ return JavaEmitter.ACC_PUBLIC;
+ }
+
/** Returns the kind of exception to raise if run-time checks fail in the generated code. */
public String runtimeExceptionType() { return runtimeExceptionType; }
/** Returns the list of imports that should be emitted at the top of each .java file. */
@@ -316,42 +329,8 @@ public class JavaConfiguration {
/** Returns true if the given function should only create a java.nio
variant, and no array variants, for <code>void*</code> and other
C primitive pointers. */
- public boolean nioOnly(String functionName) {
- return nioOnly.contains(functionName);
- }
-
- /** Returns true if the user requested that the given function
- should only create array variants, and no java.nio variant, for
- <code>void*</code> and other C primitive pointers, overriding
- the NIO mode default. */
- public boolean noNio(String functionName) {
- return noNio.contains(functionName);
- }
-
- /** Returns true if the user requested that the given function
- should create a java.nio variant for the given function's
- <code>void*</code> and other C primitive pointers, overriding
- the NIO mode default. */
- public boolean forcedNio(String functionName) {
- return forcedNio.contains(functionName);
- }
-
- /** Returns the default NIO generation mode for C primitive pointer
- arguments. NIO_MODE_VOID_ONLY is the default and specifies
- that only void* arguments will have java.nio variants generated
- for them. NIO_MODE_ALL_POINTERS specifies that all C
- primitive arguments will have java.nio variants generated. */
- public int nioMode() {
- return nioMode;
- }
-
- /** Returns true if, for the plethora of java.nio variants generated
- for primitive C pointer types, the emitter should flatten the
- output down to two variants: one taking only Java primitive
- arrays as arguments, and one taking only java.nio.Buffers as
- arguments. */
- public boolean flattenNIOVariants() {
- return flattenNIOVariants;
+ public boolean nioDirectOnly(String functionName) {
+ return nioDirectOnly.contains(functionName);
}
/** Returns true if the glue code for the given function will be
@@ -409,14 +388,6 @@ public class JavaConfiguration {
return forcedStructs;
}
- /** Returns a List of Integers indicating the indices of arguments
- in this function that should be expanded to the same type when
- binding functions with multiple void* arguments. Returns null if
- no such indices were specified. */
- public List/*<Integer>*/ mirroredArgs(String functionName) {
- return (List) mirroredArgs.get(functionName);
- }
-
/** Returns a MessageFormat string of the C expression calculating
the capacity of the java.nio.ByteBuffer being returned from a
native method, or null if no expression has been specified. */
@@ -540,6 +511,14 @@ public class JavaConfiguration {
return javaTypeName;
}
+ /** Returns a replacement name for this function which should be
+ used as the Java name for the bound method. It still calls the
+ originally-named C function under the hood. Returns null if this
+ function has not been explicitly renamed. */
+ public String getJavaMethodRename(String functionName) {
+ return (String) javaMethodRenames.get(functionName);
+ }
+
/** Returns true if the emission style is AllStatic. */
public boolean allStatic() {
return (emissionStyle == JavaEmitter.ALL_STATIC);
@@ -558,6 +537,38 @@ public class JavaConfiguration {
emissionStyle() == JavaEmitter.IMPL_ONLY);
}
+ /** Returns a list of Strings which should be emitted as a prologue
+ to the body for the Java-side glue code for the given method.
+ Returns null if no prologue was specified. */
+ public List/*<String>*/ javaPrologueForMethod(MethodBinding binding,
+ boolean forImplementingMethodCall,
+ boolean eraseBufferAndArrayTypes) {
+ List/*<String>*/ res = (List/*<String>*/) javaPrologues.get(binding.getName());
+ if (res == null) {
+ // Try again with method name and descriptor
+ res = (List/*<String>*/) javaPrologues.get(binding.getName() +
+ binding.getDescriptor(forImplementingMethodCall,
+ eraseBufferAndArrayTypes));
+ }
+ return res;
+ }
+
+ /** Returns a list of Strings which should be emitted as an epilogue
+ to the body for the Java-side glue code for the given method.
+ Returns null if no epilogue was specified. */
+ public List/*<String>*/ javaEpilogueForMethod(MethodBinding binding,
+ boolean forImplementingMethodCall,
+ boolean eraseBufferAndArrayTypes) {
+ List/*<String>*/ res = (List/*<String>*/) javaEpilogues.get(binding.getName());
+ if (res == null) {
+ // Try again with method name and descriptor
+ res = (List/*<String>*/) javaEpilogues.get(binding.getName() +
+ binding.getDescriptor(forImplementingMethodCall,
+ eraseBufferAndArrayTypes));
+ }
+ return res;
+ }
+
//----------------------------------------------------------------------
// Internals only below this point
//
@@ -593,6 +604,8 @@ public class JavaConfiguration {
System.err.println("WARNING: Error parsing \"style\" command at line " + lineNo +
" in file \"" + filename + "\"");
}
+ } else if (cmd.equalsIgnoreCase("AccessControl")) {
+ readAccessControl(tok, filename, lineNo);
} else if (cmd.equalsIgnoreCase("Import")) {
imports.add(readString("Import", tok, filename, lineNo));
} else if (cmd.equalsIgnoreCase("Opaque")) {
@@ -607,6 +620,8 @@ public class JavaConfiguration {
readArgumentIsString(tok, filename, lineNo);
} else if (cmd.equalsIgnoreCase("Ignore")) {
readIgnore(tok, filename, lineNo);
+ } else if (cmd.equalsIgnoreCase("Unignore")) {
+ readUnignore(tok, filename, lineNo);
} else if (cmd.equalsIgnoreCase("IgnoreNot")) {
readIgnoreNot(tok, filename, lineNo);
} else if (cmd.equalsIgnoreCase("Unimplemented")) {
@@ -627,20 +642,10 @@ public class JavaConfiguration {
readClassJavadoc(tok, filename, lineNo);
// Warning: make sure delimiters are reset at the top of this loop
// because readClassJavadoc changes them.
- } else if (cmd.equalsIgnoreCase("NioOnly")) {
- nioOnly.add(readString("NioOnly", tok, filename, lineNo));
- } else if (cmd.equalsIgnoreCase("NoNio")) {
- noNio.add(readString("NoNio", tok, filename, lineNo));
- } else if (cmd.equalsIgnoreCase("ForcedNio")) {
- forcedNio.add(readString("ForcedNio", tok, filename, lineNo));
- } else if (cmd.equalsIgnoreCase("NioMode")) {
- readNioMode(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("FlattenNIOVariants")) {
- flattenNIOVariants = readBoolean("FlattenNIOVariants", tok, filename, lineNo).booleanValue();
+ } else if (cmd.equalsIgnoreCase("NioDirectOnly")) {
+ nioDirectOnly.add(readString("NioDirectOnly", tok, filename, lineNo));
} else if (cmd.equalsIgnoreCase("EmitStruct")) {
forcedStructs.add(readString("EmitStruct", tok, filename, lineNo));
- } else if (cmd.equalsIgnoreCase("MirrorExpandedBindingArgs")) {
- readMirrorExpandedBindingArgs(tok, filename, lineNo);
} else if (cmd.equalsIgnoreCase("StructPackage")) {
readStructPackage(tok, filename, lineNo);
} else if (cmd.equalsIgnoreCase("TemporaryCVariableDeclaration")) {
@@ -669,8 +674,18 @@ public class JavaConfiguration {
readImplements(tok, filename, lineNo);
} else if (cmd.equalsIgnoreCase("RenameJavaType")) {
readRenameJavaType(tok, filename, lineNo);
+ } else if (cmd.equalsIgnoreCase("RenameJavaMethod")) {
+ readRenameJavaMethod(tok, filename, lineNo);
} else if (cmd.equalsIgnoreCase("RuntimeExceptionType")) {
runtimeExceptionType = readString("RuntimeExceptionType", tok, filename, lineNo);
+ } else if (cmd.equalsIgnoreCase("JavaPrologue")) {
+ readJavaPrologueOrEpilogue(tok, filename, lineNo, true);
+ // Warning: make sure delimiters are reset at the top of this loop
+ // because readJavaPrologueOrEpilogue changes them.
+ } else if (cmd.equalsIgnoreCase("JavaEpilogue")) {
+ readJavaPrologueOrEpilogue(tok, filename, lineNo, false);
+ // Warning: make sure delimiters are reset at the top of this loop
+ // because readJavaPrologueOrEpilogue changes them.
} else {
throw new RuntimeException("Unknown command \"" + cmd +
"\" in command file " + filename +
@@ -708,6 +723,30 @@ public class JavaConfiguration {
throw new RuntimeException("Only primitive types are supported here");
}
+ protected void readAccessControl(StringTokenizer tok, String filename, int lineNo) {
+ try {
+ String methodName = tok.nextToken();
+ String style = tok.nextToken();
+ int acc = 0;
+ if (style.equalsIgnoreCase("PUBLIC")) {
+ acc = JavaEmitter.ACC_PUBLIC;
+ } else if (style.equalsIgnoreCase("PROTECTED")) {
+ acc = JavaEmitter.ACC_PROTECTED;
+ } else if (style.equalsIgnoreCase("PRIVATE")) {
+ acc = JavaEmitter.ACC_PRIVATE;
+ } else if (style.equalsIgnoreCase("PACKAGE_PRIVATE")) {
+ acc = JavaEmitter.ACC_PRIVATE;
+ } else {
+ throw new RuntimeException("Error parsing \"AccessControl\" command at line " + lineNo +
+ " in file \"" + filename + "\"");
+ }
+ accessControl.put(methodName, new Integer(acc));
+ } catch (Exception e) {
+ throw new RuntimeException("Error parsing \"AccessControl\" command at line " + lineNo +
+ " in file \"" + filename + "\"", e);
+ }
+ }
+
protected void readOpaque(StringTokenizer tok, String filename, int lineNo) {
try {
JavaType javaType = JavaType.createForClass(stringToPrimitiveType(tok.nextToken()));
@@ -756,7 +795,9 @@ public class JavaConfiguration {
protected void readIgnore(StringTokenizer tok, String filename, int lineNo) {
try {
String regex = tok.nextToken();
- ignores.add(Pattern.compile(regex));
+ Pattern pattern = Pattern.compile(regex);
+ ignores.add(pattern);
+ ignoreMap.put(regex, pattern);
//System.err.println("IGNORING " + regex + " / " + ignores.get(regex));
} catch (NoSuchElementException e) {
throw new RuntimeException("Error parsing \"Ignore\" command at line " + lineNo +
@@ -764,6 +805,19 @@ public class JavaConfiguration {
}
}
+ protected void readUnignore(StringTokenizer tok, String filename, int lineNo) {
+ try {
+ String regex = tok.nextToken();
+ Pattern pattern = (Pattern) ignoreMap.get(regex);
+ ignoreMap.remove(regex);
+ ignores.remove(pattern);
+ //System.err.println("UN-IGNORING " + regex + " / " + ignores.get(regex));
+ } catch (NoSuchElementException e) {
+ throw new RuntimeException("Error parsing \"Unignore\" command at line " + lineNo +
+ " in file \"" + filename + "\"", e);
+ }
+ }
+
protected void readIgnoreNot(StringTokenizer tok, String filename, int lineNo) {
try {
String regex = tok.nextToken();
@@ -848,119 +902,6 @@ public class JavaConfiguration {
codeList.add(code);
}
- /**
- * Sets the default NIO generation mode for C primitive
- * pointers. Options are VOID_ONLY or ALL_POINTERS. When the mode is
- * set to VOID_ONLY, java.nio variants of methods are only generated
- * for C primitive pointers of type <code>void*</code>. All other
- * pointers are translated by default into Java primitive arrays.
- * When the mode is set to ALL_POINTERS, C primitive pointers of
- * other types (i.e., <code>int*</code>) will have java.nio variants
- * generated for them (i.e., <code>IntBuffer</code> as opposed to
- * merely <code>int[]</code>). This default mode can be overridden
- * with the NioOnly and NoNio directives. The default for this mode
- * is currently VOID_ONLY.
- */
- protected void readNioMode(StringTokenizer tok, String filename, int lineNo) {
- try {
- String mode = tok.nextToken();
- if (mode.equalsIgnoreCase("VOID_ONLY")) {
- nioMode = NIO_MODE_VOID_ONLY;
- } else if (mode.equalsIgnoreCase("ALL_POINTERS")) {
- nioMode = NIO_MODE_ALL_POINTERS;
- } else {
- throw new RuntimeException("Error parsing \"NioMode\" command at line " + lineNo +
- " in file \"" + filename + "\"; expected VOID_ONLY or ALL_POINTERS");
- }
- } catch (NoSuchElementException e) {
- throw new RuntimeException(
- "Error parsing \"NioMode\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- /**
- * When void* arguments in the C function prototypes are encountered, the
- * emitter will try to expand the binding and create Java entry points for
- * all possible array types. If there are 2 or more void* arguments in the C
- * prototype, this directive lets you specify which of those arguments
- * should always be expanded to the same type. <p>
- *
- * For example, given the C prototype:
- * <pre>
- * void FuncName(void *foo, void *bar);
- * </pre>
- *
- * The emitter will normally emit multiple Java entry points:
- * <pre>
- * public abstract void FuncName(boolean[] foo, java.nio.Buffer bar);
- * public abstract void FuncName(boolean[] foo, boolean[] bar);
- * public abstract void FuncName(boolean[] foo, byte[] bar);
- * public abstract void FuncName(boolean[] foo, char[] bar);
- * public abstract void FuncName(boolean[] foo, short[] bar);
- * public abstract void FuncName(boolean[] foo, int[] bar);
- * public abstract void FuncName(boolean[] foo, long[] bar);
- * public abstract void FuncName(boolean[] foo, float[] bar);
- * public abstract void FuncName(boolean[] foo, double[] bar);
- *
- * public abstract void FuncName(byte[] foo, java.nio.Buffer bar);
- * public abstract void FuncName(byte[] foo, boolean[] bar);
- * public abstract void FuncName(byte[] foo, byte[] bar);
- * <...etc for all variants on the second parameter...>
- *
- * public abstract void FuncName(char[] foo, java.nio.Buffer bar);
- * public abstract void FuncName(char[] foo, boolean[] bar);
- * public abstract void FuncName(char[] foo, byte[] bar);
- * <...etc for all variants on the second parameter...>
- * <...and so on for all remaining variants on the first parameter...>
- * </pre>
- *
- * This directive lets you specify that arguments at a particular index
- * should always be expanded to the same type. For example, the directive:
- * <pre>
- * MirrorExpandedBindingArgs FuncName 0 1
- * </pre>
- * will force the first and second arguments in function FuncName to be
- * expanded identically. This would result in the emission of the following
- * entry points only:
- * <pre>
- * public abstract void FuncName(java.nio.Buffer[] foo, java.nio.Buffer bar);
- * public abstract void FuncName(boolean[] foo, boolean[] bar);
- * public abstract void FuncName(byte[] foo, byte[] bar);
- * public abstract void FuncName(char[] foo, char[] bar);
- * public abstract void FuncName(short[] foo, short[] bar);
- * public abstract void FuncName(int[] foo, int[] bar);
- * public abstract void FuncName(long[] foo, long[] bar);
- * public abstract void FuncName(float[] foo, float[] bar);
- * public abstract void FuncName(double[] foo, double[] bar);
- * </pre>
- */
- protected void readMirrorExpandedBindingArgs(StringTokenizer tok, String filename, int lineNo) {
- try {
- String methodName = tok.nextToken();
- ArrayList argIndices = new ArrayList(2);
- while (tok.hasMoreTokens())
- {
- Integer idx = Integer.valueOf(tok.nextToken());
- argIndices.add(idx);
- }
-
- if(argIndices.size() > 1)
- {
- mirroredArgs.put(methodName, argIndices);
- }
- else
- {
- throw new RuntimeException("ERROR: Error parsing \"MirrorExpandedBindingArgs\" command at line " + lineNo +
- " in file \"" + filename + "\": directive requires at least 2 argument indices");
- }
- } catch (NoSuchElementException e) {
- throw new RuntimeException(
- "Error parsing \"MirrorExpandedBindingArgs\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
/**
* When const char* arguments in the C function prototypes are encountered,
* the emitter will normally convert them to <code>byte[]</code>
@@ -1150,6 +1091,46 @@ public class JavaConfiguration {
}
}
+ protected void readRenameJavaMethod(StringTokenizer tok, String filename, int lineNo) {
+ try {
+ String fromName = tok.nextToken();
+ String toName = tok.nextToken();
+ javaMethodRenames.put(fromName, toName);
+ } catch (NoSuchElementException e) {
+ throw new RuntimeException("Error parsing \"RenameJavaMethod\" command at line " + lineNo +
+ " in file \"" + filename + "\": missing expected parameter", e);
+ }
+ }
+
+ protected void readJavaPrologueOrEpilogue(StringTokenizer tok, String filename, int lineNo, boolean prologue) {
+ try {
+ String methodName = tok.nextToken();
+ String restOfLine = tok.nextToken("\n\r\f");
+ restOfLine = restOfLine.trim();
+ if (startsWithDescriptor(restOfLine)) {
+ // Assume it starts with signature for disambiguation
+ int spaceIdx = restOfLine.indexOf(' ');
+ if (spaceIdx > 0) {
+ String descriptor = restOfLine.substring(0, spaceIdx);
+ restOfLine = restOfLine.substring(spaceIdx + 1, restOfLine.length());
+ methodName = methodName + descriptor;
+ }
+ }
+ Map code = (prologue ? javaPrologues : javaEpilogues);
+ List/*<String>*/ data = (List/*<String>*/) code.get(methodName);
+ if (data == null) {
+ data = new ArrayList/*<String>*/();
+ code.put(methodName, data);
+ }
+ data.add(restOfLine);
+ } catch (NoSuchElementException e) {
+ throw new RuntimeException("Error parsing \"" +
+ (prologue ? "JavaPrologue" : "JavaEpilogue") +
+ "\" command at line " + lineNo +
+ " in file \"" + filename + "\"", e);
+ }
+ }
+
protected static TypeInfo parseTypeInfo(String cType, JavaType javaType) {
String typeName = null;
int pointerDepth = 0;
@@ -1181,4 +1162,71 @@ public class JavaConfiguration {
}
tmp.setNext(info);
}
+
+ private static int nextIndexAfterType(String s, int idx) {
+ int len = s.length();
+ while (idx < len) {
+ char c = s.charAt(idx);
+
+ if (Character.isJavaIdentifierStart(c) ||
+ Character.isJavaIdentifierPart(c) ||
+ (c == '/')) {
+ idx++;
+ } else if (c == ';') {
+ return (idx + 1);
+ } else {
+ return -1;
+ }
+ }
+ return -1;
+ }
+
+ private static int nextIndexAfterDescriptor(String s, int idx) {
+ char c = s.charAt(idx);
+ switch (c) {
+ case 'B':
+ case 'C':
+ case 'D':
+ case 'F':
+ case 'I':
+ case 'J':
+ case 'S':
+ case 'Z':
+ case 'V': return (1 + idx);
+ case 'L': return nextIndexAfterType(s, idx + 1);
+ case ')': return idx;
+ default: break;
+ }
+ return -1;
+ }
+
+ protected static boolean startsWithDescriptor(String s) {
+ // Try to see whether the String s starts with a valid Java
+ // descriptor.
+
+ int idx = 0;
+ int len = s.length();
+ while ((idx < len) && s.charAt(idx) == ' ') {
+ ++idx;
+ }
+
+ if (idx >= len) return false;
+ if (s.charAt(idx++) != '(') return false;
+ while (idx < len) {
+ int nextIdx = nextIndexAfterDescriptor(s, idx);
+ if (nextIdx < 0) {
+ return false;
+ }
+ if (nextIdx == idx) {
+ // ')'
+ break;
+ }
+ idx = nextIdx;
+ }
+ int nextIdx = nextIndexAfterDescriptor(s, idx + 1);
+ if (nextIdx < 0) {
+ return false;
+ }
+ return true;
+ }
}
diff --git a/src/net/java/games/gluegen/JavaEmitter.java b/src/classes/com/sun/gluegen/JavaEmitter.java
index ba412fb55..24687d36f 100644
--- a/src/net/java/games/gluegen/JavaEmitter.java
+++ b/src/classes/com/sun/gluegen/JavaEmitter.java
@@ -37,13 +37,13 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
import java.io.*;
import java.util.*;
import java.text.MessageFormat;
-import net.java.games.gluegen.cgram.types.*;
+import com.sun.gluegen.cgram.types.*;
// PROBLEMS:
// - what if something returns 'const int *'? Could we
@@ -68,10 +68,18 @@ public class JavaEmitter implements GlueEmitter {
* (InterfaceAndImpl), only the interface (InterfaceOnly), or only
* the implementation (ImplOnly).
*/
- static final int ALL_STATIC = 1;
- static final int INTERFACE_AND_IMPL = 2;
- static final int INTERFACE_ONLY = 3;
- static final int IMPL_ONLY = 4;
+ public static final int ALL_STATIC = 1;
+ public static final int INTERFACE_AND_IMPL = 2;
+ public static final int INTERFACE_ONLY = 3;
+ public static final int IMPL_ONLY = 4;
+
+ /**
+ * Access control for emitted Java methods.
+ */
+ public static final int ACC_PUBLIC = 1;
+ public static final int ACC_PROTECTED = 2;
+ public static final int ACC_PRIVATE = 3;
+ public static final int ACC_PACKAGE_PRIVATE = 4;
private PrintWriter javaWriter; // Emits either interface or, in AllStatic mode, everything
private PrintWriter javaImplWriter; // Only used in non-AllStatic modes for impl class
@@ -300,119 +308,304 @@ public class JavaEmitter implements GlueEmitter {
}
/**
+ * Generates the public emitters for this MethodBinding which will
+ * produce either simply signatures (for the interface class, if
+ * any) or function definitions with or without a body (depending on
+ * whether or not the implementing function can go directly to
+ * native code because it doesn't need any processing of the
+ * outgoing arguments).
+ */
+ protected void generatePublicEmitters(MethodBinding binding,
+ List allEmitters,
+ boolean signatureOnly) {
+ PrintWriter writer = ((signatureOnly || cfg.allStatic()) ? javaWriter() : javaImplWriter());
+
+ if (cfg.manuallyImplement(binding.getName()) && !signatureOnly) {
+ // We only generate signatures for manually-implemented methods;
+ // user provides the implementation
+ return;
+ }
+
+ // It's possible we may not need a body even if signatureOnly is
+ // set to false; for example, if the routine doesn't take any
+ // arrays or buffers as arguments
+ boolean isUnimplemented = cfg.isUnimplemented(binding.getName());
+ List/*<String>*/ prologue = cfg.javaPrologueForMethod(binding, false, false);
+ List/*<String>*/ epilogue = cfg.javaEpilogueForMethod(binding, false, false);
+ boolean needsBody = (isUnimplemented ||
+ (binding.needsNIOWrappingOrUnwrapping() ||
+ binding.signatureUsesJavaPrimitiveArrays()) ||
+ (prologue != null) ||
+ (epilogue != null));
+
+ JavaMethodBindingEmitter emitter =
+ new JavaMethodBindingEmitter(binding,
+ writer,
+ cfg.runtimeExceptionType(),
+ !signatureOnly && needsBody,
+ false,
+ cfg.nioDirectOnly(binding.getName()),
+ false,
+ false,
+ false,
+ isUnimplemented);
+ switch (cfg.accessControl(binding.getName())) {
+ case ACC_PUBLIC: emitter.addModifier(JavaMethodBindingEmitter.PUBLIC); break;
+ case ACC_PROTECTED: emitter.addModifier(JavaMethodBindingEmitter.PROTECTED); break;
+ case ACC_PRIVATE: emitter.addModifier(JavaMethodBindingEmitter.PRIVATE); break;
+ default: break; // package-private adds no modifiers
+ }
+ if (cfg.allStatic()) {
+ emitter.addModifier(JavaMethodBindingEmitter.STATIC);
+ }
+ if (!isUnimplemented && !needsBody && !signatureOnly) {
+ emitter.addModifier(JavaMethodBindingEmitter.NATIVE);
+ }
+ emitter.setReturnedArrayLengthExpression(cfg.returnedArrayLength(binding.getName()));
+ emitter.setPrologue(prologue);
+ emitter.setEpilogue(epilogue);
+ allEmitters.add(emitter);
+ }
+
+ /**
+ * Generates the private emitters for this MethodBinding. On the
+ * Java side these will simply produce signatures for native
+ * methods. On the C side these will create the emitters which will
+ * write the JNI code to interface to the functions. We need to be
+ * careful to make the signatures all match up and not produce too
+ * many emitters which would lead to compilation errors from
+ * creating duplicated methods / functions.
+ */
+ protected void generatePrivateEmitters(MethodBinding binding,
+ List allEmitters) {
+ if (cfg.manuallyImplement(binding.getName())) {
+ // Don't produce emitters for the implementation class
+ return;
+ }
+
+ boolean hasPrologueOrEpilogue =
+ ((cfg.javaPrologueForMethod(binding, false, false) != null) ||
+ (cfg.javaEpilogueForMethod(binding, false, false) != null));
+
+ // If we already generated a public native entry point for this
+ // method, don't emit another one
+ if (!cfg.isUnimplemented(binding.getName()) &&
+ (binding.needsNIOWrappingOrUnwrapping() ||
+ binding.signatureUsesJavaPrimitiveArrays() ||
+ hasPrologueOrEpilogue)) {
+ PrintWriter writer = (cfg.allStatic() ? javaWriter() : javaImplWriter());
+
+ // If the binding uses primitive arrays, we are going to emit
+ // the private native entry point for it along with the version
+ // taking only NIO buffers
+ if (!binding.signatureUsesJavaPrimitiveArrays()) {
+ // (Always) emit the entry point taking only direct buffers
+ JavaMethodBindingEmitter emitter =
+ new JavaMethodBindingEmitter(binding,
+ writer,
+ cfg.runtimeExceptionType(),
+ false,
+ true,
+ cfg.nioDirectOnly(binding.getName()),
+ true,
+ true,
+ false,
+ false);
+ emitter.addModifier(JavaMethodBindingEmitter.PRIVATE);
+ if (cfg.allStatic()) {
+ emitter.addModifier(JavaMethodBindingEmitter.STATIC);
+ }
+ emitter.addModifier(JavaMethodBindingEmitter.NATIVE);
+ emitter.setReturnedArrayLengthExpression(cfg.returnedArrayLength(binding.getName()));
+ allEmitters.add(emitter);
+
+ // Optionally emit the entry point taking arrays which handles
+ // both the public entry point taking arrays as well as the
+ // indirect buffer case
+ if (!cfg.nioDirectOnly(binding.getName()) &&
+ binding.signatureCanUseIndirectNIO()) {
+ emitter =
+ new JavaMethodBindingEmitter(binding,
+ writer,
+ cfg.runtimeExceptionType(),
+ false,
+ true,
+ false,
+ true,
+ false,
+ true,
+ false);
+
+ emitter.addModifier(JavaMethodBindingEmitter.PRIVATE);
+ if (cfg.allStatic()) {
+ emitter.addModifier(JavaMethodBindingEmitter.STATIC);
+ }
+ emitter.addModifier(JavaMethodBindingEmitter.NATIVE);
+ emitter.setReturnedArrayLengthExpression(cfg.returnedArrayLength(binding.getName()));
+ allEmitters.add(emitter);
+ }
+ }
+ }
+
+ // Now generate the C emitter(s). We need to produce one for every
+ // Java native entry point (public or private). The only
+ // situations where we don't produce one are (a) when the method
+ // is unimplemented, and (b) when the signature contains primitive
+ // arrays, since the latter is handled by the method binding
+ // variant taking only NIO Buffers.
+ if (!cfg.isUnimplemented(binding.getName()) &&
+ !binding.signatureUsesJavaPrimitiveArrays()) {
+ // See whether we need an expression to help calculate the
+ // length of any return type
+ MessageFormat returnValueCapacityFormat = null;
+ MessageFormat returnValueLengthFormat = null;
+ JavaType javaReturnType = binding.getJavaReturnType();
+ if (javaReturnType.isNIOBuffer() ||
+ javaReturnType.isCompoundTypeWrapper()) {
+ // See whether capacity has been specified
+ String capacity = cfg.returnValueCapacity(binding.getName());
+ if (capacity != null) {
+ returnValueCapacityFormat = new MessageFormat(capacity);
+ }
+ } else if (javaReturnType.isArray() ||
+ javaReturnType.isArrayOfCompoundTypeWrappers()) {
+ // NOTE: adding a check here because the CMethodBindingEmitter
+ // also doesn't yet handle returning scalar arrays. In order
+ // to implement this, return the type as a Buffer instead
+ // (i.e., IntBuffer, FloatBuffer) and add code as necessary.
+ if (javaReturnType.isPrimitiveArray()) {
+ throw new RuntimeException("Primitive array return types not yet supported");
+ }
+
+ // See whether length has been specified
+ String len = cfg.returnValueLength(binding.getName());
+ if (len != null) {
+ returnValueLengthFormat = new MessageFormat(len);
+ }
+ }
+
+ CMethodBindingEmitter cEmitter =
+ new CMethodBindingEmitter(binding,
+ cWriter(),
+ cfg.implPackageName(),
+ cfg.implClassName(),
+ true, /* NOTE: we always disambiguate with a suffix now, so this is optional */
+ cfg.allStatic(),
+ (binding.needsNIOWrappingOrUnwrapping() || hasPrologueOrEpilogue),
+ false);
+ if (returnValueCapacityFormat != null) {
+ cEmitter.setReturnValueCapacityExpression(returnValueCapacityFormat);
+ }
+ if (returnValueLengthFormat != null) {
+ cEmitter.setReturnValueLengthExpression(returnValueLengthFormat);
+ }
+ cEmitter.setTemporaryCVariableDeclarations(cfg.temporaryCVariableDeclarations(binding.getName()));
+ cEmitter.setTemporaryCVariableAssignments(cfg.temporaryCVariableAssignments(binding.getName()));
+ allEmitters.add(cEmitter);
+
+ // Now see if we have to emit another entry point to handle the
+ // indirect buffer and array case
+ if (binding.argumentsUseNIO() &&
+ binding.signatureCanUseIndirectNIO() &&
+ !cfg.nioDirectOnly(binding.getName())) {
+ cEmitter =
+ new CMethodBindingEmitter(binding,
+ cWriter(),
+ cfg.implPackageName(),
+ cfg.implClassName(),
+ true, /* NOTE: we always disambiguate with a suffix now, so this is optional */
+ cfg.allStatic(),
+ binding.needsNIOWrappingOrUnwrapping(),
+ true);
+ if (returnValueCapacityFormat != null) {
+ cEmitter.setReturnValueCapacityExpression(returnValueCapacityFormat);
+ }
+ if (returnValueLengthFormat != null) {
+ cEmitter.setReturnValueLengthExpression(returnValueLengthFormat);
+ }
+ cEmitter.setTemporaryCVariableDeclarations(cfg.temporaryCVariableDeclarations(binding.getName()));
+ cEmitter.setTemporaryCVariableAssignments(cfg.temporaryCVariableAssignments(binding.getName()));
+ allEmitters.add(cEmitter);
+ }
+ }
+ }
+
+ /**
* Generate all appropriate Java bindings for the specified C function
* symbols.
*/
protected List generateMethodBindingEmitters(FunctionSymbol sym) throws Exception {
- ArrayList/*<FunctionEmitter>*/ allEmitters = new ArrayList(1);
+ ArrayList/*<FunctionEmitter>*/ allEmitters = new ArrayList();
try {
// Get Java binding for the function
MethodBinding mb = bindFunction(sym, null, null);
- // Expand all void* arguments
+ // JavaTypes representing C pointers in the initial
+ // MethodBinding have not been lowered yet to concrete types
List bindings = expandMethodBinding(mb);
- boolean overloaded = (bindings.size() > 1);
- if (overloaded) {
- // resize ahead of time for speed
- allEmitters.ensureCapacity(bindings.size());
- }
-
- // List of the indices of the arguments in this function that should be
- // expanded to the same type when binding functions with multiple void*
- // arguments
- List mirrorIdxs = cfg.mirroredArgs(sym.getName());
for (Iterator iter = bindings.iterator(); iter.hasNext(); ) {
MethodBinding binding = (MethodBinding) iter.next();
- // Honor the MirrorExpandedBindingArgs directive in .cfg files
- if (mirrorIdxs != null) {
- assert(mirrorIdxs.size() >= 2); // sanity check.
- boolean typesMatch = true;
- int argIndex = ((Integer)mirrorIdxs.get(0)).intValue();
- JavaType leftArgType = binding.getJavaArgumentType(argIndex);
- for (int i = 1; i < mirrorIdxs.size(); ++i) {
- argIndex = ((Integer)mirrorIdxs.get(i)).intValue();
- JavaType rightArgType = binding.getJavaArgumentType(argIndex);
- if (!(leftArgType.equals(rightArgType))) {
- typesMatch = false;
- break;
- }
- leftArgType = rightArgType;
- }
- // Don't emit the binding if the specified args aren't the same type
- if (!typesMatch) { continue; } // skip this binding
- }
-
- // Try to create an NIOBuffer variant for this expanded binding. If
- // it's the same as the original binding, then we'll be able to emit
- // the binding like any normal binding because no special binding
- // generation (wrapper methods, etc) will be necessary.
- MethodBinding specialBinding = binding.createNIOBufferVariant();
-
if (cfg.allStatic() && binding.hasContainingType()) {
// This should not currently happen since structs are emitted using a different mechanism
throw new IllegalArgumentException("Cannot create binding in AllStatic mode because method has containing type: \"" +
binding + "\"");
}
- boolean isUnimplemented = cfg.isUnimplemented(binding.getName());
-
- if (cfg.emitImpl()) {
- // Generate the emitter for the method which may do conversion
- // from type wrappers to NIO Buffers or which may call the
- // underlying function directly
- JavaMethodBindingImplEmitter entryPoint =
- new JavaMethodBindingImplEmitter(binding,
- (cfg.allStatic() ? javaWriter() : javaImplWriter()),
- cfg.runtimeExceptionType(),
- isUnimplemented);
- entryPoint.addModifier(JavaMethodBindingEmitter.PUBLIC);
- if (cfg.allStatic()) {
- entryPoint.addModifier(JavaMethodBindingEmitter.STATIC);
- }
- if (!isUnimplemented && !bindingNeedsBody(binding)) {
- entryPoint.addModifier(JavaMethodBindingEmitter.NATIVE);
- }
- entryPoint.setReturnedArrayLengthExpression(cfg.returnedArrayLength(binding.getName()));
- allEmitters.add(entryPoint);
- }
+ // The structure of the generated glue code looks something like this:
+ // Simple method (no arrays, void pointers, etc.):
+ // Interface class:
+ // public void fooMethod();
+ // Implementation class:
+ // public native void fooMethod();
+ //
+ // Method taking void* argument:
+ // Interface class:
+ // public void fooMethod(Buffer arg);
+ // Implementation class:
+ // public void fooMethod(Buffer arg) {
+ // ... bounds checks, etc. ...
+ // if (arg.isDirect()) {
+ // fooMethod0(arg, computeDirectBufferByteOffset(arg));
+ // } else {
+ // fooMethod1(getIndirectBufferArray(arg), computeIndirectBufferByteOffset(arg));
+ // }
+ // }
+ // private native void fooMethod0(Object arg, int arg_byte_offset);
+ // private native void fooMethod1(Object arg, int arg_byte_offset);
+ //
+ // Method taking primitive array argument:
+ // Interface class:
+ // public void fooMethod(int[] arg, int arg_offset);
+ // public void fooMethod(IntBuffer arg);
+ // Implementing class:
+ // public void fooMethod(int[] arg, int arg_offset) {
+ // ... range checks, etc. ...
+ // fooMethod1(arg, SIZEOF_INT * arg_offset);
+ // }
+ // public void fooMethod(IntBuffer arg) {
+ // ... bounds checks, etc. ...
+ // if (arg.isDirect()) {
+ // fooMethod0(arg, computeDirectBufferByteOffset(arg));
+ // } else {
+ // fooMethod1(getIndirectBufferArray(arg), computeIndirectBufferByteOffset(arg));
+ // }
+ // }
+ // private native void fooMethod0(Object arg, int arg_byte_offset);
+ // private native void fooMethod1(Object arg, int arg_byte_offset);
+ //
+ // Note in particular that the public entry point taking an
+ // array is merely a special case of the indirect buffer case.
if (cfg.emitInterface()) {
- // Generate an emitter that will emit just the interface to the function
- JavaMethodBindingEmitter entryPointInterface =
- new JavaMethodBindingEmitter(binding, javaWriter(), cfg.runtimeExceptionType());
- entryPointInterface.addModifier(JavaMethodBindingEmitter.PUBLIC);
- entryPointInterface.setReturnedArrayLengthExpression(cfg.returnedArrayLength(binding.getName()));
- allEmitters.add(entryPointInterface);
+ generatePublicEmitters(binding, allEmitters, true);
}
-
if (cfg.emitImpl()) {
- // If the user has stated that the function will be
- // manually implemented, then don't auto-generate a function body.
- if (!cfg.manuallyImplement(sym.getName()) && !isUnimplemented) {
- if (bindingNeedsBody(binding)) {
- // Generate the method which calls the underlying C function
- // after unboxing has occurred
- PrintWriter output = cfg.allStatic() ? javaWriter() : javaImplWriter();
- JavaMethodBindingEmitter wrappedEntryPoint =
- new JavaMethodBindingEmitter(specialBinding, output, cfg.runtimeExceptionType(), true);
- wrappedEntryPoint.addModifier(JavaMethodBindingEmitter.PRIVATE);
- wrappedEntryPoint.addModifier(JavaMethodBindingEmitter.STATIC); // Doesn't really matter
- wrappedEntryPoint.addModifier(JavaMethodBindingEmitter.NATIVE);
- allEmitters.add(wrappedEntryPoint);
- }
-
- CMethodBindingEmitter cEmitter =
- makeCEmitter(specialBinding,
- overloaded,
- (binding != specialBinding),
- cfg.implPackageName(), cfg.implClassName(),
- cWriter());
- allEmitters.add(cEmitter);
- }
+ generatePublicEmitters(binding, allEmitters, false);
+ generatePrivateEmitters(binding, allEmitters);
}
} // end iteration over expanded bindings
} catch (Exception e) {
@@ -511,7 +704,7 @@ public class JavaEmitter implements GlueEmitter {
writer.println();
writer.println("import java.nio.*;");
writer.println();
- writer.println("import net.java.games.gluegen.runtime.*;");
+ writer.println("import com.sun.gluegen.runtime.*;");
writer.println();
List/*<String>*/ imports = cfg.imports();
for (Iterator iter = imports.iterator(); iter.hasNext(); ) {
@@ -564,28 +757,49 @@ public class JavaEmitter implements GlueEmitter {
FunctionSymbol funcSym = new FunctionSymbol(field.getName(), funcType);
MethodBinding binding = bindFunction(funcSym, containingType, containingCType);
binding.findThisPointer(); // FIXME: need to provide option to disable this on per-function basis
- MethodBinding specialBinding = binding.createNIOBufferVariant();
writer.println();
- JavaMethodBindingEmitter entryPoint = new JavaMethodBindingImplEmitter(binding, writer, cfg.runtimeExceptionType());
- entryPoint.addModifier(JavaMethodBindingEmitter.PUBLIC);
- if (!bindingNeedsBody(binding) && !binding.hasContainingType()) {
- entryPoint.addModifier(JavaMethodBindingEmitter.NATIVE);
- }
- entryPoint.emit();
-
- JavaMethodBindingEmitter wrappedEntryPoint = new JavaMethodBindingEmitter(specialBinding, writer, cfg.runtimeExceptionType(), true);
- wrappedEntryPoint.addModifier(JavaMethodBindingEmitter.PRIVATE);
- wrappedEntryPoint.addModifier(JavaMethodBindingEmitter.NATIVE);
- wrappedEntryPoint.emit();
-
+ // Emit public Java entry point for calling this function pointer
+ JavaMethodBindingEmitter emitter =
+ new JavaMethodBindingEmitter(binding,
+ writer,
+ cfg.runtimeExceptionType(),
+ true,
+ false,
+ true, // FIXME: should unify this with the general emission code
+ false,
+ false, // FIXME: should unify this with the general emission code
+ false, // FIXME: should unify this with the general emission code
+ false);
+ emitter.addModifier(JavaMethodBindingEmitter.PUBLIC);
+ emitter.emit();
+
+ // Emit private native Java entry point for calling this function pointer
+ emitter =
+ new JavaMethodBindingEmitter(binding,
+ writer,
+ cfg.runtimeExceptionType(),
+ false,
+ true,
+ true, // FIXME: should unify this with the general emission code
+ true,
+ true, // FIXME: should unify this with the general emission code
+ false, // FIXME: should unify this with the general emission code
+ false);
+ emitter.addModifier(JavaMethodBindingEmitter.PRIVATE);
+ emitter.addModifier(JavaMethodBindingEmitter.NATIVE);
+ emitter.emit();
+
+ // Emit (private) C entry point for calling this function pointer
CMethodBindingEmitter cEmitter =
- makeCEmitter(specialBinding,
- false, // overloaded
- true, // doing impl routine?
- structClassPkg,
- containingTypeName,
- cWriter);
+ new CMethodBindingEmitter(binding,
+ cWriter,
+ structClassPkg,
+ containingTypeName,
+ true, // FIXME: this is optional at this point
+ false,
+ true,
+ false); // FIXME: should unify this with the general emission code
cEmitter.emit();
} catch (Exception e) {
System.err.println("While processing field " + field + " of type " + name + ":");
@@ -674,57 +888,6 @@ public class JavaEmitter implements GlueEmitter {
// Internals only below this point
//
- protected boolean bindingNeedsBody(MethodBinding binding) {
- // We need to perform NIO checks and conversions and array length
- // checks
- return binding.signatureUsesNIO() || binding.signatureUsesCArrays();
- }
-
- private CMethodBindingEmitter makeCEmitter(MethodBinding binding,
- boolean overloaded,
- boolean doingImplRoutine,
- String bindingJavaPackageName,
- String bindingJavaClassName,
- PrintWriter output) {
- MessageFormat returnValueCapacityFormat = null;
- MessageFormat returnValueLengthFormat = null;
- JavaType javaReturnType = binding.getJavaReturnType();
- if (javaReturnType.isNIOBuffer()) {
- // See whether capacity has been specified
- String capacity = cfg.returnValueCapacity(binding.getName());
- if (capacity != null) {
- returnValueCapacityFormat = new MessageFormat(capacity);
- }
- } else if (javaReturnType.isArray()) {
- // See whether length has been specified
- String len = cfg.returnValueLength(binding.getName());
- if (len != null) {
- returnValueLengthFormat = new MessageFormat(len);
- }
- }
- CMethodBindingEmitter cEmitter;
- if (doingImplRoutine) {
- cEmitter = new CMethodBindingImplEmitter(binding, overloaded,
- bindingJavaPackageName,
- bindingJavaClassName,
- cfg.allStatic(), output);
- } else {
- cEmitter = new CMethodBindingEmitter(binding, overloaded,
- bindingJavaPackageName,
- bindingJavaClassName,
- cfg.allStatic(), output);
- }
- if (returnValueCapacityFormat != null) {
- cEmitter.setReturnValueCapacityExpression(returnValueCapacityFormat);
- }
- if (returnValueLengthFormat != null) {
- cEmitter.setReturnValueLengthExpression(returnValueLengthFormat);
- }
- cEmitter.setTemporaryCVariableDeclarations(cfg.temporaryCVariableDeclarations(binding.getName()));
- cEmitter.setTemporaryCVariableAssignments(cfg.temporaryCVariableAssignments(binding.getName()));
- return cEmitter;
- }
-
private JavaType typeToJavaType(Type cType, boolean outgoingArgument) {
// Recognize JNIEnv* case up front
PointerType opt = cType.asPointer();
@@ -942,9 +1105,11 @@ public class JavaEmitter implements GlueEmitter {
}
private void openWriters() throws IOException {
- String jRoot =
- cfg.javaOutputDir() + File.separator +
- CodeGenUtils.packageAsPath(cfg.packageName());
+ String jRoot = null;
+ if (cfg.allStatic() || cfg.emitInterface()) {
+ jRoot = cfg.javaOutputDir() + File.separator +
+ CodeGenUtils.packageAsPath(cfg.packageName());
+ }
String jImplRoot = null;
if (!cfg.allStatic()) {
jImplRoot =
@@ -1102,7 +1267,7 @@ public class JavaEmitter implements GlueEmitter {
}
if (!cfg.allStatic() && cfg.emitImpl()) {
- final List/*<String>*/ implDocs = cfg.javadocForClass(cfg.className());
+ final List/*<String>*/ implDocs = cfg.javadocForClass(cfg.implClassName());
CodeGenUtils.EmissionCallback docEmitter =
new CodeGenUtils.EmissionCallback() {
public void emit(PrintWriter w) {
@@ -1115,9 +1280,15 @@ public class JavaEmitter implements GlueEmitter {
String[] interfaces;
List userSpecifiedInterfaces = null;
userSpecifiedInterfaces = cfg.implementedInterfaces(cfg.implClassName());
- interfaces = new String[1 + userSpecifiedInterfaces.size()];
+ int additionalNum = 0;
+ if (cfg.className() != null) {
+ additionalNum = 1;
+ }
+ interfaces = new String[additionalNum + userSpecifiedInterfaces.size()];
userSpecifiedInterfaces.toArray(interfaces);
- interfaces[userSpecifiedInterfaces.size()] = cfg.className();
+ if (additionalNum == 1) {
+ interfaces[userSpecifiedInterfaces.size()] = cfg.className();
+ }
CodeGenUtils.emitJavaHeaders(
javaImplWriter,
@@ -1179,12 +1350,20 @@ public class JavaEmitter implements GlueEmitter {
return JavaType.createForClass(c);
}
+ /** Maps the C types in the specified function to Java types through
+ the MethodBinding interface. Note that the JavaTypes in the
+ returned MethodBinding are "intermediate" JavaTypes (some
+ potentially representing C pointers rather than true Java types)
+ and must be lowered to concrete Java types before creating
+ emitters for them. */
private MethodBinding bindFunction(FunctionSymbol sym,
JavaType containingType,
Type containingCType) {
MethodBinding binding = new MethodBinding(sym, containingType, containingCType);
+ binding.setRenamedMethodName(cfg.getJavaMethodRename(sym.getName()));
+
if (cfg.returnsString(binding.getName())) {
PointerType prt = sym.getReturnType().asPointer();
if (prt == null ||
@@ -1238,162 +1417,119 @@ public class JavaEmitter implements GlueEmitter {
return binding;
}
- // Expands a MethodBinding containing C primitive pointer types into
- // multiple variants taking Java primitive arrays and NIO buffers, subject
- // to the per-function "NIO only" rule in the configuration file
- private List/*<MethodBinding>*/ expandMethodBinding(MethodBinding binding) {
- List result = new ArrayList();
- result.add(binding);
- int i = 0;
- while (i < result.size()) {
- MethodBinding mb = (MethodBinding) result.get(i);
- boolean shouldRemoveCurrent = false;
- for (int j = 0; j < mb.getNumArguments(); j++) {
- JavaType t = mb.getJavaArgumentType(j);
- if (t.isCPrimitivePointerType()) {
- // Remove original from list
- shouldRemoveCurrent = true;
- MethodBinding variant = null;
-
- // Non-NIO variants for void* and other C primitive pointer types
- if (!cfg.nioOnly(mb.getCSymbol().getName())) {
- if (t.isCVoidPointerType()) {
- variant = mb.createCPrimitivePointerVariant(j, javaType(ArrayTypes.booleanArrayClass));
- if (! result.contains(variant)) result.add(variant);
- variant = mb.createCPrimitivePointerVariant(j, javaType(ArrayTypes.charArrayClass));
- if (! result.contains(variant)) result.add(variant);
- }
- if (t.isCCharPointerType() || t.isCVoidPointerType()) {
- variant = mb.createCPrimitivePointerVariant(j, javaType(ArrayTypes.byteArrayClass));
- if (! result.contains(variant)) result.add(variant);
- }
- if (t.isCShortPointerType() || t.isCVoidPointerType()) {
- variant = mb.createCPrimitivePointerVariant(j, javaType(ArrayTypes.shortArrayClass));
- if (! result.contains(variant)) result.add(variant);
- }
- if (t.isCInt32PointerType() || t.isCVoidPointerType()) {
- variant = mb.createCPrimitivePointerVariant(j, javaType(ArrayTypes.intArrayClass));
- if (! result.contains(variant)) result.add(variant);
- }
- if (t.isCInt64PointerType() || t.isCVoidPointerType()) {
- variant = mb.createCPrimitivePointerVariant(j, javaType(ArrayTypes.longArrayClass));
- if (! result.contains(variant)) result.add(variant);
- }
- if (t.isCFloatPointerType() || t.isCVoidPointerType()) {
- variant = mb.createCPrimitivePointerVariant(j, javaType(ArrayTypes.floatArrayClass));
- if (! result.contains(variant)) result.add(variant);
- }
- if (t.isCDoublePointerType() || t.isCVoidPointerType()) {
- variant = mb.createCPrimitivePointerVariant(j, javaType(ArrayTypes.doubleArrayClass));
- if (! result.contains(variant)) result.add(variant);
- }
- }
- // NIO variants for void* and other C primitive pointer types
- if (!cfg.noNio(mb.getCSymbol().getName())) {
- if (t.isCVoidPointerType()) {
- variant = mb.createCPrimitivePointerVariant(j, JavaType.forNIOBufferClass());
- if (! result.contains(variant)) result.add(variant);
- }
+ private MethodBinding lowerMethodBindingPointerTypes(MethodBinding inputBinding,
+ boolean convertToArrays,
+ boolean[] canProduceArrayVariant) {
+ MethodBinding result = inputBinding;
+ boolean arrayPossible = false;
+
+ for (int i = 0; i < inputBinding.getNumArguments(); i++) {
+ JavaType t = inputBinding.getJavaArgumentType(i);
+ if (t.isCPrimitivePointerType()) {
+ if (t.isCVoidPointerType()) {
+ // These are always bound to java.nio.Buffer
+ result = result.replaceJavaArgumentType(i, JavaType.forNIOBufferClass());
+ } else if (t.isCCharPointerType()) {
+ arrayPossible = true;
+ if (convertToArrays) {
+ result = result.replaceJavaArgumentType(i, javaType(ArrayTypes.byteArrayClass));
+ } else {
+ result = result.replaceJavaArgumentType(i, JavaType.forNIOByteBufferClass());
}
-
- if ((cfg.nioMode() == JavaConfiguration.NIO_MODE_ALL_POINTERS && !cfg.noNio(mb.getCSymbol().getName())) ||
- (cfg.nioMode() == JavaConfiguration.NIO_MODE_VOID_ONLY && cfg.forcedNio(mb.getCSymbol().getName()))) {
- if (t.isCCharPointerType()) {
- variant = mb.createCPrimitivePointerVariant(j, JavaType.forNIOByteBufferClass());
- if (! result.contains(variant)) result.add(variant);
- }
-
- if (t.isCShortPointerType()) {
- variant = mb.createCPrimitivePointerVariant(j, JavaType.forNIOShortBufferClass());
- if (! result.contains(variant)) result.add(variant);
- }
-
- if (t.isCInt32PointerType()) {
- variant = mb.createCPrimitivePointerVariant(j, JavaType.forNIOIntBufferClass());
- if (! result.contains(variant)) result.add(variant);
- }
-
- if (t.isCInt64PointerType()) {
- variant = mb.createCPrimitivePointerVariant(j, JavaType.forNIOLongBufferClass());
- if (! result.contains(variant)) result.add(variant);
- }
-
- if (t.isCFloatPointerType()) {
- variant = mb.createCPrimitivePointerVariant(j, JavaType.forNIOFloatBufferClass());
- if (! result.contains(variant)) result.add(variant);
- }
-
- if (t.isCDoublePointerType()) {
- variant = mb.createCPrimitivePointerVariant(j, JavaType.forNIODoubleBufferClass());
- if (! result.contains(variant)) result.add(variant);
- }
+ } else if (t.isCShortPointerType()) {
+ arrayPossible = true;
+ if (convertToArrays) {
+ result = result.replaceJavaArgumentType(i, javaType(ArrayTypes.shortArrayClass));
+ } else {
+ result = result.replaceJavaArgumentType(i, JavaType.forNIOShortBufferClass());
}
+ } else if (t.isCInt32PointerType()) {
+ arrayPossible = true;
+ if (convertToArrays) {
+ result = result.replaceJavaArgumentType(i, javaType(ArrayTypes.intArrayClass));
+ } else {
+ result = result.replaceJavaArgumentType(i, JavaType.forNIOIntBufferClass());
+ }
+ } else if (t.isCInt64PointerType()) {
+ arrayPossible = true;
+ if (convertToArrays) {
+ result = result.replaceJavaArgumentType(i, javaType(ArrayTypes.longArrayClass));
+ } else {
+ result = result.replaceJavaArgumentType(i, JavaType.forNIOLongBufferClass());
+ }
+ } else if (t.isCFloatPointerType()) {
+ arrayPossible = true;
+ if (convertToArrays) {
+ result = result.replaceJavaArgumentType(i, javaType(ArrayTypes.floatArrayClass));
+ } else {
+ result = result.replaceJavaArgumentType(i, JavaType.forNIOFloatBufferClass());
+ }
+ } else if (t.isCDoublePointerType()) {
+ arrayPossible = true;
+ if (convertToArrays) {
+ result = result.replaceJavaArgumentType(i, javaType(ArrayTypes.doubleArrayClass));
+ } else {
+ result = result.replaceJavaArgumentType(i, JavaType.forNIODoubleBufferClass());
+ }
+ } else {
+ throw new RuntimeException("Unknown C pointer type " + t);
}
}
- if (mb.getJavaReturnType().isCPrimitivePointerType()) {
- MethodBinding variant = null;
- if (mb.getJavaReturnType().isCVoidPointerType()) {
- variant = mb.createCPrimitivePointerVariant(-1, JavaType.forNIOByteBufferClass());
- if (! result.contains(variant)) result.add(variant);
- } else if (mb.getJavaReturnType().isCCharPointerType()) {
- variant = mb.createCPrimitivePointerVariant(-1, javaType(ArrayTypes.byteArrayClass));
- if (! result.contains(variant)) result.add(variant);
- } else if (mb.getJavaReturnType().isCShortPointerType()) {
- variant = mb.createCPrimitivePointerVariant(-1, javaType(ArrayTypes.shortArrayClass));
- if (! result.contains(variant)) result.add(variant);
- } else if (mb.getJavaReturnType().isCInt32PointerType()) {
- variant = mb.createCPrimitivePointerVariant(-1, javaType(ArrayTypes.intArrayClass));
- if (! result.contains(variant)) result.add(variant);
- } else if (mb.getJavaReturnType().isCInt64PointerType()) {
- variant = mb.createCPrimitivePointerVariant(-1, javaType(ArrayTypes.longArrayClass));
- if (! result.contains(variant)) result.add(variant);
- } else if (mb.getJavaReturnType().isCFloatPointerType()) {
- variant = mb.createCPrimitivePointerVariant(-1, javaType(ArrayTypes.floatArrayClass));
- if (! result.contains(variant)) result.add(variant);
- } else if (mb.getJavaReturnType().isCDoublePointerType()) {
- variant = mb.createCPrimitivePointerVariant(-1, javaType(ArrayTypes.doubleArrayClass));
- if (! result.contains(variant)) result.add(variant);
- }
- shouldRemoveCurrent = true;
- }
- if (shouldRemoveCurrent) {
- result.remove(i);
- --i;
+ }
+
+ // Always return primitive pointer types as NIO buffers
+ JavaType t = result.getJavaReturnType();
+ if (t.isCPrimitivePointerType()) {
+ if (t.isCVoidPointerType()) {
+ result = result.replaceJavaArgumentType(-1, JavaType.forNIOByteBufferClass());
+ } else if (t.isCCharPointerType()) {
+ result = result.replaceJavaArgumentType(-1, JavaType.forNIOByteBufferClass());
+ } else if (t.isCShortPointerType()) {
+ result = result.replaceJavaArgumentType(-1, JavaType.forNIOShortBufferClass());
+ } else if (t.isCInt32PointerType()) {
+ result = result.replaceJavaArgumentType(-1, JavaType.forNIOIntBufferClass());
+ } else if (t.isCInt64PointerType()) {
+ result = result.replaceJavaArgumentType(-1, JavaType.forNIOLongBufferClass());
+ } else if (t.isCFloatPointerType()) {
+ result = result.replaceJavaArgumentType(-1, JavaType.forNIOFloatBufferClass());
+ } else if (t.isCDoublePointerType()) {
+ result = result.replaceJavaArgumentType(-1, JavaType.forNIODoubleBufferClass());
+ } else {
+ throw new RuntimeException("Unknown C pointer type " + t);
}
- ++i;
- }
-
- // Honor the flattenNIOVariants directive in the configuration file
- if (cfg.flattenNIOVariants()) {
- i = 0;
- while (i < result.size()) {
- boolean shouldRemoveCurrent = false;
- MethodBinding mb = (MethodBinding) result.get(i);
- for (int j = 0; j < binding.getNumArguments() && !shouldRemoveCurrent; j++) {
- JavaType t1 = binding.getJavaArgumentType(j);
- if (t1.isCPrimitivePointerType() && !t1.isCVoidPointerType()) {
- for (int k = j + 1; k < binding.getNumArguments() && !shouldRemoveCurrent; k++) {
- JavaType t2 = binding.getJavaArgumentType(k);
- if (t2.isCPrimitivePointerType() && !t2.isCVoidPointerType()) {
- // The "NIO-ness" of the converted arguments in the
- // new binding must match
- JavaType nt1 = mb.getJavaArgumentType(j);
- JavaType nt2 = mb.getJavaArgumentType(k);
- if (nt1.isNIOBuffer() != nt2.isNIOBuffer()) {
- shouldRemoveCurrent = true;
- }
- }
- }
- }
- }
- if (shouldRemoveCurrent) {
- result.remove(i);
- --i;
- }
+ }
+
+ if (canProduceArrayVariant != null) {
+ canProduceArrayVariant[0] = arrayPossible;
+ }
- ++i;
+ return result;
+ }
+
+ // Expands a MethodBinding containing C primitive pointer types into
+ // multiple variants taking Java primitive arrays and NIO buffers, subject
+ // to the per-function "NIO only" rule in the configuration file
+ protected List/*<MethodBinding>*/ expandMethodBinding(MethodBinding binding) {
+ List result = new ArrayList();
+ // Indicates whether it is possible to produce an array variant
+ // Prevents e.g. char* -> String conversions from emitting two entry points
+ boolean[] canProduceArrayVariant = new boolean[1];
+
+ if (binding.signatureUsesCPrimitivePointers() ||
+ binding.signatureUsesCVoidPointers() ||
+ binding.signatureUsesCArrays()) {
+ result.add(lowerMethodBindingPointerTypes(binding, false, canProduceArrayVariant));
+
+ // FIXME: should add new configuration flag for this
+ if (canProduceArrayVariant[0] &&
+ (binding.signatureUsesCPrimitivePointers() ||
+ binding.signatureUsesCArrays()) &&
+ !cfg.nioDirectOnly(binding.getName())) {
+ result.add(lowerMethodBindingPointerTypes(binding, true, null));
}
+ } else {
+ result.add(binding);
}
return result;
diff --git a/src/classes/com/sun/gluegen/JavaMethodBindingEmitter.java b/src/classes/com/sun/gluegen/JavaMethodBindingEmitter.java
new file mode 100644
index 000000000..8dbb20d28
--- /dev/null
+++ b/src/classes/com/sun/gluegen/JavaMethodBindingEmitter.java
@@ -0,0 +1,720 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.gluegen;
+
+import java.io.*;
+import java.util.*;
+import java.text.MessageFormat;
+
+import com.sun.gluegen.cgram.types.*;
+import com.sun.gluegen.cgram.*;
+
+/**
+ * An emitter that emits only the interface for a Java<->C JNI binding.
+ */
+public class JavaMethodBindingEmitter extends FunctionEmitter
+{
+ public static final EmissionModifier PUBLIC = new EmissionModifier("public");
+ public static final EmissionModifier PROTECTED = new EmissionModifier("protected");
+ public static final EmissionModifier PRIVATE = new EmissionModifier("private");
+ public static final EmissionModifier ABSTRACT = new EmissionModifier("abstract");
+ public static final EmissionModifier FINAL = new EmissionModifier("final");
+ public static final EmissionModifier NATIVE = new EmissionModifier("native");
+ public static final EmissionModifier SYNCHRONIZED = new EmissionModifier("synchronized");
+
+ protected final CommentEmitter defaultJavaCommentEmitter = new DefaultCommentEmitter();
+ protected final CommentEmitter defaultInterfaceCommentEmitter =
+ new InterfaceCommentEmitter();
+
+ // Exception type raised in the generated code if runtime checks fail
+ private String runtimeExceptionType;
+
+ protected boolean emitBody;
+ protected boolean eraseBufferAndArrayTypes;
+ protected boolean directNIOOnly;
+ protected boolean forImplementingMethodCall;
+ protected boolean forDirectBufferImplementation;
+ protected boolean forIndirectBufferAndArrayImplementation;
+ protected boolean isUnimplemented;
+
+ protected MethodBinding binding;
+
+ // Manually-specified prologue and epilogue code
+ protected List/*<String>*/ prologue;
+ protected List/*<String>*/ epilogue;
+
+ // A non-null value indicates that rather than returning a compound
+ // type accessor we are returning an array of such accessors; this
+ // expression is a MessageFormat string taking the names of the
+ // incoming Java arguments as parameters and computing as an int the
+ // number of elements of the returned array.
+ private String returnedArrayLengthExpression;
+
+ public JavaMethodBindingEmitter(MethodBinding binding,
+ PrintWriter output,
+ String runtimeExceptionType,
+ boolean emitBody,
+ boolean eraseBufferAndArrayTypes,
+ boolean directNIOOnly,
+ boolean forImplementingMethodCall,
+ boolean forDirectBufferImplementation,
+ boolean forIndirectBufferAndArrayImplementation,
+ boolean isUnimplemented)
+ {
+ super(output);
+ this.binding = binding;
+ this.runtimeExceptionType = runtimeExceptionType;
+ this.emitBody = emitBody;
+ this.eraseBufferAndArrayTypes = eraseBufferAndArrayTypes;
+ this.directNIOOnly = directNIOOnly;
+ this.forImplementingMethodCall = forImplementingMethodCall;
+ this.forDirectBufferImplementation = forDirectBufferImplementation;
+ this.forIndirectBufferAndArrayImplementation = forIndirectBufferAndArrayImplementation;
+ this.isUnimplemented = isUnimplemented;
+ if (forImplementingMethodCall) {
+ setCommentEmitter(defaultJavaCommentEmitter);
+ } else {
+ setCommentEmitter(defaultInterfaceCommentEmitter);
+ }
+ }
+
+ public JavaMethodBindingEmitter(JavaMethodBindingEmitter arg) {
+ super(arg);
+ binding = arg.binding;
+ runtimeExceptionType = arg.runtimeExceptionType;
+ emitBody = arg.emitBody;
+ eraseBufferAndArrayTypes = arg.eraseBufferAndArrayTypes;
+ directNIOOnly = arg.directNIOOnly;
+ forImplementingMethodCall = arg.forImplementingMethodCall;
+ forDirectBufferImplementation = arg.forDirectBufferImplementation;
+ forIndirectBufferAndArrayImplementation = arg.forIndirectBufferAndArrayImplementation;
+ isUnimplemented = arg.isUnimplemented;
+ returnedArrayLengthExpression = arg.returnedArrayLengthExpression;
+ prologue = arg.prologue;
+ epilogue = arg.epilogue;
+ }
+
+ public final MethodBinding getBinding() { return binding; }
+
+ public boolean isForImplementingMethodCall() { return forImplementingMethodCall; }
+
+ public String getName() {
+ return binding.getRenamedMethodName();
+ }
+
+ protected String getArgumentName(int i) {
+ return binding.getArgumentName(i);
+ }
+
+ /** The type of exception (must subclass
+ <code>java.lang.RuntimeException</code>) raised if runtime
+ checks fail in the generated code. */
+ public String getRuntimeExceptionType() {
+ return runtimeExceptionType;
+ }
+
+ /** If the underlying function returns an array (currently only
+ arrays of compound types are supported) as opposed to a pointer
+ to an object, this method should be called to provide a
+ MessageFormat string containing an expression that computes the
+ number of elements of the returned array. The parameters to the
+ MessageFormat expression are the names of the incoming Java
+ arguments. */
+ public void setReturnedArrayLengthExpression(String expr) {
+ returnedArrayLengthExpression = expr;
+ }
+
+ /** Sets the manually-generated prologue code for this emitter. */
+ public void setPrologue(List/*<String>*/ prologue) {
+ this.prologue = prologue;
+ }
+
+ /** Sets the manually-generated epilogue code for this emitter. */
+ public void setEpilogue(List/*<String>*/ epilogue) {
+ this.epilogue = epilogue;
+ }
+
+ /** Indicates whether this emitter will print only a signature, or
+ whether it will emit Java code for the body of the method as
+ well. */
+ public boolean signatureOnly() {
+ return !emitBody;
+ }
+
+ /** Accessor for subclasses. */
+ public void setEmitBody(boolean emitBody) {
+ this.emitBody = emitBody;
+ }
+
+ /** Accessor for subclasses. */
+ public void setEraseBufferAndArrayTypes(boolean erase) {
+ this.eraseBufferAndArrayTypes = erase;
+ }
+
+ /** Accessor for subclasses. */
+ public void setForImplementingMethodCall(boolean impl) {
+ this.forImplementingMethodCall = impl;
+ }
+
+ protected void emitReturnType(PrintWriter writer)
+ {
+ writer.print(getReturnTypeString(false));
+ }
+
+ protected String erasedTypeString(JavaType type, boolean skipBuffers) {
+ if (eraseBufferAndArrayTypes) {
+ if (type.isNIOBuffer() ||
+ type.isPrimitiveArray()) {
+ if (!skipBuffers) {
+ // Direct buffers and arrays sent down as Object (but
+ // returned as e.g. ByteBuffer)
+ return "Object";
+ }
+ } else if (type.isCompoundTypeWrapper()) {
+ // Compound type wrappers are unwrapped to ByteBuffer
+ return "java.nio.ByteBuffer";
+ } else if (type.isArrayOfCompoundTypeWrappers()) {
+ return "java.nio.ByteBuffer";
+ }
+ }
+ return type.getName();
+ }
+
+ protected String getReturnTypeString(boolean skipArray) {
+ // The first arm of the "if" clause is used by the glue code
+ // generation for arrays of compound type wrappers
+ if (skipArray ||
+ // The following arm is used by most other kinds of return types
+ (getReturnedArrayLengthExpression() == null &&
+ !binding.getJavaReturnType().isArrayOfCompoundTypeWrappers()) ||
+ // The following arm is used specifically to get the splitting up
+ // of one returned ByteBuffer into an array of compound type
+ // wrappers to work (e.g., XGetVisualInfo)
+ (eraseBufferAndArrayTypes &&
+ binding.getJavaReturnType().isCompoundTypeWrapper() &&
+ (getReturnedArrayLengthExpression() != null))) {
+ return erasedTypeString(binding.getJavaReturnType(), true);
+ }
+ return erasedTypeString(binding.getJavaReturnType(), true) + "[]";
+ }
+
+ protected void emitName(PrintWriter writer)
+ {
+ if (forImplementingMethodCall) {
+ if (forIndirectBufferAndArrayImplementation) {
+ writer.print(getImplMethodName(false));
+ } else {
+ writer.print(getImplMethodName(true));
+ }
+ } else {
+ writer.print(getName());
+ }
+ }
+
+ protected int emitArguments(PrintWriter writer)
+ {
+ boolean needComma = false;
+ int numEmitted = 0;
+
+ if (forImplementingMethodCall && binding.hasContainingType()) {
+ // Always emit outgoing "this" argument
+ writer.print("java.nio.ByteBuffer ");
+ writer.print(javaThisArgumentName());
+ ++numEmitted;
+ needComma = true;
+ }
+
+ for (int i = 0; i < binding.getNumArguments(); i++) {
+ JavaType type = binding.getJavaArgumentType(i);
+ if (type.isVoid()) {
+ // Make sure this is the only param to the method; if it isn't,
+ // there's something wrong with our parsing of the headers.
+ if (binding.getNumArguments() != 1) {
+ throw new InternalError(
+ "\"void\" argument type found in " +
+ "multi-argument function \"" + binding + "\"");
+ }
+ continue;
+ }
+
+ if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) {
+ // Don't need to expose these at the Java level
+ continue;
+ }
+
+ if (needComma) {
+ writer.print(", ");
+ }
+
+ writer.print(erasedTypeString(type, false));
+ writer.print(" ");
+ writer.print(getArgumentName(i));
+
+ ++numEmitted;
+ needComma = true;
+
+ // Add Buffer and array index offset arguments after each associated argument
+ if (forDirectBufferImplementation || forIndirectBufferAndArrayImplementation) {
+ if (type.isNIOBuffer()) {
+ writer.print(", int " + byteOffsetArgName(i));
+ } else if (type.isNIOBufferArray()) {
+ writer.print(", int[] " +
+ byteOffsetArrayArgName(i));
+ }
+ }
+
+ // Add offset argument after each primitive array
+ if (type.isPrimitiveArray()) {
+ writer.print(", int " + offsetArgName(i));
+ }
+ }
+ return numEmitted;
+ }
+
+
+ protected String getImplMethodName(boolean direct) {
+ if (direct) {
+ return binding.getRenamedMethodName() + "0";
+ } else {
+ return binding.getRenamedMethodName() + "1";
+ }
+ }
+
+ protected String byteOffsetArgName(int i) {
+ return byteOffsetArgName(getArgumentName(i));
+ }
+
+ protected String byteOffsetArgName(String s) {
+ return s + "_byte_offset";
+ }
+
+ protected String byteOffsetArrayArgName(int i) {
+ return getArgumentName(i) + "_byte_offset_array";
+ }
+
+ protected String offsetArgName(int i) {
+ return getArgumentName(i) + "_offset";
+ }
+
+ protected void emitBody(PrintWriter writer)
+ {
+ if (!emitBody) {
+ writer.println(';');
+ } else {
+ MethodBinding binding = getBinding();
+ writer.println();
+ writer.println(" {");
+ if (isUnimplemented) {
+ writer.println(" throw new " + getRuntimeExceptionType() + "(\"Unimplemented\");");
+ } else {
+ emitPrologueOrEpilogue(prologue, writer);
+ emitPreCallSetup(binding, writer);
+ //emitReturnVariableSetup(binding, writer);
+ emitReturnVariableSetupAndCall(binding, writer);
+ emitPrologueOrEpilogue(epilogue, writer);
+ }
+ writer.println(" }");
+ }
+ }
+
+ protected void emitPrologueOrEpilogue(List/*<String>*/ code, PrintWriter writer) {
+ if (code != null) {
+ for (Iterator iter = code.iterator(); iter.hasNext(); ) {
+ writer.println(" " + (String) iter.next());
+ }
+ }
+ }
+
+ protected void emitPreCallSetup(MethodBinding binding, PrintWriter writer) {
+ emitArrayLengthAndNIOBufferChecks(binding, writer);
+ }
+
+ protected void emitArrayLengthAndNIOBufferChecks(MethodBinding binding, PrintWriter writer) {
+ int numBufferOffsetArrayArgs = 0;
+ boolean firstBuffer = true;
+ // Check lengths of any incoming arrays if necessary
+ for (int i = 0; i < binding.getNumArguments(); i++) {
+ Type type = binding.getCArgumentType(i);
+ if (type.isArray()) {
+ ArrayType arrayType = type.asArray();
+ writer.println(" if (" + getArgumentName(i) + ".length < " +
+ arrayType.getLength() + ")");
+ writer.println(" throw new " + getRuntimeExceptionType() +
+ "(\"Length of array \\\"" + getArgumentName(i) +
+ "\\\" was less than the required " + arrayType.getLength() + "\");");
+ } else {
+ JavaType javaType = binding.getJavaArgumentType(i);
+ if (javaType.isNIOBuffer()) {
+ if (directNIOOnly) {
+ writer.println(" if (!BufferFactory.isDirect(" + getArgumentName(i) + "))");
+ writer.println(" throw new " + getRuntimeExceptionType() + "(\"Argument \\\"" +
+ getArgumentName(i) + "\\\" was not a direct buffer\");");
+ } else {
+ if(firstBuffer) {
+ firstBuffer = false;
+ writer.println(" boolean _direct = BufferFactory.isDirect(" + getArgumentName(i) + ");");
+ } else {
+ writer.println(" if (_direct != BufferFactory.isDirect(" + getArgumentName(i) + "))");
+ writer.println(" throw new " + getRuntimeExceptionType() +
+ "(\"Argument \\\"" + getArgumentName(i) +
+ "\\\" : Buffers passed to this method must all be either direct or indirect\");");
+ }
+ }
+ } else if (javaType.isNIOBufferArray()) {
+ // All buffers passed down in an array of NIO buffers must be direct
+ String argName = getArgumentName(i);
+ String arrayName = byteOffsetArrayArgName(i);
+ writer.println(" int[] " + arrayName + " = new int[" + argName + ".length];");
+ // Check direct buffer properties of all buffers within
+ writer.println(" if (" + argName + " != null) {");
+ writer.println(" for (int _ctr = 0; _ctr < " + argName + ".length; _ctr++) {");
+ writer.println(" if (!BufferFactory.isDirect(" + argName + "[_ctr])) {");
+ writer.println(" throw new " + getRuntimeExceptionType() +
+ "(\"Element \" + _ctr + \" of argument \\\"" +
+ getArgumentName(i) + "\\\" was not a direct buffer\");");
+ writer.println(" }");
+ // get the Buffer Array offset values and save them into another array to send down to JNI
+ writer.print (" " + arrayName + "[_ctr] = BufferFactory.getDirectBufferByteOffset(");
+ writer.println(argName + "[_ctr]);");
+ writer.println(" }");
+ writer.println(" }");
+ } else if (javaType.isPrimitiveArray()) {
+ String argName = getArgumentName(i);
+ String offsetArg = offsetArgName(i);
+ writer.println(" if(" + argName + " != null && " + argName + ".length <= " + offsetArg + ")");
+ writer.print (" throw new " + getRuntimeExceptionType());
+ writer.println("(\"array offset argument \\\"" + offsetArg + "\\\" (\" + " + offsetArg +
+ " + \") equals or exceeds array length (\" + " + argName + ".length + \")\");");
+ }
+ }
+ }
+ }
+
+ protected void emitCall(MethodBinding binding, PrintWriter writer, boolean direct) {
+ writer.print(getImplMethodName(direct));
+ writer.print("(");
+ emitCallArguments(binding, writer, direct);
+ writer.print(");");
+ }
+
+
+ protected void emitReturnVariableSetupAndCall(MethodBinding binding, PrintWriter writer) {
+ writer.print(" ");
+ JavaType returnType = binding.getJavaReturnType();
+ boolean needsResultAssignment = false;
+
+ if (!returnType.isVoid()) {
+ if (returnType.isCompoundTypeWrapper() ||
+ returnType.isNIOByteBuffer()) {
+ writer.println("ByteBuffer _res;");
+ needsResultAssignment = true;
+ } else if (returnType.isArrayOfCompoundTypeWrappers()) {
+ writer.println("ByteBuffer[] _res;");
+ needsResultAssignment = true;
+ }
+ }
+
+ if (binding.signatureCanUseIndirectNIO() && !directNIOOnly) {
+ // Must generate two calls for this gated on whether the NIO
+ // buffers coming in are all direct or indirect
+ writer.println("if (_direct) {");
+ writer.print (" ");
+ }
+
+ if (needsResultAssignment) {
+ writer.print(" _res = ");
+ } else {
+ writer.print(" ");
+ if (!returnType.isVoid()) {
+ writer.print("return ");
+ }
+ }
+
+ if (binding.signatureUsesJavaPrimitiveArrays() &&
+ !binding.signatureCanUseIndirectNIO()) {
+ // FIXME: what happens with a C function of the form
+ // void foo(int* arg0, void* arg1);
+ // ?
+
+ // Only one call being made in this body, going to indirect
+ // buffer / array entry point
+ emitCall(binding, writer, false);
+ writer.println();
+ } else {
+ emitCall(binding, writer, true);
+ }
+
+ if (binding.signatureCanUseIndirectNIO() && !directNIOOnly) {
+ // Must generate two calls for this gated on whether the NIO
+ // buffers coming in are all direct or indirect
+ writer.println();
+ writer.println(" } else {");
+ writer.print (" ");
+ if (needsResultAssignment) {
+ writer.print(" _res = ");
+ } else {
+ writer.print(" ");
+ if (!returnType.isVoid()) {
+ writer.print("return ");
+ }
+ }
+ emitCall(binding, writer, false);
+ writer.println();
+ writer.println(" }");
+ } else {
+ writer.println();
+ }
+ if (needsResultAssignment) {
+ emitCallResultReturn(binding, writer);
+ }
+ }
+
+ protected int emitCallArguments(MethodBinding binding, PrintWriter writer, boolean direct) {
+ boolean needComma = false;
+ int numArgsEmitted = 0;
+
+ if (binding.hasContainingType()) {
+ // Emit this pointer
+ assert(binding.getContainingType().isCompoundTypeWrapper());
+ writer.print("getBuffer()");
+ needComma = true;
+ ++numArgsEmitted;
+ }
+ for (int i = 0; i < binding.getNumArguments(); i++) {
+ JavaType type = binding.getJavaArgumentType(i);
+ if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) {
+ // Don't need to expose these at the Java level
+ continue;
+ }
+
+ if (type.isVoid()) {
+ // Make sure this is the only param to the method; if it isn't,
+ // there's something wrong with our parsing of the headers.
+ assert(binding.getNumArguments() == 1);
+ continue;
+ }
+
+ if (needComma) {
+ writer.print(", ");
+ }
+
+ if (type.isCompoundTypeWrapper()) {
+ writer.print("((");
+ }
+
+ if (type.isNIOBuffer() && !direct) {
+ writer.print("BufferFactory.getArray(" + getArgumentName(i) + ")");
+ } else {
+ writer.print(getArgumentName(i));
+ }
+
+ if (type.isCompoundTypeWrapper()) {
+ writer.print(" == null) ? null : ");
+ writer.print(getArgumentName(i));
+ writer.print(".getBuffer())");
+ }
+ needComma = true;
+ ++numArgsEmitted;
+ if (type.isNIOBuffer()) {
+ if (direct) {
+ writer.print(", BufferFactory.getDirectBufferByteOffset(" + getArgumentName(i) + ")");
+ } else {
+ writer.print(", BufferFactory.getIndirectBufferByteOffset(" + getArgumentName(i) + ")");
+ }
+ } else if (type.isNIOBufferArray()) {
+ writer.print(", " + byteOffsetArrayArgName(i));
+ }
+
+ // Add Array offset parameter for primitive arrays
+ if (type.isPrimitiveArray()) {
+ if(type.isFloatArray()) {
+ writer.print(", BufferFactory.SIZEOF_FLOAT * ");
+ } else if(type.isDoubleArray()) {
+ writer.print(", BufferFactory.SIZEOF_DOUBLE * ");
+ } else if(type.isByteArray()) {
+ writer.print(", ");
+ } else if(type.isLongArray()) {
+ writer.print(", BufferFactory.SIZEOF_LONG * ");
+ } else if(type.isShortArray()) {
+ writer.print(", BufferFactory.SIZEOF_SHORT * ");
+ } else if(type.isIntArray()) {
+ writer.print(", BufferFactory.SIZEOF_INT * ");
+ } else {
+ throw new RuntimeException("Unsupported type for calculating array offset argument for " +
+ getArgumentName(i) +
+ "-- error occurred while processing Java glue code for " + getName());
+ }
+ writer.print(offsetArgName(i));
+ }
+ }
+ return numArgsEmitted;
+ }
+
+ protected void emitCallResultReturn(MethodBinding binding, PrintWriter writer) {
+ JavaType returnType = binding.getJavaReturnType();
+
+ if (returnType.isCompoundTypeWrapper()) {
+ String fmt = getReturnedArrayLengthExpression();
+ writer.println(" if (_res == null) return null;");
+ if (fmt == null) {
+ writer.print(" return new " + returnType.getName() + "(_res.order(ByteOrder.nativeOrder()))");
+ } else {
+ writer.println(" _res.order(ByteOrder.nativeOrder());");
+ String[] argumentNames = new String[binding.getNumArguments()];
+ for (int i = 0; i < binding.getNumArguments(); i++) {
+ argumentNames[i] = getArgumentName(i);
+ }
+ String expr = new MessageFormat(fmt).format(argumentNames);
+ PointerType cReturnTypePointer = binding.getCReturnType().asPointer();
+ CompoundType cReturnType = null;
+ if (cReturnTypePointer != null) {
+ cReturnType = cReturnTypePointer.getTargetType().asCompound();
+ }
+ if (cReturnType == null) {
+ throw new RuntimeException("ReturnedArrayLength directive currently only supported for pointers to compound types " +
+ "(error occurred while generating Java glue code for " + getName() + ")");
+ }
+ writer.println(" " + getReturnTypeString(false) + " _retarray = new " + getReturnTypeString(true) + "[" + expr + "];");
+ writer.println(" for (int _count = 0; _count < " + expr + "; _count++) {");
+ // Create temporary ByteBuffer slice
+ // FIXME: probably need Type.getAlignedSize() for arrays of
+ // compound types (rounding up to machine-dependent alignment)
+ writer.println(" _res.position(_count * " + cReturnType.getSize() + ");");
+ writer.println(" _res.limit ((1 + _count) * " + cReturnType.getSize() + ");");
+ writer.println(" ByteBuffer _tmp = _res.slice();");
+ writer.println(" _tmp.order(ByteOrder.nativeOrder());");
+ writer.println(" _res.position(0);");
+ writer.println(" _res.limit(_res.capacity());");
+ writer.println(" _retarray[_count] = new " + getReturnTypeString(true) + "(_tmp);");
+ writer.println(" }");
+ writer.print (" return _retarray");
+ }
+ writer.println(";");
+ } else if (returnType.isNIOBuffer()) {
+ writer.println(" if (_res == null) return null;");
+ writer.println(" return _res.order(ByteOrder.nativeOrder());");
+ } else if (returnType.isArrayOfCompoundTypeWrappers()) {
+ writer.println(" if (_res == null) return null;");
+ writer.println(" " + getReturnTypeString(false) + " _retarray = new " + getReturnTypeString(true) + "[_res.length];");
+ writer.println(" for (int _count = 0; _count < _res.length; _count++) {");
+ writer.println(" _retarray[_count] = new " + getReturnTypeString(true) + "(_res[_count]);");
+ writer.println(" }");
+ writer.println(" return _retarray;");
+ }
+ }
+
+ public static String javaThisArgumentName() {
+ return "jthis0";
+ }
+
+ protected String getCommentStartString() { return "/** "; }
+
+ protected String getBaseIndentString() { return " "; }
+
+ protected String getReturnedArrayLengthExpression() {
+ return returnedArrayLengthExpression;
+ }
+
+ /**
+ * Class that emits a generic comment for JavaMethodBindingEmitters; the comment
+ * includes the C signature of the native method that is being bound by the
+ * emitter java method.
+ */
+ protected class DefaultCommentEmitter implements CommentEmitter {
+ public void emit(FunctionEmitter emitter, PrintWriter writer) {
+ emitBeginning(emitter, writer);
+ emitBindingCSignature(((JavaMethodBindingEmitter)emitter).getBinding(), writer);
+ emitEnding(emitter, writer);
+ }
+ protected void emitBeginning(FunctionEmitter emitter, PrintWriter writer) {
+ writer.print("Entry point to C language function: <br> ");
+ }
+ protected void emitBindingCSignature(MethodBinding binding, PrintWriter writer) {
+ writer.print("<code> ");
+ writer.print(binding.getCSymbol());
+ writer.print(" </code> ");
+ }
+ protected void emitEnding(FunctionEmitter emitter, PrintWriter writer) {
+ // If argument type is a named enum, then emit a comment detailing the
+ // acceptable values of that enum.
+ // If we're emitting a direct buffer variant only, then declare
+ // that the NIO buffer arguments must be direct.
+ MethodBinding binding = ((JavaMethodBindingEmitter)emitter).getBinding();
+ for (int i = 0; i < binding.getNumArguments(); i++) {
+ Type type = binding.getCArgumentType(i);
+ JavaType javaType = binding.getJavaArgumentType(i);
+ // don't emit param comments for anonymous enums, since we can't
+ // distinguish between the values found within multiple anonymous
+ // enums in the same C translation unit.
+ if (type.isEnum() && type.getName() != HeaderParser.ANONYMOUS_ENUM_NAME) {
+ EnumType enumType = (EnumType)type;
+ writer.println();
+ writer.print(emitter.getBaseIndentString());
+ writer.print(" ");
+ writer.print("@param ");
+ writer.print(getArgumentName(i));
+ writer.print(" valid values are: <code>");
+ for (int j = 0; j < enumType.getNumEnumerates(); ++j) {
+ if (j>0) writer.print(", ");
+ writer.print(enumType.getEnumName(j));
+ }
+ writer.println("</code>");
+ } else if (directNIOOnly && javaType.isNIOBuffer()) {
+ writer.println();
+ writer.print(emitter.getBaseIndentString());
+ writer.print(" ");
+ writer.print("@param ");
+ writer.print(getArgumentName(i));
+ writer.print(" a direct {@link " + javaType.getName() + "}");
+ }
+ }
+ }
+ }
+
+ protected class InterfaceCommentEmitter
+ extends JavaMethodBindingEmitter.DefaultCommentEmitter
+ {
+ protected void emitBeginning(FunctionEmitter emitter,
+ PrintWriter writer) {
+ writer.print("Interface to C language function: <br> ");
+ }
+ }
+}
+
diff --git a/src/net/java/games/gluegen/JavaType.java b/src/classes/com/sun/gluegen/JavaType.java
index 76b2f107c..496fd6961 100644
--- a/src/net/java/games/gluegen/JavaType.java
+++ b/src/classes/com/sun/gluegen/JavaType.java
@@ -37,11 +37,11 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
import java.nio.*;
-import net.java.games.gluegen.cgram.types.*;
+import com.sun.gluegen.cgram.types.*;
/**
* Describes a java-side representation of a type that is used to represent
@@ -98,6 +98,10 @@ public class JavaType {
return clazz.hashCode();
}
+ public JavaType getElementType() {
+ return new JavaType(elementType);
+ }
+
/** Creates a JavaType corresponding to the given Java type. This
can be used to represent arrays of primitive values or Strings;
the emitters understand how to perform proper conversion from
@@ -218,8 +222,7 @@ public class JavaType {
}
/**
- * Returns the name corresponding to this type. Returns null when this
- * object does not represent a C-language "struct" type.
+ * Returns the Java type name corresponding to this type.
*/
public String getName() {
if (clazz != null) {
@@ -234,10 +237,37 @@ public class JavaType {
return name;
}
+ /**
+ * Returns the descriptor (internal type signature) corresponding to
+ * this type.
+ */
+ public String getDescriptor() {
+ // FIXME: this is not completely accurate at this point (for
+ // example, it knows nothing about the packages for compound
+ // types)
+ if (clazz != null) {
+ return descriptor(clazz);
+ }
+ if (elementType != null) {
+ return "[" + descriptor(elementType.getName());
+ }
+ return descriptor(name);
+ }
+
/** Returns the String corresponding to the JNI type for this type,
or NULL if it can't be represented (i.e., it's a boxing class
that we need to call getBuffer() on.) */
public String jniTypeName() {
+ if (isCompoundTypeWrapper()) {
+ // These are sent down as Buffers (e.g., jobject)
+ return "jobject";
+ }
+
+ if (isArrayOfCompoundTypeWrappers()) {
+ // These are returned as arrays of ByteBuffers (e.g., jobjectArray)
+ return "jobjectArray /* of ByteBuffer */";
+ }
+
if (clazz == null) {
return null;
}
@@ -246,48 +276,41 @@ public class JavaType {
return "void";
}
- if (clazz.isPrimitive()) {
+ if (isPrimitive()) {
return "j" + clazz.getName();
}
- if (clazz.isArray()) {
- Class elementType = clazz.getComponentType();
- if (elementType.isPrimitive())
- {
- // Type is array-of-primitive
- return "j" + elementType.getName() + "Array";
- }
- else if (elementType == java.lang.String.class)
- {
- // Type is array-of-string
+ if (isPrimitiveArray() || isNIOBuffer()) {
+ // We now pass primitive arrays and buffers uniformly down to native code as java.lang.Object.
+ return "jobject";
+ }
+
+ if (isArray()) {
+ if (isStringArray()) {
return "jobjectArray /*elements are String*/";
- //return "jobjectArray";
}
- else if (java.nio.Buffer.class.isAssignableFrom(elementType))
- {
+
+ Class elementType = clazz.getComponentType();
+
+ if (isNIOBufferArray()) {
return "jobjectArray /*elements are " + elementType.getName() + "*/";
}
- else if (elementType.isArray())
- {
+
+ if (elementType.isArray()) {
// Type is array-of-arrays-of-something
- if (elementType.getComponentType().isPrimitive())
- {
+ if (elementType.getComponentType().isPrimitive()) {
// Type is an array-of-arrays-of-primitive
return "jobjectArray /* elements are " + elementType.getComponentType() + "[]*/";
//return "jobjectArray";
- }
- else
- {
+ } else {
throw new RuntimeException("Multi-dimensional arrays of types that are not primitives or Strings are not supported.");
}
}
- else
- {
- // Some unusual type that we don't handle
- throw new RuntimeException("Unexpected and unsupported type: \"" + this + "\"");
- }
- } // end array type case
+
+ // Some unusual type that we don't handle
+ throw new RuntimeException("Unexpected and unsupported array type: \"" + this + "\"");
+ }
if (isString()) {
return "jstring";
@@ -321,6 +344,35 @@ public class JavaType {
return ((clazz != null) && clazz.isArray());
}
+ public boolean isFloatArray() {
+ return(clazz.isArray() && clazz.getComponentType() == Float.TYPE);
+ }
+
+ public boolean isDoubleArray() {
+ return(clazz.isArray() && clazz.getComponentType() == Double.TYPE);
+ }
+
+ public boolean isByteArray() {
+ return(clazz.isArray() && clazz.getComponentType() == Byte.TYPE);
+ }
+
+ public boolean isIntArray() {
+ return(clazz.isArray() && clazz.getComponentType() == Integer.TYPE);
+ }
+
+ public boolean isShortArray() {
+ return(clazz.isArray() && clazz.getComponentType() == Short.TYPE);
+ }
+
+ public boolean isLongArray() {
+ return(clazz.isArray() && clazz.getComponentType() == Long.TYPE);
+ }
+
+ public boolean isStringArray() {
+ return(clazz.isArray() && clazz.getComponentType() == java.lang.String.class);
+ }
+
+
public boolean isPrimitive() {
return ((clazz != null) && !isArray() && clazz.isPrimitive() && (clazz != Void.TYPE));
}
@@ -329,6 +381,30 @@ public class JavaType {
return (isArray() && (clazz.getComponentType().isPrimitive()));
}
+ public boolean isShort() {
+ return (clazz == Short.TYPE);
+ }
+
+ public boolean isFloat() {
+ return (clazz == Float.TYPE);
+ }
+
+ public boolean isDouble() {
+ return (clazz == Double.TYPE);
+ }
+
+ public boolean isByte() {
+ return (clazz == Byte.TYPE);
+ }
+
+ public boolean isLong() {
+ return (clazz == Long.TYPE);
+ }
+
+ public boolean isInt() {
+ return (clazz == Integer.TYPE);
+ }
+
public boolean isVoid() {
return (clazz == Void.TYPE);
}
@@ -395,6 +471,11 @@ public class JavaType {
// Internals only below this point
//
+ // For debugging
+ public void dump() {
+ System.err.println("[clazz = " + clazz + " , name = " + name + " , elementType = " + elementType + " , primitivePointerType = " + primitivePointerType + "]");
+ }
+
/**
* Constructs a representation for a type corresponding to the given Class
* argument.
@@ -432,5 +513,37 @@ public class JavaType {
}
return buf.toString();
}
-
+
+ private String arrayDescriptor(Class clazz) {
+ StringBuffer buf = new StringBuffer();
+ int arrayCount = 0;
+ while (clazz.isArray()) {
+ buf.append("[");
+ clazz = clazz.getComponentType();
+ }
+ buf.append(descriptor(clazz));
+ return buf.toString();
+ }
+
+ private String descriptor(Class clazz) {
+ if (clazz.isPrimitive()) {
+ if (clazz == Boolean.TYPE) return "Z";
+ if (clazz == Byte.TYPE) return "B";
+ if (clazz == Double.TYPE) return "D";
+ if (clazz == Float.TYPE) return "F";
+ if (clazz == Integer.TYPE) return "I";
+ if (clazz == Long.TYPE) return "J";
+ if (clazz == Short.TYPE) return "S";
+ if (clazz == Void.TYPE) return "V";
+ throw new RuntimeException("Unexpected primitive type " + clazz.getName());
+ }
+ if (clazz.isArray()) {
+ return arrayDescriptor(clazz);
+ }
+ return descriptor(clazz.getName());
+ }
+
+ private String descriptor(String referenceTypeName) {
+ return "L" + referenceTypeName.replace('.', '/') + ";";
+ }
}
diff --git a/src/net/java/games/gluegen/MethodBinding.java b/src/classes/com/sun/gluegen/MethodBinding.java
index d8b91acaf..b8ebb092a 100644
--- a/src/net/java/games/gluegen/MethodBinding.java
+++ b/src/classes/com/sun/gluegen/MethodBinding.java
@@ -37,11 +37,11 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
import java.util.*;
-import net.java.games.gluegen.cgram.types.*;
+import com.sun.gluegen.cgram.types.*;
/** Represents the binding of a C function to a Java method. Also used
to represent calls through function pointers contained in
@@ -50,12 +50,18 @@ import net.java.games.gluegen.cgram.types.*;
public class MethodBinding {
private FunctionSymbol sym;
+ private String renamedMethodName;
private JavaType javaReturnType;
private List javaArgumentTypes;
private boolean computedSignatureProperties;
+ private boolean argumentsUseNIO;
private boolean signatureUsesNIO;
+ private boolean signatureCanUseIndirectNIO;
+ private boolean signatureUsesCompoundTypeWrappers;
+ private boolean signatureUsesCVoidPointers;
+ private boolean signatureUsesCPrimitivePointers;
private boolean signatureUsesCArrays;
- private boolean signatureUsesPrimitiveArrays;
+ private boolean signatureUsesJavaPrimitiveArrays;
private JavaType containingType;
private Type containingCType;
private int thisPointerIndex = -1;
@@ -68,15 +74,21 @@ public class MethodBinding {
public MethodBinding(MethodBinding bindingToCopy) {
this.sym = bindingToCopy.sym;
- this.containingType = bindingToCopy.containingType;
- this.containingCType = bindingToCopy.containingCType;
- this.javaReturnType = bindingToCopy.javaReturnType;
- this.javaArgumentTypes = (List)((ArrayList)bindingToCopy.javaArgumentTypes).clone();
- this.computedSignatureProperties = bindingToCopy.computedSignatureProperties;
- this.signatureUsesNIO = bindingToCopy.signatureUsesNIO;
- this.signatureUsesCArrays = bindingToCopy.signatureUsesCArrays;
- this.signatureUsesPrimitiveArrays = bindingToCopy.signatureUsesPrimitiveArrays;
- this.thisPointerIndex = bindingToCopy.thisPointerIndex;
+ this.renamedMethodName = bindingToCopy.renamedMethodName;
+ this.containingType = bindingToCopy.containingType;
+ this.containingCType = bindingToCopy.containingCType;
+ this.javaReturnType = bindingToCopy.javaReturnType;
+ this.javaArgumentTypes = (List)((ArrayList)bindingToCopy.javaArgumentTypes).clone();
+ this.computedSignatureProperties = bindingToCopy.computedSignatureProperties;
+ this.argumentsUseNIO = bindingToCopy.argumentsUseNIO;
+ this.signatureUsesNIO = bindingToCopy.signatureUsesNIO;
+ this.signatureCanUseIndirectNIO = bindingToCopy.signatureCanUseIndirectNIO;
+ this.signatureUsesCompoundTypeWrappers = bindingToCopy.signatureUsesCompoundTypeWrappers;
+ this.signatureUsesCVoidPointers = bindingToCopy.signatureUsesCVoidPointers;
+ this.signatureUsesCPrimitivePointers = bindingToCopy.signatureUsesCPrimitivePointers;
+ this.signatureUsesCArrays = bindingToCopy.signatureUsesCArrays;
+ this.signatureUsesJavaPrimitiveArrays = bindingToCopy.signatureUsesJavaPrimitiveArrays;
+ this.thisPointerIndex = bindingToCopy.thisPointerIndex;
}
/** Constructor for calling a C function. */
@@ -146,12 +158,26 @@ public class MethodBinding {
return sym.getName();
}
- /** Replaces the C primitive pointer argument at slot <i>argumentNumber</i>
- (0..getNumArguments() - 1) with the specified type. If
- argumentNumber is less than 0 then replaces the return type. */
- public MethodBinding createCPrimitivePointerVariant(int argumentNumber,
- JavaType newArgType) {
- MethodBinding binding = new MethodBinding(sym);
+ public String getRenamedMethodName() {
+ // Defaults to same as C symbol unless renamed
+ if (renamedMethodName != null) {
+ return renamedMethodName;
+ }
+ return sym.getName();
+ }
+
+ /** Supports renaming C function in Java binding. */
+ public void setRenamedMethodName(String name) {
+ renamedMethodName = name;
+ }
+
+ /** Creates a new MethodBinding replacing the specified Java
+ argument type with a new argument type. If argumentNumber is
+ less than 0 then replaces the return type. */
+ public MethodBinding replaceJavaArgumentType(int argumentNumber,
+ JavaType newArgType) {
+ MethodBinding binding = (MethodBinding) clone();
+ binding.javaArgumentTypes = null;
if (argumentNumber < 0) {
binding.setJavaReturnType(newArgType);
} else {
@@ -168,6 +194,16 @@ public class MethodBinding {
}
/**
+ * Returns true if any of the outgoing arguments in the method's
+ * signature require conversion or checking due to the use of New
+ * I/O.
+ */
+ public boolean argumentsUseNIO() {
+ computeSignatureProperties();
+ return argumentsUseNIO;
+ }
+
+ /**
* Returns true if the return type or any of the outgoing arguments
* in the method's signature require conversion or checking due to
* the use of New I/O.
@@ -178,9 +214,55 @@ public class MethodBinding {
}
/**
- * Returns true if any of the outgoing arguments in the method's
- * signature represent fixed-length C arrays which require length
- * checking during the call.
+ * Returns true if it is possible for any of the outgoing arguments
+ * to be indirect NIO buffers.
+ */
+ public boolean signatureCanUseIndirectNIO() {
+ computeSignatureProperties();
+ return signatureCanUseIndirectNIO;
+ }
+
+ /**
+ * Returns true if the return type or any of the outgoing arguments
+ * in the method's signature use "compound type wrappers", or
+ * NIO-based wrappers for C data structures.
+ */
+ public boolean signatureUsesCompoundTypeWrappers() {
+ computeSignatureProperties();
+ return signatureUsesCompoundTypeWrappers;
+ }
+
+ /**
+ * Returns true if the function needs NIO-related
+ * wrapping/unwrapping or conversion of various arguments. Currently
+ * this returns the logical OR of signatureUsesNIO() and
+ * signatureUsesCompoundTypeWrappers().
+ */
+ public boolean needsNIOWrappingOrUnwrapping() {
+ return (signatureUsesNIO() || signatureUsesCompoundTypeWrappers());
+ }
+
+ /**
+ * Returns true if the return type or any of the outgoing arguments
+ * in the method's signature represent C void* pointers.
+ */
+ public boolean signatureUsesCVoidPointers() {
+ computeSignatureProperties();
+ return signatureUsesCVoidPointers;
+ }
+
+ /**
+ * Returns true if the return type or any of the outgoing arguments
+ * in the method's signature represent C primitive pointers.
+ */
+ public boolean signatureUsesCPrimitivePointers() {
+ computeSignatureProperties();
+ return signatureUsesCPrimitivePointers;
+ }
+
+ /**
+ * Returns true if the return type or any of the outgoing arguments
+ * in the method's signature represent C arrays.
*/
public boolean signatureUsesCArrays() {
computeSignatureProperties();
@@ -188,13 +270,12 @@ public class MethodBinding {
}
/**
- * Returns true if any of the outgoing arguments in the method's
- * signature represent primitive arrays which require a
- * GetPrimitiveArrayCritical or similar operation during the call.
+ * Returns true if the return type or any of the outgoing arguments
+ * in the method's signature represent Java primitive arrays.
*/
- public boolean signatureUsesPrimitiveArrays() {
+ public boolean signatureUsesJavaPrimitiveArrays() {
computeSignatureProperties();
- return signatureUsesPrimitiveArrays;
+ return signatureUsesJavaPrimitiveArrays;
}
/**
@@ -205,68 +286,91 @@ public class MethodBinding {
if (computedSignatureProperties)
return;
+ argumentsUseNIO = false;
signatureUsesNIO = false;
+ signatureCanUseIndirectNIO = false;
+ signatureUsesCompoundTypeWrappers = false;
+ signatureUsesCVoidPointers = false;
+ signatureUsesCPrimitivePointers = false;
signatureUsesCArrays = false;
- signatureUsesPrimitiveArrays = false;
+ signatureUsesJavaPrimitiveArrays = false;
+
+ if (javaReturnType.isCompoundTypeWrapper()) {
+ // Needs wrapping and/or setting of byte order (neither of which
+ // can be done easily from native code)
+ signatureUsesCompoundTypeWrappers = true;
+ }
- if (javaReturnType.isCompoundTypeWrapper() ||
- javaReturnType.isNIOByteBuffer() ||
+ if (javaReturnType.isNIOByteBuffer() ||
javaReturnType.isArrayOfCompoundTypeWrappers()) {
- // Needs wrapping and/or setting of byte order (neither of
- // which can be done easily from native code)
+ // Needs setting of byte order which can't be done easily from
+ // native code
signatureUsesNIO = true;
}
+ Type cRetType = sym.getReturnType();
+ if (cRetType.isArray()) {
+ // Needs checking of array lengths
+ signatureUsesCArrays = true;
+ if (cRetType.asArray().getElementType().isPrimitive()) {
+ signatureUsesCPrimitivePointers = true;
+ }
+ }
+
+ if (cRetType.isPointer()) {
+ if (cRetType.asPointer().getTargetType().isPrimitive()) {
+ signatureUsesCPrimitivePointers = true;
+ } else if (cRetType.asPointer().getTargetType().isVoid()) {
+ signatureUsesCVoidPointers = true;
+ }
+ }
+
for (int i = 0; i < getNumArguments(); i++) {
JavaType javaArgType = getJavaArgumentType(i);
Type cArgType = getCArgumentType(i);
- if (javaArgType.isCompoundTypeWrapper() ||
- javaArgType.isNIOBuffer() ||
+ if (javaArgType.isCompoundTypeWrapper()) {
+ // Needs unwrapping of accessors
+ signatureUsesCompoundTypeWrappers = true;
+ }
+
+ if (javaArgType.isNIOBuffer() ||
javaArgType.isNIOBufferArray()) {
- // Needs unwrapping of accessors or checking of direct
- // buffer property
+ // Needs checking of direct buffer property
signatureUsesNIO = true;
+ argumentsUseNIO = true;
+
+ if (javaArgType.isNIOBuffer()) {
+ // Potential conversion to indirect buffer
+ signatureCanUseIndirectNIO = true;
+ }
}
if (cArgType.isArray()) {
// Needs checking of array lengths
signatureUsesCArrays = true;
+ if (cArgType.asArray().getElementType().isPrimitive()) {
+ signatureUsesCPrimitivePointers = true;
+ }
+ }
+
+ if (cArgType.isPointer()) {
+ if (cArgType.asPointer().getTargetType().isPrimitive()) {
+ signatureUsesCPrimitivePointers = true;
+ } else if (cArgType.asPointer().getTargetType().isVoid()) {
+ signatureUsesCVoidPointers = true;
+ }
}
if (javaArgType.isPrimitiveArray()) {
// Needs getPrimitiveArrayCritical or similar construct
// depending on native code calling convention
- signatureUsesPrimitiveArrays = true;
+ signatureUsesJavaPrimitiveArrays = true;
}
}
computedSignatureProperties = true;
}
-
- public MethodBinding createNIOBufferVariant() {
- if (!signatureUsesNIO()) {
- return this;
- }
- MethodBinding binding = new MethodBinding(sym, containingType, containingCType);
- binding.thisPointerIndex = thisPointerIndex;
- if (javaReturnType.isCompoundTypeWrapper()) {
- binding.setJavaReturnType(JavaType.forNIOByteBufferClass());
- } else if (javaReturnType.isArrayOfCompoundTypeWrappers()) {
- binding.setJavaReturnType(JavaType.forNIOByteBufferArrayClass());
- } else {
- binding.setJavaReturnType(javaReturnType);
- }
- for (int i = 0; i < getNumArguments(); i++) {
- JavaType type = getJavaArgumentType(i);
- if (type.isCompoundTypeWrapper()) {
- type = JavaType.forNIOBufferClass();
- }
- binding.addJavaArgumentType(type);
- }
- return binding;
- }
-
/** Indicates whether this MethodBinding is for a function pointer
contained in a struct. */
public boolean hasContainingType() {
@@ -353,7 +457,7 @@ public class MethodBinding {
StringBuffer buf = new StringBuffer(200);
buf.append(getJavaReturnType().getName());
buf.append(" ");
- buf.append(getName());
+ buf.append(getRenamedMethodName());
buf.append("(");
boolean needComma = false;
for (int i = 0; i < getNumArguments(); i++) {
@@ -386,5 +490,82 @@ public class MethodBinding {
return new MethodBinding(this);
}
+ /** Returns a String containing the descriptor (signature in
+ internal format) of this MethodBinding as it will be
+ emitted. This is used to disambiguate between overloadings when
+ manually specifying prologue and epilogue code, for example. */
+ public String getDescriptor(boolean forImplementingMethodCall,
+ boolean eraseBufferAndArrayTypes) {
+ StringBuffer buf = new StringBuffer();
+
+ buf.append("(");
+
+ if (forImplementingMethodCall && hasContainingType()) {
+ // Always emit outgoing "this" argument
+ buf.append("Ljava/nio/ByteBuffer;");
+ }
+
+ for (int i = 0; i < getNumArguments(); i++) {
+ JavaType type = getJavaArgumentType(i);
+ if (type.isVoid()) {
+ // Make sure this is the only param to the method; if it isn't,
+ // there's something wrong with our parsing of the headers.
+ if (getNumArguments() != 1) {
+ throw new InternalError(
+ "\"void\" argument type found in " +
+ "multi-argument function \"" + this + "\"");
+ }
+ continue;
+ }
+
+ if (type.isJNIEnv() || isArgumentThisPointer(i)) {
+ // Don't need to expose these at the Java level
+ continue;
+ }
+
+ buf.append(erasedTypeDescriptor(type, eraseBufferAndArrayTypes, false));
+
+ // Add Buffer and array index offset arguments after each associated argument
+ if (forImplementingMethodCall) {
+ if (type.isNIOBuffer()) {
+ buf.append("I");
+ } else if (type.isNIOBufferArray()) {
+ buf.append("[I");
+ }
+ }
+
+ // Add offset argument after each primitive array
+ if (type.isPrimitiveArray()) {
+ buf.append("I");
+ }
+ }
+
+ buf.append(")");
+
+ // Emit return type for completeness even though we can't overload
+ // based solely on return type
+ buf.append(erasedTypeDescriptor(getJavaReturnType(), eraseBufferAndArrayTypes, false));
+
+ return buf.toString();
+ }
+
+ protected String erasedTypeDescriptor(JavaType type, boolean eraseBufferAndArrayTypes, boolean skipBuffers) {
+ if (eraseBufferAndArrayTypes) {
+ if (type.isNIOBuffer() ||
+ type.isPrimitiveArray()) {
+ if (!skipBuffers) {
+ // Direct buffers and arrays sent down as Object (but
+ // returned as e.g. ByteBuffer)
+ return "Ljava/lang/Object;";
+ }
+ } else if (type.isCompoundTypeWrapper()) {
+ // Compound type wrappers are unwrapped to ByteBuffer
+ return "Ljava/nio/ByteBuffer;";
+ } else if (type.isArrayOfCompoundTypeWrappers()) {
+ return "Ljava/nio/ByteBuffer;";
+ }
+ }
+ return type.getDescriptor();
+ }
}
diff --git a/src/net/java/games/gluegen/ReferencedStructs.java b/src/classes/com/sun/gluegen/ReferencedStructs.java
index 824346be8..6c0dfb401 100644
--- a/src/net/java/games/gluegen/ReferencedStructs.java
+++ b/src/classes/com/sun/gluegen/ReferencedStructs.java
@@ -37,10 +37,10 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
import java.util.*;
-import net.java.games.gluegen.cgram.types.*;
+import com.sun.gluegen.cgram.types.*;
public class ReferencedStructs implements TypeVisitor {
private Set results = new HashSet();
diff --git a/src/net/java/games/gluegen/StructLayout.java b/src/classes/com/sun/gluegen/StructLayout.java
index 77542b714..a7dbab61f 100644
--- a/src/net/java/games/gluegen/StructLayout.java
+++ b/src/classes/com/sun/gluegen/StructLayout.java
@@ -37,9 +37,9 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
-import net.java.games.gluegen.cgram.types.*;
+import com.sun.gluegen.cgram.types.*;
public class StructLayout {
private int baseOffset;
@@ -124,6 +124,7 @@ public class StructLayout {
if ((os.startsWith("windows") && cpu.equals("x86")) ||
(os.startsWith("linux") && cpu.equals("i386")) ||
(os.startsWith("linux") && cpu.equals("amd64")) ||
+ (os.startsWith("linux") && cpu.equals("x86_64")) ||
(os.startsWith("linux") && cpu.equals("ia64")) ||
(os.startsWith("sunos") && cpu.equals("sparc")) ||
(os.startsWith("sunos") && cpu.equals("x86")) ||
diff --git a/src/net/java/games/gluegen/TypeInfo.java b/src/classes/com/sun/gluegen/TypeInfo.java
index 60146fa48..437fa8564 100644
--- a/src/net/java/games/gluegen/TypeInfo.java
+++ b/src/classes/com/sun/gluegen/TypeInfo.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.gluegen;
/** Utility class for handling Opaque directives for JavaEmitter. */
diff --git a/src/net/java/games/gluegen/ant/GlueGenTask.java b/src/classes/com/sun/gluegen/ant/GlueGenTask.java
index c9849c29d..b90009883 100644
--- a/src/net/java/games/gluegen/ant/GlueGenTask.java
+++ b/src/classes/com/sun/gluegen/ant/GlueGenTask.java
@@ -1,4 +1,4 @@
-package net.java.games.gluegen.ant;
+package com.sun.gluegen.ant;
/*
* GlueGenTask.java
@@ -60,7 +60,7 @@ import org.apache.tools.ant.util.JavaEnvUtils;
/**
* <p>An <a href="http://ant.apache.org">ANT</a> {@link org.apache.tools.ant.Task}
- * for using {@link net.java.games.gluegen.GlueGen}.</p>
+ * for using {@link com.sun.gluegen.GlueGen}.</p>
*
* <p>Usage:</p>
* <pre>
@@ -80,14 +80,14 @@ import org.apache.tools.ant.util.JavaEnvUtils;
public class GlueGenTask extends Task
{
/**
- * <p>The {@link net.java.games.gluegen.GlueGen} classname.</p>
+ * <p>The {@link com.sun.gluegen.GlueGen} classname.</p>
*/
- private static final String GLUE_GEN = "net.java.games.gluegen.GlueGen";
+ private static final String GLUE_GEN = "com.sun.gluegen.GlueGen";
// =========================================================================
/**
* <p>The {@link org.apache.tools.ant.types.CommandlineJava} that is used
- * to execute {@link net.java.games.gluegen.GlueGen}.</p>
+ * to execute {@link com.sun.gluegen.GlueGen}.</p>
*/
private CommandlineJava gluegenCommandline;
@@ -304,7 +304,7 @@ public class GlueGenTask extends Task
}
/**
- * <p>Add an optional classpath that defines the location of {@link net.java.games.gluegen.GlueGen}
+ * <p>Add an optional classpath that defines the location of {@link com.sun.gluegen.GlueGen}
* and <code>GlueGen</code>'s dependencies.</p>
*
* @returns {@link org.apache.tools.ant.types.Path}
@@ -466,7 +466,7 @@ public class GlueGenTask extends Task
}
/**
- * <p>Execute {@link net.java.games.gluegen.GlueGen} in a forked JVM.</p>
+ * <p>Execute {@link com.sun.gluegen.GlueGen} in a forked JVM.</p>
*
* @throws BuildException
*/
diff --git a/src/net/java/games/gluegen/ant/StaticGLGenTask.java b/src/classes/com/sun/gluegen/ant/StaticGLGenTask.java
index 35ed2d504..255ab8a1a 100644
--- a/src/net/java/games/gluegen/ant/StaticGLGenTask.java
+++ b/src/classes/com/sun/gluegen/ant/StaticGLGenTask.java
@@ -1,4 +1,4 @@
-package net.java.games.gluegen.ant;
+package com.sun.gluegen.ant;
/*
* StaticGLGenTask.java
@@ -55,7 +55,7 @@ import org.apache.tools.ant.util.JavaEnvUtils;
/**
* <p>An <a href="http://ant.apache.org">ANT</a> {@link org.apache.tools.ant.Task}
- * for using {@link net.java.games.gluegen.opengl.BuildStaticGLInfo}.</p>
+ * for using {@link com.sun.gluegen.opengl.BuildStaticGLInfo}.</p>
*
* <p>Usage:</p>
* <pre>
@@ -70,14 +70,14 @@ import org.apache.tools.ant.util.JavaEnvUtils;
public class StaticGLGenTask extends Task
{
/**
- * <p>The {@link net.java.games.gluegen.opengl.BuildStaticGLInfo} classname.</p>
+ * <p>The {@link com.sun.gluegen.opengl.BuildStaticGLInfo} classname.</p>
*/
- private static final String GL_GEN = "net.java.games.gluegen.opengl.BuildStaticGLInfo";
+ private static final String GL_GEN = "com.sun.gluegen.opengl.BuildStaticGLInfo";
// =========================================================================
/**
* <p>The {@link org.apache.tools.ant.types.CommandlineJava} that is used
- * to execute {@link net.java.games.gluegen.opengl.BuildStaticGLInfo}.</p>
+ * to execute {@link com.sun.gluegen.opengl.BuildStaticGLInfo}.</p>
*/
private CommandlineJava glgenCommandline;
@@ -170,7 +170,7 @@ public class StaticGLGenTask extends Task
}
/**
- * <p>Add an optional classpath that defines the location of {@link net.java.games.gluegen.opengl.BuildStaticGLInfo}
+ * <p>Add an optional classpath that defines the location of {@link com.sun.gluegen.opengl.BuildStaticGLInfo}
* and <code>BuildStaticGLInfo</code>'s dependencies.</p>
*
* @returns {@link org.apache.tools.ant.types.Path}
@@ -274,7 +274,7 @@ public class StaticGLGenTask extends Task
}
/**
- * <p>Execute {@link net.java.games.gluegen.opengl.BuildStaticGLInfo} in a
+ * <p>Execute {@link com.sun.gluegen.opengl.BuildStaticGLInfo} in a
* forked JVM.</p>
*
* @throws BuildException
diff --git a/src/net/java/games/gluegen/cgram/CSymbolTable.java b/src/classes/com/sun/gluegen/cgram/CSymbolTable.java
index e22274b90..51edf44c3 100644
--- a/src/net/java/games/gluegen/cgram/CSymbolTable.java
+++ b/src/classes/com/sun/gluegen/cgram/CSymbolTable.java
@@ -1,4 +1,4 @@
-package net.java.games.gluegen.cgram;
+package com.sun.gluegen.cgram;
import java.util.Vector;
import java.util.Hashtable;
diff --git a/src/net/java/games/gluegen/cgram/CToken.java b/src/classes/com/sun/gluegen/cgram/CToken.java
index facd95a08..5d85c48c7 100644
--- a/src/net/java/games/gluegen/cgram/CToken.java
+++ b/src/classes/com/sun/gluegen/cgram/CToken.java
@@ -1,4 +1,4 @@
-package net.java.games.gluegen.cgram;
+package com.sun.gluegen.cgram;
import antlr.CommonToken;
diff --git a/src/net/java/games/gluegen/cgram/Define.java b/src/classes/com/sun/gluegen/cgram/Define.java
index 9fbd8636d..a71c538bb 100644
--- a/src/net/java/games/gluegen/cgram/Define.java
+++ b/src/classes/com/sun/gluegen/cgram/Define.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram;
+package com.sun.gluegen.cgram;
/** Represents a #define of a literal to a value (a number represented
in string form.) */
diff --git a/src/net/java/games/gluegen/cgram/GnuCEmitter.g b/src/classes/com/sun/gluegen/cgram/GnuCEmitter.g
index 87294fc53..82003c3a0 100644
--- a/src/net/java/games/gluegen/cgram/GnuCEmitter.g
+++ b/src/classes/com/sun/gluegen/cgram/GnuCEmitter.g
@@ -17,7 +17,7 @@ DESCRIPTION:
header {
- package net.java.games.gluegen.cgram;
+ package com.sun.gluegen.cgram;
import java.io.*;
import java.util.*;
diff --git a/src/net/java/games/gluegen/cgram/GnuCParser.g b/src/classes/com/sun/gluegen/cgram/GnuCParser.g
index feed4518e..c90e01179 100644
--- a/src/net/java/games/gluegen/cgram/GnuCParser.g
+++ b/src/classes/com/sun/gluegen/cgram/GnuCParser.g
@@ -17,7 +17,7 @@ DESCRIPTION:
header {
- package net.java.games.gluegen.cgram;
+ package com.sun.gluegen.cgram;
import java.io.*;
diff --git a/src/net/java/games/gluegen/cgram/GnuCTreeParser.g b/src/classes/com/sun/gluegen/cgram/GnuCTreeParser.g
index 8400e3e59..5231dee17 100644
--- a/src/net/java/games/gluegen/cgram/GnuCTreeParser.g
+++ b/src/classes/com/sun/gluegen/cgram/GnuCTreeParser.g
@@ -17,7 +17,7 @@ DESCRIPTION:
header {
- package net.java.games.gluegen.cgram;
+ package com.sun.gluegen.cgram;
import java.io.*;
diff --git a/src/net/java/games/gluegen/cgram/HeaderParser.g b/src/classes/com/sun/gluegen/cgram/HeaderParser.g
index 1263c30b8..212e56091 100644
--- a/src/net/java/games/gluegen/cgram/HeaderParser.g
+++ b/src/classes/com/sun/gluegen/cgram/HeaderParser.g
@@ -38,13 +38,13 @@
*/
header {
- package net.java.games.gluegen.cgram;
+ package com.sun.gluegen.cgram;
import java.io.*;
import java.util.*;
import antlr.CommonAST;
- import net.java.games.gluegen.cgram.types.*;
+ import com.sun.gluegen.cgram.types.*;
}
class HeaderParser extends GnuCTreeParser;
diff --git a/src/net/java/games/gluegen/cgram/LineObject.java b/src/classes/com/sun/gluegen/cgram/LineObject.java
index 578e14194..0ed470c92 100644
--- a/src/net/java/games/gluegen/cgram/LineObject.java
+++ b/src/classes/com/sun/gluegen/cgram/LineObject.java
@@ -1,4 +1,4 @@
-package net.java.games.gluegen.cgram;
+package com.sun.gluegen.cgram;
class LineObject {
LineObject parent = null;
diff --git a/src/net/java/games/gluegen/cgram/PreprocessorInfoChannel.java b/src/classes/com/sun/gluegen/cgram/PreprocessorInfoChannel.java
index f2de592c7..431af91d3 100644
--- a/src/net/java/games/gluegen/cgram/PreprocessorInfoChannel.java
+++ b/src/classes/com/sun/gluegen/cgram/PreprocessorInfoChannel.java
@@ -1,4 +1,4 @@
-package net.java.games.gluegen.cgram;
+package com.sun.gluegen.cgram;
import java.util.*;
diff --git a/src/net/java/games/gluegen/cgram/StdCParser.g b/src/classes/com/sun/gluegen/cgram/StdCParser.g
index 65f7468bf..e84fbfd6e 100644
--- a/src/net/java/games/gluegen/cgram/StdCParser.g
+++ b/src/classes/com/sun/gluegen/cgram/StdCParser.g
@@ -47,7 +47,7 @@ TODO:
header {
- package net.java.games.gluegen.cgram;
+ package com.sun.gluegen.cgram;
import java.io.*;
diff --git a/src/net/java/games/gluegen/cgram/TNode.java b/src/classes/com/sun/gluegen/cgram/TNode.java
index 2a93b939c..f5b2c17e2 100644
--- a/src/net/java/games/gluegen/cgram/TNode.java
+++ b/src/classes/com/sun/gluegen/cgram/TNode.java
@@ -1,4 +1,4 @@
-package net.java.games.gluegen.cgram;
+package com.sun.gluegen.cgram;
import antlr.collections.AST;
import antlr.CommonAST;
diff --git a/src/net/java/games/gluegen/cgram/TNodeFactory.java b/src/classes/com/sun/gluegen/cgram/TNodeFactory.java
index 8cda2cfa9..452363263 100644
--- a/src/net/java/games/gluegen/cgram/TNodeFactory.java
+++ b/src/classes/com/sun/gluegen/cgram/TNodeFactory.java
@@ -1,4 +1,4 @@
-package net.java.games.gluegen.cgram;
+package com.sun.gluegen.cgram;
import antlr.Token;
import antlr.ASTFactory;
diff --git a/src/net/java/games/gluegen/cgram/types/ArrayType.java b/src/classes/com/sun/gluegen/cgram/types/ArrayType.java
index 1a73284e7..c61e6457f 100644
--- a/src/net/java/games/gluegen/cgram/types/ArrayType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/ArrayType.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
/** Represents an array type. This differs from a pointer type in C
syntax by the use of "[]" rather than "*". The length may or may
diff --git a/src/net/java/games/gluegen/cgram/types/BitType.java b/src/classes/com/sun/gluegen/cgram/types/BitType.java
index 915f847f8..293eb3969 100644
--- a/src/net/java/games/gluegen/cgram/types/BitType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/BitType.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
/** Represents a bitfield in a struct. */
diff --git a/src/net/java/games/gluegen/cgram/types/CVAttributes.java b/src/classes/com/sun/gluegen/cgram/types/CVAttributes.java
index 481a7be00..589904b36 100644
--- a/src/net/java/games/gluegen/cgram/types/CVAttributes.java
+++ b/src/classes/com/sun/gluegen/cgram/types/CVAttributes.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
/** Enumeration for const/volatile attributes. These are passed in to
the constructor of the type. */
diff --git a/src/net/java/games/gluegen/cgram/types/CompoundType.java b/src/classes/com/sun/gluegen/cgram/types/CompoundType.java
index 4c8c2d9ac..6ad7580e0 100644
--- a/src/net/java/games/gluegen/cgram/types/CompoundType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/CompoundType.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
import java.util.*;
diff --git a/src/net/java/games/gluegen/cgram/types/CompoundTypeKind.java b/src/classes/com/sun/gluegen/cgram/types/CompoundTypeKind.java
index eedabfd2f..8df12ac7f 100644
--- a/src/net/java/games/gluegen/cgram/types/CompoundTypeKind.java
+++ b/src/classes/com/sun/gluegen/cgram/types/CompoundTypeKind.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
/** Type-safe enum for discriminating between structs and unions,
which are both represented as compound types. */
diff --git a/src/net/java/games/gluegen/cgram/types/DoubleType.java b/src/classes/com/sun/gluegen/cgram/types/DoubleType.java
index 3d0ca6fe1..e2be470fb 100644
--- a/src/net/java/games/gluegen/cgram/types/DoubleType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/DoubleType.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
/** Represents a double-word floating-point type (C type "double".) */
diff --git a/src/net/java/games/gluegen/cgram/types/EnumType.java b/src/classes/com/sun/gluegen/cgram/types/EnumType.java
index 4ddd1e514..7f4b9e559 100644
--- a/src/net/java/games/gluegen/cgram/types/EnumType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/EnumType.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
import java.util.*;
diff --git a/src/net/java/games/gluegen/cgram/types/Field.java b/src/classes/com/sun/gluegen/cgram/types/Field.java
index a2ea44363..3514c8f7e 100644
--- a/src/net/java/games/gluegen/cgram/types/Field.java
+++ b/src/classes/com/sun/gluegen/cgram/types/Field.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
/** Represents a field in a struct or union. */
diff --git a/src/net/java/games/gluegen/cgram/types/FloatType.java b/src/classes/com/sun/gluegen/cgram/types/FloatType.java
index 8b81e0c3f..9f59b3564 100644
--- a/src/net/java/games/gluegen/cgram/types/FloatType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/FloatType.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
/** Represents a single-word floating-point type (C type "float".) */
diff --git a/src/net/java/games/gluegen/cgram/types/FunctionSymbol.java b/src/classes/com/sun/gluegen/cgram/types/FunctionSymbol.java
index ab72dfb83..50ee8ccff 100644
--- a/src/net/java/games/gluegen/cgram/types/FunctionSymbol.java
+++ b/src/classes/com/sun/gluegen/cgram/types/FunctionSymbol.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
import java.util.*;
diff --git a/src/net/java/games/gluegen/cgram/types/FunctionType.java b/src/classes/com/sun/gluegen/cgram/types/FunctionType.java
index 5d309a83f..9c94daea2 100644
--- a/src/net/java/games/gluegen/cgram/types/FunctionType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/FunctionType.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
import java.util.*;
diff --git a/src/net/java/games/gluegen/cgram/types/IntType.java b/src/classes/com/sun/gluegen/cgram/types/IntType.java
index 50223af11..2816c561c 100644
--- a/src/net/java/games/gluegen/cgram/types/IntType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/IntType.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
public class IntType extends PrimitiveType {
private boolean unsigned;
diff --git a/src/net/java/games/gluegen/cgram/types/MachineDescription.java b/src/classes/com/sun/gluegen/cgram/types/MachineDescription.java
index 7acb919bc..41923979b 100644
--- a/src/net/java/games/gluegen/cgram/types/MachineDescription.java
+++ b/src/classes/com/sun/gluegen/cgram/types/MachineDescription.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
public class MachineDescription {
private int charSizeInBytes;
diff --git a/src/net/java/games/gluegen/cgram/types/MachineDescription32Bit.java b/src/classes/com/sun/gluegen/cgram/types/MachineDescription32Bit.java
index fca7edce7..1dbbb700c 100644
--- a/src/net/java/games/gluegen/cgram/types/MachineDescription32Bit.java
+++ b/src/classes/com/sun/gluegen/cgram/types/MachineDescription32Bit.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
public class MachineDescription32Bit extends MachineDescription {
public MachineDescription32Bit() {
diff --git a/src/net/java/games/gluegen/cgram/types/MachineDescription64Bit.java b/src/classes/com/sun/gluegen/cgram/types/MachineDescription64Bit.java
index 4ef78639b..00d581266 100644
--- a/src/net/java/games/gluegen/cgram/types/MachineDescription64Bit.java
+++ b/src/classes/com/sun/gluegen/cgram/types/MachineDescription64Bit.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
public class MachineDescription64Bit extends MachineDescription {
public MachineDescription64Bit() {
diff --git a/src/net/java/games/gluegen/cgram/types/PointerType.java b/src/classes/com/sun/gluegen/cgram/types/PointerType.java
index ffe369761..142a2f12d 100644
--- a/src/net/java/games/gluegen/cgram/types/PointerType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/PointerType.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
public class PointerType extends Type {
private Type targetType;
diff --git a/src/net/java/games/gluegen/cgram/types/PrimitiveType.java b/src/classes/com/sun/gluegen/cgram/types/PrimitiveType.java
index 405f1016d..8807e2615 100644
--- a/src/net/java/games/gluegen/cgram/types/PrimitiveType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/PrimitiveType.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
public abstract class PrimitiveType extends Type {
protected PrimitiveType(String name, int size, int cvAttributes) {
diff --git a/src/net/java/games/gluegen/cgram/types/Type.java b/src/classes/com/sun/gluegen/cgram/types/Type.java
index 6c0ea9f79..2ac492d3f 100644
--- a/src/net/java/games/gluegen/cgram/types/Type.java
+++ b/src/classes/com/sun/gluegen/cgram/types/Type.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
import java.util.List;
diff --git a/src/net/java/games/gluegen/cgram/types/TypeDictionary.java b/src/classes/com/sun/gluegen/cgram/types/TypeDictionary.java
index 3909919aa..5c74455cb 100644
--- a/src/net/java/games/gluegen/cgram/types/TypeDictionary.java
+++ b/src/classes/com/sun/gluegen/cgram/types/TypeDictionary.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
import java.util.*;
diff --git a/src/net/java/games/gluegen/cgram/types/TypeVisitor.java b/src/classes/com/sun/gluegen/cgram/types/TypeVisitor.java
index 4679327d1..88f7dd544 100644
--- a/src/net/java/games/gluegen/cgram/types/TypeVisitor.java
+++ b/src/classes/com/sun/gluegen/cgram/types/TypeVisitor.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
public interface TypeVisitor {
public void visitType(Type t);
diff --git a/src/net/java/games/gluegen/cgram/types/VoidType.java b/src/classes/com/sun/gluegen/cgram/types/VoidType.java
index 00130b708..db4c43f81 100644
--- a/src/net/java/games/gluegen/cgram/types/VoidType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/VoidType.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.cgram.types;
+package com.sun.gluegen.cgram.types;
public class VoidType extends Type {
public VoidType(int cvAttributes) {
diff --git a/src/net/java/games/gluegen/opengl/BuildComposablePipeline.java b/src/classes/com/sun/gluegen/opengl/BuildComposablePipeline.java
index eaed4a100..5235631be 100644
--- a/src/net/java/games/gluegen/opengl/BuildComposablePipeline.java
+++ b/src/classes/com/sun/gluegen/opengl/BuildComposablePipeline.java
@@ -37,9 +37,9 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.opengl;
+package com.sun.gluegen.opengl;
-import net.java.games.gluegen.*;
+import com.sun.gluegen.*;
import java.lang.reflect.*;
import java.io.*;
@@ -511,7 +511,7 @@ public class BuildComposablePipeline
{
output.println("/** <P> Composable pipline which wraps an underlying {@link GL} implementation,");
output.println(" providing tracing information to a user-specified {@link java.io.PrintStream}");
- output.println(" before after each OpenGL method call. Sample code which installs this pipeline: </P>");
+ output.println(" before and after each OpenGL method call. Sample code which installs this pipeline: </P>");
output.println();
output.println("<PRE>");
output.println(" drawable.setGL(new TraceGL(drawable.getGL(), System.err));");
diff --git a/src/net/java/games/gluegen/opengl/BuildStaticGLInfo.java b/src/classes/com/sun/gluegen/opengl/BuildStaticGLInfo.java
index e4a091946..52b9fde51 100644
--- a/src/net/java/games/gluegen/opengl/BuildStaticGLInfo.java
+++ b/src/classes/com/sun/gluegen/opengl/BuildStaticGLInfo.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.opengl;
+package com.sun.gluegen.opengl;
import java.io.*;
import java.util.*;
@@ -90,10 +90,18 @@ import java.util.regex.*;
* */
public class BuildStaticGLInfo
{
+ // Handles function pointer
protected static Pattern funcPattern =
- Pattern.compile("^(GLAPI|extern)?(\\s*)(\\w+)(\\*)?(\\s+)(APIENTRY|WINAPI)?(\\s*)([w]?gl\\w+)\\s?(\\(.*)");
+ Pattern.compile("^(GLAPI|extern)?(\\s*)(\\w+)(\\*)?(\\s+)(GLAPIENTRY|APIENTRY|WINAPI)?(\\s*)([w]?gl\\w+)\\s?(\\(.*)");
protected static Pattern associationPattern =
Pattern.compile("\\#ifndef ([W]?GL[X]?_[A-Za-z0-9_]+)");
+ protected static Pattern definePattern =
+ Pattern.compile("\\#define ([W]?GL[X]?_[A-Za-z0-9_]+)\\s*([A-Za-z0-9_]+)");
+ // Maps function / #define names to the names of the extensions they're declared in
+ protected Map declarationToExtensionMap = new HashMap();
+ // Maps extension names to Set of identifiers (both #defines and
+ // function names) this extension declares
+ protected Map/*<String, Set<String>*/ extensionToDeclarationMap = new HashMap();
/**
* The first argument is the package to which the StaticGLInfo class
@@ -101,8 +109,17 @@ public class BuildStaticGLInfo
* classes reside, and the remaining arguments are paths to the C header
* files that should be parsed
*/
- public static void main(String[] args)
+ public static void main(String[] args) throws IOException
{
+ if (args.length > 0 && args[0].equals("-test")) {
+ BuildStaticGLInfo builder = new BuildStaticGLInfo();
+ String[] newArgs = new String[args.length - 1];
+ System.arraycopy(args, 1, newArgs, 0, args.length - 1);
+ builder.parse(newArgs);
+ builder.dump();
+ System.exit(0);
+ }
+
String packageName = args[0];
String packageDir = args[1];
@@ -110,18 +127,18 @@ public class BuildStaticGLInfo
System.arraycopy(args, 2, cHeaderFilePaths, 0, cHeaderFilePaths.length);
BuildStaticGLInfo builder = new BuildStaticGLInfo();
- try
- {
+ try {
+ builder.parse(cHeaderFilePaths);
+
File file = new File(packageDir + File.separatorChar + "StaticGLInfo.java");
String parentDir = file.getParent();
- if (parentDir != null)
- {
+ if (parentDir != null) {
File pDirFile = new File(parentDir);
pDirFile.mkdirs();
}
PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(file)));
- builder.build(writer, packageName, cHeaderFilePaths);
+ builder.emitJavaCode(writer, packageName);
writer.flush();
writer.close();
@@ -140,53 +157,71 @@ public class BuildStaticGLInfo
}
}
- protected void build(PrintWriter output, String packageName, String[] cHeaderFilePaths) throws IOException
- {
- HashMap groupToFuncHash = new HashMap(50);
- for (int i = 0; i < cHeaderFilePaths.length; ++i)
- {
- process(groupToFuncHash, new FileReader(cHeaderFilePaths[i]));
+
+ /** Parses the supplied C header files and adds the function
+ associations contained therein to the internal map. */
+ public void parse(String[] cHeaderFilePaths) throws IOException {
+ for (int i = 0; i < cHeaderFilePaths.length; i++) {
+ parse(cHeaderFilePaths[i]);
}
-
- emitJavaCode(output, packageName, groupToFuncHash);
}
-
- protected void process(HashMap groupToFuncHash, FileReader headerFile) throws IOException
- {
- BufferedReader reader = new BufferedReader(headerFile);
+
+ /** Parses the supplied C header file and adds the function
+ associations contained therein to the internal map. */
+ public void parse(String cHeaderFilePath) throws IOException {
+ BufferedReader reader = new BufferedReader(new FileReader(cHeaderFilePath));
String line, activeAssociation = null;
- Matcher m;
- while ((line = reader.readLine()) != null)
- {
+ Matcher m = null;
+ while ((line = reader.readLine()) != null) {
// see if we're inside a #ifndef GL_XXX block and matching a function
- if (activeAssociation != null && (m = funcPattern.matcher(line)).matches())
- {
- // We found a new function associated with the last #ifndef block we
- // were associated with
-
- String funcName = m.group(8);
- HashSet funcsForGroup = (HashSet)groupToFuncHash.get(activeAssociation);
- if (funcsForGroup == null)
- {
- funcsForGroup = new HashSet(8);
- groupToFuncHash.put(activeAssociation, funcsForGroup);
+ if (activeAssociation != null) {
+ String identifier = null;
+ if ((m = funcPattern.matcher(line)).matches()) {
+ identifier = m.group(8);
+ } else if ((m = definePattern.matcher(line)).matches()) {
+ identifier = m.group(1);
+ } else if (line.startsWith("#endif")) {
+ activeAssociation = null;
}
- funcsForGroup.add(funcName);
-
- //System.err.println("FOUND ASSOCIATION FOR " + activeAssociation + ": " + funcName);
- }
- else if ((m = associationPattern.matcher(line)).matches())
- {
+ if ((identifier != null) &&
+ (activeAssociation != null) &&
+ // Handles #ifndef GL_... #define GL_...
+ !identifier.equals(activeAssociation)) {
+ addAssociation(identifier, activeAssociation);
+ }
+ } else if ((m = associationPattern.matcher(line)).matches()) {
// found a new #ifndef GL_XXX block
activeAssociation = m.group(1);
-
+
//System.err.println("FOUND NEW ASSOCIATION BLOCK: " + activeAssociation);
}
}
+ reader.close();
+ }
+
+ public void dump() {
+ for (Iterator i1 = extensionToDeclarationMap.keySet().iterator(); i1.hasNext(); ) {
+ String name = (String) i1.next();
+ Set decls = (Set) extensionToDeclarationMap.get(name);
+ System.out.println(name + ":");
+ List l = new ArrayList();
+ l.addAll(decls);
+ Collections.sort(l);
+ for (Iterator i2 = l.iterator(); i2.hasNext(); ) {
+ System.out.println(" " + (String) i2.next());
+ }
+ }
+ }
+
+ public String getExtension(String identifier) {
+ return (String) declarationToExtensionMap.get(identifier);
}
- protected void emitJavaCode(PrintWriter output, String packageName, HashMap groupToFuncHash)
- {
+ public Set getDeclarations(String extension) {
+ return (Set) extensionToDeclarationMap.get(extension);
+ }
+
+ public void emitJavaCode(PrintWriter output, String packageName) {
output.println("package " + packageName + ";");
output.println();
output.println("import java.util.*;");
@@ -227,31 +262,59 @@ public class BuildStaticGLInfo
output.println(" static");
output.println(" {");
- output.println(" funcToAssocMap = new HashMap(1536); // approximate max capacity");
+
+ // Compute max capacity
+ int maxCapacity = 0;
+ for (Iterator iter = declarationToExtensionMap.keySet().iterator(); iter.hasNext(); ) {
+ String name = (String) iter.next();
+ if (!name.startsWith("GL")) {
+ ++maxCapacity;
+ }
+ }
+
+ output.println(" funcToAssocMap = new HashMap(" + maxCapacity + "); // approximate max capacity");
output.println(" String group;");
- ArrayList sets = new ArrayList(groupToFuncHash.keySet());
+ ArrayList sets = new ArrayList(extensionToDeclarationMap.keySet());
Collections.sort(sets);
- for (int i = 0; i < sets.size(); ++i)
- {
- String groupName = (String) sets.get(i);
- //System.err.println(groupName); // debug
- output.println();
- output.println(" //----------------------------------------------------------------");
- output.println(" // " + groupName);
- output.println(" //----------------------------------------------------------------");
- output.println(" group = \"" + groupName + "\";");
- HashSet funcs = (HashSet)groupToFuncHash.get(groupName);
- Iterator funcIter = funcs.iterator();
- while (funcIter.hasNext())
- {
+ for (Iterator iter = sets.iterator(); iter.hasNext(); ) {
+ String groupName = (String) iter.next();
+ Set funcs = (Set) extensionToDeclarationMap.get(groupName);
+ List l = new ArrayList();
+ l.addAll(funcs);
+ Collections.sort(l);
+ Iterator funcIter = l.iterator();
+ boolean printedHeader = false;
+ while (funcIter.hasNext()) {
String funcName = (String)funcIter.next();
- //System.err.println(" " + funcName); // debug
- output.println(" funcToAssocMap.put(\"" + funcName + "\", group);");
+ if (!funcName.startsWith("GL")) {
+ if (!printedHeader) {
+ output.println();
+ output.println(" //----------------------------------------------------------------");
+ output.println(" // " + groupName);
+ output.println(" //----------------------------------------------------------------");
+ output.println(" group = \"" + groupName + "\";");
+ printedHeader = true;
+ }
+
+ output.println(" funcToAssocMap.put(\"" + funcName + "\", group);");
+ }
}
}
output.println(" }");
-
output.println("} // end class StaticGLInfo");
}
+ //----------------------------------------------------------------------
+ // Internals only below this point
+ //
+
+ protected void addAssociation(String identifier, String association) {
+ declarationToExtensionMap.put(identifier, association);
+ Set/*<String>*/ identifiers = (Set) extensionToDeclarationMap.get(association);
+ if (identifiers == null) {
+ identifiers = new HashSet/*<String>*/();
+ extensionToDeclarationMap.put(association, identifiers);
+ }
+ identifiers.add(identifier);
+ }
}
diff --git a/src/net/java/games/gluegen/opengl/ConvertFromGL4Java.java b/src/classes/com/sun/gluegen/opengl/ConvertFromGL4Java.java
index 428aba110..2f051a78b 100644
--- a/src/net/java/games/gluegen/opengl/ConvertFromGL4Java.java
+++ b/src/classes/com/sun/gluegen/opengl/ConvertFromGL4Java.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.opengl;
+package com.sun.gluegen.opengl;
import java.io.*;
@@ -62,7 +62,7 @@ public class ConvertFromGL4Java {
String trimmed = line.trim();
boolean isImport = false;
if (trimmed.startsWith("import gl4java")) {
- line = "import net.java.games.jogl.*;";
+ line = "import javax.media.opengl.*;";
isImport = true;
}
if (!isImport ||
diff --git a/src/net/java/games/gluegen/opengl/CGLPAWrapperEmitter.java b/src/classes/com/sun/gluegen/opengl/GLCMethodBindingEmitter.java
index 9ec2a81f9..653a8cd3d 100644..100755
--- a/src/net/java/games/gluegen/opengl/CGLPAWrapperEmitter.java
+++ b/src/classes/com/sun/gluegen/opengl/GLCMethodBindingEmitter.java
@@ -37,37 +37,50 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.opengl;
+package com.sun.gluegen.opengl;
import java.io.*;
import java.util.*;
-import net.java.games.gluegen.*;
-import net.java.games.gluegen.cgram.types.*;
+import com.sun.gluegen.*;
+import com.sun.gluegen.cgram.types.*;
-public class CGLPAWrapperEmitter extends CMethodBindingEmitter
-{
+public class GLCMethodBindingEmitter extends CMethodBindingEmitter {
private static final CommentEmitter defaultCommentEmitter =
new CGLPAWrapperCommentEmitter();
- private CMethodBindingEmitter emitterBeingWrapped;
+ private boolean callThroughProcAddress;
private String glFuncPtrTypedefValue;
private static String procAddressJavaTypeName =
JavaType.createForClass(Long.TYPE).jniTypeName();
- public CGLPAWrapperEmitter(CMethodBindingEmitter methodToWrap)
- {
+ public GLCMethodBindingEmitter(CMethodBindingEmitter methodToWrap,
+ final boolean callThroughProcAddress) {
super(
new MethodBinding(methodToWrap.getBinding()) {
public String getName() {
- return GLEmitter.WRAP_PREFIX + super.getName();
+ if (callThroughProcAddress) {
+ return GLEmitter.WRAP_PREFIX + super.getName();
+ } else {
+ return super.getName();
+ }
+ }
+
+ public String getRenamedMethodName() {
+ if (callThroughProcAddress) {
+ return GLEmitter.WRAP_PREFIX + super.getRenamedMethodName();
+ } else {
+ return super.getRenamedMethodName();
+ }
}
},
- methodToWrap.getIsOverloadedBinding(),
+ methodToWrap.getDefaultOutput(),
methodToWrap.getJavaPackageName(),
methodToWrap.getJavaClassName(),
+ methodToWrap.getIsOverloadedBinding(),
methodToWrap.getIsJavaMethodStatic(),
- methodToWrap.getDefaultOutput()
- );
+ true,
+ methodToWrap.forIndirectBufferAndArrayImplementation()
+ );
if (methodToWrap.getReturnValueCapacityExpression() != null) {
setReturnValueCapacityExpression(methodToWrap.getReturnValueCapacityExpression());
@@ -79,140 +92,105 @@ public class CGLPAWrapperEmitter extends CMethodBindingEmitter
setTemporaryCVariableAssignments (methodToWrap.getTemporaryCVariableAssignments ());
setCommentEmitter(defaultCommentEmitter);
+ this.callThroughProcAddress = callThroughProcAddress;
}
- protected int emitArguments(PrintWriter writer)
- {
+ protected int emitArguments(PrintWriter writer) {
int numEmitted = super.emitArguments(writer);
- if (numEmitted > 0)
- {
- writer.print(", ");
+ if (callThroughProcAddress) {
+ if (numEmitted > 0)
+ {
+ writer.print(", ");
+ }
+ //writer.print("long glProcAddress");
+ writer.print(procAddressJavaTypeName);
+ writer.print(" glProcAddress");
+ ++numEmitted;
}
- //writer.print("long glProcAddress");
- writer.print(procAddressJavaTypeName);
- writer.print(" glProcAddress");
- ++numEmitted;
return numEmitted;
}
- protected void emitBodyVariableDeclarations(PrintWriter writer)
- {
- // create variable for the function pointer with the right type, and set
- // it to the value of the passed-in glProcAddress
- FunctionSymbol cSym = getBinding().getCSymbol();
- String funcPointerTypedefName =
- GLEmitter.getGLFunctionPointerTypedefName(cSym);
+ protected void emitBodyVariableDeclarations(PrintWriter writer) {
+ if (callThroughProcAddress) {
+ // create variable for the function pointer with the right type, and set
+ // it to the value of the passed-in glProcAddress
+ FunctionSymbol cSym = getBinding().getCSymbol();
+ String funcPointerTypedefName =
+ GLEmitter.getGLFunctionPointerTypedefName(cSym);
- writer.print(" ");
- writer.print(funcPointerTypedefName);
- writer.print(" ptr_");
- writer.print(cSym.getName());
- writer.println(";");
+ writer.print(" ");
+ writer.print(funcPointerTypedefName);
+ writer.print(" ptr_");
+ writer.print(cSym.getName());
+ writer.println(";");
+ }
super.emitBodyVariableDeclarations(writer);
}
protected void emitBodyVariablePreCallSetup(PrintWriter writer,
- boolean emittingPrimitiveArrayCritical)
- {
+ boolean emittingPrimitiveArrayCritical) {
super.emitBodyVariablePreCallSetup(writer, emittingPrimitiveArrayCritical);
- if (!emittingPrimitiveArrayCritical) {
- // set the function pointer to the value of the passed-in glProcAddress
- FunctionSymbol cSym = getBinding().getCSymbol();
- String funcPointerTypedefName =
- GLEmitter.getGLFunctionPointerTypedefName(cSym);
+ if (callThroughProcAddress) {
+ if (!emittingPrimitiveArrayCritical) {
+ // set the function pointer to the value of the passed-in glProcAddress
+ FunctionSymbol cSym = getBinding().getCSymbol();
+ String funcPointerTypedefName =
+ GLEmitter.getGLFunctionPointerTypedefName(cSym);
- String ptrVarName = "ptr_" + cSym.getName();
+ String ptrVarName = "ptr_" + cSym.getName();
- writer.print(" ");
- writer.print(ptrVarName);
- writer.print(" = (");
- writer.print(funcPointerTypedefName);
- writer.println(") (intptr_t) glProcAddress;");
+ writer.print(" ");
+ writer.print(ptrVarName);
+ writer.print(" = (");
+ writer.print(funcPointerTypedefName);
+ writer.println(") (intptr_t) glProcAddress;");
- writer.println(" assert(" + ptrVarName + " != NULL);");
+ writer.println(" assert(" + ptrVarName + " != NULL);");
+ }
}
}
- // FIXME: refactor this and the superclass version so we don't have to copy
- // the whole function
- protected void emitBodyCallCFunction(PrintWriter writer)
- {
- // Make the call to the actual C function
- writer.print(" ");
-
- // WARNING: this code assumes that the return type has already been
- // typedef-resolved.
- Type cReturnType = getBinding().getCReturnType();
-
- if (!cReturnType.isVoid()) {
- writer.print("_res = ");
- }
-
- // !!!!!!!!! BEGIN CHANGES FROM SUPERCLASS METHOD
+ protected void emitBodyCallCFunction(PrintWriter writer) {
+ if (!callThroughProcAddress) {
+ super.emitBodyCallCFunction(writer);
+ } else {
+ // Make the call to the actual C function
+ writer.print(" ");
- MethodBinding binding = getBinding();
- if (binding.hasContainingType()) {
- // Cannot call GL func through function pointer
- throw new IllegalStateException(
- "Cannot call GL func through function pointer: " + binding);
- }
+ // WARNING: this code assumes that the return type has already been
+ // typedef-resolved.
+ Type cReturnType = binding.getCReturnType();
- // call throught the run-time function pointer
- writer.print("(* ptr_");
- writer.print(binding.getCSymbol().getName());
- writer.print(") ");
-
- // !!!!!!!!! END CHANGES FROM SUPERCLASS METHOD
-
-
- writer.print("(");
- for (int i = 0; i < binding.getNumArguments(); i++) {
- if (i != 0) {
- writer.print(", ");
+ if (!cReturnType.isVoid()) {
+ writer.print("_res = ");
}
- JavaType javaType = binding.getJavaArgumentType(i);
- // Handle case where only param is void.
- if (javaType.isVoid()) {
- // Make sure this is the only param to the method; if it isn't,
- // there's something wrong with our parsing of the headers.
- assert(binding.getNumArguments() == 1);
- continue;
- }
-
- if (javaType.isJNIEnv()) {
- writer.print("env");
- } else if (binding.isArgumentThisPointer(i)) {
- writer.print(CMethodBindingEmitter.cThisArgumentName());
- } else {
- writer.print("(");
- writer.print(binding.getCSymbol().getArgumentType(i).getName());
- writer.print(") ");
- if (binding.getCArgumentType(i).isPointer() && binding.getJavaArgumentType(i).isPrimitive()) {
- writer.print("(intptr_t) ");
- }
- if (javaType.isArray() || javaType.isNIOBuffer()) {
- writer.print(pointerConversionArgumentName(i));
- if (javaArgTypeNeedsDataCopy(javaType)) {
- writer.print("_copy");
- }
- } else {
- if (javaType.isString()) { writer.print("_UTF8"); }
- writer.print(binding.getArgumentName(i));
- }
+ MethodBinding binding = getBinding();
+ if (binding.hasContainingType()) {
+ // Cannot call GL func through function pointer
+ throw new IllegalStateException(
+ "Cannot call GL func through function pointer: " + binding);
}
+
+ // call throught the run-time function pointer
+ writer.print("(* ptr_");
+ writer.print(binding.getCSymbol().getName());
+ writer.print(") ");
+ writer.print("(");
+ emitBodyPassCArguments(writer);
+ writer.println(");");
}
- writer.println(");");
}
protected String jniMangle(MethodBinding binding) {
- StringBuffer buf = new StringBuffer();
- buf.append(super.jniMangle(binding));
- jniMangle(Long.TYPE, buf);
+ StringBuffer buf = new StringBuffer(super.jniMangle(binding));
+ if (callThroughProcAddress) {
+ jniMangle(Long.TYPE, buf, false); // to account for the additional _addr_ parameter
+ }
return buf.toString();
- }
+ }
/** This class emits the comment for the wrapper method */
private static class CGLPAWrapperCommentEmitter extends CMethodBindingEmitter.DefaultCommentEmitter {
@@ -220,4 +198,4 @@ public class CGLPAWrapperEmitter extends CMethodBindingEmitter
writer.print(" -- FIXME: IMPLEMENT COMMENT FOR CGLPAWrapperCommentEmitter -- ");
}
}
-} // end class CGLPAWrapperEmitter
+} // end class GLCMethodBindingEmitter
diff --git a/src/net/java/games/gluegen/opengl/GLEmitter.java b/src/classes/com/sun/gluegen/opengl/GLEmitter.java
index f36d7b1ac..4ba1df87b 100644
--- a/src/net/java/games/gluegen/opengl/GLEmitter.java
+++ b/src/classes/com/sun/gluegen/opengl/GLEmitter.java
@@ -37,14 +37,14 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.opengl;
+package com.sun.gluegen.opengl;
import java.io.*;
import java.text.MessageFormat;
import java.util.*;
-import net.java.games.gluegen.*;
-import net.java.games.gluegen.cgram.types.*;
-import net.java.games.gluegen.runtime.*;
+import com.sun.gluegen.*;
+import com.sun.gluegen.cgram.types.*;
+import com.sun.gluegen.runtime.*;
/**
* A subclass of JavaEmitter that modifies the normal emission of C and Java
@@ -60,7 +60,25 @@ public class GLEmitter extends JavaEmitter
private String tableClassPackage;
private String tableClassName;
private int numProcAddressEntries;
+ // Keeps track of which MethodBindings were created for handling
+ // Buffer Object variants. Used as a Set rather than a Map.
+ private Map/*<MethodBinding>*/ bufferObjectMethodBindings = new IdentityHashMap();
+
+ static class BufferObjectKind {
+ private BufferObjectKind() {}
+
+ static final BufferObjectKind UNPACK_PIXEL = new BufferObjectKind();
+ static final BufferObjectKind PACK_PIXEL = new BufferObjectKind();
+ static final BufferObjectKind ARRAY = new BufferObjectKind();
+ static final BufferObjectKind ELEMENT = new BufferObjectKind();
+ }
+ public void beginEmission(GlueEmitterControls controls) throws IOException
+ {
+ getGLConfig().parseGLHeaders(controls);
+ super.beginEmission(controls);
+ }
+
public void beginFunctions(TypeDictionary typedefDictionary,
TypeDictionary structDictionary,
Map canonMap) throws Exception
@@ -93,19 +111,66 @@ public class GLEmitter extends JavaEmitter
return new GLConfiguration();
}
+ /** In order to implement Buffer Object variants of certain
+ functions we generate another MethodBinding which maps the void*
+ argument to a Java long. The generation of emitters then takes
+ place as usual. We do however need to keep track of the modified
+ MethodBinding object so that we can also modify the emitters
+ later to inform them that their argument has changed. We might
+ want to push this functionality down into the MethodBinding
+ (i.e., mutators for argument names). We also would need to
+ inform the CMethodBindingEmitter that it is overloaded in this
+ case (though we default to true currently). */
+ protected List/*<MethodBinding>*/ expandMethodBinding(MethodBinding binding) {
+ List/*<MethodBinding>*/ bindings = super.expandMethodBinding(binding);
+
+ if (!getGLConfig().isBufferObjectFunction(binding.getName())) {
+ return bindings;
+ }
+
+ List/*<MethodBinding>*/ newBindings = new ArrayList();
+ newBindings.addAll(bindings);
+
+ // Need to expand each one of the generated bindings to take a
+ // Java long instead of a Buffer for each void* argument
+ for (Iterator iter = bindings.iterator(); iter.hasNext(); ) {
+ MethodBinding cur = (MethodBinding) iter.next();
+
+ // Some of these routines (glBitmap) take strongly-typed
+ // primitive pointers as arguments which are expanded into
+ // non-void* arguments
+ // This test (rather than !signatureUsesNIO) is used to catch
+ // more unexpected situations
+ if (cur.signatureUsesJavaPrimitiveArrays()) {
+ continue;
+ }
+
+ MethodBinding result = cur;
+ for (int i = 0; i < cur.getNumArguments(); i++) {
+ if (cur.getJavaArgumentType(i).isNIOBuffer()) {
+ result = result.replaceJavaArgumentType(i, JavaType.createForClass(Long.TYPE));
+ }
+ }
+
+ if (result == cur) {
+ throw new RuntimeException("Error: didn't find any void* arguments for BufferObject function " +
+ binding.getName());
+ }
+
+ newBindings.add(result);
+ // Now need to flag this MethodBinding so that we generate the
+ // correct flags in the emitters later
+ bufferObjectMethodBindings.put(result, result);
+ }
+
+ return newBindings;
+ }
+
protected List generateMethodBindingEmitters(FunctionSymbol sym) throws Exception
{
return generateMethodBindingEmittersImpl(sym);
}
- protected List generateMethodBindingEmitters(FunctionSymbol sym, boolean skipProcessing) throws Exception {
- if (skipProcessing) {
- return super.generateMethodBindingEmitters(sym);
- } else {
- return generateMethodBindingEmittersImpl(sym);
- }
- }
-
private List generateMethodBindingEmittersImpl(FunctionSymbol sym) throws Exception
{
List defaultEmitters = super.generateMethodBindingEmitters(sym);
@@ -118,20 +183,21 @@ public class GLEmitter extends JavaEmitter
return defaultEmitters;
}
- // Don't do anything special if this symbol doesn't require passing of
- // Opengl procedure addresses in order to function correctly.
- if (!needsProcAddressWrapper(sym) || getConfig().isUnimplemented(sym.getName()))
+ // Don't do anything special if this symbol doesn't require
+ // OpenGL-related modifications
+ if ((!needsProcAddressWrapper(sym) && !needsBufferObjectVariant(sym)) ||
+ getConfig().isUnimplemented(sym.getName()))
{
return defaultEmitters;
}
- // 9 is default # expanded bindings for void*
- ArrayList modifiedEmitters = new ArrayList(9);
+ ArrayList modifiedEmitters = new ArrayList(defaultEmitters.size());
- if (getGLConfig().emitProcAddressTable())
- {
- // emit an entry in the GL proc address table for this method.
- emitGLProcAddressTableEntryForSymbol(sym);
+ if (needsProcAddressWrapper(sym)) {
+ if (getGLConfig().emitProcAddressTable()) {
+ // emit an entry in the GL proc address table for this method.
+ emitGLProcAddressTableEntryForSymbol(sym);
+ }
}
for (Iterator iter = defaultEmitters.iterator(); iter.hasNext(); )
@@ -139,16 +205,11 @@ public class GLEmitter extends JavaEmitter
FunctionEmitter emitter = (FunctionEmitter) iter.next();
if (emitter instanceof JavaMethodBindingEmitter)
{
- JavaMethodBindingEmitter newEmitter =
- generateModifiedEmitter((JavaMethodBindingEmitter)emitter);
- if (newEmitter != null) {
- modifiedEmitters.add(newEmitter);
- }
+ generateModifiedEmitters((JavaMethodBindingEmitter) emitter, modifiedEmitters);
}
else if (emitter instanceof CMethodBindingEmitter)
{
- modifiedEmitters.add(
- generateModifiedEmitter((CMethodBindingEmitter)emitter));
+ generateModifiedEmitters((CMethodBindingEmitter) emitter, modifiedEmitters);
}
else
{
@@ -181,38 +242,64 @@ public class GLEmitter extends JavaEmitter
// Internals only below this point
//
- protected JavaMethodBindingEmitter generateModifiedEmitter(JavaMethodBindingEmitter baseJavaEmitter)
- {
- if (!(baseJavaEmitter instanceof JavaMethodBindingImplEmitter)) {
- // We only want to wrap the native entry point in the implementation
- // class, not the public interface in the interface class.
- //
- // If the superclass has generated a "0" emitter for this routine because
- // it needs argument conversion or similar, filter that out since we will
- // be providing such an emitter ourselves. Otherwise return the emitter
- // unmodified.
- if (baseJavaEmitter.isForImplementingMethodCall())
- return null;
- return baseJavaEmitter;
- }
+ protected void generateModifiedEmitters(JavaMethodBindingEmitter baseJavaEmitter, List emitters) {
if (getGLConfig().manuallyImplement(baseJavaEmitter.getName())) {
- // User will provide Java-side implementation of this routine
- return null;
+ // User will provide Java-side implementation of this routine;
+ // pass through any emitters which will produce signatures for
+ // it unmodified
+ emitters.add(baseJavaEmitter);
+ return;
+ }
+
+ // See whether we need a proc address entry for this one
+ boolean callThroughProcAddress = needsProcAddressWrapper(baseJavaEmitter.getBinding().getCSymbol());
+ // See whether this is one of the Buffer Object variants
+ boolean bufferObjectVariant = bufferObjectMethodBindings.containsKey(baseJavaEmitter.getBinding());
+
+ GLJavaMethodBindingEmitter emitter =
+ new GLJavaMethodBindingEmitter(baseJavaEmitter,
+ callThroughProcAddress,
+ getGLConfig().getProcAddressTableExpr(),
+ baseJavaEmitter.isForImplementingMethodCall(),
+ bufferObjectVariant);
+ emitters.add(emitter);
+
+ // If this emitter doesn't have a body (i.e., is a public native
+ // call), we need to force it to emit a body, and produce another
+ // one to act as the entry point
+ if (baseJavaEmitter.signatureOnly() &&
+ baseJavaEmitter.hasModifier(JavaMethodBindingEmitter.PUBLIC) &&
+ baseJavaEmitter.hasModifier(JavaMethodBindingEmitter.NATIVE) &&
+ callThroughProcAddress) {
+ emitter.setEmitBody(true);
+ emitter.removeModifier(JavaMethodBindingEmitter.NATIVE);
+ emitter = new GLJavaMethodBindingEmitter(baseJavaEmitter,
+ callThroughProcAddress,
+ getGLConfig().getProcAddressTableExpr(),
+ true,
+ bufferObjectVariant);
+ emitter.setForImplementingMethodCall(true);
+ emitters.add(emitter);
}
- return new JavaGLPAWrapperEmitter(baseJavaEmitter, getGLConfig().getProcAddressTableExpr());
}
- protected CMethodBindingEmitter generateModifiedEmitter(CMethodBindingEmitter baseCEmitter)
+ protected void generateModifiedEmitters(CMethodBindingEmitter baseCEmitter, List emitters)
{
+ // See whether we need a proc address entry for this one
+ boolean callThroughProcAddress = needsProcAddressWrapper(baseCEmitter.getBinding().getCSymbol());
+ // Note that we don't care much about the naming of the C argument
+ // variables so to keep things simple we ignore the buffer object
+ // property for the binding
+
// The C-side JNI binding for this particular function will have an
// extra final argument, which is the address (the OpenGL procedure
// address) of the function it needs to call
- CGLPAWrapperEmitter res = new CGLPAWrapperEmitter(baseCEmitter);
+ GLCMethodBindingEmitter res = new GLCMethodBindingEmitter(baseCEmitter, callThroughProcAddress);
MessageFormat exp = baseCEmitter.getReturnValueCapacityExpression();
if (exp != null) {
res.setReturnValueCapacityExpression(exp);
}
- return res;
+ emitters.add(res);
}
protected boolean needsProcAddressWrapper(FunctionSymbol sym)
@@ -250,6 +337,10 @@ public class GLEmitter extends JavaEmitter
return shouldWrap;
}
+
+ protected boolean needsBufferObjectVariant(FunctionSymbol sym) {
+ return getGLConfig().isBufferObjectFunction(sym.getName());
+ }
private void beginGLProcAddressTable() throws Exception
{
@@ -309,7 +400,7 @@ public class GLEmitter extends JavaEmitter
w.println(" * and therefore does not have a valid GL procedure address. ");
w.println(" */");
w.println(" public long getAddressFor(String glFunctionName) {");
- w.println(" String addressFieldName = net.java.games.gluegen.opengl.GLEmitter.PROCADDRESS_VAR_PREFIX + glFunctionName;");
+ w.println(" String addressFieldName = com.sun.gluegen.opengl.GLEmitter.PROCADDRESS_VAR_PREFIX + glFunctionName;");
w.println(" try { ");
w.println(" java.lang.reflect.Field addressField = this.getClass().getField(addressFieldName);");
w.println(" return addressField.getLong(this);");
@@ -351,7 +442,7 @@ public class GLEmitter extends JavaEmitter
return (GLConfiguration) getConfig();
}
- protected static class GLConfiguration extends JavaConfiguration
+ protected class GLConfiguration extends JavaConfiguration
{
private boolean emitProcAddressTable = false;
private String tableClassPackage;
@@ -359,8 +450,13 @@ public class GLEmitter extends JavaEmitter
private Set/*<String>*/ skipProcAddressGen = new HashSet();
private List/*<String>*/ forceProcAddressGen = new ArrayList();
private String contextVariableName = "context";
- private String defaultGetProcAddressTableExpr = ".getGLProcAddressTable()";
private String getProcAddressTableExpr;
+ // The following data members support ignoring an entire extension at a time
+ private List/*<String>*/ glHeaders = new ArrayList();
+ private Set/*<String>*/ ignoredExtensions = new HashSet();
+ private BuildStaticGLInfo glInfo;
+ // Maps function names to the kind of buffer object it deals with
+ private Map/*<String,BufferObjectKind>*/ bufferObjectKinds = new HashMap();
protected void dispatch(String cmd, StringTokenizer tok, File file, String filename, int lineNo) throws IOException {
if (cmd.equalsIgnoreCase("EmitProcAddressTable"))
@@ -394,6 +490,20 @@ public class GLEmitter extends JavaEmitter
{
getProcAddressTableExpr = readGetProcAddressTableExpr(tok, filename, lineNo);
}
+ else if (cmd.equalsIgnoreCase("IgnoreExtension"))
+ {
+ String sym = readString("IgnoreExtension", tok, filename, lineNo);
+ ignoredExtensions.add(sym);
+ }
+ else if (cmd.equalsIgnoreCase("GLHeader"))
+ {
+ String sym = readString("GLHeader", tok, filename, lineNo);
+ glHeaders.add(sym);
+ }
+ else if (cmd.equalsIgnoreCase("BufferObjectKind"))
+ {
+ readBufferObjectKind(tok, filename, lineNo);
+ }
else
{
super.dispatch(cmd,tok,file,filename,lineNo);
@@ -410,6 +520,32 @@ public class GLEmitter extends JavaEmitter
}
}
+ protected void readBufferObjectKind(StringTokenizer tok, String filename, int lineNo) {
+ try {
+ String kindString = tok.nextToken();
+ BufferObjectKind kind = null;
+ String target = tok.nextToken();
+ if (kindString.equalsIgnoreCase("UnpackPixel")) {
+ kind = BufferObjectKind.UNPACK_PIXEL;
+ } else if (kindString.equalsIgnoreCase("PackPixel")) {
+ kind = BufferObjectKind.PACK_PIXEL;
+ } else if (kindString.equalsIgnoreCase("Array")) {
+ kind = BufferObjectKind.ARRAY;
+ } else if (kindString.equalsIgnoreCase("Element")) {
+ kind = BufferObjectKind.ELEMENT;
+ } else {
+ throw new RuntimeException("Error parsing \"BufferObjectKind\" command at line " + lineNo +
+ " in file \"" + filename + "\": illegal BufferObjectKind \"" +
+ kindString + "\", expected one of UnpackPixel, PackPixel, Array, or Element");
+ }
+
+ bufferObjectKinds.put(target, kind);
+ } catch (NoSuchElementException e) {
+ throw new RuntimeException("Error parsing \"BufferObjectKind\" command at line " + lineNo +
+ " in file \"" + filename + "\"", e);
+ }
+ }
+
public boolean emitProcAddressTable() { return emitProcAddressTable; }
public String tableClassPackage() { return tableClassPackage; }
public String tableClassName() { return tableClassName; }
@@ -418,10 +554,94 @@ public class GLEmitter extends JavaEmitter
public String contextVariableName() { return contextVariableName; }
public String getProcAddressTableExpr() {
if (getProcAddressTableExpr == null) {
- getProcAddressTableExpr = contextVariableName + defaultGetProcAddressTableExpr;
+ getProcAddressTableExpr = contextVariableName + ".get" + tableClassName + "()";
}
return getProcAddressTableExpr;
}
+
+ public boolean shouldIgnore(String symbol) {
+ // Check ignored extensions based on our knowledge of the static GL info
+ if (glInfo != null) {
+ String extension = glInfo.getExtension(symbol);
+ if (extension != null &&
+ ignoredExtensions.contains(extension)) {
+ return true;
+ }
+ }
+
+ return super.shouldIgnore(symbol);
+ }
+
+ /** Overrides javaPrologueForMethod in superclass and
+ automatically generates prologue code for functions associated
+ with buffer objects. */
+ public List/*<String>*/ javaPrologueForMethod(MethodBinding binding,
+ boolean forImplementingMethodCall,
+ boolean eraseBufferAndArrayTypes) {
+ List/*<String>*/ res = super.javaPrologueForMethod(binding,
+ forImplementingMethodCall,
+ eraseBufferAndArrayTypes);
+ BufferObjectKind kind = getBufferObjectKind(binding.getName());
+ if (kind != null) {
+ // Need to generate appropriate prologue based on both buffer
+ // object kind and whether this variant of the MethodBinding
+ // is the one accepting a "long" as argument
+ if (res == null) {
+ res = new ArrayList();
+ }
+
+ String prologue = "check";
+
+ if (kind == BufferObjectKind.UNPACK_PIXEL) {
+ prologue = prologue + "UnpackPBO";
+ } else if (kind == BufferObjectKind.PACK_PIXEL) {
+ prologue = prologue + "PackPBO";
+ } else if (kind == BufferObjectKind.ARRAY) {
+ prologue = prologue + "ArrayVBO";
+ } else if (kind == BufferObjectKind.ELEMENT) {
+ prologue = prologue + "ElementVBO";
+ } else {
+ throw new RuntimeException("Unknown BufferObjectKind " + kind);
+ }
+
+ if (bufferObjectMethodBindings.containsKey(binding)) {
+ prologue = prologue + "Enabled";
+ } else {
+ prologue = prologue + "Disabled";
+ }
+
+ prologue = prologue + "();";
+
+ res.add(0, prologue);
+ }
+
+ return res;
+ }
+
+ /** Returns the kind of buffer object this function deals with, or
+ null if none. */
+ public BufferObjectKind getBufferObjectKind(String name) {
+ return (BufferObjectKind) bufferObjectKinds.get(name);
+ }
+
+ public boolean isBufferObjectFunction(String name) {
+ return (getBufferObjectKind(name) != null);
+ }
+
+ /** Parses any GL headers specified in the configuration file for
+ the purpose of being able to ignore an extension at a time. */
+ public void parseGLHeaders(GlueEmitterControls controls) throws IOException {
+ if (!glHeaders.isEmpty()) {
+ glInfo = new BuildStaticGLInfo();
+ for (Iterator iter = glHeaders.iterator(); iter.hasNext(); ) {
+ String file = (String) iter.next();
+ String fullPath = controls.findHeaderFile(file);
+ if (fullPath == null) {
+ throw new IOException("Unable to locate header file \"" + file + "\"");
+ }
+ glInfo.parse(fullPath);
+ }
+ }
+ }
} // end class GLConfiguration
}
-
diff --git a/src/classes/com/sun/gluegen/opengl/GLJavaMethodBindingEmitter.java b/src/classes/com/sun/gluegen/opengl/GLJavaMethodBindingEmitter.java
new file mode 100755
index 000000000..1e72cd633
--- /dev/null
+++ b/src/classes/com/sun/gluegen/opengl/GLJavaMethodBindingEmitter.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.gluegen.opengl;
+
+import java.io.*;
+import java.util.*;
+import com.sun.gluegen.*;
+import com.sun.gluegen.cgram.types.*;
+
+public class GLJavaMethodBindingEmitter extends JavaMethodBindingEmitter {
+ private final CommentEmitter commentEmitterForWrappedMethod =
+ new WrappedMethodCommentEmitter();
+
+ private boolean callThroughProcAddress;
+ private boolean changeNameAndArguments;
+ private String getProcAddressTableExpr;
+ private boolean bufferObjectVariant;
+
+ public GLJavaMethodBindingEmitter(JavaMethodBindingEmitter methodToWrap,
+ boolean callThroughProcAddress,
+ String getProcAddressTableExpr,
+ boolean changeNameAndArguments,
+ boolean bufferObjectVariant) {
+ super(methodToWrap);
+ this.callThroughProcAddress = callThroughProcAddress;
+ this.getProcAddressTableExpr = getProcAddressTableExpr;
+ this.changeNameAndArguments = changeNameAndArguments;
+ this.bufferObjectVariant = bufferObjectVariant;
+ if (callThroughProcAddress) {
+ setCommentEmitter(new WrappedMethodCommentEmitter());
+ }
+
+ if (methodToWrap.getBinding().hasContainingType())
+ {
+ throw new IllegalArgumentException(
+ "Cannot create OpenGL proc. address wrapper; method has containing type: \"" +
+ methodToWrap.getBinding() + "\"");
+ }
+ }
+
+ public String getName() {
+ String res = super.getName();
+ if (changeNameAndArguments) {
+ return GLEmitter.WRAP_PREFIX + res;
+ }
+ return res;
+ }
+
+ protected String getArgumentName(int i) {
+ String name = super.getArgumentName(i);
+
+ if (!bufferObjectVariant) {
+ return name;
+ }
+
+ // Emitters for VBO/PBO-related routines change the outgoing
+ // argument name for the buffer
+ if (binding.getJavaArgumentType(i).isLong()) {
+ Type cType = binding.getCArgumentType(i);
+ if (cType.isPointer() &&
+ (cType.asPointer().getTargetType().isVoid() ||
+ cType.asPointer().getTargetType().isPrimitive())) {
+ return name + "_buffer_offset";
+ }
+ }
+
+ return name;
+ }
+
+ protected int emitArguments(PrintWriter writer) {
+ int numEmitted = super.emitArguments(writer);
+ if (callThroughProcAddress) {
+ if (changeNameAndArguments) {
+ if (numEmitted > 0) {
+ writer.print(", ");
+ }
+
+ writer.print("long glProcAddress");
+ ++numEmitted;
+ }
+ }
+
+ return numEmitted;
+ }
+
+ protected String getImplMethodName(boolean direct) {
+ String name = super.getImplMethodName(direct);
+ if (callThroughProcAddress) {
+ return GLEmitter.WRAP_PREFIX + name;
+ }
+ return name;
+ }
+
+ protected void emitPreCallSetup(MethodBinding binding, PrintWriter writer) {
+ super.emitPreCallSetup(binding, writer);
+
+ if (callThroughProcAddress) {
+ String procAddressVariable =
+ GLEmitter.PROCADDRESS_VAR_PREFIX + binding.getName();
+ writer.println(" final long __addr_ = " + getProcAddressTableExpr + "." + procAddressVariable + ";");
+ writer.println(" if (__addr_ == 0) {");
+ writer.println(" throw new GLException(\"Method \\\"" + binding.getName() + "\\\" not available\");");
+ writer.println(" }");
+ }
+ }
+
+ protected int emitCallArguments(MethodBinding binding, PrintWriter writer, boolean indirect) {
+ int numEmitted = super.emitCallArguments(binding, writer, indirect);
+ if (callThroughProcAddress) {
+ if (numEmitted > 0) {
+ writer.print(", ");
+ }
+ writer.print("__addr_");
+ ++numEmitted;
+ }
+
+ return numEmitted;
+ }
+
+ /** This class emits the comment for the wrapper method */
+ private class WrappedMethodCommentEmitter extends JavaMethodBindingEmitter.DefaultCommentEmitter {
+ protected void emitBeginning(FunctionEmitter methodEmitter, PrintWriter writer) {
+ writer.print("Encapsulates function pointer for OpenGL function <br>: ");
+ }
+ }
+} // end class GLJavaMethodBindingEmitter
diff --git a/src/net/java/games/gluegen/pcpp/PCPP.java b/src/classes/com/sun/gluegen/pcpp/PCPP.java
index 0990bb155..a2d3ab09b 100644
--- a/src/net/java/games/gluegen/pcpp/PCPP.java
+++ b/src/classes/com/sun/gluegen/pcpp/PCPP.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.pcpp;
+package com.sun.gluegen.pcpp;
import java.io.*;
import java.util.*;
@@ -125,6 +125,19 @@ public class PCPP {
}
}
+ public String findFile(String filename) {
+ String sep = File.separator;
+ for (Iterator iter = includePaths.iterator(); iter.hasNext(); ) {
+ String inclPath = (String) iter.next();
+ String fullPath = inclPath + sep + filename;
+ File file = new File(fullPath);
+ if (file.exists()) {
+ return fullPath;
+ }
+ }
+ return null;
+ }
+
//----------------------------------------------------------------------
// Internals only below this point
//
@@ -748,19 +761,6 @@ public class PCPP {
}
}
- private String findFile(String filename) {
- String sep = System.getProperty("file.separator");
- for (Iterator iter = includePaths.iterator(); iter.hasNext(); ) {
- String inclPath = (String) iter.next();
- String fullPath = inclPath + sep + filename;
- File file = new File(fullPath);
- if (file.exists()) {
- return fullPath;
- }
- }
- return null;
- }
-
////////////
// Output //
////////////
diff --git a/src/classes/com/sun/gluegen/runtime/BufferFactory.java b/src/classes/com/sun/gluegen/runtime/BufferFactory.java
new file mode 100644
index 000000000..ca66e6915
--- /dev/null
+++ b/src/classes/com/sun/gluegen/runtime/BufferFactory.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.gluegen.runtime;
+
+import java.nio.*;
+import com.sun.opengl.utils.BufferUtils;
+
+public class BufferFactory {
+
+ public static int SIZEOF_FLOAT = BufferUtils.SIZEOF_FLOAT;
+ public static int SIZEOF_DOUBLE = BufferUtils.SIZEOF_DOUBLE;
+ public static int SIZEOF_INT = BufferUtils.SIZEOF_INT;
+ public static int SIZEOF_SHORT = BufferUtils.SIZEOF_SHORT;
+ public static int SIZEOF_LONG = BufferUtils.SIZEOF_LONG;
+
+ public static ByteBuffer newDirectByteBuffer(int size) {
+ ByteBuffer buf = ByteBuffer.allocateDirect(size);
+ buf.order(ByteOrder.nativeOrder());
+ return buf;
+ }
+
+ /** Helper routine to tell whether a buffer is direct or not. Null
+ pointers are considered direct. isDirect() should really be
+ public in Buffer and not replicated in all subclasses. */
+ public static boolean isDirect(Buffer buf) {
+ if (buf == null) {
+ return true;
+ }
+ if (buf instanceof ByteBuffer) {
+ return ((ByteBuffer) buf).isDirect();
+ } else if (buf instanceof FloatBuffer) {
+ return ((FloatBuffer) buf).isDirect();
+ } else if (buf instanceof DoubleBuffer) {
+ return ((DoubleBuffer) buf).isDirect();
+ } else if (buf instanceof CharBuffer) {
+ return ((CharBuffer) buf).isDirect();
+ } else if (buf instanceof ShortBuffer) {
+ return ((ShortBuffer) buf).isDirect();
+ } else if (buf instanceof IntBuffer) {
+ return ((IntBuffer) buf).isDirect();
+ } else if (buf instanceof LongBuffer) {
+ return ((LongBuffer) buf).isDirect();
+ }
+ throw new RuntimeException("Unknown buffer type " + buf.getClass().getName());
+ }
+
+
+ /** Helper routine to get the Buffer byte offset by taking into
+ account the Buffer position and the underlying type. This is
+ the total offset for Direct Buffers. */
+
+ public static int getDirectBufferByteOffset(Buffer buf) {
+ if(buf == null) {
+ return 0;
+ }
+ if(buf instanceof ByteBuffer) {
+ return (buf.position());
+ } else if (buf instanceof FloatBuffer) {
+ return (buf.position() * BufferUtils.SIZEOF_FLOAT);
+ } else if (buf instanceof IntBuffer) {
+ return (buf.position() * BufferUtils.SIZEOF_INT);
+ } else if (buf instanceof ShortBuffer) {
+ return (buf.position() * BufferUtils.SIZEOF_SHORT);
+ } else if (buf instanceof DoubleBuffer) {
+ return (buf.position() * BufferUtils.SIZEOF_DOUBLE);
+ } else if (buf instanceof LongBuffer) {
+ return (buf.position() * BufferUtils.SIZEOF_LONG);
+ }
+
+ throw new RuntimeException("Disallowed array backing store type in buffer "
+ + buf.getClass().getName());
+ }
+
+
+ /** Helper routine to return the array backing store reference from
+ a Buffer object. */
+
+ public static Object getArray(Buffer buf) {
+ if (buf == null) {
+ return null;
+ }
+ if(buf instanceof ByteBuffer) {
+ return ((ByteBuffer) buf).array();
+ } else if (buf instanceof FloatBuffer) {
+ return ((FloatBuffer) buf).array();
+ } else if (buf instanceof IntBuffer) {
+ return ((IntBuffer) buf).array();
+ } else if (buf instanceof ShortBuffer) {
+ return ((ShortBuffer) buf).array();
+ } else if (buf instanceof DoubleBuffer) {
+ return ((DoubleBuffer) buf).array();
+ } else if (buf instanceof LongBuffer) {
+ return ((LongBuffer) buf).array();
+ }
+
+ throw new RuntimeException("Disallowed array backing store type in buffer "
+ + buf.getClass().getName());
+ }
+
+
+ /** Helper routine to get the full byte offset from the beginning of
+ the array that is the storage for the indirect Buffer
+ object. The array offset also includes the position offset
+ within the buffer, in addition to any array offset. */
+
+ public static int getIndirectBufferByteOffset(Buffer buf) {
+ if(buf == null) {
+ return 0;
+ }
+ int pos = buf.position();
+ if(buf instanceof ByteBuffer) {
+ return (((ByteBuffer)buf).arrayOffset() + pos);
+ } else if(buf instanceof FloatBuffer) {
+ return (BufferUtils.SIZEOF_FLOAT*(((FloatBuffer)buf).arrayOffset() + pos));
+ } else if(buf instanceof IntBuffer) {
+ return (BufferUtils.SIZEOF_INT*(((IntBuffer)buf).arrayOffset() + pos));
+ } else if(buf instanceof ShortBuffer) {
+ return (BufferUtils.SIZEOF_SHORT*(((ShortBuffer)buf).arrayOffset() + pos));
+ } else if(buf instanceof DoubleBuffer) {
+ return (BufferUtils.SIZEOF_DOUBLE*(((DoubleBuffer)buf).arrayOffset() + pos));
+ } else if(buf instanceof LongBuffer) {
+ return (BufferUtils.SIZEOF_LONG*(((LongBuffer)buf).arrayOffset() + pos));
+ }
+
+ throw new RuntimeException("Unknown buffer type " + buf.getClass().getName());
+ }
+}
diff --git a/src/net/java/games/gluegen/runtime/ProcAddressHelper.java b/src/classes/com/sun/gluegen/runtime/ProcAddressHelper.java
index f98ae0c2b..4d40fd487 100644
--- a/src/net/java/games/gluegen/runtime/ProcAddressHelper.java
+++ b/src/classes/com/sun/gluegen/runtime/ProcAddressHelper.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.runtime;
+package com.sun.gluegen.runtime;
/** Contains constants used in glue code generation. */
diff --git a/src/net/java/games/gluegen/runtime/StructAccessor.java b/src/classes/com/sun/gluegen/runtime/StructAccessor.java
index 581eb7202..5a0fa5d25 100644
--- a/src/net/java/games/gluegen/runtime/StructAccessor.java
+++ b/src/classes/com/sun/gluegen/runtime/StructAccessor.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.runtime;
+package com.sun.gluegen.runtime;
import java.nio.*;
diff --git a/src/net/java/games/cg/CgException.java b/src/classes/com/sun/opengl/cg/CgException.java
index 341ba3dbf..3380bb540 100644
--- a/src/net/java/games/cg/CgException.java
+++ b/src/classes/com/sun/opengl/cg/CgException.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.cg;
+package com.sun.opengl.cg;
/**
* A generic exception for errors that occur throughout the NVidia Cg
diff --git a/src/net/java/games/jogl/impl/Debug.java b/src/classes/com/sun/opengl/impl/Debug.java
index 164c5afbd..8d25db304 100755..100644
--- a/src/net/java/games/jogl/impl/Debug.java
+++ b/src/classes/com/sun/opengl/impl/Debug.java
@@ -37,10 +37,10 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl;
+package com.sun.opengl.impl;
import java.security.*;
-import net.java.games.jogl.Version;
+import com.sun.opengl.utils.Version;
/** Helper routines for logging and debugging. */
diff --git a/src/net/java/games/jogl/impl/FunctionAvailabilityCache.java b/src/classes/com/sun/opengl/impl/FunctionAvailabilityCache.java
index be5e26067..754e1d918 100644
--- a/src/net/java/games/jogl/impl/FunctionAvailabilityCache.java
+++ b/src/classes/com/sun/opengl/impl/FunctionAvailabilityCache.java
@@ -37,9 +37,9 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl;
+package com.sun.opengl.impl;
-import net.java.games.jogl.*;
+import javax.media.opengl.*;
import java.util.*;
import java.awt.Canvas;
import java.awt.Graphics;
@@ -54,7 +54,7 @@ import java.lang.reflect.*;
public final class FunctionAvailabilityCache {
private static final boolean DEBUG = Debug.debug("FunctionAvailabilityCache");
- FunctionAvailabilityCache(GLContext context)
+ FunctionAvailabilityCache(GLContextImpl context)
{
this.context = context;
}
@@ -128,6 +128,28 @@ public final class FunctionAvailabilityCache {
}
}
+ // Put GL version strings in the table as well
+ Version version = new Version(gl.glGetString(GL.GL_VERSION));
+ int major = version.getMajor();
+ int minor = version.getMinor();
+ // FIXME: this needs to be adjusted when the major and minor
+ // revs change beyond the known ones
+ switch (major) {
+ default:
+ if (major < 2)
+ break;
+ case 2: availableExtensionCache.add("GL_VERSION_2_0"); minor = 5;
+ case 1:
+ switch (minor) {
+ case 5: availableExtensionCache.add("GL_VERSION_1_5");
+ case 4: availableExtensionCache.add("GL_VERSION_1_4");
+ case 3: availableExtensionCache.add("GL_VERSION_1_3");
+ case 2: availableExtensionCache.add("GL_VERSION_1_2");
+ case 1: availableExtensionCache.add("GL_VERSION_1_1");
+ case 0: availableExtensionCache.add("GL_VERSION_1_0");
+ }
+ }
+
// put a dummy var in here so that the cache is no longer empty even if
// no extensions are in the GL_EXTENSIONS string
availableExtensionCache.add("<INTERNAL_DUMMY_PLACEHOLDER>");
@@ -243,7 +265,7 @@ public final class FunctionAvailabilityCache {
private HashMap availabilityCache = new HashMap(50);
private HashSet availableExtensionCache = new HashSet(50);
- private GLContext context;
+ private GLContextImpl context;
/**
* A class for storing and comparing revision version numbers.
@@ -309,6 +331,14 @@ public final class FunctionAvailabilityCache {
return 0; // they are equal
}
+
+ public int getMajor() {
+ return major;
+ }
+
+ public int getMinor() {
+ return minor;
+ }
} // end class Version
}
diff --git a/src/classes/com/sun/opengl/impl/GLContextImpl.java b/src/classes/com/sun/opengl/impl/GLContextImpl.java
new file mode 100644
index 000000000..f2dfa216b
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/GLContextImpl.java
@@ -0,0 +1,270 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl;
+
+import java.awt.Component;
+import java.nio.*;
+
+import javax.media.opengl.*;
+import com.sun.gluegen.runtime.*;
+
+public abstract class GLContextImpl extends GLContext {
+ protected GLContextLock lock = new GLContextLock();
+ protected static final boolean DEBUG = Debug.debug("GLContextImpl");
+ protected static final boolean VERBOSE = Debug.verbose();
+ protected static final boolean NO_FREE = Debug.isPropertyDefined("jogl.GLContext.nofree");
+
+ // Cache of the functions that are available to be called at the current
+ // moment in time
+ protected FunctionAvailabilityCache functionAvailability;
+ // Table that holds the addresses of the native C-language entry points for
+ // OpenGL functions.
+ private GLProcAddressTable glProcAddressTable;
+
+ protected GL gl;
+ public GLContextImpl(GLContext shareWith) {
+ setGL(createGL());
+ functionAvailability = new FunctionAvailabilityCache(this);
+ if (shareWith != null) {
+ GLContextShareSet.registerSharing(this, shareWith);
+ }
+ }
+
+ public int makeCurrent() throws GLException {
+ lock.lock();
+ int res = 0;
+ try {
+ res = makeCurrentImpl();
+ } catch (GLException e) {
+ lock.unlock();
+ throw(e);
+ }
+ if (res == CONTEXT_NOT_CURRENT) {
+ lock.unlock();
+ } else {
+ setCurrent(this);
+ }
+ return res;
+ }
+
+ protected abstract int makeCurrentImpl() throws GLException;
+
+ public void release() throws GLException {
+ if (!lock.isHeld()) {
+ throw new GLException("Context not current on current thread");
+ }
+ setCurrent(null);
+ try {
+ releaseImpl();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ protected abstract void releaseImpl() throws GLException;
+
+ public void destroy() {
+ if (lock.isHeld()) {
+ throw new GLException("Can not destroy context while it is current");
+ }
+ // Should we check the lock state? It should not be current on any
+ // thread.
+ destroyImpl();
+ }
+
+ protected abstract void destroyImpl() throws GLException;
+
+ public boolean isSynchronized() {
+ return !lock.getFailFastMode();
+ }
+
+ public void setSynchronized(boolean isSynchronized) {
+ lock.setFailFastMode(!isSynchronized);
+ }
+
+ public GL getGL() {
+ return gl;
+ }
+
+ public void setGL(GL gl) {
+ this.gl = gl;
+ }
+
+ public abstract Object getPlatformGLExtensions();
+
+ //----------------------------------------------------------------------
+ // Helpers for various context implementations
+ //
+
+ /** Create the GL for this context. */
+ protected GL createGL() {
+ return new GLImpl(this);
+ }
+
+ public GLProcAddressTable getGLProcAddressTable() {
+ if (glProcAddressTable == null) {
+ // FIXME: cache ProcAddressTables by capability bits so we can
+ // share them among contexts with the same capabilities
+ glProcAddressTable = new GLProcAddressTable();
+ }
+ return glProcAddressTable;
+ }
+
+ /**
+ * Pbuffer support; given that this is a GLContext associated with a
+ * pbuffer, binds this pbuffer to its texture target.
+ */
+ public abstract void bindPbufferToTexture();
+
+ /**
+ * Pbuffer support; given that this is a GLContext associated with a
+ * pbuffer, releases this pbuffer from its texture target.
+ */
+ public abstract void releasePbufferFromTexture();
+
+ public abstract ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3);
+
+ /*
+ * Sets the swap interval for onscreen OpenGL contexts. Has no
+ * effect for offscreen contexts.
+ */
+ public void setSwapInterval(final int interval) {
+ }
+
+ /** Maps the given "platform-independent" function name to a real function
+ name. Currently this is only used to map "glAllocateMemoryNV" and
+ associated routines to wglAllocateMemoryNV / glXAllocateMemoryNV. */
+ protected abstract String mapToRealGLFunctionName(String glFunctionName);
+
+ /** Maps the given "platform-independent" extension name to a real
+ function name. Currently this is only used to map
+ "GL_ARB_pbuffer" and "GL_ARB_pixel_format" to "WGL_ARB_pbuffer"
+ and "WGL_ARB_pixel_format" (not yet mapped to X11). */
+ protected abstract String mapToRealGLExtensionName(String glExtensionName);
+
+ /** Returns a non-null (but possibly empty) string containing the
+ space-separated list of available platform-dependent (e.g., WGL,
+ GLX) extensions. Can only be called while this context is
+ current. */
+ public abstract String getPlatformExtensionsString();
+
+ /** Helper routine which resets a ProcAddressTable generated by the
+ GLEmitter by looking up anew all of its function pointers. */
+ protected void resetProcAddressTable(Object table) {
+ GLDrawableFactoryImpl.getFactoryImpl().resetProcAddressTable(table);
+ }
+
+ /** Indicates whether the underlying OpenGL context has been
+ created. This is used to manage sharing of display lists and
+ textures between contexts. */
+ public abstract boolean isCreated();
+
+ /**
+ * Resets the cache of which GL functions are available for calling through this
+ * context. See {@link #isFunctionAvailable(String)} for more information on
+ * the definition of "available".
+ */
+ protected void resetGLFunctionAvailability() {
+ // In order to be able to allow the user to uniformly install the
+ // debug and trace pipelines in their GLEventListener.init()
+ // method (for both GLCanvas and GLJPanel), we need to reset the
+ // actual GL object in the GLDrawable as well
+ setGL(createGL());
+
+ functionAvailability.flush();
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": !!! Initializing OpenGL extension address table for " + this);
+ }
+ resetProcAddressTable(getGLProcAddressTable());
+ }
+
+ /**
+ * Returns true if the specified OpenGL core- or extension-function can be
+ * successfully called using this GL context given the current host (OpenGL
+ * <i>client</i>) and display (OpenGL <i>server</i>) configuration.
+ *
+ * See {@link GL#isFunctionAvailable(String)} for more details.
+ *
+ * @param glFunctionName the name of the OpenGL function (e.g., use
+ * "glPolygonOffsetEXT" to check if the {@link
+ * javax.media.opengl.GL#glPolygonOffsetEXT(float,float)} is available).
+ */
+ protected boolean isFunctionAvailable(String glFunctionName) {
+ return functionAvailability.isFunctionAvailable(mapToRealGLFunctionName(glFunctionName));
+ }
+
+ /**
+ * Returns true if the specified OpenGL extension can be
+ * successfully called using this GL context given the current host (OpenGL
+ * <i>client</i>) and display (OpenGL <i>server</i>) configuration.
+ *
+ * See {@link GL#isExtensionAvailable(String)} for more details.
+ *
+ * @param glExtensionName the name of the OpenGL extension (e.g.,
+ * "GL_VERTEX_PROGRAM_ARB").
+ */
+ public boolean isExtensionAvailable(String glExtensionName) {
+ return functionAvailability.isExtensionAvailable(mapToRealGLExtensionName(glExtensionName));
+ }
+
+ /** Indicates which floating-point pbuffer implementation is in
+ use. Returns one of GLPbuffer.APPLE_FLOAT, GLPbuffer.ATI_FLOAT,
+ or GLPbuffer.NV_FLOAT. */
+ public int getFloatingPointMode() throws GLException {
+ throw new GLException("Not supported on non-pbuffer contexts");
+ }
+
+ /** On some platforms the mismatch between OpenGL's coordinate
+ system (origin at bottom left) and the window system's
+ coordinate system (origin at top left) necessitates a vertical
+ flip of pixels read from offscreen contexts. */
+ public abstract boolean offscreenImageNeedsVerticalFlip();
+
+ /** Only called for offscreen contexts; needed by glReadPixels */
+ public abstract int getOffscreenContextPixelDataType();
+
+ protected static String getThreadName() {
+ return Thread.currentThread().getName();
+ }
+
+ public static String toHexString(long hex) {
+ return "0x" + Long.toHexString(hex);
+ }
+}
diff --git a/src/classes/com/sun/opengl/impl/GLContextLock.java b/src/classes/com/sun/opengl/impl/GLContextLock.java
new file mode 100644
index 000000000..7668678b7
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/GLContextLock.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl;
+
+import javax.media.opengl.*;
+
+/** Implements the makeCurrent / release locking behavior of the
+ GLContext class. When "fail fast mode" is enabled, attempts to
+ lock the same GLContextLock on more than one thread cause
+ GLException to be raised. This lock is not recursive. Attempts to
+ lock it more than once on a given thread will cause GLException to
+ be raised. */
+
+public class GLContextLock {
+ private Object lock = new Object();
+ private Thread owner;
+ private boolean failFastMode = true;
+
+ /** Locks this GLContextLock on the current thread. If fail fast
+ mode is enabled and the GLContextLock is already owned by
+ another thread, throws GLException. */
+ public void lock() throws GLException {
+ synchronized(lock) {
+ Thread current = Thread.currentThread();
+ if (owner == null) {
+ owner = current;
+ } else if (owner != current) {
+ while (owner != null) {
+ if (failFastMode) {
+ throw new GLException("Attempt to make context current on thread " + current +
+ " which is already current on thread " + owner);
+ } else {
+ try {
+ lock.wait();
+ } catch (InterruptedException e) {
+ throw new GLException(e);
+ }
+ }
+ }
+ owner = current;
+ } else {
+ throw new GLException("Attempt to make the same context current twice on thread " + current);
+ }
+ }
+ }
+
+ /** Unlocks this GLContextLock. */
+ public void unlock() throws GLException {
+ synchronized (lock) {
+ Thread current = Thread.currentThread();
+ if (owner == current) {
+ owner = null;
+ lock.notifyAll();
+ } else {
+ if (owner != null) {
+ throw new GLException("Attempt by thread " + current +
+ " to release context owned by thread " + owner);
+ } else {
+ throw new GLException("Attempt by thread " + current +
+ " to release unowned context");
+ }
+ }
+ }
+ }
+
+ /** Indicates whether this lock is held by the current thread. */
+ public boolean isHeld() {
+ synchronized(lock) {
+ Thread current = Thread.currentThread();
+ return (owner == current);
+ }
+ }
+
+ public void setFailFastMode(boolean onOrOff) {
+ failFastMode = onOrOff;
+ }
+
+ public boolean getFailFastMode() {
+ return failFastMode;
+ }
+}
diff --git a/src/net/java/games/jogl/impl/GLContextShareSet.java b/src/classes/com/sun/opengl/impl/GLContextShareSet.java
index 60c6b7d59..a797ae69c 100644
--- a/src/net/java/games/jogl/impl/GLContextShareSet.java
+++ b/src/classes/com/sun/opengl/impl/GLContextShareSet.java
@@ -37,10 +37,11 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl;
+package com.sun.opengl.impl;
import java.lang.ref.*;
import java.util.*;
+import javax.media.opengl.*;
/** Provides a mechanism by which OpenGL contexts can share textures
and display lists in the face of multithreading and asynchronous
@@ -61,7 +62,8 @@ public class GLContextShareSet {
public void add(GLContext ctx) {
if (allShares.put(ctx, dummyValue) == null) {
- if (ctx.isCreated()) {
+ // FIXME: downcast to GLContextImpl undesirable
+ if (((GLContextImpl) ctx).isCreated()) {
createdShares.put(ctx, dummyValue);
} else {
destroyedShares.put(ctx, dummyValue);
diff --git a/src/classes/com/sun/opengl/impl/GLDrawableFactoryImpl.java b/src/classes/com/sun/opengl/impl/GLDrawableFactoryImpl.java
new file mode 100644
index 000000000..37dea5c15
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/GLDrawableFactoryImpl.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl;
+
+import java.awt.Component;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import com.sun.gluegen.runtime.*; // for PROCADDRESS_VAR_PREFIX
+import javax.media.opengl.*;
+
+/** Extends GLDrawableFactory with a few methods for handling
+ typically software-accelerated offscreen rendering (Device
+ Independent Bitmaps on Windows, pixmaps on X11). Direct access to
+ these GLDrawables is not supplied directly to end users, though
+ they may be instantiated by the GLJPanel implementation. */
+public abstract class GLDrawableFactoryImpl extends GLDrawableFactory {
+ /** Creates a (typically software-accelerated) offscreen GLDrawable
+ used to implement the fallback rendering path of the
+ GLJPanel. */
+ public abstract GLDrawableImpl createOffscreenDrawable(GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser);
+
+ /** Helper routine which resets a ProcAddressTable generated by the
+ GLEmitter by looking up anew all of its function pointers. */
+ public void resetProcAddressTable(Object table) {
+ Class tableClass = table.getClass();
+ java.lang.reflect.Field[] fields = tableClass.getDeclaredFields();
+
+ for (int i = 0; i < fields.length; ++i) {
+ String addressFieldName = fields[i].getName();
+ if (!addressFieldName.startsWith(ProcAddressHelper.PROCADDRESS_VAR_PREFIX)) {
+ // not a proc address variable
+ continue;
+ }
+ int startOfMethodName = ProcAddressHelper.PROCADDRESS_VAR_PREFIX.length();
+ String glFuncName = addressFieldName.substring(startOfMethodName);
+ try {
+ java.lang.reflect.Field addressField = tableClass.getDeclaredField(addressFieldName);
+ assert(addressField.getType() == Long.TYPE);
+ long newProcAddress = dynamicLookupFunction(glFuncName);
+ // set the current value of the proc address variable in the table object
+ addressField.setLong(table, newProcAddress);
+ } catch (Exception e) {
+ throw new GLException("Cannot get GL proc address for method \"" +
+ glFuncName + "\": Couldn't set value of field \"" + addressFieldName +
+ "\" in class " + tableClass.getName(), e);
+ }
+ }
+ }
+
+ /** Dynamically looks up the given function. */
+ public abstract long dynamicLookupFunction(String glFuncName);
+
+ /** Locks the AWT for the purposes of Java2D/JOGL integration. This
+ * is not necessary on some platforms.
+ */
+ public abstract void lockAWTForJava2D();
+
+ /** Unlocks the AWT for the purposes of Java2D/JOGL integration.
+ * This is not necessary on some platforms.
+ */
+ public abstract void unlockAWTForJava2D();
+
+ public static GLDrawableFactoryImpl getFactoryImpl() {
+ return (GLDrawableFactoryImpl) getFactory();
+ }
+}
diff --git a/src/classes/com/sun/opengl/impl/GLDrawableHelper.java b/src/classes/com/sun/opengl/impl/GLDrawableHelper.java
new file mode 100644
index 000000000..014e35f7e
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/GLDrawableHelper.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl;
+
+import java.util.*;
+import javax.media.opengl.*;
+
+/** Encapsulates the implementation of most of the GLAutoDrawable's
+ methods to be able to share it between GLCanvas and GLJPanel. */
+
+public class GLDrawableHelper {
+ private volatile List listeners = new ArrayList();
+ private static final boolean DEBUG = Debug.debug("GLDrawableHelper");
+ private static final boolean VERBOSE = Debug.verbose();
+ private boolean autoSwapBufferMode = true;
+
+ public GLDrawableHelper() {
+ }
+
+ public synchronized void addGLEventListener(GLEventListener listener) {
+ List newListeners = (List) ((ArrayList) listeners).clone();
+ newListeners.add(listener);
+ listeners = newListeners;
+ }
+
+ public synchronized void removeGLEventListener(GLEventListener listener) {
+ List newListeners = (List) ((ArrayList) listeners).clone();
+ newListeners.remove(listener);
+ listeners = newListeners;
+ }
+
+ public void init(GLAutoDrawable drawable) {
+ for (Iterator iter = listeners.iterator(); iter.hasNext(); ) {
+ ((GLEventListener) iter.next()).init(drawable);
+ }
+ }
+
+ public void display(GLAutoDrawable drawable) {
+ for (Iterator iter = listeners.iterator(); iter.hasNext(); ) {
+ ((GLEventListener) iter.next()).display(drawable);
+ }
+ }
+
+ public void reshape(GLAutoDrawable drawable,
+ int x, int y, int width, int height) {
+ for (Iterator iter = listeners.iterator(); iter.hasNext(); ) {
+ ((GLEventListener) iter.next()).reshape(drawable, x, y, width, height);
+ }
+ }
+
+ public void setAutoSwapBufferMode(boolean onOrOff) {
+ autoSwapBufferMode = onOrOff;
+ }
+
+ public boolean getAutoSwapBufferMode() {
+ return autoSwapBufferMode;
+ }
+
+ private static final ThreadLocal perThreadInitAction = new ThreadLocal();
+ /** Principal helper method which runs a Runnable with the context
+ made current. This could have been made part of GLContext, but a
+ desired goal is to be able to implement the GLCanvas in terms of
+ the GLContext's public APIs, and putting it into a separate
+ class helps ensure that we don't inadvertently use private
+ methods of the GLContext or its implementing classes. */
+ public void invokeGL(GLDrawable drawable,
+ GLContext context,
+ Runnable runnable,
+ Runnable initAction) {
+ // Support for recursive makeCurrent() calls as well as calling
+ // other drawables' display() methods from within another one's
+ GLContext lastContext = GLContext.getCurrent();
+ Runnable lastInitAction = (Runnable) perThreadInitAction.get();
+ if (lastContext != null) {
+ lastContext.release();
+ }
+
+ int res = 0;
+ try {
+ res = context.makeCurrent();
+ if (res != GLContext.CONTEXT_NOT_CURRENT) {
+ if (res == GLContext.CONTEXT_CURRENT_NEW) {
+ if (DEBUG) {
+ System.err.println("GLDrawableHelper " + this + ".invokeGL(): Running initAction");
+ }
+ initAction.run();
+ }
+ if (DEBUG && VERBOSE) {
+ System.err.println("GLDrawableHelper " + this + ".invokeGL(): Running runnable");
+ }
+ runnable.run();
+ if (autoSwapBufferMode) {
+ if (drawable != null) {
+ drawable.swapBuffers();
+ }
+ }
+ }
+ } finally {
+ try {
+ if (res != GLContext.CONTEXT_NOT_CURRENT) {
+ context.release();
+ }
+ } catch (Exception e) {
+ }
+ if (lastContext != null) {
+ int res2 = lastContext.makeCurrent();
+ if (res2 == GLContext.CONTEXT_CURRENT_NEW) {
+ lastInitAction.run();
+ }
+ }
+ }
+ }
+}
diff --git a/src/net/java/games/jogl/impl/GLContextInitActionPair.java b/src/classes/com/sun/opengl/impl/GLDrawableImpl.java
index 379dda3ee..f93ed9663 100755..100644
--- a/src/net/java/games/jogl/impl/GLContextInitActionPair.java
+++ b/src/classes/com/sun/opengl/impl/GLDrawableImpl.java
@@ -37,22 +37,16 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl;
+package com.sun.opengl.impl;
-public class GLContextInitActionPair {
- private GLContext ctx;
- private Runnable initAction;
+import javax.media.opengl.*;
- public GLContextInitActionPair(GLContext ctx, Runnable initAction) {
- this.ctx = ctx;
- this.initAction = initAction;
- }
+public abstract class GLDrawableImpl implements GLDrawable {
+ /** For offscreen GLDrawables (pbuffers and "pixmap" drawables),
+ indicates that native resources should be reclaimed. */
+ public abstract void destroy() throws GLException;
- public GLContext getContext() {
- return ctx;
- }
-
- public Runnable getInitAction() {
- return initAction;
+ public static String toHexString(long hex) {
+ return GLContextImpl.toHexString(hex);
}
}
diff --git a/src/net/java/games/jogl/impl/GLPbufferImpl.java b/src/classes/com/sun/opengl/impl/GLPbufferImpl.java
index 7b17c3010..196ea7223 100644
--- a/src/net/java/games/jogl/impl/GLPbufferImpl.java
+++ b/src/classes/com/sun/opengl/impl/GLPbufferImpl.java
@@ -37,14 +37,14 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl;
+package com.sun.opengl.impl;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.*;
import java.beans.PropertyChangeListener;
-import net.java.games.jogl.*;
+import javax.media.opengl.*;
/** Platform-independent class exposing pbuffer functionality to
applications. This class is not exposed in the public API as it
@@ -52,20 +52,23 @@ import net.java.games.jogl.*;
interface so can be interacted with via its display() method. */
public class GLPbufferImpl implements GLPbuffer {
- // GLPbufferContext
- private GLContext context;
+ private GLDrawableImpl pbufferDrawable;
+ private GLContextImpl context;
private GLDrawableHelper drawableHelper = new GLDrawableHelper();
- private boolean isInitialized=false;
private int floatMode;
- public GLPbufferImpl(GLContext context) {
- this.context = context;
+ public GLPbufferImpl(GLDrawableImpl pbufferDrawable,
+ GLContext parentContext) {
+ this.pbufferDrawable = pbufferDrawable;
+ context = (GLContextImpl) pbufferDrawable.createContext(parentContext);
+ context.setSynchronized(true);
}
- public void display() {
- maybeDoSingleThreadedWorkaround(displayOnEventDispatchThreadAction,
- displayAction,
- false);
+ public GLContext createContext(GLContext shareWith) {
+ return pbufferDrawable.createContext(shareWith);
+ }
+
+ public void setRealized(boolean realized) {
}
public void setSize(int width, int height) {
@@ -73,17 +76,22 @@ public class GLPbufferImpl implements GLPbuffer {
throw new GLException("Not yet implemented");
}
- public void setSize(Dimension d) {
- setSize(d.width, d.height);
+ public int getWidth() {
+ return pbufferDrawable.getWidth();
}
- public Dimension getSize() {
- return getSize(null);
+ public int getHeight() {
+ return pbufferDrawable.getHeight();
}
- public Dimension getSize(Dimension d) {
- // FIXME
- throw new GLException("Not yet implemented");
+ public void display() {
+ maybeDoSingleThreadedWorkaround(displayOnEventDispatchThreadAction,
+ displayAction,
+ false);
+ }
+
+ public void repaint() {
+ display();
}
public void addGLEventListener(GLEventListener listener) {
@@ -94,64 +102,34 @@ public class GLPbufferImpl implements GLPbuffer {
drawableHelper.removeGLEventListener(listener);
}
- public GL getGL() {
- return context.getGL();
- }
-
- public void setGL(GL gl) {
- context.setGL(gl);
- }
-
- public GLU getGLU() {
- return context.getGLU();
- }
-
- public void setGLU(GLU glu) {
- context.setGLU(glu);
- }
-
- void willSetRenderingThread() {
- // Not supported for pbuffers
- }
-
- public void setRenderingThread(Thread currentThreadOrNull) throws GLException {
- // Not supported for pbuffers
+ public GLContext getContext() {
+ return context;
}
- public Thread getRenderingThread() {
- // Not supported for pbuffers
- return null;
+ public GLDrawable getDrawable() {
+ return pbufferDrawable;
}
- public void setNoAutoRedrawMode(boolean noAutoRedraws) {
+ public GL getGL() {
+ return getContext().getGL();
}
- public boolean getNoAutoRedrawMode() {
- return false;
+ public void setGL(GL gl) {
+ getContext().setGL(gl);
}
public void setAutoSwapBufferMode(boolean onOrOff) {
- context.setAutoSwapBufferMode(onOrOff);
+ drawableHelper.setAutoSwapBufferMode(onOrOff);
}
public boolean getAutoSwapBufferMode() {
- return context.getAutoSwapBufferMode();
+ return drawableHelper.getAutoSwapBufferMode();
}
public void swapBuffers() {
maybeDoSingleThreadedWorkaround(swapBuffersOnEventDispatchThreadAction, swapBuffersAction, false);
}
- public boolean canCreateOffscreenDrawable() {
- return false;
- }
-
- public GLPbuffer createOffscreenDrawable(GLCapabilities capabilities,
- int initialWidth,
- int initialHeight) {
- throw new GLException("Not supported");
- }
-
public void bindTexture() {
// Doesn't make much sense to try to do this on the event dispatch
// thread given that it has to be called while the context is current
@@ -164,10 +142,6 @@ public class GLPbufferImpl implements GLPbuffer {
context.releasePbufferFromTexture();
}
- public GLContext getContext() {
- return context;
- }
-
//----------------------------------------------------------------------
// No-ops for ComponentEvents
//
@@ -197,15 +171,9 @@ public class GLPbufferImpl implements GLPbuffer {
public void removePropertyChangeListener(String propertyName,
PropertyChangeListener listener) {}
- /** Queries initialization status of this pBuffer.
- * @return true if initialized
- * */
- public boolean isInitialized(){
- return isInitialized;
- }
-
public void destroy() {
context.destroy();
+ pbufferDrawable.destroy();
}
public int getFloatingPointMode() {
@@ -222,30 +190,16 @@ public class GLPbufferImpl implements GLPbuffer {
private void maybeDoSingleThreadedWorkaround(Runnable eventDispatchThreadAction,
Runnable invokeGLAction,
boolean isReshape) {
- if (SingleThreadedWorkaround.doWorkaround() && !EventQueue.isDispatchThread()) {
- try {
- // Reshape events must not block on the event queue due to the
- // possibility of deadlocks during initial component creation.
- // This solution is not optimal, because it changes the
- // semantics of reshape() to have some of the processing being
- // done asynchronously, but at least it preserves the
- // semantics of the single-threaded workaround.
- if (!isReshape) {
- EventQueue.invokeAndWait(eventDispatchThreadAction);
- } else {
- EventQueue.invokeLater(eventDispatchThreadAction);
- }
- } catch (Exception e) {
- throw new GLException(e);
- }
+ if (Threading.isSingleThreaded() &&
+ !Threading.isOpenGLThread()) {
+ Threading.invokeOnOpenGLThread(eventDispatchThreadAction);
} else {
- context.invokeGL(invokeGLAction, isReshape, initAction);
+ drawableHelper.invokeGL(pbufferDrawable, context, invokeGLAction, initAction);
}
}
class InitAction implements Runnable {
public void run() {
- isInitialized=true;
floatMode = context.getFloatingPointMode();
drawableHelper.init(GLPbufferImpl.this);
}
@@ -260,8 +214,9 @@ public class GLPbufferImpl implements GLPbuffer {
private DisplayAction displayAction = new DisplayAction();
class SwapBuffersAction implements Runnable {
+ // FIXME: currently a no-op
public void run() {
- context.swapBuffers();
+ pbufferDrawable.swapBuffers();
}
}
private SwapBuffersAction swapBuffersAction = new SwapBuffersAction();
@@ -271,14 +226,14 @@ public class GLPbufferImpl implements GLPbuffer {
// being resized on the AWT event dispatch thread
class DisplayOnEventDispatchThreadAction implements Runnable {
public void run() {
- context.invokeGL(displayAction, false, initAction);
+ drawableHelper.invokeGL(pbufferDrawable, context, displayAction, initAction);
}
}
private DisplayOnEventDispatchThreadAction displayOnEventDispatchThreadAction =
new DisplayOnEventDispatchThreadAction();
class SwapBuffersOnEventDispatchThreadAction implements Runnable {
public void run() {
- context.invokeGL(swapBuffersAction, false, initAction);
+ drawableHelper.invokeGL(pbufferDrawable, context, swapBuffersAction, initAction);
}
}
private SwapBuffersOnEventDispatchThreadAction swapBuffersOnEventDispatchThreadAction =
diff --git a/src/net/java/games/jogl/impl/GLUquadricImpl.java b/src/classes/com/sun/opengl/impl/GLUquadricImpl.java
index dfc167dcb..b56f33368 100755..100644
--- a/src/net/java/games/jogl/impl/GLUquadricImpl.java
+++ b/src/classes/com/sun/opengl/impl/GLUquadricImpl.java
@@ -103,9 +103,10 @@
* facility.
*/
-package net.java.games.jogl.impl;
+package com.sun.opengl.impl;
-import net.java.games.jogl.*;
+import javax.media.opengl.*;
+import javax.media.opengl.glu.*;
/**
* GLUquadricImpl.java
@@ -116,13 +117,13 @@ import net.java.games.jogl.*;
* @author Kenneth Russell
*/
-class GLUquadricImpl implements GLUquadric {
+public class GLUquadricImpl implements GLUquadric {
private int drawStyle;
private int orientation;
private boolean textureFlag;
private int normals;
- GLUquadricImpl() {
+ public GLUquadricImpl() {
drawStyle = GLU.GLU_FILL;
orientation = GLU.GLU_OUTSIDE;
textureFlag = false;
@@ -147,7 +148,7 @@ class GLUquadricImpl implements GLUquadric {
*
* @param drawStyle The drawStyle to set
*/
- void setDrawStyle(int drawStyle) {
+ public void setDrawStyle(int drawStyle) {
this.drawStyle = drawStyle;
}
@@ -164,7 +165,7 @@ class GLUquadricImpl implements GLUquadric {
*
* @param normals The normals to set
*/
- void setNormals(int normals) {
+ public void setNormals(int normals) {
this.normals = normals;
}
@@ -181,7 +182,7 @@ class GLUquadricImpl implements GLUquadric {
*
* @param orientation The orientation to set
*/
- void setOrientation(int orientation) {
+ public void setOrientation(int orientation) {
this.orientation = orientation;
}
@@ -196,7 +197,7 @@ class GLUquadricImpl implements GLUquadric {
*
* @param textureFlag The textureFlag to set
*/
- void setTextureFlag(boolean textureFlag) {
+ public void setTextureFlag(boolean textureFlag) {
this.textureFlag = textureFlag;
}
@@ -204,7 +205,7 @@ class GLUquadricImpl implements GLUquadric {
* Returns the drawStyle.
* @return int
*/
- int getDrawStyle() {
+ public int getDrawStyle() {
return drawStyle;
}
@@ -212,7 +213,7 @@ class GLUquadricImpl implements GLUquadric {
* Returns the normals.
* @return int
*/
- int getNormals() {
+ public int getNormals() {
return normals;
}
@@ -220,7 +221,7 @@ class GLUquadricImpl implements GLUquadric {
* Returns the orientation.
* @return int
*/
- int getOrientation() {
+ public int getOrientation() {
return orientation;
}
@@ -228,7 +229,7 @@ class GLUquadricImpl implements GLUquadric {
* Returns the textureFlag.
* @return boolean
*/
- boolean getTextureFlag() {
+ public boolean getTextureFlag() {
return textureFlag;
}
@@ -257,7 +258,7 @@ class GLUquadricImpl implements GLUquadric {
* @param slices Specifies the number of subdivisions around the z axis.
* @param stacks Specifies the number of subdivisions along the z axis.
*/
- void drawCylinder(GL gl, float baseRadius, float topRadius, float height, int slices, int stacks) {
+ public void drawCylinder(GL gl, float baseRadius, float topRadius, float height, int slices, int stacks) {
float da, r, dr, dz;
float x, y, z, nz, nsign;
diff --git a/src/net/java/games/jogl/impl/InternalBufferUtils.java b/src/classes/com/sun/opengl/impl/InternalBufferUtils.java
index 7ae5efb0e..89639c493 100644
--- a/src/net/java/games/jogl/impl/InternalBufferUtils.java
+++ b/src/classes/com/sun/opengl/impl/InternalBufferUtils.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl;
+package com.sun.opengl.impl;
import java.nio.*;
diff --git a/src/net/java/games/jogl/impl/JAWT_PlatformInfo.java b/src/classes/com/sun/opengl/impl/JAWT_PlatformInfo.java
index 55eb43d42..ca101eff9 100644
--- a/src/net/java/games/jogl/impl/JAWT_PlatformInfo.java
+++ b/src/classes/com/sun/opengl/impl/JAWT_PlatformInfo.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl;
+package com.sun.opengl.impl;
/** Marker class for all window system-specific JAWT data structures. */
diff --git a/src/classes/com/sun/opengl/impl/Java2D.java b/src/classes/com/sun/opengl/impl/Java2D.java
new file mode 100755
index 000000000..7d666e138
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/Java2D.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl;
+
+import java.awt.*;
+import java.lang.reflect.*;
+import java.security.*;
+
+import javax.media.opengl.*;
+
+/** Defines integration with the Java2D OpenGL pipeline. This
+ integration is only supported in 1.6 and is highly experimental. */
+
+public class Java2D {
+ private static boolean DEBUG = Debug.debug("Java2D");
+ private static boolean VERBOSE = Debug.verbose();
+ private static boolean isOGLPipelineActive;
+ private static Method invokeWithOGLContextCurrentMethod;
+ private static Method isQueueFlusherThreadMethod;
+ private static Method getOGLViewportMethod;
+ private static Method getOGLScissorBoxMethod;
+ private static Method getOGLSurfaceIdentifierMethod;
+
+ static {
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ if (DEBUG && VERBOSE) {
+ System.err.println("Checking for Java2D/OpenGL support");
+ }
+ // Figure out whether the default graphics configuration is an
+ // OpenGL graphics configuration
+ GraphicsConfiguration cfg =
+ GraphicsEnvironment.getLocalGraphicsEnvironment().
+ getDefaultScreenDevice().
+ getDefaultConfiguration();
+ String name = cfg.getClass().getName();
+ if (DEBUG && VERBOSE) {
+ System.err.println("Java2D support: default GraphicsConfiguration = " + name);
+ }
+ isOGLPipelineActive = (name.startsWith("sun.java2d.opengl"));
+
+ if (isOGLPipelineActive) {
+ try {
+ // Try to get methods we need to integrate
+ Class utils = Class.forName("sun.java2d.opengl.OGLUtilities");
+ invokeWithOGLContextCurrentMethod = utils.getDeclaredMethod("invokeWithOGLContextCurrent",
+ new Class[] {
+ Graphics.class,
+ Runnable.class
+ });
+ invokeWithOGLContextCurrentMethod.setAccessible(true);
+
+ isQueueFlusherThreadMethod = utils.getDeclaredMethod("isQueueFlusherThread",
+ new Class[] {});
+ isQueueFlusherThreadMethod.setAccessible(true);
+
+ getOGLViewportMethod = utils.getDeclaredMethod("getOGLViewport",
+ new Class[] {
+ Graphics.class,
+ Integer.TYPE,
+ Integer.TYPE
+ });
+ getOGLViewportMethod.setAccessible(true);
+
+ getOGLScissorBoxMethod = utils.getDeclaredMethod("getOGLScissorBox",
+ new Class[] {
+ Graphics.class
+ });
+ getOGLScissorBoxMethod.setAccessible(true);
+
+ getOGLSurfaceIdentifierMethod = utils.getDeclaredMethod("getOGLSurfaceIdentifier",
+ new Class[] {
+ Graphics.class
+ });
+ getOGLSurfaceIdentifierMethod.setAccessible(true);
+ } catch (Exception e) {
+ if (DEBUG && VERBOSE) {
+ e.printStackTrace();
+ }
+ isOGLPipelineActive = false;
+ }
+ }
+
+ if (DEBUG) {
+ System.err.println("JOGL/Java2D integration " + (isOGLPipelineActive ? "enabled" : "disabled"));
+ }
+ return null;
+ }
+ });
+ }
+
+ public static boolean isOGLPipelineActive() {
+ return isOGLPipelineActive;
+ }
+
+ public static boolean isQueueFlusherThread() {
+ if (!isOGLPipelineActive()) {
+ throw new GLException("Java2D OpenGL pipeline not active (or necessary support not present)");
+ }
+
+ try {
+ return ((Boolean) isQueueFlusherThreadMethod.invoke(null, new Object[] {})).booleanValue();
+ } catch (InvocationTargetException e) {
+ throw new GLException(e.getTargetException());
+ } catch (Exception e) {
+ throw (InternalError) new InternalError().initCause(e);
+ }
+ }
+
+ /** Makes current the OpenGL context associated with the passed
+ Graphics object and runs the given Runnable on the Queue
+ Flushing Thread in one atomic action. */
+ public static void invokeWithOGLContextCurrent(Graphics g, Runnable r) throws GLException {
+ if (!isOGLPipelineActive()) {
+ throw new GLException("Java2D OpenGL pipeline not active (or necessary support not present)");
+ }
+
+ try {
+ GLDrawableFactoryImpl.getFactoryImpl().lockAWTForJava2D();
+ try {
+ invokeWithOGLContextCurrentMethod.invoke(null, new Object[] {g, r});
+ } finally {
+ GLDrawableFactoryImpl.getFactoryImpl().unlockAWTForJava2D();
+ }
+ } catch (InvocationTargetException e) {
+ throw new GLException(e.getTargetException());
+ } catch (Exception e) {
+ throw (InternalError) new InternalError().initCause(e);
+ }
+ }
+
+ public static Rectangle getOGLViewport(Graphics g,
+ int componentWidth,
+ int componentHeight) {
+ if (!isOGLPipelineActive()) {
+ throw new GLException("Java2D OpenGL pipeline not active (or necessary support not present)");
+ }
+
+ try {
+ return (Rectangle) getOGLViewportMethod.invoke(null, new Object[] {g,
+ new Integer(componentWidth),
+ new Integer(componentHeight)});
+ } catch (InvocationTargetException e) {
+ throw new GLException(e.getTargetException());
+ } catch (Exception e) {
+ throw (InternalError) new InternalError().initCause(e);
+ }
+ }
+
+ public static Rectangle getOGLScissorBox(Graphics g) {
+ if (!isOGLPipelineActive()) {
+ throw new GLException("Java2D OpenGL pipeline not active (or necessary support not present)");
+ }
+
+ try {
+ return (Rectangle) getOGLScissorBoxMethod.invoke(null, new Object[] {g});
+ } catch (InvocationTargetException e) {
+ throw new GLException(e.getTargetException());
+ } catch (Exception e) {
+ throw (InternalError) new InternalError().initCause(e);
+ }
+ }
+
+
+ public static Object getOGLSurfaceIdentifier(Graphics g) {
+ if (!isOGLPipelineActive()) {
+ throw new GLException("Java2D OpenGL pipeline not active (or necessary support not present)");
+ }
+
+ try {
+ return getOGLSurfaceIdentifierMethod.invoke(null, new Object[] {g});
+ } catch (InvocationTargetException e) {
+ throw new GLException(e.getTargetException());
+ } catch (Exception e) {
+ throw (InternalError) new InternalError().initCause(e);
+ }
+ }
+}
diff --git a/src/net/java/games/jogl/impl/NativeLibLoader.java b/src/classes/com/sun/opengl/impl/NativeLibLoader.java
index 54d37f6ce..fa535c7d5 100644
--- a/src/net/java/games/jogl/impl/NativeLibLoader.java
+++ b/src/classes/com/sun/opengl/impl/NativeLibLoader.java
@@ -37,8 +37,9 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl;
+package com.sun.opengl.impl;
+import java.awt.Toolkit;
import java.security.*;
public class NativeLibLoader {
@@ -60,6 +61,10 @@ public class NativeLibLoader {
boolean isOSX = System.getProperty("os.name").equals("Mac OS X");
if (!isOSX) {
try {
+ // On X11 systems, toolkit must be loaded before
+ // trying to resolve JAWT in order for libmawt.so to
+ // be found properly
+ Toolkit.getDefaultToolkit();
System.loadLibrary("jawt");
} catch (UnsatisfiedLinkError e) {
// Accessibility technologies load JAWT themselves; safe to continue
diff --git a/src/net/java/games/jogl/impl/Project.java b/src/classes/com/sun/opengl/impl/Project.java
index 90770309f..655434319 100755
--- a/src/net/java/games/jogl/impl/Project.java
+++ b/src/classes/com/sun/opengl/impl/Project.java
@@ -102,12 +102,12 @@
* in the design, construction, operation or maintenance of any nuclear
* facility.
*/
-package net.java.games.jogl.impl;
+package com.sun.opengl.impl;
-import net.java.games.jogl.*;
-import net.java.games.jogl.util.*;
+import java.nio.*;
-import java.nio.DoubleBuffer;
+import javax.media.opengl.*;
+import com.sun.opengl.utils.*;
/**
* Project.java
@@ -118,7 +118,7 @@ import java.nio.DoubleBuffer;
* @author Erik Duijs
* @author Kenneth Russell
*/
-class Project {
+public class Project {
private static final double[] IDENTITY_MATRIX =
new double[] {
1.0, 0.0, 0.0, 0.0,
@@ -159,14 +159,13 @@ class Project {
* @param in
* @param out
*/
- private void __gluMultMatrixVecd(double[] matrix, double[] in, double[] out) {
+ private void __gluMultMatrixVecd(double[] matrix, int matrix_offset, double[] in, double[] out) {
for (int i = 0; i < 4; i++) {
out[i] =
- in[0] * matrix[0*4+i] +
- in[1] * matrix[1*4+i] +
- in[2] * matrix[2*4+i] +
- in[3] * matrix[3*4+i];
-
+ in[0] * matrix[0*4+i+matrix_offset] +
+ in[1] * matrix[1*4+i+matrix_offset] +
+ in[2] * matrix[2*4+i+matrix_offset] +
+ in[3] * matrix[3*4+i+matrix_offset];
}
}
@@ -245,14 +244,14 @@ class Project {
* @param b
* @param r
*/
- private void __gluMultMatricesd(double[] a, double[] b, double[] r) {
+ private void __gluMultMatricesd(double[] a, int a_offset, double[] b, int b_offset, double[] r) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
r[i*4+j] =
- a[i*4+0]*b[0*4+j] +
- a[i*4+1]*b[1*4+j] +
- a[i*4+2]*b[2*4+j] +
- a[i*4+3]*b[3*4+j];
+ a[i*4+0+a_offset]*b[0*4+j+b_offset] +
+ a[i*4+1+a_offset]*b[1*4+j+b_offset] +
+ a[i*4+2+a_offset]*b[2*4+j+b_offset] +
+ a[i*4+3+a_offset]*b[3*4+j+b_offset];
}
}
}
@@ -414,9 +413,13 @@ class Project {
double objy,
double objz,
double[] modelMatrix,
+ int modelMatrix_offset,
double[] projMatrix,
+ int projMatrix_offset,
int[] viewport,
- double[] win_pos) {
+ int viewport_offset,
+ double[] win_pos,
+ int win_pos_offset ) {
double[] in = this.in;
double[] out = this.out;
@@ -426,8 +429,8 @@ class Project {
in[2] = objz;
in[3] = 1.0;
- __gluMultMatrixVecd(modelMatrix, in, out);
- __gluMultMatrixVecd(projMatrix, out, in);
+ __gluMultMatrixVecd(modelMatrix, modelMatrix_offset, in, out);
+ __gluMultMatrixVecd(projMatrix, projMatrix_offset, out, in);
if (in[3] == 0.0)
return false;
@@ -440,9 +443,9 @@ class Project {
in[2] = in[2] * in[3] + 0.5f;
// Map x,y to viewport
- win_pos[0] = in[0] * viewport[2] + viewport[0];
- win_pos[1] = in[1] * viewport[3] + viewport[1];
- win_pos[2] = in[2];
+ win_pos[0+win_pos_offset] = in[0] * viewport[2+viewport_offset] + viewport[0+viewport_offset];
+ win_pos[1+win_pos_offset] = in[1] * viewport[3+viewport_offset] + viewport[1+viewport_offset];
+ win_pos[2+win_pos_offset] = in[2];
return true;
}
@@ -464,13 +467,17 @@ class Project {
double winy,
double winz,
double[] modelMatrix,
+ int modelMatrix_offset,
double[] projMatrix,
+ int projMatrix_offset,
int[] viewport,
- double[] obj_pos) {
+ int viewport_offset,
+ double[] obj_pos,
+ int obj_pos_offset) {
double[] in = this.in;
double[] out = this.out;
- __gluMultMatricesd(modelMatrix, projMatrix, finalMatrix);
+ __gluMultMatricesd(modelMatrix, modelMatrix_offset, projMatrix, projMatrix_offset, finalMatrix);
if (!__gluInvertMatrixd(finalMatrix, finalMatrix))
return false;
@@ -481,24 +488,24 @@ class Project {
in[3] = 1.0;
// Map x and y from window coordinates
- in[0] = (in[0] - viewport[0]) / viewport[2];
- in[1] = (in[1] - viewport[1]) / viewport[3];
+ in[0] = (in[0] - viewport[0+viewport_offset]) / viewport[2+viewport_offset];
+ in[1] = (in[1] - viewport[1+viewport_offset]) / viewport[3+viewport_offset];
// Map to range -1 to 1
in[0] = in[0] * 2 - 1;
in[1] = in[1] * 2 - 1;
in[2] = in[2] * 2 - 1;
- __gluMultMatrixVecd(finalMatrix, in, out);
+ __gluMultMatrixVecd(finalMatrix, 0, in, out);
if (out[3] == 0.0)
return false;
out[3] = 1.0 / out[3];
- obj_pos[0] = out[0] * out[3];
- obj_pos[1] = out[1] * out[3];
- obj_pos[2] = out[2] * out[3];
+ obj_pos[0+obj_pos_offset] = out[0] * out[3];
+ obj_pos[1+obj_pos_offset] = out[1] * out[3];
+ obj_pos[2+obj_pos_offset] = out[2] * out[3];
return true;
}
@@ -524,15 +531,19 @@ class Project {
double winz,
double clipw,
double[] modelMatrix,
+ int modelMatrix_offset,
double[] projMatrix,
+ int projMatrix_offset,
int[] viewport,
+ int viewport_offset,
double near,
double far,
- double[] obj_pos) {
+ double[] obj_pos,
+ int obj_pos_offset ) {
double[] in = this.in;
double[] out = this.out;
- __gluMultMatricesd(modelMatrix, projMatrix, finalMatrix);
+ __gluMultMatricesd(modelMatrix, modelMatrix_offset, projMatrix, projMatrix_offset, finalMatrix);
if (!__gluInvertMatrixd(finalMatrix, finalMatrix))
return false;
@@ -543,8 +554,8 @@ class Project {
in[3] = clipw;
// Map x and y from window coordinates
- in[0] = (in[0] - viewport[0]) / viewport[2];
- in[1] = (in[1] - viewport[1]) / viewport[3];
+ in[0] = (in[0] - viewport[0+viewport_offset]) / viewport[2+viewport_offset];
+ in[1] = (in[1] - viewport[1+viewport_offset]) / viewport[3+viewport_offset];
in[2] = (in[2] - near) / (far - near);
// Map to range -1 to 1
@@ -552,15 +563,15 @@ class Project {
in[1] = in[1] * 2 - 1;
in[2] = in[2] * 2 - 1;
- __gluMultMatrixVecd(finalMatrix, in, out);
+ __gluMultMatrixVecd(finalMatrix, 0, in, out);
if (out[3] == 0.0)
return false;
- obj_pos[0] = out[0];
- obj_pos[1] = out[1];
- obj_pos[2] = out[2];
- obj_pos[3] = out[3];
+ obj_pos[0+obj_pos_offset] = out[0];
+ obj_pos[1+obj_pos_offset] = out[1];
+ obj_pos[2+obj_pos_offset] = out[2];
+ obj_pos[3+obj_pos_offset] = out[3];
return true;
}
@@ -578,15 +589,43 @@ class Project {
double y,
double deltaX,
double deltaY,
- int[] viewport) {
+ IntBuffer viewport) {
+ if (deltaX <= 0 || deltaY <= 0) {
+ return;
+ }
+
+ /* Translate and scale the picked region to the entire window */
+ gl.glTranslated((viewport.get(2) - 2 * (x - viewport.get(0))) / deltaX,
+ (viewport.get(3) - 2 * (y - viewport.get(1))) / deltaY,
+ 0);
+ gl.glScaled(viewport.get(2) / deltaX, viewport.get(3) / deltaY, 1.0);
+ }
+
+ /**
+ * Method gluPickMatrix
+ *
+ * @param x
+ * @param y
+ * @param deltaX
+ * @param deltaY
+ * @param viewport
+ * @param viewport_offset
+ */
+ public void gluPickMatrix(GL gl,
+ double x,
+ double y,
+ double deltaX,
+ double deltaY,
+ int[] viewport,
+ int viewport_offset) {
if (deltaX <= 0 || deltaY <= 0) {
return;
}
/* Translate and scale the picked region to the entire window */
- gl.glTranslated((viewport[2] - 2 * (x - viewport[0])) / deltaX,
- (viewport[3] - 2 * (y - viewport[1])) / deltaY,
+ gl.glTranslated((viewport[2+viewport_offset] - 2 * (x - viewport[0+viewport_offset])) / deltaX,
+ (viewport[3+viewport_offset] - 2 * (y - viewport[1+viewport_offset])) / deltaY,
0);
- gl.glScaled(viewport[2] / deltaX, viewport[3] / deltaY, 1.0);
+ gl.glScaled(viewport[2+viewport_offset] / deltaX, viewport[3+viewport_offset] / deltaY, 1.0);
}
}
diff --git a/src/net/java/games/jogl/impl/Util.java b/src/classes/com/sun/opengl/impl/Util.java
index 46bdfc79a..b4b501659 100755..100644
--- a/src/net/java/games/jogl/impl/Util.java
+++ b/src/classes/com/sun/opengl/impl/Util.java
@@ -66,10 +66,10 @@
* facility.
*/
-package net.java.games.jogl.impl;
+package com.sun.opengl.impl;
import java.nio.IntBuffer;
-import net.java.games.jogl.*;
+import javax.media.opengl.*;
/**
* Util.java
@@ -236,7 +236,7 @@ class Util {
* @return int
*/
protected int glGetIntegerv(GL gl, int what) {
- gl.glGetIntegerv(what, scratch);
+ gl.glGetIntegerv(what, scratch, 0);
return scratch[0];
}
}
diff --git a/src/net/java/games/jogl/impl/error/Error.java b/src/classes/com/sun/opengl/impl/error/Error.java
index a9b4c48f1..b19fb4903 100644
--- a/src/net/java/games/jogl/impl/error/Error.java
+++ b/src/classes/com/sun/opengl/impl/error/Error.java
@@ -32,11 +32,10 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.error;
+package com.sun.opengl.impl.error;
-import net.java.games.jogl.GL;
-import net.java.games.jogl.GLU;
-import net.java.games.jogl.impl.GLUImpl;
+import javax.media.opengl.GL;
+import javax.media.opengl.glu.GLU;
/**
*
@@ -75,14 +74,14 @@ public class Error {
if( errorCode == GL.GL_TABLE_TOO_LARGE ) {
return( "table too large" );
}
- if( (errorCode >= GLUImpl.GLU_INVALID_ENUM) && (errorCode <= GLUImpl.GLU_INVALID_OPERATION) ) {
- return( gluErrorStrings[ errorCode - GLUImpl.GLU_INVALID_ENUM ] );
+ if( (errorCode >= GLU.GLU_INVALID_ENUM) && (errorCode <= GLU.GLU_INVALID_OPERATION) ) {
+ return( gluErrorStrings[ errorCode - GLU.GLU_INVALID_ENUM ] );
}
- if( (errorCode >= GLUImpl.GLU_NURBS_ERROR1) && (errorCode <= GLUImpl.GLU_NURBS_ERROR37) ) {
- return( gluErrorStrings[ errorCode - (GLUImpl.GLU_NURBS_ERROR1 - 1) ] );
+ if( (errorCode >= GLU.GLU_NURBS_ERROR1) && (errorCode <= GLU.GLU_NURBS_ERROR37) ) {
+ return( gluErrorStrings[ errorCode - (GLU.GLU_NURBS_ERROR1 - 1) ] );
}
- if( (errorCode >= GLUImpl.GLU_TESS_ERROR1) && (errorCode <= GLUImpl.GLU_TESS_ERROR8) ) {
- return( gluErrorStrings[ errorCode - (GLUImpl.GLU_TESS_ERROR1 - 1) ] );
+ if( (errorCode >= GLU.GLU_TESS_ERROR1) && (errorCode <= GLU.GLU_TESS_ERROR8) ) {
+ return( gluErrorStrings[ errorCode - (GLU.GLU_TESS_ERROR1 - 1) ] );
}
return( null );
}
diff --git a/src/net/java/games/jogl/impl/glue/Glue.java b/src/classes/com/sun/opengl/impl/glue/Glue.java
index 65ba2ad9d..5938f6e0d 100644
--- a/src/net/java/games/jogl/impl/glue/Glue.java
+++ b/src/classes/com/sun/opengl/impl/glue/Glue.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.glue;
+package com.sun.opengl.impl.glue;
/**
*
diff --git a/src/net/java/games/jogl/impl/macosx/MacOSXDummyGLContext.java b/src/classes/com/sun/opengl/impl/macosx/MacOSXDummyGLContext.java
index 29a3ef63b..fef5584ab 100644
--- a/src/net/java/games/jogl/impl/macosx/MacOSXDummyGLContext.java
+++ b/src/classes/com/sun/opengl/impl/macosx/MacOSXDummyGLContext.java
@@ -37,10 +37,10 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl.macosx;
+package com.sun.opengl.impl.macosx;
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
/** This MacOSXGLContext implementation provides interoperability with
the NSOpenGLView Cocoa widget. The MacOSXGLImpl can be
@@ -49,21 +49,10 @@ import net.java.games.jogl.impl.*;
function lookup is supported in this configuration by having this
object provide the FunctionAvailabilityTable. */
-class MacOSXDummyGLContext extends MacOSXGLContext
+public class MacOSXDummyGLContext extends MacOSXGLContext
{
- private MacOSXGLImpl gl;
-
- MacOSXDummyGLContext(MacOSXGLImpl gl) {
- super(null, null, null, null);
- this.gl = gl;
- }
-
- protected GL createGL() {
- return gl;
- }
-
- protected boolean isOffscreen() {
- return false;
+ public MacOSXDummyGLContext() {
+ super(null, null);
}
public int getOffscreenContextReadBuffer() {
@@ -78,10 +67,12 @@ class MacOSXDummyGLContext extends MacOSXGLContext
throw new GLException("Should not call this");
}
- public synchronized GLContext createPbufferContext(GLCapabilities capabilities, int initialWidth, int initialHeight) {
+ public GLDrawableImpl createPbufferDrawable(GLCapabilities capabilities,
+ int initialWidth,
+ int initialHeight) {
throw new GLException("Should not call this");
}
-
+
public void bindPbufferToTexture() {
throw new GLException("Should not call this");
}
@@ -90,26 +81,6 @@ class MacOSXDummyGLContext extends MacOSXGLContext
throw new GLException("Should not call this");
}
- protected synchronized boolean makeCurrent(Runnable initAction) throws GLException {
- throw new GLException("Should not call this");
- }
-
- public synchronized void swapBuffers() throws GLException {
- throw new GLException("Should not call this");
- }
-
- protected synchronized void free() throws GLException {
- throw new GLException("Should not call this");
- }
-
- protected boolean create() {
- throw new GLException("Should not call this");
- }
-
- public void destroy() {
- throw new GLException("Should not call this");
- }
-
public void resetGLFunctionAvailability() {
super.resetGLFunctionAvailability();
}
diff --git a/src/net/java/games/jogl/impl/macosx/MacOSXGLContext.java b/src/classes/com/sun/opengl/impl/macosx/MacOSXGLContext.java
index ec58de9a6..e7b06e32e 100644
--- a/src/net/java/games/jogl/impl/macosx/MacOSXGLContext.java
+++ b/src/classes/com/sun/opengl/impl/macosx/MacOSXGLContext.java
@@ -37,37 +37,44 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl.macosx;
+package com.sun.opengl.impl.macosx;
-import java.awt.Component;
+import java.nio.*;
import java.util.*;
-import net.java.games.gluegen.runtime.*; // for PROCADDRESS_VAR_PREFIX
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
-public abstract class MacOSXGLContext extends GLContext
+public abstract class MacOSXGLContext extends GLContextImpl
{
- private static JAWT jawt;
+ protected MacOSXGLDrawable drawable;
protected long nsContext; // NSOpenGLContext
- protected long nsView; // NSView
- protected long updater; // ContextUpdater
+ private CGLExt cglExt;
// Table that holds the addresses of the native C-language entry points for
- // OpenGL functions.
- private GLProcAddressTable glProcAddressTable;
+ // CGL extension functions.
+ private CGLExtProcAddressTable cglExtProcAddressTable;
- public MacOSXGLContext(Component component,
- GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
+ public MacOSXGLContext(MacOSXGLDrawable drawable,
GLContext shareWith)
{
- super(component, capabilities, chooser, shareWith);
+ super(shareWith);
+ this.drawable = drawable;
}
- protected GL createGL()
- {
- return new MacOSXGLImpl(this);
+ public Object getPlatformGLExtensions() {
+ return getCGLExt();
}
-
+
+ public CGLExt getCGLExt() {
+ if (cglExt == null) {
+ cglExt = new CGLExtImpl(this);
+ }
+ return cglExt;
+ }
+
+ public GLDrawable getGLDrawable() {
+ return drawable;
+ }
+
protected String mapToRealGLFunctionName(String glFunctionName)
{
return glFunctionName;
@@ -78,48 +85,13 @@ public abstract class MacOSXGLContext extends GLContext
return glExtensionName;
}
- protected boolean isFunctionAvailable(String glFunctionName)
- {
- return super.isFunctionAvailable(glFunctionName);
- }
-
- public boolean isExtensionAvailable(String glExtensionName) {
- if (glExtensionName.equals("GL_ARB_pbuffer") ||
- glExtensionName.equals("GL_ARB_pixel_format")) {
- return true;
- }
- return super.isExtensionAvailable(glExtensionName);
- }
-
- protected abstract boolean isOffscreen();
-
- public int getOffscreenContextReadBuffer() {
- throw new GLException("Should not call this");
- }
-
- public int getOffscreenContextWidth() {
- throw new GLException("Should not call this");
- }
-
- public int getOffscreenContextHeight() {
- throw new GLException("Should not call this");
- }
-
- public int getOffscreenContextPixelDataType() {
- throw new GLException("Should not call this");
- }
-
- public boolean offscreenImageNeedsVerticalFlip() {
- throw new GLException("Should not call this");
- }
-
protected boolean create() {
return create(false, false);
}
/**
* Creates and initializes an appropriate OpenGl nsContext. Should only be
- * called by {@link makeCurrent(Runnable)}.
+ * called by {@link makeCurrentImpl()}.
*/
protected boolean create(boolean pbuffer, boolean floatingPoint) {
MacOSXGLContext other = (MacOSXGLContext) GLContextShareSet.getShareContext(this);
@@ -131,8 +103,9 @@ public abstract class MacOSXGLContext extends GLContext
}
}
int[] viewNotReady = new int[1];
+ GLCapabilities capabilities = drawable.getCapabilities();
nsContext = CGL.createContext(share,
- nsView,
+ drawable.getView(),
capabilities.getDoubleBuffered() ? 1 : 0,
capabilities.getStereo() ? 1 : 0,
capabilities.getRedBits(),
@@ -149,7 +122,7 @@ public abstract class MacOSXGLContext extends GLContext
capabilities.getNumSamples(),
(pbuffer ? 1 : 0),
(floatingPoint ? 1 : 0),
- viewNotReady);
+ viewNotReady, 0);
if (nsContext == 0) {
if (viewNotReady[0] == 1) {
if (DEBUG) {
@@ -160,40 +133,37 @@ public abstract class MacOSXGLContext extends GLContext
}
throw new GLException("Error creating nsContext");
}
- //updater = CGL.updateContextRegister(nsContext, nsView); // gznote: not thread safe yet!
GLContextShareSet.contextCreated(this);
return true;
}
- protected synchronized boolean makeCurrent(Runnable initAction) throws GLException {
- boolean created = false;
- if (nsContext == 0) {
- if (!create()) {
- return false;
- }
- if (DEBUG) {
- System.err.println("!!! Created GL nsContext for " + getClass().getName());
- }
- created = true;
+ protected int makeCurrentImpl() throws GLException {
+ boolean created = false;
+ if (nsContext == 0) {
+ if (!create()) {
+ return CONTEXT_NOT_CURRENT;
}
-
- if (!CGL.makeCurrentContext(nsContext, nsView)) {
- throw new GLException("Error making nsContext current");
+ if (DEBUG) {
+ System.err.println("!!! Created GL nsContext for " + getClass().getName());
}
+ created = true;
+ }
- if (created) {
- resetGLFunctionAvailability();
- if (initAction != null) {
- initAction.run();
- }
- }
- return true;
+ if (!CGL.makeCurrentContext(nsContext, drawable.getView())) {
+ throw new GLException("Error making nsContext current");
+ }
+
+ if (created) {
+ resetGLFunctionAvailability();
+ return CONTEXT_CURRENT_NEW;
+ }
+ return CONTEXT_CURRENT;
}
- protected synchronized void free() throws GLException {
- if (!CGL.clearCurrentContext(nsContext, nsView)) {
- throw new GLException("Error freeing OpenGL nsContext");
- }
+ protected void releaseImpl() throws GLException {
+ if (!CGL.clearCurrentContext(nsContext, drawable.getView())) {
+ throw new GLException("Error freeing OpenGL nsContext");
+ }
}
protected void destroyImpl() throws GLException {
@@ -205,15 +175,10 @@ public abstract class MacOSXGLContext extends GLContext
System.err.println("!!! Destroyed OpenGL context " + nsContext);
}
nsContext = 0;
+ GLContextShareSet.contextDestroyed(this);
}
}
- public abstract void swapBuffers() throws GLException;
-
- protected long dynamicLookupFunction(String glFuncName) {
- return CGL.getProcAddress(glFuncName);
- }
-
public boolean isCreated() {
return (nsContext != 0);
}
@@ -222,21 +187,20 @@ public abstract class MacOSXGLContext extends GLContext
{
super.resetGLFunctionAvailability();
if (DEBUG) {
- System.err.println("!!! Initializing OpenGL extension address table");
+ System.err.println("!!! Initializing CGL extension address table");
}
- resetProcAddressTable(getGLProcAddressTable());
+ resetProcAddressTable(getCGLExtProcAddressTable());
}
- public GLProcAddressTable getGLProcAddressTable()
- {
- if (glProcAddressTable == null) {
+ public CGLExtProcAddressTable getCGLExtProcAddressTable() {
+ if (cglExtProcAddressTable == null) {
// FIXME: cache ProcAddressTables by capability bits so we can
// share them among contexts with the same capabilities
- glProcAddressTable = new GLProcAddressTable();
+ cglExtProcAddressTable = new CGLExtProcAddressTable();
}
- return glProcAddressTable;
+ return cglExtProcAddressTable;
}
-
+
public String getPlatformExtensionsString()
{
return "";
@@ -249,6 +213,44 @@ public abstract class MacOSXGLContext extends GLContext
CGL.setSwapInterval(nsContext, interval);
}
+ public ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3) {
+ // FIXME: apparently the Apple extension doesn't require a custom memory allocator
+ throw new GLException("Not yet implemented");
+ }
+
+ protected boolean isFunctionAvailable(String glFunctionName)
+ {
+ return super.isFunctionAvailable(glFunctionName);
+ }
+
+ public boolean isExtensionAvailable(String glExtensionName) {
+ if (glExtensionName.equals("GL_ARB_pbuffer") ||
+ glExtensionName.equals("GL_ARB_pixel_format")) {
+ return true;
+ }
+ return super.isExtensionAvailable(glExtensionName);
+ }
+
+ public int getOffscreenContextPixelDataType() {
+ throw new GLException("Should not call this");
+ }
+
+ public int getOffscreenContextReadBuffer() {
+ throw new GLException("Should not call this");
+ }
+
+ public boolean offscreenImageNeedsVerticalFlip() {
+ throw new GLException("Should not call this");
+ }
+
+ public void bindPbufferToTexture() {
+ throw new GLException("Should not call this");
+ }
+
+ public void releasePbufferFromTexture() {
+ throw new GLException("Should not call this");
+ }
+
//----------------------------------------------------------------------
// Internals only below this point
//
@@ -256,23 +258,4 @@ public abstract class MacOSXGLContext extends GLContext
protected long getNSContext() {
return nsContext;
}
-
- protected long getNSView() {
- return nsView;
- }
-
- protected JAWT getJAWT()
- {
- if (jawt == null)
- {
- JAWT j = new JAWT();
- j.version(JAWTFactory.JAWT_VERSION_1_4);
- if (!JAWTFactory.JAWT_GetAWT(j))
- {
- throw new RuntimeException("Unable to initialize JAWT");
- }
- jawt = j;
- }
- return jawt;
- }
}
diff --git a/src/classes/com/sun/opengl/impl/macosx/MacOSXGLDrawable.java b/src/classes/com/sun/opengl/impl/macosx/MacOSXGLDrawable.java
new file mode 100644
index 000000000..26ea8ec54
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/macosx/MacOSXGLDrawable.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.macosx;
+
+import java.awt.Component;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public abstract class MacOSXGLDrawable extends GLDrawableImpl {
+ protected static final boolean DEBUG = Debug.debug("MacOSXGLDrawable");
+
+ protected long nsView; // NSView
+ protected GLCapabilities capabilities;
+ protected GLCapabilitiesChooser chooser;
+
+ public MacOSXGLDrawable(GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser) {
+ this.capabilities = (GLCapabilities) capabilities.clone();
+ this.chooser = chooser;
+ }
+
+ public void setRealized(boolean val) {
+ throw new GLException("Should not call this (should only be called for onscreen GLDrawables)");
+ }
+
+ public void destroy() {
+ throw new GLException("Should not call this (should only be called for offscreen GLDrawables)");
+ }
+
+ public void swapBuffers() throws GLException {
+ }
+
+ public GLCapabilities getCapabilities() {
+ return capabilities;
+ }
+
+ public long getView() {
+ return nsView;
+ }
+} \ No newline at end of file
diff --git a/src/classes/com/sun/opengl/impl/macosx/MacOSXGLDrawableFactory.java b/src/classes/com/sun/opengl/impl/macosx/MacOSXGLDrawableFactory.java
new file mode 100644
index 000000000..62b7f3b93
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/macosx/MacOSXGLDrawableFactory.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.macosx;
+
+import java.awt.Component;
+import java.awt.EventQueue;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class MacOSXGLDrawableFactory extends GLDrawableFactoryImpl {
+ static {
+ NativeLibLoader.load();
+ }
+
+ public GraphicsConfiguration chooseGraphicsConfiguration(GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser,
+ GraphicsDevice device) {
+ return null;
+ }
+
+ public GLDrawable getGLDrawable(Object target,
+ GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser) {
+ if (target == null) {
+ throw new IllegalArgumentException("Null target");
+ }
+ if (!(target instanceof Component)) {
+ throw new IllegalArgumentException("GLDrawables not supported for objects of type " +
+ target.getClass().getName() + " (only Components are supported in this implementation)");
+ }
+ if (capabilities == null) {
+ capabilities = new GLCapabilities();
+ }
+ if (chooser == null) {
+ chooser = new DefaultGLCapabilitiesChooser();
+ }
+ return new MacOSXOnscreenGLDrawable((Component) target, capabilities, chooser);
+ }
+
+ public GLDrawableImpl createOffscreenDrawable(GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser) {
+ return new MacOSXOffscreenGLDrawable(capabilities);
+ }
+
+ public boolean canCreateGLPbuffer() {
+ return true;
+ }
+
+ public GLPbuffer createGLPbuffer(final GLCapabilities capabilities,
+ final int initialWidth,
+ final int initialHeight,
+ final GLContext shareWith) {
+ final List returnList = new ArrayList();
+ Runnable r = new Runnable() {
+ public void run() {
+ MacOSXPbufferGLDrawable pbufferDrawable = new MacOSXPbufferGLDrawable(capabilities,
+ initialWidth,
+ initialHeight);
+ GLPbufferImpl pbuffer = new GLPbufferImpl(pbufferDrawable, shareWith);
+ returnList.add(pbuffer);
+ }
+ };
+ maybeDoSingleThreadedWorkaround(r);
+ return (GLPbuffer) returnList.get(0);
+ }
+
+ public GLContext createExternalGLContext() {
+ // FIXME
+ throw new GLException("Not yet implemented");
+ }
+
+ public boolean canCreateExternalGLDrawable() {
+ return false;
+ }
+
+ public GLDrawable createExternalGLDrawable() {
+ // FIXME
+ throw new GLException("Not yet implemented");
+ }
+
+ public long dynamicLookupFunction(String glFuncName) {
+ return CGL.getProcAddress(glFuncName);
+ }
+
+ private void maybeDoSingleThreadedWorkaround(Runnable action) {
+ if (Threading.isSingleThreaded() &&
+ !Threading.isOpenGLThread()) {
+ Threading.invokeOnOpenGLThread(action);
+ } else {
+ action.run();
+ }
+ }
+
+ public void lockAWTForJava2D() {
+ }
+
+ public void unlockAWTForJava2D() {
+ }
+}
diff --git a/src/classes/com/sun/opengl/impl/macosx/MacOSXOffscreenGLContext.java b/src/classes/com/sun/opengl/impl/macosx/MacOSXOffscreenGLContext.java
new file mode 100644
index 000000000..c1d106da8
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/macosx/MacOSXOffscreenGLContext.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.macosx;
+
+import java.awt.image.BufferedImage;
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class MacOSXOffscreenGLContext extends MacOSXPbufferGLContext
+{
+ public MacOSXOffscreenGLContext(MacOSXPbufferGLDrawable drawable,
+ GLContext shareWith) {
+ super(drawable, shareWith);
+ }
+
+ public int getOffscreenContextPixelDataType() {
+ return GL.GL_UNSIGNED_INT_8_8_8_8_REV;
+ }
+
+ public int getOffscreenContextReadBuffer() {
+ return GL.GL_FRONT;
+ }
+
+ public boolean offscreenImageNeedsVerticalFlip() {
+ return true;
+ }
+}
diff --git a/src/native/jogl/BufferUtils.c b/src/classes/com/sun/opengl/impl/macosx/MacOSXOffscreenGLDrawable.java
index 7698b00ba..f478f43fc 100644
--- a/src/native/jogl/BufferUtils.c
+++ b/src/classes/com/sun/opengl/impl/macosx/MacOSXOffscreenGLDrawable.java
@@ -20,7 +20,7 @@
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
* ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
@@ -37,18 +37,25 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-#include <jni.h>
+package com.sun.opengl.impl.macosx;
-#ifdef _MSC_VER
- /* This typedef seems to be needed at least for VC6 and Visual Studio 2003 */
- #if _MSC_VER <= 1400
- typedef int intptr_t;
- #endif
-#else
- #include <inttypes.h>
-#endif
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
-JNIEXPORT jobject JNICALL
-Java_net_java_games_jogl_util_BufferUtils_bufferOffset0(JNIEnv* env, jclass unused, jint offset) {
- return (*env)->NewDirectByteBuffer(env, (void*) (intptr_t) offset, 0);
+public class MacOSXOffscreenGLDrawable extends MacOSXPbufferGLDrawable {
+
+ public MacOSXOffscreenGLDrawable(GLCapabilities capabilities) {
+ super(capabilities, 0, 0);
+ }
+
+ public GLContext createContext(GLContext shareWith) {
+ return new MacOSXOffscreenGLContext(this, shareWith);
+ }
+
+ public void setSize(int width, int height) {
+ destroy();
+ initWidth = width;
+ initHeight = height;
+ createPbuffer();
+ }
}
diff --git a/src/net/java/games/gluegen/CMethodBindingImplEmitter.java b/src/classes/com/sun/opengl/impl/macosx/MacOSXOnscreenGLContext.java
index 91789f027..9e20dd6dd 100644
--- a/src/net/java/games/gluegen/CMethodBindingImplEmitter.java
+++ b/src/classes/com/sun/opengl/impl/macosx/MacOSXOnscreenGLContext.java
@@ -37,63 +37,68 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen;
+package com.sun.opengl.impl.macosx;
import java.util.*;
-import java.io.*;
-import java.text.MessageFormat;
-public class CMethodBindingImplEmitter extends CMethodBindingEmitter
-{
- protected static final CommentEmitter defaultCImplCommentEmitter =
- new CImplCommentEmitter();
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
- public CMethodBindingImplEmitter(MethodBinding binding,
- boolean isOverloadedBinding,
- String javaPackageName,
- String javaClassName,
- boolean isJavaMethodStatic,
- PrintWriter output)
- {
- super(binding, isOverloadedBinding,
- javaPackageName, javaClassName,
- isJavaMethodStatic, output);
- setCommentEmitter(defaultCImplCommentEmitter);
- }
+public class MacOSXOnscreenGLContext extends MacOSXGLContext {
+ protected MacOSXOnscreenGLDrawable drawable;
- protected void emitName(PrintWriter writer)
- {
- super.emitName(writer);
- if (!getIsOverloadedBinding()) {
- writer.print("0");
- }
+ public MacOSXOnscreenGLContext(MacOSXOnscreenGLDrawable drawable,
+ GLContext shareWith) {
+ super(drawable, shareWith);
+ this.drawable = drawable;
}
- /**
- * Gets the mangled name for the binding, but assumes that this is an Impl
- * routine
- */
- protected String jniMangle(MethodBinding binding) {
- StringBuffer buf = new StringBuffer();
- buf.append(jniMangle(binding.getName()));
- buf.append("0");
- buf.append("__");
- for (int i = 0; i < binding.getNumArguments(); i++) {
- JavaType type = binding.getJavaArgumentType(i);
- Class c = type.getJavaClass();
- if (c != null) {
- jniMangle(c, buf);
+ protected int makeCurrentImpl() throws GLException {
+ try {
+ int lockRes = drawable.lockSurface();
+ if (lockRes == MacOSXOnscreenGLDrawable.LOCK_SURFACE_NOT_READY) {
+ return CONTEXT_NOT_CURRENT;
+ }
+ if (lockRes == MacOSXOnscreenGLDrawable.LOCK_SURFACE_CHANGED) {
+ super.destroy();
+ }
+ int ret = super.makeCurrentImpl();
+ if ((ret == CONTEXT_CURRENT) ||
+ (ret == CONTEXT_CURRENT_NEW)) {
+ // Assume the canvas might have been resized or moved and tell the OpenGL
+ // context to update itself. This used to be done only upon receiving a
+ // reshape event but that doesn't appear to be sufficient. An experiment
+ // was also done to add a HierarchyBoundsListener to the GLCanvas and
+ // do this updating only upon reshape of this component or reshape or movement
+ // of an ancestor, but this also wasn't sufficient and left garbage on the
+ // screen in some situations.
+ CGL.updateContext(nsContext, drawable.getView());
} else {
- // FIXME: add support for char* -> String conversion
- throw new RuntimeException("Unknown kind of JavaType: name="+type.getName());
+ // View might not have been ready
+ drawable.unlockSurface();
}
+ return ret;
+ } catch (RuntimeException e) {
+ try {
+ drawable.unlockSurface();
+ } catch (Exception e2) {
+ // do nothing if unlockSurface throws
+ }
+ throw(e);
}
- return buf.toString();
}
-
- protected static class CImplCommentEmitter extends CMethodBindingEmitter.DefaultCommentEmitter {
- protected void emitBeginning(FunctionEmitter methodEmitter, PrintWriter writer) {
- writer.print(" -- FIXME: PUT A COMMENT HERE -- ");
+
+ protected void releaseImpl() throws GLException {
+ try {
+ super.releaseImpl();
+ } finally {
+ drawable.unlockSurface();
+ }
+ }
+
+ public void swapBuffers() throws GLException {
+ if (!CGL.flushBuffer(nsContext, drawable.getView())) {
+ throw new GLException("Error swapping buffers");
}
}
}
diff --git a/src/classes/com/sun/opengl/impl/macosx/MacOSXOnscreenGLDrawable.java b/src/classes/com/sun/opengl/impl/macosx/MacOSXOnscreenGLDrawable.java
new file mode 100644
index 000000000..e7f6537b9
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/macosx/MacOSXOnscreenGLDrawable.java
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.macosx;
+
+import java.awt.Component;
+import java.lang.ref.WeakReference;
+import java.security.*;
+import java.util.*;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class MacOSXOnscreenGLDrawable extends MacOSXGLDrawable {
+ public static final int LOCK_SURFACE_NOT_READY = 1;
+ public static final int LOCK_SURFACE_CHANGED = 2;
+ public static final int LOCK_SUCCESS = 3;
+
+ private static JAWT jawt;
+ protected Component component;
+
+ private List/*<WeakReference<GLContext>>*/ createdContexts =
+ new ArrayList();
+
+ // Variables for lockSurface/unlockSurface
+ private JAWT_DrawingSurface ds;
+ private JAWT_DrawingSurfaceInfo dsi;
+ private JAWT_MacOSXDrawingSurfaceInfo macosxdsi;
+
+ // Indicates whether the component (if an onscreen context) has been
+ // realized. Plausibly, before the component is realized the JAWT
+ // should return an error or NULL object from some of its
+ // operations; this appears to be the case on Win32 but is not true
+ // at least with Sun's current X11 implementation (1.4.x), which
+ // crashes with no other error reported if the DrawingSurfaceInfo is
+ // fetched from a locked DrawingSurface during the validation as a
+ // result of calling show() on the main thread. To work around this
+ // we prevent any JAWT or OpenGL operations from being done until
+ // addNotify() is called on the component.
+ protected boolean realized;
+
+ // Workaround for instance of 4796548
+ private boolean firstLock = true;
+
+ public MacOSXOnscreenGLDrawable(Component component,
+ GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser) {
+ super(capabilities, chooser);
+ this.component = component;
+ }
+
+ public GLContext createContext(GLContext shareWith) {
+ MacOSXOnscreenGLContext context =
+ new MacOSXOnscreenGLContext(this, shareWith);
+ // NOTE: we need to keep track of the created contexts in order to
+ // implement swapBuffers() because of how Mac OS X implements its
+ // OpenGL window interface
+ synchronized (this) {
+ List newContexts = new ArrayList();
+ newContexts.addAll(createdContexts);
+ newContexts.add(new WeakReference(context));
+ createdContexts = newContexts;
+ }
+ return context;
+ }
+
+ public void setRealized(boolean realized) {
+ this.realized = realized;
+ }
+
+ public void setSize(int width, int height) {
+ component.setSize(width, height);
+ }
+
+ public int getWidth() {
+ return component.getWidth();
+ }
+
+ public int getHeight() {
+ return component.getHeight();
+ }
+
+ public void swapBuffers() throws GLException {
+ for (Iterator iter = createdContexts.iterator(); iter.hasNext(); ) {
+ WeakReference ref = (WeakReference) iter.next();
+ MacOSXOnscreenGLContext ctx = (MacOSXOnscreenGLContext) ref.get();
+ // FIXME: clear out unreachable contexts
+ if (ctx != null) {
+ ctx.swapBuffers();
+ }
+ }
+ }
+
+ public int lockSurface() throws GLException {
+ if (!realized) {
+ return LOCK_SURFACE_NOT_READY;
+ }
+ if (nsView != 0) {
+ throw new GLException("Surface already locked");
+ }
+ ds = getJAWT().GetDrawingSurface(component);
+ if (ds == null) {
+ // Widget not yet realized
+ return LOCK_SURFACE_NOT_READY;
+ }
+ int res = ds.Lock();
+ if ((res & JAWTFactory.JAWT_LOCK_ERROR) != 0) {
+ throw new GLException("Unable to lock surface");
+ }
+ // See whether the surface changed and if so destroy the old
+ // OpenGL context so it will be recreated (NOTE: removeNotify
+ // should handle this case, but it may be possible that race
+ // conditions can cause this code to be triggered -- should test
+ // more)
+ int ret = LOCK_SUCCESS;
+ if ((res & JAWTFactory.JAWT_LOCK_SURFACE_CHANGED) != 0) {
+ ret = LOCK_SURFACE_CHANGED;
+ }
+ if (firstLock) {
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ dsi = ds.GetDrawingSurfaceInfo();
+ return null;
+ }
+ });
+ } else {
+ dsi = ds.GetDrawingSurfaceInfo();
+ }
+ if (dsi == null) {
+ // Widget not yet realized
+ ds.Unlock();
+ getJAWT().FreeDrawingSurface(ds);
+ ds = null;
+ return LOCK_SURFACE_NOT_READY;
+ }
+ firstLock = false;
+ macosxdsi = (JAWT_MacOSXDrawingSurfaceInfo) dsi.platformInfo();
+ if (macosxdsi == null) {
+ // Widget not yet realized
+ ds.FreeDrawingSurfaceInfo(dsi);
+ ds.Unlock();
+ getJAWT().FreeDrawingSurface(ds);
+ ds = null;
+ dsi = null;
+ return LOCK_SURFACE_NOT_READY;
+ }
+ nsView = macosxdsi.cocoaViewRef();
+ if (nsView == 0) {
+ // Widget not yet realized
+ ds.FreeDrawingSurfaceInfo(dsi);
+ ds.Unlock();
+ getJAWT().FreeDrawingSurface(ds);
+ ds = null;
+ dsi = null;
+ macosxdsi = null;
+ return LOCK_SURFACE_NOT_READY;
+ }
+ return ret;
+ }
+
+ public void unlockSurface() throws GLException {
+ if (nsView == 0) {
+ throw new GLException("Surface already unlocked");
+ }
+ ds.FreeDrawingSurfaceInfo(dsi);
+ ds.Unlock();
+ getJAWT().FreeDrawingSurface(ds);
+ ds = null;
+ dsi = null;
+ macosxdsi = null;
+ nsView = 0;
+ }
+
+ //----------------------------------------------------------------------
+ // Internals only below this point
+ //
+
+ private JAWT getJAWT()
+ {
+ if (jawt == null)
+ {
+ JAWT j = new JAWT();
+ j.version(JAWTFactory.JAWT_VERSION_1_4);
+ if (!JAWTFactory.JAWT_GetAWT(j))
+ {
+ throw new RuntimeException("Unable to initialize JAWT");
+ }
+ jawt = j;
+ }
+ return jawt;
+ }
+} \ No newline at end of file
diff --git a/src/classes/com/sun/opengl/impl/macosx/MacOSXPbufferGLContext.java b/src/classes/com/sun/opengl/impl/macosx/MacOSXPbufferGLContext.java
new file mode 100644
index 000000000..048a256ea
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/macosx/MacOSXPbufferGLContext.java
@@ -0,0 +1,101 @@
+package com.sun.opengl.impl.macosx;
+
+import java.security.*;
+import java.util.*;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class MacOSXPbufferGLContext extends MacOSXGLContext {
+ protected MacOSXPbufferGLDrawable drawable;
+
+ // State for render-to-texture and render-to-texture-rectangle support
+ private int textureTarget; // e.g. GL_TEXTURE_2D, GL_TEXTURE_RECTANGLE_NV
+ private int texture; // actual texture object
+
+ private static boolean isTigerOrLater;
+
+ static {
+ String osVersion =
+ (String) AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ return System.getProperty("os.version");
+ }
+ });
+ StringTokenizer tok = new StringTokenizer(osVersion, ". ");
+ int major = Integer.parseInt(tok.nextToken());
+ int minor = Integer.parseInt(tok.nextToken());
+ isTigerOrLater = ((major > 10) || (minor > 3));
+ }
+
+ public MacOSXPbufferGLContext(MacOSXPbufferGLDrawable drawable,
+ GLContext shareWith) {
+ super(drawable, shareWith);
+ this.drawable = drawable;
+ }
+
+ public void bindPbufferToTexture() {
+ GL gl = getGL();
+ gl.glBindTexture(textureTarget, texture);
+ // FIXME: not clear whether this is really necessary, but since
+ // the API docs seem to imply it is and since it doesn't seem to
+ // impact performance, leaving it in
+ CGL.setContextTextureImageToPBuffer(nsContext, drawable.getPbuffer(), GL.GL_FRONT);
+ }
+
+ public void releasePbufferFromTexture() {
+ }
+
+ protected int makeCurrentImpl() throws GLException {
+ if (drawable.getPbuffer() == 0) {
+ if (DEBUG) {
+ System.err.println("Pbuffer not instantiated yet for " + this);
+ }
+ // pbuffer not instantiated yet
+ return CONTEXT_NOT_CURRENT;
+ }
+
+ int res = super.makeCurrentImpl();
+ if (res == CONTEXT_CURRENT_NEW) {
+ // Initialize render-to-texture support if requested
+ boolean rect = drawable.getCapabilities().getOffscreenRenderToTextureRectangle();
+ GL gl = getGL();
+ if (rect) {
+ if (!gl.isExtensionAvailable("GL_EXT_texture_rectangle")) {
+ System.err.println("MacOSXPbufferGLContext: WARNING: GL_EXT_texture_rectangle extension not " +
+ "supported; skipping requested render_to_texture_rectangle support for pbuffer");
+ rect = false;
+ }
+ }
+ textureTarget = (rect ? GL.GL_TEXTURE_RECTANGLE_EXT : GL.GL_TEXTURE_2D);
+ int[] tmp = new int[1];
+ gl.glGenTextures(1, tmp, 0);
+ texture = tmp[0];
+ gl.glBindTexture(textureTarget, texture);
+ gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
+ gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
+ gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP_TO_EDGE);
+ gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP_TO_EDGE);
+ gl.glCopyTexImage2D(textureTarget, 0, GL.GL_RGB, 0, 0, drawable.getWidth(), drawable.getHeight(), 0);
+ }
+ return res;
+ }
+
+ public int getFloatingPointMode() {
+ return GLPbuffer.APPLE_FLOAT;
+ }
+
+ protected boolean create() {
+ GLCapabilities capabilities = drawable.getCapabilities();
+ if (capabilities.getOffscreenFloatingPointBuffers() &&
+ !isTigerOrLater) {
+ throw new GLException("Floating-point pbuffers supported only on OS X 10.4 or later");
+ }
+ if (!super.create(true, capabilities.getOffscreenFloatingPointBuffers())) {
+ return false;
+ }
+ // Must now associate the pbuffer with our newly-created context
+ CGL.setContextPBuffer(nsContext, drawable.getPbuffer());
+ return true;
+ }
+}
diff --git a/src/classes/com/sun/opengl/impl/macosx/MacOSXPbufferGLDrawable.java b/src/classes/com/sun/opengl/impl/macosx/MacOSXPbufferGLDrawable.java
new file mode 100644
index 000000000..038b1d759
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/macosx/MacOSXPbufferGLDrawable.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.macosx;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class MacOSXPbufferGLDrawable extends MacOSXGLDrawable {
+ private static final boolean DEBUG = Debug.debug("MacOSXPbufferGLContext");
+
+ protected int initWidth;
+ protected int initHeight;
+
+ protected long pBuffer;
+
+ protected int width;
+ protected int height;
+
+ // State for render-to-texture and render-to-texture-rectangle support
+ private int textureTarget; // e.g. GL_TEXTURE_2D, GL_TEXTURE_RECTANGLE_NV
+ private int texture; // actual texture object
+
+ public MacOSXPbufferGLDrawable(GLCapabilities capabilities, int initialWidth, int initialHeight) {
+ super(capabilities, null);
+ this.initWidth = initialWidth;
+ this.initHeight = initialHeight;
+
+ createPbuffer();
+ }
+
+ public GLContext createContext(GLContext shareWith) {
+ return new MacOSXPbufferGLContext(this, shareWith);
+ }
+
+ public void destroy() {
+ if (this.pBuffer != 0) {
+ CGL.destroyPBuffer(0, pBuffer);
+ this.pBuffer = 0;
+
+ if (DEBUG) {
+ System.err.println("Destroyed pbuffer " + width + " x " + height);
+ }
+ }
+ }
+
+ public void setSize(int width, int height) {
+ // FIXME
+ throw new GLException("Not yet implemented");
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public int getHeight() {
+ return height;
+ }
+
+ public GLCapabilities getCapabilities() {
+ return capabilities;
+ }
+
+ public long getPbuffer() {
+ return pBuffer;
+ }
+
+ public void swapBuffers() throws GLException {
+ // FIXME: do we need to do anything if the pbuffer is double-buffered?
+ }
+
+ protected void createPbuffer() {
+ int renderTarget;
+ if (capabilities.getOffscreenRenderToTextureRectangle()) {
+ width = initWidth;
+ height = initHeight;
+ renderTarget = GL.GL_TEXTURE_RECTANGLE_EXT;
+ } else {
+ width = getNextPowerOf2(initWidth);
+ height = getNextPowerOf2(initHeight);
+ renderTarget = GL.GL_TEXTURE_2D;
+ }
+
+ int internalFormat = GL.GL_RGBA;
+ if (capabilities.getOffscreenFloatingPointBuffers()) {
+ // FIXME: want to check availability of GL_APPLE_float_pixels
+ // extension, but need valid OpenGL context in order to do so --
+ // in worst case would need to create dummy window / GLCanvas
+ // (undesirable) -- could maybe also do this with pbuffers
+ /*
+ if (!gl.isExtensionAvailable("GL_APPLE_float_pixels")) {
+ throw new GLException("Floating-point support (GL_APPLE_float_pixels) not available");
+ }
+ */
+ switch (capabilities.getRedBits()) {
+ case 16: internalFormat = GL.GL_RGBA_FLOAT16_APPLE; break;
+ case 32: internalFormat = GL.GL_RGBA_FLOAT32_APPLE; break;
+ default: throw new GLException("Invalid floating-point bit depth (only 16 and 32 supported)");
+ }
+ }
+
+ pBuffer = CGL.createPBuffer(renderTarget, internalFormat, width, height);
+ if (pBuffer == 0) {
+ throw new GLException("pbuffer creation error: CGL.createPBuffer() failed");
+ }
+
+ if (DEBUG) {
+ System.err.println("Created pbuffer 0x" + toHexString(pBuffer) + ", " + width + " x " + height + " for " + this);
+ }
+ }
+
+ private int getNextPowerOf2(int number) {
+ if (((number-1) & number) == 0) {
+ //ex: 8 -> 0b1000; 8-1=7 -> 0b0111; 0b1000&0b0111 == 0
+ return number;
+ }
+ int power = 0;
+ while (number > 0) {
+ number = number>>1;
+ power++;
+ }
+ return (1<<power);
+ }
+}
diff --git a/src/net/java/games/jogl/impl/mipmap/BuildMipmap.java b/src/classes/com/sun/opengl/impl/mipmap/BuildMipmap.java
index 9c9c3122b..4a499420f 100644
--- a/src/net/java/games/jogl/impl/mipmap/BuildMipmap.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/BuildMipmap.java
@@ -32,11 +32,11 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
-import net.java.games.jogl.GL;
-import net.java.games.jogl.GLU;
-import net.java.games.jogl.impl.Debug;
+import javax.media.opengl.GL;
+import javax.media.opengl.glu.GLU;
+import com.sun.opengl.impl.Debug;
import java.nio.*;
import java.io.*;
@@ -46,7 +46,8 @@ import java.io.*;
*/
public class BuildMipmap {
- private static boolean DEBUG = Debug.debug("BuildMipmap");
+ private static final boolean DEBUG = Debug.debug("BuildMipmap");
+ private static final boolean VERBOSE = Debug.verbose();
/** Creates a new instance of BuildMipmap */
public BuildMipmap() {
@@ -663,16 +664,18 @@ public class BuildMipmap {
gl.glTexImage2D( target, level, internalFormat, newwidth, newheight, 0, format, type, srcImage );
if (DEBUG) {
System.err.println("GL Error(" + level + "): " + gl.glGetError() );
- try {
- File file = new File( "glu2DMipmapJ" + level + ".bin" );
- FileOutputStream fos = new FileOutputStream( file );
- srcImage.limit( Mipmap.image_size( newwidth, newheight, format, type ) );
- fos.getChannel().write( srcImage );
- srcImage.clear();
- fos.close();
- } catch( IOException e ) {
- System.err.println("IOException");
- System.err.println(e.getMessage());
+ if (VERBOSE) {
+ try {
+ File file = new File( "glu2DMipmapJ" + level + ".bin" );
+ FileOutputStream fos = new FileOutputStream( file );
+ srcImage.limit( Mipmap.image_size( newwidth, newheight, format, type ) );
+ fos.getChannel().write( srcImage );
+ srcImage.clear();
+ fos.close();
+ } catch( IOException e ) {
+ System.err.println("IOException");
+ System.err.println(e.getMessage());
+ }
}
}
}
@@ -769,15 +772,17 @@ public class BuildMipmap {
gl.glTexImage2D( target, level, internalFormat, newwidth, newheight, 0, format, type, srcImage );
if (DEBUG) {
System.err.println("GL Error(" + level + "): " + gl.glGetError() );
- try {
- File file = new File( "glu2DMipmapJ" + level + ".bin" );
- FileOutputStream fos = new FileOutputStream( file );
- srcImage.limit( Mipmap.image_size( newwidth, newheight, format, type ) );
- fos.getChannel().write( srcImage );
- srcImage.clear();
- } catch( IOException e ) {
- System.err.println("IOException");
- System.err.println(e.getMessage());
+ if (VERBOSE) {
+ try {
+ File file = new File( "glu2DMipmapJ" + level + ".bin" );
+ FileOutputStream fos = new FileOutputStream( file );
+ srcImage.limit( Mipmap.image_size( newwidth, newheight, format, type ) );
+ fos.getChannel().write( srcImage );
+ srcImage.clear();
+ } catch( IOException e ) {
+ System.err.println("IOException");
+ System.err.println(e.getMessage());
+ }
}
}
}
@@ -817,15 +822,17 @@ public class BuildMipmap {
gl.glTexImage2D( target, level, internalFormat, newwidth, newheight, 0, format, type, newMipmapImage );
if (DEBUG) {
System.err.println("GL Error: " + gl.glGetError() );
- try {
- File file = new File( "glu2DMipmapJ" + level + ".bin" );
- FileOutputStream fos = new FileOutputStream( file );
- srcImage.limit( Mipmap.image_size( newwidth, newheight, format, type ) );
- fos.getChannel().write( newMipmapImage );
- srcImage.clear();
- } catch( IOException e ) {
- System.err.println("IOException");
- System.err.println(e.getMessage());
+ if (VERBOSE) {
+ try {
+ File file = new File( "glu2DMipmapJ" + level + ".bin" );
+ FileOutputStream fos = new FileOutputStream( file );
+ srcImage.limit( Mipmap.image_size( newwidth, newheight, format, type ) );
+ fos.getChannel().write( newMipmapImage );
+ srcImage.clear();
+ } catch( IOException e ) {
+ System.err.println("IOException");
+ System.err.println(e.getMessage());
+ }
}
}
}
diff --git a/src/net/java/games/jogl/impl/mipmap/Extract.java b/src/classes/com/sun/opengl/impl/mipmap/Extract.java
index c78bcd9ce..12362011e 100644
--- a/src/net/java/games/jogl/impl/mipmap/Extract.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Extract.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.ByteBuffer;
diff --git a/src/net/java/games/jogl/impl/mipmap/Extract1010102.java b/src/classes/com/sun/opengl/impl/mipmap/Extract1010102.java
index d6fcc5977..d337e5dcd 100644
--- a/src/net/java/games/jogl/impl/mipmap/Extract1010102.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Extract1010102.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.ByteBuffer;
diff --git a/src/net/java/games/jogl/impl/mipmap/Extract1555rev.java b/src/classes/com/sun/opengl/impl/mipmap/Extract1555rev.java
index 10a132417..1b8372e84 100644
--- a/src/net/java/games/jogl/impl/mipmap/Extract1555rev.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Extract1555rev.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.ByteBuffer;
diff --git a/src/net/java/games/jogl/impl/mipmap/Extract2101010rev.java b/src/classes/com/sun/opengl/impl/mipmap/Extract2101010rev.java
index 5d98f19a7..adef3d58d 100644
--- a/src/net/java/games/jogl/impl/mipmap/Extract2101010rev.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Extract2101010rev.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.ByteBuffer;
diff --git a/src/net/java/games/jogl/impl/mipmap/Extract233rev.java b/src/classes/com/sun/opengl/impl/mipmap/Extract233rev.java
index 46d45cbcb..1a3e9582e 100644
--- a/src/net/java/games/jogl/impl/mipmap/Extract233rev.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Extract233rev.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.ByteBuffer;
diff --git a/src/net/java/games/jogl/impl/mipmap/Extract332.java b/src/classes/com/sun/opengl/impl/mipmap/Extract332.java
index 6a3bcdc0a..e925a2cc1 100644
--- a/src/net/java/games/jogl/impl/mipmap/Extract332.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Extract332.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.ByteBuffer;
diff --git a/src/net/java/games/jogl/impl/mipmap/Extract4444.java b/src/classes/com/sun/opengl/impl/mipmap/Extract4444.java
index c2b5fc95f..b4dff1b72 100644
--- a/src/net/java/games/jogl/impl/mipmap/Extract4444.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Extract4444.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.*;
diff --git a/src/net/java/games/jogl/impl/mipmap/Extract4444rev.java b/src/classes/com/sun/opengl/impl/mipmap/Extract4444rev.java
index e8adf3004..761d057b1 100644
--- a/src/net/java/games/jogl/impl/mipmap/Extract4444rev.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Extract4444rev.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.*;
diff --git a/src/net/java/games/jogl/impl/mipmap/Extract5551.java b/src/classes/com/sun/opengl/impl/mipmap/Extract5551.java
index b7e3a027b..047298152 100644
--- a/src/net/java/games/jogl/impl/mipmap/Extract5551.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Extract5551.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.*;
diff --git a/src/net/java/games/jogl/impl/mipmap/Extract565.java b/src/classes/com/sun/opengl/impl/mipmap/Extract565.java
index 43158bb6c..c9346ecf6 100644
--- a/src/net/java/games/jogl/impl/mipmap/Extract565.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Extract565.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.*;
diff --git a/src/net/java/games/jogl/impl/mipmap/Extract565rev.java b/src/classes/com/sun/opengl/impl/mipmap/Extract565rev.java
index b6f3af966..9b0596b3f 100644
--- a/src/net/java/games/jogl/impl/mipmap/Extract565rev.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Extract565rev.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.*;
diff --git a/src/net/java/games/jogl/impl/mipmap/Extract8888.java b/src/classes/com/sun/opengl/impl/mipmap/Extract8888.java
index c013fae28..9f57bc39e 100644
--- a/src/net/java/games/jogl/impl/mipmap/Extract8888.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Extract8888.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.*;
diff --git a/src/net/java/games/jogl/impl/mipmap/Extract8888rev.java b/src/classes/com/sun/opengl/impl/mipmap/Extract8888rev.java
index 9104ed7b1..2c0d90595 100644
--- a/src/net/java/games/jogl/impl/mipmap/Extract8888rev.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Extract8888rev.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.*;
diff --git a/src/net/java/games/jogl/impl/mipmap/ExtractFloat.java b/src/classes/com/sun/opengl/impl/mipmap/ExtractFloat.java
index 3dad2de29..b1a0ee51e 100644
--- a/src/net/java/games/jogl/impl/mipmap/ExtractFloat.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/ExtractFloat.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.*;
diff --git a/src/net/java/games/jogl/impl/mipmap/ExtractPrimitive.java b/src/classes/com/sun/opengl/impl/mipmap/ExtractPrimitive.java
index 242d8f331..4ba6f734e 100644
--- a/src/net/java/games/jogl/impl/mipmap/ExtractPrimitive.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/ExtractPrimitive.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.ByteBuffer;
diff --git a/src/net/java/games/jogl/impl/mipmap/ExtractSByte.java b/src/classes/com/sun/opengl/impl/mipmap/ExtractSByte.java
index f925eb7bd..f8cfcda2e 100644
--- a/src/net/java/games/jogl/impl/mipmap/ExtractSByte.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/ExtractSByte.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.ByteBuffer;
diff --git a/src/net/java/games/jogl/impl/mipmap/ExtractSInt.java b/src/classes/com/sun/opengl/impl/mipmap/ExtractSInt.java
index c874c82f1..5411f6daa 100644
--- a/src/net/java/games/jogl/impl/mipmap/ExtractSInt.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/ExtractSInt.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.*;
diff --git a/src/net/java/games/jogl/impl/mipmap/ExtractSShort.java b/src/classes/com/sun/opengl/impl/mipmap/ExtractSShort.java
index 73a0f9c5e..ace44b3a9 100644
--- a/src/net/java/games/jogl/impl/mipmap/ExtractSShort.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/ExtractSShort.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.*;
diff --git a/src/net/java/games/jogl/impl/mipmap/ExtractUByte.java b/src/classes/com/sun/opengl/impl/mipmap/ExtractUByte.java
index 031aa74ce..0c0a2716b 100644
--- a/src/net/java/games/jogl/impl/mipmap/ExtractUByte.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/ExtractUByte.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.ByteBuffer;
diff --git a/src/net/java/games/jogl/impl/mipmap/ExtractUInt.java b/src/classes/com/sun/opengl/impl/mipmap/ExtractUInt.java
index b80afd41e..feba26f96 100644
--- a/src/net/java/games/jogl/impl/mipmap/ExtractUInt.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/ExtractUInt.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.*;
diff --git a/src/net/java/games/jogl/impl/mipmap/ExtractUShort.java b/src/classes/com/sun/opengl/impl/mipmap/ExtractUShort.java
index 130f2c833..1b7abd70b 100644
--- a/src/net/java/games/jogl/impl/mipmap/ExtractUShort.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/ExtractUShort.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.*;
diff --git a/src/net/java/games/jogl/impl/mipmap/HalveImage.java b/src/classes/com/sun/opengl/impl/mipmap/HalveImage.java
index ea12577b9..5e854c13d 100644
--- a/src/net/java/games/jogl/impl/mipmap/HalveImage.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/HalveImage.java
@@ -32,9 +32,9 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
-import net.java.games.jogl.GL;
+import javax.media.opengl.GL;
import java.nio.*;
/**
diff --git a/src/net/java/games/jogl/impl/mipmap/Image.java b/src/classes/com/sun/opengl/impl/mipmap/Image.java
index 1ea3b1f52..777434586 100644
--- a/src/net/java/games/jogl/impl/mipmap/Image.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Image.java
@@ -32,9 +32,9 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
-import net.java.games.jogl.GL;
+import javax.media.opengl.GL;
import java.nio.*;
/**
diff --git a/src/net/java/games/jogl/impl/mipmap/Mipmap.java b/src/classes/com/sun/opengl/impl/mipmap/Mipmap.java
index b3954704d..2b4a30edc 100644
--- a/src/net/java/games/jogl/impl/mipmap/Mipmap.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Mipmap.java
@@ -32,11 +32,11 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
-import net.java.games.jogl.GL;
-import net.java.games.jogl.GLU;
-import net.java.games.jogl.GLException;
+import javax.media.opengl.GL;
+import javax.media.opengl.glu.GLU;
+import javax.media.opengl.GLException;
import java.nio.*;
/**
@@ -263,23 +263,23 @@ public class Mipmap {
if( target == GL.GL_TEXTURE_2D || target == GL.GL_PROXY_TEXTURE_2D ) {
proxyTarget = GL.GL_PROXY_TEXTURE_2D;
gl.glTexImage2D( proxyTarget, 1, internalFormat, widthAtLevelOne,
- heightAtLevelOne, 0, format, type, (double[])null );
- } else if( (target == GL.GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB) ||
- (target == GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB) ||
- (target == GL.GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB) ||
- (target == GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB) ||
- (target == GL.GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB) ||
- (target == GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) ) {
- proxyTarget = GL.GL_PROXY_TEXTURE_CUBE_MAP_ARB;
+ heightAtLevelOne, 0, format, type, null );
+ } else if( (target == GL.GL_TEXTURE_CUBE_MAP_POSITIVE_X) ||
+ (target == GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_X) ||
+ (target == GL.GL_TEXTURE_CUBE_MAP_POSITIVE_Y) ||
+ (target == GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) ||
+ (target == GL.GL_TEXTURE_CUBE_MAP_POSITIVE_Z) ||
+ (target == GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z) ) {
+ proxyTarget = GL.GL_PROXY_TEXTURE_CUBE_MAP;
gl.glTexImage2D( proxyTarget, 1, internalFormat, widthAtLevelOne,
- heightAtLevelOne, 0, format, type, (double[])null );
+ heightAtLevelOne, 0, format, type, null );
} else {
assert( target == GL.GL_TEXTURE_1D || target == GL.GL_PROXY_TEXTURE_1D );
proxyTarget = GL.GL_PROXY_TEXTURE_1D;
gl.glTexImage1D( proxyTarget, 1, internalFormat, widthAtLevelOne,
- 0, format, type, (double[])null );
+ 0, format, type, null );
}
- gl.glGetTexLevelParameteriv( proxyTarget, 1, GL.GL_TEXTURE_WIDTH, proxyWidth );
+ gl.glGetTexLevelParameteriv( proxyTarget, 1, GL.GL_TEXTURE_WIDTH, proxyWidth, 0 );
// does it fit?
if( proxyWidth[0] == 0 ) { // nope, so try again with theses sizes
if( widthPowerOf2 == 1 && heightPowerOf2 == 1 ) {
@@ -308,7 +308,7 @@ public class Mipmap {
}
}
int[] maxsize = new int[1];
- gl.glGetIntegerv( GL.GL_MAX_TEXTURE_SIZE, maxsize );
+ gl.glGetIntegerv( GL.GL_MAX_TEXTURE_SIZE, maxsize , 0);
// clamp user's texture sizes to maximum sizes, if necessary
newWidth[0] = nearestPower( width );
if( newWidth[0] > maxsize[0] ) {
@@ -342,9 +342,9 @@ public class Mipmap {
if( target == GL.GL_TEXTURE_3D || target == GL.GL_PROXY_TEXTURE_3D ) {
proxyTarget = GL.GL_PROXY_TEXTURE_3D;
gl.glTexImage3D( proxyTarget, 1, internalFormat, widthAtLevelOne,
- heightAtLevelOne, depthAtLevelOne, 0, format, type, (double[])null );
+ heightAtLevelOne, depthAtLevelOne, 0, format, type, null );
}
- gl.glGetTexLevelParameteriv( proxyTarget, 1, GL.GL_TEXTURE_WIDTH, proxyWidth );
+ gl.glGetTexLevelParameteriv( proxyTarget, 1, GL.GL_TEXTURE_WIDTH, proxyWidth, 0 );
// does it fit
if( proxyWidth[0] == 0 ) {
if( widthPowerOf2 == 1 && heightPowerOf2 == 1 && depthPowerOf2 == 1 ) {
@@ -463,67 +463,67 @@ public class Mipmap {
public static void retrieveStoreModes( GL gl, PixelStorageModes psm ) {
int[] a = new int[1];
- gl.glGetIntegerv( GL.GL_UNPACK_ALIGNMENT, a );
+ gl.glGetIntegerv( GL.GL_UNPACK_ALIGNMENT, a, 0);
psm.setUnpackAlignment( a[0] );
- gl.glGetIntegerv( GL.GL_UNPACK_ROW_LENGTH, a );
+ gl.glGetIntegerv( GL.GL_UNPACK_ROW_LENGTH, a, 0);
psm.setUnpackRowLength( a[0] );
- gl.glGetIntegerv( GL.GL_UNPACK_SKIP_ROWS, a );
+ gl.glGetIntegerv( GL.GL_UNPACK_SKIP_ROWS, a, 0);
psm.setUnpackSkipRows( a[0] );
- gl.glGetIntegerv( GL.GL_UNPACK_SKIP_PIXELS, a );
+ gl.glGetIntegerv( GL.GL_UNPACK_SKIP_PIXELS, a, 0);
psm.setUnpackSkipPixels( a[0] );
- gl.glGetIntegerv( GL.GL_UNPACK_LSB_FIRST, a );
+ gl.glGetIntegerv( GL.GL_UNPACK_LSB_FIRST, a, 0);
psm.setUnpackLsbFirst( ( a[0] == 1 ) );
- gl.glGetIntegerv( GL.GL_UNPACK_SWAP_BYTES, a );
+ gl.glGetIntegerv( GL.GL_UNPACK_SWAP_BYTES, a, 0);
psm.setUnpackSwapBytes( ( a[0] == 1 ) );
- gl.glGetIntegerv( GL.GL_PACK_ALIGNMENT, a );
+ gl.glGetIntegerv( GL.GL_PACK_ALIGNMENT, a, 0);
psm.setPackAlignment( a[0] );
- gl.glGetIntegerv( GL.GL_PACK_ROW_LENGTH, a );
+ gl.glGetIntegerv( GL.GL_PACK_ROW_LENGTH, a, 0);
psm.setPackRowLength( a[0] );
- gl.glGetIntegerv( GL.GL_PACK_SKIP_ROWS, a );
+ gl.glGetIntegerv( GL.GL_PACK_SKIP_ROWS, a, 0);
psm.setPackSkipRows( a[0] );
- gl.glGetIntegerv( GL.GL_PACK_SKIP_PIXELS, a );
+ gl.glGetIntegerv( GL.GL_PACK_SKIP_PIXELS, a, 0);
psm.setPackSkipPixels( a[0] );
- gl.glGetIntegerv( GL.GL_PACK_LSB_FIRST, a );
+ gl.glGetIntegerv( GL.GL_PACK_LSB_FIRST, a, 0);
psm.setPackLsbFirst( ( a[0] == 1 ) );
- gl.glGetIntegerv( GL.GL_PACK_SWAP_BYTES, a );
+ gl.glGetIntegerv( GL.GL_PACK_SWAP_BYTES, a, 0);
psm.setPackSwapBytes( ( a[0] == 1 ) );
}
public static void retrieveStoreModes3D( GL gl, PixelStorageModes psm ) {
int[] a = new int[1];
- gl.glGetIntegerv( GL.GL_UNPACK_ALIGNMENT, a );
+ gl.glGetIntegerv( GL.GL_UNPACK_ALIGNMENT, a, 0);
psm.setUnpackAlignment( a[0] );
- gl.glGetIntegerv( GL.GL_UNPACK_ROW_LENGTH, a );
+ gl.glGetIntegerv( GL.GL_UNPACK_ROW_LENGTH, a, 0);
psm.setUnpackRowLength( a[0] );
- gl.glGetIntegerv( GL.GL_UNPACK_SKIP_ROWS, a );
+ gl.glGetIntegerv( GL.GL_UNPACK_SKIP_ROWS, a, 0);
psm.setUnpackSkipRows( a[0] );
- gl.glGetIntegerv( GL.GL_UNPACK_SKIP_PIXELS, a );
+ gl.glGetIntegerv( GL.GL_UNPACK_SKIP_PIXELS, a, 0);
psm.setUnpackSkipPixels( a[0] );
- gl.glGetIntegerv( GL.GL_UNPACK_LSB_FIRST, a );
+ gl.glGetIntegerv( GL.GL_UNPACK_LSB_FIRST, a, 0);
psm.setUnpackLsbFirst( ( a[0] == 1 ) );
- gl.glGetIntegerv( GL.GL_UNPACK_SWAP_BYTES, a );
+ gl.glGetIntegerv( GL.GL_UNPACK_SWAP_BYTES, a, 0);
psm.setUnpackSwapBytes( ( a[0] == 1 ) );
- gl.glGetIntegerv( GL.GL_UNPACK_SKIP_IMAGES, a );
+ gl.glGetIntegerv( GL.GL_UNPACK_SKIP_IMAGES, a, 0);
psm.setUnpackSkipImages( a[0] );
- gl.glGetIntegerv( GL.GL_UNPACK_IMAGE_HEIGHT, a );
+ gl.glGetIntegerv( GL.GL_UNPACK_IMAGE_HEIGHT, a, 0);
psm.setUnpackImageHeight( a[0] );
- gl.glGetIntegerv( GL.GL_PACK_ALIGNMENT, a );
+ gl.glGetIntegerv( GL.GL_PACK_ALIGNMENT, a, 0);
psm.setPackAlignment( a[0] );
- gl.glGetIntegerv( GL.GL_PACK_ROW_LENGTH, a );
+ gl.glGetIntegerv( GL.GL_PACK_ROW_LENGTH, a, 0);
psm.setPackRowLength( a[0] );
- gl.glGetIntegerv( GL.GL_PACK_SKIP_ROWS, a );
+ gl.glGetIntegerv( GL.GL_PACK_SKIP_ROWS, a, 0);
psm.setPackSkipRows( a[0] );
- gl.glGetIntegerv( GL.GL_PACK_SKIP_PIXELS, a );
+ gl.glGetIntegerv( GL.GL_PACK_SKIP_PIXELS, a, 0 );
psm.setPackSkipPixels( a[0] );
- gl.glGetIntegerv( GL.GL_PACK_LSB_FIRST, a );
+ gl.glGetIntegerv( GL.GL_PACK_LSB_FIRST, a, 0 );
psm.setPackLsbFirst( ( a[0] == 1 ) );
- gl.glGetIntegerv( GL.GL_PACK_SWAP_BYTES, a );
+ gl.glGetIntegerv( GL.GL_PACK_SWAP_BYTES, a, 0 );
psm.setPackSwapBytes( ( a[0] == 1 ) );
- gl.glGetIntegerv( GL.GL_PACK_SKIP_IMAGES, a );
+ gl.glGetIntegerv( GL.GL_PACK_SKIP_IMAGES, a, 0 );
psm.setPackSkipImages( a[0] );
- gl.glGetIntegerv( GL.GL_PACK_IMAGE_HEIGHT, a );
+ gl.glGetIntegerv( GL.GL_PACK_IMAGE_HEIGHT, a, 0 );
psm.setPackImageHeight( a[0] );
}
@@ -611,7 +611,8 @@ public class Mipmap {
return( BuildMipmap.gluBuild1DMipmapLevelsCore( gl, target, internalFormat,
width, widthPowerOf2[0], format, type, 0, 0, levels, data ) );
}
-
+
+
public static int gluBuild2DMipmapLevels( GL gl, int target, int internalFormat,
int width, int height, int format, int type, int userLevel,
int baseLevel, int maxLevel, Object data ) {
@@ -666,7 +667,8 @@ public class Mipmap {
width, height, width, height, format, type, userLevel, baseLevel,
maxLevel, buffer ) );
}
-
+
+
public static int gluBuild2DMipmaps( GL gl, int target, int internalFormat,
int width, int height, int format, int type, Object data ) {
int[] widthPowerOf2 = new int[1];
@@ -720,7 +722,8 @@ public class Mipmap {
width, height, widthPowerOf2[0], heightPowerOf2[0], format, type, 0,
0, levels, buffer ) );
}
-
+
+
public static int gluBuild3DMipmaps( GL gl, int target, int internalFormat,
int width, int height, int depth, int format, int type, ByteBuffer data ) {
int[] widthPowerOf2 = new int[1];
diff --git a/src/net/java/games/jogl/impl/mipmap/PixelStorageModes.java b/src/classes/com/sun/opengl/impl/mipmap/PixelStorageModes.java
index cc3b4ed47..990e4b90a 100644
--- a/src/net/java/games/jogl/impl/mipmap/PixelStorageModes.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/PixelStorageModes.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
/**
*
diff --git a/src/net/java/games/jogl/impl/mipmap/ScaleInternal.java b/src/classes/com/sun/opengl/impl/mipmap/ScaleInternal.java
index 06c8e582f..e000c2043 100644
--- a/src/net/java/games/jogl/impl/mipmap/ScaleInternal.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/ScaleInternal.java
@@ -32,10 +32,10 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
-import net.java.games.jogl.GLU;
-import net.java.games.jogl.GL;
+import javax.media.opengl.GL;
+import javax.media.opengl.glu.GLU;
import java.nio.*;
/**
@@ -334,6 +334,13 @@ public class ScaleInternal {
highx_float -= 1.0f;
highx_int++;
}
+
+ // Clamp to make sure we don't run off the right edge
+ if (highx_int > widthin - 1) {
+ int delta = (highx_int - widthin + 1);
+ lowx_int -= delta;
+ highx_int -= delta;
+ }
}
lowy_int = highy_int;
lowy_float = highy_float;
@@ -545,6 +552,13 @@ public class ScaleInternal {
highx_float -= 1.0f;
highx_int++;
}
+
+ // Clamp to make sure we don't run off the right edge
+ if (highx_int > widthin - 1) {
+ int delta = (highx_int - widthin + 1);
+ lowx_int -= delta;
+ highx_int -= delta;
+ }
}
lowy_int = highy_int;
lowy_float = highy_float;
@@ -819,6 +833,13 @@ public class ScaleInternal {
highx_float -= 1.0f;
highx_int++;
}
+
+ // Clamp to make sure we don't run off the right edge
+ if (highx_int > widthin - 1) {
+ int delta = (highx_int - widthin + 1);
+ lowx_int -= delta;
+ highx_int -= delta;
+ }
}
lowy_int = highy_int;
lowy_float = highy_float;
@@ -1109,6 +1130,13 @@ public class ScaleInternal {
highx_float -= 1.0f;
highx_int++;
}
+
+ // Clamp to make sure we don't run off the right edge
+ if (highx_int > widthin - 1) {
+ int delta = (highx_int - widthin + 1);
+ lowx_int -= delta;
+ highx_int -= delta;
+ }
}
lowy_int = highy_int;
lowy_float = highy_float;
@@ -1390,6 +1418,13 @@ public class ScaleInternal {
highx_float -= 1.0f;
highx_int++;
}
+
+ // Clamp to make sure we don't run off the right edge
+ if (highx_int > widthin - 1) {
+ int delta = (highx_int - widthin + 1);
+ lowx_int -= delta;
+ highx_int -= delta;
+ }
}
lowy_int = highy_int;
lowy_float = highy_float;
@@ -1680,6 +1715,13 @@ public class ScaleInternal {
highx_float -= 1.0f;
highx_int++;
}
+
+ // Clamp to make sure we don't run off the right edge
+ if (highx_int > widthin - 1) {
+ int delta = (highx_int - widthin + 1);
+ lowx_int -= delta;
+ highx_int -= delta;
+ }
}
lowy_int = highy_int;
lowy_float = highy_float;
@@ -1970,6 +2012,13 @@ public class ScaleInternal {
highx_float -= 1.0f;
highx_int++;
}
+
+ // Clamp to make sure we don't run off the right edge
+ if (highx_int > widthin - 1) {
+ int delta = (highx_int - widthin + 1);
+ lowx_int -= delta;
+ highx_int -= delta;
+ }
}
lowy_int = highy_int;
lowy_float = highy_float;
@@ -2196,6 +2245,13 @@ public class ScaleInternal {
highx_float -= 1.0f;
highx_int++;
}
+
+ // Clamp to make sure we don't run off the right edge
+ if (highx_int > widthIn - 1) {
+ int delta = (highx_int - widthIn + 1);
+ lowx_int -= delta;
+ highx_int -= delta;
+ }
}
lowy_int = highy_int;
lowy_float = highy_float;
diff --git a/src/net/java/games/jogl/impl/mipmap/Type_Widget.java b/src/classes/com/sun/opengl/impl/mipmap/Type_Widget.java
index f749d5348..0431748e9 100644
--- a/src/net/java/games/jogl/impl/mipmap/Type_Widget.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/Type_Widget.java
@@ -32,7 +32,7 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.mipmap;
+package com.sun.opengl.impl.mipmap;
import java.nio.*;
diff --git a/src/net/java/games/jogl/impl/nurbs/README-PORTING.txt b/src/classes/com/sun/opengl/impl/nurbs/README-PORTING.txt
index df5f41782..df5f41782 100755..100644
--- a/src/net/java/games/jogl/impl/nurbs/README-PORTING.txt
+++ b/src/classes/com/sun/opengl/impl/nurbs/README-PORTING.txt
diff --git a/src/net/java/games/jogl/impl/nurbs/internals/Arc.java b/src/classes/com/sun/opengl/impl/nurbs/internals/Arc.java
index 076c68b72..076c68b72 100755..100644
--- a/src/net/java/games/jogl/impl/nurbs/internals/Arc.java
+++ b/src/classes/com/sun/opengl/impl/nurbs/internals/Arc.java
diff --git a/src/net/java/games/jogl/impl/nurbs/internals/ArcTesselator.java b/src/classes/com/sun/opengl/impl/nurbs/internals/ArcTesselator.java
index cb77dfbd0..cb77dfbd0 100755..100644
--- a/src/net/java/games/jogl/impl/nurbs/internals/ArcTesselator.java
+++ b/src/classes/com/sun/opengl/impl/nurbs/internals/ArcTesselator.java
diff --git a/src/net/java/games/jogl/impl/nurbs/internals/Backend.java b/src/classes/com/sun/opengl/impl/nurbs/internals/Backend.java
index e99822f0b..e99822f0b 100755..100644
--- a/src/net/java/games/jogl/impl/nurbs/internals/Backend.java
+++ b/src/classes/com/sun/opengl/impl/nurbs/internals/Backend.java
diff --git a/src/net/java/games/jogl/impl/nurbs/internals/BasicCurveEvaluator.java b/src/classes/com/sun/opengl/impl/nurbs/internals/BasicCurveEvaluator.java
index 3aae3674b..3aae3674b 100755..100644
--- a/src/net/java/games/jogl/impl/nurbs/internals/BasicCurveEvaluator.java
+++ b/src/classes/com/sun/opengl/impl/nurbs/internals/BasicCurveEvaluator.java
diff --git a/src/net/java/games/jogl/impl/nurbs/internals/BasicSurfaceEvaluator.java b/src/classes/com/sun/opengl/impl/nurbs/internals/BasicSurfaceEvaluator.java
index f2b4a6679..f2b4a6679 100755..100644
--- a/src/net/java/games/jogl/impl/nurbs/internals/BasicSurfaceEvaluator.java
+++ b/src/classes/com/sun/opengl/impl/nurbs/internals/BasicSurfaceEvaluator.java
diff --git a/src/net/java/games/jogl/impl/nurbs/internals/BezierArc.java b/src/classes/com/sun/opengl/impl/nurbs/internals/BezierArc.java
index feac7d544..feac7d544 100755..100644
--- a/src/net/java/games/jogl/impl/nurbs/internals/BezierArc.java
+++ b/src/classes/com/sun/opengl/impl/nurbs/internals/BezierArc.java
diff --git a/src/net/java/games/jogl/impl/nurbs/internals/Bin.java b/src/classes/com/sun/opengl/impl/nurbs/internals/Bin.java
index 55bec5eae..55bec5eae 100755..100644
--- a/src/net/java/games/jogl/impl/nurbs/internals/Bin.java
+++ b/src/classes/com/sun/opengl/impl/nurbs/internals/Bin.java
diff --git a/src/net/java/games/jogl/impl/nurbs/internals/CachingEvaluator.java b/src/classes/com/sun/opengl/impl/nurbs/internals/CachingEvaluator.java
index c9c8c5cf9..c9c8c5cf9 100755..100644
--- a/src/net/java/games/jogl/impl/nurbs/internals/CachingEvaluator.java
+++ b/src/classes/com/sun/opengl/impl/nurbs/internals/CachingEvaluator.java
diff --git a/src/net/java/games/jogl/impl/nurbs/internals/Defines.java b/src/classes/com/sun/opengl/impl/nurbs/internals/Defines.java
index fc284abbd..fc284abbd 100755..100644
--- a/src/net/java/games/jogl/impl/nurbs/internals/Defines.java
+++ b/src/classes/com/sun/opengl/impl/nurbs/internals/Defines.java
diff --git a/src/net/java/games/jogl/impl/nurbs/internals/NurbsConsts.java b/src/classes/com/sun/opengl/impl/nurbs/internals/NurbsConsts.java
index 74c9c150c..74c9c150c 100755..100644
--- a/src/net/java/games/jogl/impl/nurbs/internals/NurbsConsts.java
+++ b/src/classes/com/sun/opengl/impl/nurbs/internals/NurbsConsts.java
diff --git a/src/net/java/games/jogl/impl/nurbs/internals/NurbsException.java b/src/classes/com/sun/opengl/impl/nurbs/internals/NurbsException.java
index 5453807cd..5453807cd 100755..100644
--- a/src/net/java/games/jogl/impl/nurbs/internals/NurbsException.java
+++ b/src/classes/com/sun/opengl/impl/nurbs/internals/NurbsException.java
diff --git a/src/net/java/games/jogl/impl/nurbs/internals/Subdivider.java b/src/classes/com/sun/opengl/impl/nurbs/internals/Subdivider.java
index 155b6b7ac..155b6b7ac 100755..100644
--- a/src/net/java/games/jogl/impl/nurbs/internals/Subdivider.java
+++ b/src/classes/com/sun/opengl/impl/nurbs/internals/Subdivider.java
diff --git a/src/net/java/games/jogl/impl/registry/Registry.java b/src/classes/com/sun/opengl/impl/registry/Registry.java
index ef9f868f3..d1f386d83 100644
--- a/src/net/java/games/jogl/impl/registry/Registry.java
+++ b/src/classes/com/sun/opengl/impl/registry/Registry.java
@@ -32,10 +32,10 @@
* compliant with the OpenGL(R) version 1.2.1 Specification.
*/
-package net.java.games.jogl.impl.registry;
+package com.sun.opengl.impl.registry;
import java.util.regex.*;
-import net.java.games.jogl.GLU;
+import javax.media.opengl.glu.GLU;
/**
*
@@ -56,7 +56,7 @@ public class Registry {
return( null );
}
- public static boolean gluCheckExtensions( String extName, String extString ) {
+ public static boolean gluCheckExtension( String extName, String extString ) {
if( extName == null || extString == null ) {
return( false );
}
diff --git a/src/net/java/games/jogl/impl/tesselator/ActiveRegion.java b/src/classes/com/sun/opengl/impl/tessellator/ActiveRegion.java
index a3b3f953a..b626157fe 100644
--- a/src/net/java/games/jogl/impl/tesselator/ActiveRegion.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/ActiveRegion.java
@@ -40,7 +40,7 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
class ActiveRegion {
GLUhalfEdge eUp; /* upper edge, directed right to left */
diff --git a/src/net/java/games/jogl/impl/tesselator/CachedVertex.java b/src/classes/com/sun/opengl/impl/tessellator/CachedVertex.java
index 3f8661d78..70260d615 100644
--- a/src/net/java/games/jogl/impl/tesselator/CachedVertex.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/CachedVertex.java
@@ -40,7 +40,7 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
class CachedVertex {
public double[] coords = new double[3];
diff --git a/src/net/java/games/jogl/impl/tesselator/Dict.java b/src/classes/com/sun/opengl/impl/tessellator/Dict.java
index 6d3d80d0c..84da2dda6 100644
--- a/src/net/java/games/jogl/impl/tesselator/Dict.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/Dict.java
@@ -40,7 +40,7 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
class Dict {
DictNode head;
diff --git a/src/net/java/games/jogl/impl/tesselator/DictNode.java b/src/classes/com/sun/opengl/impl/tessellator/DictNode.java
index da870b6d9..698121392 100644
--- a/src/net/java/games/jogl/impl/tesselator/DictNode.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/DictNode.java
@@ -40,7 +40,7 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
class DictNode {
Object key;
diff --git a/src/net/java/games/jogl/impl/tesselator/GLUface.java b/src/classes/com/sun/opengl/impl/tessellator/GLUface.java
index fa2449a5a..225c5460c 100644
--- a/src/net/java/games/jogl/impl/tesselator/GLUface.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/GLUface.java
@@ -40,7 +40,7 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
class GLUface {
public GLUface next; /* next face (never NULL) */
diff --git a/src/net/java/games/jogl/impl/tesselator/GLUhalfEdge.java b/src/classes/com/sun/opengl/impl/tessellator/GLUhalfEdge.java
index 8e2abcb78..d58df6278 100644
--- a/src/net/java/games/jogl/impl/tesselator/GLUhalfEdge.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/GLUhalfEdge.java
@@ -40,7 +40,7 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
@@ -50,10 +50,10 @@ class GLUhalfEdge {
public GLUhalfEdge Onext; /* next edge CCW around origin */
public GLUhalfEdge Lnext; /* next edge CCW around left face */
public GLUvertex Org; /* origin vertex (Overtex too long) */
- public net.java.games.jogl.impl.tesselator.GLUface Lface; /* left face */
+ public com.sun.opengl.impl.tessellator.GLUface Lface; /* left face */
/* Internal data (keep hidden) */
- public net.java.games.jogl.impl.tesselator.ActiveRegion activeRegion; /* a region with this upper edge (sweep.c) */
+ public com.sun.opengl.impl.tessellator.ActiveRegion activeRegion; /* a region with this upper edge (sweep.c) */
public int winding; /* change in winding number when crossing */
public boolean first;
diff --git a/src/net/java/games/jogl/impl/tesselator/GLUmesh.java b/src/classes/com/sun/opengl/impl/tessellator/GLUmesh.java
index 0ab3b2626..d1ed8286b 100644
--- a/src/net/java/games/jogl/impl/tesselator/GLUmesh.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/GLUmesh.java
@@ -40,13 +40,13 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
class GLUmesh {
GLUvertex vHead = new GLUvertex(); /* dummy header for vertex list */
- net.java.games.jogl.impl.tesselator.GLUface fHead = new GLUface(); /* dummy header for face list */
- net.java.games.jogl.impl.tesselator.GLUhalfEdge eHead = new GLUhalfEdge(true); /* dummy header for edge list */
- net.java.games.jogl.impl.tesselator.GLUhalfEdge eHeadSym = new GLUhalfEdge(false); /* and its symmetric counterpart */
+ com.sun.opengl.impl.tessellator.GLUface fHead = new GLUface(); /* dummy header for face list */
+ com.sun.opengl.impl.tessellator.GLUhalfEdge eHead = new GLUhalfEdge(true); /* dummy header for edge list */
+ com.sun.opengl.impl.tessellator.GLUhalfEdge eHeadSym = new GLUhalfEdge(false); /* and its symmetric counterpart */
}
diff --git a/src/net/java/games/jogl/impl/tesselator/GLUtesselatorImpl.java b/src/classes/com/sun/opengl/impl/tessellator/GLUtessellatorImpl.java
index 90de5bcc9..98a0fba3a 100644
--- a/src/net/java/games/jogl/impl/tesselator/GLUtesselatorImpl.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/GLUtessellatorImpl.java
@@ -40,12 +40,13 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.tesselator.*;
+import javax.media.opengl.*;
+import javax.media.opengl.glu.*;
+import com.sun.opengl.impl.tessellator.*;
-public class GLUtesselatorImpl implements GLUtesselator {
+public class GLUtessellatorImpl implements GLUtessellator {
public static final int TESS_MAX_CACHE = 100;
private int state; /* what begin/end calls have we seen? */
@@ -88,30 +89,30 @@ public class GLUtesselatorImpl implements GLUtesselator {
/*** rendering callbacks that also pass polygon data ***/
private Object polygonData; /* client data for current polygon */
- private GLUtesselatorCallback callBegin;
- private GLUtesselatorCallback callEdgeFlag;
- private GLUtesselatorCallback callVertex;
- private GLUtesselatorCallback callEnd;
-// private GLUtesselatorCallback callMesh;
- private GLUtesselatorCallback callError;
- private GLUtesselatorCallback callCombine;
-
- private GLUtesselatorCallback callBeginData;
- private GLUtesselatorCallback callEdgeFlagData;
- private GLUtesselatorCallback callVertexData;
- private GLUtesselatorCallback callEndData;
-// private GLUtesselatorCallback callMeshData;
- private GLUtesselatorCallback callErrorData;
- private GLUtesselatorCallback callCombineData;
+ private GLUtessellatorCallback callBegin;
+ private GLUtessellatorCallback callEdgeFlag;
+ private GLUtessellatorCallback callVertex;
+ private GLUtessellatorCallback callEnd;
+// private GLUtessellatorCallback callMesh;
+ private GLUtessellatorCallback callError;
+ private GLUtessellatorCallback callCombine;
+
+ private GLUtessellatorCallback callBeginData;
+ private GLUtessellatorCallback callEdgeFlagData;
+ private GLUtessellatorCallback callVertexData;
+ private GLUtessellatorCallback callEndData;
+// private GLUtessellatorCallback callMeshData;
+ private GLUtessellatorCallback callErrorData;
+ private GLUtessellatorCallback callCombineData;
private static final double GLU_TESS_DEFAULT_TOLERANCE = 0.0;
// private static final int GLU_TESS_MESH = 100112; /* void (*)(GLUmesh *mesh) */
- private static GLUtesselatorCallback NULL_CB = new GLUtesselatorCallbackAdapter();
+ private static GLUtessellatorCallback NULL_CB = new GLUtessellatorCallbackAdapter();
// #define MAX_FAST_ALLOC (MAX(sizeof(EdgePair), \
// MAX(sizeof(GLUvertex),sizeof(GLUface))))
- private GLUtesselatorImpl() {
+ private GLUtessellatorImpl() {
state = TessState.T_DORMANT;
normal[0] = 0;
@@ -145,9 +146,9 @@ public class GLUtesselatorImpl implements GLUtesselator {
}
}
- static public GLUtesselator gluNewTess()
+ static public GLUtessellator gluNewTess()
{
- return new GLUtesselatorImpl();
+ return new GLUtessellatorImpl();
}
@@ -231,12 +232,12 @@ public class GLUtesselatorImpl implements GLUtesselator {
}
/* Returns tessellator property */
- public void gluGetTessProperty(int which, double[] value) {
+ public void gluGetTessProperty(int which, double[] value, int value_offset) {
switch (which) {
case GLU.GLU_TESS_TOLERANCE:
/* tolerance should be in range [0..1] */
assert (0.0 <= relTolerance && relTolerance <= 1.0);
- value[0] = relTolerance;
+ value[value_offset] = relTolerance;
break;
case GLU.GLU_TESS_WINDING_RULE:
assert (windingRule == GLU.GLU_TESS_WINDING_ODD ||
@@ -244,14 +245,14 @@ public class GLUtesselatorImpl implements GLUtesselator {
windingRule == GLU.GLU_TESS_WINDING_POSITIVE ||
windingRule == GLU.GLU_TESS_WINDING_NEGATIVE ||
windingRule == GLU.GLU_TESS_WINDING_ABS_GEQ_TWO);
- value[0] = windingRule;
+ value[value_offset] = windingRule;
break;
case GLU.GLU_TESS_BOUNDARY_ONLY:
assert (boundaryOnly == true || boundaryOnly == false);
- value[0] = boundaryOnly ? 1 : 0;
+ value[value_offset] = boundaryOnly ? 1 : 0;
break;
default:
- value[0] = 0.0;
+ value[value_offset] = 0.0;
callErrorOrErrorData(GLU.GLU_INVALID_ENUM);
break;
}
@@ -263,7 +264,7 @@ public class GLUtesselatorImpl implements GLUtesselator {
normal[2] = z;
}
- public void gluTessCallback(int which, GLUtesselatorCallback aCallback) {
+ public void gluTessCallback(int which, GLUtessellatorCallback aCallback) {
switch (which) {
case GLU.GLU_TESS_BEGIN:
callBegin = aCallback == null ? NULL_CB : aCallback;
@@ -386,7 +387,7 @@ public class GLUtesselatorImpl implements GLUtesselator {
return true;
}
- public void gluTessVertex(double[] coords, Object vertexData) {
+ public void gluTessVertex(double[] coords, int coords_offset, Object vertexData) {
int i;
boolean tooLarge = false;
double x;
@@ -402,7 +403,7 @@ public class GLUtesselatorImpl implements GLUtesselator {
lastEdge = null;
}
for (i = 0; i < 3; ++i) {
- x = coords[i];
+ x = coords[i+coords_offset];
if (x < -GLU.GLU_TESS_MAX_COORD) {
x = -GLU.GLU_TESS_MAX_COORD;
tooLarge = true;
diff --git a/src/net/java/games/jogl/impl/tesselator/GLUvertex.java b/src/classes/com/sun/opengl/impl/tessellator/GLUvertex.java
index 6497aa2d7..05836beda 100644
--- a/src/net/java/games/jogl/impl/tesselator/GLUvertex.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/GLUvertex.java
@@ -40,12 +40,12 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
class GLUvertex {
public GLUvertex next; /* next vertex (never NULL) */
public GLUvertex prev; /* previous vertex (never NULL) */
- public net.java.games.jogl.impl.tesselator.GLUhalfEdge anEdge; /* a half-edge with this origin */
+ public com.sun.opengl.impl.tessellator.GLUhalfEdge anEdge; /* a half-edge with this origin */
public Object data; /* client's data */
/* Internal data (keep hidden) */
diff --git a/src/net/java/games/jogl/impl/tesselator/Geom.java b/src/classes/com/sun/opengl/impl/tessellator/Geom.java
index 9693b3a48..10e3d8050 100644
--- a/src/net/java/games/jogl/impl/tesselator/Geom.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/Geom.java
@@ -40,7 +40,7 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
class Geom {
private Geom() {
diff --git a/src/net/java/games/jogl/impl/tesselator/Mesh.java b/src/classes/com/sun/opengl/impl/tessellator/Mesh.java
index 4eee1f8ac..f5a81f65d 100644
--- a/src/net/java/games/jogl/impl/tesselator/Mesh.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/Mesh.java
@@ -40,7 +40,7 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
class Mesh {
private Mesh() {
@@ -51,19 +51,19 @@ class Mesh {
* No vertex or face structures are allocated, but these must be assigned
* before the current edge operation is completed.
*/
- static net.java.games.jogl.impl.tesselator.GLUhalfEdge MakeEdge(net.java.games.jogl.impl.tesselator.GLUhalfEdge eNext) {
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge eSym;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge ePrev;
+ static com.sun.opengl.impl.tessellator.GLUhalfEdge MakeEdge(com.sun.opengl.impl.tessellator.GLUhalfEdge eNext) {
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge eSym;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge ePrev;
// EdgePair * pair = (EdgePair *)
// memAlloc(sizeof(EdgePair));
// if (pair == NULL) return NULL;
//
// e = &pair - > e;
- e = new net.java.games.jogl.impl.tesselator.GLUhalfEdge(true);
+ e = new com.sun.opengl.impl.tessellator.GLUhalfEdge(true);
// eSym = &pair - > eSym;
- eSym = new net.java.games.jogl.impl.tesselator.GLUhalfEdge(false);
+ eSym = new com.sun.opengl.impl.tessellator.GLUhalfEdge(false);
/* Make sure eNext points to the first edge of the edge pair */
@@ -105,9 +105,9 @@ class Mesh {
* depending on whether a and b belong to different face or vertex rings.
* For more explanation see __gl_meshSplice() below.
*/
- static void Splice(net.java.games.jogl.impl.tesselator.GLUhalfEdge a, net.java.games.jogl.impl.tesselator.GLUhalfEdge b) {
- net.java.games.jogl.impl.tesselator.GLUhalfEdge aOnext = a.Onext;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge bOnext = b.Onext;
+ static void Splice(com.sun.opengl.impl.tessellator.GLUhalfEdge a, com.sun.opengl.impl.tessellator.GLUhalfEdge b) {
+ com.sun.opengl.impl.tessellator.GLUhalfEdge aOnext = a.Onext;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge bOnext = b.Onext;
aOnext.Sym.Lnext = b;
bOnext.Sym.Lnext = a;
@@ -121,11 +121,11 @@ class Mesh {
* the new vertex *before* vNext so that algorithms which walk the vertex
* list will not see the newly created vertices.
*/
- static void MakeVertex(net.java.games.jogl.impl.tesselator.GLUvertex newVertex,
- net.java.games.jogl.impl.tesselator.GLUhalfEdge eOrig, net.java.games.jogl.impl.tesselator.GLUvertex vNext) {
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e;
- net.java.games.jogl.impl.tesselator.GLUvertex vPrev;
- net.java.games.jogl.impl.tesselator.GLUvertex vNew = newVertex;
+ static void MakeVertex(com.sun.opengl.impl.tessellator.GLUvertex newVertex,
+ com.sun.opengl.impl.tessellator.GLUhalfEdge eOrig, com.sun.opengl.impl.tessellator.GLUvertex vNext) {
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e;
+ com.sun.opengl.impl.tessellator.GLUvertex vPrev;
+ com.sun.opengl.impl.tessellator.GLUvertex vNew = newVertex;
assert (vNew != null);
@@ -154,10 +154,10 @@ class Mesh {
* the new face *before* fNext so that algorithms which walk the face
* list will not see the newly created faces.
*/
- static void MakeFace(net.java.games.jogl.impl.tesselator.GLUface newFace, net.java.games.jogl.impl.tesselator.GLUhalfEdge eOrig, net.java.games.jogl.impl.tesselator.GLUface fNext) {
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e;
- net.java.games.jogl.impl.tesselator.GLUface fPrev;
- net.java.games.jogl.impl.tesselator.GLUface fNew = newFace;
+ static void MakeFace(com.sun.opengl.impl.tessellator.GLUface newFace, com.sun.opengl.impl.tessellator.GLUhalfEdge eOrig, com.sun.opengl.impl.tessellator.GLUface fNext) {
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e;
+ com.sun.opengl.impl.tessellator.GLUface fPrev;
+ com.sun.opengl.impl.tessellator.GLUface fNew = newFace;
assert (fNew != null);
@@ -189,8 +189,8 @@ class Mesh {
/* KillEdge( eDel ) destroys an edge (the half-edges eDel and eDel->Sym),
* and removes from the global edge list.
*/
- static void KillEdge(net.java.games.jogl.impl.tesselator.GLUhalfEdge eDel) {
- net.java.games.jogl.impl.tesselator.GLUhalfEdge ePrev, eNext;
+ static void KillEdge(com.sun.opengl.impl.tessellator.GLUhalfEdge eDel) {
+ com.sun.opengl.impl.tessellator.GLUhalfEdge ePrev, eNext;
/* Half-edges are allocated in pairs, see EdgePair above */
if (!eDel.first) {
@@ -208,9 +208,9 @@ class Mesh {
/* KillVertex( vDel ) destroys a vertex and removes it from the global
* vertex list. It updates the vertex loop to point to a given new vertex.
*/
- static void KillVertex(net.java.games.jogl.impl.tesselator.GLUvertex vDel, net.java.games.jogl.impl.tesselator.GLUvertex newOrg) {
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e, eStart = vDel.anEdge;
- net.java.games.jogl.impl.tesselator.GLUvertex vPrev, vNext;
+ static void KillVertex(com.sun.opengl.impl.tessellator.GLUvertex vDel, com.sun.opengl.impl.tessellator.GLUvertex newOrg) {
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e, eStart = vDel.anEdge;
+ com.sun.opengl.impl.tessellator.GLUvertex vPrev, vNext;
/* change the origin of all affected edges */
e = eStart;
@@ -229,9 +229,9 @@ class Mesh {
/* KillFace( fDel ) destroys a face and removes it from the global face
* list. It updates the face loop to point to a given new face.
*/
- static void KillFace(net.java.games.jogl.impl.tesselator.GLUface fDel, net.java.games.jogl.impl.tesselator.GLUface newLface) {
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e, eStart = fDel.anEdge;
- net.java.games.jogl.impl.tesselator.GLUface fPrev, fNext;
+ static void KillFace(com.sun.opengl.impl.tessellator.GLUface fDel, com.sun.opengl.impl.tessellator.GLUface newLface) {
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e, eStart = fDel.anEdge;
+ com.sun.opengl.impl.tessellator.GLUface fPrev, fNext;
/* change the left face of all affected edges */
e = eStart;
@@ -253,11 +253,11 @@ class Mesh {
/* __gl_meshMakeEdge creates one edge, two vertices, and a loop (face).
* The loop consists of the two new half-edges.
*/
- public static net.java.games.jogl.impl.tesselator.GLUhalfEdge __gl_meshMakeEdge(net.java.games.jogl.impl.tesselator.GLUmesh mesh) {
- net.java.games.jogl.impl.tesselator.GLUvertex newVertex1 = new net.java.games.jogl.impl.tesselator.GLUvertex();
- net.java.games.jogl.impl.tesselator.GLUvertex newVertex2 = new net.java.games.jogl.impl.tesselator.GLUvertex();
- net.java.games.jogl.impl.tesselator.GLUface newFace = new net.java.games.jogl.impl.tesselator.GLUface();
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e;
+ public static com.sun.opengl.impl.tessellator.GLUhalfEdge __gl_meshMakeEdge(com.sun.opengl.impl.tessellator.GLUmesh mesh) {
+ com.sun.opengl.impl.tessellator.GLUvertex newVertex1 = new com.sun.opengl.impl.tessellator.GLUvertex();
+ com.sun.opengl.impl.tessellator.GLUvertex newVertex2 = new com.sun.opengl.impl.tessellator.GLUvertex();
+ com.sun.opengl.impl.tessellator.GLUface newFace = new com.sun.opengl.impl.tessellator.GLUface();
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e;
e = MakeEdge(mesh.eHead);
if (e == null) return null;
@@ -292,7 +292,7 @@ class Mesh {
* If eDst == eOrg->Onext, the new vertex will have a single edge.
* If eDst == eOrg->Oprev, the old vertex will have a single edge.
*/
- public static boolean __gl_meshSplice(net.java.games.jogl.impl.tesselator.GLUhalfEdge eOrg, net.java.games.jogl.impl.tesselator.GLUhalfEdge eDst) {
+ public static boolean __gl_meshSplice(com.sun.opengl.impl.tessellator.GLUhalfEdge eOrg, com.sun.opengl.impl.tessellator.GLUhalfEdge eDst) {
boolean joiningLoops = false;
boolean joiningVertices = false;
@@ -313,7 +313,7 @@ class Mesh {
Splice(eDst, eOrg);
if (!joiningVertices) {
- net.java.games.jogl.impl.tesselator.GLUvertex newVertex = new net.java.games.jogl.impl.tesselator.GLUvertex();
+ com.sun.opengl.impl.tessellator.GLUvertex newVertex = new com.sun.opengl.impl.tessellator.GLUvertex();
/* We split one vertex into two -- the new vertex is eDst.Org.
* Make sure the old vertex points to a valid half-edge.
@@ -322,7 +322,7 @@ class Mesh {
eOrg.Org.anEdge = eOrg;
}
if (!joiningLoops) {
- net.java.games.jogl.impl.tesselator.GLUface newFace = new net.java.games.jogl.impl.tesselator.GLUface();
+ com.sun.opengl.impl.tessellator.GLUface newFace = new com.sun.opengl.impl.tessellator.GLUface();
/* We split one loop into two -- the new loop is eDst.Lface.
* Make sure the old face points to a valid half-edge.
@@ -345,8 +345,8 @@ class Mesh {
* plus a few calls to memFree, but this would allocate and delete
* unnecessary vertices and faces.
*/
- static boolean __gl_meshDelete(net.java.games.jogl.impl.tesselator.GLUhalfEdge eDel) {
- net.java.games.jogl.impl.tesselator.GLUhalfEdge eDelSym = eDel.Sym;
+ static boolean __gl_meshDelete(com.sun.opengl.impl.tessellator.GLUhalfEdge eDel) {
+ com.sun.opengl.impl.tessellator.GLUhalfEdge eDelSym = eDel.Sym;
boolean joiningLoops = false;
/* First step: disconnect the origin vertex eDel.Org. We make all
@@ -367,7 +367,7 @@ class Mesh {
Splice(eDel, eDel.Sym.Lnext);
if (!joiningLoops) {
- net.java.games.jogl.impl.tesselator.GLUface newFace = new net.java.games.jogl.impl.tesselator.GLUface();
+ com.sun.opengl.impl.tessellator.GLUface newFace = new com.sun.opengl.impl.tessellator.GLUface();
/* We are splitting one loop into two -- create a new loop for eDel. */
MakeFace(newFace, eDel, eDel.Lface);
@@ -405,9 +405,9 @@ class Mesh {
* eNew == eOrg.Lnext, and eNew.Dst is a newly created vertex.
* eOrg and eNew will have the same left face.
*/
- static net.java.games.jogl.impl.tesselator.GLUhalfEdge __gl_meshAddEdgeVertex(net.java.games.jogl.impl.tesselator.GLUhalfEdge eOrg) {
- net.java.games.jogl.impl.tesselator.GLUhalfEdge eNewSym;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge eNew = MakeEdge(eOrg);
+ static com.sun.opengl.impl.tessellator.GLUhalfEdge __gl_meshAddEdgeVertex(com.sun.opengl.impl.tessellator.GLUhalfEdge eOrg) {
+ com.sun.opengl.impl.tessellator.GLUhalfEdge eNewSym;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge eNew = MakeEdge(eOrg);
eNewSym = eNew.Sym;
@@ -417,7 +417,7 @@ class Mesh {
/* Set the vertex and face information */
eNew.Org = eOrg.Sym.Org;
{
- net.java.games.jogl.impl.tesselator.GLUvertex newVertex = new net.java.games.jogl.impl.tesselator.GLUvertex();
+ com.sun.opengl.impl.tessellator.GLUvertex newVertex = new com.sun.opengl.impl.tessellator.GLUvertex();
MakeVertex(newVertex, eNewSym, eNew.Org);
}
@@ -431,9 +431,9 @@ class Mesh {
* such that eNew == eOrg.Lnext. The new vertex is eOrg.Sym.Org == eNew.Org.
* eOrg and eNew will have the same left face.
*/
- public static net.java.games.jogl.impl.tesselator.GLUhalfEdge __gl_meshSplitEdge(net.java.games.jogl.impl.tesselator.GLUhalfEdge eOrg) {
- net.java.games.jogl.impl.tesselator.GLUhalfEdge eNew;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge tempHalfEdge = __gl_meshAddEdgeVertex(eOrg);
+ public static com.sun.opengl.impl.tessellator.GLUhalfEdge __gl_meshSplitEdge(com.sun.opengl.impl.tessellator.GLUhalfEdge eOrg) {
+ com.sun.opengl.impl.tessellator.GLUhalfEdge eNew;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge tempHalfEdge = __gl_meshAddEdgeVertex(eOrg);
eNew = tempHalfEdge.Sym;
@@ -462,10 +462,10 @@ class Mesh {
* If (eOrg.Lnext == eDst), the old face is reduced to a single edge.
* If (eOrg.Lnext.Lnext == eDst), the old face is reduced to two edges.
*/
- static net.java.games.jogl.impl.tesselator.GLUhalfEdge __gl_meshConnect(net.java.games.jogl.impl.tesselator.GLUhalfEdge eOrg, net.java.games.jogl.impl.tesselator.GLUhalfEdge eDst) {
- net.java.games.jogl.impl.tesselator.GLUhalfEdge eNewSym;
+ static com.sun.opengl.impl.tessellator.GLUhalfEdge __gl_meshConnect(com.sun.opengl.impl.tessellator.GLUhalfEdge eOrg, com.sun.opengl.impl.tessellator.GLUhalfEdge eDst) {
+ com.sun.opengl.impl.tessellator.GLUhalfEdge eNewSym;
boolean joiningLoops = false;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge eNew = MakeEdge(eOrg);
+ com.sun.opengl.impl.tessellator.GLUhalfEdge eNew = MakeEdge(eOrg);
eNewSym = eNew.Sym;
@@ -488,7 +488,7 @@ class Mesh {
eOrg.Lface.anEdge = eNewSym;
if (!joiningLoops) {
- net.java.games.jogl.impl.tesselator.GLUface newFace = new net.java.games.jogl.impl.tesselator.GLUface();
+ com.sun.opengl.impl.tessellator.GLUface newFace = new com.sun.opengl.impl.tessellator.GLUface();
/* We split one loop into two -- the new loop is eNew.Lface */
MakeFace(newFace, eNew, eOrg.Lface);
@@ -506,10 +506,10 @@ class Mesh {
* An entire mesh can be deleted by zapping its faces, one at a time,
* in any order. Zapped faces cannot be used in further mesh operations!
*/
- static void __gl_meshZapFace(net.java.games.jogl.impl.tesselator.GLUface fZap) {
- net.java.games.jogl.impl.tesselator.GLUhalfEdge eStart = fZap.anEdge;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e, eNext, eSym;
- net.java.games.jogl.impl.tesselator.GLUface fPrev, fNext;
+ static void __gl_meshZapFace(com.sun.opengl.impl.tessellator.GLUface fZap) {
+ com.sun.opengl.impl.tessellator.GLUhalfEdge eStart = fZap.anEdge;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e, eNext, eSym;
+ com.sun.opengl.impl.tessellator.GLUface fPrev, fNext;
/* walk around face, deleting edges whose right face is also null */
eNext = eStart.Lnext;
@@ -551,12 +551,12 @@ class Mesh {
/* __gl_meshNewMesh() creates a new mesh with no edges, no vertices,
* and no loops (what we usually call a "face").
*/
- public static net.java.games.jogl.impl.tesselator.GLUmesh __gl_meshNewMesh() {
- net.java.games.jogl.impl.tesselator.GLUvertex v;
- net.java.games.jogl.impl.tesselator.GLUface f;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge eSym;
- net.java.games.jogl.impl.tesselator.GLUmesh mesh = new net.java.games.jogl.impl.tesselator.GLUmesh();
+ public static com.sun.opengl.impl.tessellator.GLUmesh __gl_meshNewMesh() {
+ com.sun.opengl.impl.tessellator.GLUvertex v;
+ com.sun.opengl.impl.tessellator.GLUface f;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge eSym;
+ com.sun.opengl.impl.tessellator.GLUmesh mesh = new com.sun.opengl.impl.tessellator.GLUmesh();
v = mesh.vHead;
f = mesh.fHead;
@@ -599,13 +599,13 @@ class Mesh {
/* __gl_meshUnion( mesh1, mesh2 ) forms the union of all structures in
* both meshes, and returns the new mesh (the old meshes are destroyed).
*/
- static net.java.games.jogl.impl.tesselator.GLUmesh __gl_meshUnion(net.java.games.jogl.impl.tesselator.GLUmesh mesh1, net.java.games.jogl.impl.tesselator.GLUmesh mesh2) {
- net.java.games.jogl.impl.tesselator.GLUface f1 = mesh1.fHead;
- net.java.games.jogl.impl.tesselator.GLUvertex v1 = mesh1.vHead;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e1 = mesh1.eHead;
- net.java.games.jogl.impl.tesselator.GLUface f2 = mesh2.fHead;
- net.java.games.jogl.impl.tesselator.GLUvertex v2 = mesh2.vHead;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e2 = mesh2.eHead;
+ static com.sun.opengl.impl.tessellator.GLUmesh __gl_meshUnion(com.sun.opengl.impl.tessellator.GLUmesh mesh1, com.sun.opengl.impl.tessellator.GLUmesh mesh2) {
+ com.sun.opengl.impl.tessellator.GLUface f1 = mesh1.fHead;
+ com.sun.opengl.impl.tessellator.GLUvertex v1 = mesh1.vHead;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e1 = mesh1.eHead;
+ com.sun.opengl.impl.tessellator.GLUface f2 = mesh2.fHead;
+ com.sun.opengl.impl.tessellator.GLUvertex v2 = mesh2.vHead;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e2 = mesh2.eHead;
/* Add the faces, vertices, and edges of mesh2 to those of mesh1 */
if (f2.next != f2) {
@@ -635,8 +635,8 @@ class Mesh {
/* __gl_meshDeleteMesh( mesh ) will free all storage for any valid mesh.
*/
- static void __gl_meshDeleteMeshZap(net.java.games.jogl.impl.tesselator.GLUmesh mesh) {
- net.java.games.jogl.impl.tesselator.GLUface fHead = mesh.fHead;
+ static void __gl_meshDeleteMeshZap(com.sun.opengl.impl.tessellator.GLUmesh mesh) {
+ com.sun.opengl.impl.tessellator.GLUface fHead = mesh.fHead;
while (fHead.next != fHead) {
__gl_meshZapFace(fHead.next);
@@ -646,10 +646,10 @@ class Mesh {
/* __gl_meshDeleteMesh( mesh ) will free all storage for any valid mesh.
*/
- public static void __gl_meshDeleteMesh(net.java.games.jogl.impl.tesselator.GLUmesh mesh) {
- net.java.games.jogl.impl.tesselator.GLUface f, fNext;
- net.java.games.jogl.impl.tesselator.GLUvertex v, vNext;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e, eNext;
+ public static void __gl_meshDeleteMesh(com.sun.opengl.impl.tessellator.GLUmesh mesh) {
+ com.sun.opengl.impl.tessellator.GLUface f, fNext;
+ com.sun.opengl.impl.tessellator.GLUvertex v, vNext;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e, eNext;
for (f = mesh.fHead.next; f != mesh.fHead; f = fNext) {
fNext = f.next;
@@ -667,13 +667,13 @@ class Mesh {
/* __gl_meshCheckMesh( mesh ) checks a mesh for self-consistency.
*/
- public static void __gl_meshCheckMesh(net.java.games.jogl.impl.tesselator.GLUmesh mesh) {
- net.java.games.jogl.impl.tesselator.GLUface fHead = mesh.fHead;
- net.java.games.jogl.impl.tesselator.GLUvertex vHead = mesh.vHead;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge eHead = mesh.eHead;
- net.java.games.jogl.impl.tesselator.GLUface f, fPrev;
- net.java.games.jogl.impl.tesselator.GLUvertex v, vPrev;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e, ePrev;
+ public static void __gl_meshCheckMesh(com.sun.opengl.impl.tessellator.GLUmesh mesh) {
+ com.sun.opengl.impl.tessellator.GLUface fHead = mesh.fHead;
+ com.sun.opengl.impl.tessellator.GLUvertex vHead = mesh.vHead;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge eHead = mesh.eHead;
+ com.sun.opengl.impl.tessellator.GLUface f, fPrev;
+ com.sun.opengl.impl.tessellator.GLUvertex v, vPrev;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e, ePrev;
fPrev = fHead;
for (fPrev = fHead; (f = fPrev.next) != fHead; fPrev = f) {
diff --git a/src/net/java/games/jogl/impl/tesselator/Normal.java b/src/classes/com/sun/opengl/impl/tessellator/Normal.java
index 900219662..98d4c50a1 100644
--- a/src/net/java/games/jogl/impl/tesselator/Normal.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/Normal.java
@@ -40,9 +40,10 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
-import net.java.games.jogl.*;
+import javax.media.opengl.*;
+import javax.media.opengl.glu.*;
class Normal {
private Normal() {
@@ -98,18 +99,18 @@ class Normal {
return i;
}
- static void ComputeNormal(GLUtesselatorImpl tess, double[] norm) {
- net.java.games.jogl.impl.tesselator.GLUvertex v, v1, v2;
+ static void ComputeNormal(GLUtessellatorImpl tess, double[] norm) {
+ com.sun.opengl.impl.tessellator.GLUvertex v, v1, v2;
double c, tLen2, maxLen2;
double[] maxVal, minVal, d1, d2, tNorm;
- net.java.games.jogl.impl.tesselator.GLUvertex[] maxVert, minVert;
- net.java.games.jogl.impl.tesselator.GLUvertex vHead = tess.mesh.vHead;
+ com.sun.opengl.impl.tessellator.GLUvertex[] maxVert, minVert;
+ com.sun.opengl.impl.tessellator.GLUvertex vHead = tess.mesh.vHead;
int i;
maxVal = new double[3];
minVal = new double[3];
- minVert = new net.java.games.jogl.impl.tesselator.GLUvertex[3];
- maxVert = new net.java.games.jogl.impl.tesselator.GLUvertex[3];
+ minVert = new com.sun.opengl.impl.tessellator.GLUvertex[3];
+ maxVert = new com.sun.opengl.impl.tessellator.GLUvertex[3];
d1 = new double[3];
d2 = new double[3];
tNorm = new double[3];
@@ -181,11 +182,11 @@ class Normal {
}
}
- static void CheckOrientation(GLUtesselatorImpl tess) {
+ static void CheckOrientation(GLUtessellatorImpl tess) {
double area;
- net.java.games.jogl.impl.tesselator.GLUface f, fHead = tess.mesh.fHead;
- net.java.games.jogl.impl.tesselator.GLUvertex v, vHead = tess.mesh.vHead;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e;
+ com.sun.opengl.impl.tessellator.GLUface f, fHead = tess.mesh.fHead;
+ com.sun.opengl.impl.tessellator.GLUvertex v, vHead = tess.mesh.vHead;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e;
/* When we compute the normal automatically, we choose the orientation
* so that the the sum of the signed areas of all contours is non-negative.
@@ -213,8 +214,8 @@ class Normal {
/* Determine the polygon normal and project vertices onto the plane
* of the polygon.
*/
- public static void __gl_projectPolygon(GLUtesselatorImpl tess) {
- net.java.games.jogl.impl.tesselator.GLUvertex v, vHead = tess.mesh.vHead;
+ public static void __gl_projectPolygon(GLUtessellatorImpl tess) {
+ com.sun.opengl.impl.tessellator.GLUvertex v, vHead = tess.mesh.vHead;
double w;
double[] norm = new double[3];
double[] sUnit, tUnit;
diff --git a/src/net/java/games/jogl/impl/tesselator/PriorityQ.java b/src/classes/com/sun/opengl/impl/tessellator/PriorityQ.java
index 0f92dcecd..84c00eb82 100644
--- a/src/net/java/games/jogl/impl/tesselator/PriorityQ.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/PriorityQ.java
@@ -40,7 +40,7 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
abstract class PriorityQ {
public static final int INIT_SIZE = 32;
@@ -66,7 +66,7 @@ abstract class PriorityQ {
/* Violates modularity, but a little faster */
// #include "geom.h"
public static boolean LEQ(Leq leq, Object x, Object y) {
- return net.java.games.jogl.impl.tesselator.Geom.VertLeq((net.java.games.jogl.impl.tesselator.GLUvertex) x, (net.java.games.jogl.impl.tesselator.GLUvertex) y);
+ return com.sun.opengl.impl.tessellator.Geom.VertLeq((com.sun.opengl.impl.tessellator.GLUvertex) x, (com.sun.opengl.impl.tessellator.GLUvertex) y);
}
static PriorityQ pqNewPriorityQ(Leq leq) {
diff --git a/src/net/java/games/jogl/impl/tesselator/PriorityQHeap.java b/src/classes/com/sun/opengl/impl/tessellator/PriorityQHeap.java
index b360e37d3..f220a207e 100644
--- a/src/net/java/games/jogl/impl/tesselator/PriorityQHeap.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/PriorityQHeap.java
@@ -40,27 +40,27 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
-class PriorityQHeap extends net.java.games.jogl.impl.tesselator.PriorityQ {
- net.java.games.jogl.impl.tesselator.PriorityQ.PQnode[] nodes;
- net.java.games.jogl.impl.tesselator.PriorityQ.PQhandleElem[] handles;
+class PriorityQHeap extends com.sun.opengl.impl.tessellator.PriorityQ {
+ com.sun.opengl.impl.tessellator.PriorityQ.PQnode[] nodes;
+ com.sun.opengl.impl.tessellator.PriorityQ.PQhandleElem[] handles;
int size, max;
int freeList;
boolean initialized;
- net.java.games.jogl.impl.tesselator.PriorityQ.Leq leq;
+ com.sun.opengl.impl.tessellator.PriorityQ.Leq leq;
/* really __gl_pqHeapNewPriorityQ */
- public PriorityQHeap(net.java.games.jogl.impl.tesselator.PriorityQ.Leq leq) {
+ public PriorityQHeap(com.sun.opengl.impl.tessellator.PriorityQ.Leq leq) {
size = 0;
- max = net.java.games.jogl.impl.tesselator.PriorityQ.INIT_SIZE;
- nodes = new net.java.games.jogl.impl.tesselator.PriorityQ.PQnode[net.java.games.jogl.impl.tesselator.PriorityQ.INIT_SIZE + 1];
+ max = com.sun.opengl.impl.tessellator.PriorityQ.INIT_SIZE;
+ nodes = new com.sun.opengl.impl.tessellator.PriorityQ.PQnode[com.sun.opengl.impl.tessellator.PriorityQ.INIT_SIZE + 1];
for (int i = 0; i < nodes.length; i++) {
nodes[i] = new PQnode();
}
- handles = new net.java.games.jogl.impl.tesselator.PriorityQ.PQhandleElem[net.java.games.jogl.impl.tesselator.PriorityQ.INIT_SIZE + 1];
+ handles = new com.sun.opengl.impl.tessellator.PriorityQ.PQhandleElem[com.sun.opengl.impl.tessellator.PriorityQ.INIT_SIZE + 1];
for (int i = 0; i < handles.length; i++) {
handles[i] = new PQhandleElem();
}
@@ -79,8 +79,8 @@ class PriorityQHeap extends net.java.games.jogl.impl.tesselator.PriorityQ {
}
void FloatDown(int curr) {
- net.java.games.jogl.impl.tesselator.PriorityQ.PQnode[] n = nodes;
- net.java.games.jogl.impl.tesselator.PriorityQ.PQhandleElem[] h = handles;
+ com.sun.opengl.impl.tessellator.PriorityQ.PQnode[] n = nodes;
+ com.sun.opengl.impl.tessellator.PriorityQ.PQhandleElem[] h = handles;
int hCurr, hChild;
int child;
@@ -108,8 +108,8 @@ class PriorityQHeap extends net.java.games.jogl.impl.tesselator.PriorityQ {
void FloatUp(int curr) {
- net.java.games.jogl.impl.tesselator.PriorityQ.PQnode[] n = nodes;
- net.java.games.jogl.impl.tesselator.PriorityQ.PQhandleElem[] h = handles;
+ com.sun.opengl.impl.tessellator.PriorityQ.PQnode[] n = nodes;
+ com.sun.opengl.impl.tessellator.PriorityQ.PQhandleElem[] h = handles;
int hCurr, hParent;
int parent;
@@ -150,8 +150,8 @@ class PriorityQHeap extends net.java.games.jogl.impl.tesselator.PriorityQ {
curr = ++size;
if ((curr * 2) > max) {
- net.java.games.jogl.impl.tesselator.PriorityQ.PQnode[] saveNodes = nodes;
- net.java.games.jogl.impl.tesselator.PriorityQ.PQhandleElem[] saveHandles = handles;
+ com.sun.opengl.impl.tessellator.PriorityQ.PQnode[] saveNodes = nodes;
+ com.sun.opengl.impl.tessellator.PriorityQ.PQhandleElem[] saveHandles = handles;
/* If the heap overflows, double its size. */
max <<= 1;
@@ -200,8 +200,8 @@ class PriorityQHeap extends net.java.games.jogl.impl.tesselator.PriorityQ {
/* really __gl_pqHeapExtractMin */
Object pqExtractMin() {
- net.java.games.jogl.impl.tesselator.PriorityQ.PQnode[] n = nodes;
- net.java.games.jogl.impl.tesselator.PriorityQ.PQhandleElem[] h = handles;
+ com.sun.opengl.impl.tessellator.PriorityQ.PQnode[] n = nodes;
+ com.sun.opengl.impl.tessellator.PriorityQ.PQhandleElem[] h = handles;
int hMin = n[1].handle;
Object min = h[hMin].key;
@@ -222,8 +222,8 @@ class PriorityQHeap extends net.java.games.jogl.impl.tesselator.PriorityQ {
/* really __gl_pqHeapDelete */
void pqDelete(int hCurr) {
- net.java.games.jogl.impl.tesselator.PriorityQ.PQnode[] n = nodes;
- net.java.games.jogl.impl.tesselator.PriorityQ.PQhandleElem[] h = handles;
+ com.sun.opengl.impl.tessellator.PriorityQ.PQnode[] n = nodes;
+ com.sun.opengl.impl.tessellator.PriorityQ.PQhandleElem[] h = handles;
int curr;
assert (hCurr >= 1 && hCurr <= max && h[hCurr].key != null);
diff --git a/src/net/java/games/jogl/impl/tesselator/PriorityQSort.java b/src/classes/com/sun/opengl/impl/tessellator/PriorityQSort.java
index d37580ff2..426c2d4ca 100644
--- a/src/net/java/games/jogl/impl/tesselator/PriorityQSort.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/PriorityQSort.java
@@ -35,12 +35,12 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
-class PriorityQSort extends net.java.games.jogl.impl.tesselator.PriorityQ {
- net.java.games.jogl.impl.tesselator.PriorityQHeap heap;
+class PriorityQSort extends com.sun.opengl.impl.tessellator.PriorityQ {
+ com.sun.opengl.impl.tessellator.PriorityQHeap heap;
Object[] keys;
// JAVA: 'order' contains indices into the keys array.
@@ -49,15 +49,15 @@ class PriorityQSort extends net.java.games.jogl.impl.tesselator.PriorityQ {
int[] order;
int size, max;
boolean initialized;
- net.java.games.jogl.impl.tesselator.PriorityQ.Leq leq;
+ com.sun.opengl.impl.tessellator.PriorityQ.Leq leq;
- public PriorityQSort(net.java.games.jogl.impl.tesselator.PriorityQ.Leq leq) {
- heap = new net.java.games.jogl.impl.tesselator.PriorityQHeap(leq);
+ public PriorityQSort(com.sun.opengl.impl.tessellator.PriorityQ.Leq leq) {
+ heap = new com.sun.opengl.impl.tessellator.PriorityQHeap(leq);
- keys = new Object[net.java.games.jogl.impl.tesselator.PriorityQ.INIT_SIZE];
+ keys = new Object[com.sun.opengl.impl.tessellator.PriorityQ.INIT_SIZE];
size = 0;
- max = net.java.games.jogl.impl.tesselator.PriorityQ.INIT_SIZE;
+ max = com.sun.opengl.impl.tessellator.PriorityQ.INIT_SIZE;
initialized = false;
this.leq = leq;
}
@@ -69,12 +69,12 @@ class PriorityQSort extends net.java.games.jogl.impl.tesselator.PriorityQ {
keys = null;
}
- private static boolean LT(net.java.games.jogl.impl.tesselator.PriorityQ.Leq leq, Object x, Object y) {
- return (!net.java.games.jogl.impl.tesselator.PriorityQHeap.LEQ(leq, y, x));
+ private static boolean LT(com.sun.opengl.impl.tessellator.PriorityQ.Leq leq, Object x, Object y) {
+ return (!com.sun.opengl.impl.tessellator.PriorityQHeap.LEQ(leq, y, x));
}
- private static boolean GT(net.java.games.jogl.impl.tesselator.PriorityQ.Leq leq, Object x, Object y) {
- return (!net.java.games.jogl.impl.tesselator.PriorityQHeap.LEQ(leq, x, y));
+ private static boolean GT(com.sun.opengl.impl.tessellator.PriorityQ.Leq leq, Object x, Object y) {
+ return (!com.sun.opengl.impl.tessellator.PriorityQHeap.LEQ(leq, x, y));
}
private static void Swap(int[] array, int a, int b) {
@@ -241,7 +241,7 @@ class PriorityQSort extends net.java.games.jogl.impl.tesselator.PriorityQ {
sortMin = keys[order[size - 1]];
if (!heap.pqIsEmpty()) {
heapMin = heap.pqMinimum();
- if (net.java.games.jogl.impl.tesselator.PriorityQHeap.LEQ(leq, heapMin, sortMin)) {
+ if (com.sun.opengl.impl.tessellator.PriorityQHeap.LEQ(leq, heapMin, sortMin)) {
return heapMin;
}
}
diff --git a/src/net/java/games/jogl/impl/tesselator/Render.java b/src/classes/com/sun/opengl/impl/tessellator/Render.java
index 4763992b8..a7a126a4c 100644
--- a/src/net/java/games/jogl/impl/tesselator/Render.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/Render.java
@@ -40,9 +40,10 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
-import net.java.games.jogl.*;
+import javax.media.opengl.*;
+import javax.media.opengl.glu.*;
class Render {
private static final boolean USE_OPTIMIZED_CODE_PATH = false;
@@ -62,19 +63,19 @@ class Render {
public FaceCount() {
}
- public FaceCount(long size, net.java.games.jogl.impl.tesselator.GLUhalfEdge eStart, renderCallBack render) {
+ public FaceCount(long size, com.sun.opengl.impl.tessellator.GLUhalfEdge eStart, renderCallBack render) {
this.size = size;
this.eStart = eStart;
this.render = render;
}
long size; /* number of triangles used */
- net.java.games.jogl.impl.tesselator.GLUhalfEdge eStart; /* edge where this primitive starts */
+ com.sun.opengl.impl.tessellator.GLUhalfEdge eStart; /* edge where this primitive starts */
renderCallBack render;
};
private static interface renderCallBack {
- void render(GLUtesselatorImpl tess, net.java.games.jogl.impl.tesselator.GLUhalfEdge e, long size);
+ void render(GLUtessellatorImpl tess, com.sun.opengl.impl.tessellator.GLUhalfEdge e, long size);
}
/************************ Strips and Fans decomposition ******************/
@@ -86,8 +87,8 @@ class Render {
*
* The rendering output is provided as callbacks (see the api).
*/
- public static void __gl_renderMesh(GLUtesselatorImpl tess, net.java.games.jogl.impl.tesselator.GLUmesh mesh) {
- net.java.games.jogl.impl.tesselator.GLUface f;
+ public static void __gl_renderMesh(GLUtessellatorImpl tess, com.sun.opengl.impl.tessellator.GLUmesh mesh) {
+ com.sun.opengl.impl.tessellator.GLUface f;
/* Make a list of separate triangles so we can render them all at once */
tess.lonelyTriList = null;
@@ -113,7 +114,7 @@ class Render {
}
- static void RenderMaximumFaceGroup(GLUtesselatorImpl tess, net.java.games.jogl.impl.tesselator.GLUface fOrig) {
+ static void RenderMaximumFaceGroup(GLUtessellatorImpl tess, com.sun.opengl.impl.tessellator.GLUface fOrig) {
/* We want to find the largest triangle fan or strip of unmarked faces
* which includes the given face fOrig. There are 3 possible fans
* passing through fOrig (one centered at each vertex), and 3 possible
@@ -121,7 +122,7 @@ class Render {
* is to try all of these, and take the primitive which uses the most
* triangles (a greedy approach).
*/
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e = fOrig.anEdge;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e = fOrig.anEdge;
FaceCount max = new FaceCount();
FaceCount newFace = new FaceCount();
@@ -167,17 +168,17 @@ class Render {
* more complicated, and we need a general tracking method like the
* one here.
*/
- private static boolean Marked(net.java.games.jogl.impl.tesselator.GLUface f) {
+ private static boolean Marked(com.sun.opengl.impl.tessellator.GLUface f) {
return !f.inside || f.marked;
}
- private static GLUface AddToTrail(net.java.games.jogl.impl.tesselator.GLUface f, net.java.games.jogl.impl.tesselator.GLUface t) {
+ private static GLUface AddToTrail(com.sun.opengl.impl.tessellator.GLUface f, com.sun.opengl.impl.tessellator.GLUface t) {
f.trail = t;
f.marked = true;
return f;
}
- private static void FreeTrail(net.java.games.jogl.impl.tesselator.GLUface t) {
+ private static void FreeTrail(com.sun.opengl.impl.tessellator.GLUface t) {
if (true) {
while (t != null) {
t.marked = false;
@@ -188,14 +189,14 @@ class Render {
}
}
- static FaceCount MaximumFan(net.java.games.jogl.impl.tesselator.GLUhalfEdge eOrig) {
+ static FaceCount MaximumFan(com.sun.opengl.impl.tessellator.GLUhalfEdge eOrig) {
/* eOrig.Lface is the face we want to render. We want to find the size
* of a maximal fan around eOrig.Org. To do this we just walk around
* the origin vertex as far as possible in both directions.
*/
FaceCount newFace = new FaceCount(0, null, renderFan);
- net.java.games.jogl.impl.tesselator.GLUface trail = null;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e;
+ com.sun.opengl.impl.tessellator.GLUface trail = null;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e;
for (e = eOrig; !Marked(e.Lface); e = e.Onext) {
trail = AddToTrail(e.Lface, trail);
@@ -216,7 +217,7 @@ class Render {
return (n & 0x1L) == 0;
}
- static FaceCount MaximumStrip(net.java.games.jogl.impl.tesselator.GLUhalfEdge eOrig) {
+ static FaceCount MaximumStrip(com.sun.opengl.impl.tessellator.GLUhalfEdge eOrig) {
/* Here we are looking for a maximal strip that contains the vertices
* eOrig.Org, eOrig.Dst, eOrig.Lnext.Dst (in that order or the
* reverse, such that all triangles are oriented CCW).
@@ -229,8 +230,8 @@ class Render {
*/
FaceCount newFace = new FaceCount(0, null, renderStrip);
long headSize = 0, tailSize = 0;
- net.java.games.jogl.impl.tesselator.GLUface trail = null;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e, eTail, eHead;
+ com.sun.opengl.impl.tessellator.GLUface trail = null;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e, eTail, eHead;
for (e = eOrig; !Marked(e.Lface); ++tailSize, e = e.Onext) {
trail = AddToTrail(e.Lface, trail);
@@ -268,7 +269,7 @@ class Render {
}
private static class RenderTriangle implements renderCallBack {
- public void render(GLUtesselatorImpl tess, net.java.games.jogl.impl.tesselator.GLUhalfEdge e, long size) {
+ public void render(GLUtessellatorImpl tess, com.sun.opengl.impl.tessellator.GLUhalfEdge e, long size) {
/* Just add the triangle to a triangle list, so we can render all
* the separate triangles at once.
*/
@@ -278,11 +279,11 @@ class Render {
}
- static void RenderLonelyTriangles(GLUtesselatorImpl tess, net.java.games.jogl.impl.tesselator.GLUface f) {
+ static void RenderLonelyTriangles(GLUtessellatorImpl tess, com.sun.opengl.impl.tessellator.GLUface f) {
/* Now we render all the separate triangles which could not be
* grouped into a triangle fan or strip.
*/
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e;
int newState;
int edgeState = -1; /* force edge state output for first vertex */
@@ -312,7 +313,7 @@ class Render {
}
private static class RenderFan implements renderCallBack {
- public void render(GLUtesselatorImpl tess, net.java.games.jogl.impl.tesselator.GLUhalfEdge e, long size) {
+ public void render(GLUtessellatorImpl tess, com.sun.opengl.impl.tessellator.GLUhalfEdge e, long size) {
/* Render as many CCW triangles as possible in a fan starting from
* edge "e". The fan *should* contain exactly "size" triangles
* (otherwise we've goofed up somewhere).
@@ -334,7 +335,7 @@ class Render {
}
private static class RenderStrip implements renderCallBack {
- public void render(GLUtesselatorImpl tess, net.java.games.jogl.impl.tesselator.GLUhalfEdge e, long size) {
+ public void render(GLUtessellatorImpl tess, com.sun.opengl.impl.tessellator.GLUhalfEdge e, long size) {
/* Render as many CCW triangles as possible in a strip starting from
* edge "e". The strip *should* contain exactly "size" triangles
* (otherwise we've goofed up somewhere).
@@ -367,9 +368,9 @@ class Render {
* contour for each face marked "inside". The rendering output is
* provided as callbacks (see the api).
*/
- public static void __gl_renderBoundary(GLUtesselatorImpl tess, net.java.games.jogl.impl.tesselator.GLUmesh mesh) {
- net.java.games.jogl.impl.tesselator.GLUface f;
- net.java.games.jogl.impl.tesselator.GLUhalfEdge e;
+ public static void __gl_renderBoundary(GLUtessellatorImpl tess, com.sun.opengl.impl.tessellator.GLUmesh mesh) {
+ com.sun.opengl.impl.tessellator.GLUface f;
+ com.sun.opengl.impl.tessellator.GLUhalfEdge e;
for (f = mesh.fHead.next; f != mesh.fHead; f = f.next) {
if (f.inside) {
@@ -389,7 +390,7 @@ class Render {
private static final int SIGN_INCONSISTENT = 2;
- static int ComputeNormal(GLUtesselatorImpl tess, double[] norm, boolean check)
+ static int ComputeNormal(GLUtessellatorImpl tess, double[] norm, boolean check)
/*
* If check==false, we compute the polygon normal and place it in norm[].
* If check==true, we check that each triangle in the fan from v0 has a
@@ -398,7 +399,7 @@ class Render {
* are degenerate return 0; otherwise (no consistent orientation) return
* SIGN_INCONSISTENT.
*/ {
- net.java.games.jogl.impl.tesselator.CachedVertex[] v = tess.cache;
+ com.sun.opengl.impl.tessellator.CachedVertex[] v = tess.cache;
// CachedVertex vn = v0 + tess.cacheCount;
int vn = tess.cacheCount;
// CachedVertex vc;
@@ -476,8 +477,8 @@ class Render {
* Returns true if the polygon was successfully rendered. The rendering
* output is provided as callbacks (see the api).
*/
- public static boolean __gl_renderCache(GLUtesselatorImpl tess) {
- net.java.games.jogl.impl.tesselator.CachedVertex[] v = tess.cache;
+ public static boolean __gl_renderCache(GLUtessellatorImpl tess) {
+ com.sun.opengl.impl.tessellator.CachedVertex[] v = tess.cache;
// CachedVertex vn = v0 + tess.cacheCount;
int vn = tess.cacheCount;
// CachedVertex vc;
diff --git a/src/net/java/games/jogl/impl/tesselator/Sweep.java b/src/classes/com/sun/opengl/impl/tessellator/Sweep.java
index 3674d12e1..901207d31 100644
--- a/src/net/java/games/jogl/impl/tesselator/Sweep.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/Sweep.java
@@ -40,18 +40,19 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
-import net.java.games.jogl.*;
+import javax.media.opengl.*;
+import javax.media.opengl.glu.*;
class Sweep {
private Sweep() {
}
// #ifdef FOR_TRITE_TEST_PROGRAM
-// extern void DebugEvent( GLUtesselator *tess );
+// extern void DebugEvent( GLUtessellator *tess );
// #else
- private static void DebugEvent(GLUtesselatorImpl tess) {
+ private static void DebugEvent(GLUtessellatorImpl tess) {
}
// #endif
@@ -103,7 +104,7 @@ class Sweep {
return ((ActiveRegion) Dict.dictKey(Dict.dictSucc(r.nodeUp)));
}
- static boolean EdgeLeq(GLUtesselatorImpl tess, ActiveRegion reg1, ActiveRegion reg2)
+ static boolean EdgeLeq(GLUtessellatorImpl tess, ActiveRegion reg1, ActiveRegion reg2)
/*
* Both edges must be directed from right to left (this is the canonical
* direction for the upper edge of each region).
@@ -145,7 +146,7 @@ class Sweep {
}
- static void DeleteRegion(GLUtesselatorImpl tess, ActiveRegion reg) {
+ static void DeleteRegion(GLUtessellatorImpl tess, ActiveRegion reg) {
if (reg.fixUpperEdge) {
/* It was created with zero winding number, so it better be
* deleted with zero winding number (ie. it better not get merged
@@ -202,7 +203,7 @@ class Sweep {
return reg;
}
- static ActiveRegion AddRegionBelow(GLUtesselatorImpl tess,
+ static ActiveRegion AddRegionBelow(GLUtessellatorImpl tess,
ActiveRegion regAbove,
GLUhalfEdge eNewUp)
/*
@@ -226,7 +227,7 @@ class Sweep {
return regNew;
}
- static boolean IsWindingInside(GLUtesselatorImpl tess, int n) {
+ static boolean IsWindingInside(GLUtessellatorImpl tess, int n) {
switch (tess.windingRule) {
case GLU.GLU_TESS_WINDING_ODD:
return (n & 1) != 0;
@@ -246,13 +247,13 @@ class Sweep {
}
- static void ComputeWinding(GLUtesselatorImpl tess, ActiveRegion reg) {
+ static void ComputeWinding(GLUtessellatorImpl tess, ActiveRegion reg) {
reg.windingNumber = RegionAbove(reg).windingNumber + reg.eUp.winding;
reg.inside = IsWindingInside(tess, reg.windingNumber);
}
- static void FinishRegion(GLUtesselatorImpl tess, ActiveRegion reg)
+ static void FinishRegion(GLUtessellatorImpl tess, ActiveRegion reg)
/*
* Delete a region from the sweep line. This happens when the upper
* and lower chains of a region meet (at a vertex on the sweep line).
@@ -269,7 +270,7 @@ class Sweep {
}
- static GLUhalfEdge FinishLeftRegions(GLUtesselatorImpl tess,
+ static GLUhalfEdge FinishLeftRegions(GLUtessellatorImpl tess,
ActiveRegion regFirst, ActiveRegion regLast)
/*
* We are given a vertex with one or more left-going edges. All affected
@@ -324,7 +325,7 @@ class Sweep {
}
- static void AddRightEdges(GLUtesselatorImpl tess, ActiveRegion regUp,
+ static void AddRightEdges(GLUtessellatorImpl tess, ActiveRegion regUp,
GLUhalfEdge eFirst, GLUhalfEdge eLast, GLUhalfEdge eTopLeft,
boolean cleanUp)
/*
@@ -395,7 +396,7 @@ class Sweep {
}
- static void CallCombine(GLUtesselatorImpl tess, GLUvertex isect,
+ static void CallCombine(GLUtessellatorImpl tess, GLUvertex isect,
Object[] data, float[] weights, boolean needed) {
double[] coords = new double[3];
@@ -421,7 +422,7 @@ class Sweep {
}
}
- static void SpliceMergeVertices(GLUtesselatorImpl tess, GLUhalfEdge e1,
+ static void SpliceMergeVertices(GLUtessellatorImpl tess, GLUhalfEdge e1,
GLUhalfEdge e2)
/*
* Two vertices with idential coordinates are combined into one.
@@ -456,7 +457,7 @@ class Sweep {
}
- static void GetIntersectData(GLUtesselatorImpl tess, GLUvertex isect,
+ static void GetIntersectData(GLUtessellatorImpl tess, GLUvertex isect,
GLUvertex orgUp, GLUvertex dstUp,
GLUvertex orgLo, GLUvertex dstLo)
/*
@@ -483,7 +484,7 @@ class Sweep {
CallCombine(tess, isect, data, weights, true);
}
- static boolean CheckForRightSplice(GLUtesselatorImpl tess, ActiveRegion regUp)
+ static boolean CheckForRightSplice(GLUtessellatorImpl tess, ActiveRegion regUp)
/*
* Check the upper and lower edge of "regUp", to make sure that the
* eUp.Org is above eLo, or eLo.Org is below eUp (depending on which
@@ -539,7 +540,7 @@ class Sweep {
return true;
}
- static boolean CheckForLeftSplice(GLUtesselatorImpl tess, ActiveRegion regUp)
+ static boolean CheckForLeftSplice(GLUtessellatorImpl tess, ActiveRegion regUp)
/*
* Check the upper and lower edge of "regUp", to make sure that the
* eUp.Sym.Org is above eLo, or eLo.Sym.Org is below eUp (depending on which
@@ -588,7 +589,7 @@ class Sweep {
}
- static boolean CheckForIntersect(GLUtesselatorImpl tess, ActiveRegion regUp)
+ static boolean CheckForIntersect(GLUtessellatorImpl tess, ActiveRegion regUp)
/*
* Check the upper and lower edges of the given region to see if
* they intersect. If so, create the intersection and add it
@@ -741,7 +742,7 @@ class Sweep {
return false;
}
- static void WalkDirtyRegions(GLUtesselatorImpl tess, ActiveRegion regUp)
+ static void WalkDirtyRegions(GLUtessellatorImpl tess, ActiveRegion regUp)
/*
* When the upper or lower edge of any region changes, the region is
* marked "dirty". This routine walks through all the dirty regions
@@ -826,7 +827,7 @@ class Sweep {
}
- static void ConnectRightVertex(GLUtesselatorImpl tess, ActiveRegion regUp,
+ static void ConnectRightVertex(GLUtessellatorImpl tess, ActiveRegion regUp,
GLUhalfEdge eBottomLeft)
/*
* Purpose: connect a "right" vertex vEvent (one where all edges go left)
@@ -919,7 +920,7 @@ class Sweep {
*/
private static final boolean TOLERANCE_NONZERO = false;
- static void ConnectLeftDegenerate(GLUtesselatorImpl tess,
+ static void ConnectLeftDegenerate(GLUtessellatorImpl tess,
ActiveRegion regUp, GLUvertex vEvent)
/*
* The event vertex lies exacty on an already-processed edge or vertex.
@@ -978,7 +979,7 @@ class Sweep {
}
- static void ConnectLeftVertex(GLUtesselatorImpl tess, GLUvertex vEvent)
+ static void ConnectLeftVertex(GLUtessellatorImpl tess, GLUvertex vEvent)
/*
* Purpose: connect a "left" vertex (one where both edges go right)
* to the processed portion of the mesh. Let R be the active region
@@ -1044,7 +1045,7 @@ class Sweep {
}
- static void SweepEvent(GLUtesselatorImpl tess, GLUvertex vEvent)
+ static void SweepEvent(GLUtessellatorImpl tess, GLUvertex vEvent)
/*
* Does everything necessary when the sweep line crosses a vertex.
* Updates the mesh and the edge dictionary.
@@ -1103,7 +1104,7 @@ class Sweep {
*/
private static final double SENTINEL_COORD = (4.0 * GLU.GLU_TESS_MAX_COORD);
- static void AddSentinel(GLUtesselatorImpl tess, double t)
+ static void AddSentinel(GLUtessellatorImpl tess, double t)
/*
* We add two sentinel edges above and below all other edges,
* to avoid special cases at the top and bottom.
@@ -1132,7 +1133,7 @@ class Sweep {
}
- static void InitEdgeDict(final GLUtesselatorImpl tess)
+ static void InitEdgeDict(final GLUtessellatorImpl tess)
/*
* We maintain an ordering of edge intersections with the sweep line.
* This order is maintained in a dynamic dictionary.
@@ -1150,7 +1151,7 @@ class Sweep {
}
- static void DoneEdgeDict(GLUtesselatorImpl tess) {
+ static void DoneEdgeDict(GLUtessellatorImpl tess) {
ActiveRegion reg;
int fixedEdges = 0;
@@ -1173,7 +1174,7 @@ class Sweep {
}
- static void RemoveDegenerateEdges(GLUtesselatorImpl tess)
+ static void RemoveDegenerateEdges(GLUtessellatorImpl tess)
/*
* Remove zero-length edges, and contours with fewer than 3 vertices.
*/ {
@@ -1210,7 +1211,7 @@ class Sweep {
}
}
- static boolean InitPriorityQ(GLUtesselatorImpl tess)
+ static boolean InitPriorityQ(GLUtessellatorImpl tess)
/*
* Insert all vertices into the priority queue which determines the
* order in which vertices cross the sweep line.
@@ -1241,7 +1242,7 @@ class Sweep {
}
- static void DonePriorityQ(GLUtesselatorImpl tess) {
+ static void DonePriorityQ(GLUtessellatorImpl tess) {
tess.pq.pqDeletePriorityQ(); /* __gl_pqSortDeletePriorityQ */
}
@@ -1279,7 +1280,7 @@ class Sweep {
return true;
}
- public static boolean __gl_computeInterior(GLUtesselatorImpl tess)
+ public static boolean __gl_computeInterior(GLUtessellatorImpl tess)
/*
* __gl_computeInterior( tess ) computes the planar arrangement specified
* by the given contours, and further subdivides this arrangement
diff --git a/src/net/java/games/jogl/impl/tesselator/TessMono.java b/src/classes/com/sun/opengl/impl/tessellator/TessMono.java
index 9e55e1194..ef2230c35 100644
--- a/src/net/java/games/jogl/impl/tesselator/TessMono.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/TessMono.java
@@ -40,7 +40,7 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
class TessMono {
/* __gl_meshTessellateMonoRegion( face ) tessellates a monotone region
diff --git a/src/net/java/games/jogl/impl/tesselator/TessState.java b/src/classes/com/sun/opengl/impl/tessellator/TessState.java
index 6d89d4678..5e96a20a1 100644
--- a/src/net/java/games/jogl/impl/tesselator/TessState.java
+++ b/src/classes/com/sun/opengl/impl/tessellator/TessState.java
@@ -40,7 +40,7 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl.impl.tesselator;
+package com.sun.opengl.impl.tessellator;
class TessState {
diff --git a/src/net/java/games/jogl/impl/GLDrawableHelper.java b/src/classes/com/sun/opengl/impl/windows/WindowsDummyGLDrawable.java
index dd5d7c17f..d57ddec2a 100644
--- a/src/net/java/games/jogl/impl/GLDrawableHelper.java
+++ b/src/classes/com/sun/opengl/impl/windows/WindowsDummyGLDrawable.java
@@ -37,48 +37,61 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl;
+package com.sun.opengl.impl.windows;
-import java.util.*;
-import net.java.games.jogl.*;
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
-/** Encapsulates the implementation of most of the GLDrawable's
- methods to be able to share it between GLCanvas and GLJPanel. */
+public class WindowsDummyGLDrawable extends WindowsGLDrawable {
+ private long hwnd;
-public class GLDrawableHelper {
- private volatile List listeners = new ArrayList();
-
- public GLDrawableHelper() {
+ public WindowsDummyGLDrawable() {
+ super(null, new GLCapabilities(), null);
+ // All entries to CreateDummyWindow must synchronize on one object
+ // to avoid accidentally registering the dummy window class twice
+ synchronized (WindowsDummyGLDrawable.class) {
+ hwnd = WGL.CreateDummyWindow(0, 0, 1, 1);
+ }
+ hdc = WGL.GetDC(hwnd);
+ // Choose a (hopefully hardware-accelerated) OpenGL pixel format for this device context
+ GLCapabilities caps = new GLCapabilities();
+ caps.setDepthBits(16);
+ PIXELFORMATDESCRIPTOR pfd = glCapabilities2PFD(caps, true);
+ int pixelFormat = WGL.ChoosePixelFormat(hdc, pfd);
+ if ((pixelFormat == 0) ||
+ (!WGL.SetPixelFormat(hdc, pixelFormat, pfd))) {
+ destroy();
+ }
}
- public synchronized void addGLEventListener(GLEventListener listener) {
- List newListeners = (List) ((ArrayList) listeners).clone();
- newListeners.add(listener);
- listeners = newListeners;
+ public void setSize(int width, int height) {
}
-
- public synchronized void removeGLEventListener(GLEventListener listener) {
- List newListeners = (List) ((ArrayList) listeners).clone();
- newListeners.remove(listener);
- listeners = newListeners;
+
+ public int getWidth() {
+ return 1;
}
- public void init(GLDrawable drawable) {
- for (Iterator iter = listeners.iterator(); iter.hasNext(); ) {
- ((GLEventListener) iter.next()).init(drawable);
- }
+ public int getHeight() {
+ return 1;
}
- public void display(GLDrawable drawable) {
- for (Iterator iter = listeners.iterator(); iter.hasNext(); ) {
- ((GLEventListener) iter.next()).display(drawable);
+ public GLContext createContext(GLContext shareWith) {
+ if (hdc == 0) {
+ // Construction failed
+ return null;
}
+ return new WindowsGLContext(this, shareWith);
}
- public void reshape(GLDrawable drawable,
- int x, int y, int width, int height) {
- for (Iterator iter = listeners.iterator(); iter.hasNext(); ) {
- ((GLEventListener) iter.next()).reshape(drawable, x, y, width, height);
+ public void destroy() {
+ if (hdc != 0) {
+ WGL.ReleaseDC(hwnd, hdc);
+ hdc = 0;
+ }
+ if (hwnd != 0) {
+ WGL.ShowWindow(hwnd, WGL.SW_HIDE);
+ WGL.DestroyWindow(hwnd);
+ hwnd = 0;
}
}
}
diff --git a/src/classes/com/sun/opengl/impl/windows/WindowsExternalGLContext.java b/src/classes/com/sun/opengl/impl/windows/WindowsExternalGLContext.java
new file mode 100755
index 000000000..694aa6b0d
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/windows/WindowsExternalGLContext.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.windows;
+
+import java.nio.*;
+import java.util.*;
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class WindowsExternalGLContext extends WindowsGLContext {
+ private boolean firstMakeCurrent = true;
+ private boolean created = true;
+
+ public WindowsExternalGLContext() {
+ super(null, null);
+ hglrc = WGL.wglGetCurrentContext();
+ GLContextShareSet.contextCreated(this);
+ resetGLFunctionAvailability();
+ }
+
+ protected int makeCurrentImpl() throws GLException {
+ if (firstMakeCurrent) {
+ firstMakeCurrent = false;
+ return CONTEXT_CURRENT_NEW;
+ }
+ return CONTEXT_CURRENT;
+ }
+
+ protected void releaseImpl() throws GLException {
+ }
+
+ protected void destroyImpl() throws GLException {
+ created = false;
+ GLContextShareSet.contextDestroyed(this);
+ }
+
+ public boolean isCreated() {
+ return created;
+ }
+}
diff --git a/src/classes/com/sun/opengl/impl/windows/WindowsExternalGLDrawable.java b/src/classes/com/sun/opengl/impl/windows/WindowsExternalGLDrawable.java
new file mode 100755
index 000000000..f934c1d23
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/windows/WindowsExternalGLDrawable.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.windows;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class WindowsExternalGLDrawable extends WindowsGLDrawable {
+ public WindowsExternalGLDrawable() {
+ super(null, new GLCapabilities(), null);
+ hdc = WGL.wglGetCurrentDC();
+ }
+
+ public GLContext createContext(GLContext shareWith) {
+ return new WindowsGLContext(this, shareWith);
+ }
+
+ public void setSize(int newWidth, int newHeight) {
+ throw new GLException("Should not call this");
+ }
+
+ public int getWidth() {
+ throw new GLException("Should not call this");
+ }
+
+ public int getHeight() {
+ throw new GLException("Should not call this");
+ }
+
+ public void destroy() {
+ }
+}
diff --git a/src/classes/com/sun/opengl/impl/windows/WindowsGLContext.java b/src/classes/com/sun/opengl/impl/windows/WindowsGLContext.java
new file mode 100644
index 000000000..d4b10dbfb
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/windows/WindowsGLContext.java
@@ -0,0 +1,286 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.windows;
+
+import java.nio.*;
+import java.util.*;
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class WindowsGLContext extends GLContextImpl {
+ protected WindowsGLDrawable drawable;
+ protected long hglrc;
+ private boolean wglGetExtensionsStringEXTInitialized;
+ private boolean wglGetExtensionsStringEXTAvailable;
+ private static final Map/*<String, String>*/ functionNameMap;
+ private static final Map/*<String, String>*/ extensionNameMap;
+ private WGLExt wglExt;
+ // Table that holds the addresses of the native C-language entry points for
+ // WGL extension functions.
+ private WGLExtProcAddressTable wglExtProcAddressTable;
+
+ static {
+ functionNameMap = new HashMap();
+ functionNameMap.put("glAllocateMemoryNV", "wglAllocateMemoryNV");
+ functionNameMap.put("glFreeMemoryNV", "wglFreeMemoryNV");
+
+ extensionNameMap = new HashMap();
+ extensionNameMap.put("GL_ARB_pbuffer", "WGL_ARB_pbuffer");
+ extensionNameMap.put("GL_ARB_pixel_format", "WGL_ARB_pixel_format");
+ }
+
+ public WindowsGLContext(WindowsGLDrawable drawable,
+ GLContext shareWith) {
+ super(shareWith);
+ this.drawable = drawable;
+ }
+
+ public Object getPlatformGLExtensions() {
+ return getWGLExt();
+ }
+
+ public WGLExt getWGLExt() {
+ if (wglExt == null) {
+ wglExt = new WGLExtImpl(this);
+ }
+ return wglExt;
+ }
+
+ public GLDrawable getGLDrawable() {
+ return drawable;
+ }
+
+ protected String mapToRealGLFunctionName(String glFunctionName) {
+ String lookup = (String) functionNameMap.get(glFunctionName);
+ if (lookup != null) {
+ return lookup;
+ }
+ return glFunctionName;
+ }
+
+ protected String mapToRealGLExtensionName(String glExtensionName) {
+ String lookup = (String) extensionNameMap.get(glExtensionName);
+ if (lookup != null) {
+ return lookup;
+ }
+ return glExtensionName;
+ }
+
+ /**
+ * Creates and initializes an appropriate OpenGL context. Should only be
+ * called by {@link #makeCurrentImpl()}.
+ */
+ protected void create() {
+ if (drawable.getHDC() == 0) {
+ throw new GLException("Internal error: attempted to create OpenGL context without an associated drawable");
+ }
+ hglrc = WGL.wglCreateContext(drawable.getHDC());
+ if (hglrc == 0) {
+ throw new GLException("Unable to create OpenGL context for device context " + toHexString(drawable.getHDC()));
+ }
+ // Windows can set up sharing of display lists after creation time
+ WindowsGLContext other = (WindowsGLContext) GLContextShareSet.getShareContext(this);
+ long hglrc2 = 0;
+ if (other != null) {
+ hglrc2 = other.getHGLRC();
+ if (hglrc2 == 0) {
+ throw new GLException("GLContextShareSet returned an invalid OpenGL context");
+ }
+ if (!WGL.wglShareLists(hglrc2, hglrc)) {
+ throw new GLException("wglShareLists(" + toHexString(hglrc2) +
+ ", " + toHexString(hglrc) + ") failed: error code " +
+ WGL.GetLastError());
+ }
+ }
+ GLContextShareSet.contextCreated(this);
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": !!! Created OpenGL context " + toHexString(hglrc) + " for " + this + ", device context " + toHexString(drawable.getHDC()) + ", sharing with " + toHexString(hglrc2));
+ }
+ }
+
+ protected int makeCurrentImpl() throws GLException {
+ boolean created = false;
+ if (hglrc == 0) {
+ create();
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": !!! Created GL context for " + getClass().getName());
+ }
+ created = true;
+ }
+
+ boolean skipMakeCurrent = false;
+ if (NO_FREE) {
+ if (WGL.wglGetCurrentContext() == hglrc) {
+ if (DEBUG && VERBOSE) {
+ System.err.println(getThreadName() + ": skipping wglMakeCurrent because context already current");
+ }
+ skipMakeCurrent = true;
+ }
+ }
+
+ if (!skipMakeCurrent) {
+ if (!WGL.wglMakeCurrent(drawable.getHDC(), hglrc)) {
+ throw new GLException("Error making context current: " + WGL.GetLastError());
+ } else {
+ if (DEBUG && VERBOSE) {
+ System.err.println(getThreadName() + ": wglMakeCurrent(hdc " + toHexString(drawable.getHDC()) +
+ ", hglrc " + toHexString(hglrc) + ") succeeded");
+ }
+ }
+ }
+
+ if (created) {
+ resetGLFunctionAvailability();
+ return CONTEXT_CURRENT_NEW;
+ }
+ return CONTEXT_CURRENT;
+ }
+
+ protected void releaseImpl() throws GLException {
+ if (!NO_FREE) {
+ if (!WGL.wglMakeCurrent(0, 0)) {
+ throw new GLException("Error freeing OpenGL context: " + WGL.GetLastError());
+ }
+ }
+ }
+
+ protected void destroyImpl() throws GLException {
+ if (hglrc != 0) {
+ if (!WGL.wglDeleteContext(hglrc)) {
+ throw new GLException("Unable to delete OpenGL context");
+ }
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": !!! Destroyed OpenGL context " + toHexString(hglrc));
+ }
+ hglrc = 0;
+ GLContextShareSet.contextDestroyed(this);
+ }
+ }
+
+ public boolean isCreated() {
+ return (hglrc != 0);
+ }
+
+ protected void resetGLFunctionAvailability() {
+ super.resetGLFunctionAvailability();
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": !!! Initializing WGL extension address table for " + this);
+ }
+ resetProcAddressTable(getWGLExtProcAddressTable());
+ }
+
+ public WGLExtProcAddressTable getWGLExtProcAddressTable() {
+ if (wglExtProcAddressTable == null) {
+ // FIXME: cache ProcAddressTables by capability bits so we can
+ // share them among contexts with the same capabilities
+ wglExtProcAddressTable = new WGLExtProcAddressTable();
+ }
+ return wglExtProcAddressTable;
+ }
+
+ public String getPlatformExtensionsString() {
+ if (!wglGetExtensionsStringEXTInitialized) {
+ wglGetExtensionsStringEXTAvailable = (WGL.wglGetProcAddress("wglGetExtensionsStringEXT") != 0);
+ wglGetExtensionsStringEXTInitialized = true;
+ }
+ if (wglGetExtensionsStringEXTAvailable) {
+ return getWGLExt().wglGetExtensionsStringEXT();
+ } else {
+ return "";
+ }
+ }
+
+ protected boolean isFunctionAvailable(String glFunctionName)
+ {
+ boolean available = super.isFunctionAvailable(glFunctionName);
+
+ // Sanity check for implementations that use proc addresses for run-time
+ // linking: if the function IS available, then make sure there's a proc
+ // address for it if it's an extension or not part of the OpenGL 1.1 core
+ // (post GL 1.1 functions are run-time linked on windows).
+ assert(!available ||
+ (getGLProcAddressTable().getAddressFor(mapToRealGLFunctionName(glFunctionName)) != 0 ||
+ FunctionAvailabilityCache.isPartOfGLCore("1.1", mapToRealGLFunctionName(glFunctionName)))
+ );
+
+ return available;
+ }
+
+ public void setSwapInterval(int interval) {
+ // FIXME: make the context current first? Currently assumes that
+ // will not be necessary. Make the caller do this?
+ WGLExt wglExt = getWGLExt();
+ if (wglExt.isExtensionAvailable("WGL_EXT_swap_control")) {
+ wglExt.wglSwapIntervalEXT(interval);
+ }
+ }
+
+ public ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3) {
+ return getWGLExt().wglAllocateMemoryNV(arg0, arg1, arg2, arg3);
+ }
+
+ public int getOffscreenContextPixelDataType() {
+ throw new GLException("Should not call this");
+ }
+
+ public int getOffscreenContextReadBuffer() {
+ throw new GLException("Should not call this");
+ }
+
+ public boolean offscreenImageNeedsVerticalFlip() {
+ throw new GLException("Should not call this");
+ }
+
+ public void bindPbufferToTexture() {
+ throw new GLException("Should not call this");
+ }
+
+ public void releasePbufferFromTexture() {
+ throw new GLException("Should not call this");
+ }
+
+ //----------------------------------------------------------------------
+ // Internals only below this point
+ //
+
+ protected long getHGLRC() {
+ return hglrc;
+ }
+}
diff --git a/src/classes/com/sun/opengl/impl/windows/WindowsGLDrawable.java b/src/classes/com/sun/opengl/impl/windows/WindowsGLDrawable.java
new file mode 100644
index 000000000..ae95f5505
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/windows/WindowsGLDrawable.java
@@ -0,0 +1,502 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.windows;
+
+import java.awt.Component;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public abstract class WindowsGLDrawable extends GLDrawableImpl {
+ protected static final boolean DEBUG = Debug.debug("WindowsGLDrawable");
+
+ protected long hdc;
+ protected Component component;
+ protected GLCapabilities capabilities;
+ protected GLCapabilitiesChooser chooser;
+ protected boolean pixelFormatChosen;
+
+ protected static final int MAX_PFORMATS = 256;
+ protected static final int MAX_ATTRIBS = 256;
+
+ public WindowsGLDrawable(Component component,
+ GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser) {
+ this.component = component;
+ this.capabilities = (GLCapabilities) capabilities.clone();
+ this.chooser = chooser;
+ }
+
+ public void setRealized(boolean val) {
+ throw new GLException("Should not call this (should only be called for onscreen GLDrawables)");
+ }
+
+ public void destroy() {
+ throw new GLException("Should not call this (should only be called for offscreen GLDrawables)");
+ }
+
+ public void swapBuffers() throws GLException {
+ }
+
+ public long getHDC() {
+ return hdc;
+ }
+
+ public void choosePixelFormat(boolean onscreen) {
+ PIXELFORMATDESCRIPTOR pfd = null;
+ int pixelFormat = 0;
+ if (onscreen) {
+ if (WGL.GetPixelFormat(hdc) != 0) {
+ // The Java2D/OpenGL pipeline probably already set a pixel
+ // format for this canvas.
+ if (DEBUG) {
+ System.err.println("NOTE: pixel format already chosen (by Java2D/OpenGL pipeline?) for window: " +
+ WGL.GetPixelFormat(hdc));
+ }
+ pixelFormatChosen = true;
+ return;
+ }
+
+ GLCapabilities[] availableCaps = null;
+ int numFormats = 0;
+ pfd = newPixelFormatDescriptor();
+ GraphicsConfiguration config = component.getGraphicsConfiguration();
+ GraphicsDevice device = config.getDevice();
+ // Produce a recommended pixel format selection for the GLCapabilitiesChooser.
+ // Use wglChoosePixelFormatARB if user requested multisampling and if we have it available
+ WindowsGLDrawable dummyDrawable = null;
+ GLContextImpl dummyContext = null;
+ WGLExt dummyWGLExt = null;
+ if (capabilities.getSampleBuffers()) {
+ dummyDrawable = new WindowsDummyGLDrawable();
+ dummyContext = (GLContextImpl) dummyDrawable.createContext(null);
+ if (dummyContext != null) {
+ dummyContext.makeCurrent();
+ dummyWGLExt = (WGLExt) dummyContext.getPlatformGLExtensions();
+ }
+ }
+ int recommendedPixelFormat = -1;
+ boolean haveWGLChoosePixelFormatARB = false;
+ boolean haveWGLARBMultisample = false;
+ boolean gotAvailableCaps = false;
+ if (dummyWGLExt != null) {
+ haveWGLChoosePixelFormatARB = dummyWGLExt.isExtensionAvailable("WGL_ARB_pixel_format");
+ haveWGLARBMultisample = dummyWGLExt.isExtensionAvailable("WGL_ARB_multisample");
+
+ try {
+ if (haveWGLChoosePixelFormatARB) {
+ int[] iattributes = new int [2 * MAX_ATTRIBS];
+ int[] iresults = new int [2 * MAX_ATTRIBS];
+ float[] fattributes = new float[2 * MAX_ATTRIBS];
+ int niattribs = 0;
+ int nfattribs = 0;
+ iattributes[niattribs++] = WGLExt.WGL_SUPPORT_OPENGL_ARB;
+ iattributes[niattribs++] = GL.GL_TRUE;
+ iattributes[niattribs++] = WGLExt.WGL_DRAW_TO_WINDOW_ARB;
+ iattributes[niattribs++] = GL.GL_TRUE;
+ iattributes[niattribs++] = WGLExt.WGL_PIXEL_TYPE_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_TYPE_RGBA_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_DOUBLE_BUFFER_ARB;
+ if (capabilities.getDoubleBuffered()) {
+ iattributes[niattribs++] = GL.GL_TRUE;
+ } else {
+ iattributes[niattribs++] = GL.GL_FALSE;
+ }
+ iattributes[niattribs++] = WGLExt.WGL_STEREO_ARB;
+ if (capabilities.getStereo()) {
+ iattributes[niattribs++] = GL.GL_TRUE;
+ } else {
+ iattributes[niattribs++] = GL.GL_FALSE;
+ }
+ iattributes[niattribs++] = WGLExt.WGL_DEPTH_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getDepthBits();
+ iattributes[niattribs++] = WGLExt.WGL_RED_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getRedBits();
+ iattributes[niattribs++] = WGLExt.WGL_GREEN_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getGreenBits();
+ iattributes[niattribs++] = WGLExt.WGL_BLUE_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getBlueBits();
+ iattributes[niattribs++] = WGLExt.WGL_ALPHA_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getAlphaBits();
+ iattributes[niattribs++] = WGLExt.WGL_STENCIL_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getStencilBits();
+ if (capabilities.getAccumRedBits() > 0 ||
+ capabilities.getAccumGreenBits() > 0 ||
+ capabilities.getAccumBlueBits() > 0 ||
+ capabilities.getAccumAlphaBits() > 0) {
+ iattributes[niattribs++] = WGLExt.WGL_ACCUM_BITS_ARB;
+ iattributes[niattribs++] = (capabilities.getAccumRedBits() +
+ capabilities.getAccumGreenBits() +
+ capabilities.getAccumBlueBits() +
+ capabilities.getAccumAlphaBits());
+ iattributes[niattribs++] = WGLExt.WGL_ACCUM_RED_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getAccumRedBits();
+ iattributes[niattribs++] = WGLExt.WGL_ACCUM_GREEN_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getAccumGreenBits();
+ iattributes[niattribs++] = WGLExt.WGL_ACCUM_BLUE_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getAccumBlueBits();
+ iattributes[niattribs++] = WGLExt.WGL_ACCUM_ALPHA_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getAccumAlphaBits();
+ }
+ if (haveWGLARBMultisample) {
+ if (capabilities.getSampleBuffers()) {
+ iattributes[niattribs++] = WGLExt.WGL_SAMPLE_BUFFERS_ARB;
+ iattributes[niattribs++] = GL.GL_TRUE;
+ iattributes[niattribs++] = WGLExt.WGL_SAMPLES_ARB;
+ iattributes[niattribs++] = capabilities.getNumSamples();
+ }
+ }
+
+ int[] pformats = new int[MAX_PFORMATS];
+ int[] numFormatsTmp = new int[1];
+ if (dummyWGLExt.wglChoosePixelFormatARB(hdc,
+ iattributes, 0,
+ fattributes, 0,
+ MAX_PFORMATS,
+ pformats, 0,
+ numFormatsTmp, 0)) {
+ numFormats = numFormatsTmp[0];
+ if (numFormats > 0) {
+ // Remove one-basing of pixel format (added on later)
+ recommendedPixelFormat = pformats[0] - 1;
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": Used wglChoosePixelFormatARB to recommend pixel format " + recommendedPixelFormat);
+ }
+ }
+ } else {
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": wglChoosePixelFormatARB failed: " + WGL.GetLastError() );
+ Thread.dumpStack();
+ }
+ }
+ if (DEBUG) {
+ if (recommendedPixelFormat < 0) {
+ System.err.print(getThreadName() + ": wglChoosePixelFormatARB didn't recommend a pixel format");
+ if (capabilities.getSampleBuffers()) {
+ System.err.print(" for multisampled GLCapabilities");
+ }
+ System.err.println();
+ }
+ }
+
+ // Produce a list of GLCapabilities to give to the
+ // GLCapabilitiesChooser.
+ // Use wglGetPixelFormatAttribivARB instead of
+ // DescribePixelFormat to get higher-precision information
+ // about the pixel format (should make the GLCapabilities
+ // more precise as well...i.e., remove the
+ // "HardwareAccelerated" bit, which is basically
+ // meaningless, and put in whether it can render to a
+ // window, to a pbuffer, or to a pixmap)
+ niattribs = 0;
+ iattributes[0] = WGLExt.WGL_NUMBER_PIXEL_FORMATS_ARB;
+ if (dummyWGLExt.wglGetPixelFormatAttribivARB(hdc, 0, 0, 1, iattributes, 0, iresults, 0)) {
+ numFormats = iresults[0];
+ // Should we be filtering out the pixel formats which aren't
+ // applicable, as we are doing here?
+ // We don't have enough information in the GLCapabilities to
+ // represent those that aren't...
+ iattributes[niattribs++] = WGLExt.WGL_DRAW_TO_WINDOW_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_ACCELERATION_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_SUPPORT_OPENGL_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_DEPTH_BITS_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_STENCIL_BITS_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_DOUBLE_BUFFER_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_STEREO_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_PIXEL_TYPE_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_RED_BITS_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_GREEN_BITS_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_BLUE_BITS_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_ALPHA_BITS_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_ACCUM_RED_BITS_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_ACCUM_GREEN_BITS_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_ACCUM_BLUE_BITS_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_ACCUM_ALPHA_BITS_ARB;
+ if (haveWGLARBMultisample) {
+ iattributes[niattribs++] = WGLExt.WGL_SAMPLE_BUFFERS_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_SAMPLES_ARB;
+ }
+
+ availableCaps = new GLCapabilities[numFormats];
+ for (int i = 0; i < numFormats; i++) {
+ if (!dummyWGLExt.wglGetPixelFormatAttribivARB(hdc, i+1, 0, niattribs, iattributes, 0, iresults, 0)) {
+ throw new GLException("Error getting pixel format attributes for pixel format " + (i + 1) + " of device context");
+ }
+ availableCaps[i] = iattributes2GLCapabilities(iattributes, iresults, niattribs, true);
+ }
+ gotAvailableCaps = true;
+ } else {
+ int lastErr = WGL.GetLastError();
+ // Intel Extreme graphics fails with a zero error code
+ if (lastErr != 0) {
+ throw new GLException("Unable to enumerate pixel formats of window using wglGetPixelFormatAttribivARB: error code " + WGL.GetLastError());
+ }
+ }
+ }
+ } finally {
+ dummyContext.release();
+ dummyContext.destroy();
+ dummyDrawable.destroy();
+ }
+ }
+
+ // Fallback path for older cards, in particular Intel Extreme motherboard graphics
+ if (!gotAvailableCaps) {
+ if (DEBUG) {
+ if (!capabilities.getSampleBuffers()) {
+ System.err.println(getThreadName() + ": Using ChoosePixelFormat because multisampling not requested");
+ } else {
+ System.err.println(getThreadName() + ": Using ChoosePixelFormat because no wglChoosePixelFormatARB");
+ }
+ }
+ pfd = glCapabilities2PFD(capabilities, onscreen);
+ // Remove one-basing of pixel format (added on later)
+ recommendedPixelFormat = WGL.ChoosePixelFormat(hdc, pfd) - 1;
+
+ numFormats = WGL.DescribePixelFormat(hdc, 1, 0, null);
+ if (numFormats == 0) {
+ throw new GLException("Unable to enumerate pixel formats of window for GLCapabilitiesChooser");
+ }
+ availableCaps = new GLCapabilities[numFormats];
+ for (int i = 0; i < numFormats; i++) {
+ if (WGL.DescribePixelFormat(hdc, 1 + i, pfd.size(), pfd) == 0) {
+ throw new GLException("Error describing pixel format " + (1 + i) + " of device context");
+ }
+ availableCaps[i] = pfd2GLCapabilities(pfd);
+ }
+ }
+
+ // Supply information to chooser
+ pixelFormat = chooser.chooseCapabilities(capabilities, availableCaps, recommendedPixelFormat);
+ if ((pixelFormat < 0) || (pixelFormat >= numFormats)) {
+ throw new GLException("Invalid result " + pixelFormat +
+ " from GLCapabilitiesChooser (should be between 0 and " +
+ (numFormats - 1) + ")");
+ }
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": Chosen pixel format (" + pixelFormat + "):");
+ System.err.println(availableCaps[pixelFormat]);
+ }
+ pixelFormat += 1; // one-base the index
+ if (WGL.DescribePixelFormat(hdc, pixelFormat, pfd.size(), pfd) == 0) {
+ throw new GLException("Error re-describing the chosen pixel format: " + WGL.GetLastError());
+ }
+ } else {
+ // For now, use ChoosePixelFormat for offscreen surfaces until
+ // we figure out how to properly choose an offscreen-
+ // compatible pixel format
+ pfd = glCapabilities2PFD(capabilities, onscreen);
+ pixelFormat = WGL.ChoosePixelFormat(hdc, pfd);
+ }
+ if (!WGL.SetPixelFormat(hdc, pixelFormat, pfd)) {
+ int lastError = WGL.GetLastError();
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": SetPixelFormat failed: current context = " + WGL.wglGetCurrentContext() +
+ ", current DC = " + WGL.wglGetCurrentDC());
+ System.err.println(getThreadName() + ": GetPixelFormat(hdc " + toHexString(hdc) + ") returns " + WGL.GetPixelFormat(hdc));
+ }
+ throw new GLException("Unable to set pixel format " + pixelFormat + " for device context " + toHexString(hdc) + ": error code " + lastError);
+ }
+ pixelFormatChosen = true;
+ }
+
+ static PIXELFORMATDESCRIPTOR glCapabilities2PFD(GLCapabilities caps, boolean onscreen) {
+ int colorDepth = (caps.getRedBits() +
+ caps.getGreenBits() +
+ caps.getBlueBits());
+ if (colorDepth < 15) {
+ throw new GLException("Bit depths < 15 (i.e., non-true-color) not supported");
+ }
+ PIXELFORMATDESCRIPTOR pfd = newPixelFormatDescriptor();
+ int pfdFlags = (WGL.PFD_SUPPORT_OPENGL |
+ WGL.PFD_GENERIC_ACCELERATED);
+ if (caps.getDoubleBuffered()) {
+ pfdFlags |= WGL.PFD_DOUBLEBUFFER;
+ }
+ if (onscreen) {
+ pfdFlags |= WGL.PFD_DRAW_TO_WINDOW;
+ } else {
+ pfdFlags |= WGL.PFD_DRAW_TO_BITMAP;
+ }
+ pfd.dwFlags(pfdFlags);
+ pfd.iPixelType((byte) WGL.PFD_TYPE_RGBA);
+ pfd.cColorBits((byte) colorDepth);
+ pfd.cRedBits ((byte) caps.getRedBits());
+ pfd.cGreenBits((byte) caps.getGreenBits());
+ pfd.cBlueBits ((byte) caps.getBlueBits());
+ pfd.cAlphaBits((byte) caps.getAlphaBits());
+ int accumDepth = (caps.getAccumRedBits() +
+ caps.getAccumGreenBits() +
+ caps.getAccumBlueBits());
+ pfd.cAccumBits ((byte) accumDepth);
+ pfd.cAccumRedBits ((byte) caps.getAccumRedBits());
+ pfd.cAccumGreenBits((byte) caps.getAccumGreenBits());
+ pfd.cAccumBlueBits ((byte) caps.getAccumBlueBits());
+ pfd.cAccumAlphaBits((byte) caps.getAccumAlphaBits());
+ pfd.cDepthBits((byte) caps.getDepthBits());
+ pfd.cStencilBits((byte) caps.getStencilBits());
+ pfd.iLayerType((byte) WGL.PFD_MAIN_PLANE);
+ return pfd;
+ }
+
+ static PIXELFORMATDESCRIPTOR newPixelFormatDescriptor() {
+ PIXELFORMATDESCRIPTOR pfd = new PIXELFORMATDESCRIPTOR();
+ pfd.nSize((short) pfd.size());
+ pfd.nVersion((short) 1);
+ return pfd;
+ }
+
+ static GLCapabilities pfd2GLCapabilities(PIXELFORMATDESCRIPTOR pfd) {
+ if ((pfd.dwFlags() & WGL.PFD_SUPPORT_OPENGL) == 0) {
+ return null;
+ }
+ GLCapabilities res = new GLCapabilities();
+ res.setRedBits (pfd.cRedBits());
+ res.setGreenBits (pfd.cGreenBits());
+ res.setBlueBits (pfd.cBlueBits());
+ res.setAlphaBits (pfd.cAlphaBits());
+ res.setAccumRedBits (pfd.cAccumRedBits());
+ res.setAccumGreenBits(pfd.cAccumGreenBits());
+ res.setAccumBlueBits (pfd.cAccumBlueBits());
+ res.setAccumAlphaBits(pfd.cAccumAlphaBits());
+ res.setDepthBits (pfd.cDepthBits());
+ res.setStencilBits (pfd.cStencilBits());
+ res.setDoubleBuffered((pfd.dwFlags() & WGL.PFD_DOUBLEBUFFER) != 0);
+ res.setStereo ((pfd.dwFlags() & WGL.PFD_STEREO) != 0);
+ res.setHardwareAccelerated(((pfd.dwFlags() & WGL.PFD_GENERIC_FORMAT) == 0) ||
+ ((pfd.dwFlags() & WGL.PFD_GENERIC_ACCELERATED) != 0));
+ return res;
+ }
+
+ static GLCapabilities iattributes2GLCapabilities(int[] iattribs,
+ int[] iresults,
+ int niattribs,
+ boolean requireRenderToWindow) {
+ GLCapabilities res = new GLCapabilities();
+ for (int i = 0; i < niattribs; i++) {
+ switch (iattribs[i]) {
+ case WGLExt.WGL_DRAW_TO_WINDOW_ARB:
+ if (iresults[i] != GL.GL_TRUE)
+ return null;
+ break;
+
+ case WGLExt.WGL_ACCELERATION_ARB:
+ res.setHardwareAccelerated(iresults[i] == WGLExt.WGL_FULL_ACCELERATION_ARB);
+ break;
+
+ case WGLExt.WGL_SUPPORT_OPENGL_ARB:
+ if (iresults[i] != GL.GL_TRUE)
+ return null;
+ break;
+
+ case WGLExt.WGL_DEPTH_BITS_ARB:
+ res.setDepthBits(iresults[i]);
+ break;
+
+ case WGLExt.WGL_STENCIL_BITS_ARB:
+ res.setStencilBits(iresults[i]);
+ break;
+
+ case WGLExt.WGL_DOUBLE_BUFFER_ARB:
+ res.setDoubleBuffered(iresults[i] == GL.GL_TRUE);
+ break;
+
+ case WGLExt.WGL_STEREO_ARB:
+ res.setStereo(iresults[i] == GL.GL_TRUE);
+ break;
+
+ case WGLExt.WGL_PIXEL_TYPE_ARB:
+ if (iresults[i] != WGLExt.WGL_TYPE_RGBA_ARB)
+ return null;
+ break;
+
+ case WGLExt.WGL_RED_BITS_ARB:
+ res.setRedBits(iresults[i]);
+ break;
+
+ case WGLExt.WGL_GREEN_BITS_ARB:
+ res.setGreenBits(iresults[i]);
+ break;
+
+ case WGLExt.WGL_BLUE_BITS_ARB:
+ res.setBlueBits(iresults[i]);
+ break;
+
+ case WGLExt.WGL_ALPHA_BITS_ARB:
+ res.setAlphaBits(iresults[i]);
+ break;
+
+ case WGLExt.WGL_ACCUM_RED_BITS_ARB:
+ res.setAccumRedBits(iresults[i]);
+ break;
+
+ case WGLExt.WGL_ACCUM_GREEN_BITS_ARB:
+ res.setAccumGreenBits(iresults[i]);
+ break;
+
+ case WGLExt.WGL_ACCUM_BLUE_BITS_ARB:
+ res.setAccumBlueBits(iresults[i]);
+ break;
+
+ case WGLExt.WGL_ACCUM_ALPHA_BITS_ARB:
+ res.setAccumAlphaBits(iresults[i]);
+ break;
+
+ case WGLExt.WGL_SAMPLE_BUFFERS_ARB:
+ res.setSampleBuffers(iresults[i] == GL.GL_TRUE);
+ break;
+
+ case WGLExt.WGL_SAMPLES_ARB:
+ res.setNumSamples(iresults[i]);
+ break;
+
+ default:
+ throw new GLException("Unknown pixel format attribute " + iattribs[i]);
+ }
+ }
+ return res;
+ }
+
+ protected static String getThreadName() {
+ return Thread.currentThread().getName();
+ }
+}
diff --git a/src/classes/com/sun/opengl/impl/windows/WindowsGLDrawableFactory.java b/src/classes/com/sun/opengl/impl/windows/WindowsGLDrawableFactory.java
new file mode 100644
index 000000000..ae48be999
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/windows/WindowsGLDrawableFactory.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.windows;
+
+import java.awt.Component;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.Rectangle;
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.ArrayList;
+import java.util.List;
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class WindowsGLDrawableFactory extends GLDrawableFactoryImpl {
+ private static final boolean DEBUG = Debug.debug("WindowsGLDrawableFactory");
+ private static final boolean VERBOSE = Debug.verbose();
+
+ // Handle to GLU32.dll
+ // FIXME: this should go away once we delete support for the C GLU library
+ private long hglu32;
+
+ static {
+ NativeLibLoader.load();
+ }
+
+ public GraphicsConfiguration chooseGraphicsConfiguration(GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser,
+ GraphicsDevice device) {
+ return null;
+ }
+
+ public GLDrawable getGLDrawable(Object target,
+ GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser) {
+ if (target == null) {
+ throw new IllegalArgumentException("Null target");
+ }
+ if (!(target instanceof Component)) {
+ throw new IllegalArgumentException("GLDrawables not supported for objects of type " +
+ target.getClass().getName() + " (only Components are supported in this implementation)");
+ }
+ if (capabilities == null) {
+ capabilities = new GLCapabilities();
+ }
+ if (chooser == null) {
+ chooser = new DefaultGLCapabilitiesChooser();
+ }
+ return new WindowsOnscreenGLDrawable((Component) target, capabilities, chooser);
+ }
+
+ public GLDrawableImpl createOffscreenDrawable(GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser) {
+ return new WindowsOffscreenGLDrawable(capabilities, chooser);
+ }
+
+ private boolean pbufferSupportInitialized = false;
+ private boolean canCreateGLPbuffer = false;
+ public boolean canCreateGLPbuffer() {
+ if (!pbufferSupportInitialized) {
+ Runnable r = new Runnable() {
+ public void run() {
+ WindowsDummyGLDrawable dummyDrawable = new WindowsDummyGLDrawable();
+ GLContext dummyContext = dummyDrawable.createContext(null);
+ if (dummyContext != null) {
+ GLContext lastContext = GLContext.getCurrent();
+ if (lastContext != null) {
+ lastContext.release();
+ }
+ dummyContext.makeCurrent();
+ GL dummyGL = dummyContext.getGL();
+ canCreateGLPbuffer = dummyGL.isExtensionAvailable("GL_ARB_pbuffer");
+ pbufferSupportInitialized = true;
+ dummyContext.release();
+ dummyContext.destroy();
+ dummyDrawable.destroy();
+ if (lastContext != null) {
+ lastContext.makeCurrent();
+ }
+ }
+ }
+ };
+ maybeDoSingleThreadedWorkaround(r);
+ }
+ return canCreateGLPbuffer;
+ }
+
+ public GLPbuffer createGLPbuffer(final GLCapabilities capabilities,
+ final int initialWidth,
+ final int initialHeight,
+ final GLContext shareWith) {
+ if (!canCreateGLPbuffer()) {
+ throw new GLException("Pbuffer support not available with current graphics card");
+ }
+ final List returnList = new ArrayList();
+ Runnable r = new Runnable() {
+ public void run() {
+ WindowsDummyGLDrawable dummyDrawable = new WindowsDummyGLDrawable();
+ WindowsGLContext dummyContext = (WindowsGLContext) dummyDrawable.createContext(null);
+ GLContext lastContext = GLContext.getCurrent();
+ if (lastContext != null) {
+ lastContext.release();
+ }
+ dummyContext.makeCurrent();
+ WGLExt dummyWGLExt = dummyContext.getWGLExt();
+ try {
+ WindowsPbufferGLDrawable pbufferDrawable = new WindowsPbufferGLDrawable(capabilities,
+ initialWidth,
+ initialHeight,
+ dummyDrawable,
+ dummyWGLExt);
+ GLPbufferImpl pbuffer = new GLPbufferImpl(pbufferDrawable, shareWith);
+ returnList.add(pbuffer);
+ dummyContext.release();
+ dummyContext.destroy();
+ dummyDrawable.destroy();
+ } finally {
+ if (lastContext != null) {
+ lastContext.makeCurrent();
+ }
+ }
+ }
+ };
+ maybeDoSingleThreadedWorkaround(r);
+ return (GLPbuffer) returnList.get(0);
+ }
+
+ public GLContext createExternalGLContext() {
+ return new WindowsExternalGLContext();
+ }
+
+ public boolean canCreateExternalGLDrawable() {
+ return true;
+ }
+
+ public GLDrawable createExternalGLDrawable() {
+ return new WindowsExternalGLDrawable();
+ }
+
+ public long dynamicLookupFunction(String glFuncName) {
+ long res = WGL.wglGetProcAddress(glFuncName);
+ if (res == 0) {
+ // GLU routines aren't known to the OpenGL function lookup
+ if (hglu32 == 0) {
+ hglu32 = WGL.LoadLibraryA("GLU32");
+ if (hglu32 == 0) {
+ throw new GLException("Error loading GLU32.DLL");
+ }
+ }
+ res = WGL.GetProcAddress(hglu32, glFuncName);
+ }
+ return res;
+ }
+
+ static String wglGetLastError() {
+ int err = WGL.GetLastError();
+ String detail = null;
+ switch (err) {
+ case WGL.ERROR_INVALID_PIXEL_FORMAT: detail = "ERROR_INVALID_PIXEL_FORMAT"; break;
+ case WGL.ERROR_NO_SYSTEM_RESOURCES: detail = "ERROR_NO_SYSTEM_RESOURCES"; break;
+ case WGL.ERROR_INVALID_DATA: detail = "ERROR_INVALID_DATA"; break;
+ case WGL.ERROR_PROC_NOT_FOUND: detail = "ERROR_PROC_NOT_FOUND"; break;
+ case WGL.ERROR_INVALID_WINDOW_HANDLE:detail = "ERROR_INVALID_WINDOW_HANDLE"; break;
+ default: detail = "(Unknown error code " + err + ")"; break;
+ }
+ return detail;
+ }
+
+ private void maybeDoSingleThreadedWorkaround(Runnable action) {
+ if (Threading.isSingleThreaded() &&
+ !Threading.isOpenGLThread()) {
+ Threading.invokeOnOpenGLThread(action);
+ } else {
+ action.run();
+ }
+ }
+
+ public void lockAWTForJava2D() {
+ }
+
+ public void unlockAWTForJava2D() {
+ }
+}
diff --git a/src/net/java/games/jogl/impl/macosx/MacOSXGLContextFactory.java b/src/classes/com/sun/opengl/impl/windows/WindowsOffscreenGLContext.java
index 25f15b3f2..d9430638c 100644
--- a/src/net/java/games/jogl/impl/macosx/MacOSXGLContextFactory.java
+++ b/src/classes/com/sun/opengl/impl/windows/WindowsOffscreenGLContext.java
@@ -37,29 +37,28 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl.macosx;
+package com.sun.opengl.impl.windows;
-import java.awt.Component;
-import java.awt.GraphicsConfiguration;
-import java.awt.GraphicsDevice;
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
-public class MacOSXGLContextFactory extends GLContextFactory {
- public GraphicsConfiguration chooseGraphicsConfiguration(GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GraphicsDevice device) {
- return null;
+public class WindowsOffscreenGLContext extends WindowsGLContext {
+ public WindowsOffscreenGLContext(WindowsOffscreenGLDrawable drawable,
+ GLContext shareWith) {
+ super(drawable, shareWith);
}
- public GLContext createGLContext(Component component,
- GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLContext shareWith) {
- if (component != null) {
- return new MacOSXOnscreenGLContext(component, capabilities, chooser, shareWith);
- } else {
- return new MacOSXOffscreenGLContext(capabilities, chooser, shareWith);
- }
+ public int getOffscreenContextPixelDataType() {
+ return GL.GL_UNSIGNED_BYTE;
+ }
+
+ public int getOffscreenContextReadBuffer() {
+ // On Windows these contexts are always single-buffered
+ return GL.GL_FRONT;
+ }
+
+ public boolean offscreenImageNeedsVerticalFlip() {
+ // We can take care of this in the DIB creation (see below)
+ return false;
}
}
diff --git a/src/net/java/games/jogl/impl/windows/WindowsOffscreenGLContext.java b/src/classes/com/sun/opengl/impl/windows/WindowsOffscreenGLDrawable.java
index c70607da7..7dd6d2361 100644
--- a/src/net/java/games/jogl/impl/windows/WindowsOffscreenGLContext.java
+++ b/src/classes/com/sun/opengl/impl/windows/WindowsOffscreenGLDrawable.java
@@ -37,106 +37,45 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl.windows;
+package com.sun.opengl.impl.windows;
-import java.awt.image.BufferedImage;
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
-public class WindowsOffscreenGLContext extends WindowsGLContext {
+public class WindowsOffscreenGLDrawable extends WindowsGLDrawable {
private long origbitmap;
private long hbitmap;
// Width and height of the underlying bitmap
private int width;
private int height;
- public WindowsOffscreenGLContext(GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLContext shareWith) {
- super(null, capabilities, chooser, shareWith);
+ public WindowsOffscreenGLDrawable(GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser) {
+ super(null, capabilities, chooser);
}
- protected GL createGL()
- {
- return new WindowsGLImpl(this);
+ public GLContext createContext(GLContext shareWith) {
+ return new WindowsOffscreenGLContext(this, shareWith);
}
- protected boolean isOffscreen() {
- return true;
- }
-
- public int getOffscreenContextWidth() {
- return width;
- }
-
- public int getOffscreenContextHeight() {
- return height;
- }
-
- public int getOffscreenContextPixelDataType() {
- return GL.GL_UNSIGNED_BYTE;
- }
-
- public int getOffscreenContextReadBuffer() {
- // On Windows these contexts are always single-buffered
- return GL.GL_FRONT;
- }
-
- public boolean offscreenImageNeedsVerticalFlip() {
- // We can take care of this in the DIB creation (see below)
- return false;
- }
-
- public boolean canCreatePbufferContext() {
- // For now say no
- return false;
- }
-
- public synchronized GLContext createPbufferContext(GLCapabilities capabilities,
- int initialWidth,
- int initialHeight) {
- throw new GLException("Not supported");
- }
-
- public void bindPbufferToTexture() {
- throw new GLException("Should not call this");
- }
-
- public void releasePbufferFromTexture() {
- throw new GLException("Should not call this");
- }
-
- protected synchronized boolean makeCurrent(Runnable initAction) throws GLException {
- if (pendingOffscreenResize) {
- if (pendingOffscreenWidth != width || pendingOffscreenHeight != height) {
- if (hglrc != 0) {
- destroyImpl();
- }
- width = pendingOffscreenWidth;
- height = pendingOffscreenHeight;
- pendingOffscreenResize = false;
- }
+ public void setSize(int newWidth, int newHeight) {
+ width = newWidth;
+ height = newHeight;
+ if (hdc != 0) {
+ destroy();
}
- return super.makeCurrent(initAction);
+ create();
}
- protected void destroyImpl() {
- if (hglrc != 0) {
- super.destroyImpl();
- // Must destroy OpenGL context, bitmap and device context
- WGL.SelectObject(hdc, origbitmap);
- WGL.DeleteObject(hbitmap);
- WGL.DeleteDC(hdc);
- origbitmap = 0;
- hbitmap = 0;
- hdc = 0;
- }
+ public int getWidth() {
+ return width;
}
- public synchronized void swapBuffers() throws GLException {
+ public int getHeight() {
+ return height;
}
-
- protected void create() {
+
+ private void create() {
BITMAPINFO info = new BITMAPINFO();
BITMAPINFOHEADER header = info.bmiHeader();
int bitsPerPixel = (capabilities.getRedBits() +
@@ -164,13 +103,31 @@ public class WindowsOffscreenGLContext extends WindowsGLContext {
}
hbitmap = WGL.CreateDIBSection(hdc, info, WGL.DIB_RGB_COLORS, 0, 0, 0);
if (hbitmap == 0) {
+ WGL.DeleteDC(hdc);
+ hdc = 0;
throw new GLException("Error creating offscreen bitmap of width " + width +
", height " + height);
}
if ((origbitmap = WGL.SelectObject(hdc, hbitmap)) == 0) {
+ WGL.DeleteObject(hbitmap);
+ hbitmap = 0;
+ WGL.DeleteDC(hdc);
+ hdc = 0;
throw new GLException("Error selecting bitmap into new device context");
}
- choosePixelFormatAndCreateContext(false);
+ choosePixelFormat(false);
+ }
+
+ public void destroy() {
+ if (hdc != 0) {
+ // Must destroy bitmap and device context
+ WGL.SelectObject(hdc, origbitmap);
+ WGL.DeleteObject(hbitmap);
+ WGL.DeleteDC(hdc);
+ origbitmap = 0;
+ hbitmap = 0;
+ hdc = 0;
+ }
}
}
diff --git a/src/net/java/games/jogl/impl/macosx/MacOSXOffscreenGLContext.java b/src/classes/com/sun/opengl/impl/windows/WindowsOnscreenGLContext.java
index 37b2302c0..00647e7dd 100644
--- a/src/net/java/games/jogl/impl/macosx/MacOSXOffscreenGLContext.java
+++ b/src/classes/com/sun/opengl/impl/windows/WindowsOnscreenGLContext.java
@@ -37,65 +37,57 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl.macosx;
+package com.sun.opengl.impl.windows;
-import java.awt.image.BufferedImage;
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
+import java.util.*;
-public class MacOSXOffscreenGLContext extends MacOSXPbufferGLContext
-{
- public MacOSXOffscreenGLContext(GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLContext shareWith) {
- super(capabilities, -1, -1);
- }
-
- protected boolean isOffscreen() {
- return true;
- }
-
- public boolean offscreenImageNeedsVerticalFlip() {
- return true;
- }
-
- public int getOffscreenContextWidth() {
- return initWidth;
- }
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
- public int getOffscreenContextHeight() {
- return initWidth;
- }
+public class WindowsOnscreenGLContext extends WindowsGLContext {
+ protected WindowsOnscreenGLDrawable drawable;
- public int getOffscreenContextPixelDataType() {
- return GL.GL_UNSIGNED_INT_8_8_8_8_REV;
+ public WindowsOnscreenGLContext(WindowsOnscreenGLDrawable drawable,
+ GLContext shareWith) {
+ super(drawable, shareWith);
+ this.drawable = drawable;
}
-
- public int getOffscreenContextReadBuffer() {
- return GL.GL_BACK;
+
+ protected int makeCurrentImpl() throws GLException {
+ try {
+ int lockRes = drawable.lockSurface();
+ if (lockRes == WindowsOnscreenGLDrawable.LOCK_SURFACE_NOT_READY) {
+ return CONTEXT_NOT_CURRENT;
+ }
+ if (lockRes == WindowsOnscreenGLDrawable.LOCK_SURFACE_CHANGED) {
+ if (hglrc != 0) {
+ if (!WGL.wglDeleteContext(hglrc)) {
+ throw new GLException("Unable to delete old GL context after surface changed");
+ }
+ GLContextShareSet.contextDestroyed(this);
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": !!! Destroyed OpenGL context " + toHexString(hglrc) + " due to JAWT_LOCK_SURFACE_CHANGED");
+ }
+ hglrc = 0;
+ }
+ }
+ int ret = super.makeCurrentImpl();
+ return ret;
+ } catch (RuntimeException e) {
+ try {
+ drawable.unlockSurface();
+ } catch (Exception e2) {
+ // do nothing if unlockSurface throws
+ }
+ throw(e);
+ }
}
- public void bindPbufferToTexture() {
- throw new GLException("Should not call this");
- }
-
- public void releasePbufferFromTexture() {
- throw new GLException("Should not call this");
- }
-
- protected synchronized boolean makeCurrent(Runnable initAction) throws GLException {
- if (pendingOffscreenResize && (nsContext != 0)) {
- if (pendingOffscreenWidth != width || pendingOffscreenHeight != height) {
- destroyPBuffer();
- initWidth = pendingOffscreenWidth;
- initHeight = pendingOffscreenHeight;
- createPbuffer(0, 0);
- pendingOffscreenResize = false;
- }
+ protected void releaseImpl() throws GLException {
+ try {
+ super.releaseImpl();
+ } finally {
+ drawable.unlockSurface();
}
- return super.makeCurrent(initAction);
}
-
- public synchronized void swapBuffers() throws GLException {
- }
}
diff --git a/src/classes/com/sun/opengl/impl/windows/WindowsOnscreenGLDrawable.java b/src/classes/com/sun/opengl/impl/windows/WindowsOnscreenGLDrawable.java
new file mode 100644
index 000000000..b1f2d57a1
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/windows/WindowsOnscreenGLDrawable.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.windows;
+
+import java.awt.Component;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class WindowsOnscreenGLDrawable extends WindowsGLDrawable {
+ public static final int LOCK_SURFACE_NOT_READY = 1;
+ public static final int LOCK_SURFACE_CHANGED = 2;
+ public static final int LOCK_SUCCESS = 3;
+ private static JAWT jawt;
+
+ // Variables for lockSurface/unlockSurface
+ private JAWT_DrawingSurface ds;
+ private JAWT_DrawingSurfaceInfo dsi;
+ private JAWT_Win32DrawingSurfaceInfo win32dsi;
+
+ // Indicates whether the component (if an onscreen context) has been
+ // realized. Plausibly, before the component is realized the JAWT
+ // should return an error or NULL object from some of its
+ // operations; this appears to be the case on Win32 but is not true
+ // at least with Sun's current X11 implementation (1.4.x), which
+ // crashes with no other error reported if the DrawingSurfaceInfo is
+ // fetched from a locked DrawingSurface during the validation as a
+ // result of calling show() on the main thread. To work around this
+ // we prevent any JAWT or OpenGL operations from being done until
+ // addNotify() is called on the component.
+ protected boolean realized;
+
+ public WindowsOnscreenGLDrawable(Component component,
+ GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser) {
+ super(component, capabilities, chooser);
+ }
+
+ public GLContext createContext(GLContext shareWith) {
+ return new WindowsOnscreenGLContext(this, shareWith);
+ }
+
+ public void setRealized(boolean realized) {
+ this.realized = realized;
+ if (!realized) {
+ // Assume heavyweight widget was destroyed
+ pixelFormatChosen = false;
+ }
+ }
+
+ public void setSize(int width, int height) {
+ component.setSize(width, height);
+ }
+
+ public int getWidth() {
+ return component.getWidth();
+ }
+
+ public int getHeight() {
+ return component.getHeight();
+ }
+
+ public void swapBuffers() throws GLException {
+ boolean didLock = false;
+
+ if (hdc == 0) {
+ if (lockSurface() == LOCK_SURFACE_NOT_READY) {
+ return;
+ }
+ didLock = true;
+ }
+
+ if (!WGL.SwapBuffers(hdc) && (WGL.GetLastError() != 0)) {
+ throw new GLException("Error swapping buffers");
+ }
+
+ if (didLock) {
+ unlockSurface();
+ }
+ }
+
+ public int lockSurface() throws GLException {
+ if (!realized) {
+ return LOCK_SURFACE_NOT_READY;
+ }
+ if (hdc != 0) {
+ throw new GLException("Surface already locked");
+ }
+ ds = getJAWT().GetDrawingSurface(component);
+ if (ds == null) {
+ // Widget not yet realized
+ return LOCK_SURFACE_NOT_READY;
+ }
+ int res = ds.Lock();
+ if ((res & JAWTFactory.JAWT_LOCK_ERROR) != 0) {
+ throw new GLException("Unable to lock surface");
+ }
+ // See whether the surface changed and if so destroy the old
+ // OpenGL context so it will be recreated (NOTE: removeNotify
+ // should handle this case, but it may be possible that race
+ // conditions can cause this code to be triggered -- should test
+ // more)
+ int ret = LOCK_SUCCESS;
+ if ((res & JAWTFactory.JAWT_LOCK_SURFACE_CHANGED) != 0) {
+ ret = LOCK_SURFACE_CHANGED;
+ }
+ dsi = ds.GetDrawingSurfaceInfo();
+ if (dsi == null) {
+ // Widget not yet realized
+ ds.Unlock();
+ getJAWT().FreeDrawingSurface(ds);
+ ds = null;
+ return LOCK_SURFACE_NOT_READY;
+ }
+ win32dsi = (JAWT_Win32DrawingSurfaceInfo) dsi.platformInfo();
+ hdc = win32dsi.hdc();
+ if (hdc == 0) {
+ // Widget not yet realized
+ ds.FreeDrawingSurfaceInfo(dsi);
+ ds.Unlock();
+ getJAWT().FreeDrawingSurface(ds);
+ ds = null;
+ dsi = null;
+ win32dsi = null;
+ return LOCK_SURFACE_NOT_READY;
+ }
+ if (!pixelFormatChosen) {
+ choosePixelFormat(true);
+ }
+ return ret;
+ }
+
+ public void unlockSurface() {
+ if (hdc == 0) {
+ throw new GLException("Surface already unlocked");
+ }
+ ds.FreeDrawingSurfaceInfo(dsi);
+ ds.Unlock();
+ getJAWT().FreeDrawingSurface(ds);
+ ds = null;
+ dsi = null;
+ win32dsi = null;
+ hdc = 0;
+ }
+
+ //----------------------------------------------------------------------
+ // Internals only below this point
+ //
+
+ private JAWT getJAWT() {
+ if (jawt == null) {
+ JAWT j = new JAWT();
+ j.version(JAWTFactory.JAWT_VERSION_1_4);
+ if (!JAWTFactory.JAWT_GetAWT(j)) {
+ throw new RuntimeException("Unable to initialize JAWT");
+ }
+ jawt = j;
+ }
+ return jawt;
+ }
+}
diff --git a/src/classes/com/sun/opengl/impl/windows/WindowsPbufferGLContext.java b/src/classes/com/sun/opengl/impl/windows/WindowsPbufferGLContext.java
new file mode 100644
index 000000000..edfc70e5f
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/windows/WindowsPbufferGLContext.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.windows;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class WindowsPbufferGLContext extends WindowsGLContext {
+ private static final boolean DEBUG = Debug.debug("WindowsPbufferGLContext");
+
+ // State for render-to-texture and render-to-texture-rectangle support
+ private WindowsPbufferGLDrawable drawable;
+ private boolean rtt; // render-to-texture?
+ private boolean hasRTT; // render-to-texture extension available?
+ private boolean rect; // render-to-texture-rectangle?
+ private int textureTarget; // e.g. GL_TEXTURE_2D, GL_TEXTURE_RECTANGLE_NV
+ private int texture; // actual texture object
+
+ public WindowsPbufferGLContext(WindowsPbufferGLDrawable drawable,
+ GLContext shareWith) {
+ super(drawable, shareWith);
+ this.drawable = drawable;
+ }
+
+ public void bindPbufferToTexture() {
+ if (!rtt) {
+ throw new GLException("Shouldn't try to bind a pbuffer to a texture if render-to-texture hasn't been " +
+ "specified in its GLCapabilities");
+ }
+ GL gl = getGL();
+ WGLExt wglExt = getWGLExt();
+ gl.glBindTexture(textureTarget, texture);
+ if (rtt && hasRTT) {
+ if (!wglExt.wglBindTexImageARB(drawable.getPbuffer(), WGLExt.WGL_FRONT_LEFT_ARB)) {
+ throw new GLException("Binding of pbuffer to texture failed: " + wglGetLastError());
+ }
+ }
+ // FIXME: comment is wrong now
+ // Note that if the render-to-texture extension is not supported,
+ // we perform a glCopyTexImage2D in swapBuffers().
+ }
+
+ public void releasePbufferFromTexture() {
+ if (!rtt) {
+ throw new GLException("Shouldn't try to bind a pbuffer to a texture if render-to-texture hasn't been " +
+ "specified in its GLCapabilities");
+ }
+ if (rtt && hasRTT) {
+ WGLExt wglExt = getWGLExt();
+ if (!wglExt.wglReleaseTexImageARB(drawable.getPbuffer(), WGLExt.WGL_FRONT_LEFT_ARB)) {
+ throw new GLException("Releasing of pbuffer from texture failed: " + wglGetLastError());
+ }
+ }
+ }
+
+ protected int makeCurrentImpl() throws GLException {
+ if (drawable.getHDC() == 0) {
+ // pbuffer not instantiated (yet?)
+ if (DEBUG) {
+ System.err.println("pbuffer not instantiated");
+ }
+ return CONTEXT_NOT_CURRENT;
+ }
+
+ int res = super.makeCurrentImpl();
+ if (DEBUG && VERBOSE) {
+ System.err.println("WindowsPbufferGLContext: super.makeCurrentImpl() = " + res);
+ }
+ if (res == CONTEXT_CURRENT_NEW) {
+ GLCapabilities capabilities = drawable.getCapabilities();
+
+ // Initialize render-to-texture support if requested
+ rtt = capabilities.getOffscreenRenderToTexture();
+ rect = capabilities.getOffscreenRenderToTextureRectangle();
+ GL gl = getGL();
+
+ if (rtt) {
+ if (DEBUG) {
+ System.err.println("Initializing render-to-texture support");
+ }
+
+ if (!gl.isExtensionAvailable("WGL_ARB_render_texture")) {
+ System.err.println("WindowsPbufferGLContext: WARNING: WGL_ARB_render_texture extension not " +
+ "supported; implementing render_to_texture support using slow texture readback");
+ } else {
+ hasRTT = true;
+
+ if (rect && !gl.isExtensionAvailable("GL_NV_texture_rectangle")) {
+ System.err.println("WindowsPbufferGLContext: WARNING: GL_NV_texture_rectangle extension not " +
+ "supported; skipping requested render_to_texture_rectangle support for pbuffer");
+ rect = false;
+ }
+ if (rect) {
+ if (DEBUG) {
+ System.err.println(" Using render-to-texture-rectangle");
+ }
+ textureTarget = GL.GL_TEXTURE_RECTANGLE_NV;
+ } else {
+ if (DEBUG) {
+ System.err.println(" Using vanilla render-to-texture");
+ }
+ textureTarget = GL.GL_TEXTURE_2D;
+ }
+ int[] tmp = new int[1];
+ gl.glGenTextures(1, tmp, 0);
+ texture = tmp[0];
+ gl.glBindTexture(textureTarget, texture);
+ gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
+ gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
+ gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP_TO_EDGE);
+ gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP_TO_EDGE);
+ gl.glCopyTexImage2D(textureTarget, 0, GL.GL_RGB, 0, 0, drawable.getWidth(), drawable.getHeight(), 0);
+ }
+ }
+ }
+ return res;
+ }
+
+ public int getFloatingPointMode() {
+ return drawable.getFloatingPointMode();
+ }
+
+ private static String wglGetLastError() {
+ return WindowsGLDrawableFactory.wglGetLastError();
+ }
+}
diff --git a/src/classes/com/sun/opengl/impl/windows/WindowsPbufferGLDrawable.java b/src/classes/com/sun/opengl/impl/windows/WindowsPbufferGLDrawable.java
new file mode 100644
index 000000000..8e660cc51
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/windows/WindowsPbufferGLDrawable.java
@@ -0,0 +1,399 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.windows;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class WindowsPbufferGLDrawable extends WindowsGLDrawable {
+ private int initWidth;
+ private int initHeight;
+
+ private WGLExt cachedWGLExt; // cached WGLExt instance from parent GLCanvas,
+ // needed to destroy pbuffer
+ private long buffer; // pbuffer handle
+ private int width;
+ private int height;
+
+ private int floatMode;
+
+ public WindowsPbufferGLDrawable(GLCapabilities capabilities,
+ int initialWidth,
+ int initialHeight,
+ WindowsGLDrawable dummyDrawable,
+ WGLExt wglExt) {
+ super(null, capabilities, null);
+ this.initWidth = initialWidth;
+ this.initHeight = initialHeight;
+ if (initWidth <= 0 || initHeight <= 0) {
+ throw new GLException("Initial width and height of pbuffer must be positive (were (" +
+ initWidth + ", " + initHeight + "))");
+ }
+
+ if (DEBUG) {
+ System.out.println("Pbuffer caps on init: " + capabilities +
+ (capabilities.getOffscreenRenderToTexture() ? " [rtt]" : "") +
+ (capabilities.getOffscreenRenderToTextureRectangle() ? " [rect]" : "") +
+ (capabilities.getOffscreenFloatingPointBuffers() ? " [float]" : ""));
+ }
+
+ createPbuffer(dummyDrawable.getHDC(), wglExt);
+ }
+
+ public GLContext createContext(GLContext shareWith) {
+ return new WindowsPbufferGLContext(this, shareWith);
+ }
+
+ public void destroy() {
+ if (hdc != 0) {
+ // Must release DC and pbuffer
+ // NOTE that since the context is not current, glGetError() can
+ // not be called here, so we skip the use of any composable
+ // pipelines (see WindowsOnscreenGLContext.makeCurrentImpl)
+ WGLExt wglExt = cachedWGLExt;
+ if (wglExt.wglReleasePbufferDCARB(buffer, hdc) == 0) {
+ throw new GLException("Error releasing pbuffer device context: error code " + WGL.GetLastError());
+ }
+ hdc = 0;
+ if (!wglExt.wglDestroyPbufferARB(buffer)) {
+ throw new GLException("Error destroying pbuffer: error code " + WGL.GetLastError());
+ }
+ buffer = 0;
+ }
+ }
+
+ public void setSize(int width, int height) {
+ // FIXME
+ throw new GLException("Not yet implemented");
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public int getHeight() {
+ return height;
+ }
+
+ public GLCapabilities getCapabilities() {
+ return capabilities;
+ }
+
+ public long getPbuffer() {
+ return buffer;
+ }
+
+ public int getFloatingPointMode() {
+ return floatMode;
+ }
+
+ public void swapBuffers() throws GLException {
+ // FIXME: this doesn't make sense any more because we don't have
+ // access to our OpenGL context here
+ /*
+ // FIXME: do we need to do anything if the pbuffer is double-buffered?
+ // For now, just grab the pixels for the render-to-texture support.
+ if (rtt && !hasRTT) {
+ if (DEBUG) {
+ System.err.println("Copying pbuffer data to GL_TEXTURE_2D state");
+ }
+
+ GL gl = getGL();
+ gl.glCopyTexSubImage2D(textureTarget, 0, 0, 0, 0, 0, width, height);
+ }
+ */
+ }
+
+ private void createPbuffer(long parentHdc, WGLExt wglExt) {
+ int[] iattributes = new int [2*MAX_ATTRIBS];
+ float[] fattributes = new float[2*MAX_ATTRIBS];
+ int nfattribs = 0;
+ int niattribs = 0;
+
+ if (DEBUG) {
+ System.out.println("Pbuffer parentHdc = " + toHexString(parentHdc));
+ System.out.println("Pbuffer caps: " + capabilities +
+ (capabilities.getOffscreenRenderToTexture() ? " [rtt]" : "") +
+ (capabilities.getOffscreenRenderToTextureRectangle() ? " [rect]" : "") +
+ (capabilities.getOffscreenFloatingPointBuffers() ? " [float]" : ""));
+ }
+
+ boolean rtt = capabilities.getOffscreenRenderToTexture();
+ boolean rect = capabilities.getOffscreenRenderToTextureRectangle();
+ boolean useFloat = capabilities.getOffscreenFloatingPointBuffers();
+ boolean ati = false;
+
+ // Since we are trying to create a pbuffer, the pixel format we
+ // request (and subsequently use) must be "p-buffer capable".
+ iattributes[niattribs++] = WGLExt.WGL_DRAW_TO_PBUFFER_ARB;
+ iattributes[niattribs++] = GL.GL_TRUE;
+
+ if (rtt && !rect) {
+ throw new GLException("Render-to-texture-rectangle requires render-to-texture to be specified");
+ }
+
+ if (rect) {
+ if (!wglExt.isExtensionAvailable("GL_NV_texture_rectangle")) {
+ throw new GLException("Render-to-texture-rectangle requires GL_NV_texture_rectangle extension");
+ }
+ }
+
+ if (useFloat) {
+ if (!wglExt.isExtensionAvailable("WGL_ATI_pixel_format_float") &&
+ !wglExt.isExtensionAvailable("WGL_NV_float_buffer")) {
+ throw new GLException("Floating-point pbuffers not supported by this hardware");
+ }
+
+ // Prefer NVidia extension over ATI
+ if (wglExt.isExtensionAvailable("WGL_NV_float_buffer")) {
+ ati = false;
+ floatMode = GLPbuffer.NV_FLOAT;
+ } else {
+ ati = true;
+ floatMode = GLPbuffer.ATI_FLOAT;
+ }
+ if (DEBUG) {
+ System.err.println("Using " + (ati ? "ATI" : "NVidia") + " floating-point extension");
+ }
+ }
+
+ if (useFloat && ati) {
+ if (rtt) {
+ throw new GLException("Render-to-floating-point-texture not supported on ATI hardware");
+ } else {
+ iattributes[niattribs++] = WGLExt.WGL_PIXEL_TYPE_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_TYPE_RGBA_FLOAT_ATI;
+ }
+ } else {
+ if (!rtt) {
+ // Currently we don't support non-truecolor visuals in the
+ // GLCapabilities, so we don't offer the option of making
+ // color-index pbuffers.
+ iattributes[niattribs++] = WGLExt.WGL_PIXEL_TYPE_ARB;
+ iattributes[niattribs++] = WGLExt.WGL_TYPE_RGBA_ARB;
+ }
+ }
+
+ iattributes[niattribs++] = WGLExt.WGL_DOUBLE_BUFFER_ARB;
+ if (capabilities.getDoubleBuffered()) {
+ iattributes[niattribs++] = GL.GL_TRUE;
+ } else {
+ iattributes[niattribs++] = GL.GL_FALSE;
+ }
+
+ iattributes[niattribs++] = WGLExt.WGL_DEPTH_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getDepthBits();
+
+ iattributes[niattribs++] = WGLExt.WGL_RED_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getRedBits();
+
+ iattributes[niattribs++] = WGLExt.WGL_GREEN_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getGreenBits();
+
+ iattributes[niattribs++] = WGLExt.WGL_BLUE_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getBlueBits();
+
+ iattributes[niattribs++] = WGLExt.WGL_ALPHA_BITS_ARB;
+ iattributes[niattribs++] = capabilities.getAlphaBits();
+
+ iattributes[niattribs++] = WGLExt.WGL_STENCIL_BITS_ARB;
+ if (capabilities.getStencilBits() > 0) {
+ iattributes[niattribs++] = GL.GL_TRUE;
+ } else {
+ iattributes[niattribs++] = GL.GL_FALSE;
+ }
+
+ if (capabilities.getAccumRedBits() > 0 ||
+ capabilities.getAccumGreenBits() > 0 ||
+ capabilities.getAccumBlueBits() > 0) {
+ iattributes[niattribs++] = WGLExt.WGL_ACCUM_BITS_ARB;
+ iattributes[niattribs++] = GL.GL_TRUE;
+ }
+
+ if (useFloat && !ati) {
+ iattributes[niattribs++] = WGLExt.WGL_FLOAT_COMPONENTS_NV;
+ iattributes[niattribs++] = GL.GL_TRUE;
+ }
+
+ if (rtt) {
+ if (useFloat) {
+ assert(!ati);
+ if (!rect) {
+ throw new GLException("Render-to-floating-point-texture only supported on NVidia hardware with render-to-texture-rectangle");
+ }
+ iattributes[niattribs++] = WGLExt.WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV;
+ iattributes[niattribs++] = GL.GL_TRUE;
+ } else {
+ iattributes[niattribs++] = rect ? WGLExt.WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV : WGLExt.WGL_BIND_TO_TEXTURE_RGB_ARB;
+ iattributes[niattribs++] = GL.GL_TRUE;
+ }
+ }
+
+ iattributes[niattribs++] = WGLExt.WGL_SUPPORT_OPENGL_ARB;
+ iattributes[niattribs++] = GL.GL_TRUE;
+
+ int[] pformats = new int[MAX_PFORMATS];
+ int nformats;
+ int[] nformatsTmp = new int[1];
+ if (!wglExt.wglChoosePixelFormatARB(parentHdc,
+ iattributes, 0,
+ fattributes, 0,
+ MAX_PFORMATS,
+ pformats, 0,
+ nformatsTmp, 0)) {
+ throw new GLException("pbuffer creation error: wglChoosePixelFormatARB() failed");
+ }
+ nformats = nformatsTmp[0];
+ if (nformats <= 0) {
+ throw new GLException("pbuffer creation error: Couldn't find a suitable pixel format");
+ }
+
+ if (DEBUG) {
+ System.err.println("" + nformats + " suitable pixel formats found");
+ // query pixel format
+ iattributes[0] = WGLExt.WGL_RED_BITS_ARB;
+ iattributes[1] = WGLExt.WGL_GREEN_BITS_ARB;
+ iattributes[2] = WGLExt.WGL_BLUE_BITS_ARB;
+ iattributes[3] = WGLExt.WGL_ALPHA_BITS_ARB;
+ iattributes[4] = WGLExt.WGL_DEPTH_BITS_ARB;
+ iattributes[5] = (useFloat ? (ati ? WGLExt.WGL_PIXEL_TYPE_ARB : WGLExt.WGL_FLOAT_COMPONENTS_NV) : WGLExt.WGL_RED_BITS_ARB);
+ iattributes[6] = WGLExt.WGL_SAMPLE_BUFFERS_EXT;
+ iattributes[7] = WGLExt.WGL_SAMPLES_EXT;
+ iattributes[8] = WGLExt.WGL_DRAW_TO_PBUFFER_ARB;
+ int[] ivalues = new int[9];
+ for (int i = 0; i < nformats; i++) {
+ if (!wglExt.wglGetPixelFormatAttribivARB(parentHdc, pformats[i], 0, 9, iattributes, 0, ivalues, 0)) {
+ throw new GLException("Error while querying pixel format " + pformats[i] +
+ "'s (index " + i + "'s) capabilities for debugging");
+ }
+ System.err.print("pixel format " + pformats[i] + " (index " + i + "): ");
+ System.err.print( "r: " + ivalues[0]);
+ System.err.print(" g: " + ivalues[1]);
+ System.err.print(" b: " + ivalues[2]);
+ System.err.print(" a: " + ivalues[3]);
+ System.err.print(" depth: " + ivalues[4]);
+ System.err.print(" multisample: " + ivalues[6]);
+ System.err.print(" samples: " + ivalues[7]);
+ if (useFloat) {
+ if (ati) {
+ if (ivalues[5] == WGLExt.WGL_TYPE_RGBA_FLOAT_ATI) {
+ System.err.print(" [ati float]");
+ } else if (ivalues[5] != WGLExt.WGL_TYPE_RGBA_ARB) {
+ System.err.print(" [unknown pixel type " + ivalues[5] + "]");
+ }
+ } else {
+ if (ivalues[5] != 0) {
+ System.err.print(" [float]");
+ }
+ }
+ }
+
+ if (ivalues[8] != 0) {
+ System.err.print(" [pbuffer]");
+ }
+ System.err.println();
+ }
+ }
+
+ long tmpBuffer = 0;
+ int whichFormat = 0;
+ // Loop is a workaround for bugs in NVidia's recent drivers
+ do {
+ int format = pformats[whichFormat];
+
+ // Create the p-buffer.
+ niattribs = 0;
+
+ if (rtt) {
+ iattributes[niattribs++] = WGLExt.WGL_TEXTURE_FORMAT_ARB;
+ if (useFloat) {
+ iattributes[niattribs++] = WGLExt.WGL_TEXTURE_FLOAT_RGB_NV;
+ } else {
+ iattributes[niattribs++] = WGLExt.WGL_TEXTURE_RGBA_ARB;
+ }
+
+ iattributes[niattribs++] = WGLExt.WGL_TEXTURE_TARGET_ARB;
+ iattributes[niattribs++] = rect ? WGLExt.WGL_TEXTURE_RECTANGLE_NV : WGLExt.WGL_TEXTURE_2D_ARB;
+
+ iattributes[niattribs++] = WGLExt.WGL_MIPMAP_TEXTURE_ARB;
+ iattributes[niattribs++] = GL.GL_FALSE;
+
+ iattributes[niattribs++] = WGLExt.WGL_PBUFFER_LARGEST_ARB;
+ iattributes[niattribs++] = GL.GL_FALSE;
+ }
+
+ iattributes[niattribs++] = 0;
+
+ tmpBuffer = wglExt.wglCreatePbufferARB(parentHdc, format, initWidth, initHeight, iattributes, 0);
+ ++whichFormat;
+ } while ((tmpBuffer == 0) && (whichFormat < nformats));
+
+ if (tmpBuffer == 0) {
+ throw new GLException("pbuffer creation error: wglCreatePbufferARB() failed: tried " + nformats +
+ " pixel formats, last error was: " + wglGetLastError());
+ }
+
+ // Get the device context.
+ long tmpHdc = wglExt.wglGetPbufferDCARB(tmpBuffer);
+ if (tmpHdc == 0) {
+ throw new GLException("pbuffer creation error: wglGetPbufferDCARB() failed");
+ }
+
+ // Set up instance variables
+ buffer = tmpBuffer;
+ hdc = tmpHdc;
+ cachedWGLExt = wglExt;
+
+ // Determine the actual width and height we were able to create.
+ int[] tmp = new int[1];
+ wglExt.wglQueryPbufferARB( buffer, WGLExt.WGL_PBUFFER_WIDTH_ARB, tmp, 0 );
+ width = tmp[0];
+ wglExt.wglQueryPbufferARB( buffer, WGLExt.WGL_PBUFFER_HEIGHT_ARB, tmp, 0 );
+ height = tmp[0];
+
+ if (DEBUG) {
+ System.err.println("Created pbuffer " + width + " x " + height);
+ }
+ }
+
+ private static String wglGetLastError() {
+ return WindowsGLDrawableFactory.wglGetLastError();
+ }
+}
diff --git a/src/net/java/games/jogl/GLContextHelper.java b/src/classes/com/sun/opengl/impl/x11/X11ExternalGLContext.java
index f4878a723..4d329ba24 100644..100755
--- a/src/net/java/games/jogl/GLContextHelper.java
+++ b/src/classes/com/sun/opengl/impl/x11/X11ExternalGLContext.java
@@ -37,32 +37,47 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl;
+package com.sun.opengl.impl.x11;
-import net.java.games.jogl.impl.*;
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
-/** This package-private class helps extract a GLContext from a
- GLDrawable. The getContext() method can not be placed in the
- public API of GLDrawable without exposing the GLContext class to
- the public API, which is not desired. */
+public class X11ExternalGLContext extends X11GLContext {
+ private boolean firstMakeCurrent = true;
+ private boolean created = true;
-class GLContextHelper {
- static GLContext getContext(GLDrawable drawable) throws GLException {
- if (drawable == null) {
- return null;
+ public X11ExternalGLContext() {
+ super(null, null);
+ lockAWT();
+ try {
+ context = GLX.glXGetCurrentContext();
+ } finally {
+ unlockAWT();
}
+ GLContextShareSet.contextCreated(this);
+ resetGLFunctionAvailability();
+ }
+
+ protected void create() {
+ }
- if (drawable instanceof GLCanvas) {
- return ((GLCanvas) drawable).getContext();
- } else if (drawable instanceof GLJPanel) {
- return ((GLJPanel) drawable).getContext();
- } else if (drawable instanceof GLPbufferImpl) {
- return ((GLPbufferImpl) drawable).getContext();
- } else {
- throw new GLException(
- "Sharing of contexts and display lists not supported among user-defined GLDrawables " +
- "(unknown drawable type " + drawable.getClass().getName() + ")"
- );
+ protected int makeCurrentImpl() throws GLException {
+ if (firstMakeCurrent) {
+ firstMakeCurrent = false;
+ return CONTEXT_CURRENT_NEW;
}
+ return CONTEXT_CURRENT;
+ }
+
+ protected void releaseImpl() throws GLException {
+ }
+
+ protected void destroyImpl() throws GLException {
+ created = false;
+ GLContextShareSet.contextDestroyed(this);
+ }
+
+ public boolean isCreated() {
+ return created;
}
}
diff --git a/src/classes/com/sun/opengl/impl/x11/X11ExternalGLDrawable.java b/src/classes/com/sun/opengl/impl/x11/X11ExternalGLDrawable.java
new file mode 100755
index 000000000..371930013
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/x11/X11ExternalGLDrawable.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.x11;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class X11ExternalGLDrawable extends X11GLDrawable {
+ private int fbConfigID;
+ private int renderType;
+ private int screen;
+ private long readDrawable;
+
+ public X11ExternalGLDrawable() {
+ super(null, null, null);
+ lockAWT();
+ try {
+ display = GLX.glXGetCurrentDisplay();
+ drawable = GLX.glXGetCurrentDrawable();
+ readDrawable = GLX.glXGetCurrentReadDrawable();
+
+ // Need GLXFBConfig ID in order to properly create new contexts
+ // on this drawable
+ long context = GLX.glXGetCurrentContext();
+ int[] val = new int[1];
+ GLX.glXQueryContext(display, context, GLX.GLX_FBCONFIG_ID, val, 0);
+ fbConfigID = val[0];
+ renderType = GLX.GLX_RGBA_TYPE;
+ GLX.glXQueryContext(display, context, GLX.GLX_RENDER_TYPE, val, 0);
+ if ((val[0] & GLX.GLX_RGBA_BIT) == 0) {
+ if (DEBUG) {
+ System.err.println("X11ExternalGLDrawable: WARNING: forcing GLX_RGBA_TYPE for newly created contexts");
+ }
+ }
+ GLX.glXQueryContext(display, context, GLX.GLX_SCREEN, val, 0);
+ screen = val[0];
+ } finally {
+ unlockAWT();
+ }
+ }
+
+ public GLContext createContext(GLContext shareWith) {
+ return new Context(shareWith);
+ }
+
+ public void setSize(int newWidth, int newHeight) {
+ throw new GLException("Should not call this");
+ }
+
+ public int getWidth() {
+ throw new GLException("Should not call this");
+ }
+
+ public int getHeight() {
+ throw new GLException("Should not call this");
+ }
+
+ public void destroy() {
+ }
+
+ class Context extends X11GLContext {
+ Context(GLContext shareWith) {
+ super(X11ExternalGLDrawable.this, shareWith);
+ this.drawable = drawable;
+ }
+
+ protected int makeCurrentImpl() throws GLException {
+ if (drawable.getDrawable() == 0) {
+ // parent drawable not properly initialized
+ // FIXME: signal error?
+ if (DEBUG) {
+ System.err.println("parent drawable not properly initialized");
+ }
+ return CONTEXT_NOT_CURRENT;
+ }
+
+ // Note that we have to completely override makeCurrentImpl
+ // because the underlying makeCurrent call differs from the norm
+ lockAWT();
+ try {
+ boolean created = false;
+ if (context == 0) {
+ create();
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": !!! Created GL context for " + getClass().getName());
+ }
+ created = true;
+ }
+
+ if (!GLX.glXMakeContextCurrent(drawable.getDisplay(),
+ drawable.getDrawable(),
+ readDrawable,
+ context)) {
+ throw new GLException("Error making context current");
+ } else {
+ mostRecentDisplay = drawable.getDisplay();
+ if (DEBUG && VERBOSE) {
+ System.err.println(getThreadName() + ": glXMakeCurrent(display " + toHexString(drawable.getDisplay()) +
+ ", drawable " + toHexString(drawable.getDrawable()) +
+ ", context " + toHexString(context) + ") succeeded");
+ }
+ }
+
+ if (created) {
+ resetGLFunctionAvailability();
+ return CONTEXT_CURRENT_NEW;
+ }
+ return CONTEXT_CURRENT;
+ } finally {
+ unlockAWT();
+ }
+ }
+
+ protected void releaseImpl() throws GLException {
+ lockAWT();
+ try {
+ if (!GLX.glXMakeContextCurrent(drawable.getDisplay(), 0, 0, 0)) {
+ throw new GLException("Error freeing OpenGL context");
+ }
+ } finally {
+ unlockAWT();
+ }
+ }
+
+ protected void create() {
+ // We already have the GLXFBConfig ID for the context. All we
+ // need to do is use it to choose the GLXFBConfig and then
+ // create a context with it.
+ int[] iattributes = new int[] {
+ GLX.GLX_FBCONFIG_ID,
+ fbConfigID,
+ 0,
+ 0
+ };
+ float[] fattributes = new float[0];
+ int[] nelementsTmp = new int[1];
+ GLXFBConfig[] fbConfigs = GLX.glXChooseFBConfig(display, screen, iattributes, 0, nelementsTmp, 0);
+ int nelements = nelementsTmp[0];
+ if (nelements <= 0) {
+ throw new GLException("context creation error: couldn't find a suitable frame buffer configuration");
+ }
+ if (nelements != 1) {
+ throw new GLException("context creation error: shouldn't get more than one GLXFBConfig");
+ }
+ // Note that we currently don't allow selection of anything but
+ // the first GLXFBConfig in the returned list (there should be only one)
+ GLXFBConfig fbConfig = fbConfigs[0];
+ // Create a gl context for the drawable
+ X11GLContext other = (X11GLContext) GLContextShareSet.getShareContext(this);
+ long share = 0;
+ if (other != null) {
+ share = other.getContext();
+ if (share == 0) {
+ throw new GLException("GLContextShareSet returned an invalid OpenGL context");
+ }
+ }
+ // FIXME: how to determine "direct" bit?
+ context = GLX.glXCreateNewContext(display, fbConfig, renderType, share, true);
+ if (context == 0) {
+ String detail = " display=" + toHexString(display) +
+ " fbconfig=" + fbConfig +
+ " fbconfigID=" + toHexString(fbConfigID) +
+ " renderType=" + toHexString(renderType) +
+ " share=" + toHexString(share);
+ throw new GLException("context creation error: glXCreateNewContext() failed: " + detail);
+ }
+ GLContextShareSet.contextCreated(this);
+
+ if (DEBUG) {
+ System.err.println("Created context " + toHexString(context) +
+ " for GLXDrawable " + toHexString(drawable.getDrawable()));
+ }
+ }
+ }
+}
diff --git a/src/classes/com/sun/opengl/impl/x11/X11GLContext.java b/src/classes/com/sun/opengl/impl/x11/X11GLContext.java
new file mode 100644
index 000000000..ed9736f22
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/x11/X11GLContext.java
@@ -0,0 +1,301 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.x11;
+
+import java.nio.*;
+import java.util.*;
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public abstract class X11GLContext extends GLContextImpl {
+ protected X11GLDrawable drawable;
+ protected long context;
+ private boolean glXQueryExtensionsStringInitialized;
+ private boolean glXQueryExtensionsStringAvailable;
+ private static final Map/*<String, String>*/ functionNameMap;
+ private GLXExt glXExt;
+ // Table that holds the addresses of the native C-language entry points for
+ // GLX extension functions.
+ private GLXExtProcAddressTable glXExtProcAddressTable;
+ // Cache the most recent value of the "display" variable (which we
+ // only guarantee to be valid in between makeCurrent / free pairs)
+ // so that we can implement displayImpl() (which must be done when
+ // the context is not current)
+ protected long mostRecentDisplay;
+
+ static {
+ functionNameMap = new HashMap();
+ functionNameMap.put("glAllocateMemoryNV", "glXAllocateMemoryNV");
+ functionNameMap.put("glFreeMemoryNV", "glXFreeMemoryNV");
+ }
+
+ public X11GLContext(X11GLDrawable drawable,
+ GLContext shareWith) {
+ super(shareWith);
+ this.drawable = drawable;
+ }
+
+ public Object getPlatformGLExtensions() {
+ return getGLXExt();
+ }
+
+ public GLXExt getGLXExt() {
+ if (glXExt == null) {
+ glXExt = new GLXExtImpl(this);
+ }
+ return glXExt;
+ }
+
+ public GLDrawable getGLDrawable() {
+ return drawable;
+ }
+
+ protected String mapToRealGLFunctionName(String glFunctionName) {
+ String lookup = (String) functionNameMap.get(glFunctionName);
+ if (lookup != null) {
+ return lookup;
+ }
+ return glFunctionName;
+ }
+
+ protected String mapToRealGLExtensionName(String glExtensionName) {
+ return glExtensionName;
+ }
+
+ /** Helper routine which usually just turns around and calls
+ * createContext (except for pbuffers, which use a different context
+ * creation mechanism). Should only be called by {@link
+ * makeCurrentImpl()}.
+ */
+ protected abstract void create();
+
+ /**
+ * Creates and initializes an appropriate OpenGL context. Should only be
+ * called by {@link create()}.
+ */
+ protected void createContext(boolean onscreen) {
+ XVisualInfo vis = drawable.chooseVisual(onscreen);
+ X11GLContext other = (X11GLContext) GLContextShareSet.getShareContext(this);
+ long share = 0;
+ if (other != null) {
+ share = other.getContext();
+ if (share == 0) {
+ throw new GLException("GLContextShareSet returned an invalid OpenGL context");
+ }
+ }
+ context = GLX.glXCreateContext(drawable.getDisplay(), vis, share, onscreen);
+ if (context == 0) {
+ throw new GLException("Unable to create OpenGL context");
+ }
+ GLContextShareSet.contextCreated(this);
+ }
+
+ protected int makeCurrentImpl() throws GLException {
+ // FIXME: in offscreen (non-pbuffer) case this is run without the
+ // AWT lock held
+ boolean created = false;
+ if (context == 0) {
+ create();
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": !!! Created GL context for " + getClass().getName());
+ }
+ created = true;
+ }
+
+ if (!GLX.glXMakeCurrent(drawable.getDisplay(), drawable.getDrawable(), context)) {
+ throw new GLException("Error making context current");
+ } else {
+ mostRecentDisplay = drawable.getDisplay();
+ if (DEBUG && VERBOSE) {
+ System.err.println(getThreadName() + ": glXMakeCurrent(display " + toHexString(drawable.getDisplay()) +
+ ", drawable " + toHexString(drawable.getDrawable()) +
+ ", context " + toHexString(context) + ") succeeded");
+ }
+ }
+
+ if (created) {
+ resetGLFunctionAvailability();
+ return CONTEXT_CURRENT_NEW;
+ }
+ return CONTEXT_CURRENT;
+ }
+
+ protected void releaseImpl() throws GLException {
+ if (!GLX.glXMakeCurrent(drawable.getDisplay(), 0, 0)) {
+ throw new GLException("Error freeing OpenGL context");
+ }
+ }
+
+ protected void destroyImpl() throws GLException {
+ lockAWT();
+ if (context != 0) {
+ GLX.glXDestroyContext(mostRecentDisplay, context);
+ if (DEBUG) {
+ System.err.println("!!! Destroyed OpenGL context " + context);
+ }
+ context = 0;
+ mostRecentDisplay = 0;
+ GLContextShareSet.contextDestroyed(this);
+ }
+ unlockAWT();
+ }
+
+ public boolean isCreated() {
+ return (context != 0);
+ }
+
+ protected void resetGLFunctionAvailability() {
+ super.resetGLFunctionAvailability();
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": !!! Initializing GLX extension address table");
+ }
+ resetProcAddressTable(getGLXExtProcAddressTable());
+ }
+
+ public GLXExtProcAddressTable getGLXExtProcAddressTable() {
+ if (glXExtProcAddressTable == null) {
+ // FIXME: cache ProcAddressTables by capability bits so we can
+ // share them among contexts with the same capabilities
+ glXExtProcAddressTable = new GLXExtProcAddressTable();
+ }
+ return glXExtProcAddressTable;
+ }
+
+ public synchronized String getPlatformExtensionsString() {
+ if (drawable.getDisplay() == 0) {
+ throw new GLException("Context not current");
+ }
+ if (!glXQueryExtensionsStringInitialized) {
+ glXQueryExtensionsStringAvailable =
+ (GLDrawableFactoryImpl.getFactoryImpl().dynamicLookupFunction("glXQueryExtensionsString") != 0);
+ glXQueryExtensionsStringInitialized = true;
+ }
+ if (glXQueryExtensionsStringAvailable) {
+ lockAWT();
+ try {
+ String ret = GLX.glXQueryExtensionsString(drawable.getDisplay(), GLX.DefaultScreen(drawable.getDisplay()));
+ if (DEBUG) {
+ System.err.println("!!! GLX extensions: " + ret);
+ }
+ return ret;
+ } finally {
+ unlockAWT();
+ }
+ } else {
+ return "";
+ }
+ }
+
+ protected boolean isFunctionAvailable(String glFunctionName)
+ {
+ boolean available = super.isFunctionAvailable(glFunctionName);
+
+ // Sanity check for implementations that use proc addresses for run-time
+ // linking: if the function IS available, then make sure there's a proc
+ // address for it if it's an extension or not part of the OpenGL 1.1 core
+ // (post GL 1.1 functions are run-time linked on windows).
+ assert(!available ||
+ (getGLProcAddressTable().getAddressFor(mapToRealGLFunctionName(glFunctionName)) != 0 ||
+ FunctionAvailabilityCache.isPartOfGLCore("1.1", mapToRealGLFunctionName(glFunctionName)))
+ );
+
+ return available;
+ }
+
+ public boolean isExtensionAvailable(String glExtensionName) {
+ if (glExtensionName.equals("GL_ARB_pbuffer") ||
+ glExtensionName.equals("GL_ARB_pixel_format")) {
+ return GLDrawableFactory.getFactory().canCreateGLPbuffer();
+ }
+ return super.isExtensionAvailable(glExtensionName);
+ }
+
+
+ public void setSwapInterval(int interval) {
+ // FIXME: make the context current first? Currently assumes that
+ // will not be necessary. Make the caller do this?
+ GLXExt glXExt = getGLXExt();
+ if (glXExt.isExtensionAvailable("GLX_SGI_swap_control")) {
+ glXExt.glXSwapIntervalSGI(interval);
+ }
+ }
+
+ public ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3) {
+ return getGLXExt().glXAllocateMemoryNV(arg0, arg1, arg2, arg3);
+ }
+
+ public int getOffscreenContextPixelDataType() {
+ throw new GLException("Should not call this");
+ }
+
+ public int getOffscreenContextReadBuffer() {
+ throw new GLException("Should not call this");
+ }
+
+ public boolean offscreenImageNeedsVerticalFlip() {
+ throw new GLException("Should not call this");
+ }
+
+ public void bindPbufferToTexture() {
+ throw new GLException("Should not call this");
+ }
+
+ public void releasePbufferFromTexture() {
+ throw new GLException("Should not call this");
+ }
+
+ //----------------------------------------------------------------------
+ // Internals only below this point
+ //
+
+ protected long getContext() {
+ return context;
+ }
+
+ // These synchronization primitives prevent the AWT from making
+ // requests from the X server asynchronously to this code.
+ protected void lockAWT() {
+ X11GLDrawableFactory.lockAWT();
+ }
+
+ protected void unlockAWT() {
+ X11GLDrawableFactory.unlockAWT();
+ }
+}
diff --git a/src/classes/com/sun/opengl/impl/x11/X11GLDrawable.java b/src/classes/com/sun/opengl/impl/x11/X11GLDrawable.java
new file mode 100644
index 000000000..1d4f5389b
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/x11/X11GLDrawable.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.x11;
+
+import java.awt.Component;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public abstract class X11GLDrawable extends GLDrawableImpl {
+ protected static final boolean DEBUG = Debug.debug("X11GLDrawable");
+
+ protected long display;
+ protected long drawable;
+ protected long visualID;
+ protected Component component;
+ protected GLCapabilities capabilities;
+ protected GLCapabilitiesChooser chooser;
+
+ public X11GLDrawable(Component component,
+ GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser) {
+ this.component = component;
+ this.capabilities = (capabilities == null) ? null :
+ ((GLCapabilities) capabilities.clone());
+ this.chooser = chooser;
+ }
+
+ public void setRealized(boolean val) {
+ throw new GLException("Should not call this (should only be called for onscreen GLDrawables)");
+ }
+
+ public void destroy() {
+ throw new GLException("Should not call this (should only be called for offscreen GLDrawables)");
+ }
+
+ public void swapBuffers() throws GLException {
+ }
+
+ public long getDisplay() {
+ return display;
+ }
+
+ public long getDrawable() {
+ return drawable;
+ }
+
+ //---------------------------------------------------------------------------
+ // Internals only below this point
+ //
+
+ protected XVisualInfo chooseVisual(boolean onscreen) {
+ if (display == 0) {
+ throw new GLException("null display");
+ }
+
+ // FIXME
+ if (onscreen) {
+ // The visual has already been chosen by the time we get here;
+ // it's specified by the GraphicsConfiguration of the
+ // GLCanvas. Fortunately, the JAWT supplies the visual ID for
+ // the component in a portable fashion, so all we have to do is
+ // use XGetVisualInfo with a VisualIDMask to get the
+ // corresponding XVisualInfo to pass into glXChooseVisual.
+ int[] count = new int[1];
+ XVisualInfo template = new XVisualInfo();
+ // FIXME: probably not 64-bit clean
+ template.visualid((int) visualID);
+ lockAWT();
+ XVisualInfo[] infos = GLX.XGetVisualInfo(display, GLX.VisualIDMask, template, count, 0);
+ unlockAWT();
+ if (infos == null || infos.length == 0) {
+ throw new GLException("Error while getting XVisualInfo for visual ID " + visualID);
+ }
+ // FIXME: the storage for the infos array is leaked (should
+ // clean it up somehow when we're done with the visual we're
+ // returning)
+ return infos[0];
+ } else {
+ // It isn't clear to me whether we need this much code to handle
+ // the offscreen case, where we're creating a pixmap into which
+ // to render...this is what we (incorrectly) used to do for the
+ // onscreen case
+
+ int screen = 0; // FIXME: provide way to specify this?
+ XVisualInfo vis = null;
+ int[] count = new int[1];
+ XVisualInfo template = new XVisualInfo();
+ template.screen(screen);
+ XVisualInfo[] infos = null;
+ GLCapabilities[] caps = null;
+ lockAWT();
+ try {
+ infos = GLX.XGetVisualInfo(display, GLX.VisualScreenMask, template, count, 0);
+ if (infos == null) {
+ throw new GLException("Error while enumerating available XVisualInfos");
+ }
+ caps = new GLCapabilities[infos.length];
+ for (int i = 0; i < infos.length; i++) {
+ caps[i] = X11GLDrawableFactory.xvi2GLCapabilities(display, infos[i]);
+ }
+ } finally {
+ unlockAWT();
+ }
+ int chosen = chooser.chooseCapabilities(capabilities, caps, -1);
+ if (chosen < 0 || chosen >= caps.length) {
+ throw new GLException("GLCapabilitiesChooser specified invalid index (expected 0.." + (caps.length - 1) + ")");
+ }
+ if (DEBUG) {
+ System.err.println("Chosen visual (" + chosen + "):");
+ System.err.println(caps[chosen]);
+ }
+ vis = infos[chosen];
+ if (vis == null) {
+ throw new GLException("GLCapabilitiesChooser chose an invalid visual");
+ }
+ // FIXME: the storage for the infos array is leaked (should
+ // clean it up somehow when we're done with the visual we're
+ // returning)
+
+ return vis;
+ }
+ }
+
+
+ // These synchronization primitives prevent the AWT from making
+ // requests from the X server asynchronously to this code.
+ protected void lockAWT() {
+ X11GLDrawableFactory.lockAWT();
+ }
+
+ protected void unlockAWT() {
+ X11GLDrawableFactory.unlockAWT();
+ }
+}
diff --git a/src/net/java/games/jogl/impl/x11/X11GLContextFactory.java b/src/classes/com/sun/opengl/impl/x11/X11GLDrawableFactory.java
index a1b299478..f4523c95e 100644
--- a/src/net/java/games/jogl/impl/x11/X11GLContextFactory.java
+++ b/src/classes/com/sun/opengl/impl/x11/X11GLDrawableFactory.java
@@ -37,17 +37,43 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl.x11;
+package com.sun.opengl.impl.x11;
import java.awt.Component;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
+import java.awt.GraphicsEnvironment;
+import java.security.*;
+import java.util.ArrayList;
+import java.util.List;
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class X11GLDrawableFactory extends GLDrawableFactoryImpl {
+ private static final boolean DEBUG = Debug.debug("X11GLDrawableFactory");
+
+ // There is currently a bug on Linux/AMD64 distributions in glXGetProcAddressARB
+ private static boolean isLinuxAMD64;
-public class X11GLContextFactory extends GLContextFactory {
static {
NativeLibLoader.load();
+
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ String os = System.getProperty("os.name").toLowerCase();
+ String arch = System.getProperty("os.arch").toLowerCase();
+ if (os.startsWith("linux") && arch.equals("amd64")) {
+ isLinuxAMD64 = true;
+ }
+ return null;
+ }
+ });
+ }
+
+ public X11GLDrawableFactory() {
+ // Must initialize GLX support eagerly in case a pbuffer is the
+ // first thing instantiated
+ resetProcAddressTable(GLX.getGLXProcAddressTable());
}
private static final int MAX_ATTRIBS = 128;
@@ -55,6 +81,16 @@ public class X11GLContextFactory extends GLContextFactory {
public GraphicsConfiguration chooseGraphicsConfiguration(GLCapabilities capabilities,
GLCapabilitiesChooser chooser,
GraphicsDevice device) {
+ if (capabilities == null) {
+ capabilities = new GLCapabilities();
+ }
+ if (chooser == null) {
+ chooser = new DefaultGLCapabilitiesChooser();
+ }
+ if (device == null) {
+ device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
+ }
+
int screen = X11SunJDKReflection.graphicsDeviceGetScreen(device);
// Until we have a rock-solid visual selection algorithm written
// in pure Java, we're going to provide the underlying window
@@ -67,11 +103,11 @@ public class X11GLContextFactory extends GLContextFactory {
lockAWT();
try {
long display = getDisplayConnection();
- XVisualInfo recommendedVis = GLX.glXChooseVisual(display, screen, attribs);
+ XVisualInfo recommendedVis = GLX.glXChooseVisual(display, screen, attribs, 0);
int[] count = new int[1];
XVisualInfo template = new XVisualInfo();
template.screen(screen);
- infos = GLX.XGetVisualInfo(display, GLX.VisualScreenMask, template, count);
+ infos = GLX.XGetVisualInfo(display, GLX.VisualScreenMask, template, count, 0);
if (infos == null) {
throw new GLException("Error while enumerating available XVisualInfos");
}
@@ -119,50 +155,145 @@ public class X11GLContextFactory extends GLContextFactory {
return null;
}
- public GLContext createGLContext(Component component,
- GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLContext shareWith) {
- if (component != null) {
- return new X11OnscreenGLContext(component, capabilities, chooser, shareWith);
- } else {
- return new X11OffscreenGLContext(capabilities, chooser, shareWith);
+ public GLDrawable getGLDrawable(Object target,
+ GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser) {
+ if (target == null) {
+ throw new IllegalArgumentException("Null target");
+ }
+ if (!(target instanceof Component)) {
+ throw new IllegalArgumentException("GLDrawables not supported for objects of type " +
+ target.getClass().getName() + " (only Components are supported in this implementation)");
+ }
+ return new X11OnscreenGLDrawable((Component) target);
+ }
+
+ public GLDrawableImpl createOffscreenDrawable(GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser) {
+ return new X11OffscreenGLDrawable(capabilities, chooser);
+ }
+
+ private boolean pbufferSupportInitialized = false;
+ private boolean canCreateGLPbuffer = false;
+ public boolean canCreateGLPbuffer() {
+ if (!pbufferSupportInitialized) {
+ Runnable r = new Runnable() {
+ public void run() {
+ long display = getDisplayConnection();
+ lockAWT();
+ try {
+ int[] major = new int[1];
+ int[] minor = new int[1];
+ if (!GLX.glXQueryVersion(display, major, 0, minor, 0)) {
+ throw new GLException("glXQueryVersion failed");
+ }
+ if (DEBUG) {
+ System.err.println("!!! GLX version: major " + major[0] +
+ ", minor " + minor[0]);
+ }
+
+ int screen = 0; // FIXME: provide way to specify this?
+
+ // Work around bugs in ATI's Linux drivers where they report they
+ // only implement GLX version 1.2 but actually do support pbuffers
+ if (major[0] == 1 && minor[0] == 2) {
+ String str = GLX.glXQueryServerString(display, screen, GLX.GLX_VENDOR);
+ if (str != null && str.indexOf("ATI") >= 0) {
+ canCreateGLPbuffer = true;
+ }
+ } else {
+ canCreateGLPbuffer = ((major[0] > 1) || (minor[0] > 2));
+ }
+
+ pbufferSupportInitialized = true;
+ } finally {
+ unlockAWT();
+ }
+ }
+ };
+ maybeDoSingleThreadedWorkaround(r);
+ }
+ return canCreateGLPbuffer;
+ }
+
+ public GLPbuffer createGLPbuffer(final GLCapabilities capabilities,
+ final int initialWidth,
+ final int initialHeight,
+ final GLContext shareWith) {
+ if (!canCreateGLPbuffer()) {
+ throw new GLException("Pbuffer support not available with current graphics card");
}
+ final List returnList = new ArrayList();
+ Runnable r = new Runnable() {
+ public void run() {
+ X11PbufferGLDrawable pbufferDrawable = new X11PbufferGLDrawable(capabilities,
+ initialWidth,
+ initialHeight);
+ GLPbufferImpl pbuffer = new GLPbufferImpl(pbufferDrawable, shareWith);
+ returnList.add(pbuffer);
+ }
+ };
+ maybeDoSingleThreadedWorkaround(r);
+ return (GLPbuffer) returnList.get(0);
+ }
+
+ public GLContext createExternalGLContext() {
+ return new X11ExternalGLContext();
+ }
+
+ public boolean canCreateExternalGLDrawable() {
+ return canCreateGLPbuffer();
+ }
+
+ public GLDrawable createExternalGLDrawable() {
+ return new X11ExternalGLDrawable();
+ }
+
+ public long dynamicLookupFunction(String glFuncName) {
+ long res = 0;
+ if (!isLinuxAMD64) {
+ res = GLX.glXGetProcAddressARB(glFuncName);
+ }
+ if (res == 0) {
+ // GLU routines aren't known to the OpenGL function lookup
+ res = GLX.dlsym(glFuncName);
+ }
+ return res;
}
public static GLCapabilities xvi2GLCapabilities(long display, XVisualInfo info) {
int[] tmp = new int[1];
- int val = glXGetConfig(display, info, GLX.GLX_USE_GL, tmp);
+ int val = glXGetConfig(display, info, GLX.GLX_USE_GL, tmp, 0);
if (val == 0) {
// Visual does not support OpenGL
return null;
}
- val = glXGetConfig(display, info, GLX.GLX_RGBA, tmp);
+ val = glXGetConfig(display, info, GLX.GLX_RGBA, tmp, 0);
if (val == 0) {
// Visual does not support RGBA
return null;
}
GLCapabilities res = new GLCapabilities();
- res.setDoubleBuffered(glXGetConfig(display, info, GLX.GLX_DOUBLEBUFFER, tmp) != 0);
- res.setStereo (glXGetConfig(display, info, GLX.GLX_STEREO, tmp) != 0);
+ res.setDoubleBuffered(glXGetConfig(display, info, GLX.GLX_DOUBLEBUFFER, tmp, 0) != 0);
+ res.setStereo (glXGetConfig(display, info, GLX.GLX_STEREO, tmp, 0) != 0);
// Note: use of hardware acceleration is determined by
// glXCreateContext, not by the XVisualInfo. Optimistically claim
// that all GLCapabilities have the capability to be hardware
// accelerated.
res.setHardwareAccelerated(true);
- res.setDepthBits (glXGetConfig(display, info, GLX.GLX_DEPTH_SIZE, tmp));
- res.setStencilBits (glXGetConfig(display, info, GLX.GLX_STENCIL_SIZE, tmp));
- res.setRedBits (glXGetConfig(display, info, GLX.GLX_RED_SIZE, tmp));
- res.setGreenBits (glXGetConfig(display, info, GLX.GLX_GREEN_SIZE, tmp));
- res.setBlueBits (glXGetConfig(display, info, GLX.GLX_BLUE_SIZE, tmp));
- res.setAlphaBits (glXGetConfig(display, info, GLX.GLX_ALPHA_SIZE, tmp));
- res.setAccumRedBits (glXGetConfig(display, info, GLX.GLX_ACCUM_RED_SIZE, tmp));
- res.setAccumGreenBits(glXGetConfig(display, info, GLX.GLX_ACCUM_GREEN_SIZE, tmp));
- res.setAccumBlueBits (glXGetConfig(display, info, GLX.GLX_ACCUM_BLUE_SIZE, tmp));
- res.setAccumAlphaBits(glXGetConfig(display, info, GLX.GLX_ACCUM_ALPHA_SIZE, tmp));
+ res.setDepthBits (glXGetConfig(display, info, GLX.GLX_DEPTH_SIZE, tmp, 0));
+ res.setStencilBits (glXGetConfig(display, info, GLX.GLX_STENCIL_SIZE, tmp, 0));
+ res.setRedBits (glXGetConfig(display, info, GLX.GLX_RED_SIZE, tmp, 0));
+ res.setGreenBits (glXGetConfig(display, info, GLX.GLX_GREEN_SIZE, tmp, 0));
+ res.setBlueBits (glXGetConfig(display, info, GLX.GLX_BLUE_SIZE, tmp, 0));
+ res.setAlphaBits (glXGetConfig(display, info, GLX.GLX_ALPHA_SIZE, tmp, 0));
+ res.setAccumRedBits (glXGetConfig(display, info, GLX.GLX_ACCUM_RED_SIZE, tmp, 0));
+ res.setAccumGreenBits(glXGetConfig(display, info, GLX.GLX_ACCUM_GREEN_SIZE, tmp, 0));
+ res.setAccumBlueBits (glXGetConfig(display, info, GLX.GLX_ACCUM_BLUE_SIZE, tmp, 0));
+ res.setAccumAlphaBits(glXGetConfig(display, info, GLX.GLX_ACCUM_ALPHA_SIZE, tmp, 0));
if (isMultisampleAvailable()) {
- res.setSampleBuffers(glXGetConfig(display, info, GLX.GLX_SAMPLE_BUFFERS_ARB, tmp) != 0);
- res.setNumSamples (glXGetConfig(display, info, GLX.GLX_SAMPLES_ARB, tmp));
+ res.setSampleBuffers(glXGetConfig(display, info, GLX.GLX_SAMPLE_BUFFERS_ARB, tmp, 0) != 0);
+ res.setNumSamples (glXGetConfig(display, info, GLX.GLX_SAMPLES_ARB, tmp, 0));
}
return res;
}
@@ -203,9 +334,9 @@ public class X11GLContextFactory extends GLContextFactory {
res[idx++] = GLX.GLX_ACCUM_BLUE_SIZE;
res[idx++] = caps.getAccumBlueBits();
if (isMultisampleAvailable && caps.getSampleBuffers()) {
- res[idx++] = GL.GLX_SAMPLE_BUFFERS_ARB;
+ res[idx++] = GLXExt.GLX_SAMPLE_BUFFERS_ARB;
res[idx++] = GL.GL_TRUE;
- res[idx++] = GL.GLX_SAMPLES_ARB;
+ res[idx++] = GLXExt.GLX_SAMPLES_ARB;
res[idx++] = caps.getNumSamples();
}
res[idx++] = 0;
@@ -227,11 +358,22 @@ public class X11GLContextFactory extends GLContextFactory {
}
public static void lockAWT() {
- getJAWT().Lock();
+ if (!Java2D.isOGLPipelineActive() || !Java2D.isQueueFlusherThread()) {
+ getJAWT().Lock();
+ }
}
public static void unlockAWT() {
- getJAWT().Unlock();
+ if (!Java2D.isOGLPipelineActive() || !Java2D.isQueueFlusherThread()) {
+ getJAWT().Unlock();
+ }
+ }
+
+ public void lockAWTForJava2D() {
+ lockAWT();
+ }
+ public void unlockAWTForJava2D() {
+ unlockAWT();
}
// Display connection for use by visual selection algorithm and by all offscreen surfaces
@@ -275,14 +417,23 @@ public class X11GLContextFactory extends GLContextFactory {
}
}
- public static int glXGetConfig(long display, XVisualInfo info, int attrib, int[] tmp) {
+ public static int glXGetConfig(long display, XVisualInfo info, int attrib, int[] tmp, int tmp_offset) {
if (display == 0) {
throw new GLException("No display connection");
}
- int res = GLX.glXGetConfig(display, info, attrib, tmp);
+ int res = GLX.glXGetConfig(display, info, attrib, tmp, tmp_offset);
if (res != 0) {
throw new GLException("glXGetConfig failed: error code " + glXGetConfigErrorCode(res));
}
- return tmp[0];
+ return tmp[tmp_offset];
+ }
+
+ private void maybeDoSingleThreadedWorkaround(Runnable action) {
+ if (Threading.isSingleThreaded() &&
+ !Threading.isOpenGLThread()) {
+ Threading.invokeOnOpenGLThread(action);
+ } else {
+ action.run();
+ }
}
}
diff --git a/src/classes/com/sun/opengl/impl/x11/X11OffscreenGLContext.java b/src/classes/com/sun/opengl/impl/x11/X11OffscreenGLContext.java
new file mode 100644
index 000000000..e1c8eb3d1
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/x11/X11OffscreenGLContext.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.x11;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class X11OffscreenGLContext extends X11GLContext {
+ private X11OffscreenGLDrawable drawable;
+
+ public X11OffscreenGLContext(X11OffscreenGLDrawable drawable,
+ GLContext shareWith) {
+ super(drawable, shareWith);
+ this.drawable = drawable;
+ }
+
+ public int getOffscreenContextPixelDataType() {
+ return GL.GL_UNSIGNED_INT_8_8_8_8_REV;
+ }
+
+ public int getOffscreenContextReadBuffer() {
+ if (drawable.isDoubleBuffered()) {
+ return GL.GL_BACK;
+ }
+ return GL.GL_FRONT;
+ }
+
+ public boolean offscreenImageNeedsVerticalFlip() {
+ // There doesn't seem to be a way to do this in the construction
+ // of the Pixmap or GLXPixmap
+ return true;
+ }
+
+ protected void create() {
+ createContext(false);
+ }
+}
diff --git a/src/classes/com/sun/opengl/impl/x11/X11OffscreenGLDrawable.java b/src/classes/com/sun/opengl/impl/x11/X11OffscreenGLDrawable.java
new file mode 100644
index 000000000..2d7dedd7f
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/x11/X11OffscreenGLDrawable.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.x11;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class X11OffscreenGLDrawable extends X11GLDrawable {
+ private long pixmap;
+ private boolean isDoubleBuffered;
+ // Width and height of the underlying bitmap
+ private int width;
+ private int height;
+
+ public X11OffscreenGLDrawable(GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser) {
+ super(null, capabilities, chooser);
+ }
+
+ public GLContext createContext(GLContext shareWith) {
+ return new X11OffscreenGLContext(this, shareWith);
+ }
+
+ public void setSize(int newWidth, int newHeight) {
+ width = newWidth;
+ height = newHeight;
+ if (pixmap != 0) {
+ destroy();
+ }
+ create();
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public int getHeight() {
+ return height;
+ }
+
+ private void create() {
+ display = X11GLDrawableFactory.getDisplayConnection();
+ XVisualInfo vis = chooseVisual(false);
+ int bitsPerPixel = vis.depth();
+
+ lockAWT();
+ try {
+ int screen = GLX.DefaultScreen(display);
+ pixmap = GLX.XCreatePixmap(display, (int) GLX.RootWindow(display, screen), width, height, bitsPerPixel);
+ if (pixmap == 0) {
+ throw new GLException("XCreatePixmap failed");
+ }
+ drawable = GLX.glXCreateGLXPixmap(display, vis, pixmap);
+ if (drawable == 0) {
+ GLX.XFreePixmap(display, pixmap);
+ pixmap = 0;
+ throw new GLException("glXCreateGLXPixmap failed");
+ }
+ isDoubleBuffered = (X11GLDrawableFactory.glXGetConfig(display, vis, GLX.GLX_DOUBLEBUFFER, new int[1], 0) != 0);
+ if (DEBUG) {
+ System.err.println("Created pixmap " + toHexString(pixmap) +
+ ", GLXPixmap " + toHexString(drawable) +
+ ", display " + toHexString(display));
+ }
+ } finally {
+ unlockAWT();
+ }
+ }
+
+ public void destroy() {
+ if (pixmap != 0) {
+ if (DEBUG) {
+ System.err.println("Destroying pixmap " + toHexString(pixmap) +
+ ", GLXPixmap " + toHexString(drawable) +
+ ", display " + toHexString(display));
+ }
+
+ // Must destroy pixmap and GLXPixmap
+ lockAWT();
+
+ if (DEBUG) {
+ long cur = GLX.glXGetCurrentContext();
+ if (cur != 0) {
+ System.err.println("WARNING: found context " + toHexString(cur) + " current during pixmap destruction");
+ }
+ }
+
+ // FIXME: workaround for crashes on NVidia hardware when
+ // destroying pixmap (no context is current at the point of the
+ // crash, at least from the point of view of
+ // glXGetCurrentContext)
+ GLX.glXMakeCurrent(display, 0, 0);
+
+ GLX.glXDestroyGLXPixmap(display, drawable);
+ GLX.XFreePixmap(display, pixmap);
+ unlockAWT();
+ drawable = 0;
+ pixmap = 0;
+ display = 0;
+ }
+ }
+
+ public boolean isDoubleBuffered() {
+ return isDoubleBuffered;
+ }
+}
diff --git a/src/net/java/games/gluegen/runtime/BufferFactory.java b/src/classes/com/sun/opengl/impl/x11/X11OnscreenGLContext.java
index 1661026dc..d6b79cb8f 100644
--- a/src/net/java/games/gluegen/runtime/BufferFactory.java
+++ b/src/classes/com/sun/opengl/impl/x11/X11OnscreenGLContext.java
@@ -37,39 +37,59 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.gluegen.runtime;
+package com.sun.opengl.impl.x11;
-import java.nio.*;
+import java.util.*;
-public class BufferFactory {
- public static ByteBuffer newDirectByteBuffer(int size) {
- ByteBuffer buf = ByteBuffer.allocateDirect(size);
- buf.order(ByteOrder.nativeOrder());
- return buf;
- }
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class X11OnscreenGLContext extends X11GLContext {
+ protected X11OnscreenGLDrawable drawable;
- /** Helper routine to tell whether a buffer is direct or not. Null
- pointers are considered direct. isDirect() should really be
- public in Buffer and not replicated in all subclasses. */
- public static boolean isDirect(Buffer buf) {
- if (buf == null) {
- return true;
+ public X11OnscreenGLContext(X11OnscreenGLDrawable drawable,
+ GLContext shareWith) {
+ super(drawable, shareWith);
+ this.drawable = drawable;
+ }
+
+ protected int makeCurrentImpl() throws GLException {
+ try {
+ int lockRes = drawable.lockSurface();
+ if (lockRes == X11OnscreenGLDrawable.LOCK_SURFACE_NOT_READY) {
+ return CONTEXT_NOT_CURRENT;
+ }
+ if (lockRes == X11OnscreenGLDrawable.LOCK_SURFACE_CHANGED) {
+ if (context != 0) {
+ GLX.glXDestroyContext(mostRecentDisplay, context);
+ GLContextShareSet.contextDestroyed(this);
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": !!! Destroyed OpenGL context " + toHexString(context) + " due to JAWT_LOCK_SURFACE_CHANGED");
+ }
+ context = 0;
+ }
+ }
+ int ret = super.makeCurrentImpl();
+ return ret;
+ } catch (RuntimeException e) {
+ try {
+ drawable.unlockSurface();
+ } catch (Exception e2) {
+ // do nothing if unlockSurface throws
+ }
+ throw(e);
}
- if (buf instanceof ByteBuffer) {
- return ((ByteBuffer) buf).isDirect();
- } else if (buf instanceof FloatBuffer) {
- return ((FloatBuffer) buf).isDirect();
- } else if (buf instanceof DoubleBuffer) {
- return ((DoubleBuffer) buf).isDirect();
- } else if (buf instanceof CharBuffer) {
- return ((CharBuffer) buf).isDirect();
- } else if (buf instanceof ShortBuffer) {
- return ((ShortBuffer) buf).isDirect();
- } else if (buf instanceof IntBuffer) {
- return ((IntBuffer) buf).isDirect();
- } else if (buf instanceof LongBuffer) {
- return ((LongBuffer) buf).isDirect();
+ }
+
+ protected void releaseImpl() throws GLException {
+ try {
+ super.releaseImpl();
+ } finally {
+ drawable.unlockSurface();
}
- throw new RuntimeException("Unknown buffer type " + buf.getClass().getName());
+ }
+
+ protected void create() {
+ createContext(true);
}
}
diff --git a/src/net/java/games/jogl/impl/x11/X11OnscreenGLContext.java b/src/classes/com/sun/opengl/impl/x11/X11OnscreenGLDrawable.java
index 2fd340d79..49000fc14 100644
--- a/src/net/java/games/jogl/impl/x11/X11OnscreenGLContext.java
+++ b/src/classes/com/sun/opengl/impl/x11/X11OnscreenGLDrawable.java
@@ -37,135 +37,106 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl.x11;
+package com.sun.opengl.impl.x11;
import java.awt.Component;
-import java.util.*;
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class X11OnscreenGLDrawable extends X11GLDrawable {
+ public static final int LOCK_SURFACE_NOT_READY = 1;
+ public static final int LOCK_SURFACE_CHANGED = 2;
+ public static final int LOCK_SUCCESS = 3;
-public class X11OnscreenGLContext extends X11GLContext {
// Variables for lockSurface/unlockSurface
private JAWT_DrawingSurface ds;
private JAWT_DrawingSurfaceInfo dsi;
private JAWT_X11DrawingSurfaceInfo x11dsi;
-
- // Variables for pbuffer support
- List pbuffersToInstantiate = new ArrayList();
-
- public X11OnscreenGLContext(Component component,
- GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLContext shareWith) {
- super(component, capabilities, chooser, shareWith);
- }
-
- protected GL createGL()
- {
- return new X11GLImpl(this);
- }
- protected boolean isOffscreen() {
- return false;
- }
-
- public int getOffscreenContextReadBuffer() {
- throw new GLException("Should not call this");
- }
-
- public boolean offscreenImageNeedsVerticalFlip() {
- throw new GLException("Should not call this");
+ // Indicates whether the component (if an onscreen context) has been
+ // realized. Plausibly, before the component is realized the JAWT
+ // should return an error or NULL object from some of its
+ // operations; this appears to be the case on Win32 but is not true
+ // at least with Sun's current X11 implementation (1.4.x), which
+ // crashes with no other error reported if the DrawingSurfaceInfo is
+ // fetched from a locked DrawingSurface during the validation as a
+ // result of calling show() on the main thread. To work around this
+ // we prevent any JAWT or OpenGL operations from being done until
+ // addNotify() is called on the component.
+ protected boolean realized;
+
+ public X11OnscreenGLDrawable(Component component) {
+ super(component, null, null);
}
- public boolean canCreatePbufferContext() {
- // FIXME: should we gate this on GLX 1.3 being available?
- return true;
+ public GLContext createContext(GLContext shareWith) {
+ return new X11OnscreenGLContext(this, shareWith);
}
- public synchronized GLContext createPbufferContext(GLCapabilities capabilities,
- int initialWidth,
- int initialHeight) {
- X11PbufferGLContext ctx = new X11PbufferGLContext(capabilities, initialWidth, initialHeight);
- pbuffersToInstantiate.add(ctx);
- return ctx;
+ public void setRealized(boolean realized) {
+ this.realized = realized;
}
- public void bindPbufferToTexture() {
- throw new GLException("Should not call this");
+ public void setSize(int width, int height) {
+ component.setSize(width, height);
}
- public void releasePbufferFromTexture() {
- throw new GLException("Should not call this");
+ public int getWidth() {
+ return component.getWidth();
}
- public void setSwapInterval(int interval) {
- GL gl = getGL();
- if (gl.isExtensionAvailable("GLX_SGI_swap_control")) {
- gl.glXSwapIntervalSGI(interval);
- }
+ public int getHeight() {
+ return component.getHeight();
}
- protected synchronized boolean makeCurrent(Runnable initAction) throws GLException {
- try {
- if (!lockSurface()) {
- return false;
- }
- boolean ret = super.makeCurrent(initAction);
- if (ret) {
- // Instantiate any pending pbuffers
- while (!pbuffersToInstantiate.isEmpty()) {
- X11PbufferGLContext ctx =
- (X11PbufferGLContext) pbuffersToInstantiate.remove(pbuffersToInstantiate.size() - 1);
- ctx.createPbuffer(display, context, getGL());
+ public void swapBuffers() throws GLException {
+ lockAWT();
+ try {
+ boolean didLock = false;
+
+ if (drawable == 0) {
+ if (lockSurface() == LOCK_SURFACE_NOT_READY) {
+ return;
}
+
+ didLock = true;
}
- return ret;
- } catch (RuntimeException e) {
- try {
+
+ GLX.glXSwapBuffers(display, drawable);
+
+ if (didLock) {
unlockSurface();
- } catch (Exception e2) {
- // do nothing if unlockSurface throws
}
- throw(e);
- }
- }
-
- protected synchronized void free() throws GLException {
- try {
- super.free();
} finally {
- unlockSurface();
+ unlockAWT();
}
}
- public synchronized void swapBuffers() throws GLException {
- // FIXME: this cast to int would be wrong on 64-bit platforms
- // where the argument type to glXMakeCurrent would change (should
- // probably make GLXDrawable, and maybe XID, Opaque as long)
- GLX.glXSwapBuffers(display, (int) drawable);
- }
-
- private boolean lockSurface() throws GLException {
+ public int lockSurface() throws GLException {
+ if (!realized) {
+ return LOCK_SURFACE_NOT_READY;
+ }
if (drawable != 0) {
throw new GLException("Surface already locked");
}
ds = getJAWT().GetDrawingSurface(component);
if (ds == null) {
// Widget not yet realized
- return false;
+ return LOCK_SURFACE_NOT_READY;
}
int res = ds.Lock();
if ((res & JAWTFactory.JAWT_LOCK_ERROR) != 0) {
throw new GLException("Unable to lock surface");
}
// See whether the surface changed and if so destroy the old
- // OpenGL context so it will be recreated
+ // OpenGL context so it will be recreated (NOTE: removeNotify
+ // should handle this case, but it may be possible that race
+ // conditions can cause this code to be triggered -- should test
+ // more)
+ int ret = LOCK_SUCCESS;
if ((res & JAWTFactory.JAWT_LOCK_SURFACE_CHANGED) != 0) {
- if (context != 0) {
- GLX.glXDestroyContext(display, context);
- context = 0;
- }
+ ret = LOCK_SURFACE_CHANGED;
}
dsi = ds.GetDrawingSurfaceInfo();
if (dsi == null) {
@@ -173,7 +144,7 @@ public class X11OnscreenGLContext extends X11GLContext {
ds.Unlock();
getJAWT().FreeDrawingSurface(ds);
ds = null;
- return false;
+ return LOCK_SURFACE_NOT_READY;
}
x11dsi = (JAWT_X11DrawingSurfaceInfo) dsi.platformInfo();
display = x11dsi.display();
@@ -190,13 +161,12 @@ public class X11OnscreenGLContext extends X11GLContext {
display = 0;
drawable = 0;
visualID = 0;
- return false;
+ return LOCK_SURFACE_NOT_READY;
}
- mostRecentDisplay = display;
- return true;
+ return ret;
}
- private void unlockSurface() {
+ public void unlockSurface() {
if (drawable == 0) {
throw new GLException("Surface already unlocked");
}
@@ -211,7 +181,11 @@ public class X11OnscreenGLContext extends X11GLContext {
visualID = 0;
}
- protected void create() {
- chooseVisualAndCreateContext(true);
- }
+ //----------------------------------------------------------------------
+ // Internals only below this point
+ //
+
+ private JAWT getJAWT() {
+ return X11GLDrawableFactory.getJAWT();
+ }
}
diff --git a/src/classes/com/sun/opengl/impl/x11/X11PbufferGLContext.java b/src/classes/com/sun/opengl/impl/x11/X11PbufferGLContext.java
new file mode 100644
index 000000000..0cb945de7
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/x11/X11PbufferGLContext.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.x11;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class X11PbufferGLContext extends X11GLContext {
+ private X11PbufferGLDrawable drawable;
+
+ public X11PbufferGLContext(X11PbufferGLDrawable drawable,
+ GLContext shareWith) {
+ super(drawable, shareWith);
+ this.drawable = drawable;
+ }
+
+ public void bindPbufferToTexture() {
+ // FIXME: figure out how to implement this
+ throw new GLException("Not yet implemented");
+ }
+
+ public void releasePbufferFromTexture() {
+ // FIXME: figure out how to implement this
+ throw new GLException("Not yet implemented");
+ }
+
+ protected int makeCurrentImpl() throws GLException {
+ if (drawable.getDrawable() == 0) {
+ // pbuffer not instantiated (yet?)
+ if (DEBUG) {
+ System.err.println("pbuffer not instantiated");
+ }
+ return CONTEXT_NOT_CURRENT;
+ }
+
+ // Note that we have to completely override makeCurrentImpl
+ // because the underlying makeCurrent call differs for pbuffers
+ lockAWT();
+ try {
+ boolean created = false;
+ if (context == 0) {
+ create();
+ if (DEBUG) {
+ System.err.println(getThreadName() + ": !!! Created GL context for " + getClass().getName());
+ }
+ created = true;
+ }
+
+ if (!GLX.glXMakeContextCurrent(drawable.getDisplay(),
+ drawable.getDrawable(),
+ drawable.getDrawable(),
+ context)) {
+ throw new GLException("Error making context current");
+ } else {
+ mostRecentDisplay = drawable.getDisplay();
+ if (DEBUG && VERBOSE) {
+ System.err.println(getThreadName() + ": glXMakeCurrent(display " + toHexString(drawable.getDisplay()) +
+ ", drawable " + toHexString(drawable.getDrawable()) +
+ ", context " + toHexString(context) + ") succeeded");
+ }
+ }
+
+ if (created) {
+ resetGLFunctionAvailability();
+ return CONTEXT_CURRENT_NEW;
+ }
+ return CONTEXT_CURRENT;
+ } finally {
+ unlockAWT();
+ }
+ }
+
+ protected void releaseImpl() throws GLException {
+ lockAWT();
+ try {
+ if (!GLX.glXMakeContextCurrent(drawable.getDisplay(), 0, 0, 0)) {
+ throw new GLException("Error freeing OpenGL context");
+ }
+ } finally {
+ unlockAWT();
+ }
+ }
+
+ public int getFloatingPointMode() {
+ return drawable.getFloatingPointMode();
+ }
+
+ protected void create() {
+ if (DEBUG) {
+ System.err.println("Creating context for pbuffer " + drawable.getWidth() +
+ " x " + drawable.getHeight());
+ }
+
+ // Create a gl context for the p-buffer.
+ X11GLContext other = (X11GLContext) GLContextShareSet.getShareContext(this);
+ long share = 0;
+ if (other != null) {
+ share = other.getContext();
+ if (share == 0) {
+ throw new GLException("GLContextShareSet returned an invalid OpenGL context");
+ }
+ }
+ context = GLX.glXCreateNewContext(drawable.getDisplay(), drawable.getFBConfig(), GLXExt.GLX_RGBA_TYPE, share, true);
+ if (context == 0) {
+ throw new GLException("pbuffer creation error: glXCreateNewContext() failed");
+ }
+ GLContextShareSet.contextCreated(this);
+
+ if (DEBUG) {
+ System.err.println("Created context for pbuffer " + drawable.getWidth() +
+ " x " + drawable.getHeight());
+ }
+ }
+}
diff --git a/src/classes/com/sun/opengl/impl/x11/X11PbufferGLDrawable.java b/src/classes/com/sun/opengl/impl/x11/X11PbufferGLDrawable.java
new file mode 100644
index 000000000..2a1248405
--- /dev/null
+++ b/src/classes/com/sun/opengl/impl/x11/X11PbufferGLDrawable.java
@@ -0,0 +1,264 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.impl.x11;
+
+import javax.media.opengl.*;
+import com.sun.opengl.impl.*;
+
+public class X11PbufferGLDrawable extends X11GLDrawable {
+ private int initWidth;
+ private int initHeight;
+
+ // drawable in superclass is a GLXPbuffer
+ private GLXFBConfig fbConfig;
+ private int width;
+ private int height;
+
+ protected static final int MAX_PFORMATS = 256;
+ protected static final int MAX_ATTRIBS = 256;
+
+ public X11PbufferGLDrawable(GLCapabilities capabilities, int initialWidth, int initialHeight) {
+ super(null, capabilities, null);
+ this.initWidth = initialWidth;
+ this.initHeight = initialHeight;
+ if (initWidth <= 0 || initHeight <= 0) {
+ throw new GLException("Initial width and height of pbuffer must be positive (were (" +
+ initWidth + ", " + initHeight + "))");
+ }
+
+ if (DEBUG) {
+ System.out.println("Pbuffer caps on init: " + capabilities +
+ (capabilities.getOffscreenRenderToTexture() ? " [rtt]" : "") +
+ (capabilities.getOffscreenRenderToTextureRectangle() ? " [rect]" : "") +
+ (capabilities.getOffscreenFloatingPointBuffers() ? " [float]" : ""));
+ }
+
+ createPbuffer(X11GLDrawableFactory.getDisplayConnection());
+ }
+
+ public GLContext createContext(GLContext shareWith) {
+ return new X11PbufferGLContext(this, shareWith);
+ }
+
+ public void destroy() {
+ lockAWT();
+ if (drawable != 0) {
+ GLX.glXDestroyPbuffer(display, drawable);
+ }
+ unlockAWT();
+ display = 0;
+ }
+
+ public void setSize(int width, int height) {
+ // FIXME
+ throw new GLException("Not yet implemented");
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public int getHeight() {
+ return height;
+ }
+
+ public void createPbuffer(long display) {
+ lockAWT();
+ try {
+ if (display == 0) {
+ throw new GLException("Null display");
+ }
+
+ if (capabilities.getOffscreenRenderToTexture()) {
+ throw new GLException("Render-to-texture pbuffers not supported yet on X11");
+ }
+
+ if (capabilities.getOffscreenRenderToTextureRectangle()) {
+ throw new GLException("Render-to-texture-rectangle pbuffers not supported yet on X11");
+ }
+
+ int[] iattributes = new int [2*MAX_ATTRIBS];
+ float[] fattributes = new float[2*MAX_ATTRIBS];
+ int nfattribs = 0;
+ int niattribs = 0;
+
+ // Since we are trying to create a pbuffer, the GLXFBConfig we
+ // request (and subsequently use) must be "p-buffer capable".
+ iattributes[niattribs++] = GLXExt.GLX_DRAWABLE_TYPE;
+ iattributes[niattribs++] = GLXExt.GLX_PBUFFER_BIT;
+
+ iattributes[niattribs++] = GLXExt.GLX_RENDER_TYPE;
+ iattributes[niattribs++] = GLXExt.GLX_RGBA_BIT;
+
+ iattributes[niattribs++] = GLX.GLX_DOUBLEBUFFER;
+ if (capabilities.getDoubleBuffered()) {
+ iattributes[niattribs++] = GL.GL_TRUE;
+ } else {
+ iattributes[niattribs++] = GL.GL_FALSE;
+ }
+
+ iattributes[niattribs++] = GLX.GLX_DEPTH_SIZE;
+ iattributes[niattribs++] = capabilities.getDepthBits();
+
+ iattributes[niattribs++] = GLX.GLX_RED_SIZE;
+ iattributes[niattribs++] = capabilities.getRedBits();
+
+ iattributes[niattribs++] = GLX.GLX_GREEN_SIZE;
+ iattributes[niattribs++] = capabilities.getGreenBits();
+
+ iattributes[niattribs++] = GLX.GLX_BLUE_SIZE;
+ iattributes[niattribs++] = capabilities.getBlueBits();
+
+ iattributes[niattribs++] = GLX.GLX_ALPHA_SIZE;
+ iattributes[niattribs++] = capabilities.getAlphaBits();
+
+ if (capabilities.getStencilBits() > 0) {
+ iattributes[niattribs++] = GLX.GLX_STENCIL_SIZE;
+ iattributes[niattribs++] = capabilities.getStencilBits();
+ }
+
+ if (capabilities.getAccumRedBits() > 0 ||
+ capabilities.getAccumGreenBits() > 0 ||
+ capabilities.getAccumBlueBits() > 0) {
+ iattributes[niattribs++] = GLX.GLX_ACCUM_RED_SIZE;
+ iattributes[niattribs++] = capabilities.getAccumRedBits();
+ iattributes[niattribs++] = GLX.GLX_ACCUM_GREEN_SIZE;
+ iattributes[niattribs++] = capabilities.getAccumGreenBits();
+ iattributes[niattribs++] = GLX.GLX_ACCUM_BLUE_SIZE;
+ iattributes[niattribs++] = capabilities.getAccumBlueBits();
+ }
+
+ int screen = 0; // FIXME: provide way to specify this?
+
+ if (capabilities.getOffscreenFloatingPointBuffers()) {
+ String glXExtensions = GLX.glXQueryExtensionsString(display, screen);
+ if (glXExtensions == null ||
+ glXExtensions.indexOf("GLX_NV_float_buffer") < 0) {
+ throw new GLException("Floating-point pbuffers on X11 currently require NVidia hardware");
+ }
+ iattributes[niattribs++] = GLX.GLX_FLOAT_COMPONENTS_NV;
+ iattributes[niattribs++] = GL.GL_TRUE;
+ }
+
+ // FIXME: add FSAA support? Don't want to get into a situation
+ // where we have to retry the glXChooseFBConfig call if it fails
+ // due to a lack of an antialiased visual...
+
+ iattributes[niattribs++] = 0; // null-terminate
+
+ int[] nelementsTmp = new int[1];
+ GLXFBConfig[] fbConfigs = GLX.glXChooseFBConfig(display, screen, iattributes, 0, nelementsTmp, 0);
+ if (fbConfigs == null || fbConfigs.length == 0 || fbConfigs[0] == null) {
+ throw new GLException("pbuffer creation error: glXChooseFBConfig() failed");
+ }
+ int nelements = nelementsTmp[0];
+ if (nelements <= 0) {
+ throw new GLException("pbuffer creation error: couldn't find a suitable frame buffer configuration");
+ }
+ // Note that we currently don't allow selection of anything but
+ // the first GLXFBConfig in the returned list
+ GLXFBConfig fbConfig = fbConfigs[0];
+
+ if (DEBUG) {
+ System.err.println("Found " + fbConfigs.length + " matching GLXFBConfigs");
+ System.err.println("Parameters of default one:");
+ System.err.println("render type: 0x" + Integer.toHexString(queryFBConfig(display, fbConfig, GLX.GLX_RENDER_TYPE)));
+ System.err.println("rgba: " + ((queryFBConfig(display, fbConfig, GLX.GLX_RENDER_TYPE) & GLX.GLX_RGBA_BIT) != 0));
+ System.err.println("r: " + queryFBConfig(display, fbConfig, GLX.GLX_RED_SIZE));
+ System.err.println("g: " + queryFBConfig(display, fbConfig, GLX.GLX_GREEN_SIZE));
+ System.err.println("b: " + queryFBConfig(display, fbConfig, GLX.GLX_BLUE_SIZE));
+ System.err.println("a: " + queryFBConfig(display, fbConfig, GLX.GLX_ALPHA_SIZE));
+ System.err.println("depth: " + queryFBConfig(display, fbConfig, GLX.GLX_DEPTH_SIZE));
+ System.err.println("double buffered: " + queryFBConfig(display, fbConfig, GLX.GLX_DOUBLEBUFFER));
+ }
+
+ // Create the p-buffer.
+ niattribs = 0;
+
+ iattributes[niattribs++] = GLXExt.GLX_PBUFFER_WIDTH;
+ iattributes[niattribs++] = initWidth;
+ iattributes[niattribs++] = GLXExt.GLX_PBUFFER_HEIGHT;
+ iattributes[niattribs++] = initHeight;
+
+ iattributes[niattribs++] = 0;
+
+ long tmpBuffer = GLX.glXCreatePbuffer(display, fbConfig, iattributes, 0);
+ if (tmpBuffer == 0) {
+ // FIXME: query X error code for detail error message
+ throw new GLException("pbuffer creation error: glXCreatePbuffer() failed");
+ }
+
+ // Set up instance variables
+ this.display = display;
+ drawable = tmpBuffer;
+ this.fbConfig = fbConfig;
+
+ // Determine the actual width and height we were able to create.
+ int[] tmp = new int[1];
+ GLX.glXQueryDrawable(display, drawable, GLXExt.GLX_WIDTH, tmp, 0);
+ width = tmp[0];
+ GLX.glXQueryDrawable(display, drawable, GLXExt.GLX_HEIGHT, tmp, 0);
+ height = tmp[0];
+
+ if (DEBUG) {
+ System.err.println("Created pbuffer " + width + " x " + height);
+ }
+ } finally {
+ unlockAWT();
+ }
+ }
+
+ public int getFloatingPointMode() {
+ // Floating-point pbuffers currently require NVidia hardware on X11
+ return GLPbuffer.NV_FLOAT;
+ }
+
+ public GLXFBConfig getFBConfig() {
+ return fbConfig;
+ }
+
+ private int queryFBConfig(long display, GLXFBConfig fbConfig, int attrib) {
+ int[] tmp = new int[1];
+ if (GLX.glXGetFBConfigAttrib(display, fbConfig, attrib, tmp, 0) != 0) {
+ throw new GLException("glXGetFBConfigAttrib failed");
+ }
+ return tmp[0];
+ }
+}
diff --git a/src/net/java/games/jogl/impl/x11/X11SunJDKReflection.java b/src/classes/com/sun/opengl/impl/x11/X11SunJDKReflection.java
index 59208e5a9..0760399ab 100755..100644
--- a/src/net/java/games/jogl/impl/x11/X11SunJDKReflection.java
+++ b/src/classes/com/sun/opengl/impl/x11/X11SunJDKReflection.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.impl.x11;
+package com.sun.opengl.impl.x11;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
diff --git a/src/classes/com/sun/opengl/utils/Animator.java b/src/classes/com/sun/opengl/utils/Animator.java
new file mode 100755
index 000000000..5920b93b9
--- /dev/null
+++ b/src/classes/com/sun/opengl/utils/Animator.java
@@ -0,0 +1,308 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.utils;
+
+import java.awt.Component;
+import java.awt.EventQueue;
+import java.awt.Rectangle;
+import java.util.*;
+import javax.swing.*;
+
+import javax.media.opengl.*;
+
+/** <P> An Animator can be attached to one or more {@link
+ GLAutoDrawable}s to drive their display() methods in a loop. </P>
+
+ <P> The Animator class creates a background thread in which the
+ calls to <code>display()</code> are performed. After each drawable
+ has been redrawn, a brief pause is performed to avoid swamping the
+ CPU, unless {@link #setRunAsFastAsPossible} has been called. </P>
+*/
+
+public class Animator {
+ private volatile ArrayList/*<GLAutoDrawable>*/ drawables = new ArrayList();
+ private Runnable runnable;
+ private Thread thread;
+ private volatile boolean shouldStop;
+ protected boolean ignoreExceptions;
+ protected boolean printExceptions;
+ private boolean runAsFastAsPossible;
+
+ // For efficient rendering of Swing components, in particular when
+ // they overlap one another
+ private List lightweights = new ArrayList();
+ private Map repaintManagers = new IdentityHashMap();
+ private Map dirtyRegions = new IdentityHashMap();
+
+ /** Creates a new, empty Animator. */
+ public Animator() {
+ }
+
+ /** Creates a new Animator for a particular drawable. */
+ public Animator(GLAutoDrawable drawable) {
+ add(drawable);
+ }
+
+ /** Adds a drawable to the list managed by this Animator. */
+ public synchronized void add(GLAutoDrawable drawable) {
+ ArrayList newList = (ArrayList) drawables.clone();
+ newList.add(drawable);
+ drawables = newList;
+ notifyAll();
+ }
+
+ /** Removes a drawable from the list managed by this Animator. */
+ public synchronized void remove(GLAutoDrawable drawable) {
+ ArrayList newList = (ArrayList) drawables.clone();
+ newList.remove(drawable);
+ drawables = newList;
+ }
+
+ /** Returns an iterator over the drawables managed by this
+ Animator. */
+ public Iterator/*<GLAutoDrawable>*/ drawableIterator() {
+ return drawables.iterator();
+ }
+
+ /** Sets a flag causing this Animator to ignore exceptions produced
+ while redrawing the drawables. By default this flag is set to
+ false, causing any exception thrown to halt the Animator. */
+ public void setIgnoreExceptions(boolean ignoreExceptions) {
+ this.ignoreExceptions = ignoreExceptions;
+ }
+
+ /** Sets a flag indicating that when exceptions are being ignored by
+ this Animator (see {@link #setIgnoreExceptions}), to print the
+ exceptions' stack traces for diagnostic information. Defaults to
+ false. */
+ public void setPrintExceptions(boolean printExceptions) {
+ this.printExceptions = printExceptions;
+ }
+
+ /** Sets a flag in this Animator indicating that it is to run as
+ fast as possible. By default there is a brief pause in the
+ animation loop which prevents the CPU from getting swamped.
+ This method may not have an effect on subclasses. */
+ public final void setRunAsFastAsPossible(boolean runFast) {
+ runAsFastAsPossible = runFast;
+ }
+
+ /** Called every frame to cause redrawing of all of the
+ GLAutoDrawables this Animator manages. Subclasses should call
+ this to get the most optimized painting behavior for the set of
+ components this Animator manages, in particular when multiple
+ lightweight widgets are continually being redrawn. */
+ protected void display() {
+ Iterator iter = drawableIterator();
+ while (iter.hasNext()) {
+ GLAutoDrawable drawable = (GLAutoDrawable) iter.next();
+ if (drawable instanceof JComponent) {
+ // Lightweight components need a more efficient drawing
+ // scheme than simply forcing repainting of each one in
+ // turn since drawing one can force another one to be
+ // drawn in turn
+ lightweights.add(drawable);
+ } else {
+ try {
+ drawable.display();
+ } catch (RuntimeException e) {
+ if (ignoreExceptions) {
+ if (printExceptions) {
+ e.printStackTrace();
+ }
+ } else {
+ throw(e);
+ }
+ }
+ }
+ }
+ if (lightweights.size() > 0) {
+ try {
+ SwingUtilities.invokeAndWait(drawWithRepaintManagerRunnable);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ lightweights.clear();
+ }
+ }
+
+ class MainLoop implements Runnable {
+ public void run() {
+ try {
+ while (!shouldStop) {
+ // Don't consume CPU unless there is work to be done
+ if (drawables.size() == 0) {
+ synchronized (Animator.this) {
+ while (drawables.size() == 0 && !shouldStop) {
+ try {
+ Animator.this.wait();
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+ }
+ display();
+ if (!runAsFastAsPossible) {
+ // Avoid swamping the CPU
+ Thread.yield();
+ }
+ }
+ } finally {
+ shouldStop = false;
+ synchronized (Animator.this) {
+ thread = null;
+ Animator.this.notify();
+ }
+ }
+ }
+ }
+
+ /** Starts this animator. */
+ public synchronized void start() {
+ if (thread != null) {
+ throw new GLException("Already started");
+ }
+ if (runnable == null) {
+ runnable = new MainLoop();
+ }
+ thread = new Thread(runnable);
+ thread.start();
+ }
+
+ /** Indicates whether this animator is currently running. This
+ should only be used as a heuristic to applications because in
+ some circumstances the Animator may be in the process of
+ shutting down and this method will still return true. */
+ public synchronized boolean isAnimating() {
+ return (thread != null);
+ }
+
+ /** Stops this animator. In most situations this method blocks until
+ completion, except when called from the animation thread itself
+ or in some cases from an implementation-internal thread like the
+ AWT event queue thread. */
+ public synchronized void stop() {
+ shouldStop = true;
+ notifyAll();
+ // It's hard to tell whether the thread which calls stop() has
+ // dependencies on the Animator's internal thread. Currently we
+ // use a couple of heuristics to determine whether we should do
+ // the blocking wait().
+ if ((Thread.currentThread() == thread) || EventQueue.isDispatchThread()) {
+ return;
+ }
+ while (shouldStop && thread != null) {
+ try {
+ wait();
+ } catch (InterruptedException ie) {
+ }
+ }
+ }
+
+ // Uses RepaintManager APIs to implement more efficient redrawing of
+ // the Swing widgets we're animating
+ private Runnable drawWithRepaintManagerRunnable = new Runnable() {
+ public void run() {
+ for (Iterator iter = lightweights.iterator(); iter.hasNext(); ) {
+ JComponent comp = (JComponent) iter.next();
+ RepaintManager rm = RepaintManager.currentManager(comp);
+ rm.markCompletelyDirty(comp);
+ repaintManagers.put(rm, rm);
+
+ // RepaintManagers don't currently optimize the case of
+ // overlapping sibling components. If we have two
+ // JInternalFrames in a JDesktopPane, the redraw of the
+ // bottom one will cause the top one to be redrawn as
+ // well. The top one will then be redrawn separately. In
+ // order to optimize this case we need to compute the union
+ // of all of the dirty regions on a particular JComponent if
+ // optimized drawing isn't enabled for it.
+
+ // Walk up the hierarchy trying to find a non-optimizable
+ // ancestor
+ Rectangle visible = comp.getVisibleRect();
+ int x = visible.x;
+ int y = visible.y;
+ while (comp != null) {
+ x += comp.getX();
+ y += comp.getY();
+ Component c = comp.getParent();
+ if ((c == null) || (!(c instanceof JComponent))) {
+ comp = null;
+ } else {
+ comp = (JComponent) c;
+ if (!comp.isOptimizedDrawingEnabled()) {
+ rm = RepaintManager.currentManager(comp);
+ repaintManagers.put(rm, rm);
+ // Need to dirty this region
+ Rectangle dirty = (Rectangle) dirtyRegions.get(comp);
+ if (dirty == null) {
+ dirty = new Rectangle(x, y, visible.width, visible.height);
+ dirtyRegions.put(comp, dirty);
+ } else {
+ // Compute union with already dirty region
+ // Note we could compute multiple non-overlapping
+ // regions: might want to do that in the future
+ // (prob. need more complex algorithm -- dynamic
+ // programming?)
+ dirty.add(new Rectangle(x, y, visible.width, visible.height));
+ }
+ }
+ }
+ }
+ }
+
+ // Dirty any needed regions on non-optimizable components
+ for (Iterator iter = dirtyRegions.keySet().iterator(); iter.hasNext(); ) {
+ JComponent comp = (JComponent) iter.next();
+ Rectangle rect = (Rectangle) dirtyRegions.get(comp);
+ RepaintManager rm = RepaintManager.currentManager(comp);
+ rm.addDirtyRegion(comp, rect.x, rect.y, rect.width, rect.height);
+ }
+
+ // Draw all dirty regions
+ for (Iterator iter = repaintManagers.keySet().iterator(); iter.hasNext(); ) {
+ ((RepaintManager) iter.next()).paintDirtyRegions();
+ }
+ dirtyRegions.clear();
+ repaintManagers.clear();
+ }
+ };
+}
diff --git a/src/net/java/games/jogl/util/BitmapCharRec.java b/src/classes/com/sun/opengl/utils/BitmapCharRec.java
index 642bbb465..a24ab1122 100644
--- a/src/net/java/games/jogl/util/BitmapCharRec.java
+++ b/src/classes/com/sun/opengl/utils/BitmapCharRec.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
/* Copyright (c) Mark J. Kilgard, 1994, 1998. */
diff --git a/src/net/java/games/jogl/util/BitmapFontRec.java b/src/classes/com/sun/opengl/utils/BitmapFontRec.java
index 32ea9c183..c300ad159 100644
--- a/src/net/java/games/jogl/util/BitmapFontRec.java
+++ b/src/classes/com/sun/opengl/utils/BitmapFontRec.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
/* Copyright (c) Mark J. Kilgard, 1994, 1998. */
diff --git a/src/classes/com/sun/opengl/utils/BufferUtils.java b/src/classes/com/sun/opengl/utils/BufferUtils.java
new file mode 100644
index 000000000..995fa0646
--- /dev/null
+++ b/src/classes/com/sun/opengl/utils/BufferUtils.java
@@ -0,0 +1,266 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.utils;
+
+import java.nio.*;
+import java.util.*;
+
+/** Utility routines for dealing with direct buffers. */
+
+public class BufferUtils {
+ public static final int SIZEOF_BYTE = 1;
+ public static final int SIZEOF_SHORT = 2;
+ public static final int SIZEOF_INT = 4;
+ public static final int SIZEOF_FLOAT = 4;
+ public static final int SIZEOF_LONG = 8;
+ public static final int SIZEOF_DOUBLE = 8;
+
+ //----------------------------------------------------------------------
+ // Allocation routines
+ //
+
+ /** Allocates a new direct ByteBuffer with the specified number of
+ elements. The returned buffer will have its byte order set to
+ the host platform's native byte order. */
+ public static ByteBuffer newByteBuffer(int numElements) {
+ ByteBuffer bb = ByteBuffer.allocateDirect(numElements);
+ bb.order(ByteOrder.nativeOrder());
+ return bb;
+ }
+
+ /** Allocates a new direct DoubleBuffer with the specified number of
+ elements. The returned buffer will have its byte order set to
+ the host platform's native byte order. */
+ public static DoubleBuffer newDoubleBuffer(int numElements) {
+ ByteBuffer bb = newByteBuffer(numElements * SIZEOF_DOUBLE);
+ return bb.asDoubleBuffer();
+ }
+
+ /** Allocates a new direct FloatBuffer with the specified number of
+ elements. The returned buffer will have its byte order set to
+ the host platform's native byte order. */
+ public static FloatBuffer newFloatBuffer(int numElements) {
+ ByteBuffer bb = newByteBuffer(numElements * SIZEOF_FLOAT);
+ return bb.asFloatBuffer();
+ }
+
+ /** Allocates a new direct IntBuffer with the specified number of
+ elements. The returned buffer will have its byte order set to
+ the host platform's native byte order. */
+ public static IntBuffer newIntBuffer(int numElements) {
+ ByteBuffer bb = newByteBuffer(numElements * SIZEOF_INT);
+ return bb.asIntBuffer();
+ }
+
+ /** Allocates a new direct LongBuffer with the specified number of
+ elements. The returned buffer will have its byte order set to
+ the host platform's native byte order. */
+ public static LongBuffer newLongBuffer(int numElements) {
+ ByteBuffer bb = newByteBuffer(numElements * SIZEOF_LONG);
+ return bb.asLongBuffer();
+ }
+
+ /** Allocates a new direct ShortBuffer with the specified number of
+ elements. The returned buffer will have its byte order set to
+ the host platform's native byte order. */
+ public static ShortBuffer newShortBuffer(int numElements) {
+ ByteBuffer bb = newByteBuffer(numElements * SIZEOF_SHORT);
+ return bb.asShortBuffer();
+ }
+
+ //----------------------------------------------------------------------
+ // Copy routines (type-to-type)
+ //
+
+ /** Copies the <i>remaining</i> elements (as defined by
+ <code>limit() - position()</code>) in the passed ByteBuffer into
+ a newly-allocated direct ByteBuffer. The returned buffer will
+ have its byte order set to the host platform's native byte
+ order. The position of the newly-allocated buffer will be zero,
+ and the position of the passed buffer is unchanged (though its
+ mark is changed). */
+ public static ByteBuffer copyByteBuffer(ByteBuffer orig) {
+ ByteBuffer dest = newByteBuffer(orig.remaining());
+ orig.mark();
+ dest.put(orig);
+ orig.reset();
+ dest.rewind();
+ return dest;
+ }
+
+ /** Copies the <i>remaining</i> elements (as defined by
+ <code>limit() - position()</code>) in the passed DoubleBuffer
+ into a newly-allocated direct DoubleBuffer. The returned buffer
+ will have its byte order set to the host platform's native byte
+ order. The position of the newly-allocated buffer will be zero,
+ and the position of the passed buffer is unchanged (though its
+ mark is changed). */
+ public static DoubleBuffer copyDoubleBuffer(DoubleBuffer orig) {
+ return copyDoubleBufferAsByteBuffer(orig).asDoubleBuffer();
+ }
+
+ /** Copies the <i>remaining</i> elements (as defined by
+ <code>limit() - position()</code>) in the passed FloatBuffer
+ into a newly-allocated direct FloatBuffer. The returned buffer
+ will have its byte order set to the host platform's native byte
+ order. The position of the newly-allocated buffer will be zero,
+ and the position of the passed buffer is unchanged (though its
+ mark is changed). */
+ public static FloatBuffer copyFloatBuffer(FloatBuffer orig) {
+ return copyFloatBufferAsByteBuffer(orig).asFloatBuffer();
+ }
+
+ /** Copies the <i>remaining</i> elements (as defined by
+ <code>limit() - position()</code>) in the passed IntBuffer
+ into a newly-allocated direct IntBuffer. The returned buffer
+ will have its byte order set to the host platform's native byte
+ order. The position of the newly-allocated buffer will be zero,
+ and the position of the passed buffer is unchanged (though its
+ mark is changed). */
+ public static IntBuffer copyIntBuffer(IntBuffer orig) {
+ return copyIntBufferAsByteBuffer(orig).asIntBuffer();
+ }
+
+ /** Copies the <i>remaining</i> elements (as defined by
+ <code>limit() - position()</code>) in the passed LongBuffer
+ into a newly-allocated direct LongBuffer. The returned buffer
+ will have its byte order set to the host platform's native byte
+ order. The position of the newly-allocated buffer will be zero,
+ and the position of the passed buffer is unchanged (though its
+ mark is changed). */
+ public static LongBuffer copyLongBuffer(LongBuffer orig) {
+ return copyLongBufferAsByteBuffer(orig).asLongBuffer();
+ }
+
+ /** Copies the <i>remaining</i> elements (as defined by
+ <code>limit() - position()</code>) in the passed ShortBuffer
+ into a newly-allocated direct ShortBuffer. The returned buffer
+ will have its byte order set to the host platform's native byte
+ order. The position of the newly-allocated buffer will be zero,
+ and the position of the passed buffer is unchanged (though its
+ mark is changed). */
+ public static ShortBuffer copyShortBuffer(ShortBuffer orig) {
+ return copyShortBufferAsByteBuffer(orig).asShortBuffer();
+ }
+
+ //----------------------------------------------------------------------
+ // Copy routines (type-to-ByteBuffer)
+ //
+
+ /** Copies the <i>remaining</i> elements (as defined by
+ <code>limit() - position()</code>) in the passed DoubleBuffer
+ into a newly-allocated direct ByteBuffer. The returned buffer
+ will have its byte order set to the host platform's native byte
+ order. The position of the newly-allocated buffer will be zero,
+ and the position of the passed buffer is unchanged (though its
+ mark is changed). */
+ public static ByteBuffer copyDoubleBufferAsByteBuffer(DoubleBuffer orig) {
+ ByteBuffer dest = newByteBuffer(orig.remaining() * SIZEOF_DOUBLE);
+ orig.mark();
+ dest.asDoubleBuffer().put(orig);
+ orig.reset();
+ dest.rewind();
+ return dest;
+ }
+
+ /** Copies the <i>remaining</i> elements (as defined by
+ <code>limit() - position()</code>) in the passed FloatBuffer
+ into a newly-allocated direct ByteBuffer. The returned buffer
+ will have its byte order set to the host platform's native byte
+ order. The position of the newly-allocated buffer will be zero,
+ and the position of the passed buffer is unchanged (though its
+ mark is changed). */
+ public static ByteBuffer copyFloatBufferAsByteBuffer(FloatBuffer orig) {
+ ByteBuffer dest = newByteBuffer(orig.remaining() * SIZEOF_FLOAT);
+ orig.mark();
+ dest.asFloatBuffer().put(orig);
+ orig.reset();
+ dest.rewind();
+ return dest;
+ }
+
+ /** Copies the <i>remaining</i> elements (as defined by
+ <code>limit() - position()</code>) in the passed IntBuffer into
+ a newly-allocated direct ByteBuffer. The returned buffer will
+ have its byte order set to the host platform's native byte
+ order. The position of the newly-allocated buffer will be zero,
+ and the position of the passed buffer is unchanged (though its
+ mark is changed). */
+ public static ByteBuffer copyIntBufferAsByteBuffer(IntBuffer orig) {
+ ByteBuffer dest = newByteBuffer(orig.remaining() * SIZEOF_INT);
+ orig.mark();
+ dest.asIntBuffer().put(orig);
+ orig.reset();
+ dest.rewind();
+ return dest;
+ }
+
+ /** Copies the <i>remaining</i> elements (as defined by
+ <code>limit() - position()</code>) in the passed LongBuffer into
+ a newly-allocated direct ByteBuffer. The returned buffer will
+ have its byte order set to the host platform's native byte
+ order. The position of the newly-allocated buffer will be zero,
+ and the position of the passed buffer is unchanged (though its
+ mark is changed). */
+ public static ByteBuffer copyLongBufferAsByteBuffer(LongBuffer orig) {
+ ByteBuffer dest = newByteBuffer(orig.remaining() * SIZEOF_LONG);
+ orig.mark();
+ dest.asLongBuffer().put(orig);
+ orig.reset();
+ dest.rewind();
+ return dest;
+ }
+
+ /** Copies the <i>remaining</i> elements (as defined by
+ <code>limit() - position()</code>) in the passed ShortBuffer
+ into a newly-allocated direct ByteBuffer. The returned buffer
+ will have its byte order set to the host platform's native byte
+ order. The position of the newly-allocated buffer will be zero,
+ and the position of the passed buffer is unchanged (though its
+ mark is changed). */
+ public static ByteBuffer copyShortBufferAsByteBuffer(ShortBuffer orig) {
+ ByteBuffer dest = newByteBuffer(orig.remaining() * SIZEOF_SHORT);
+ orig.mark();
+ dest.asShortBuffer().put(orig);
+ orig.reset();
+ dest.rewind();
+ return dest;
+ }
+}
diff --git a/src/net/java/games/jogl/util/CoordRec.java b/src/classes/com/sun/opengl/utils/CoordRec.java
index 661ed23ff..44f786377 100644
--- a/src/net/java/games/jogl/util/CoordRec.java
+++ b/src/classes/com/sun/opengl/utils/CoordRec.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
/* Copyright (c) Mark J. Kilgard, 1994, 1998. */
diff --git a/src/classes/com/sun/opengl/utils/FPSAnimator.java b/src/classes/com/sun/opengl/utils/FPSAnimator.java
new file mode 100755
index 000000000..c45ff15c4
--- /dev/null
+++ b/src/classes/com/sun/opengl/utils/FPSAnimator.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.opengl.utils;
+
+import java.util.*;
+import javax.media.opengl.*;
+
+/** An Animator subclass which attempts to achieve a target
+ frames-per-second rate to avoid using all CPU time. The target FPS
+ is only an estimate and is not guaranteed. */
+
+public class FPSAnimator extends Animator {
+ private Timer timer;
+ private int fps;
+
+ /** Creates an FPSAnimator with a given target frames-per-second value. */
+ public FPSAnimator(int fps) {
+ this(null, fps);
+ }
+
+ /** Creates an FPSAnimator with a given target frames-per-second
+ value and an initial drawable to animate. */
+ public FPSAnimator(GLAutoDrawable drawable, int fps) {
+ this.fps = fps;
+ if (drawable != null) {
+ add(drawable);
+ }
+ }
+
+ /** Starts this FPSAnimator. */
+ public synchronized void start() {
+ if (timer != null) {
+ throw new GLException("Already started");
+ }
+ timer = new Timer();
+ long delay = (long) (1000.0f / (float) fps);
+ timer.schedule(new TimerTask() {
+ public void run() {
+ display();
+ }
+ }, 0, delay);
+ }
+
+ /** Indicates whether this FPSAnimator is currently running. This
+ should only be used as a heuristic to applications because in
+ some circumstances the FPSAnimator may be in the process of
+ shutting down and this method will still return true. */
+ public synchronized boolean isAnimating() {
+ return (timer != null);
+ }
+
+ /** Stops this FPSAnimator. Due to the implementation of the
+ FPSAnimator it is not guaranteed that the FPSAnimator will be
+ completely stopped by the time this method returns. */
+ public synchronized void stop() {
+ if (timer == null) {
+ throw new GLException("Already stopped");
+ }
+ timer.cancel();
+ timer = null;
+ }
+}
diff --git a/src/net/java/games/jogl/util/GLUT.java b/src/classes/com/sun/opengl/utils/GLUT.java
index 9f9ed1558..2896729e2 100644
--- a/src/net/java/games/jogl/util/GLUT.java
+++ b/src/classes/com/sun/opengl/utils/GLUT.java
@@ -37,9 +37,10 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
-import net.java.games.jogl.*;
+import javax.media.opengl.*;
+import javax.media.opengl.glu.*;
/** Subset of the routines provided by the GLUT interface. Note the
signatures of many of the methods are necessarily different than
@@ -101,11 +102,13 @@ public class GLUT {
public static final int BITMAP_HELVETICA_12 = 7;
public static final int BITMAP_HELVETICA_18 = 8;
+ private GLU glu = new GLU();
+
//----------------------------------------------------------------------
// Shapes
//
- public void glutWireSphere(GLU glu, double radius, int slices, int stacks) {
+ public void glutWireSphere(double radius, int slices, int stacks) {
quadObjInit(glu);
glu.gluQuadricDrawStyle(quadObj, GLU.GLU_LINE);
glu.gluQuadricNormals(quadObj, GLU.GLU_SMOOTH);
@@ -115,7 +118,7 @@ public class GLUT {
glu.gluSphere(quadObj, radius, slices, stacks);
}
- public void glutSolidSphere(GLU glu, double radius, int slices, int stacks) {
+ public void glutSolidSphere(double radius, int slices, int stacks) {
quadObjInit(glu);
glu.gluQuadricDrawStyle(quadObj, GLU.GLU_FILL);
glu.gluQuadricNormals(quadObj, GLU.GLU_SMOOTH);
@@ -125,8 +128,7 @@ public class GLUT {
glu.gluSphere(quadObj, radius, slices, stacks);
}
- public void glutWireCone(GLU glu,
- double base, double height,
+ public void glutWireCone(double base, double height,
int slices, int stacks) {
quadObjInit(glu);
glu.gluQuadricDrawStyle(quadObj, GLU.GLU_LINE);
@@ -137,8 +139,7 @@ public class GLUT {
glu.gluCylinder(quadObj, base, 0.0, height, slices, stacks);
}
- public void glutSolidCone(GLU glu,
- double base, double height,
+ public void glutSolidCone(double base, double height,
int slices, int stacks) {
quadObjInit(glu);
glu.gluQuadricDrawStyle(quadObj, GLU.GLU_FILL);
@@ -149,72 +150,69 @@ public class GLUT {
glu.gluCylinder(quadObj, base, 0.0, height, slices, stacks);
}
- public void glutWireCube(GL gl, float size) {
- drawBox(gl, size, GL.GL_LINE_LOOP);
+ public void glutWireCube(float size) {
+ drawBox(GLU.getCurrentGL(), size, GL.GL_LINE_LOOP);
}
- public void glutSolidCube(GL gl, float size) {
- drawBox(gl, size, GL.GL_QUADS);
+ public void glutSolidCube(float size) {
+ drawBox(GLU.getCurrentGL(), size, GL.GL_QUADS);
}
- public void glutWireTorus(GL gl,
- double innerRadius, double outerRadius,
+ public void glutWireTorus(double innerRadius, double outerRadius,
int nsides, int rings) {
+ GL gl = GLU.getCurrentGL();
gl.glPushAttrib(GL.GL_POLYGON_BIT);
gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINE);
doughnut(gl, innerRadius, outerRadius, nsides, rings);
gl.glPopAttrib();
}
- public void glutSolidTorus(GL gl,
- double innerRadius, double outerRadius,
+ public void glutSolidTorus(double innerRadius, double outerRadius,
int nsides, int rings) {
- doughnut(gl, innerRadius, outerRadius, nsides, rings);
+ doughnut(GLU.getCurrentGL(), innerRadius, outerRadius, nsides, rings);
}
- public void glutWireDodecahedron(GL gl) {
- dodecahedron(gl, GL.GL_LINE_LOOP);
+ public void glutWireDodecahedron() {
+ dodecahedron(GLU.getCurrentGL(), GL.GL_LINE_LOOP);
}
- public void glutSolidDodecahedron(GL gl) {
- dodecahedron(gl, GL.GL_TRIANGLE_FAN);
+ public void glutSolidDodecahedron() {
+ dodecahedron(GLU.getCurrentGL(), GL.GL_TRIANGLE_FAN);
}
- public void glutWireOctahedron(GL gl) {
- octahedron(gl, GL.GL_LINE_LOOP);
+ public void glutWireOctahedron() {
+ octahedron(GLU.getCurrentGL(), GL.GL_LINE_LOOP);
}
- public void glutSolidOctahedron(GL gl) {
- octahedron(gl, GL.GL_TRIANGLES);
+ public void glutSolidOctahedron() {
+ octahedron(GLU.getCurrentGL(), GL.GL_TRIANGLES);
}
- public void glutWireIcosahedron(GL gl) {
- icosahedron(gl, GL.GL_LINE_LOOP);
+ public void glutWireIcosahedron() {
+ icosahedron(GLU.getCurrentGL(), GL.GL_LINE_LOOP);
}
- public void glutSolidIcosahedron(GL gl) {
- icosahedron(gl, GL.GL_TRIANGLES);
+ public void glutSolidIcosahedron() {
+ icosahedron(GLU.getCurrentGL(), GL.GL_TRIANGLES);
}
- public void glutWireTetrahedron(GL gl) {
- tetrahedron(gl, GL.GL_LINE_LOOP);
+ public void glutWireTetrahedron() {
+ tetrahedron(GLU.getCurrentGL(), GL.GL_LINE_LOOP);
}
- public void glutSolidTetrahedron(GL gl) {
- tetrahedron(gl, GL.GL_TRIANGLES);
+ public void glutSolidTetrahedron() {
+ tetrahedron(GLU.getCurrentGL(), GL.GL_TRIANGLES);
}
/**
* Renders the teapot as a solid shape of the specified size. The teapot is
* created in a way that replicates the C GLUT implementation.
*
- * @param gl
- * the OpenGL context in which to render the teapot
* @param scale
* the factor by which to scale the teapot
*/
- public void glutSolidTeapot(GL gl, double scale) {
- glutSolidTeapot(gl, scale, true);
+ public void glutSolidTeapot(double scale) {
+ glutSolidTeapot(scale, true);
}
/**
@@ -226,29 +224,25 @@ public class GLUT {
* for the teapot are generated. The teapot is generated with OpenGL
* evaluators.
*
- * @param gl
- * the OpenGL context in which to render the teapot
* @param scale
* the factor by which to scale the teapot
* @param cStyle
* whether to create the teapot in exactly the same way as in the C
* implementation of GLUT
*/
- public void glutSolidTeapot(GL gl, double scale, boolean cStyle) {
- teapot(gl, 14, scale, GL.GL_FILL, cStyle);
+ public void glutSolidTeapot(double scale, boolean cStyle) {
+ teapot(GLU.getCurrentGL(), 14, scale, GL.GL_FILL, cStyle);
}
/**
* Renders the teapot as a wireframe shape of the specified size. The teapot
* is created in a way that replicates the C GLUT implementation.
*
- * @param gl
- * the OpenGL context in which to render the teapot
* @param scale
* the factor by which to scale the teapot
*/
- public void glutWireTeapot(GL gl, double scale) {
- glutWireTeapot(gl, scale, true);
+ public void glutWireTeapot(double scale) {
+ glutWireTeapot(scale, true);
}
/**
@@ -260,30 +254,29 @@ public class GLUT {
* coordinates for the teapot are generated. The teapot is generated with
* OpenGL evaluators.
*
- * @param gl
- * the OpenGL context in which to render the teapot
* @param scale
* the factor by which to scale the teapot
* @param cStyle
* whether to create the teapot in exactly the same way as in the C
* implementation of GLUT
*/
- public void glutWireTeapot(GL gl, double scale, boolean cStyle) {
- teapot(gl, 10, scale, GL.GL_LINE, cStyle);
+ public void glutWireTeapot(double scale, boolean cStyle) {
+ teapot(GLU.getCurrentGL(), 10, scale, GL.GL_LINE, cStyle);
}
//----------------------------------------------------------------------
// Fonts
//
- public void glutBitmapCharacter(GL gl, int font, char character) {
+ public void glutBitmapCharacter(int font, char character) {
+ GL gl = GLU.getCurrentGL();
int[] swapbytes = new int[1];
int[] lsbfirst = new int[1];
int[] rowlength = new int[1];
int[] skiprows = new int[1];
int[] skippixels = new int[1];
int[] alignment = new int[1];
- beginBitmap(gl,
+ beginBitmap(gl,
swapbytes,
lsbfirst,
rowlength,
@@ -291,7 +284,7 @@ public class GLUT {
skippixels,
alignment);
bitmapCharacterImpl(gl, font, character);
- endBitmap(gl,
+ endBitmap(gl,
swapbytes,
lsbfirst,
rowlength,
@@ -300,7 +293,8 @@ public class GLUT {
alignment);
}
- public void glutBitmapString (GL gl, int font, String string) {
+ public void glutBitmapString (int font, String string) {
+ GL gl = GLU.getCurrentGL();
int[] swapbytes = new int[1];
int[] lsbfirst = new int[1];
int[] rowlength = new int[1];
@@ -339,7 +333,8 @@ public class GLUT {
return 0;
}
- public void glutStrokeCharacter(GL gl, int font, char character) {
+ public void glutStrokeCharacter(int font, char character) {
+ GL gl = GLU.getCurrentGL();
StrokeFontRec fontinfo = getStrokeFont(font);
int c = character & 0xFFFF;
if (c < 0 || c >= fontinfo.num_chars)
@@ -359,7 +354,8 @@ public class GLUT {
}
}
- public void glutStrokeString(GL gl, int font, String string) {
+ public void glutStrokeString(int font, String string) {
+ GL gl = GLU.getCurrentGL();
StrokeFontRec fontinfo = getStrokeFont(font);
int len = string.length();
for (int pos = 0; pos < len; pos++) {
@@ -525,7 +521,7 @@ public class GLUT {
int[][] faces = boxFaces;
for (int i = 5; i >= 0; i--) {
gl.glBegin(type);
- gl.glNormal3fv(n[i]);
+ gl.glNormal3fv(n[i], 0);
float[] vt = v[faces[i][0]];
gl.glVertex3f(vt[0] * size, vt[1] * size, vt[2] * size);
vt = v[faces[i][1]];
@@ -614,12 +610,12 @@ public class GLUT {
normalize(n0);
gl.glBegin(shadeType);
- gl.glNormal3fv(n0);
- gl.glVertex3fv(dodec[a]);
- gl.glVertex3fv(dodec[b]);
- gl.glVertex3fv(dodec[c]);
- gl.glVertex3fv(dodec[d]);
- gl.glVertex3fv(dodec[e]);
+ gl.glNormal3fv(n0, 0);
+ gl.glVertex3fv(dodec[a], 0);
+ gl.glVertex3fv(dodec[b], 0);
+ gl.glVertex3fv(dodec[c], 0);
+ gl.glVertex3fv(dodec[d], 0);
+ gl.glVertex3fv(dodec[e], 0);
gl.glEnd();
}
@@ -651,10 +647,10 @@ public class GLUT {
normalize(q1);
gl.glBegin(shadeType);
- gl.glNormal3fv(q1);
- gl.glVertex3fv(n1);
- gl.glVertex3fv(n2);
- gl.glVertex3fv(n3);
+ gl.glNormal3fv(q1, 0);
+ gl.glVertex3fv(n1, 0);
+ gl.glVertex3fv(n2, 0);
+ gl.glVertex3fv(n3, 0);
gl.glEnd();
}
@@ -1024,16 +1020,16 @@ public class GLUT {
}
}
}
- gl.glMap2f(GL.GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, teapotTex);
- gl.glMap2f(GL.GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, p);
+ gl.glMap2f(GL.GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, teapotTex, 0);
+ gl.glMap2f(GL.GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, p, 0);
gl.glMapGrid2f(grid, 0.0f, 1.0f, grid, 0.0f, 1.0f);
evaluateTeapotMesh(gl, grid, type, i, !backCompatible);
- gl.glMap2f(GL.GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, q);
+ gl.glMap2f(GL.GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, q, 0);
evaluateTeapotMesh(gl, grid, type, i, !backCompatible);
if (i < 6) {
- gl.glMap2f(GL.GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, r);
+ gl.glMap2f(GL.GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, r, 0);
evaluateTeapotMesh(gl, grid, type, i, !backCompatible);
- gl.glMap2f(GL.GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, s);
+ gl.glMap2f(GL.GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, s, 0);
evaluateTeapotMesh(gl, grid, type, i, !backCompatible);
}
}
@@ -1101,7 +1097,7 @@ public class GLUT {
BitmapCharRec ch = fontinfo.ch[c - fontinfo.first];
if (ch != null) {
gl.glBitmap(ch.width, ch.height, ch.xorig, ch.yorig,
- ch.advance, 0, ch.bitmap);
+ ch.advance, 0, ch.bitmap, 0);
}
}
@@ -1165,12 +1161,12 @@ public class GLUT {
int[] skiprows,
int[] skippixels,
int[] alignment) {
- gl.glGetIntegerv(GL.GL_UNPACK_SWAP_BYTES, swapbytes);
- gl.glGetIntegerv(GL.GL_UNPACK_LSB_FIRST, lsbfirst);
- gl.glGetIntegerv(GL.GL_UNPACK_ROW_LENGTH, rowlength);
- gl.glGetIntegerv(GL.GL_UNPACK_SKIP_ROWS, skiprows);
- gl.glGetIntegerv(GL.GL_UNPACK_SKIP_PIXELS, skippixels);
- gl.glGetIntegerv(GL.GL_UNPACK_ALIGNMENT, alignment);
+ gl.glGetIntegerv(GL.GL_UNPACK_SWAP_BYTES, swapbytes, 0);
+ gl.glGetIntegerv(GL.GL_UNPACK_LSB_FIRST, lsbfirst, 0);
+ gl.glGetIntegerv(GL.GL_UNPACK_ROW_LENGTH, rowlength, 0);
+ gl.glGetIntegerv(GL.GL_UNPACK_SKIP_ROWS, skiprows, 0);
+ gl.glGetIntegerv(GL.GL_UNPACK_SKIP_PIXELS, skippixels, 0);
+ gl.glGetIntegerv(GL.GL_UNPACK_ALIGNMENT, alignment, 0);
/* Little endian machines (DEC Alpha for example) could
benefit from setting GL_UNPACK_LSB_FIRST to GL_TRUE
instead of GL_FALSE, but this would require changing the
diff --git a/src/net/java/games/jogl/util/GLUTBitmap8x13.java b/src/classes/com/sun/opengl/utils/GLUTBitmap8x13.java
index caa007726..a373aeb8d 100644
--- a/src/net/java/games/jogl/util/GLUTBitmap8x13.java
+++ b/src/classes/com/sun/opengl/utils/GLUTBitmap8x13.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
class GLUTBitmap8x13 {
diff --git a/src/net/java/games/jogl/util/GLUTBitmap9x15.java b/src/classes/com/sun/opengl/utils/GLUTBitmap9x15.java
index 05aa2635b..c1668967d 100644
--- a/src/net/java/games/jogl/util/GLUTBitmap9x15.java
+++ b/src/classes/com/sun/opengl/utils/GLUTBitmap9x15.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
class GLUTBitmap9x15 {
diff --git a/src/net/java/games/jogl/util/GLUTBitmapHelvetica10.java b/src/classes/com/sun/opengl/utils/GLUTBitmapHelvetica10.java
index d238d7d16..9a329f6a3 100644
--- a/src/net/java/games/jogl/util/GLUTBitmapHelvetica10.java
+++ b/src/classes/com/sun/opengl/utils/GLUTBitmapHelvetica10.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
class GLUTBitmapHelvetica10 {
diff --git a/src/net/java/games/jogl/util/GLUTBitmapHelvetica12.java b/src/classes/com/sun/opengl/utils/GLUTBitmapHelvetica12.java
index fe29ab84f..e27431c4e 100644
--- a/src/net/java/games/jogl/util/GLUTBitmapHelvetica12.java
+++ b/src/classes/com/sun/opengl/utils/GLUTBitmapHelvetica12.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
class GLUTBitmapHelvetica12 {
diff --git a/src/net/java/games/jogl/util/GLUTBitmapHelvetica18.java b/src/classes/com/sun/opengl/utils/GLUTBitmapHelvetica18.java
index 31fbda94c..baf95d818 100644
--- a/src/net/java/games/jogl/util/GLUTBitmapHelvetica18.java
+++ b/src/classes/com/sun/opengl/utils/GLUTBitmapHelvetica18.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
class GLUTBitmapHelvetica18 {
diff --git a/src/net/java/games/jogl/util/GLUTBitmapTimesRoman10.java b/src/classes/com/sun/opengl/utils/GLUTBitmapTimesRoman10.java
index 175b857e0..00cf2975c 100644
--- a/src/net/java/games/jogl/util/GLUTBitmapTimesRoman10.java
+++ b/src/classes/com/sun/opengl/utils/GLUTBitmapTimesRoman10.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
class GLUTBitmapTimesRoman10 {
diff --git a/src/net/java/games/jogl/util/GLUTBitmapTimesRoman24.java b/src/classes/com/sun/opengl/utils/GLUTBitmapTimesRoman24.java
index 25684ceff..22d2a19a2 100644
--- a/src/net/java/games/jogl/util/GLUTBitmapTimesRoman24.java
+++ b/src/classes/com/sun/opengl/utils/GLUTBitmapTimesRoman24.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
class GLUTBitmapTimesRoman24 {
diff --git a/src/net/java/games/jogl/util/GLUTStrokeMonoRoman.java b/src/classes/com/sun/opengl/utils/GLUTStrokeMonoRoman.java
index f5d2ebcff..39aaf8a18 100644
--- a/src/net/java/games/jogl/util/GLUTStrokeMonoRoman.java
+++ b/src/classes/com/sun/opengl/utils/GLUTStrokeMonoRoman.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
class GLUTStrokeMonoRoman {
diff --git a/src/net/java/games/jogl/util/GLUTStrokeRoman.java b/src/classes/com/sun/opengl/utils/GLUTStrokeRoman.java
index 2755b8dfc..de040508a 100644
--- a/src/net/java/games/jogl/util/GLUTStrokeRoman.java
+++ b/src/classes/com/sun/opengl/utils/GLUTStrokeRoman.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
class GLUTStrokeRoman {
diff --git a/src/net/java/games/jogl/util/StrokeCharRec.java b/src/classes/com/sun/opengl/utils/StrokeCharRec.java
index 7c961fb4d..8601e4079 100644
--- a/src/net/java/games/jogl/util/StrokeCharRec.java
+++ b/src/classes/com/sun/opengl/utils/StrokeCharRec.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
/* Copyright (c) Mark J. Kilgard, 1994, 1998. */
diff --git a/src/net/java/games/jogl/util/StrokeFontRec.java b/src/classes/com/sun/opengl/utils/StrokeFontRec.java
index 133380a77..2ea2d21ac 100644
--- a/src/net/java/games/jogl/util/StrokeFontRec.java
+++ b/src/classes/com/sun/opengl/utils/StrokeFontRec.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
/* Copyright (c) Mark J. Kilgard, 1994, 1998. */
diff --git a/src/net/java/games/jogl/util/StrokeRec.java b/src/classes/com/sun/opengl/utils/StrokeRec.java
index cc4571465..bc875856e 100644
--- a/src/net/java/games/jogl/util/StrokeRec.java
+++ b/src/classes/com/sun/opengl/utils/StrokeRec.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl.util;
+package com.sun.opengl.utils;
/* Copyright (c) Mark J. Kilgard, 1994, 1998. */
diff --git a/src/net/java/games/jogl/Version.java b/src/classes/com/sun/opengl/utils/Version.java
index 7d28f7fc8..843dc9a03 100644
--- a/src/net/java/games/jogl/Version.java
+++ b/src/classes/com/sun/opengl/utils/Version.java
@@ -31,7 +31,7 @@
* design, construction, operation or maintenance of any nuclear facility.
*/
-package net.java.games.jogl;
+package com.sun.opengl.utils;
/**
* The version and build number of this implementation.
@@ -89,7 +89,7 @@ public final class Version {
/**
* Version string of this build.
*/
- private static final String version = "1.1.1";
+ private static final String version = "jsr231-1.0-beta1-b01";
/**
* Returns the version string and build number of
diff --git a/src/net/java/games/jogl/ComponentEvents.java b/src/classes/javax/media/opengl/ComponentEvents.java
index e21441aeb..bfbbb957b 100644
--- a/src/net/java/games/jogl/ComponentEvents.java
+++ b/src/classes/javax/media/opengl/ComponentEvents.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl;
+package javax.media.opengl;
import java.awt.event.*;
import java.beans.PropertyChangeListener;
diff --git a/src/net/java/games/jogl/DefaultGLCapabilitiesChooser.java b/src/classes/javax/media/opengl/DefaultGLCapabilitiesChooser.java
index 119007617..391787a01 100644
--- a/src/net/java/games/jogl/DefaultGLCapabilitiesChooser.java
+++ b/src/classes/javax/media/opengl/DefaultGLCapabilitiesChooser.java
@@ -37,9 +37,9 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl;
+package javax.media.opengl;
-import net.java.games.jogl.impl.Debug;
+import com.sun.opengl.impl.Debug;
/** <P> The default implementation of the {@link
GLCapabilitiesChooser} interface, which provides consistent visual
diff --git a/src/classes/javax/media/opengl/GLAutoDrawable.java b/src/classes/javax/media/opengl/GLAutoDrawable.java
new file mode 100644
index 000000000..18adfde54
--- /dev/null
+++ b/src/classes/javax/media/opengl/GLAutoDrawable.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package javax.media.opengl;
+
+import javax.media.opengl.glu.*;
+
+/** A higher-level abstraction than {@link GLDrawable} which supplies
+ an event based mechanism ({@link GLEventListener}) for performing
+ OpenGL rendering. A GLAutoDrawable automatically creates a primary
+ rendering context which is associated with the GLAutoDrawable for
+ the lifetime of the object. This context has the {@link
+ GLContext#setSynchronized synchronized} property enabled so that
+ calls to {@link GLContext#makeCurrent makeCurrent} will block if
+ the context is current on another thread. This allows the internal
+ GLContext for the GLAutoDrawable to be used both by the event
+ based rendering mechanism as well by end users directly. */
+
+public interface GLAutoDrawable extends GLDrawable, ComponentEvents {
+ /**
+ * Returns the context associated with this drawable. The returned
+ * context will be synchronized.
+ */
+ public GLContext getContext();
+
+ /** Adds a {@link GLEventListener} to this drawable. If multiple
+ listeners are added to a given drawable, they are notified of
+ events in an arbitrary order. */
+ public void addGLEventListener(GLEventListener listener);
+
+ /** Removes a {@link GLEventListener} from this drawable. Note that
+ if this is done from within a particular drawable's {@link
+ GLEventListener} handler (reshape, display, etc.) that it is not
+ guaranteed that all other listeners will be evaluated properly
+ during this update cycle. */
+ public void removeGLEventListener(GLEventListener listener);
+
+ /** Causes OpenGL rendering to be performed for this GLAutoDrawable
+ by calling {@link GLEventListener#display display} for all
+ registered {@link GLEventListener}s. Called automatically by the
+ window system toolkit upon receiving a repaint() request. this
+ routine may be called manually for better control over the
+ rendering process. It is legal to call another GLAutoDrawable's
+ display method from within the {@link GLEventListener#display
+ display} callback. */
+ public void display();
+
+ /** Schedules a repaint of the component at some point in the
+ future. */
+ public void repaint();
+
+ /** Enables or disables automatic buffer swapping for this drawable.
+ By default this property is set to true; when true, after all
+ GLEventListeners have been called for a display() event, the
+ front and back buffers are swapped, displaying the results of
+ the render. When disabled, the user is responsible for calling
+ {@link #swapBuffers} manually. */
+ public void setAutoSwapBufferMode(boolean onOrOff);
+
+ /** Indicates whether automatic buffer swapping is enabled for this
+ drawable. See {@link #setAutoSwapBufferMode}. */
+ public boolean getAutoSwapBufferMode();
+
+ /** Returns the {@link GL} pipeline object this GLAutoDrawable uses.
+ If this method is called outside of the {@link
+ GLEventListener}'s callback methods (init, display, etc.) it may
+ return null. Users should not rely on the identity of the
+ returned GL object; for example, users should not maintain a
+ hash table with the GL object as the key. Additionally, the GL
+ object should not be cached in client code, but should be
+ re-fetched from the GLAutoDrawable at the beginning of each call
+ to init, display, etc. */
+ public GL getGL();
+
+ /** Sets the {@link GL} pipeline object this GLAutoDrawable uses.
+ This should only be called from within the GLEventListener's
+ callback methods, and usually only from within the init()
+ method, in order to install a composable pipeline. See the JOGL
+ demos for examples. */
+ public void setGL(GL gl);
+}
diff --git a/src/net/java/games/jogl/GLCanvas.java b/src/classes/javax/media/opengl/GLCanvas.java
index f73a006ae..f2ca1bf80 100644
--- a/src/net/java/games/jogl/GLCanvas.java
+++ b/src/classes/javax/media/opengl/GLCanvas.java
@@ -37,13 +37,14 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl;
+package javax.media.opengl;
import java.awt.Canvas;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
-import net.java.games.jogl.impl.*;
+import java.awt.GraphicsDevice;
+import com.sun.opengl.impl.*;
// FIXME: Subclasses need to call resetGLFunctionAvailability() on their
// context whenever the displayChanged() function is called on our
@@ -57,41 +58,70 @@ import net.java.games.jogl.impl.*;
instantiated directly; use {@link GLDrawableFactory} to construct
them. */
-public final class GLCanvas extends Canvas implements GLDrawable {
+public class GLCanvas extends Canvas implements GLAutoDrawable {
- protected static final boolean DEBUG = Debug.debug("GLCanvas");
+ private static final boolean DEBUG = Debug.debug("GLCanvas");
private GLDrawableHelper drawableHelper = new GLDrawableHelper();
- private GLContext context;
-
- GLCanvas(GraphicsConfiguration config,
- GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLDrawable shareWith) {
- super(config);
- context = GLContextFactory.getFactory().createGLContext(this, capabilities, chooser,
- GLContextHelper.getContext(shareWith));
+ private GLDrawable drawable;
+ private GLContextImpl context;
+ private boolean autoSwapBufferMode = true;
+ private boolean sendReshape = false;
+
+ /** Creates a new GLCanvas component. The passed GLCapabilities must
+ be non-null and specifies the OpenGL capabilities for the
+ component. The GLCapabilitiesChooser must be non-null and
+ specifies the algorithm for selecting one of the available
+ GLCapabilities for the component; the GLDrawableFactory uses a
+ DefaultGLCapabilitesChooser if the user does not provide
+ one. The passed GLContext may be null and specifies an OpenGL
+ context with which to share textures, display lists and other
+ OpenGL state. The passed GraphicsDevice must be non-null and
+ indicates the screen on which to create the GLCanvas; the
+ GLDrawableFactory uses the default screen device of the local
+ GraphicsEnvironment if the user does not provide one. */
+ protected GLCanvas(GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser,
+ GLContext shareWith,
+ GraphicsDevice device) {
+ // The platform-specific GLDrawableFactory will only provide a
+ // non-null GraphicsConfiguration on platforms where this is
+ // necessary (currently only X11, as Windows allows the pixel
+ // format of the window to be set later and Mac OS X seems to
+ // handle this very differently than all other platforms). On
+ // other platforms this method returns null; it is the case (at
+ // least in the Sun AWT implementation) that this will result in
+ // equivalent behavior to calling the no-arg super() constructor
+ // for Canvas.
+ super(GLDrawableFactory.getFactory().chooseGraphicsConfiguration(capabilities, chooser, device));
+ drawable = GLDrawableFactory.getFactory().getGLDrawable(this, capabilities, chooser);
+ context = (GLContextImpl) drawable.createContext(shareWith);
+ context.setSynchronized(true);
}
+ public GLContext createContext(GLContext shareWith) {
+ return drawable.createContext(shareWith);
+ }
+
+ public void setRealized(boolean realized) {
+ }
+
public void display() {
maybeDoSingleThreadedWorkaround(displayOnEventDispatchThreadAction,
- displayAction,
- false);
+ displayAction);
}
/** Overridden from Canvas; calls {@link #display}. Should not be
invoked by applications directly. */
public void paint(Graphics g) {
- if (!context.getNoAutoRedrawMode()) {
- display();
- }
+ display();
}
/** Overridden from Canvas; used to indicate when it's safe to
create an OpenGL context for the component. */
public void addNotify() {
super.addNotify();
- context.setRealized();
+ drawable.setRealized(true);
if (DEBUG) {
System.err.println("GLCanvas.addNotify()");
}
@@ -101,6 +131,7 @@ public final class GLCanvas extends Canvas implements GLDrawable {
safe to have an OpenGL context for the component. */
public void removeNotify() {
context.destroy();
+ drawable.setRealized(false);
super.removeNotify();
if (DEBUG) {
System.err.println("GLCanvas.removeNotify()");
@@ -113,24 +144,7 @@ public final class GLCanvas extends Canvas implements GLDrawable {
directly. */
public void reshape(int x, int y, int width, int height) {
super.reshape(x, y, width, height);
- // Note: we ignore the given x and y within the parent component
- // since we are drawing directly into this heavyweight component.
- final int fx = 0;
- final int fy = 0;
- final int fwidth = width;
- final int fheight = height;
- final Runnable reshapeRunnable = new Runnable() {
- public void run() {
- getGL().glViewport(fx, fy, fwidth, fheight);
- drawableHelper.reshape(GLCanvas.this, fx, fy, fwidth, fheight);
- }
- };
- final Runnable reshapeOnEDTRunnable = new Runnable() {
- public void run() {
- context.invokeGL(reshapeRunnable, true, initAction);
- }
- };
- maybeDoSingleThreadedWorkaround(reshapeOnEDTRunnable, reshapeRunnable, true);
+ sendReshape = true;
}
/** Overridden from Canvas to prevent Java2D's clearing of the
@@ -147,66 +161,28 @@ public final class GLCanvas extends Canvas implements GLDrawable {
drawableHelper.removeGLEventListener(listener);
}
- public GL getGL() {
- return context.getGL();
- }
-
- public void setGL(GL gl) {
- context.setGL(gl);
- }
-
- public GLU getGLU() {
- return context.getGLU();
- }
-
- public void setGLU(GLU glu) {
- context.setGLU(glu);
- }
-
- void willSetRenderingThread() {
- context.willSetRenderingThread();
- }
-
- public void setRenderingThread(Thread currentThreadOrNull) throws GLException {
- context.setRenderingThread(currentThreadOrNull, initAction);
- }
-
- public Thread getRenderingThread() {
- return context.getRenderingThread();
+ public GLContext getContext() {
+ return context;
}
- public void setNoAutoRedrawMode(boolean noAutoRedraw) {
- context.setNoAutoRedrawMode(noAutoRedraw);
+ public GL getGL() {
+ return getContext().getGL();
}
- public boolean getNoAutoRedrawMode() {
- return context.getNoAutoRedrawMode();
+ public void setGL(GL gl) {
+ getContext().setGL(gl);
}
public void setAutoSwapBufferMode(boolean onOrOff) {
- context.setAutoSwapBufferMode(onOrOff);
+ drawableHelper.setAutoSwapBufferMode(onOrOff);
}
public boolean getAutoSwapBufferMode() {
- return context.getAutoSwapBufferMode();
+ return drawableHelper.getAutoSwapBufferMode();
}
public void swapBuffers() {
- maybeDoSingleThreadedWorkaround(swapBuffersOnEventDispatchThreadAction, swapBuffersAction, false);
- }
-
- public boolean canCreateOffscreenDrawable() {
- return context.canCreatePbufferContext();
- }
-
- public GLPbuffer createOffscreenDrawable(GLCapabilities capabilities,
- int initialWidth,
- int initialHeight) {
- return new GLPbufferImpl(context.createPbufferContext(capabilities, initialWidth, initialHeight));
- }
-
- GLContext getContext() {
- return context;
+ maybeDoSingleThreadedWorkaround(swapBuffersOnEventDispatchThreadAction, swapBuffersAction);
}
//----------------------------------------------------------------------
@@ -214,26 +190,12 @@ public final class GLCanvas extends Canvas implements GLDrawable {
//
private void maybeDoSingleThreadedWorkaround(Runnable eventDispatchThreadAction,
- Runnable invokeGLAction,
- boolean isReshape) {
- if (SingleThreadedWorkaround.doWorkaround() && !EventQueue.isDispatchThread()) {
- try {
- // Reshape events must not block on the event queue due to the
- // possibility of deadlocks during initial component creation.
- // This solution is not optimal, because it changes the
- // semantics of reshape() to have some of the processing being
- // done asynchronously, but at least it preserves the
- // semantics of the single-threaded workaround.
- if (!isReshape) {
- EventQueue.invokeAndWait(eventDispatchThreadAction);
- } else {
- EventQueue.invokeLater(eventDispatchThreadAction);
- }
- } catch (Exception e) {
- throw new GLException(e);
- }
+ Runnable invokeGLAction) {
+ if (Threading.isSingleThreaded() &&
+ !Threading.isOpenGLThread()) {
+ Threading.invokeOnOpenGLThread(eventDispatchThreadAction);
} else {
- context.invokeGL(invokeGLAction, isReshape, initAction);
+ drawableHelper.invokeGL(drawable, context, invokeGLAction, initAction);
}
}
@@ -246,6 +208,16 @@ public final class GLCanvas extends Canvas implements GLDrawable {
class DisplayAction implements Runnable {
public void run() {
+ if (sendReshape) {
+ // Note: we ignore the given x and y within the parent component
+ // since we are drawing directly into this heavyweight component.
+ int width = getWidth();
+ int height = getHeight();
+ getGL().glViewport(0, 0, width, height);
+ drawableHelper.reshape(GLCanvas.this, 0, 0, width, height);
+ sendReshape = false;
+ }
+
drawableHelper.display(GLCanvas.this);
}
}
@@ -253,7 +225,7 @@ public final class GLCanvas extends Canvas implements GLDrawable {
class SwapBuffersAction implements Runnable {
public void run() {
- context.swapBuffers();
+ drawable.swapBuffers();
}
}
private SwapBuffersAction swapBuffersAction = new SwapBuffersAction();
@@ -263,14 +235,14 @@ public final class GLCanvas extends Canvas implements GLDrawable {
// being resized on the AWT event dispatch thread
class DisplayOnEventDispatchThreadAction implements Runnable {
public void run() {
- context.invokeGL(displayAction, false, initAction);
+ drawableHelper.invokeGL(drawable, context, displayAction, initAction);
}
}
private DisplayOnEventDispatchThreadAction displayOnEventDispatchThreadAction =
new DisplayOnEventDispatchThreadAction();
class SwapBuffersOnEventDispatchThreadAction implements Runnable {
public void run() {
- context.invokeGL(swapBuffersAction, false, initAction);
+ drawableHelper.invokeGL(drawable, context, swapBuffersAction, initAction);
}
}
private SwapBuffersOnEventDispatchThreadAction swapBuffersOnEventDispatchThreadAction =
diff --git a/src/net/java/games/jogl/GLCapabilities.java b/src/classes/javax/media/opengl/GLCapabilities.java
index d645a71a6..77ada1b1a 100644
--- a/src/net/java/games/jogl/GLCapabilities.java
+++ b/src/classes/javax/media/opengl/GLCapabilities.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl;
+package javax.media.opengl;
/** Specifies a set of OpenGL capabilities that a rendering context
must support, such as color depth and whether stereo is enabled.
diff --git a/src/net/java/games/jogl/GLCapabilitiesChooser.java b/src/classes/javax/media/opengl/GLCapabilitiesChooser.java
index 951dd52a1..9d970ff42 100644
--- a/src/net/java/games/jogl/GLCapabilitiesChooser.java
+++ b/src/classes/javax/media/opengl/GLCapabilitiesChooser.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl;
+package javax.media.opengl;
/** Provides a mechanism by which applications can customize the
window type selection for a given {@link GLCapabilities}.
diff --git a/src/classes/javax/media/opengl/GLContext.java b/src/classes/javax/media/opengl/GLContext.java
new file mode 100644
index 000000000..82997bc8f
--- /dev/null
+++ b/src/classes/javax/media/opengl/GLContext.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package javax.media.opengl;
+
+/** Abstraction for an OpenGL rendering context. In order to perform
+ OpenGL rendering, a context must be "made current" on the current
+ thread. OpenGL rendering semantics specify that only one context
+ may be current on the current thread at any given time, and also
+ that a given context may be current on only one thread at any
+ given time. Because components can be added to and removed from
+ the component hierarchy at any time, it is possible that the
+ underlying OpenGL context may need to be destroyed and recreated
+ multiple times over the lifetime of a given component. This
+ process is handled by the implementation, and the GLContext
+ abstraction provides a stable object which clients can use to
+ refer to a given context. */
+
+public abstract class GLContext {
+ /** Indicates that the context was not made current during the last call to {@link #makeCurrent makeCurrent}. */
+ public static final int CONTEXT_NOT_CURRENT = 0;
+ /** Indicates that the context was made current during the last call to {@link #makeCurrent makeCurrent}. */
+ public static final int CONTEXT_CURRENT = 1;
+ /** Indicates that a newly-created context was made current during the last call to {@link #makeCurrent makeCurrent}. */
+ public static final int CONTEXT_CURRENT_NEW = 2;
+
+ private static ThreadLocal currentContext = new ThreadLocal();
+
+ /**
+ * Returns the GLDrawable to which this context may be used to
+ * draw.
+ */
+ public abstract GLDrawable getGLDrawable();
+
+ /**
+ * Makes this GLContext current on the calling thread.
+ *
+ * There are two return values that indicate success and one that
+ * indicates failure. A return value of CONTEXT_CURRENT_NEW
+ * indicates that that context has been made current, and that
+ * this is the first time this context has been made current, or
+ * that the state of the underlying context or drawable may have
+ * changed since the last time this context was made current. In
+ * this case, the application may wish to initialize the state. A
+ * return value of CONTEXT_CURRENT indicates that the context has
+ * been made currrent, with its previous state restored.
+ *
+ * If the context could not be made current (for example, because
+ * the underlying drawable has not ben realized on the display) ,
+ * a value of CONTEXT_NOT_CURRENT is returned.
+ *
+ * If the context is in use by another thread at the time of the
+ * call, then if isSynchronized() is true the call will
+ * block. If isSynchronized() is false, an exception will be
+ * thrown and the context will remain current on the other thread.
+ *
+ * @return CONTEXT_CURRENT if the context was successfully made current
+ * @return CONTEXT_CURRENT_NEW if the context was successfully made
+ * current, but need to be initialized.
+ *
+ * @return CONTEXT_NOT_CURRENT if the context could not be made current.
+ *
+ * @throws GLException if synchronization is disabled and the
+ * context is current on another thread, or because the context
+ * could not be created or made current due to non-recoverable,
+ * window system-specific errors.
+ */
+ public abstract int makeCurrent() throws GLException;
+
+ /**
+ * Releases control of this GLContext from the current thread.
+ *
+ * @throws GLException if the context had not previously been made
+ * current on the current thread
+ */
+ public abstract void release() throws GLException;
+
+ /**
+ * Returns the context which is current on the current thread. If no
+ * context is current, returns null.
+ *
+ * @return the context current on this thread, or null if no context
+ * is current.
+ */
+ public static GLContext getCurrent() {
+ return (GLContext) currentContext.get();
+ }
+
+ /**
+ * Sets the current context object on the current thread. This
+ * method is called by GLContext implementations during {@link
+ * #makeCurrent} and does not need to be called by end users.
+ *
+ */
+ public static void setCurrent(GLContext cur) {
+ currentContext.set(cur);
+ }
+
+ /**
+ * Destroys this OpenGL context and frees its associated resources.
+ */
+ public abstract void destroy();
+
+ /**
+ * Returns true if 'makeCurrent' will exhibit synchronized behavior.
+ */
+ public abstract boolean isSynchronized();
+
+ /**
+ * Determines whether 'makeCurrent' will exhibit synchronized behavior.
+ */
+ public abstract void setSynchronized(boolean isSynchronized);
+
+ /**
+ * Returns the GL pipeline object for this GLContext.
+ */
+ public abstract GL getGL();
+
+ /**
+ * Sets the GL pipeline object for this GLContext.
+ */
+ public abstract void setGL(GL gl);
+}
diff --git a/src/classes/javax/media/opengl/GLDrawable.java b/src/classes/javax/media/opengl/GLDrawable.java
new file mode 100644
index 000000000..5b54bd369
--- /dev/null
+++ b/src/classes/javax/media/opengl/GLDrawable.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package javax.media.opengl;
+
+// FIXME: We need some way to tell when the device upon which the canvas is
+// being displayed has changed (e.g., the user drags the canvas's parent
+// window from one screen on multi-screen environment to another, when the
+// user changes the display bit depth or screen resolution, etc). When this
+// occurs, we need the canvas to reset the gl function pointer tables for the
+// canvas, because the new device may have different capabilities (e.g.,
+// doesn't support as many opengl extensions) from the original device. This
+// hook would also be useful in other GLDrawables (for example, offscreen
+// buffers such as pbuffers, whose contents may or may not be invalidated when
+// the display mode changes, depending on the vendor's GL implementation).
+//
+// Right now I'm not sure how hook into when this change occurs. There isn't
+// any AWT event corresponding to a device change (as far as I can
+// tell). We could constantly check the GraphicsConfiguration of the canvas's top-level
+// parent to see if it has changed, but this would be very slow (we'd have to
+// do it every time the context is made current). There has got to be a better
+// solution, but I'm not sure what it is.
+
+// FIXME: Subclasses need to call resetGLFunctionAvailability() on their
+// context whenever the displayChanged() function is called on our
+// GLEventListeners
+
+/** An abstraction for an OpenGL rendering target. A GLDrawable's
+ primary functionality is to create OpenGL contexts which can be
+ used to perform rendering. A GLDrawable does not automatically
+ create an OpenGL context, but all implementations of {@link
+ GLAutoDrawable} do so upon creation. */
+
+public interface GLDrawable {
+ /**
+ * Creates a new context for drawing to this drawable that will
+ * share display lists with the given GLContext.
+ *
+ * The GLContext <code>share</code> need not be associated with this
+ * GLDrawable.
+ */
+ public GLContext createContext(GLContext shareWith);
+
+ /**
+
+ * Indicates to on-screen GLDrawable implementations whether the
+ * underlying window has been created and can be drawn into. This
+ * method must be called from GLDrawables obtained from the
+ * GLDrawableFactory via the {@link GLDrawableFactory#getGLDrawable
+ * GLDrawableFactory.getGLDrawable()} method. It must typically be
+ * called with an argument of <code>true</code> in the
+ * <code>addNotify</code> method of components performing OpenGL
+ * rendering and with an argument of <code>false</code> in the
+ * <code>removeNotify</code> method. Calling this method has no
+ * other effects. For example, if <code>removeNotify</code> is
+ * called on a Canvas implementation for which a GLDrawable has been
+ * created, it is also necessary to destroy all OpenGL contexts
+ * associated with that GLDrawable. This is not done automatically
+ * by the implementation. It is not necessary to call
+ * <code>setRealized</code> on a GLCanvas, a GLJPanel, or a
+ * GLPbuffer, as these perform the appropriate calls on their
+ * underlying GLDrawables internally..
+ */
+ public void setRealized(boolean realized);
+
+ /** Requests a new width and height for this GLDrawable. Not all
+ drawables are able to respond to this request and may silently
+ ignore it. */
+ public void setSize(int width, int height);
+
+ /** Returns the current width of this GLDrawable. */
+ public int getWidth();
+
+ /** Returns the current height of this GLDrawable. */
+ public int getHeight();
+
+ /** Swaps the front and back buffers of this drawable. For {@link
+ GLAutoDrawable} implementations, when automatic buffer swapping
+ is enabled (as is the default), it is not necessary to call this
+ method and doing so may have undefined results. */
+ public void swapBuffers() throws GLException;
+}
diff --git a/src/classes/javax/media/opengl/GLDrawableFactory.java b/src/classes/javax/media/opengl/GLDrawableFactory.java
new file mode 100644
index 000000000..c45bb16e0
--- /dev/null
+++ b/src/classes/javax/media/opengl/GLDrawableFactory.java
@@ -0,0 +1,282 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package javax.media.opengl;
+
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import com.sun.opengl.impl.*;
+
+/** <P> Provides a virtual machine- and operating system-independent
+ mechanism for creating {@link GLDrawable}s. </P>
+
+ <P> The {@link javax.media.opengl.GLCapabilities} objects passed in to the
+ various factory methods are used as a hint for the properties of
+ the returned drawable. The default capabilities selection
+ algorithm (equivalent to passing in a null {@link
+ GLCapabilitiesChooser}) is described in {@link
+ DefaultGLCapabilitiesChooser}. Sophisticated applications needing
+ to change the selection algorithm may pass in their own {@link
+ GLCapabilitiesChooser} which can select from the available pixel
+ formats. </P>
+
+ <P> Because of the multithreaded nature of the Java platform's
+ window system toolkit, it is typically not possible to immediately
+ reject a given {@link GLCapabilities} as being unsupportable by
+ either returning <code>null</code> from the creation routines or
+ raising a {@link GLException}. The semantics of the rejection
+ process are (unfortunately) left unspecified for now. The current
+ implementation will cause a {@link GLException} to be raised
+ during the first repaint of the {@link GLCanvas} or {@link
+ GLJPanel} if the capabilities can not be met. Pbuffers are always
+ created immediately and their creation will fail with a {@link
+ GLException} if errors occur. </P>
+*/
+
+public abstract class GLDrawableFactory {
+ private static GLDrawableFactory factory;
+
+ protected GLDrawableFactory() {}
+
+ /** Returns the sole GLDrawableFactory instance. */
+ public static GLDrawableFactory getFactory() {
+ if (factory == null) {
+ try {
+ String osName = System.getProperty("os.name");
+ String osNameLowerCase = osName.toLowerCase();
+ Class factoryClass = null;
+
+ // Because there are some complications with generating all
+ // platforms' Java glue code on all platforms (among them that we
+ // would have to include jawt.h and jawt_md.h in the jogl
+ // sources, which we currently don't have to do) we break the only
+ // static dependencies with platform-specific code here using reflection.
+
+ if (osNameLowerCase.startsWith("wind")) {
+ factoryClass = Class.forName("com.sun.opengl.impl.windows.WindowsGLDrawableFactory");
+ } else if (osNameLowerCase.startsWith("mac os x")) {
+ factoryClass = Class.forName("com.sun.opengl.impl.macosx.MacOSXGLDrawableFactory");
+ } else {
+ // Assume Linux, Solaris, etc. Should probably test for these explicitly.
+ factoryClass = Class.forName("com.sun.opengl.impl.x11.X11GLDrawableFactory");
+ }
+
+ if (factoryClass == null) {
+ throw new GLException("OS " + osName + " not yet supported");
+ }
+
+ factory = (GLDrawableFactory) factoryClass.newInstance();
+ } catch (ClassNotFoundException e) {
+ throw new GLException(e);
+ } catch (InstantiationException e) {
+ throw new GLException(e);
+ } catch (IllegalAccessException e) {
+ throw new GLException(e);
+ }
+ }
+
+ return factory;
+ }
+
+ /**
+ * Selects an AWT GraphicsConfiguration on the specified
+ * GraphicsDevice compatible with the supplied GLCapabilities. This
+ * method is intended to be used by applications which do not use
+ * the supplied GLCanvas class but instead wrap their own Canvas
+ * with a GLDrawable. Some platforms (specifically X11) require the
+ * GraphicsConfiguration to be specified when the platform-specific
+ * window system object, such as a Canvas, is created. This method
+ * returns null on platforms on which the OpenGL pixel format
+ * selection process is performed later.
+ *
+ * @see java.awt.Canvas#Canvas(java.awt.GraphicsConfiguration)
+ */
+ public abstract GraphicsConfiguration
+ chooseGraphicsConfiguration(GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser,
+ GraphicsDevice device);
+
+ /**
+ * Returns a GLDrawable that wraps a platform-specific window system
+ * object, such as an AWT or LCDUI Canvas. On platforms which
+ * support it, selects a pixel format compatible with the supplied
+ * GLCapabilities, or if the passed GLCapabilities object is null,
+ * uses a default set of capabilities. On these platforms, uses
+ * either the supplied GLCapabilitiesChooser object, or if the
+ * passed GLCapabilitiesChooser object is null, uses a
+ * DefaultGLCapabilitiesChooser instance.
+ *
+ * @throws IllegalArgumentException if the passed target is either
+ * null or its data type is not supported by this GLDrawableFactory.
+ * @throws GLException if any window system-specific errors caused
+ * the creation of the GLDrawable to fail.
+ */
+ public abstract GLDrawable getGLDrawable(Object target,
+ GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser)
+ throws IllegalArgumentException, GLException;
+
+ //----------------------------------------------------------------------
+ // Methods to create high-level objects
+
+ /** Creates a {@link GLCanvas} on the default graphics device with
+ the specified capabilities using the default capabilities
+ selection algorithm. */
+ public GLCanvas createGLCanvas(GLCapabilities capabilities) {
+ return createGLCanvas(capabilities, null, null, null);
+ }
+
+ /** Creates a {@link GLCanvas} on the specified graphics device with
+ the specified capabilities using the supplied capabilities
+ selection algorithm. A null chooser is equivalent to using the
+ {@link DefaultGLCapabilitiesChooser}. The canvas will share
+ textures and display lists with the specified {@link GLContext};
+ the context must either be null or have been fabricated by
+ classes in this package. A null context indicates no sharing. A
+ null GraphicsDevice is equivalent to using that returned from
+ <code>GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()</code>. */
+ public GLCanvas createGLCanvas(GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser,
+ GLContext shareWith,
+ GraphicsDevice device) {
+ return new GLCanvas(capabilities,
+ chooser,
+ shareWith,
+ device);
+ }
+
+ /** Creates a {@link GLJPanel} with the specified capabilities using
+ the default capabilities selection algorithm. */
+ public GLJPanel createGLJPanel(GLCapabilities capabilities) {
+ return createGLJPanel(capabilities, null, null);
+ }
+
+ /** Creates a {@link GLJPanel} with the specified capabilities using
+ the supplied capabilities selection algorithm. A null chooser is
+ equivalent to using the {@link DefaultGLCapabilitiesChooser}.
+ The panel will share textures and display lists with the
+ specified {@link GLContext}; the context must either be null or
+ have been fabricated by classes in this package. A null context
+ indicates no sharing. */
+ public GLJPanel createGLJPanel(GLCapabilities capabilities,
+ GLCapabilitiesChooser chooser,
+ GLContext shareWith) {
+ return new GLJPanel(capabilities, chooser, shareWith);
+ }
+
+ /**
+ * Returns true if it is possible to create a GLPbuffer. Some older
+ * graphics cards do not have this capability.
+ */
+ public abstract boolean canCreateGLPbuffer();
+
+ /**
+ * Creates a GLPbuffer with the given capabilites and dimensions.
+ */
+ public abstract GLPbuffer createGLPbuffer(GLCapabilities capabilities,
+ int initialWidth,
+ int initialHeight,
+ GLContext shareWith);
+
+ //----------------------------------------------------------------------
+ // Methods for interacting with third-party OpenGL libraries
+
+ /**
+ * <P> Creates a GLContext object representing an existing OpenGL
+ * context in an external (third-party) OpenGL-based library. This
+ * GLContext object may be used to draw into this preexisting
+ * context using its {@link GL} and {@link
+ * javax.media.opengl.glu.GLU} objects. New contexts created through
+ * {@link GLDrawable}s may share textures and display lists with
+ * this external context. </P>
+ *
+ * <P> The underlying OpenGL context must be current on the current
+ * thread at the time this method is called. The user is responsible
+ * for the maintenance of the underlying OpenGL context; calls to
+ * <code>makeCurrent</code> and <code>release</code> on the returned
+ * GLContext object have no effect. If the underlying OpenGL context
+ * is destroyed, the <code>destroy</code> method should be called on
+ * the <code>GLContext</code>. A new <code>GLContext</code> object
+ * should be created for each newly-created underlying OpenGL
+ * context.
+ */
+ public abstract GLContext createExternalGLContext();
+
+ /**
+ * Returns true if it is possible to create an external GLDrawable
+ * object via {@link #createExternalGLDrawable}.
+ */
+ public abstract boolean canCreateExternalGLDrawable();
+
+ /**
+ * <P> Creates a {@link GLDrawable} object representing an existing
+ * OpenGL drawable in an external (third-party) OpenGL-based
+ * library. This GLDrawable object may be used to create new,
+ * fully-functional {@link GLContext}s on the OpenGL drawable. This
+ * is useful when interoperating with a third-party OpenGL-based
+ * library and it is essential to not perturb the state of the
+ * library's existing context, even to the point of not sharing
+ * textures or display lists with that context. </P>
+ *
+ * <P> An underlying OpenGL context must be current on the desired
+ * drawable and the current thread at the time this method is
+ * called. The user is responsible for the maintenance of the
+ * underlying drawable. If one or more contexts are created on the
+ * drawable using {@link GLDrawable#createContext}, and the drawable
+ * is deleted by the third-party library, the user is responsible
+ * for calling {@link GLContext#destroy} on these contexts. </P>
+ *
+ * <P> Calls to <code>setSize</code>, <code>getWidth</code> and
+ * <code>getHeight</code> are illegal on the returned GLDrawable. If
+ * these operations are required by the user, they must be performed
+ * by the third-party library. </P>
+ *
+ * <P> It is legal to create both an external GLContext and
+ * GLDrawable representing the same third-party OpenGL entities.
+ * This can be used, for example, to query current state information
+ * using the external GLContext and then create and set up new
+ * GLContexts using the external GLDrawable. </P>
+ *
+ * <P> This functionality may not be available on all platforms and
+ * {@link #canCreateExternalGLDrawable} should be called first to
+ * see if it is present. For example, on X11 platforms, this API
+ * requires the presence of GLX 1.3 or later.
+ */
+ public abstract GLDrawable createExternalGLDrawable();
+}
diff --git a/src/net/java/games/jogl/GLEventListener.java b/src/classes/javax/media/opengl/GLEventListener.java
index 0f345e6c7..3aadbf833 100644
--- a/src/net/java/games/jogl/GLEventListener.java
+++ b/src/classes/javax/media/opengl/GLEventListener.java
@@ -37,54 +37,55 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl;
+package javax.media.opengl;
import java.util.EventListener;
/** Declares events which client code can use to manage OpenGL
- rendering into a {@link GLDrawable}. At the time any of these
+ rendering into a {@link GLAutoDrawable}. At the time any of these
methods is called, the drawable has made its associated OpenGL
context current, so it is valid to make OpenGL calls. */
public interface GLEventListener extends EventListener {
/** Called by the drawable immediately after the OpenGL context is
initialized. Can be used to perform one-time OpenGL
- initialization such as setup of lights and display lists. Note
+ initialization such as setup of lights and display lists. Note
that this method may be called more than once if the underlying
- OpenGL context for the GLDrawable is destroyed and recreated,
- for example if a GLCanvas is removed from the widget hierarchy
- and later added again.
+ OpenGL context for the GLAutoDrawable is destroyed and
+ recreated, for example if a GLCanvas is removed from the widget
+ hierarchy and later added again.
*/
- public void init(GLDrawable drawable);
+ public void init(GLAutoDrawable drawable);
/** Called by the drawable to initiate OpenGL rendering by the
client. After all GLEventListeners have been notified of a
- display event, the drawable will swap its buffers if necessary.
- */
- public void display(GLDrawable drawable);
+ display event, the drawable will swap its buffers if {@link
+ GLAutoDrawable#setAutoSwapBufferMode setAutoSwapBufferMode} is
+ enabled. */
+ public void display(GLAutoDrawable drawable);
/** Called by the drawable during the first repaint after the
component has been resized. The client can update the viewport
and view volume of the window appropriately, for example by a
- call to {@link net.java.games.jogl.GL#glViewport}; note that for
+ call to {@link javax.media.opengl.GL#glViewport}; note that for
convenience the component has already called <code>glViewport(x,
y, width, height)</code> when this method is called, so the
client may not have to do anything in this method.
*/
- public void reshape(GLDrawable drawable, int x, int y, int width, int height);
+ public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height);
/** Called by the drawable when the display mode or the display device
- associated with the GLDrawable has changed. The two boolean parameters
+ associated with the GLAutoDrawable has changed. The two boolean parameters
indicate the types of change(s) that have occurred. (<b> !!! CURRENTLY
UNIMPLEMENTED !!! </b>)
<P>
An example of a display <i>mode</i> change is when the bit depth changes (e.g.,
- from 32-bit to 16-bit color) on monitor upon which the GLDrawable is
+ from 32-bit to 16-bit color) on monitor upon which the GLAutoDrawable is
currently being displayed. <p>
An example of a display <i>device</i> change is when the user drags the
- window containing the GLDrawable from one monitor to another in a
+ window containing the GLAutoDrawable from one monitor to another in a
multiple-monitor setup. <p>
The reason that this function handles both types of changes (instead of
@@ -94,5 +95,5 @@ public interface GLEventListener extends EventListener {
adjustments to compensate for a device change if it knows that the mode
on the new device is identical the previous mode.
*/
- public void displayChanged(GLDrawable drawable, boolean modeChanged, boolean deviceChanged);
+ public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged);
}
diff --git a/src/net/java/games/jogl/GLException.java b/src/classes/javax/media/opengl/GLException.java
index e814ecbc8..644042e15 100644
--- a/src/net/java/games/jogl/GLException.java
+++ b/src/classes/javax/media/opengl/GLException.java
@@ -37,7 +37,7 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl;
+package javax.media.opengl;
/** A generic exception for OpenGL errors used throughout the binding
as a substitute for {@link RuntimeException}. */
diff --git a/src/classes/javax/media/opengl/GLJPanel.java b/src/classes/javax/media/opengl/GLJPanel.java
new file mode 100644
index 000000000..3d6f4e831
--- /dev/null
+++ b/src/classes/javax/media/opengl/GLJPanel.java
@@ -0,0 +1,877 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package javax.media.opengl;
+
+import java.awt.*;
+import java.awt.geom.*;
+import java.awt.image.*;
+import javax.swing.*;
+import java.nio.*;
+import java.security.*;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import com.sun.opengl.impl.*;
+
+// FIXME: Subclasses need to call resetGLFunctionAvailability() on their
+// context whenever the displayChanged() function is called on their
+// GLEventListeners
+
+/** A lightweight Swing component which provides OpenGL rendering
+ support. Provided for compatibility with Swing user interfaces
+ when adding a heavyweight doesn't work either because of
+ Z-ordering or LayoutManager problems. This component attempts to
+ use hardware-accelerated rendering via pbuffers and falls back on
+ to software rendering if problems occur. This class can not be
+ instantiated directly; use {@link GLDrawableFactory} to construct
+ them. <P>
+
+ Note that because this component attempts to use pbuffers for
+ rendering, and because pbuffers can not be resized, somewhat
+ surprising behavior may occur during resize operations; the {@link
+ GLEventListener#init} method may be called multiple times as the
+ pbuffer is resized to be able to cover the size of the GLJPanel.
+ This behavior is correct, as the textures and display lists for
+ the GLJPanel will have been lost during the resize operation. The
+ application should attempt to make its GLEventListener.init()
+ methods as side-effect-free as possible. <P>
+
+ The GLJPanel can be made transparent by creating it with a
+ GLCapabilities object with alpha bits specified and calling {@link
+ #setOpaque}(false). Pixels with resulting OpenGL alpha values less
+ than 1.0 will be overlaid on any underlying Java2D rendering.
+*/
+
+public class GLJPanel extends JPanel implements GLAutoDrawable {
+ private static final boolean DEBUG = Debug.debug("GLJPanel");
+ private static final boolean VERBOSE = Debug.verbose();
+
+ private GLDrawableHelper drawableHelper = new GLDrawableHelper();
+ private volatile boolean isInitialized;
+ private volatile boolean shouldInitialize = false;
+
+ // Data used for either pbuffers or pixmap-based offscreen surfaces
+ private GLCapabilities offscreenCaps;
+ private GLCapabilitiesChooser chooser;
+ private GLContext shareWith;
+ // This image is exactly the correct size to render into the panel
+ private BufferedImage offscreenImage;
+ // One of these is used to store the read back pixels before storing
+ // in the BufferedImage
+ private ByteBuffer readBackBytes;
+ private IntBuffer readBackInts;
+ private int readBackWidthInPixels;
+ private int readBackHeightInPixels;
+ // Width of the actual GLJPanel
+ private int panelWidth = 0;
+ private int panelHeight = 0;
+ private Updater updater;
+ private int awtFormat;
+ private int glFormat;
+ private int glType;
+ // Lazy reshape notification
+ private boolean handleReshape = false;
+ private boolean sendReshape = true;
+
+ // Implementation using pbuffers
+ private static boolean hardwareAccelerationDisabled =
+ Debug.isPropertyDefined("jogl.gljpanel.nohw");
+ private static boolean softwareRenderingDisabled =
+ Debug.isPropertyDefined("jogl.gljpanel.nosw");
+ private GLPbuffer pbuffer;
+ private int pbufferWidth = 256;
+ private int pbufferHeight = 256;
+
+ // Implementation using software rendering
+ private GLDrawableImpl offscreenDrawable;
+ private GLContextImpl offscreenContext;
+
+ // For handling reshape events lazily
+ private int reshapeX;
+ private int reshapeY;
+ private int reshapeWidth;
+ private int reshapeHeight;
+
+ // For saving/restoring of OpenGL state during ReadPixels
+ private int[] swapbytes = new int[1];
+ private int[] rowlength = new int[1];
+ private int[] skiprows = new int[1];
+ private int[] skippixels = new int[1];
+ private int[] alignment = new int[1];
+
+ // Implementation using Java2D OpenGL pipeline's back buffer
+ private static boolean swingBufferPerWindow =
+ Debug.isPropertyDefined("swing.bufferPerWindow") ?
+ Debug.getBooleanProperty("swing.bufferPerWindow") :
+ true;
+ private boolean oglPipelineEnabled =
+ Java2D.isOGLPipelineActive() &&
+ !Debug.isPropertyDefined("jogl.gljpanel.noogl");
+ // Opaque Object identifier representing the Java2D surface we are
+ // drawing to; used to determine when to destroy and recreate JOGL
+ // context
+ private Object j2dSurface;
+ // Graphics object being used during Java2D update action
+ // (absolutely essential to cache this)
+ private Graphics cached2DGraphics;
+ // No-op context representing the Java2D OpenGL context
+ private GLContext j2dContext;
+ // Context associated with no-op drawable representing the JOGL
+ // OpenGL context
+ private GLDrawable joglDrawable;
+ // The real OpenGL context JOGL uses to render
+ private GLContext joglContext;
+ // State captured from Java2D OpenGL context necessary in order to
+ // properly render into Java2D back buffer
+ private int[] drawBuffer = new int[1];
+ private int[] readBuffer = new int[1];
+ // These are always set to (0, 0) except when the Java2D / OpenGL
+ // pipeline is active
+ private int viewportX;
+ private int viewportY;
+
+ /** Creates a new GLJPanel component. The passed GLCapabilities must
+ be non-null and specifies the OpenGL capabilities for the
+ component. The GLCapabilitiesChooser must be non-null and
+ specifies the algorithm for selecting one of the available
+ GLCapabilities for the component; the GLDrawableFactory uses a
+ DefaultGLCapabilitiesChooser if the user does not provide
+ one. The passed GLContext may be null and specifies an OpenGL
+ context with which to share textures, display lists and other
+ OpenGL state. */
+ protected GLJPanel(GLCapabilities capabilities, GLCapabilitiesChooser chooser, GLContext shareWith) {
+ super();
+
+ // Works around problems on many vendors' cards; we don't need a
+ // back buffer for the offscreen surface anyway
+ if (capabilities != null) {
+ offscreenCaps = (GLCapabilities) capabilities.clone();
+ } else {
+ offscreenCaps = new GLCapabilities();
+ }
+ offscreenCaps.setDoubleBuffered(false);
+ this.chooser = ((chooser != null) ? chooser : new DefaultGLCapabilitiesChooser());
+ this.shareWith = shareWith;
+ }
+
+ public void display() {
+ if (EventQueue.isDispatchThread()) {
+ // Want display() to be synchronous, so call paintImmediately()
+ paintImmediately(0, 0, getWidth(), getHeight());
+ } else {
+ // Multithreaded redrawing of Swing components is not allowed,
+ // so do everything on the event dispatch thread
+ try {
+ EventQueue.invokeAndWait(paintImmediatelyAction);
+ } catch (Exception e) {
+ throw new GLException(e);
+ }
+ }
+ }
+
+ private void captureJ2DState(GL gl) {
+ gl.glGetIntegerv(GL.GL_DRAW_BUFFER, drawBuffer, 0);
+ gl.glGetIntegerv(GL.GL_READ_BUFFER, readBuffer, 0);
+ }
+
+ private boolean preGL(Graphics g) {
+ GL gl = joglContext.getGL();
+ // Set up needed state in JOGL context from Java2D context
+ gl.glEnable(GL.GL_SCISSOR_TEST);
+ Rectangle r = Java2D.getOGLScissorBox(g);
+ if (r == null) {
+ return false;
+ }
+ gl.glScissor(r.x, r.y, r.width, r.height);
+ Rectangle oglViewport = Java2D.getOGLViewport(g, panelWidth, panelHeight);
+ // If the viewport X or Y changes, in addition to the panel's
+ // width or height, we need to send a reshape operation to the
+ // client
+ if ((viewportX != oglViewport.x) ||
+ (viewportY != oglViewport.y)) {
+ sendReshape = true;
+ if (DEBUG) {
+ System.err.println("Sending reshape because viewport changed");
+ System.err.println(" viewportX (" + viewportX + ") ?= oglViewport.x (" + oglViewport.x + ")");
+ System.err.println(" viewportY (" + viewportY + ") ?= oglViewport.y (" + oglViewport.y + ")");
+ }
+ }
+ viewportX = oglViewport.x;
+ viewportY = oglViewport.y;
+
+ gl.glDrawBuffer(drawBuffer[0]);
+ gl.glReadBuffer(readBuffer[0]);
+ return true;
+ }
+
+ /** Overridden from JComponent; calls event listeners' {@link
+ GLEventListener#display display} methods. Should not be invoked
+ by applications directly. */
+ public void paintComponent(final Graphics g) {
+ if (shouldInitialize) {
+ initialize();
+ }
+
+ if (!isInitialized) {
+ return;
+ }
+
+ // NOTE: must do this when the context is not current as it may
+ // involve destroying the pbuffer (current context) and
+ // re-creating it -- tricky to do properly while the context is
+ // current
+ if (handleReshape) {
+ handleReshape();
+ }
+
+ updater.setGraphics(g);
+
+ if (oglPipelineEnabled) {
+ Java2D.invokeWithOGLContextCurrent(g, new Runnable() {
+ public void run() {
+ // Create no-op context representing Java2D context
+ if (j2dContext == null) {
+ j2dContext = GLDrawableFactory.getFactory().createExternalGLContext();
+
+ // Check to see whether we can support the requested
+ // capabilities or need to fall back to a pbuffer
+ // FIXME: add more checks?
+
+ GL gl = j2dContext.getGL();
+ if ((getGLInteger(gl, GL.GL_RED_BITS) < offscreenCaps.getRedBits()) ||
+ (getGLInteger(gl, GL.GL_GREEN_BITS) < offscreenCaps.getGreenBits()) ||
+ (getGLInteger(gl, GL.GL_BLUE_BITS) < offscreenCaps.getBlueBits()) ||
+ // (getGLInteger(gl, GL.GL_ALPHA_BITS) < offscreenCaps.getAlphaBits()) ||
+ (getGLInteger(gl, GL.GL_ACCUM_RED_BITS) < offscreenCaps.getAccumRedBits()) ||
+ (getGLInteger(gl, GL.GL_ACCUM_GREEN_BITS) < offscreenCaps.getAccumGreenBits()) ||
+ (getGLInteger(gl, GL.GL_ACCUM_BLUE_BITS) < offscreenCaps.getAccumBlueBits()) ||
+ (getGLInteger(gl, GL.GL_ACCUM_ALPHA_BITS) < offscreenCaps.getAccumAlphaBits()) ||
+ // (getGLInteger(gl, GL.GL_DEPTH_BITS) < offscreenCaps.getDepthBits()) ||
+ (getGLInteger(gl, GL.GL_STENCIL_BITS) < offscreenCaps.getStencilBits())) {
+ if (DEBUG) {
+ System.err.println("GLJPanel: Falling back to pbuffer-based support because Java2D context insufficient");
+ System.err.println(" Available Required");
+ System.err.println("GL_RED_BITS " + getGLInteger(gl, GL.GL_RED_BITS) + " " + offscreenCaps.getRedBits());
+ System.err.println("GL_GREEN_BITS " + getGLInteger(gl, GL.GL_GREEN_BITS) + " " + offscreenCaps.getGreenBits());
+ System.err.println("GL_BLUE_BITS " + getGLInteger(gl, GL.GL_BLUE_BITS) + " " + offscreenCaps.getBlueBits());
+ System.err.println("GL_ALPHA_BITS " + getGLInteger(gl, GL.GL_ALPHA_BITS) + " " + offscreenCaps.getAlphaBits());
+ System.err.println("GL_ACCUM_RED_BITS " + getGLInteger(gl, GL.GL_ACCUM_RED_BITS) + " " + offscreenCaps.getAccumRedBits());
+ System.err.println("GL_ACCUM_GREEN_BITS " + getGLInteger(gl, GL.GL_ACCUM_GREEN_BITS) + " " + offscreenCaps.getAccumGreenBits());
+ System.err.println("GL_ACCUM_BLUE_BITS " + getGLInteger(gl, GL.GL_ACCUM_BLUE_BITS) + " " + offscreenCaps.getAccumBlueBits());
+ System.err.println("GL_ACCUM_ALPHA_BITS " + getGLInteger(gl, GL.GL_ACCUM_ALPHA_BITS) + " " + offscreenCaps.getAccumAlphaBits());
+ System.err.println("GL_DEPTH_BITS " + getGLInteger(gl, GL.GL_DEPTH_BITS) + " " + offscreenCaps.getDepthBits());
+ System.err.println("GL_STENCIL_BITS " + getGLInteger(gl, GL.GL_STENCIL_BITS) + " " + offscreenCaps.getStencilBits());
+ }
+ isInitialized = false;
+ shouldInitialize = true;
+ oglPipelineEnabled = false;
+ handleReshape = true;
+ j2dContext.destroy();
+ j2dContext = null;
+ return;
+ }
+ }
+
+ j2dContext.makeCurrent();
+ try {
+ captureJ2DState(j2dContext.getGL());
+ Object curSurface = Java2D.getOGLSurfaceIdentifier(g);
+ if (curSurface != null) {
+ if (j2dSurface != curSurface) {
+ if (joglContext != null) {
+ joglContext.destroy();
+ joglContext = null;
+ joglDrawable = null;
+ sendReshape = true;
+ if (DEBUG) {
+ System.err.println("Sending reshape because surface changed");
+ System.err.println("New surface = " + curSurface);
+ }
+ }
+ j2dSurface = curSurface;
+ }
+ if (joglContext == null) {
+ joglDrawable = GLDrawableFactory.getFactory().createExternalGLDrawable();
+ joglContext = joglDrawable.createContext(shareWith);
+ }
+ drawableHelper.invokeGL(joglDrawable, joglContext, displayAction, initAction);
+ }
+ } finally {
+ j2dContext.release();
+ }
+ }
+ });
+ } else {
+ if (!hardwareAccelerationDisabled) {
+ pbuffer.display();
+ } else {
+ drawableHelper.invokeGL(offscreenDrawable, offscreenContext, displayAction, initAction);
+ }
+ }
+ }
+
+ /** Overridden from JPanel; used to indicate that an OpenGL context
+ may be created for the component. */
+ public void addNotify() {
+ super.addNotify();
+ shouldInitialize = true;
+ if (DEBUG) {
+ System.err.println("GLJPanel.addNotify()");
+ }
+ }
+
+ /** Overridden from JPanel; used to indicate that it's no longer
+ safe to have an OpenGL context for the component. */
+ public void removeNotify() {
+ if (DEBUG) {
+ System.err.println("GLJPanel.removeNotify()");
+ }
+ if (oglPipelineEnabled) {
+ Java2D.invokeWithOGLContextCurrent(null, new Runnable() {
+ public void run() {
+ if (joglContext != null) {
+ joglContext.destroy();
+ joglContext = null;
+ }
+ joglDrawable = null;
+ if (j2dContext != null) {
+ j2dContext.destroy();
+ j2dContext = null;
+ }
+ }
+ });
+ } else {
+ if (!hardwareAccelerationDisabled) {
+ if (pbuffer != null) {
+ pbuffer.destroy();
+ pbuffer = null;
+ }
+ } else {
+ if (offscreenContext != null) {
+ offscreenContext.destroy();
+ offscreenContext = null;
+ }
+ if (offscreenDrawable != null) {
+ offscreenDrawable.destroy();
+ offscreenDrawable = null;
+ }
+ }
+ }
+ isInitialized = false;
+ super.removeNotify();
+ }
+
+ /** Overridden from Canvas; causes {@link GLEventListener#reshape
+ reshape} to be called on all registered {@link
+ GLEventListener}s. Called automatically by the AWT; should not
+ be invoked by applications directly. */
+ public void reshape(int x, int y, int width, int height) {
+ super.reshape(x, y, width, height);
+
+ reshapeX = x;
+ reshapeY = y;
+ reshapeWidth = width;
+ reshapeHeight = height;
+ handleReshape = true;
+ }
+
+ public void setOpaque(boolean opaque) {
+ if (opaque != isOpaque()) {
+ if (offscreenImage != null) {
+ offscreenImage.flush();
+ offscreenImage = null;
+ }
+ }
+ super.setOpaque(opaque);
+ }
+
+ public void addGLEventListener(GLEventListener listener) {
+ drawableHelper.addGLEventListener(listener);
+ }
+
+ public void removeGLEventListener(GLEventListener listener) {
+ drawableHelper.removeGLEventListener(listener);
+ }
+
+ public GLContext createContext(GLContext shareWith) {
+ if (!hardwareAccelerationDisabled) {
+ return pbuffer.createContext(shareWith);
+ } else {
+ return offscreenDrawable.createContext(shareWith);
+ }
+ }
+
+ public void setRealized(boolean realized) {
+ }
+
+ public GLContext getContext() {
+ if (oglPipelineEnabled) {
+ return joglContext;
+ } else {
+ if (!hardwareAccelerationDisabled) {
+ return pbuffer.getContext();
+ } else {
+ return offscreenContext;
+ }
+ }
+ }
+
+ public GL getGL() {
+ GLContext context = getContext();
+ return (context == null) ? null : context.getGL();
+ }
+
+ public void setGL(GL gl) {
+ GLContext context = getContext();
+ if (context != null) {
+ context.setGL(gl);
+ }
+ }
+
+ public void setAutoSwapBufferMode(boolean onOrOff) {
+ if (!hardwareAccelerationDisabled) {
+ pbuffer.setAutoSwapBufferMode(onOrOff);
+ } else {
+ drawableHelper.setAutoSwapBufferMode(onOrOff);
+ }
+ }
+
+ public boolean getAutoSwapBufferMode() {
+ if (!hardwareAccelerationDisabled) {
+ return pbuffer.getAutoSwapBufferMode();
+ } else {
+ return drawableHelper.getAutoSwapBufferMode();
+ }
+ }
+
+ public void swapBuffers() {
+ if (!hardwareAccelerationDisabled) {
+ pbuffer.swapBuffers();
+ } else {
+ drawableHelper.invokeGL(offscreenDrawable, offscreenContext, swapBuffersAction, initAction);
+ }
+ }
+
+ /** For a translucent GLJPanel (one for which {@link #setOpaque
+ setOpaque}(false) has been called), indicates whether the
+ application should preserve the OpenGL color buffer
+ (GL_COLOR_BUFFER_BIT) for correct rendering of the GLJPanel and
+ underlying widgets which may show through portions of the
+ GLJPanel with alpha values less than 1. Most Swing
+ implementations currently expect the GLJPanel to be completely
+ cleared (e.g., by <code>glClear(GL_COLOR_BUFFER_BIT |
+ GL_DEPTH_BUFFER_BIT)</code>), but for certain optimized Java2D
+ and Swing implementations which use OpenGL internally, it may be
+ possible to perform OpenGL rendering using the GLJPanel into the
+ same OpenGL drawable as the Java2D implementation. */
+ public boolean shouldPreserveColorBufferIfTranslucent() {
+ return oglPipelineEnabled;
+ }
+
+ //----------------------------------------------------------------------
+ // Internals only below this point
+ //
+
+ private void initialize() {
+ if (panelWidth == 0 ||
+ panelHeight == 0) {
+ // See whether we have a non-zero size yet and can go ahead with
+ // initialization
+ if (reshapeWidth == 0 ||
+ reshapeHeight == 0) {
+ return;
+ }
+
+ // Pull down reshapeWidth and reshapeHeight into panelWidth and
+ // panelHeight eagerly in order to complete initialization, and
+ // force a reshape later
+ panelWidth = reshapeWidth;
+ panelHeight = reshapeHeight;
+ }
+
+ if (!oglPipelineEnabled) {
+ // Initialize either the hardware-accelerated rendering path or
+ // the lightweight rendering path
+ if (!hardwareAccelerationDisabled) {
+ if (GLDrawableFactory.getFactory().canCreateGLPbuffer()) {
+ if (pbuffer != null) {
+ throw new InternalError("Creating pbuffer twice without destroying it (memory leak / correctness bug)");
+ }
+ try {
+ pbuffer = GLDrawableFactory.getFactory().createGLPbuffer(offscreenCaps,
+ pbufferWidth,
+ pbufferHeight,
+ shareWith);
+ updater = new Updater();
+ pbuffer.addGLEventListener(updater);
+ shouldInitialize = false;
+ isInitialized = true;
+ return;
+ } catch (GLException e) {
+ if (DEBUG) {
+ e.printStackTrace();
+ System.err.println("GLJPanel: Falling back on software rendering because of problems creating pbuffer");
+ }
+ hardwareAccelerationDisabled = true;
+ }
+ } else {
+ if (DEBUG) {
+ System.err.println("GLJPanel: Falling back on software rendering because no pbuffer support");
+ }
+
+ // If the factory reports that it can't create a pbuffer,
+ // don't try again the next time, and fall through to the
+ // software rendering path
+ hardwareAccelerationDisabled = true;
+ }
+ }
+
+ if (softwareRenderingDisabled) {
+ throw new GLException("Fallback to software rendering disabled by user");
+ }
+
+ // Fall-through path: create an offscreen context instead
+ offscreenDrawable = GLDrawableFactoryImpl.getFactoryImpl().createOffscreenDrawable(offscreenCaps, chooser);
+ offscreenDrawable.setSize(Math.max(1, panelWidth), Math.max(1, panelHeight));
+ offscreenContext = (GLContextImpl) offscreenDrawable.createContext(shareWith);
+ offscreenContext.setSynchronized(true);
+ }
+ updater = new Updater();
+ shouldInitialize = false;
+ isInitialized = true;
+ }
+
+ private void handleReshape() {
+ readBackWidthInPixels = 0;
+ readBackHeightInPixels = 0;
+
+ panelWidth = reshapeWidth;
+ panelHeight = reshapeHeight;
+
+ if (DEBUG) {
+ System.err.println("GLJPanel.handleReshape: (w,h) = (" +
+ panelWidth + "," + panelHeight + ")");
+ }
+
+ sendReshape = true;
+
+ if (!oglPipelineEnabled) {
+ if (!hardwareAccelerationDisabled) {
+ // Use factor larger than 2 during shrinks for some hysteresis
+ float shrinkFactor = 2.5f;
+ if ((panelWidth > pbufferWidth ) || (panelHeight > pbufferHeight) ||
+ (panelWidth < (pbufferWidth / shrinkFactor)) || (panelHeight < (pbufferWidth / shrinkFactor))) {
+ if (DEBUG) {
+ System.err.println("Resizing pbuffer from (" + pbufferWidth + ", " + pbufferHeight + ") " +
+ " to fit (" + panelWidth + ", " + panelHeight + ")");
+ }
+ // Must destroy and recreate pbuffer to fit
+ if (pbuffer != null) {
+ pbuffer.destroy();
+ }
+ pbuffer = null;
+ isInitialized = false;
+ pbufferWidth = getNextPowerOf2(panelWidth);
+ pbufferHeight = getNextPowerOf2(panelHeight);
+ if (DEBUG) {
+ System.err.println("New pbuffer size is (" + pbufferWidth + ", " + pbufferHeight + ")");
+ }
+ initialize();
+ }
+
+ // It looks like NVidia's drivers (at least the ones on my
+ // notebook) are buggy and don't allow a rectangle of less than
+ // the pbuffer's width to be read...this doesn't really matter
+ // because it's the Graphics.drawImage() calls that are the
+ // bottleneck. Should probably make the size of the offscreen
+ // image be the exact size of the pbuffer to save some work on
+ // resize operations...
+ readBackWidthInPixels = pbufferWidth;
+ readBackHeightInPixels = panelHeight;
+ } else {
+ offscreenContext.destroy();
+ offscreenDrawable.setSize(Math.max(1, panelWidth), Math.max(1, panelHeight));
+ readBackWidthInPixels = Math.max(1, panelWidth);
+ readBackHeightInPixels = Math.max(1, panelHeight);
+ }
+
+ if (offscreenImage != null) {
+ offscreenImage.flush();
+ offscreenImage = null;
+ }
+ }
+
+ handleReshape = false;
+ }
+
+ // FIXME: it isn't clear whether this works any more given that
+ // we're accessing the GLDrawable inside of the GLPbuffer directly
+ // up in reshape() -- need to rethink and clean this up
+ class Updater implements GLEventListener {
+ private Graphics g;
+
+ public void setGraphics(Graphics g) {
+ this.g = g;
+ }
+
+ public void init(GLAutoDrawable drawable) {
+ if (oglPipelineEnabled) {
+ if (!preGL(g)) {
+ return;
+ }
+ }
+ drawableHelper.init(GLJPanel.this);
+ }
+
+ public void display(GLAutoDrawable drawable) {
+ if (oglPipelineEnabled) {
+ if (!preGL(g)) {
+ return;
+ }
+ }
+
+ if (sendReshape) {
+ if (DEBUG) {
+ System.err.println("glViewport(" + viewportX + ", " + viewportY + ", " + panelWidth + ", " + panelHeight + ")");
+ }
+ getGL().glViewport(viewportX, viewportY, panelWidth, panelHeight);
+ drawableHelper.reshape(GLJPanel.this, viewportX, viewportY, panelWidth, panelHeight);
+ sendReshape = false;
+ }
+
+ drawableHelper.display(GLJPanel.this);
+
+ if (!oglPipelineEnabled) {
+ // Must now copy pixels from offscreen context into surface
+ if (offscreenImage == null) {
+ if (panelWidth > 0 && panelHeight > 0) {
+ // It looks like NVidia's drivers (at least the ones on my
+ // notebook) are buggy and don't allow a sub-rectangle to be
+ // read from a pbuffer...this doesn't really matter because
+ // it's the Graphics.drawImage() calls that are the
+ // bottleneck
+
+ int awtFormat = 0;
+ int hwGLFormat = 0;
+ if (!hardwareAccelerationDisabled) {
+ // This seems to be a good choice on all platforms
+ hwGLFormat = GL.GL_UNSIGNED_INT_8_8_8_8_REV;
+ }
+
+ // Should be more flexible in these BufferedImage formats;
+ // perhaps see what the preferred image types are on the
+ // given platform
+ if (isOpaque()) {
+ awtFormat = BufferedImage.TYPE_INT_RGB;
+ } else {
+ awtFormat = BufferedImage.TYPE_INT_ARGB;
+ }
+
+ offscreenImage = new BufferedImage(panelWidth,
+ panelHeight,
+ awtFormat);
+ switch (awtFormat) {
+ case BufferedImage.TYPE_3BYTE_BGR:
+ glFormat = GL.GL_BGR;
+ glType = GL.GL_UNSIGNED_BYTE;
+ readBackBytes = ByteBuffer.allocate(readBackWidthInPixels * readBackHeightInPixels * 3);
+ break;
+
+ case BufferedImage.TYPE_INT_RGB:
+ case BufferedImage.TYPE_INT_ARGB:
+ glFormat = GL.GL_BGRA;
+ glType = (hardwareAccelerationDisabled
+ ? offscreenContext.getOffscreenContextPixelDataType()
+ : hwGLFormat);
+ readBackInts = IntBuffer.allocate(readBackWidthInPixels * readBackHeightInPixels);
+ break;
+
+ default:
+ // FIXME: Support more off-screen image types (current
+ // offscreen context implementations don't use others, and
+ // some of the OpenGL formats aren't supported in the 1.1
+ // headers, which we're currently using)
+ throw new GLException("Unsupported offscreen image type " + awtFormat);
+ }
+ }
+ }
+
+ if (offscreenImage != null) {
+ GL gl = getGL();
+ // Save current modes
+ gl.glGetIntegerv(GL.GL_PACK_SWAP_BYTES, swapbytes, 0);
+ gl.glGetIntegerv(GL.GL_PACK_ROW_LENGTH, rowlength, 0);
+ gl.glGetIntegerv(GL.GL_PACK_SKIP_ROWS, skiprows, 0);
+ gl.glGetIntegerv(GL.GL_PACK_SKIP_PIXELS, skippixels, 0);
+ gl.glGetIntegerv(GL.GL_PACK_ALIGNMENT, alignment, 0);
+
+ gl.glPixelStorei(GL.GL_PACK_SWAP_BYTES, GL.GL_FALSE);
+ gl.glPixelStorei(GL.GL_PACK_ROW_LENGTH, readBackWidthInPixels);
+ gl.glPixelStorei(GL.GL_PACK_SKIP_ROWS, 0);
+ gl.glPixelStorei(GL.GL_PACK_SKIP_PIXELS, 0);
+ gl.glPixelStorei(GL.GL_PACK_ALIGNMENT, 1);
+
+ // Actually read the pixels.
+ gl.glReadBuffer(GL.GL_FRONT);
+ if (readBackBytes != null) {
+ gl.glReadPixels(0, 0, readBackWidthInPixels, readBackHeightInPixels, glFormat, glType, readBackBytes);
+ } else if (readBackInts != null) {
+ gl.glReadPixels(0, 0, readBackWidthInPixels, readBackHeightInPixels, glFormat, glType, readBackInts);
+ }
+
+ // Restore saved modes.
+ gl.glPixelStorei(GL.GL_PACK_SWAP_BYTES, swapbytes[0]);
+ gl.glPixelStorei(GL.GL_PACK_ROW_LENGTH, rowlength[0]);
+ gl.glPixelStorei(GL.GL_PACK_SKIP_ROWS, skiprows[0]);
+ gl.glPixelStorei(GL.GL_PACK_SKIP_PIXELS, skippixels[0]);
+ gl.glPixelStorei(GL.GL_PACK_ALIGNMENT, alignment[0]);
+
+ if (readBackBytes != null || readBackInts != null) {
+ // Copy temporary data into raster of BufferedImage for faster
+ // blitting Note that we could avoid this copy in the cases
+ // where !offscreenContext.offscreenImageNeedsVerticalFlip(),
+ // but that's the software rendering path which is very slow
+ // anyway
+ Object src = null;
+ Object dest = null;
+ int srcIncr = 0;
+ int destIncr = 0;
+
+ if (readBackBytes != null) {
+ src = readBackBytes.array();
+ dest = ((DataBufferByte) offscreenImage.getRaster().getDataBuffer()).getData();
+ srcIncr = readBackWidthInPixels * 3;
+ destIncr = offscreenImage.getWidth() * 3;
+ } else {
+ src = readBackInts.array();
+ dest = ((DataBufferInt) offscreenImage.getRaster().getDataBuffer()).getData();
+ srcIncr = readBackWidthInPixels;
+ destIncr = offscreenImage.getWidth();
+ }
+
+ if (!hardwareAccelerationDisabled ||
+ offscreenContext.offscreenImageNeedsVerticalFlip()) {
+ int srcPos = 0;
+ int destPos = (offscreenImage.getHeight() - 1) * destIncr;
+ for (; destPos >= 0; srcPos += srcIncr, destPos -= destIncr) {
+ System.arraycopy(src, srcPos, dest, destPos, destIncr);
+ }
+ } else {
+ int srcPos = 0;
+ int destEnd = destIncr * offscreenImage.getHeight();
+ for (int destPos = 0; destPos < destEnd; srcPos += srcIncr, destPos += destIncr) {
+ System.arraycopy(src, srcPos, dest, destPos, destIncr);
+ }
+ }
+
+ // Draw resulting image in one shot
+ g.drawImage(offscreenImage, 0, 0, offscreenImage.getWidth(), offscreenImage.getHeight(), GLJPanel.this);
+ }
+ }
+ } else {
+ // Cause OpenGL pipeline to flush its results because
+ // otherwise it's possible we will buffer up multiple frames'
+ // rendering results, resulting in apparent mouse lag
+ GL gl = getGL();
+ gl.glFinish();
+ }
+ }
+
+ public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
+ // This is handled above and dispatched directly to the appropriate context
+ }
+
+ public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {
+ }
+ }
+
+ class InitAction implements Runnable {
+ public void run() {
+ updater.init(GLJPanel.this);
+ }
+ }
+ private InitAction initAction = new InitAction();
+
+ class DisplayAction implements Runnable {
+ public void run() {
+ updater.display(GLJPanel.this);
+ }
+ }
+ private DisplayAction displayAction = new DisplayAction();
+
+ // This one is used exclusively in the non-hardware-accelerated case
+ class SwapBuffersAction implements Runnable {
+ public void run() {
+ offscreenDrawable.swapBuffers();
+ }
+ }
+ private SwapBuffersAction swapBuffersAction = new SwapBuffersAction();
+
+ class PaintImmediatelyAction implements Runnable {
+ public void run() {
+ paintImmediately(0, 0, getWidth(), getHeight());
+ }
+ }
+ private PaintImmediatelyAction paintImmediatelyAction = new PaintImmediatelyAction();
+
+ private int getNextPowerOf2(int number) {
+ // Workaround for problems where 0 width or height are transiently
+ // seen during layout
+ if (number == 0) {
+ return 2;
+ }
+
+ if (((number-1) & number) == 0) {
+ //ex: 8 -> 0b1000; 8-1=7 -> 0b0111; 0b1000&0b0111 == 0
+ return number;
+ }
+ int power = 0;
+ while (number > 0) {
+ number = number>>1;
+ power++;
+ }
+ return (1<<power);
+ }
+
+ private int getGLInteger(GL gl, int which) {
+ int[] tmp = new int[1];
+ gl.glGetIntegerv(which, tmp, 0);
+ return tmp[0];
+ }
+}
diff --git a/src/net/java/games/jogl/GLPbuffer.java b/src/classes/javax/media/opengl/GLPbuffer.java
index b073388f5..607c5c9fa 100644
--- a/src/net/java/games/jogl/GLPbuffer.java
+++ b/src/classes/javax/media/opengl/GLPbuffer.java
@@ -37,16 +37,17 @@
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-package net.java.games.jogl;
+package javax.media.opengl;
-/** Offscreen rendering support via pbuffers. This class adds very
- little functionality over the GLDrawable class; the only methods
- are those which allow access to the pbuffer's contents as a
- texture map and which enable offscreen rendering to floating-point
- buffers. These methods are currently highly experimental and may
- be removed in a future release. */
+/** Provides offscreen rendering support via pbuffers. The principal
+ addition of this interface is a {@link #destroy} method to
+ deallocate the pbuffer and its associated resources. It also
+ contains experimental methods for accessing the pbuffer's contents
+ as a texture map and enabling rendering to floating-point frame
+ buffers. These methods are not guaranteed to be supported on all
+ platforms and may change or be removed in a future release. */
-public interface GLPbuffer extends GLDrawable {
+public interface GLPbuffer extends GLAutoDrawable {
/** Indicates the GL_APPLE_float_pixels extension is being used for this pbuffer. */
public static final int APPLE_FLOAT = 1;
@@ -71,12 +72,12 @@ public interface GLPbuffer extends GLDrawable {
/** Unbinds the pbuffer from its internal texture target. */
public void releaseTexture();
- /** Queries initialization status of this pBuffer. */
- public boolean isInitialized();
-
/** Destroys the native resources associated with this pbuffer. It
is not valid to call display() or any other routines on this
- pbuffer after it has been destroyed. */
+ pbuffer after it has been destroyed. Before destroying the
+ pbuffer, the application must destroy any additional OpenGL
+ contexts which have been created for the pbuffer via {@link
+ #createContext}. */
public void destroy();
/** Indicates which vendor's extension is being used to support
diff --git a/src/classes/javax/media/opengl/Threading.java b/src/classes/javax/media/opengl/Threading.java
new file mode 100755
index 000000000..28dc00b9c
--- /dev/null
+++ b/src/classes/javax/media/opengl/Threading.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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 Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package javax.media.opengl;
+
+import java.awt.EventQueue;
+import java.lang.reflect.InvocationTargetException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import com.sun.opengl.impl.*;
+
+/** Defines the threading model for the implementation of the classes
+ in this package.
+
+ <P>
+
+ OpenGL is specified as a thread-safe API, but in practice there
+ are multithreading-related issues on most, if not all, of the
+ platforms which support it. For example, some OpenGL
+ implementations do not behave well when one context is made
+ current first on one thread, released, and then made current on a
+ second thread, although this is legal according to the OpenGL
+ specification. On other platforms there are other problems.
+
+ <P>
+
+ Due to these limitations, and due to the inherent multithreading
+ in the Java platform (in particular, in the Abstract Window
+ Toolkit), it is necessary to limit the multithreading occurring in
+ the typical application using the JOGL API. This has been done by
+ forcing all OpenGL-related work for GLAutoDrawables on to a single
+ thread. In other words, if an application uses only the
+ GLAutoDrawable and GLEventListener callback mechanism, it is
+ guaranteed to have the most correct single-threaded behavior on
+ all platforms.
+
+ <P>
+
+ Applications using the GLContext makeCurrent/release API directly
+ will inherently break this single-threaded model, as these methods
+ require that the OpenGL context be made current on the current
+ thread immediately. For applications wishing to integrate better
+ with the single-threaded model, this class provides public access
+ to the mechanism used by the JOGL implementation. Users can
+ execute Runnables on the internal thread used for performing
+ OpenGL work, and query whether the current thread is already this
+ thread. Using these mechanisms the user can move work from the
+ current thread on to the internal OpenGL thread if desired.
+
+ <P>
+
+ This class also provides mechanisms for querying whether this
+ internal serialization of OpenGL work is in effect, and a
+ programmatic way of disabling it. Currently it is enabled by
+ default, although it could be disabled in the future if OpenGL
+ drivers become more robust on all platforms.
+
+ <P>
+
+ In addition to specifying programmatically whether the single
+ thread for OpenGL work is enabled, users may switch it on and off
+ using the system property <code>jogl.1thread</code>. Valid values
+ for this system property are:
+
+ <PRE>
+ -Djogl.1thread=false Disable single-threading of OpenGL work
+ -Djogl.1thread=true Enable single-threading of OpenGL work (default)
+ -Djogl.1thread=auto Select default single-threading behavior (currently on)
+ </PRE>
+*/
+
+public class Threading {
+ private static boolean singleThreaded = true;
+
+ static {
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ String workaround = System.getProperty("jogl.1thread");
+ if (workaround != null && (!workaround.equals("auto"))) {
+ singleThreaded = Boolean.valueOf(workaround).booleanValue();
+ }
+ printWorkaroundNotice();
+ return null;
+ }
+ });
+ }
+
+ /** No reason to ever instantiate this class */
+ private Threading() {}
+
+ /** Provides a mechanism for end users to disable the default
+ single-threading of the JOGL implementation. Users are strongly
+ discouraged from calling this method unless they are aware of
+ all of the consequences and are prepared to enforce some amount
+ of threading restrictions in their applications. Disabling this
+ single-threading, for example, will have unintended consequences
+ on GLAutoDrawable implementations such as GLCanvas, GLJPanel and
+ GLPbuffer. Currently there is no supported way to re-enable it
+ once disabled, partly to discourage careless use of this
+ method. */
+ public static void disableSingleThreading() {
+ singleThreaded = false;
+ if (Debug.verbose()) {
+ System.err.println("Application forced disabling of single-threading of JOGL implementation");
+ }
+ }
+
+ /** Indicates whether OpenGL work is being automatically forced to a
+ single thread by the JOGL implementation. */
+ public static boolean isSingleThreaded() {
+ return singleThreaded;
+ }
+
+ /** Indicates whether the current thread is the single thread on
+ which the JOGL implementation performs all of its OpenGL-related
+ work. This method should only be called if the single-thread
+ model is in effect. */
+ public static boolean isOpenGLThread() throws GLException {
+ if (!isSingleThreaded()) {
+ throw new GLException("Should only call this in single-threaded mode");
+ }
+
+ if (Java2D.isOGLPipelineActive()) {
+ // FIXME: ideally only the QFT would be considered to be the
+ // "OpenGL thread", but we can not currently run all of JOGL's
+ // OpenGL work on that thread. For now, run the GLJPanel's
+ // Java2D/JOGL bridge on the QFT but everything else on the
+ // EDT, except when we're already on the QFT.
+ return (Java2D.isQueueFlusherThread() ||
+ EventQueue.isDispatchThread());
+ } else {
+ return EventQueue.isDispatchThread();
+ }
+ }
+
+ /** Executes the passed Runnable on the single thread used for all
+ OpenGL work in the JOGL implementation. It is not specified
+ exactly which thread is used for this purpose. This method
+ should only be called if the single-thread model is in use and
+ if the current thread is not the OpenGL thread (i.e., if
+ <code>isOpenGLThread()</code> returns false). It is up to the
+ end user to check to see whether the current thread is the
+ OpenGL thread and either execute the Runnable directly or
+ perform the work inside it. */
+ public static void invokeOnOpenGLThread(Runnable r) throws GLException {
+ if (!isSingleThreaded()) {
+ throw new GLException ("Should only call this in single-threaded mode");
+ }
+
+ if (isOpenGLThread()) {
+ throw new GLException ("Should only call this from other threads than the OpenGL thread");
+ }
+
+ // FIXME: ideally should run all OpenGL work on the Java2D QFT
+ // thread when it's enabled, but there are issues with this when
+ // the GLJPanel is not using the Java2D bridge; would like to run
+ // its OpenGL work on the QFT, but do the image drawing from the
+ // EDT. Other issues still remain with the GLCanvas as well.
+
+ // if (Java2D.isOGLPipelineActive()) {
+ // Java2D.invokeWithOGLContextCurrent(null, r);
+ // } else {
+ try {
+ EventQueue.invokeAndWait(r);
+ } catch (InvocationTargetException e) {
+ throw new GLException(e.getTargetException());
+ } catch (InterruptedException e) {
+ throw new GLException(e);
+ }
+ // }
+ }
+
+ private static void printWorkaroundNotice() {
+ if (singleThreaded && Debug.verbose()) {
+ System.err.println("Using single thread for performing OpenGL work in JOGL implementation");
+ }
+ }
+}
diff --git a/src/net/java/games/jogl/GLUquadric.java b/src/classes/javax/media/opengl/glu/GLUquadric.java
index 3aeccc166..bcb21fb90 100755
--- a/src/net/java/games/jogl/GLUquadric.java
+++ b/src/classes/javax/media/opengl/glu/GLUquadric.java
@@ -1,4 +1,4 @@
-package net.java.games.jogl;
+package javax.media.opengl.glu;
/**
* Wrapper for a GLU quadric object.
diff --git a/src/net/java/games/jogl/GLUtesselator.java b/src/classes/javax/media/opengl/glu/GLUtessellator.java
index ea80ccb02..df42a8a82 100644..100755
--- a/src/net/java/games/jogl/GLUtesselator.java
+++ b/src/classes/javax/media/opengl/glu/GLUtessellator.java
@@ -40,17 +40,17 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl;
+package javax.media.opengl.glu;
/**
- * The <b>GLUtesselator</b> object is used to hold the data, such as the
+ * The <b>GLUtessellator</b> object is used to hold the data, such as the
* vertices, edges and callback objects, to describe and tessellate complex
- * polygons. A <b>GLUtesselator</b> object is used with the
- * {@link net.java.games.jogl.GLU GLU} tesselator methods and
- * {@link net.java.games.jogl.GLUtesselatorCallback GLU callbacks}.
+ * polygons. A <b>GLUtessellator</b> object is used with the
+ * {@link GLU GLU} tessellator methods and
+ * {@link GLUtessellatorCallback GLU callbacks}.
*
* @author Eric Veach, July 1994
* @author Java Port: Pepijn Van Eechhoudt, July 2003
* @author Java Port: Nathan Parker Burg, August 2003
*/
-public interface GLUtesselator {}
+public interface GLUtessellator {}
diff --git a/src/net/java/games/jogl/GLUtesselatorCallback.java b/src/classes/javax/media/opengl/glu/GLUtessellatorCallback.java
index 0da9a15fd..9d4946b00 100644..100755
--- a/src/net/java/games/jogl/GLUtesselatorCallback.java
+++ b/src/classes/javax/media/opengl/glu/GLUtessellatorCallback.java
@@ -40,20 +40,20 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl;
+package javax.media.opengl.glu;
/**
- * <b>GLUtesselatorCallback</b> interface provides methods that the user will
+ * <b>GLUtessellatorCallback</b> interface provides methods that the user will
* override to define the callbacks for a tessellation object.
*
* @author Eric Veach, July 1994
* @author Java Port: Pepijn Van Eeckhoudt, July 2003
* @author Java Port: Nathan Parker Burg, August 2003
*/
-public interface GLUtesselatorCallback {
+public interface GLUtessellatorCallback {
/**
* The <b>begin</b> callback method is invoked like
- * {@link net.java.games.jogl.GL#glBegin glBegin} to indicate the start of a
+ * {@link javax.media.opengl.GL#glBegin glBegin} to indicate the start of a
* (triangle) primitive. The method takes a single argument of type int. If
* the <b>GLU_TESS_BOUNDARY_ONLY</b> property is set to <b>GL_FALSE</b>, then
* the argument is set to either <b>GL_TRIANGLE_FAN</b>,
@@ -66,18 +66,17 @@ public interface GLUtesselatorCallback {
* values are valid: <b>GL_TRIANGLE_FAN</b>, <b>GL_TRIANGLE_STRIP</b>,
* <b>GL_TRIANGLES</b> or <b>GL_LINE_LOOP</b>.
*
- * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback
- * @see net.java.games.jogl.GLUtesselatorCallback#end end
- * @see net.java.games.jogl.GLUtesselatorCallback#begin begin
+ * @see GLU#gluTessCallback gluTessCallback
+ * @see #end end
+ * @see #begin begin
*/
public void begin(int type);
/**
- * The same as the {@link net.java.games.jogl.GLUtesselatorCallback#begin
- * begin} callback method except that it takes an additional reference
- * argument. This reference is identical to the opaque reference provided when
- * {@link net.java.games.jogl.GLU#gluTessBeginPolygon gluTessBeginPolygon} was
- * called.
+ * The same as the {@link #begin begin} callback method except that
+ * it takes an additional reference argument. This reference is
+ * identical to the opaque reference provided when {@link
+ * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called.
*
* @param type
* Specifics the type of begin/end pair being defined. The following
@@ -86,16 +85,16 @@ public interface GLUtesselatorCallback {
* @param polygonData
* Specifics a reference to user-defined data.
*
- * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback
- * @see net.java.games.jogl.GLUtesselatorCallback#endData endData
- * @see net.java.games.jogl.GLUtesselatorCallback#begin begin
+ * @see GLU#gluTessCallback gluTessCallback
+ * @see #endData endData
+ * @see #begin begin
*/
public void beginData(int type, Object polygonData);
/**
* The <b>edgeFlag</b> callback method is similar to
- * {@link net.java.games.jogl.GL#glEdgeFlag glEdgeFlag}. The method takes
+ * {@link javax.media.opengl.GL#glEdgeFlag glEdgeFlag}. The method takes
* a single boolean boundaryEdge that indicates which edges lie on the
* polygon boundary. If the boundaryEdge is <b>GL_TRUE</b>, then each vertex
* that follows begins an edge that lies on the polygon boundary, that is,
@@ -114,57 +113,54 @@ public interface GLUtesselatorCallback {
* @param boundaryEdge
* Specifics which edges lie on the polygon boundary.
*
- * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback
- * @see net.java.games.jogl.GLUtesselatorCallback#edgeFlagData edgeFlagData
+ * @see GLU#gluTessCallback gluTessCallback
+ * @see #edgeFlagData edgeFlagData
*/
public void edgeFlag(boolean boundaryEdge);
/**
- * The same as the {@link net.java.games.jogl.GLUtesselatorCallback#edgeFlag
- * edgeFlage} callback method except that it takes an additional reference
- * argument. This reference is identical to the opaque reference provided when
- * {@link net.java.games.jogl.GLU#gluTessBeginPolygon gluTessBeginPolygon} was
- * called.
+ * The same as the {@link #edgeFlag edgeFlage} callback method
+ * except that it takes an additional reference argument. This
+ * reference is identical to the opaque reference provided when
+ * {@link GLU#gluTessBeginPolygon gluTessBeginPolygon} was called.
*
* @param boundaryEdge
* Specifics which edges lie on the polygon boundary.
* @param polygonData
* Specifics a reference to user-defined data.
*
- * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback
- * @see net.java.games.jogl.GLUtesselatorCallback#edgeFlag edgeFlag
+ * @see GLU#gluTessCallback gluTessCallback
+ * @see #edgeFlag edgeFlag
*/
public void edgeFlagData(boolean boundaryEdge, Object polygonData);
/**
- * The <b>vertex</b> callback method is invoked between the
- * {@link net.java.games.jogl.GLUtesselatorCallback#begin begin} and
- * {@link net.java.games.jogl.GLUtesselatorCallback#end end} callback methods.
- * It is similar to {@link net.java.games.jogl.GL#glVertex3f glVertex3f}, and it
- * defines the vertices of the triangles created by the tessellation process.
- * The method takes a reference as its only argument. This reference is
- * identical to the opaque reference provided by the user when the vertex was
- * described (see {@link net.java.games.jogl.GLU#gluTessVertex
- * gluTessVertex}).
+ * The <b>vertex</b> callback method is invoked between the {@link
+ * #begin begin} and {@link #end end} callback methods. It is
+ * similar to {@link javax.media.opengl.GL#glVertex3f glVertex3f},
+ * and it defines the vertices of the triangles created by the
+ * tessellation process. The method takes a reference as its only
+ * argument. This reference is identical to the opaque reference
+ * provided by the user when the vertex was described (see {@link
+ * GLU#gluTessVertex gluTessVertex}).
*
* @param vertexData
* Specifics a reference to the vertices of the triangles created
* byt the tessellatin process.
*
- * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback
- * @see net.java.games.jogl.GLUtesselatorCallback#vertexData vertexData
+ * @see GLU#gluTessCallback gluTessCallback
+ * @see #vertexData vertexData
*/
public void vertex(Object vertexData);
/**
- * The same as the {@link net.java.games.jogl.GLUtesselatorCallback#vertex
- * vertex} callback method except that it takes an additional reference
- * argument. This reference is identical to the opaque reference provided when
- * {@link net.java.games.jogl.GLU#gluTessBeginPolygon gluTessBeginPolygon} was
- * called.
+ * The same as the {@link #vertex vertex} callback method except
+ * that it takes an additional reference argument. This reference is
+ * identical to the opaque reference provided when {@link
+ * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called.
*
* @param vertexData
* Specifics a reference to the vertices of the triangles created
@@ -172,37 +168,36 @@ public interface GLUtesselatorCallback {
* @param polygonData
* Specifics a reference to user-defined data.
*
- * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback
- * @see net.java.games.jogl.GLUtesselatorCallback#vertex vertex
+ * @see GLU#gluTessCallback gluTessCallback
+ * @see #vertex vertex
*/
public void vertexData(Object vertexData, Object polygonData);
/**
* The end callback serves the same purpose as
- * {@link net.java.games.jogl.GL#glEnd glEnd}. It indicates the end of a
+ * {@link javax.media.opengl.GL#glEnd glEnd}. It indicates the end of a
* primitive and it takes no arguments.
*
- * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback
- * @see net.java.games.jogl.GLUtesselatorCallback#begin begin
- * @see net.java.games.jogl.GLUtesselatorCallback#endData endData
+ * @see GLU#gluTessCallback gluTessCallback
+ * @see #begin begin
+ * @see #endData endData
*/
public void end();
/**
- * The same as the {@link net.java.games.jogl.GLUtesselatorCallback#end end}
- * callback method except that it takes an additional reference argument. This
- * reference is identical to the opaque reference provided when
- * {@link net.java.games.jogl.GLU#gluTessBeginPolygon gluTessBeginPolygon} was
- * called.
+ * The same as the {@link #end end} callback method except that it
+ * takes an additional reference argument. This reference is
+ * identical to the opaque reference provided when {@link
+ * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called.
*
* @param polygonData
* Specifics a reference to user-defined data.
*
- * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback
- * @see net.java.games.jogl.GLUtesselatorCallback#beginData beginData
- * @see net.java.games.jogl.GLUtesselatorCallback#end end
+ * @see GLU#gluTessCallback gluTessCallback
+ * @see #beginData beginData
+ * @see #end end
*/
public void endData(Object polygonData);
@@ -224,7 +219,7 @@ public interface GLUtesselatorCallback {
* <i>data</i> and <i>weight</i>, and return the new vertex pointer in
* <i>outData</i>. This handle is supplied during rendering callbacks. The
* user is responsible for freeing the memory some time after
- * {@link net.java.games.jogl.GLU#gluTessEndPolygon gluTessEndPolygon} is
+ * {@link GLU#gluTessEndPolygon gluTessEndPolygon} is
* called.<P>
*
* For example, if the polygon lies in an arbitrary plane in 3-space, and a
@@ -268,19 +263,18 @@ public interface GLUtesselatorCallback {
* @param outData
* Reference user the put the coodinates of the new vertex.
*
- * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback
- * @see net.java.games.jogl.GLUtesselatorCallback#combineData combineData
+ * @see GLU#gluTessCallback gluTessCallback
+ * @see #combineData combineData
*/
public void combine(double[] coords, Object[] data,
float[] weight, Object[] outData);
/**
- * The same as the {@link net.java.games.jogl.GLUtesselatorCallback#combine
- * combine} callback method except that it takes an additional reference
- * argument. This reference is identical to the opaque reference provided when
- * {@link net.java.games.jogl.GLU#gluTessBeginPolygon gluTessBeginPolygon} was
- * called.
+ * The same as the {@link #combine combine} callback method except
+ * that it takes an additional reference argument. This reference is
+ * identical to the opaque reference provided when {@link
+ * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called.
*
* @param coords
* Specifics the location of the new vertex.
@@ -293,8 +287,8 @@ public interface GLUtesselatorCallback {
* @param polygonData
* Specifics a reference to user-defined data.
*
- * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback
- * @see net.java.games.jogl.GLUtesselatorCallback#combine combine
+ * @see GLU#gluTessCallback gluTessCallback
+ * @see #combine combine
*/
public void combineData(double[] coords, Object[] data,
float[] weight, Object[] outData,
@@ -309,7 +303,7 @@ public interface GLUtesselatorCallback {
* <b>GLU_TESS_MISSING_END_CONTOUR</b>, <b>GLU_TESS_COORD_TOO_LARGE</b>,
* <b>GLU_TESS_NEED_COMBINE_CALLBACK</b> or <b>GLU_OUT_OF_MEMORY</b>.
* Character strings describing these errors can be retrieved with the
- * {@link net.java.games.jogl.GLU#gluErrorString gluErrorString} call.<P>
+ * {@link GLU#gluErrorString gluErrorString} call.<P>
*
* The GLU library will recover from the first four errors by inserting the
* missing call(s). <b>GLU_TESS_COORD_TOO_LARGE</b> indicates that some
@@ -326,28 +320,27 @@ public interface GLUtesselatorCallback {
* @param errnum
* Specifics the error number code.
*
- * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback
- * @see net.java.games.jogl.GLUtesselatorCallback#errorData errorData
+ * @see GLU#gluTessCallback gluTessCallback
+ * @see #errorData errorData
*/
public void error(int errnum);
/**
- * The same as the {@link net.java.games.jogl.GLUtesselatorCallback#error
- * error} callback method except that it takes an additional reference
- * argument. This reference is identical to the opaque reference provided when
- * {@link net.java.games.jogl.GLU#gluTessBeginPolygon gluTessBeginPolygon} was
- * called.
+ * The same as the {@link #error error} callback method except that
+ * it takes an additional reference argument. This reference is
+ * identical to the opaque reference provided when {@link
+ * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called.
*
* @param errnum
* Specifics the error number code.
* @param polygonData
* Specifics a reference to user-defined data.
*
- * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback
- * @see net.java.games.jogl.GLUtesselatorCallback#error error
+ * @see GLU#gluTessCallback gluTessCallback
+ * @see #error error
*/
public void errorData(int errnum, Object polygonData);
- //void mesh(net.java.games.jogl.impl.tesselator.GLUmesh mesh);
+ //void mesh(com.sun.opengl.impl.tessellator.GLUmesh mesh);
}
diff --git a/src/net/java/games/jogl/GLUtesselatorCallbackAdapter.java b/src/classes/javax/media/opengl/glu/GLUtessellatorCallbackAdapter.java
index 162eaec93..eaccf0b15 100644..100755
--- a/src/net/java/games/jogl/GLUtesselatorCallbackAdapter.java
+++ b/src/classes/javax/media/opengl/glu/GLUtessellatorCallbackAdapter.java
@@ -40,13 +40,11 @@
** Java Port: Pepijn Van Eeckhoudt, July 2003
** Java Port: Nathan Parker Burg, August 2003
*/
-package net.java.games.jogl;
-
-import net.java.games.jogl.GLUtesselatorCallback;
+package javax.media.opengl.glu;
/**
- * The <b>GLUtesselatorCallbackAdapter</b> provides a default implementation of
- * {@link net.java.games.jogl.GLUtesselatorCallback GLUtesselatorCallback}
+ * The <b>GLUtessellatorCallbackAdapter</b> provides a default implementation of
+ * {@link GLUtessellatorCallback GLUtessellatorCallback}
* with empty callback methods. This class can be extended to provide user
* defined callback methods.
*
@@ -55,12 +53,12 @@ import net.java.games.jogl.GLUtesselatorCallback;
* @author Java Port: Nathan Parker Burg, August 2003
*/
-public class GLUtesselatorCallbackAdapter implements GLUtesselatorCallback {
+public class GLUtessellatorCallbackAdapter implements GLUtessellatorCallback {
public void begin(int type) {}
public void edgeFlag(boolean boundaryEdge) {}
public void vertex(Object vertexData) {}
public void end() {}
-// public void mesh(net.java.games.jogl.impl.tesselator.GLUmesh mesh) {}
+// public void mesh(com.sun.opengl.impl.tessellator.GLUmesh mesh) {}
public void error(int errnum) {}
public void combine(double[] coords, Object[] data,
float[] weight, Object[] outData) {}
diff --git a/src/native/jogl/InternalBufferUtils.c b/src/native/jogl/InternalBufferUtils.c
index 73c52011f..083f51b42 100644
--- a/src/native/jogl/InternalBufferUtils.c
+++ b/src/native/jogl/InternalBufferUtils.c
@@ -49,6 +49,6 @@
#endif
JNIEXPORT jobject JNICALL
-Java_net_java_games_jogl_impl_InternalBufferUtils_newDirectByteBuffer(JNIEnv* env, jclass unused, jlong address, jint capacity) {
+Java_com_sun_opengl_impl_InternalBufferUtils_newDirectByteBuffer(JNIEnv* env, jclass unused, jlong address, jint capacity) {
return (*env)->NewDirectByteBuffer(env, (void*) (intptr_t) address, capacity);
}
diff --git a/src/native/jogl/JAWT_DrawingSurfaceInfo.c b/src/native/jogl/JAWT_DrawingSurfaceInfo.c
index 59c575f0c..2b64ec858 100644
--- a/src/native/jogl/JAWT_DrawingSurfaceInfo.c
+++ b/src/native/jogl/JAWT_DrawingSurfaceInfo.c
@@ -41,13 +41,13 @@
#ifdef WIN32
#define PLATFORM_DSI_SIZE sizeof(JAWT_Win32DrawingSurfaceInfo)
- static const char* platformDSIClassName = "net/java/games/jogl/impl/windows/JAWT_Win32DrawingSurfaceInfo";
+ static const char* platformDSIClassName = "com/sun/opengl/impl/windows/JAWT_Win32DrawingSurfaceInfo";
#elif defined(linux) || defined(__sun) || defined(__FreeBSD__)
#define PLATFORM_DSI_SIZE sizeof(JAWT_X11DrawingSurfaceInfo)
- static const char* platformDSIClassName = "net/java/games/jogl/impl/x11/JAWT_X11DrawingSurfaceInfo";
+ static const char* platformDSIClassName = "com/sun/opengl/impl/x11/JAWT_X11DrawingSurfaceInfo";
#elif defined(macosx)
#define PLATFORM_DSI_SIZE sizeof(JAWT_MacOSXDrawingSurfaceInfo)
- static const char* platformDSIClassName = "net/java/games/jogl/impl/macosx/JAWT_MacOSXDrawingSurfaceInfo";
+ static const char* platformDSIClassName = "com/sun/opengl/impl/macosx/JAWT_MacOSXDrawingSurfaceInfo";
#else
ERROR: port JAWT_DrawingSurfaceInfo.c to your platform
#endif
@@ -56,7 +56,7 @@ static jclass platformDSIClass = NULL;
static jmethodID constructor = NULL;
JNIEXPORT jobject JNICALL
-Java_net_java_games_jogl_impl_JAWT_1DrawingSurfaceInfo_platformInfo0(JNIEnv* env, jobject unused, jobject jthis0) {
+Java_com_sun_opengl_impl_JAWT_1DrawingSurfaceInfo_platformInfo0(JNIEnv* env, jobject unused, jobject jthis0) {
JAWT_DrawingSurfaceInfo* dsi;
jobject dirbuf;
jclass clazz;
diff --git a/src/native/jogl/MacOSXWindowSystemInterface.m b/src/native/jogl/MacOSXWindowSystemInterface.m
index 516bda0db..125f6abb4 100644
--- a/src/native/jogl/MacOSXWindowSystemInterface.m
+++ b/src/native/jogl/MacOSXWindowSystemInterface.m
@@ -43,7 +43,19 @@ void* createContext(void* shareContext, void* view,
NSView *nsView = (NSView*)view;
if (nsView != NULL) {
+ Bool viewReady = true;
+
if ([nsView lockFocusIfCanDraw] == NO) {
+ viewReady = false;
+ } else {
+ NSRect frame = [nsView frame];
+ if ((frame.size.width == 0) || (frame.size.height == 0)) {
+ [nsView unlockFocus];
+ viewReady = false;
+ }
+ }
+
+ if (!viewReady) {
if (viewNotReady != NULL) {
*viewNotReady = 1;
}
@@ -163,13 +175,17 @@ void* createPBuffer(int renderTarget, int internalFormat, int width, int height)
}
Bool destroyPBuffer(void* context, void* buffer) {
- NSOpenGLContext *nsContext = (NSOpenGLContext*)context;
+ /* FIXME: not clear whether we need to perform the clearDrawable below */
+ /* FIXME: remove the context argument -- don't need it any more */
+ /* NSOpenGLContext *nsContext = (NSOpenGLContext*)context; */
NSOpenGLPixelBuffer *pBuffer = (NSOpenGLPixelBuffer*)buffer;
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
+ /*
if (nsContext != NULL) {
[nsContext clearDrawable];
}
+ */
[pBuffer release];
[pool release];
diff --git a/src/net/java/games/gluegen/JavaMethodBindingEmitter.java b/src/net/java/games/gluegen/JavaMethodBindingEmitter.java
deleted file mode 100644
index 72d349356..000000000
--- a/src/net/java/games/gluegen/JavaMethodBindingEmitter.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.gluegen;
-
-import java.util.*;
-import java.io.*;
-
-import net.java.games.gluegen.cgram.types.*;
-import net.java.games.gluegen.cgram.*;
-
-/**
- * An emitter that emits only the interface for a Java<->C JNI binding.
- */
-public class JavaMethodBindingEmitter extends FunctionEmitter
-{
- public static final EmissionModifier PUBLIC = new EmissionModifier("public");
- public static final EmissionModifier PROTECTED = new EmissionModifier("protected");
- public static final EmissionModifier PRIVATE = new EmissionModifier("private");
- public static final EmissionModifier ABSTRACT = new EmissionModifier("abstract");
- public static final EmissionModifier FINAL = new EmissionModifier("final");
- public static final EmissionModifier NATIVE = new EmissionModifier("native");
- public static final EmissionModifier SYNCHRONIZED = new EmissionModifier("synchronized");
-
- protected static final CommentEmitter defaultJavaCommentEmitter = new DefaultCommentEmitter();
- protected static final CommentEmitter defaultInterfaceCommentEmitter =
- new InterfaceCommentEmitter();
-
- // Exception type raised in the generated code if runtime checks fail
- private String runtimeExceptionType;
-
- private MethodBinding binding;
- private boolean forImplementingMethodCall;
-
- // A non-null value indicates that rather than returning a compound
- // type accessor we are returning an array of such accessors; this
- // expression is a MessageFormat string taking the names of the
- // incoming Java arguments as parameters and computing as an int the
- // number of elements of the returned array.
- private String returnedArrayLengthExpression;
-
- public JavaMethodBindingEmitter(MethodBinding binding, PrintWriter output, String runtimeExceptionType)
- {
- this(binding, output, runtimeExceptionType, false);
- }
-
- public JavaMethodBindingEmitter(MethodBinding binding, PrintWriter output, String runtimeExceptionType, boolean forImplementingMethodCall)
- {
- super(output);
- this.binding = binding;
- this.forImplementingMethodCall = forImplementingMethodCall;
- this.runtimeExceptionType = runtimeExceptionType;
- setCommentEmitter(defaultInterfaceCommentEmitter);
- }
-
- public JavaMethodBindingEmitter(JavaMethodBindingEmitter arg) {
- super(arg);
- runtimeExceptionType = arg.runtimeExceptionType;
- binding = arg.binding;
- forImplementingMethodCall = arg.forImplementingMethodCall;
- returnedArrayLengthExpression = arg.returnedArrayLengthExpression;
- }
-
- public final MethodBinding getBinding() { return binding; }
-
- public boolean isForImplementingMethodCall() { return forImplementingMethodCall; }
-
- public String getName() {
- return binding.getName();
- }
-
-
- /** The type of exception (must subclass
- <code>java.lang.RuntimeException</code>) raised if runtime
- checks fail in the generated code. */
- public String getRuntimeExceptionType() {
- return runtimeExceptionType;
- }
-
- /** If the underlying function returns an array (currently only
- arrays of compound types are supported) as opposed to a pointer
- to an object, this method should be called to provide a
- MessageFormat string containing an expression that computes the
- number of elements of the returned array. The parameters to the
- MessageFormat expression are the names of the incoming Java
- arguments. */
- public void setReturnedArrayLengthExpression(String expr) {
- returnedArrayLengthExpression = expr;
- }
-
- protected void emitReturnType(PrintWriter writer)
- {
- writer.print(getReturnTypeString(false));
- }
-
- protected String getReturnTypeString(boolean skipArray) {
- if (skipArray || (getReturnedArrayLengthExpression() == null && !binding.getJavaReturnType().isArrayOfCompoundTypeWrappers())) {
- return binding.getJavaReturnType().getName();
- }
- return binding.getJavaReturnType().getName() + "[]";
- }
-
- protected void emitName(PrintWriter writer)
- {
- if (forImplementingMethodCall) {
- writer.print(getImplMethodName());
- } else {
- writer.print(getName());
- }
- }
-
- protected int emitArguments(PrintWriter writer)
- {
- boolean needComma = false;
- int numEmitted = 0;
-
- if (forImplementingMethodCall && binding.hasContainingType()) {
- // Always emit outgoing "this" argument
- writer.print("java.nio.Buffer ");
- writer.print(javaThisArgumentName());
- ++numEmitted;
- needComma = true;
- }
-
- for (int i = 0; i < binding.getNumArguments(); i++) {
- JavaType type = binding.getJavaArgumentType(i);
- if (type.isVoid()) {
- // Make sure this is the only param to the method; if it isn't,
- // there's something wrong with our parsing of the headers.
- if (binding.getNumArguments() != 1) {
- throw new InternalError(
- "\"void\" argument type found in " +
- "multi-argument function \"" + binding + "\"");
- }
- continue;
- }
-
- if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) {
- // Don't need to expose these at the Java level
- continue;
- }
-
- if (needComma) {
- writer.print(", ");
- }
-
- writer.print(type.getName());
- writer.print(" ");
- writer.print(binding.getArgumentName(i));
- ++numEmitted;
- needComma = true;
- }
- return numEmitted;
- }
-
- protected String getImplMethodName()
- {
- return binding.getName() + "0";
- }
-
- protected void emitBody(PrintWriter writer)
- {
- writer.println(';');
- }
-
- protected static String javaThisArgumentName() {
- return "jthis0";
- }
-
- protected String getCommentStartString() { return "/** "; }
-
- protected String getBaseIndentString() { return " "; }
-
- protected String getReturnedArrayLengthExpression() {
- return returnedArrayLengthExpression;
- }
-
- /**
- * Class that emits a generic comment for JavaMethodBindingEmitters; the comment
- * includes the C signature of the native method that is being bound by the
- * emitter java method.
- */
- protected static class DefaultCommentEmitter implements CommentEmitter {
- public void emit(FunctionEmitter emitter, PrintWriter writer) {
- emitBeginning(emitter, writer);
- emitBindingCSignature(((JavaMethodBindingEmitter)emitter).getBinding(), writer);
- emitEnding(emitter, writer);
- }
- protected void emitBeginning(FunctionEmitter emitter, PrintWriter writer) {
- writer.print("Entry point to C language function: <br> ");
- }
- protected void emitBindingCSignature(MethodBinding binding, PrintWriter writer) {
- writer.print("<code> ");
- writer.print(binding.getCSymbol());
- writer.print(" </code> ");
- }
- protected void emitEnding(FunctionEmitter emitter, PrintWriter writer) {
- // If argument type is a named enum, then emit a comment detailing the
- // acceptable values of that enum.
- MethodBinding binding = ((JavaMethodBindingEmitter)emitter).getBinding();
- for (int i = 0; i < binding.getNumArguments(); i++) {
- Type type = binding.getCArgumentType(i);
- // don't emit param comments for anonymous enums, since we can't
- // distinguish between the values found within multiple anonymous
- // enums in the same C translation unit.
- if (type.isEnum() && type.getName() != HeaderParser.ANONYMOUS_ENUM_NAME) {
- EnumType enumType = (EnumType)type;
- writer.println();
- writer.print(emitter.getBaseIndentString());
- writer.print(" ");
- writer.print("@param ");
- writer.print(binding.getArgumentName(i));
- writer.print(" valid values are: <code>");
- for (int j = 0; j < enumType.getNumEnumerates(); ++j) {
- if (j>0) writer.print(", ");
- writer.print(enumType.getEnumName(j));
- }
- writer.println("</code>");
- }
- }
- }
- }
-
- protected static class InterfaceCommentEmitter
- extends JavaMethodBindingEmitter.DefaultCommentEmitter
- {
- protected void emitBeginning(FunctionEmitter emitter,
- PrintWriter writer) {
- writer.print("Interface to C language function: <br> ");
- }
- }
-}
-
diff --git a/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java b/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java
deleted file mode 100644
index a3d35f912..000000000
--- a/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.gluegen;
-
-import java.io.*;
-import java.util.*;
-import java.text.MessageFormat;
-
-import net.java.games.gluegen.cgram.types.*;
-
-/** Emits the Java-side component of the Java<->C JNI binding. */
-public class JavaMethodBindingImplEmitter extends JavaMethodBindingEmitter
-{
- private boolean isUnimplemented;
-
- public JavaMethodBindingImplEmitter(MethodBinding binding, PrintWriter output, String runtimeExceptionType)
- {
- this(binding, output, runtimeExceptionType, false);
- }
-
- public JavaMethodBindingImplEmitter(MethodBinding binding,
- PrintWriter output,
- String runtimeExceptionType,
- boolean isUnimplemented)
- {
- super(binding, output, runtimeExceptionType);
- setCommentEmitter(defaultJavaCommentEmitter);
- this.isUnimplemented = isUnimplemented;
- }
-
- public JavaMethodBindingImplEmitter(JavaMethodBindingEmitter arg) {
- super(arg);
- if (arg instanceof JavaMethodBindingImplEmitter) {
- this.isUnimplemented = ((JavaMethodBindingImplEmitter) arg).isUnimplemented;
- }
- }
-
- protected void emitBody(PrintWriter writer)
- {
- MethodBinding binding = getBinding();
- if (needsBody()) {
- writer.println();
- writer.println(" {");
- if (isUnimplemented) {
- writer.println(" throw new " + getRuntimeExceptionType() + "(\"Unimplemented\");");
- } else {
- emitPreCallSetup(binding, writer);
- emitReturnVariableSetup(binding, writer);
- emitCall(binding, writer);
- }
- writer.println(" }");
- } else {
- writer.println(";");
- }
- }
-
- protected boolean isUnimplemented() {
- return isUnimplemented;
- }
-
- protected boolean needsBody() {
- return (isUnimplemented ||
- getBinding().signatureUsesNIO() ||
- getBinding().signatureUsesCArrays() ||
- getBinding().hasContainingType());
- }
-
- protected void emitPreCallSetup(MethodBinding binding, PrintWriter writer) {
- emitArrayLengthAndNIOBufferChecks(binding, writer);
- }
-
- protected void emitArrayLengthAndNIOBufferChecks(MethodBinding binding, PrintWriter writer) {
- // Check lengths of any incoming arrays if necessary
- for (int i = 0; i < binding.getNumArguments(); i++) {
- Type type = binding.getCArgumentType(i);
- if (type.isArray()) {
- ArrayType arrayType = type.asArray();
- writer.println(" if (" + binding.getArgumentName(i) + ".length < " + arrayType.getLength() + ")");
- writer.println(" throw new " + getRuntimeExceptionType() + "(\"Length of array \\\"" + binding.getArgumentName(i) +
- "\\\" was less than the required " + arrayType.getLength() + "\");");
- } else {
- JavaType javaType = binding.getJavaArgumentType(i);
- if (javaType.isNIOBuffer()) {
- writer.println(" if (!BufferFactory.isDirect(" + binding.getArgumentName(i) + "))");
- writer.println(" throw new " + getRuntimeExceptionType() + "(\"Argument \\\"" +
- binding.getArgumentName(i) + "\\\" was not a direct buffer\");");
- } else if (javaType.isNIOBufferArray()) {
- String argName = binding.getArgumentName(i);
- // Check direct buffer properties of all buffers within
- writer.println(" if (" + argName + " != null) {");
- writer.println(" for (int _ctr = 0; _ctr < " + argName + ".length; _ctr++) {");
- writer.println(" if (!BufferFactory.isDirect(" + argName + "[_ctr])) {");
- writer.println(" throw new " + getRuntimeExceptionType() + "(\"Element \" + _ctr + \" of argument \\\"" +
- binding.getArgumentName(i) + "\\\" was not a direct buffer\");");
- writer.println(" }");
- writer.println(" }");
- writer.println(" }");
- }
- }
- }
- }
-
- protected void emitReturnVariableSetup(MethodBinding binding, PrintWriter writer) {
- writer.print(" ");
- JavaType returnType = binding.getJavaReturnType();
- if (!returnType.isVoid()) {
- if (returnType.isCompoundTypeWrapper() ||
- returnType.isNIOByteBuffer()) {
- writer.println("ByteBuffer _res;");
- writer.print(" _res = ");
- } else if (returnType.isArrayOfCompoundTypeWrappers()) {
- writer.println("ByteBuffer[] _res;");
- writer.print(" _res = ");
- } else {
- writer.print("return ");
- }
- }
- }
-
- protected void emitCall(MethodBinding binding, PrintWriter writer) {
- writer.print(getImplMethodName());
- writer.print("(");
- emitCallArguments(binding, writer);
- writer.print(")");
- emitCallResultReturn(binding, writer);
- }
-
- protected int emitCallArguments(MethodBinding binding, PrintWriter writer) {
- boolean needComma = false;
- int numArgsEmitted = 0;
- if (binding.hasContainingType()) {
- // Emit this pointer
- assert(binding.getContainingType().isCompoundTypeWrapper());
- writer.print("getBuffer()");
- needComma = true;
- ++numArgsEmitted;
- }
- for (int i = 0; i < binding.getNumArguments(); i++) {
- JavaType type = binding.getJavaArgumentType(i);
- if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) {
- // Don't need to expose these at the Java level
- continue;
- }
-
- if (type.isVoid()) {
- // Make sure this is the only param to the method; if it isn't,
- // there's something wrong with our parsing of the headers.
- assert(binding.getNumArguments() == 1);
- continue;
- }
-
- if (needComma) {
- writer.print(", ");
- }
-
- if (type.isCompoundTypeWrapper()) {
- writer.print("((");
- }
- writer.print(binding.getArgumentName(i));
- if (type.isCompoundTypeWrapper()) {
- writer.print(" == null) ? null : ");
- writer.print(binding.getArgumentName(i));
- writer.print(".getBuffer())");
- }
- needComma = true;
- ++numArgsEmitted;
- }
- return numArgsEmitted;
- }
-
- protected void emitCallResultReturn(MethodBinding binding, PrintWriter writer) {
- JavaType returnType = binding.getJavaReturnType();
- if (returnType.isCompoundTypeWrapper()) {
- writer.println(";");
- String fmt = getReturnedArrayLengthExpression();
- writer.println(" if (_res == null) return null;");
- if (fmt == null) {
- writer.print(" return new " + returnType.getName() + "(_res.order(ByteOrder.nativeOrder()))");
- } else {
- writer.println(" _res.order(ByteOrder.nativeOrder());");
- String[] argumentNames = new String[binding.getNumArguments()];
- for (int i = 0; i < binding.getNumArguments(); i++) {
- argumentNames[i] = binding.getArgumentName(i);
- }
- String expr = new MessageFormat(fmt).format(argumentNames);
- PointerType cReturnTypePointer = binding.getCReturnType().asPointer();
- CompoundType cReturnType = null;
- if (cReturnTypePointer != null) {
- cReturnType = cReturnTypePointer.getTargetType().asCompound();
- }
- if (cReturnType == null) {
- throw new RuntimeException("ReturnedArrayLength directive currently only supported for pointers to compound types " +
- "(error occurred while generating Java glue code for " + binding.getName() + ")");
- }
- writer.println(" " + getReturnTypeString(false) + " _retarray = new " + getReturnTypeString(true) + "[" + expr + "];");
- writer.println(" for (int _count = 0; _count < " + expr + "; _count++) {");
- // Create temporary ByteBuffer slice
- // FIXME: probably need Type.getAlignedSize() for arrays of
- // compound types (rounding up to machine-dependent alignment)
- writer.println(" _res.position(_count * " + cReturnType.getSize() + ");");
- writer.println(" _res.limit ((1 + _count) * " + cReturnType.getSize() + ");");
- writer.println(" ByteBuffer _tmp = _res.slice();");
- writer.println(" _tmp.order(ByteOrder.nativeOrder());");
- writer.println(" _res.position(0);");
- writer.println(" _res.limit(_res.capacity());");
- writer.println(" _retarray[_count] = new " + getReturnTypeString(true) + "(_tmp);");
- writer.println(" }");
- writer.print (" return _retarray");
- }
- } else if (returnType.isNIOBuffer()) {
- writer.println(";");
- writer.println(" if (_res == null) return null;");
- writer.print(" return _res.order(ByteOrder.nativeOrder())");
- } else if (returnType.isArrayOfCompoundTypeWrappers()) {
- writer.println(";");
- writer.println(" if (_res == null) return null;");
- writer.println(" " + getReturnTypeString(false) + " _retarray = new " + getReturnTypeString(true) + "[_res.length];");
- writer.println(" for (int _count = 0; _count < _res.length; _count++) {");
- writer.println(" _retarray[_count] = new " + getReturnTypeString(true) + "(_res[_count]);");
- writer.println(" }");
- writer.print (" return _retarray");
- }
- writer.println(";");
- }
-}
-
diff --git a/src/net/java/games/gluegen/opengl/JavaGLPAWrapperEmitter.java b/src/net/java/games/gluegen/opengl/JavaGLPAWrapperEmitter.java
deleted file mode 100644
index aa853711a..000000000
--- a/src/net/java/games/gluegen/opengl/JavaGLPAWrapperEmitter.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.gluegen.opengl;
-
-import java.io.*;
-import java.util.*;
-import net.java.games.gluegen.*;
-import net.java.games.gluegen.cgram.types.*;
-
-public class JavaGLPAWrapperEmitter extends JavaMethodBindingImplEmitter
-{
- private static final CommentEmitter commentEmitterForWrappedMethod =
- new WrappedMethodCommentEmitter();
-
- private JavaMethodBindingEmitter emitterBeingWrapped;
- private String getProcAddressTableExpr;
-
- public JavaGLPAWrapperEmitter(JavaMethodBindingEmitter methodToWrap, String getProcAddressTableExpr)
- {
- super(methodToWrap.getBinding(), methodToWrap.getDefaultOutput(), methodToWrap.getRuntimeExceptionType());
- this.getProcAddressTableExpr = getProcAddressTableExpr;
-
- if (methodToWrap.getBinding().hasContainingType())
- {
- throw new IllegalArgumentException(
- "Cannot create OpenGL proc. address wrapper; method has containing type: \"" +
- methodToWrap.getBinding() + "\"");
- }
-
- // make a new emitter that will emit the original method's binding, but
- // with WRAP_PREFIX before its name. If a body is needed (for array
- // length checking, unwrapping of wrapper objects to java.nio.Buffers,
- // etc.) then it will be generated; therefore the emitter being wrapped
- // should be an "NIO buffer variant" (i.e., after all unpacking has
- // occurred).
- emitterBeingWrapped =
- new JavaMethodBindingEmitter(methodToWrap.getBinding().createNIOBufferVariant(),
- methodToWrap.getDefaultOutput(),
- methodToWrap.getRuntimeExceptionType())
- {
- protected void emitName(PrintWriter writer)
- {
- writer.print(GLEmitter.WRAP_PREFIX);
- super.emitName(writer);
- }
- protected int emitArguments(PrintWriter writer)
- {
- int numEmitted = super.emitArguments(writer);
- if (numEmitted > 0)
- {
- writer.print(", ");
- }
- writer.print("long glProcAddress");
- ++numEmitted;
-
- return numEmitted;
- }
- };
-
- // copy the modifiers from the original emitter
- emitterBeingWrapped.addModifiers(methodToWrap.getModifiers());
-
- // Change the access of the method we're wrapping to PRIVATE
- EmissionModifier origAccess = null; // null is equivalent if package access
- if (emitterBeingWrapped.hasModifier(PUBLIC))
- {
- origAccess = PUBLIC;
- }
- else if (emitterBeingWrapped.hasModifier(PROTECTED))
- {
- origAccess = PROTECTED;
- }
- else if (emitterBeingWrapped.hasModifier(PRIVATE))
- {
- origAccess = PRIVATE;
- }
-
- if (origAccess != null)
- {
- emitterBeingWrapped.removeModifier(origAccess);
- }
- emitterBeingWrapped.addModifier(PRIVATE);
- emitterBeingWrapped.addModifier(NATIVE);
-
- // Now make our binding use the original access of the wrapped method
- this.addModifier(origAccess);
- if (emitterBeingWrapped.hasModifier(STATIC)) {
- this.addModifier(STATIC);
- }
- }
-
- protected boolean needsBody() {
- return true;
- }
-
- protected String getImplMethodName() {
- return GLEmitter.WRAP_PREFIX + getBinding().getName();
- }
-
- public void emit(PrintWriter writer)
- {
- // Emit a wrapper that will call the method we want to wrap
- //writer.println(" // Emitter being wrapped = " + emitterBeingWrapped.getClass().getName());
- super.emit(writer);
- writer.println();
-
- // emit the wrapped method
- CommentEmitter origComment = emitterBeingWrapped.getCommentEmitter();
- emitterBeingWrapped.setCommentEmitter(commentEmitterForWrappedMethod);
- emitterBeingWrapped.emit(writer);
- emitterBeingWrapped.setCommentEmitter(origComment);
- writer.println();
- }
-
- protected void emitPreCallSetup(MethodBinding binding, PrintWriter writer) {
- super.emitPreCallSetup(binding, writer);
-
- MethodBinding wrappedBinding = emitterBeingWrapped.getBinding();
- String procAddressVariable =
- GLEmitter.PROCADDRESS_VAR_PREFIX + wrappedBinding.getName();
-
- writer.println(" final long __addr_ = " + getProcAddressTableExpr + "." + procAddressVariable + ";");
- writer.println(" if (__addr_ == 0) {");
- writer.println(" throw new GLException(\"Method \\\"" + binding.getName() + "\\\" not available\");");
- writer.println(" }");
- }
-
- protected int emitCallArguments(MethodBinding binding, PrintWriter writer) {
- int numEmitted = super.emitCallArguments(binding, writer);
- if (numEmitted > 0) {
- writer.print(", ");
- }
- writer.print("__addr_");
- return 1 + numEmitted;
- }
-
- /** This class emits the comment for the wrapper method */
- private static class WrappedMethodCommentEmitter extends JavaMethodBindingEmitter.DefaultCommentEmitter {
- protected void emitBeginning(FunctionEmitter methodEmitter, PrintWriter writer) {
- writer.print("Encapsulates function pointer for OpenGL function <br>: ");
- }
- }
-} // end class JavaGLPAWrapperEmitter
diff --git a/src/net/java/games/jogl/Animator.java b/src/net/java/games/jogl/Animator.java
deleted file mode 100644
index ebb6d9aed..000000000
--- a/src/net/java/games/jogl/Animator.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl;
-
-import java.awt.EventQueue;
-import net.java.games.jogl.impl.SingleThreadedWorkaround;
-
-/** <P> An Animator can be attached to a GLDrawable to drive its
- display() method in a loop. For efficiency, it sets up the
- rendering thread for the drawable to be its own internal thread,
- so it can not be combined with manual repaints of the
- surface. </P>
-
- <P> The Animator currently contains a workaround for a bug in
- NVidia's drivers (80174). The current semantics are that once an
- Animator is created with a given GLDrawable as a target, repaints
- will likely be suspended for that GLDrawable until the Animator is
- started. This prevents multithreaded access to the context (which
- can be problematic) when the application's intent is for
- single-threaded access within the Animator. It is not guaranteed
- that repaints will be prevented during this time and applications
- should not rely on this behavior for correctness. </P>
-*/
-
-public class Animator {
- private GLDrawable drawable;
- private Runnable runnable;
- private Thread thread;
- private boolean shouldStop;
-
- /** Creates a new Animator for a particular drawable. */
- public Animator(GLDrawable drawable) {
- this.drawable = drawable;
-
- // Workaround for NVidia driver bug 80174
- if (drawable instanceof GLCanvas) {
- ((GLCanvas) drawable).willSetRenderingThread();
- }
- }
-
- /** Starts this animator. */
- public synchronized void start() {
- if (thread != null) {
- throw new GLException("Already started");
- }
- if (runnable == null) {
- runnable = new Runnable() {
- public void run() {
- boolean noException = false;
- try {
- // Try to get OpenGL context optimization since we know we
- // will be rendering this one drawable continually from
- // this thread; make the context current once instead of
- // making it current and freeing it each frame.
- drawable.setRenderingThread(Thread.currentThread());
-
- // Since setRenderingThread is currently advisory (because
- // of the poor JAWT implementation in the Motif AWT, which
- // performs excessive locking) we also prevent repaint(),
- // which is called from the AWT thread, from having an
- // effect for better multithreading behavior. This call is
- // not strictly necessary, but if end users write their
- // own animation loops which update multiple drawables per
- // tick then it may be necessary to enforce the order of
- // updates.
- drawable.setNoAutoRedrawMode(true);
-
- while (!shouldStop) {
- noException = false;
- drawable.display();
- noException = true;
- }
- } finally {
- shouldStop = false;
- drawable.setNoAutoRedrawMode(false);
- try {
- // The surface is already unlocked and rendering
- // thread is already null if an exception occurred
- // during display(), so don't disable the rendering
- // thread again.
- if (noException) {
- // Destruction of the underlying GLContext may have
- // disabled the setRenderingThread optimization out
- // from under us
- if (drawable.getRenderingThread() != null) {
- drawable.setRenderingThread(null);
- }
- }
- } finally {
- synchronized (Animator.this) {
- thread = null;
- Animator.this.notify();
- }
- }
- }
- }
- };
- }
- thread = new Thread(runnable);
- thread.start();
- }
-
- /** Stops this animator, blocking until the animation thread has
- finished. */
- public synchronized void stop() {
- shouldStop = true;
- // It's hard to tell whether the thread which calls stop() has
- // dependencies on the Animator's internal thread. Currently we
- // use a couple of heuristics to determine whether we should do
- // the blocking wait().
- if ((Thread.currentThread() == thread) || EventQueue.isDispatchThread()) {
- return;
- }
- while (shouldStop && thread != null) {
- try {
- wait();
- } catch (InterruptedException ie) {
- }
- }
- }
-}
diff --git a/src/net/java/games/jogl/GLDrawable.java b/src/net/java/games/jogl/GLDrawable.java
deleted file mode 100644
index 9ca86ca79..000000000
--- a/src/net/java/games/jogl/GLDrawable.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl;
-
-import java.awt.Dimension;
-
-// FIXME: We need some way to tell when the device upon which the canvas is
-// being displayed has changed (e.g., the user drags the canvas's parent
-// window from one screen on multi-screen environment to another, when the
-// user changes the display bit depth or screen resolution, etc). When this
-// occurs, we need the canvas to reset the gl function pointer tables for the
-// canvas, because the new device may have different capabilities (e.g.,
-// doesn't support as many opengl extensions) from the original device. This
-// hook would also be useful in other GLDrawables (for example, offscreen
-// buffers such as pbuffers, whose contents may or may not be invalidated when
-// the display mode changes, depending on the vendor's GL implementation).
-//
-// Right now I'm not sure how hook into when this change occurs. There isn't
-// any AWT event corresponding to a device change (as far as I can
-// tell). We could constantly check the GraphicsConfiguration of the canvas's top-level
-// parent to see if it has changed, but this would be very slow (we'd have to
-// do it every time the context is made current). There has got to be a better
-// solution, but I'm not sure what it is.
-
-// FIXME: Subclasses need to call resetGLFunctionAvailability() on their
-// context whenever the displayChanged() function is called on our
-// GLEventListeners
-
-/** Abstracts common functionality among the OpenGL components {@link
- GLCanvas} and {@link GLJPanel}. */
-
-public interface GLDrawable extends ComponentEvents {
- /** Adds a {@link GLEventListener} to this drawable. If multiple
- listeners are added to a given drawable, they are notified of
- events in an arbitrary order. */
- public void addGLEventListener(GLEventListener listener);
-
- /** Removes a {@link GLEventListener} from this drawable. Note that
- if this is done from within a particular drawable's {@link
- GLEventListener} handler (reshape, display, etc.) that it is not
- guaranteed that all other listeners will be evaluated properly
- during this update cycle. */
- public void removeGLEventListener(GLEventListener listener);
-
- /** Sets the size of this GLDrawable. */
- public void setSize(int width, int height);
-
- /** Sets the size of this GLDrawable. */
- public void setSize(Dimension d);
-
- /** Returns the size of this GLDrawable as a newly-created Dimension
- object. */
- public Dimension getSize();
-
- /** Stores the size of this GLDrawable into the user-provided
- Dimension object, returning that object. If the provided
- Dimension is null a new one will be allocated and returned. */
- public Dimension getSize(Dimension d);
-
- /** Returns the {@link GL} pipeline object this GLDrawable uses. If
- this method is called outside of the {@link GLEventListener}'s
- callback methods (init, display, etc.) it may return null. Users
- should not rely on the identity of the returned GL object; for
- example, users should not maintain a hash table with the GL
- object as the key. Additionally, the GL object should not be
- cached in client code, but should be re-fetched from the
- GLDrawable at the beginning of each call to init, display,
- etc. */
- public GL getGL();
-
- /** Sets the {@link GL} pipeline object this GLDrawable uses. This
- should only be called from within the GLEventListener's callback
- methods, and usually only from within the init() method, in
- order to install a composable pipeline. See the JOGL demos for
- examples. */
- public void setGL(GL gl);
-
- /** Returns the {@link GLU} pipeline object this GLDrawable uses. */
- public GLU getGLU();
-
- /** Sets the {@link GLU} pipeline object this GLDrawable uses. */
- public void setGLU(GLU glu);
-
- /** Causes OpenGL rendering to be performed for this GLDrawable by
- calling {@link GLEventListener#display} for all registered
- {@link GLEventListener}s. Called automatically by the window
- system toolkit upon receiving a repaint() request. When used in
- conjunction with {@link
- net.java.games.jogl.GLDrawable#setRenderingThread}, this routine
- may be called manually by the application's main loop for higher
- performance and better control over the rendering process. It is
- legal to call another GLDrawable's display method from within
- {@link GLEventListener#display}. */
- public void display();
-
- /** <P> Changes this GLDrawable to allow OpenGL rendering only from
- the supplied thread, which must either be the current thread or
- null. Attempts by other threads to perform OpenGL operations
- like rendering or resizing the window will be ignored as long as
- the thread is set. Setting up the rendering thread is not
- required but enables the system to perform additional
- optimizations, in particular when the application requires
- control over the rendering loop. Before exiting,
- <code>setRenderingThread(null)</code> must be called or other
- threads will be unable to perform OpenGL rendering to this
- drawable. Throws {@link GLException} if the rendering thread for
- this drawable has been set and attempts are made to set or clear
- the rendering thread from another thread, or if the passed
- thread is not equal to the current thread or null. Also throws
- {@link GLException} if the current thread attempts to call
- <code>setRenderingThread</code> on more than one drawable. </P>
-
- <P> <B>NOTE:</B> Currently this routine is only advisory, which
- means that on some platforms the underlying optimizations are
- disabled and setting the rendering thread has no effect.
- Applications should not rely on setRenderingThread to prevent
- rendering from other threads. <P>
-
- @throws GLException if the rendering thread for this drawable has
- been set by another thread or if the passed thread is not equal
- to the current thread or null
- */
- public void setRenderingThread(Thread currentThreadOrNull) throws GLException;
-
- /** Returns the rendering thread for this drawable, or null if none
- has been set. */
- public Thread getRenderingThread();
-
- /** Disables automatic redraws of this drawable if possible. This is
- provided as an overriding mechanism for applications which
- perform animation on the drawable and for which the (currently
- advisory) {@link #setRenderingThread} does not provide strict
- enough guarantees. Its sole purpose is to avoid deadlocks that
- are unfortunately all too easy to run into when both animating a
- drawable from a given thread as well as having updates performed
- by the AWT event thread (repaints, etc.). When it is enabled,
- repaint requests driven by the AWT will not result in the OpenGL
- event listeners' display methods being called from the AWT
- thread, unless (as with GLJPanel) this is the only mechanism by
- which repaints are done. The necessity of this API may be
- rethought in a future release. Defaults to false. */
- public void setNoAutoRedrawMode(boolean noAutoRedraws);
-
- /** Returns whether automatic redraws are disabled for this
- drawable. Defaults to false. */
- public boolean getNoAutoRedrawMode();
-
- /** Enables or disables automatic buffer swapping for this drawable.
- By default this property is set to true; when true, after all
- GLEventListeners have been called for a display() event, the
- front and back buffers are swapped, displaying the results of
- the render. When disabled, the user is responsible for calling
- {@link #swapBuffers} manually. */
- public void setAutoSwapBufferMode(boolean onOrOff);
-
- /** Indicates whether automatic buffer swapping is enabled for this
- drawable. See {@link #setAutoSwapBufferMode}. */
- public boolean getAutoSwapBufferMode();
-
- /** Swaps the front and back buffers of this drawable. When
- automatic buffer swapping is enabled (as is the default), it is
- not necessary to call this method and doing so may have
- undefined results. */
- public void swapBuffers();
-
- /** Indicates whether this drawable is capable of fabricating a
- subordinate offscreen drawable for advanced rendering techniques
- which require offscreen hardware-accelerated surfaces. Note that
- this method is only guaranteed to return a correct result once
- your GLEventListener's init() method has been called. */
- public boolean canCreateOffscreenDrawable();
-
- /** Creates a subordinate offscreen drawable (pbuffer) for this
- drawable. This routine should only be called if {@link
- #canCreateOffscreenDrawable} returns true. The passed
- capabilities are matched according to the platform-dependent
- pbuffer format selection algorithm, which currently can not be
- overridden. */
- public GLPbuffer createOffscreenDrawable(GLCapabilities capabilities,
- int initialWidth,
- int initialHeight);
-}
diff --git a/src/net/java/games/jogl/GLDrawableFactory.java b/src/net/java/games/jogl/GLDrawableFactory.java
deleted file mode 100644
index 8204fde7d..000000000
--- a/src/net/java/games/jogl/GLDrawableFactory.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl;
-
-import java.awt.GraphicsDevice;
-import java.awt.GraphicsEnvironment;
-import net.java.games.jogl.impl.*;
-
-/** <P> Provides a virtual machine- and operating system-independent
- mechanism for creating {@link net.java.games.jogl.GLCanvas} and {@link
- net.java.games.jogl.GLJPanel} objects. </P>
-
- <P> The {@link net.java.games.jogl.GLCapabilities} objects passed in to the
- various factory methods are used as a hint for the properties of
- the returned drawable. The default capabilities selection
- algorithm (equivalent to passing in a null {@link
- GLCapabilitiesChooser}) is described in {@link
- DefaultGLCapabilitiesChooser}. Sophisticated applications needing
- to change the selection algorithm may pass in their own {@link
- GLCapabilitiesChooser} which can select from the available pixel
- formats. </P>
-
- <P> Because of the multithreaded nature of the Java platform's
- window system toolkit, it is typically not possible to immediately
- reject a given {@link GLCapabilities} as being unsupportable by
- either returning <code>null</code> from the creation routines or
- raising a {@link GLException}. The semantics of the rejection
- process are (unfortunately) left unspecified for now. The current
- implementation will cause a {@link GLException} to be raised
- during the first repaint of the {@link GLCanvas} or {@link
- GLJPanel} if the capabilities can not be met. </P>
-*/
-
-public class GLDrawableFactory {
- private static GLDrawableFactory factory = new GLDrawableFactory();
-
- private GLDrawableFactory() {}
-
- /** Returns the sole GLDrawableFactory instance. */
- public static GLDrawableFactory getFactory() {
- return factory;
- }
-
- /** Creates a {@link GLCanvas} on the default graphics device with
- the specified capabilities using the default capabilities
- selection algorithm. */
- public GLCanvas createGLCanvas(GLCapabilities capabilities) {
- return createGLCanvas(capabilities, null, null);
- }
-
- /** Creates a {@link GLCanvas} on the default graphics device with
- the specified capabilities using the default capabilities
- selection algorithm. The canvas will share textures and display
- lists with the specified {@link GLDrawable}; the drawable must
- either be null or have been fabricated from this factory or by
- classes in this package. A null drawable indicates no
- sharing. */
- public GLCanvas createGLCanvas(GLCapabilities capabilities, GLDrawable shareWith) {
- return createGLCanvas(capabilities, null, shareWith);
- }
-
- /** Creates a {@link GLCanvas} on the default graphics device with
- the specified capabilities using the supplied capabilities
- selection algorithm. A null chooser is equivalent to using the
- {@link DefaultGLCapabilitiesChooser}. */
- public GLCanvas createGLCanvas(GLCapabilities capabilities, GLCapabilitiesChooser chooser) {
- return createGLCanvas(capabilities, chooser, null);
- }
-
- /** Creates a {@link GLCanvas} on the default graphics device with
- the specified capabilities using the supplied capabilities
- selection algorithm. A null chooser is equivalent to using the
- {@link DefaultGLCapabilitiesChooser}. The canvas will share
- textures and display lists with the specified {@link
- GLDrawable}; the drawable must either be null or have been
- fabricated from this factory or by classes in this package. A
- null drawable indicates no sharing. */
- public GLCanvas createGLCanvas(GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLDrawable shareWith) {
- return createGLCanvas(capabilities, chooser, shareWith, null);
- }
-
- /** Creates a {@link GLCanvas} on the specified graphics device with
- the specified capabilities using the supplied capabilities
- selection algorithm. A null chooser is equivalent to using the
- {@link DefaultGLCapabilitiesChooser}. The canvas will share
- textures and display lists with the specified {@link
- GLDrawable}; the drawable must either be null or have been
- fabricated from this factory or by classes in this package. A
- null drawable indicates no sharing. A null GraphicsDevice is
- equivalent to using that returned from
- <code>GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()</code>. */
- public GLCanvas createGLCanvas(GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLDrawable shareWith,
- GraphicsDevice device) {
- if (chooser == null) {
- chooser = new DefaultGLCapabilitiesChooser();
- }
- if (device == null) {
- device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
- }
- // The platform-specific GLContextFactory will only provide a
- // non-null GraphicsConfiguration on platforms where this is
- // necessary (currently only X11, as Windows allows the pixel
- // format of the window to be set later and Mac OS X seems to
- // handle this very differently than all other platforms). On
- // other platforms this method returns null; it is the case (at
- // least in the Sun AWT implementation) that this will result in
- // equivalent behavior to calling the no-arg super() constructor
- // for Canvas.
- return new GLCanvas(GLContextFactory.getFactory().
- chooseGraphicsConfiguration(capabilities, chooser, device),
- capabilities,
- chooser,
- shareWith);
- }
-
- /** Creates a {@link GLJPanel} with the specified capabilities using
- the default capabilities selection algorithm. */
- public GLJPanel createGLJPanel(GLCapabilities capabilities) {
- return createGLJPanel(capabilities, null, null);
- }
-
- /** Creates a {@link GLJPanel} with the specified capabilities using
- the default capabilities selection algorithm. The panel will
- share textures and display lists with the specified {@link
- GLDrawable}; the drawable must either be null or have been
- fabricated from this factory or by classes in this package. A
- null drawable indicates no sharing. */
- public GLJPanel createGLJPanel(GLCapabilities capabilities, GLDrawable shareWith) {
- return createGLJPanel(capabilities, null, shareWith);
- }
-
- /** Creates a {@link GLJPanel} with the specified capabilities using
- the supplied capabilities selection algorithm. A null chooser is
- equivalent to using the {@link DefaultGLCapabilitiesChooser}. */
- public GLJPanel createGLJPanel(GLCapabilities capabilities, GLCapabilitiesChooser chooser) {
- return createGLJPanel(capabilities, chooser, null);
- }
-
- /** Creates a {@link GLJPanel} with the specified capabilities using
- the supplied capabilities selection algorithm. A null chooser is
- equivalent to using the {@link DefaultGLCapabilitiesChooser}.
- The panel will share textures and display lists with the
- specified {@link GLDrawable}; the drawable must either be null
- or have been fabricated from this factory or by classes in this
- package. A null drawable indicates no sharing. */
- public GLJPanel createGLJPanel(GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLDrawable shareWith) {
- if (chooser == null) {
- chooser = new DefaultGLCapabilitiesChooser();
- }
- return new GLJPanel(capabilities, chooser, shareWith);
- }
-}
diff --git a/src/net/java/games/jogl/GLJPanel.java b/src/net/java/games/jogl/GLJPanel.java
deleted file mode 100644
index e9b58bdae..000000000
--- a/src/net/java/games/jogl/GLJPanel.java
+++ /dev/null
@@ -1,730 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl;
-
-import java.awt.Component;
-import java.awt.EventQueue;
-import java.awt.Frame;
-import java.awt.Graphics;
-import java.awt.GraphicsConfiguration;
-import java.awt.Rectangle;
-import java.awt.image.BufferedImage;
-import java.awt.image.DataBufferByte;
-import java.awt.image.DataBufferInt;
-import java.security.*;
-import javax.swing.JComponent;
-import javax.swing.JPanel;
-import net.java.games.jogl.impl.*;
-
-// FIXME: Subclasses need to call resetGLFunctionAvailability() on their
-// context whenever the displayChanged() function is called on their
-// GLEventListeners
-
-/** A lightweight Swing component which provides OpenGL rendering
- support. Provided for compatibility with Swing user interfaces
- when adding a heavyweight doesn't work either because of
- Z-ordering or LayoutManager problems. This component attempts to
- use hardware-accelerated rendering via pbuffers and falls back on
- to software rendering if problems occur. This class can not be
- instantiated directly; use {@link GLDrawableFactory} to construct
- them. <P>
-
- Note that because this component attempts to use pbuffers for
- rendering, and because pbuffers can not be resized, somewhat
- surprising behavior may occur during resize operations; the {@link
- GLEventListener#init} method may be called multiple times as the
- pbuffer is resized to be able to cover the size of the GLJPanel.
- This behavior is correct, as the textures and display lists for
- the GLJPanel will have been lost during the resize operation. The
- application should attempt to make its GLEventListener.init()
- methods as side-effect-free as possible.
-*/
-
-public final class GLJPanel extends JPanel implements GLDrawable {
- protected static final boolean DEBUG = Debug.debug("GLJPanel");
-
- private GLDrawableHelper drawableHelper = new GLDrawableHelper();
- private volatile boolean isInitialized;
-
- // Data used for either pbuffers or pixmap-based offscreen surfaces
- private GLCapabilities offscreenCaps;
- private GLCapabilitiesChooser chooser;
- private GLDrawable shareWith;
- // This image is exactly the correct size to render into the panel
- private BufferedImage offscreenImage;
- // One of these is used to store the read back pixels before storing
- // in the BufferedImage
- private byte[] readBackBytes;
- private int[] readBackInts;
- private int readBackWidthInPixels;
- private int readBackHeightInPixels;
- // Width of the actual GLJPanel
- private int panelWidth = 0;
- private int panelHeight = 0;
- private Updater updater;
- private int awtFormat;
- private int glFormat;
- private int glType;
-
- // Implementation using pbuffers
- private static boolean hardwareAccelerationDisabled =
- Debug.isPropertyDefined("jogl.gljpanel.nohw");
- private boolean pbufferInitializationCompleted;
- private GLPbuffer pbuffer;
- private int pbufferWidth = 256;
- private int pbufferHeight = 256;
- private GLCanvas heavyweight;
- private Frame toplevel;
-
- // Implementation using software rendering
- private GLContext offscreenContext;
-
- // For saving/restoring of OpenGL state during ReadPixels
- private int[] swapbytes = new int[1];
- private int[] rowlength = new int[1];
- private int[] skiprows = new int[1];
- private int[] skippixels = new int[1];
- private int[] alignment = new int[1];
-
- GLJPanel(GLCapabilities capabilities, GLCapabilitiesChooser chooser, GLDrawable shareWith) {
- super();
-
- // Works around problems on many vendors' cards; we don't need a
- // back buffer for the offscreen surface anyway
- offscreenCaps = (GLCapabilities) capabilities.clone();
- offscreenCaps.setDoubleBuffered(false);
- this.chooser = chooser;
- this.shareWith = shareWith;
- }
-
- public void display() {
- if (!isInitialized) {
- return;
- }
-
- if (EventQueue.isDispatchThread()) {
- // Want display() to be synchronous, so call paintImmediately()
- paintImmediately(0, 0, getWidth(), getHeight());
- } else {
- // Multithreaded redrawing of Swing components is not allowed,
- // so do everything on the event dispatch thread
- try {
- EventQueue.invokeAndWait(paintImmediatelyAction);
- } catch (Exception e) {
- throw new GLException(e);
- }
- }
- }
-
- /** Overridden from JComponent; calls {@link
- GLEventListener#display}. Should not be invoked by applications
- directly. */
- public void paintComponent(Graphics g) {
- if (!isInitialized) {
- return;
- }
-
- updater.setGraphics(g);
- if (!hardwareAccelerationDisabled) {
- if (!pbufferInitializationCompleted) {
- try {
- heavyweight.display();
- pbuffer.display();
- } catch (GLException e) {
- if (DEBUG) {
- e.printStackTrace();
- }
- // We consider any exception thrown during updating of the
- // heavyweight or pbuffer during the initialization phases
- // to be an indication that there was a problem
- // instantiating the pbuffer, regardless of whether the
- // exception originated in the user's GLEventListener. In
- // these cases we immediately back off and use software
- // rendering.
- disableHardwareRendering();
- }
- } else {
- pbuffer.display();
- }
- } else {
- offscreenContext.invokeGL(displayAction, false, initAction);
- }
- }
-
- public void addNotify() {
- super.addNotify();
- initialize();
- if (DEBUG) {
- System.err.println("GLJPanel.addNotify()");
- }
- }
-
- /** Overridden from JPanel; used to indicate that it's no longer
- safe to have an OpenGL context for the component. */
- public void removeNotify() {
- if (DEBUG) {
- System.err.println("GLJPanel.removeNotify()");
- }
- if (!hardwareAccelerationDisabled) {
- if (pbuffer != null) {
- pbuffer.destroy();
- }
- if (toplevel != null) {
- toplevel.dispose();
- }
- pbuffer = null;
- heavyweight = null;
- toplevel = null;
- } else {
- offscreenContext.destroy();
- }
- isInitialized = false;
- super.removeNotify();
- }
-
- /** Overridden from Canvas; causes {@link GLDrawableHelper#reshape}
- to be called on all registered {@link GLEventListener}s. Called
- automatically by the AWT; should not be invoked by applications
- directly. */
- public void reshape(int x, int y, int width, int height) {
- super.reshape(x, y, width, height);
-
- if (!isInitialized) {
- return;
- }
-
- // Move all reshape requests onto AWT EventQueue thread
- final int fx = x;
- final int fy = y;
- final int fwidth = width;
- final int fheight = height;
-
- Runnable r = new Runnable() {
- public void run() {
- GLContext context = null;
- readBackWidthInPixels = 0;
- readBackHeightInPixels = 0;
-
- if (!hardwareAccelerationDisabled) {
- // Use factor larger than 2 during shrinks for some hysteresis
- float shrinkFactor = 2.5f;
- if ((fwidth > pbufferWidth ) || (fheight > pbufferHeight) ||
- (fwidth < (pbufferWidth / shrinkFactor)) || (fheight < (pbufferWidth / shrinkFactor))) {
- if (DEBUG) {
- System.err.println("Resizing pbuffer from (" + pbufferWidth + ", " + pbufferHeight + ") " +
- " to fit (" + fwidth + ", " + fheight + ")");
- }
- // Must destroy and recreate pbuffer to fit
- if (pbuffer != null) {
- pbuffer.destroy();
- }
- if (toplevel != null) {
- toplevel.dispose();
- }
- pbuffer = null;
- isInitialized = false;
- pbufferWidth = getNextPowerOf2(fwidth);
- pbufferHeight = getNextPowerOf2(fheight);
- if (DEBUG) {
- System.err.println("New pbuffer size is (" + pbufferWidth + ", " + pbufferHeight + ")");
- }
- initialize();
- }
- GLPbufferImpl pbufferImpl = (GLPbufferImpl) pbuffer;
- context = pbufferImpl.getContext();
- // It looks like NVidia's drivers (at least the ones on my
- // notebook) are buggy and don't allow a rectangle of less than
- // the pbuffer's width to be read...this doesn't really matter
- // because it's the Graphics.drawImage() calls that are the
- // bottleneck. Should probably make the size of the offscreen
- // image be the exact size of the pbuffer to save some work on
- // resize operations...
- readBackWidthInPixels = pbufferWidth;
- readBackHeightInPixels = fheight;
- } else {
- offscreenContext.resizeOffscreenContext(fwidth, fheight);
- context = offscreenContext;
- readBackWidthInPixels = fwidth;
- readBackHeightInPixels = fheight;
- }
-
- if (offscreenImage != null) {
- offscreenImage.flush();
- offscreenImage = null;
- }
-
- panelWidth = fwidth;
- panelHeight = fheight;
-
- context.invokeGL(new Runnable() {
- public void run() {
- getGL().glViewport(0, 0, panelWidth, panelHeight);
- drawableHelper.reshape(GLJPanel.this, 0, 0, panelWidth, panelHeight);
- }
- }, true, initAction);
- }
- };
- if (EventQueue.isDispatchThread()) {
- r.run();
- } else {
- // Avoid blocking EventQueue thread due to possible deadlocks
- // during component creation
- EventQueue.invokeLater(r);
- }
- }
-
- public void setOpaque(boolean opaque) {
- if (opaque != isOpaque()) {
- if (offscreenImage != null) {
- offscreenImage.flush();
- offscreenImage = null;
- }
- }
- super.setOpaque(opaque);
- }
-
- public void addGLEventListener(GLEventListener listener) {
- drawableHelper.addGLEventListener(listener);
- }
-
- public void removeGLEventListener(GLEventListener listener) {
- drawableHelper.removeGLEventListener(listener);
- }
-
- public GL getGL() {
- if (!hardwareAccelerationDisabled) {
- if (pbuffer == null) {
- return null;
- }
- return pbuffer.getGL();
- } else {
- if (offscreenContext == null) {
- return null;
- }
- return offscreenContext.getGL();
- }
- }
-
- public void setGL(GL gl) {
- if (!hardwareAccelerationDisabled) {
- if (pbuffer != null) {
- pbuffer.setGL(gl);
- }
- } else {
- if (offscreenContext != null) {
- offscreenContext.setGL(gl);
- }
- }
- }
-
- public GLU getGLU() {
- if (!hardwareAccelerationDisabled) {
- return pbuffer.getGLU();
- } else {
- return offscreenContext.getGLU();
- }
- }
-
- public void setGLU(GLU glu) {
- if (!hardwareAccelerationDisabled) {
- pbuffer.setGLU(glu);
- } else {
- offscreenContext.setGLU(glu);
- }
- }
-
- public void setRenderingThread(Thread currentThreadOrNull) throws GLException {
- // Not supported for GLJPanel because all repaint requests must be
- // handled by the AWT thread
- }
-
- public Thread getRenderingThread() {
- return null;
- }
-
- public void setNoAutoRedrawMode(boolean noAutoRedraws) {
- }
-
- public boolean getNoAutoRedrawMode() {
- return false;
- }
-
- public void setAutoSwapBufferMode(boolean onOrOff) {
- if (!hardwareAccelerationDisabled) {
- pbuffer.setAutoSwapBufferMode(onOrOff);
- } else {
- offscreenContext.setAutoSwapBufferMode(onOrOff);
- }
- }
-
- public boolean getAutoSwapBufferMode() {
- if (!hardwareAccelerationDisabled) {
- return pbuffer.getAutoSwapBufferMode();
- } else {
- return offscreenContext.getAutoSwapBufferMode();
- }
- }
-
- public void swapBuffers() {
- if (!hardwareAccelerationDisabled) {
- pbuffer.swapBuffers();
- } else {
- offscreenContext.invokeGL(swapBuffersAction, false, initAction);
- }
- }
-
- public boolean canCreateOffscreenDrawable() {
- // For now let's say no, although we could using the heavyweight
- // if hardware acceleration is still enabled
- return false;
- }
-
- public GLPbuffer createOffscreenDrawable(GLCapabilities capabilities,
- int initialWidth,
- int initialHeight) {
- throw new GLException("Not supported");
- }
-
- GLContext getContext() {
- if (!hardwareAccelerationDisabled) {
- return ((GLPbufferImpl) pbuffer).getContext();
- } else {
- return offscreenContext;
- }
- }
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- private void disableHardwareRendering() {
- if (Debug.verbose()) {
- System.err.println("GLJPanel: Falling back on software rendering due to pbuffer problems");
- }
- hardwareAccelerationDisabled = true;
- pbufferInitializationCompleted = false;
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- toplevel.setVisible(false);
- // Should dispose of this -- not sure about stability on
- // various cards -- should test (FIXME)
- // toplevel.dispose();
- }
- });
- initialize();
- }
-
- private void initialize() {
- // Initialize either the hardware-accelerated rendering path or
- // the lightweight rendering path
- if (!hardwareAccelerationDisabled) {
- boolean firstTime = false;
- if (heavyweight == null) {
- // Make the heavyweight share with the "shareWith" parameter.
- // The pbuffer shares textures and display lists with the
- // heavyweight, so by transitivity the pbuffer will share with
- // it as well.
- heavyweight = GLDrawableFactory.getFactory().createGLCanvas(new GLCapabilities(), shareWith);
- firstTime = true;
- }
- if (heavyweight.canCreateOffscreenDrawable()) {
- if (firstTime) {
- toplevel = new Frame();
- toplevel.setUndecorated(true);
- }
- pbuffer = heavyweight.createOffscreenDrawable(offscreenCaps, pbufferWidth, pbufferHeight);
- updater = new Updater();
- pbuffer.addGLEventListener(updater);
- pbufferInitializationCompleted = false;
- if (firstTime) {
- toplevel.add(heavyweight);
- toplevel.setSize(1, 1);
- }
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- try {
- toplevel.setVisible(true);
- } catch (GLException e) {
- if (DEBUG) {
- e.printStackTrace();
- }
- disableHardwareRendering();
- }
- }
- });
- isInitialized = true;
- return;
- } else {
- // If the heavyweight reports that it can't create an
- // offscreen drawable (pbuffer), don't try again the next
- // time, and fall through to the software rendering path
- hardwareAccelerationDisabled = true;
- }
- }
-
- // Create an offscreen context instead
- offscreenContext = GLContextFactory.getFactory().createGLContext(null, offscreenCaps, chooser,
- GLContextHelper.getContext(shareWith));
- offscreenContext.resizeOffscreenContext(panelWidth, panelHeight);
- updater = new Updater();
- if (panelWidth > 0 && panelHeight > 0) {
- offscreenContext.invokeGL(new Runnable() {
- public void run() {
- getGL().glViewport(0, 0, panelWidth, panelHeight);
- drawableHelper.reshape(GLJPanel.this, 0, 0, panelWidth, panelHeight);
- }
- }, true, initAction);
- }
-
- isInitialized = true;
- }
-
- class Updater implements GLEventListener {
- private Graphics g;
-
- public void setGraphics(Graphics g) {
- this.g = g;
- }
-
- public void init(GLDrawable drawable) {
- if (!hardwareAccelerationDisabled) {
- if (DEBUG) {
- System.err.println("GLJPanel$Updater.init(): pbufferInitializationCompleted = true");
- }
- pbufferInitializationCompleted = true;
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- // Race conditions might dispose of this before now
- if (toplevel != null) {
- toplevel.setVisible(false);
- }
- }
- });
- }
- drawableHelper.init(GLJPanel.this);
- }
-
- public void display(GLDrawable drawable) {
- drawableHelper.display(GLJPanel.this);
-
- // Must now copy pixels from offscreen context into surface
- if (offscreenImage == null) {
- if (panelWidth > 0 && panelHeight > 0) {
- // It looks like NVidia's drivers (at least the ones on my
- // notebook) are buggy and don't allow a sub-rectangle to be
- // read from a pbuffer...this doesn't really matter because
- // it's the Graphics.drawImage() calls that are the
- // bottleneck
-
- int awtFormat = 0;
- int hwGLFormat = 0;
- if (!hardwareAccelerationDisabled) {
- // This seems to be a good choice on all platforms
- hwGLFormat = GL.GL_UNSIGNED_INT_8_8_8_8_REV;
- }
-
- // Should be more flexible in these BufferedImage formats;
- // perhaps see what the preferred image types are on the
- // given platform
- if (isOpaque()) {
- awtFormat = BufferedImage.TYPE_INT_RGB;
- } else {
- awtFormat = BufferedImage.TYPE_INT_ARGB;
- }
-
- offscreenImage = new BufferedImage(panelWidth,
- panelHeight,
- awtFormat);
- switch (awtFormat) {
- case BufferedImage.TYPE_3BYTE_BGR:
- glFormat = GL.GL_BGR;
- glType = GL.GL_UNSIGNED_BYTE;
- readBackBytes = new byte[readBackWidthInPixels * readBackHeightInPixels * 3];
- break;
-
- case BufferedImage.TYPE_INT_RGB:
- case BufferedImage.TYPE_INT_ARGB:
- glFormat = GL.GL_BGRA;
- glType = (hardwareAccelerationDisabled
- ? offscreenContext.getOffscreenContextPixelDataType()
- : hwGLFormat);
- readBackInts = new int[readBackWidthInPixels * readBackHeightInPixels];
- break;
-
- default:
- // FIXME: Support more off-screen image types (current
- // offscreen context implementations don't use others, and
- // some of the OpenGL formats aren't supported in the 1.1
- // headers, which we're currently using)
- throw new GLException("Unsupported offscreen image type " + awtFormat);
- }
- }
- }
-
- if (offscreenImage != null) {
- GL gl = getGL();
- // Save current modes
- gl.glGetIntegerv(GL.GL_PACK_SWAP_BYTES, swapbytes);
- gl.glGetIntegerv(GL.GL_PACK_ROW_LENGTH, rowlength);
- gl.glGetIntegerv(GL.GL_PACK_SKIP_ROWS, skiprows);
- gl.glGetIntegerv(GL.GL_PACK_SKIP_PIXELS, skippixels);
- gl.glGetIntegerv(GL.GL_PACK_ALIGNMENT, alignment);
-
- gl.glPixelStorei(GL.GL_PACK_SWAP_BYTES, GL.GL_FALSE);
- gl.glPixelStorei(GL.GL_PACK_ROW_LENGTH, readBackWidthInPixels);
- gl.glPixelStorei(GL.GL_PACK_SKIP_ROWS, 0);
- gl.glPixelStorei(GL.GL_PACK_SKIP_PIXELS, 0);
- gl.glPixelStorei(GL.GL_PACK_ALIGNMENT, 1);
-
- // Actually read the pixels.
- gl.glReadBuffer(GL.GL_FRONT);
- if (readBackBytes != null) {
- gl.glReadPixels(0, 0, readBackWidthInPixels, readBackHeightInPixels, glFormat, glType, readBackBytes);
- } else if (readBackInts != null) {
- gl.glReadPixels(0, 0, readBackWidthInPixels, readBackHeightInPixels, glFormat, glType, readBackInts);
- }
-
- // Restore saved modes.
- gl.glPixelStorei(GL.GL_PACK_SWAP_BYTES, swapbytes[0]);
- gl.glPixelStorei(GL.GL_PACK_ROW_LENGTH, rowlength[0]);
- gl.glPixelStorei(GL.GL_PACK_SKIP_ROWS, skiprows[0]);
- gl.glPixelStorei(GL.GL_PACK_SKIP_PIXELS, skippixels[0]);
- gl.glPixelStorei(GL.GL_PACK_ALIGNMENT, alignment[0]);
-
- if (readBackBytes != null || readBackInts != null) {
- // Copy temporary data into raster of BufferedImage for faster
- // blitting Note that we could avoid this copy in the cases
- // where !offscreenContext.offscreenImageNeedsVerticalFlip(),
- // but that's the software rendering path which is very slow
- // anyway
- Object src = null;
- Object dest = null;
- int srcIncr = 0;
- int destIncr = 0;
-
- if (readBackBytes != null) {
- src = readBackBytes;
- dest = ((DataBufferByte) offscreenImage.getRaster().getDataBuffer()).getData();
- srcIncr = readBackWidthInPixels * 3;
- destIncr = offscreenImage.getWidth() * 3;
- } else {
- src = readBackInts;
- dest = ((DataBufferInt) offscreenImage.getRaster().getDataBuffer()).getData();
- srcIncr = readBackWidthInPixels;
- destIncr = offscreenImage.getWidth();
- }
-
- if (!hardwareAccelerationDisabled ||
- offscreenContext.offscreenImageNeedsVerticalFlip()) {
- int srcPos = 0;
- int destPos = (offscreenImage.getHeight() - 1) * destIncr;
- for (; destPos >= 0; srcPos += srcIncr, destPos -= destIncr) {
- System.arraycopy(src, srcPos, dest, destPos, destIncr);
- }
- } else {
- int srcPos = 0;
- int destEnd = destIncr * offscreenImage.getHeight();
- for (int destPos = 0; destPos < destEnd; srcPos += srcIncr, destPos += destIncr) {
- System.arraycopy(src, srcPos, dest, destPos, destIncr);
- }
- }
-
- // Draw resulting image in one shot
- g.drawImage(offscreenImage, 0, 0, offscreenImage.getWidth(), offscreenImage.getHeight(), GLJPanel.this);
- }
- }
- }
-
- public void reshape(GLDrawable drawable, int x, int y, int width, int height) {
- // This is handled above and dispatched directly to the appropriate context
- }
-
- public void displayChanged(GLDrawable drawable, boolean modeChanged, boolean deviceChanged) {
- }
- }
-
- class InitAction implements Runnable {
- public void run() {
- updater.init(GLJPanel.this);
- }
- }
- private InitAction initAction = new InitAction();
-
- class DisplayAction implements Runnable {
- public void run() {
- updater.display(GLJPanel.this);
- }
- }
- private DisplayAction displayAction = new DisplayAction();
-
- // This one is used exclusively in the non-hardware-accelerated case
- class SwapBuffersAction implements Runnable {
- public void run() {
- offscreenContext.swapBuffers();
- }
- }
- private SwapBuffersAction swapBuffersAction = new SwapBuffersAction();
-
- class PaintImmediatelyAction implements Runnable {
- public void run() {
- paintImmediately(0, 0, getWidth(), getHeight());
- }
- }
- private PaintImmediatelyAction paintImmediatelyAction = new PaintImmediatelyAction();
-
- private int getNextPowerOf2(int number) {
- // Workaround for problems where 0 width or height are transiently
- // seen during layout
- if (number == 0) {
- return 2;
- }
-
- if (((number-1) & number) == 0) {
- //ex: 8 -> 0b1000; 8-1=7 -> 0b0111; 0b1000&0b0111 == 0
- return number;
- }
- int power = 0;
- while (number > 0) {
- number = number>>1;
- power++;
- }
- return (1<<power);
- }
-}
diff --git a/src/net/java/games/jogl/impl/GLContext.java b/src/net/java/games/jogl/impl/GLContext.java
deleted file mode 100644
index 41fa98c4b..000000000
--- a/src/net/java/games/jogl/impl/GLContext.java
+++ /dev/null
@@ -1,764 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl.impl;
-
-import java.awt.Component;
-import net.java.games.jogl.*;
-import net.java.games.gluegen.runtime.*;
-
-public abstract class GLContext {
- protected static final boolean DEBUG = Debug.debug("GLContext");
- protected static final boolean VERBOSE = Debug.verbose();
- protected static final boolean NO_FREE = Debug.isPropertyDefined("jogl.GLContext.nofree");
-
- static {
- NativeLibLoader.load();
- }
-
- protected Component component;
-
- // Indicates whether the component (if an onscreen context) has been
- // realized. Plausibly, before the component is realized the JAWT
- // should return an error or NULL object from some of its
- // operations; this appears to be the case on Win32 but is not true
- // at least with Sun's current X11 implementation (1.4.x), which
- // crashes with no other error reported if the DrawingSurfaceInfo is
- // fetched from a locked DrawingSurface during the validation as a
- // result of calling show() on the main thread. To work around this
- // we prevent any JAWT or OpenGL operations from being done until
- // addNotify() is called on the component.
- protected boolean realized;
-
- protected GLCapabilities capabilities;
- protected GLCapabilitiesChooser chooser;
- protected GL gl;
- protected static final GLUProcAddressTable gluProcAddressTable = new GLUProcAddressTable();
- protected static boolean haveResetGLUProcAddressTable;
- protected GLU glu = new GLUImpl(gluProcAddressTable);
- protected Thread renderingThread;
- protected Runnable deferredReshapeAction;
- // Support for OpenGL context destruction and recreation in the face
- // of the setRenderingThread optimization, which makes the context
- // permanently current on the animation thread. FIXME: should make
- // this more uniform and general, possibly by implementing in terms
- // of Runnables; however, necessary sequence of operations in
- // invokeGL makes this tricky.
- protected boolean deferredDestroy;
- protected boolean deferredSetRealized;
-
- // Error checking for setRenderingThread to ensure that one thread
- // doesn't attempt to call setRenderingThread on more than one
- // drawable
- protected static final ThreadLocal perThreadRenderingContext = new ThreadLocal();
-
- // This is a workaround for a bug in NVidia's drivers where
- // vertex_array_range is only safe for single-threaded use; a bug
- // has been filed, ID 80174. When an Animator is created for a
- // GLDrawable, the expectation is that the Animator will be started
- // shortly and that the user doesn't want rendering to occur from
- // the AWT thread. However, there is a small window between when the
- // Animator is created and attached to the GLDrawable and when it's
- // started (and sets the rendering thread) when repaint events can
- // be issued by the AWT thread if the component is realized. To work
- // around this problem, we currently specify in the Animator's API
- // that between the time it's created and started no redraws will
- // occur.
- protected volatile boolean willSetRenderingThread;
-
- // Flag for disabling all repaint and resize processing on the AWT
- // thread to avoid application-level deadlocks; only really used for
- // GLCanvas
- protected boolean noAutoRedraw;
-
- // Flag for enabling / disabling automatic swapping of the front and
- // back buffers
- protected boolean autoSwapBuffers = true;
-
- // Offscreen context handling. Offscreen contexts should handle
- // these resize requests in makeCurrent and clear the
- // pendingOffscreenResize flag.
- protected boolean pendingOffscreenResize;
- protected int pendingOffscreenWidth;
- protected int pendingOffscreenHeight;
-
- // Cache of the functions that are available to be called at the current
- // moment in time
- protected FunctionAvailabilityCache functionAvailability;
-
- // Support for recursive makeCurrent() calls as well as calling
- // other drawables' display() methods from within another one's
- protected static final ThreadLocal perThreadContextStack = new ThreadLocal() {
- protected synchronized Object initialValue() {
- return new GLContextStack();
- }
- };
- // This thread-local variable helps implement setRenderingThread()'s
- // optimized context handling. When the bottommost invokeGL() on the
- // execution stack finishes for the rendering thread for that
- // context, we pop the context off the context stack but do not free
- // it, instead storing it in this thread-local variable. This gives
- // us enough information to recover the context stack state in
- // subsequent invokeGL() calls.
- protected static final ThreadLocal perThreadSavedCurrentContext = new ThreadLocal() {
- protected synchronized Object initialValue() {
- return new GLContextInitActionPair(null, null);
- }
- };
-
- public GLContext(Component component,
- GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLContext shareWith) {
- this.component = component;
- this.capabilities = (GLCapabilities) capabilities.clone();
- this.chooser = chooser;
- setGL(createGL());
- functionAvailability = new FunctionAvailabilityCache(this);
- if (shareWith != null) {
- GLContextShareSet.registerSharing(this, shareWith);
- }
- }
-
- /** Runs the given runnable with this OpenGL context valid. */
- public synchronized void invokeGL(Runnable runnable, boolean isReshape, Runnable initAction) throws GLException {
- // Could be more clever about not calling this every time, but
- // Thread.currentThread() is very fast and this makes the logic simpler
- Thread currentThread = Thread.currentThread();
-
- // Defer JAWT and OpenGL operations until onscreen components are
- // realized
- if (!isRealized() ||
- willSetRenderingThread ||
- (renderingThread != null &&
- renderingThread != currentThread)) {
- // Support for removeNotify()/addNotify() when the
- // setRenderingThread optimization is in effect and before the
- // animation thread gets a chance to handle either request
- if (!isRealized() && deferredSetRealized) {
- setRealized();
- deferredSetRealized = false;
- } else {
- if (isReshape) {
- deferredReshapeAction = runnable;
- }
- return;
- }
- }
-
- if (isReshape && noAutoRedraw && !SingleThreadedWorkaround.doWorkaround()) {
- // Don't process reshape requests on the AWT thread
- deferredReshapeAction = runnable;
- return;
- }
-
- if (deferredDestroy) {
- deferredDestroy = false;
- if (renderingThread != null) {
- // Need to disable the setRenderingThread optimization to free
- // up the context
- setRenderingThread(null, initAction);
- }
- destroy();
- return;
- }
-
- // The goal of this code is to optimize OpenGL context handling as
- // much as possible. In particular:
- //
- // - setRenderingThread() works by making the "bottommost" OpenGL
- // context current once and not freeing it until the rendering
- // thread has been unset. Note that subsequent pushes of other
- // contexts will still necessarily cause them to be made current
- // and freed.
- //
- // - If the same context is pushed on the per-thread context stack
- // more than once back-to-back, the subsequent pushes will not
- // actually cause a makeCurrent/free to occur.
- //
- // Complexities occur because setRenderingThread() can be called
- // at any time. Currently we implement the rendering thread
- // optimization by popping it off the OpenGL context stack and
- // storing it in a thread-local variable.
-
- GLContextStack ctxStack = getPerThreadContextStack();
- GLContext savedPerThreadContext = getPerThreadSavedCurrentContext();
- Runnable savedPerThreadInitAction = getPerThreadSavedInitAction();
- setPerThreadSavedCurrentContext(null, null);
- if (ctxStack.size() == 0 &&
- savedPerThreadContext != null) {
- // The setRenderingThread optimization moved the current context
- // into thread-local storage. Put it back on the context stack,
- // because we might need to free it later.
- ctxStack.push(savedPerThreadContext, savedPerThreadInitAction);
- }
-
- GLContext curContext = ctxStack.peekContext();
- Runnable curInitAction = ctxStack.peekInitAction();
- boolean mustDoMakeCurrent = true;
-
- if (curContext == this) {
- mustDoMakeCurrent = false;
- }
-
- if (mustDoMakeCurrent) {
- if (curContext != null) {
- if (DEBUG && VERBOSE) {
- System.err.println(getThreadName() + ": Freeing context " + curContext + " due to recursive makeCurrent");
- }
- curContext.free();
- }
-
- if (!makeCurrent(initAction)) {
- // Couldn't make the thread current because the component has not yet
- // been visualized, and therefore the context cannot be created.
- // We'll defer any actions until invokeGL() is called again at a time
- // when the component has been visualized.
- if (isReshape) {
- deferredReshapeAction = runnable;
- }
-
- // Clean up after ourselves on the way out.
- // NOTE that this is an abbreviated version of the code below
- // and should probably be refactored/cleaned up -- this bug
- // fix was done without a lot of intense thought about the
- // situation
- if (curContext != null) {
- curContext.makeCurrent(curInitAction);
- }
- return;
- }
- if (DEBUG && VERBOSE) {
- System.err.println(getThreadName() + ": Making context " + this + " current");
- }
- }
- ctxStack.push(this, initAction);
-
- // At this point the OpenGL context is current. Offscreen contexts
- // handle resizing the backing bitmap in makeCurrent. Therefore we
- // may need to free and make the context current again if we
- // didn't actually make it current above.
- if (pendingOffscreenResize && renderingThread != null) {
- ctxStack.pop();
- free();
- if (!makeCurrent(initAction)) {
- throw new GLException("Error while resizing offscreen context");
- }
- ctxStack.push(this, initAction);
- }
-
- RuntimeException userException = null;
- GLException internalException = null;
-
- try {
- if (deferredReshapeAction != null) {
- deferredReshapeAction.run();
- deferredReshapeAction = null;
- }
- runnable.run();
- if (autoSwapBuffers && !isReshape) {
- swapBuffers();
- }
- } catch (RuntimeException e) {
- userException = e;
- throw(userException);
- } finally {
- if (userException != null) {
- // Disallow setRenderingThread if display action is throwing exceptions
- renderingThread = null;
- }
-
- boolean mustSkipFreeForRenderingThread = false;
- if (currentThread == renderingThread && curContext == null) {
- mustSkipFreeForRenderingThread = true;
- setPerThreadSavedCurrentContext(this, initAction);
- }
-
- // Always pop myself off the per-thread context stack
- ctxStack.pop();
-
- // Free the context unless the setRenderingThread optimization
- // kicks in.
- if (mustDoMakeCurrent && !mustSkipFreeForRenderingThread) {
- if (DEBUG && VERBOSE) {
- System.err.println(getThreadName() + ": Freeing context " + this);
- }
-
- try {
- free();
- } catch (GLException e) {
- internalException = e;
- }
-
- if (curContext != null) {
- if (DEBUG && VERBOSE) {
- System.err.println(getThreadName() + ": Making context " + curContext + " current again");
- }
- try {
- curContext.makeCurrent(curInitAction);
- } catch (GLException e) {
- internalException = e;
- }
- }
- }
-
- // Check to see whether we pushed any remaining entry on the
- // per-thread context stack. If so, put it back in thread-local
- // storage unless the rendering thread optimization was recently
- // disabled.
- if (savedPerThreadContext != null) {
- assert(savedPerThreadContext == curContext);
- ctxStack.pop();
- if (savedPerThreadContext.getRenderingThread() == null) {
- try {
- savedPerThreadContext.free();
- } catch (GLException e) {
- internalException = e;
- }
- } else {
- setPerThreadSavedCurrentContext(savedPerThreadContext, savedPerThreadInitAction);
- }
- }
-
- // Make sure the end user's exception shows up in any stack
- // traces; the rethrow of the userException above should take
- // precedence if the internalException will otherwise squelch it
- if (internalException != null) {
- if (userException != null &&
- internalException.getCause() == null) {
- internalException.initCause(userException);
- throw(internalException);
- } else if (userException == null) {
- throw(internalException);
- }
- }
- }
- }
-
- public GL getGL() {
- return gl;
- }
-
- public void setGL(GL gl) {
- this.gl = gl;
- // Also reset the GL object for the pure-Java GLU implementation
- ((GLUImpl) glu).setGL(gl);
- }
-
- public GLU getGLU() {
- return glu;
- }
-
- public void setGLU(GLU glu) {
- this.glu = glu;
- }
-
- /** Gives a hint to the context that setRenderingThread will be
- called in the near future; causes redraws to be halted. This is
- a workaround for bugs in NVidia's drivers and is used only by
- the Animator class. */
- public synchronized void willSetRenderingThread() {
- this.willSetRenderingThread = true;
- }
-
- public synchronized void setRenderingThread(Thread currentThreadOrNull, Runnable initAction) {
- if (SingleThreadedWorkaround.doWorkaround()) {
- willSetRenderingThread = false;
- return;
- }
-
- Thread currentThread = Thread.currentThread();
- if (currentThreadOrNull != null && currentThreadOrNull != currentThread) {
- throw new GLException("Argument must be either the current thread or null");
- }
- if (renderingThread != null && currentThreadOrNull != null) {
- throw new GLException("Attempt to re-set or change rendering thread");
- }
- if (renderingThread == null && currentThreadOrNull == null) {
- throw new GLException("Attempt to clear rendering thread when already cleared");
- }
-
- Object currentThreadRenderingContext = perThreadRenderingContext.get();
- if (currentThreadOrNull != null &&
- currentThreadRenderingContext != null &&
- currentThreadRenderingContext != this) {
- throw new GLException("Attempt to call setRenderingThread on more than one drawable in this thread");
- }
-
- this.willSetRenderingThread = false;
- if (currentThreadOrNull == null) {
- renderingThread = null;
- perThreadRenderingContext.set(null);
- // Just in case the end user wasn't planning on drawing the
- // drawable even once more (which would give us a chance to free
- // the context), try to free the context now by performing an
- // invokeGL with a do-nothing action
- invokeGL(new Runnable() {
- public void run() {
- }
- }, false, initAction);
- } else {
- renderingThread = currentThreadOrNull;
- perThreadRenderingContext.set(this);
- }
- }
-
- public Thread getRenderingThread() {
- return renderingThread;
- }
-
- public void setNoAutoRedrawMode(boolean noAutoRedraw) {
- this.noAutoRedraw = noAutoRedraw;
- }
-
- public boolean getNoAutoRedrawMode() {
- return noAutoRedraw;
- }
-
- public void setAutoSwapBufferMode(boolean autoSwapBuffers) {
- this.autoSwapBuffers = autoSwapBuffers;
- }
-
- public boolean getAutoSwapBufferMode() {
- return autoSwapBuffers;
- }
-
- /** Swaps the buffers of the OpenGL context if necessary. All error
- conditions cause a GLException to be thrown. */
- public abstract void swapBuffers() throws GLException;
-
- /** Routine needed only for offscreen contexts in order to resize
- the underlying bitmap. Called by GLJPanel. */
- public void resizeOffscreenContext(int newWidth, int newHeight) {
- if (!isOffscreen()) {
- throw new GLException("Should only call for offscreen OpenGL contexts");
- }
- pendingOffscreenResize = true;
- pendingOffscreenWidth = newWidth;
- pendingOffscreenHeight = newHeight;
- }
-
- /** Indicates which floating-point pbuffer implementation is in
- use. Returns one of GLPbuffer.APPLE_FLOAT, GLPbuffer.ATI_FLOAT,
- or GLPbuffer.NV_FLOAT. */
- public int getFloatingPointMode() throws GLException {
- throw new GLException("Not supported on non-pbuffer contexts");
- }
-
- /** Returns a non-null (but possibly empty) string containing the
- space-separated list of available platform-dependent (e.g., WGL,
- GLX) extensions. Can only be called while this context is
- current. */
- public abstract String getPlatformExtensionsString();
-
- /**
- * Resets the cache of which GL functions are available for calling through this
- * context. See {@link #isFunctionAvailable(String)} for more information on
- * the definition of "available".
- */
- protected void resetGLFunctionAvailability() {
- // In order to be able to allow the user to uniformly install the
- // debug and trace pipelines in their GLEventListener.init()
- // method (for both GLCanvas and GLJPanel), we need to reset the
- // actual GL object in the GLDrawable as well
- setGL(createGL());
-
- functionAvailability.flush();
- if (!haveResetGLUProcAddressTable) {
- if (DEBUG) {
- System.err.println(getThreadName() + ": !!! Initializing GLU extension address table");
- }
- resetProcAddressTable(gluProcAddressTable);
- haveResetGLUProcAddressTable = true; // Only need to do this once globally
- }
- recomputeSingleThreadedWorkaround();
- }
-
- /**
- * Returns true if the specified OpenGL core- or extension-function can be
- * successfully called using this GL context given the current host (OpenGL
- * <i>client</i>) and display (OpenGL <i>server</i>) configuration.
- *
- * See {@link GL#isFunctionAvailable(String)} for more details.
- *
- * @param glFunctionName the name of the OpenGL function (e.g., use
- * "glPolygonOffsetEXT" to check if the {@link
- * net.java.games.jogl.GL#glPolygonOffsetEXT(float,float)} is available).
- */
- protected boolean isFunctionAvailable(String glFunctionName) {
- return functionAvailability.isFunctionAvailable(mapToRealGLFunctionName(glFunctionName));
- }
-
- /**
- * Returns true if the specified OpenGL extension can be
- * successfully called using this GL context given the current host (OpenGL
- * <i>client</i>) and display (OpenGL <i>server</i>) configuration.
- *
- * See {@link GL#isExtensionAvailable(String)} for more details.
- *
- * @param glExtensionName the name of the OpenGL extension (e.g.,
- * "GL_VERTEX_PROGRAM_ARB").
- */
- public boolean isExtensionAvailable(String glExtensionName) {
- return functionAvailability.isExtensionAvailable(mapToRealGLExtensionName(glExtensionName));
- }
-
- /**
- * Pbuffer support; indicates whether this context is capable of
- * creating a subordinate pbuffer context (distinct from an
- * "offscreen context", which is typically software-rendered on all
- * platforms).
- */
- public abstract boolean canCreatePbufferContext();
-
- /**
- * Pbuffer support; creates a subordinate GLContext for a pbuffer
- * associated with this context.
- */
- public abstract GLContext createPbufferContext(GLCapabilities capabilities,
- int initialWidth,
- int initialHeight);
-
- /**
- * Pbuffer support; given that this is a GLContext associated with a
- * pbuffer, binds this pbuffer to its texture target.
- */
- public abstract void bindPbufferToTexture();
-
- /**
- * Pbuffer support; given that this is a GLContext associated with a
- * pbuffer, releases this pbuffer from its texture target.
- */
- public abstract void releasePbufferFromTexture();
-
- /*
- * Sets the swap interval for onscreen OpenGL contexts. Has no
- * effect for offscreen contexts.
- */
- public void setSwapInterval(final int interval) {
- }
-
- /** Maps the given "platform-independent" function name to a real function
- name. Currently this is only used to map "glAllocateMemoryNV" and
- associated routines to wglAllocateMemoryNV / glXAllocateMemoryNV. */
- protected abstract String mapToRealGLFunctionName(String glFunctionName);
-
- /** Maps the given "platform-independent" extension name to a real
- function name. Currently this is only used to map
- "GL_ARB_pbuffer" and "GL_ARB_pixel_format" to "WGL_ARB_pbuffer"
- and "WGL_ARB_pixel_format" (not yet mapped to X11). */
- protected abstract String mapToRealGLExtensionName(String glExtensionName);
-
- /** Create the GL for this context. */
- protected abstract GL createGL();
-
- /** Hook indicating whether the concrete GLContext implementation is
- offscreen and therefore whether we need to process resize
- requests. */
- protected abstract boolean isOffscreen();
-
- /** Only called for offscreen contexts; returns the buffer from
- which to read pixels (GL.GL_FRONT or GL.GL_BACK). */
- public abstract int getOffscreenContextReadBuffer();
-
- /** Only called for offscreen contexts; needed by glReadPixels */
- public abstract int getOffscreenContextWidth();
-
- /** Only called for offscreen contexts; needed by glReadPixels */
- public abstract int getOffscreenContextHeight();
-
- /** Only called for offscreen contexts; needed by glReadPixels */
- public abstract int getOffscreenContextPixelDataType();
-
- /** On some platforms the mismatch between OpenGL's coordinate
- system (origin at bottom left) and the window system's
- coordinate system (origin at top left) necessitates a vertical
- flip of pixels read from offscreen contexts. */
- public abstract boolean offscreenImageNeedsVerticalFlip();
-
- /** Attempts to make the GL context current. If necessary, creates a
- context and calls the initAction once the context is current.
- Most error conditions cause an exception to be thrown, except
- for the case where the context can not be created because the
- component has not yet been visualized. In this case makeCurrent
- returns false and the caller should abort any OpenGL event
- processing and instead return immediately. */
- protected abstract boolean makeCurrent(Runnable initAction) throws GLException;
-
- /** Frees the OpenGL context. All error conditions cause a
- GLException to be thrown. */
- protected abstract void free() throws GLException;
-
- /** Inform the system that the associated heavyweight widget has
- been realized and that it is safe to create an associated OpenGL
- context. If the widget is later destroyed then destroy() should
- be called, which will cause the underlying OpenGL context to be
- destroyed as well as the realized bit to be set to false. */
- public void setRealized() {
- if (getRenderingThread() != null &&
- Thread.currentThread() != getRenderingThread()) {
- deferredSetRealized = true;
- return;
- }
- setRealized(true);
- }
-
- /** Sets only the "realized" bit. Should be called by subclasses
- from within the destroy() implementation. */
- protected synchronized void setRealized(boolean realized) {
- this.realized = realized;
- if (DEBUG) {
- System.err.println(getThreadName() + ": GLContext.setRealized(" + realized + ") for context " + this);
- }
- }
-
- /** Indicates whether the component associated with this context has
- been realized. */
- public synchronized boolean getRealized() {
- return realized;
- }
-
- /** Destroys the underlying OpenGL context and changes the realized
- state to false. This should be called when the widget is being
- destroyed. */
- public synchronized void destroy() throws GLException {
- if (getRenderingThread() != null &&
- Thread.currentThread() != getRenderingThread()) {
- if (DEBUG) {
- System.err.println(getThreadName() + ": Deferred destroy for context " + this);
- }
- deferredDestroy = true;
- return;
- }
- setRealized(false);
- GLContextShareSet.contextDestroyed(this);
- destroyImpl();
- }
-
- /** Destroys the underlying OpenGL context. */
- protected abstract void destroyImpl() throws GLException;
-
- public synchronized boolean isRealized() {
- return (component == null || getRealized());
- }
-
- /** Helper routine which resets a ProcAddressTable generated by the
- GLEmitter by looking up anew all of its function pointers. */
- protected void resetProcAddressTable(Object table) {
- Class tableClass = table.getClass();
- java.lang.reflect.Field[] fields = tableClass.getDeclaredFields();
-
- for (int i = 0; i < fields.length; ++i) {
- String addressFieldName = fields[i].getName();
- if (!addressFieldName.startsWith(ProcAddressHelper.PROCADDRESS_VAR_PREFIX)) {
- // not a proc address variable
- continue;
- }
- int startOfMethodName = ProcAddressHelper.PROCADDRESS_VAR_PREFIX.length();
- String glFuncName = addressFieldName.substring(startOfMethodName);
- try {
- java.lang.reflect.Field addressField = tableClass.getDeclaredField(addressFieldName);
- assert(addressField.getType() == Long.TYPE);
- long newProcAddress = dynamicLookupFunction(glFuncName);
- // set the current value of the proc address variable in the table object
- addressField.setLong(table, newProcAddress);
- if (DEBUG) {
- // System.err.println(glFuncName + " = 0x" + Long.toHexString(newProcAddress));
- }
- } catch (Exception e) {
- throw new GLException("Cannot get GL proc address for method \"" +
- glFuncName + "\": Couldn't set value of field \"" + addressFieldName +
- "\" in class " + tableClass.getName(), e);
- }
- }
- }
-
- /** Dynamically looks up the given function. */
- protected abstract long dynamicLookupFunction(String glFuncName);
-
- /** Indicates whether the underlying OpenGL context has been
- created. This is used to manage sharing of display lists and
- textures between contexts. */
- public abstract boolean isCreated();
-
- /** Support for recursive makeCurrent() calls as well as calling
- other drawables' display() methods from within another one's */
- protected static GLContextStack getPerThreadContextStack() {
- return (GLContextStack) perThreadContextStack.get();
- }
-
- /** Support for setRenderingThread()'s optimized context handling */
- protected static GLContext getPerThreadSavedCurrentContext() {
- return ((GLContextInitActionPair) perThreadSavedCurrentContext.get()).getContext();
- }
-
- /** Support for setRenderingThread()'s optimized context handling */
- protected static Runnable getPerThreadSavedInitAction() {
- return ((GLContextInitActionPair) perThreadSavedCurrentContext.get()).getInitAction();
- }
-
- /** Support for setRenderingThread()'s optimized context handling */
- protected static void setPerThreadSavedCurrentContext(GLContext context, Runnable initAction) {
- perThreadSavedCurrentContext.set(new GLContextInitActionPair(context, initAction));
- }
-
- /** Support for automatic detection of whether we need to enable the
- single-threaded workaround for ATI and other vendors' cards.
- Should be called by subclasses for onscreen rendering inside
- their makeCurrent() implementation once the context is
- current. */
- private void recomputeSingleThreadedWorkaround() {
- GL gl = getGL();
- String str = gl.glGetString(GL.GL_VENDOR);
- if (str != null && str.indexOf("ATI") >= 0) {
- // Doing this instead of calling setRenderingThread(null) should
- // be OK since we are doing this very early in the maintenance
- // of the per-thread context stack, before we are actually
- // pushing any GLContext objects on it
- SingleThreadedWorkaround.shouldDoWorkaround();
- if( SingleThreadedWorkaround.doWorkaround() ) {
- renderingThread = null;
- }
- }
- }
-
- protected static String getThreadName() {
- return Thread.currentThread().getName();
- }
-}
diff --git a/src/net/java/games/jogl/impl/GLContextFactory.java b/src/net/java/games/jogl/impl/GLContextFactory.java
deleted file mode 100644
index 40a90f883..000000000
--- a/src/net/java/games/jogl/impl/GLContextFactory.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl.impl;
-
-import java.awt.Component;
-import java.awt.GraphicsConfiguration;
-import java.awt.GraphicsDevice;
-import net.java.games.jogl.*;
-
-public abstract class GLContextFactory {
- private static GLContextFactory factory;
-
- public static GLContextFactory getFactory() {
- if (factory == null) {
- try {
- String osName = System.getProperty("os.name");
- String osNameLowerCase = osName.toLowerCase();
- Class factoryClass = null;
-
- // Because there are some complications with generating all
- // platforms' Java glue code on all platforms (among them that we
- // would have to include jawt.h and jawt_md.h in the jogl
- // sources, which we currently don't have to do) we break the only
- // static dependencies with platform-specific code here using reflection.
-
- if (osNameLowerCase.startsWith("wind")) {
- factoryClass = Class.forName("net.java.games.jogl.impl.windows.WindowsGLContextFactory");
- } else if (osNameLowerCase.startsWith("mac os x")) {
- factoryClass = Class.forName("net.java.games.jogl.impl.macosx.MacOSXGLContextFactory");
- } else {
- // Assume Linux, Solaris, etc. Should probably test for these explicitly.
- factoryClass = Class.forName("net.java.games.jogl.impl.x11.X11GLContextFactory");
- }
-
- if (factoryClass == null) {
- throw new GLException("OS " + osName + " not yet supported");
- }
-
- factory = (GLContextFactory) factoryClass.newInstance();
- } catch (ClassNotFoundException e) {
- throw new GLException(e);
- } catch (InstantiationException e) {
- throw new GLException(e);
- } catch (IllegalAccessException e) {
- throw new GLException(e);
- }
- }
-
- return factory;
- }
-
- /** Selects a GraphicsConfiguration on the specified GraphicsDevice
- that matches the desired GLCapabilities according to the
- specified GLCapabilitiesChooser's selection algorithm and any
- hints provided by the underlying window system. This routine is
- currently only implemented on X11, where it is necessary to
- choose the desired visual before creating the underlying AWT
- Canvas; on other platforms it returns null, yielding the default
- behavior. */
- public abstract GraphicsConfiguration chooseGraphicsConfiguration(GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GraphicsDevice device);
-
- public abstract GLContext createGLContext(Component component,
- GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLContext shareWith);
-}
diff --git a/src/net/java/games/jogl/impl/GLContextStack.java b/src/net/java/games/jogl/impl/GLContextStack.java
deleted file mode 100755
index 089d53525..000000000
--- a/src/net/java/games/jogl/impl/GLContextStack.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl.impl;
-
-import java.util.*;
-
-/** Implements a stack of GLContext objects along with the initActions
- that need to be run if their creation is necessary. This is used
- to detect redundant makeCurrent() calls and to allow one drawable
- to call display() of another from within the first drawable's
- display() method. */
-
-public class GLContextStack {
- private ArrayList data = new ArrayList();
-
- /** Pushes this GLContext on the stack. The passed context must be non-null. */
- public void push(GLContext ctx, Runnable initAction) {
- if (ctx == null) {
- throw new IllegalArgumentException("Null contexts are not allowed here");
- }
-
- data.add(new GLContextInitActionPair(ctx, initAction));
- }
-
- /** Removes and returns the top GLContext and associated
- initialization action, or null if there is none. */
- public GLContextInitActionPair pop() {
- if (data.size() == 0) {
- return null;
- }
-
- return (GLContextInitActionPair) data.remove(data.size() - 1);
- }
-
- /** Returns the top GLContext and associated initialization action
- without removing it, or null if there is none. */
- public GLContextInitActionPair peek() {
- return peek(0);
- }
-
- /** Returns the <i>i</i>th GLContext and associated initialization
- action from the top without removing it, or null if there is
- none. */
- public GLContextInitActionPair peek(int i) {
- if (data.size() - i <= 0) {
- return null;
- }
-
- return (GLContextInitActionPair) data.get(data.size() - i - 1);
- }
-
- /** Returns the top GLContext without removing it, or null if there
- is none. */
- public GLContext peekContext() {
- return peekContext(0);
- }
-
- /** Returns the <i>i</i>th GLContext from the top without removing
- it, or null if there is none. */
- public GLContext peekContext(int i) {
- GLContextInitActionPair pair = peek(i);
- if (pair == null) {
- return null;
- }
-
- return pair.getContext();
- }
-
- /** Returns the top initialization action without removing it, or
- null if there is none. */
- public Runnable peekInitAction() {
- return peekInitAction(0);
- }
-
- /** Returns the <i>i</i>th initialization action from the top
- without removing it, or null if there is none. */
- public Runnable peekInitAction(int i) {
- GLContextInitActionPair pair = peek(i);
- if (pair == null) {
- return null;
- }
-
- return pair.getInitAction();
- }
-
- /** Returns the number of entries on the GLContext stack. */
- public int size() {
- return data.size();
- }
-}
diff --git a/src/net/java/games/jogl/impl/SingleThreadedWorkaround.java b/src/net/java/games/jogl/impl/SingleThreadedWorkaround.java
deleted file mode 100755
index f19c1fb67..000000000
--- a/src/net/java/games/jogl/impl/SingleThreadedWorkaround.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl.impl;
-
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-/** Encapsulates the workaround of running all display operations on
- the AWT event queue thread for the purposes of working around
- problems seen primarily on ATI cards when rendering into a surface
- that is simultaneously being resized by the event queue thread.
- <p>
-
- As of JOGL 1.1 b10, this property defaults to true. Problems have
- been seen on Windows, Linux and Mac OS X platforms that are solved
- by switching all OpenGL work to a single thread, which this
- workaround provides. The forthcoming JSR-231 work will rethink how
- such a mechanism is implemented, but the core result of needing to
- perform all OpenGL work on a single thread for best compatibility
- will remain.
-*/
-
-public class SingleThreadedWorkaround {
- private static boolean singleThreadedWorkaround = true;
- // If the user specified the workaround's system property (either
- // true or false), don't let the automatic detection have any effect
- private static boolean systemPropertySpecified = false;
-
- static {
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- String workaround = System.getProperty("jogl.1thread");
- if (workaround == null) {
- // Old system property (for compatibility)
- workaround = System.getProperty("JOGL_SINGLE_THREADED_WORKAROUND");
- }
- if (workaround == null) {
- // Older system property (for compatibility)
- workaround = System.getProperty("ATI_WORKAROUND");
- }
- if (workaround != null && (!workaround.equals("auto"))) {
- systemPropertySpecified = true;
- singleThreadedWorkaround = Boolean.valueOf(workaround).booleanValue();
- }
- printWorkaroundNotice();
- return null;
- }
- });
- }
-
- /** Public method for users to disable the single-threaded
- workaround in application code. Should perhaps eventually
- promote this method to the public API. */
- public static void disableWorkaround() {
- systemPropertySpecified = true;
- singleThreadedWorkaround = false;
- if (Debug.verbose()) {
- System.err.println("Application forced disabling of single-threaded workaround of dispatching display() on event thread");
- }
- }
-
- public static void shouldDoWorkaround() {
- if (!systemPropertySpecified) {
- singleThreadedWorkaround = true;
- printWorkaroundNotice();
- }
- }
-
- public static boolean doWorkaround() {
- return singleThreadedWorkaround;
- }
-
- private static void printWorkaroundNotice() {
- if (singleThreadedWorkaround && Debug.verbose()) {
- System.err.println("Using single-threaded workaround of dispatching display() on event thread");
- }
- }
-}
diff --git a/src/net/java/games/jogl/impl/macosx/MacOSXOnscreenGLContext.java b/src/net/java/games/jogl/impl/macosx/MacOSXOnscreenGLContext.java
deleted file mode 100644
index ba4eee0ef..000000000
--- a/src/net/java/games/jogl/impl/macosx/MacOSXOnscreenGLContext.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl.impl.macosx;
-
-import java.awt.Component;
-import java.util.*;
-
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
-
-import java.security.*;
-
-public class MacOSXOnscreenGLContext extends MacOSXGLContext {
- // Variables for lockSurface/unlockSurface
- private JAWT_DrawingSurface ds;
- private JAWT_DrawingSurfaceInfo dsi;
- private JAWT_MacOSXDrawingSurfaceInfo macosxdsi;
-
- // Variables for pbuffer support
- List pbuffersToInstantiate = new ArrayList();
-
- // Workaround for instance of 4796548
- private boolean firstLock = true;
-
- public MacOSXOnscreenGLContext(Component component,
- GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLContext shareWith) {
- super(component, capabilities, chooser, shareWith);
- }
-
- protected boolean isOffscreen() {
- return false;
- }
-
- public int getOffscreenContextReadBuffer() {
- throw new GLException("Should not call this");
- }
-
- public boolean offscreenImageNeedsVerticalFlip() {
- throw new GLException("Should not call this");
- }
-
- public boolean canCreatePbufferContext() {
- return true;
- }
-
- public synchronized GLContext createPbufferContext(GLCapabilities capabilities, int initialWidth, int initialHeight) {
- MacOSXPbufferGLContext ctx = new MacOSXPbufferGLContext(capabilities, initialWidth, initialHeight);
- GLContextShareSet.registerSharing(this, ctx);
- pbuffersToInstantiate.add(ctx);
- return ctx;
- }
-
- public void bindPbufferToTexture() {
- throw new GLException("Should not call this");
- }
-
- public void releasePbufferFromTexture() {
- throw new GLException("Should not call this");
- }
-
- public synchronized void setRenderingThread(Thread currentThreadOrNull, Runnable initAction) {
- this.willSetRenderingThread = false;
- // FIXME: the JAWT in the Panther developer release
- // requires all JAWT operations to be done on the AWT
- // thread. This means that setRenderingThread won't work
- // yet on this platform. This method can be deleted once
- // the update for that release ships.
- }
-
- protected synchronized boolean makeCurrent(Runnable initAction) throws GLException {
- try {
- if (!lockSurface()) {
- return false;
- }
- boolean ret = super.makeCurrent(initAction);
- if (ret) {
- // Assume the canvas might have been resized or moved and tell the OpenGL
- // context to update itself. This used to be done only upon receiving a
- // reshape event but that doesn't appear to be sufficient. An experiment
- // was also done to add a HierarchyBoundsListener to the GLCanvas and
- // do this updating only upon reshape of this component or reshape or movement
- // of an ancestor, but this also wasn't sufficient and left garbage on the
- // screen in some situations.
- CGL.updateContext(nsContext, nsView);
- // Instantiate any pending pbuffers
- while (!pbuffersToInstantiate.isEmpty()) {
- MacOSXPbufferGLContext ctx =
- (MacOSXPbufferGLContext) pbuffersToInstantiate.remove(pbuffersToInstantiate.size() - 1);
- ctx.createPbuffer(nsView, nsContext);
- }
- } else {
- // View might not have been ready
- unlockSurface();
- }
- return ret;
- } catch (RuntimeException e) {
- try {
- unlockSurface();
- } catch (Exception e2) {
- // do nothing if unlockSurface throws
- }
- throw(e);
- }
- }
-
- protected synchronized void free() throws GLException {
- try {
- super.free();
- } finally {
- unlockSurface();
- }
- }
-
- public synchronized void swapBuffers() throws GLException {
- if (!CGL.flushBuffer(nsContext, nsView)) {
- throw new GLException("Error swapping buffers");
- }
- }
-
- private boolean lockSurface() throws GLException {
- if (nsView != 0) {
- throw new GLException("Surface already locked");
- }
-
- ds = getJAWT().GetDrawingSurface(component);
- if (ds == null) {
- // Widget not yet realized
- return false;
- }
-
- int res = ds.Lock();
- if ((res & JAWTFactory.JAWT_LOCK_ERROR) != 0) {
- throw new GLException("Unable to lock surface");
- }
-
- // See whether the surface changed and if so destroy the old
- // OpenGL nsContext so it will be recreated
- if ((res & JAWTFactory.JAWT_LOCK_SURFACE_CHANGED) != 0) {
- if (nsContext != 0) {
- //CGL.updateContextUnregister(nsContext, nsView, updater); // gznote: not thread safe yet!
- if (!CGL.deleteContext(nsContext, nsView)) {
- throw new GLException("Unable to delete old GL nsContext after surface changed");
- }
- }
- }
-
- if (firstLock) {
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- dsi = ds.GetDrawingSurfaceInfo();
- return null;
- }
- });
- } else {
- dsi = ds.GetDrawingSurfaceInfo();
- }
- if (dsi == null) {
- ds.Unlock();
- getJAWT().FreeDrawingSurface(ds);
- ds = null;
-
- // Widget not yet realized
- return false;
- }
-
- firstLock = false;
-
- macosxdsi = (JAWT_MacOSXDrawingSurfaceInfo) dsi.platformInfo();
- if (macosxdsi == null) {
- ds.FreeDrawingSurfaceInfo(dsi);
- ds.Unlock();
- getJAWT().FreeDrawingSurface(ds);
- ds = null;
- dsi = null;
-
- // Widget not yet realized
- return false;
- }
-
- nsView = macosxdsi.cocoaViewRef();
- if (nsView == 0) {
- ds.FreeDrawingSurfaceInfo(dsi);
- ds.Unlock();
- getJAWT().FreeDrawingSurface(ds);
- ds = null;
- dsi = null;
- macosxdsi = null;
-
- // Widget not yet realized
- return false;
- }
-
- return true;
- }
-
- private void unlockSurface() throws GLException {
- if (nsView == 0) {
- throw new GLException("Surface already unlocked");
- }
-
- ds.FreeDrawingSurfaceInfo(dsi);
- ds.Unlock();
- getJAWT().FreeDrawingSurface(ds);
- ds = null;
- dsi = null;
- macosxdsi = null;
- nsView = 0;
- }
-}
diff --git a/src/net/java/games/jogl/impl/macosx/MacOSXPbufferGLContext.java b/src/net/java/games/jogl/impl/macosx/MacOSXPbufferGLContext.java
deleted file mode 100644
index 93bde269b..000000000
--- a/src/net/java/games/jogl/impl/macosx/MacOSXPbufferGLContext.java
+++ /dev/null
@@ -1,203 +0,0 @@
-package net.java.games.jogl.impl.macosx;
-
-import java.security.*;
-import java.util.*;
-
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
-
-public class MacOSXPbufferGLContext extends MacOSXGLContext {
- private static final boolean DEBUG = Debug.debug("MacOSXPbufferGLContext");
- private static boolean isTigerOrLater;
-
- static {
- String osVersion =
- (String) AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- return System.getProperty("os.version");
- }
- });
- StringTokenizer tok = new StringTokenizer(osVersion, ". ");
- int major = Integer.parseInt(tok.nextToken());
- int minor = Integer.parseInt(tok.nextToken());
- isTigerOrLater = ((major > 10) || (minor > 3));
- }
-
- protected int initWidth;
- protected int initHeight;
-
- private long pBuffer;
-
- protected int width;
- protected int height;
-
- // State for render-to-texture and render-to-texture-rectangle support
- private boolean created;
- private int textureTarget; // e.g. GL_TEXTURE_2D, GL_TEXTURE_RECTANGLE_NV
- private int texture; // actual texture object
-
- public MacOSXPbufferGLContext(GLCapabilities capabilities, int initialWidth, int initialHeight) {
- super(null, capabilities, null, null);
- this.initWidth = initialWidth;
- this.initHeight = initialHeight;
- }
-
- public boolean canCreatePbufferContext() {
- return false;
- }
-
- public GLContext createPbufferContext(GLCapabilities capabilities,
- int initialWidth,
- int initialHeight) {
- throw new GLException("Not supported");
- }
-
- public void bindPbufferToTexture() {
- GL gl = getGL();
- gl.glBindTexture(textureTarget, texture);
- // FIXME: not clear whether this is really necessary, but since
- // the API docs seem to imply it is and since it doesn't seem to
- // impact performance, leaving it in
- CGL.setContextTextureImageToPBuffer(nsContext, pBuffer, GL.GL_FRONT);
- }
-
- public void releasePbufferFromTexture() {
- }
-
- public void createPbuffer(long parentView, long parentContext) {
- GL gl = getGL();
- // Must initally grab OpenGL function pointers while parent's
- // context is current because otherwise we don't have the cgl
- // extensions available to us
- resetGLFunctionAvailability();
-
- int renderTarget;
- if (capabilities.getOffscreenRenderToTextureRectangle()) {
- width = initWidth;
- height = initHeight;
- renderTarget = GL.GL_TEXTURE_RECTANGLE_EXT;
- } else {
- width = getNextPowerOf2(initWidth);
- height = getNextPowerOf2(initHeight);
- renderTarget = GL.GL_TEXTURE_2D;
- }
-
- int internalFormat = GL.GL_RGBA;
- if (capabilities.getOffscreenFloatingPointBuffers()) {
- if (!gl.isExtensionAvailable("GL_APPLE_float_pixels")) {
- throw new GLException("Floating-point support (GL_APPLE_float_pixels) not available");
- }
- switch (capabilities.getRedBits()) {
- case 16: internalFormat = GL.GL_RGBA_FLOAT16_APPLE; break;
- case 32: internalFormat = GL.GL_RGBA_FLOAT32_APPLE; break;
- default: throw new GLException("Invalid floating-point bit depth (only 16 and 32 supported)");
- }
- }
-
- pBuffer = CGL.createPBuffer(renderTarget, internalFormat, width, height);
- if (pBuffer == 0) {
- throw new GLException("pbuffer creation error: CGL.createPBuffer() failed");
- }
-
- if (DEBUG) {
- System.err.println("Created pbuffer 0x" + Long.toHexString(pBuffer) + ", " + width + " x " + height + " for " + this);
- }
- }
-
- protected synchronized boolean makeCurrent(Runnable initAction) throws GLException {
- created = false;
-
- if (pBuffer == 0) {
- if (DEBUG) {
- System.err.println("Pbuffer not instantiated yet for " + this);
- }
- // pbuffer not instantiated yet
- return false;
- }
-
- boolean res = super.makeCurrent(initAction);
- if (created) {
- // Initialize render-to-texture support if requested
- boolean rect = capabilities.getOffscreenRenderToTextureRectangle();
- GL gl = getGL();
- if (rect) {
- if (!gl.isExtensionAvailable("GL_EXT_texture_rectangle")) {
- System.err.println("MacOSXPbufferGLContext: WARNING: GL_EXT_texture_rectangle extension not " +
- "supported; skipping requested render_to_texture_rectangle support for pbuffer");
- rect = false;
- }
- }
- textureTarget = (rect ? GL.GL_TEXTURE_RECTANGLE_EXT : GL.GL_TEXTURE_2D);
- int[] tmp = new int[1];
- gl.glGenTextures(1, tmp);
- texture = tmp[0];
- gl.glBindTexture(textureTarget, texture);
- gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
- gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
- gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP_TO_EDGE);
- gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP_TO_EDGE);
- gl.glCopyTexImage2D(textureTarget, 0, GL.GL_RGB, 0, 0, width, height, 0);
- }
- return res;
- }
-
- public void destroyPBuffer() {
- if (this.pBuffer != 0) {
- CGL.destroyPBuffer(nsContext, pBuffer);
- }
- this.pBuffer = 0;
-
- if (DEBUG) {
- System.err.println("Destroyed pbuffer " + width + " x " + height);
- }
- }
-
- public void handleModeSwitch(long parentView, long parentContext) {
- throw new GLException("Not yet implemented");
- }
-
- protected boolean isOffscreen() {
- // FIXME: currently the only caller of this won't cause proper
- // resizing of the pbuffer anyway.
- return false;
- }
-
- protected void destroyImpl() throws GLException {
- destroyPBuffer();
- }
-
- public void swapBuffers() throws GLException {
- // FIXME: do we need to do anything if the pbuffer is double-buffered?
- }
-
- public int getFloatingPointMode() {
- return GLPbuffer.APPLE_FLOAT;
- }
-
- private int getNextPowerOf2(int number) {
- if (((number-1) & number) == 0) {
- //ex: 8 -> 0b1000; 8-1=7 -> 0b0111; 0b1000&0b0111 == 0
- return number;
- }
- int power = 0;
- while (number > 0) {
- number = number>>1;
- power++;
- }
- return (1<<power);
- }
-
- protected boolean create() {
- if (capabilities.getOffscreenFloatingPointBuffers() &&
- !isTigerOrLater) {
- throw new GLException("Floating-point pbuffers supported only on OS X 10.4 or later");
- }
- if (!super.create(true, capabilities.getOffscreenFloatingPointBuffers())) {
- return false;
- }
- created = true;
- // Must now associate the pbuffer with our newly-created context
- CGL.setContextPBuffer(nsContext, pBuffer);
- return true;
- }
-}
diff --git a/src/net/java/games/jogl/impl/windows/WindowsGLContext.java b/src/net/java/games/jogl/impl/windows/WindowsGLContext.java
deleted file mode 100644
index e838c68aa..000000000
--- a/src/net/java/games/jogl/impl/windows/WindowsGLContext.java
+++ /dev/null
@@ -1,717 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl.impl.windows;
-
-import java.awt.Component;
-import java.awt.GraphicsConfiguration;
-import java.awt.GraphicsDevice;
-import java.awt.Rectangle;
-import java.util.*;
-import net.java.games.gluegen.runtime.*; // for PROCADDRESS_VAR_PREFIX
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
-
-public abstract class WindowsGLContext extends GLContext {
- private static JAWT jawt;
- protected long hglrc;
- protected long hdc;
- private boolean wglGetExtensionsStringEXTInitialized;
- private boolean wglGetExtensionsStringEXTAvailable;
- private static final Map/*<String, String>*/ functionNameMap;
- private static final Map/*<String, String>*/ extensionNameMap;
- // Table that holds the addresses of the native C-language entry points for
- // OpenGL functions.
- private GLProcAddressTable glProcAddressTable;
- // Handle to GLU32.dll
- private long hglu32;
- private boolean haveWGLARBPbuffer = true;
-
- private static final int MAX_PFORMATS = 256;
- private static final int MAX_ATTRIBS = 256;
-
- static {
- functionNameMap = new HashMap();
- functionNameMap.put("glAllocateMemoryNV", "wglAllocateMemoryNV");
- functionNameMap.put("glFreeMemoryNV", "wglFreeMemoryNV");
-
- extensionNameMap = new HashMap();
- extensionNameMap.put("GL_ARB_pbuffer", "WGL_ARB_pbuffer");
- extensionNameMap.put("GL_ARB_pixel_format", "WGL_ARB_pixel_format");
- }
-
- public WindowsGLContext(Component component,
- GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLContext shareWith) {
- super(component, capabilities, chooser, shareWith);
- }
-
- protected GL createGL()
- {
- return new WindowsGLImpl(this);
- }
-
- protected String mapToRealGLFunctionName(String glFunctionName) {
- String lookup = (String) functionNameMap.get(glFunctionName);
- if (lookup != null) {
- return lookup;
- }
- return glFunctionName;
- }
-
- protected String mapToRealGLExtensionName(String glExtensionName) {
- String lookup = (String) extensionNameMap.get(glExtensionName);
- if (lookup != null) {
- return lookup;
- }
- return glExtensionName;
- }
-
- protected abstract boolean isOffscreen();
-
- public int getOffscreenContextWidth() {
- throw new GLException("Should not call this");
- }
-
- public int getOffscreenContextHeight() {
- throw new GLException("Should not call this");
- }
-
- public int getOffscreenContextPixelDataType() {
- throw new GLException("Should not call this");
- }
-
- public abstract int getOffscreenContextReadBuffer();
-
- public abstract boolean offscreenImageNeedsVerticalFlip();
-
- /**
- * Creates and initializes an appropriate OpenGL context. Should only be
- * called by {@link #makeCurrent(Runnable)}.
- */
- protected abstract void create();
-
- protected synchronized boolean makeCurrent(Runnable initAction) throws GLException {
- boolean created = false;
- if (hglrc == 0) {
- create();
- if (DEBUG) {
- System.err.println(getThreadName() + ": !!! Created GL context for " + getClass().getName());
- }
- created = true;
- }
-
- boolean skipMakeCurrent = false;
- if (NO_FREE) {
- if (WGL.wglGetCurrentContext() == hglrc) {
- if (DEBUG && VERBOSE) {
- System.err.println(getThreadName() + ": skipping wglMakeCurrent because context already current");
- }
- skipMakeCurrent = true;
- }
- }
-
- if (!skipMakeCurrent) {
- if (!WGL.wglMakeCurrent(hdc, hglrc)) {
- throw new GLException("Error making context current: " + WGL.GetLastError());
- } else {
- if (DEBUG && VERBOSE) {
- System.err.println(getThreadName() + ": wglMakeCurrent(hdc " + hdcToString(hdc) +
- ", hglrc " + hdcToString(hglrc) + ") succeeded");
- }
- }
- }
-
- if (created) {
- resetGLFunctionAvailability();
- haveWGLARBPbuffer = (isExtensionAvailable("WGL_ARB_pbuffer") &&
- isExtensionAvailable("WGL_ARB_pixel_format"));
- // Windows can set up sharing of display lists after creation time
- WindowsGLContext other = (WindowsGLContext) GLContextShareSet.getShareContext(this);
- if (other != null) {
- long hglrc2 = other.getHGLRC();
- if (hglrc2 == 0) {
- throw new GLException("GLContextShareSet returned an invalid OpenGL context");
- }
- if (!WGL.wglShareLists(hglrc2, hglrc)) {
- throw new GLException("wglShareLists(0x" + Long.toHexString(hglrc2) +
- ", 0x" + Long.toHexString(hglrc) + ") failed: error code " +
- WGL.GetLastError());
- }
- }
- GLContextShareSet.contextCreated(this);
-
- initAction.run();
- }
- return true;
- }
-
- protected synchronized void free() throws GLException {
- if (!NO_FREE) {
- if (!WGL.wglMakeCurrent(0, 0)) {
- throw new GLException("Error freeing OpenGL context: " + WGL.GetLastError());
- }
- }
- }
-
- protected void destroyImpl() throws GLException {
- if (hglrc != 0) {
- if (!WGL.wglDeleteContext(hglrc)) {
- throw new GLException("Unable to delete OpenGL context");
- }
- if (DEBUG) {
- System.err.println(getThreadName() + ": !!! Destroyed OpenGL context " + hglrc);
- }
- hglrc = 0;
- }
- }
-
- public abstract void swapBuffers() throws GLException;
-
- protected long dynamicLookupFunction(String glFuncName) {
- long res = WGL.wglGetProcAddress(glFuncName);
- if (res == 0) {
- // GLU routines aren't known to the OpenGL function lookup
- if (hglu32 == 0) {
- hglu32 = WGL.LoadLibraryA("GLU32");
- if (hglu32 == 0) {
- throw new GLException("Error loading GLU32.DLL");
- }
- }
- res = WGL.GetProcAddress(hglu32, glFuncName);
- }
- return res;
- }
-
- public boolean isCreated() {
- return (hglrc != 0);
- }
-
- protected void resetGLFunctionAvailability() {
- super.resetGLFunctionAvailability();
- if (DEBUG) {
- System.err.println(getThreadName() + ": !!! Initializing OpenGL extension address table");
- }
- resetProcAddressTable(getGLProcAddressTable());
- }
-
- public GLProcAddressTable getGLProcAddressTable() {
- if (glProcAddressTable == null) {
- // FIXME: cache ProcAddressTables by capability bits so we can
- // share them among contexts with the same capabilities
- glProcAddressTable = new GLProcAddressTable();
- }
- return glProcAddressTable;
- }
-
- public String getPlatformExtensionsString() {
- if (!wglGetExtensionsStringEXTInitialized) {
- wglGetExtensionsStringEXTAvailable = (WGL.wglGetProcAddress("wglGetExtensionsStringEXT") != 0);
- wglGetExtensionsStringEXTInitialized = true;
- }
- if (wglGetExtensionsStringEXTAvailable) {
- return gl.wglGetExtensionsStringEXT();
- } else {
- return "";
- }
- }
-
- protected boolean isFunctionAvailable(String glFunctionName)
- {
- boolean available = super.isFunctionAvailable(glFunctionName);
-
- // Sanity check for implementations that use proc addresses for run-time
- // linking: if the function IS available, then make sure there's a proc
- // address for it if it's an extension or not part of the OpenGL 1.1 core
- // (post GL 1.1 functions are run-time linked on windows).
- assert(!available ||
- (getGLProcAddressTable().getAddressFor(mapToRealGLFunctionName(glFunctionName)) != 0 ||
- FunctionAvailabilityCache.isPartOfGLCore("1.1", mapToRealGLFunctionName(glFunctionName)))
- );
-
- return available;
- }
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- protected JAWT getJAWT() {
- if (jawt == null) {
- JAWT j = new JAWT();
- j.version(JAWTFactory.JAWT_VERSION_1_4);
- if (!JAWTFactory.JAWT_GetAWT(j)) {
- throw new RuntimeException("Unable to initialize JAWT");
- }
- jawt = j;
- }
- return jawt;
- }
-
- // Helper routine for the overridden create() to call
- protected void choosePixelFormatAndCreateContext(boolean onscreen) {
- PIXELFORMATDESCRIPTOR pfd = null;
- int pixelFormat = 0;
- if (onscreen) {
- GLCapabilities[] availableCaps = null;
- int numFormats = 0;
- pfd = newPixelFormatDescriptor();
- GraphicsConfiguration config = component.getGraphicsConfiguration();
- GraphicsDevice device = config.getDevice();
- // Produce a recommended pixel format selection for the GLCapabilitiesChooser.
- // Use wglChoosePixelFormatARB if user requested multisampling and if we have it available
- GL dummyGL = null;
- if (capabilities.getSampleBuffers()) {
- dummyGL = WindowsGLContextFactory.getDummyGL(device);
- }
- int recommendedPixelFormat = -1;
- boolean haveWGLChoosePixelFormatARB = false;
- boolean haveWGLARBMultisample = false;
- if (dummyGL != null) {
- String availableWGLExtensions = WindowsGLContextFactory.getDummyGLExtensions(device);
- if (availableWGLExtensions.indexOf("WGL_ARB_pixel_format") >= 0) {
- haveWGLChoosePixelFormatARB = true;
- if (availableWGLExtensions.indexOf("WGL_ARB_multisample") >= 0) {
- haveWGLARBMultisample = true;
- }
- }
- }
- Rectangle rect = config.getBounds();
- long dc = 0;
- long rc = 0;
- boolean freeWGLC = false;
- if( dummyGL != null ) {
- dc = WindowsGLContextFactory.getDummyGLContext( device ).hdc;
- rc = WindowsGLContextFactory.getDummyGLContext( device ).hglrc;
- if( !WGL.wglMakeCurrent( dc, rc ) ) {
- System.err.println(getThreadName() + ": Error Making WGLC Current: " + WGL.GetLastError() );
- } else {
- freeWGLC = true;
- }
- }
- // Fallback path for older cards, in particular Intel Extreme motherboard graphics
- boolean gotAvailableCaps = false;
- if (dummyGL != null && haveWGLChoosePixelFormatARB) {
- int[] iattributes = new int [2 * MAX_ATTRIBS];
- int[] iresults = new int [2 * MAX_ATTRIBS];
- float[] fattributes = new float[2 * MAX_ATTRIBS];
- int niattribs = 0;
- int nfattribs = 0;
- iattributes[niattribs++] = GL.WGL_SUPPORT_OPENGL_ARB;
- iattributes[niattribs++] = GL.GL_TRUE;
- iattributes[niattribs++] = GL.WGL_DRAW_TO_WINDOW_ARB;
- iattributes[niattribs++] = GL.GL_TRUE;
- iattributes[niattribs++] = GL.WGL_PIXEL_TYPE_ARB;
- iattributes[niattribs++] = GL.WGL_TYPE_RGBA_ARB;
- iattributes[niattribs++] = GL.WGL_DOUBLE_BUFFER_ARB;
- if (capabilities.getDoubleBuffered()) {
- iattributes[niattribs++] = GL.GL_TRUE;
- } else {
- iattributes[niattribs++] = GL.GL_FALSE;
- }
- iattributes[niattribs++] = GL.WGL_STEREO_ARB;
- if (capabilities.getStereo()) {
- iattributes[niattribs++] = GL.GL_TRUE;
- } else {
- iattributes[niattribs++] = GL.GL_FALSE;
- }
- iattributes[niattribs++] = GL.WGL_DEPTH_BITS_ARB;
- iattributes[niattribs++] = capabilities.getDepthBits();
- iattributes[niattribs++] = GL.WGL_RED_BITS_ARB;
- iattributes[niattribs++] = capabilities.getRedBits();
- iattributes[niattribs++] = GL.WGL_GREEN_BITS_ARB;
- iattributes[niattribs++] = capabilities.getGreenBits();
- iattributes[niattribs++] = GL.WGL_BLUE_BITS_ARB;
- iattributes[niattribs++] = capabilities.getBlueBits();
- iattributes[niattribs++] = GL.WGL_ALPHA_BITS_ARB;
- iattributes[niattribs++] = capabilities.getAlphaBits();
- iattributes[niattribs++] = GL.WGL_STENCIL_BITS_ARB;
- iattributes[niattribs++] = capabilities.getStencilBits();
- if (capabilities.getAccumRedBits() > 0 ||
- capabilities.getAccumGreenBits() > 0 ||
- capabilities.getAccumBlueBits() > 0 ||
- capabilities.getAccumAlphaBits() > 0) {
- iattributes[niattribs++] = GL.WGL_ACCUM_BITS_ARB;
- iattributes[niattribs++] = (capabilities.getAccumRedBits() +
- capabilities.getAccumGreenBits() +
- capabilities.getAccumBlueBits() +
- capabilities.getAccumAlphaBits());
- iattributes[niattribs++] = GL.WGL_ACCUM_RED_BITS_ARB;
- iattributes[niattribs++] = capabilities.getAccumRedBits();
- iattributes[niattribs++] = GL.WGL_ACCUM_GREEN_BITS_ARB;
- iattributes[niattribs++] = capabilities.getAccumGreenBits();
- iattributes[niattribs++] = GL.WGL_ACCUM_BLUE_BITS_ARB;
- iattributes[niattribs++] = capabilities.getAccumBlueBits();
- iattributes[niattribs++] = GL.WGL_ACCUM_ALPHA_BITS_ARB;
- iattributes[niattribs++] = capabilities.getAccumAlphaBits();
- }
- if (haveWGLARBMultisample) {
- if (capabilities.getSampleBuffers()) {
- iattributes[niattribs++] = GL.WGL_SAMPLE_BUFFERS_ARB;
- iattributes[niattribs++] = GL.GL_TRUE;
- iattributes[niattribs++] = GL.WGL_SAMPLES_ARB;
- iattributes[niattribs++] = capabilities.getNumSamples();
- }
- }
-
- int[] pformats = new int[MAX_PFORMATS];
- int[] numFormatsTmp = new int[1];
- if (dummyGL.wglChoosePixelFormatARB(hdc,
- iattributes,
- fattributes,
- MAX_PFORMATS,
- pformats,
- numFormatsTmp)) {
- numFormats = numFormatsTmp[0];
- if (numFormats > 0) {
- // Remove one-basing of pixel format (added on later)
- recommendedPixelFormat = pformats[0] - 1;
- if (DEBUG) {
- System.err.println(getThreadName() + ": Used wglChoosePixelFormatARB to recommend pixel format " + recommendedPixelFormat);
- }
- }
- } else {
- if (DEBUG) {
- System.err.println(getThreadName() + ": wglChoosePixelFormatARB failed: " + WGL.GetLastError() );
- Thread.dumpStack();
- }
- }
- if (DEBUG) {
- if (recommendedPixelFormat < 0) {
- System.err.print(getThreadName() + ": wglChoosePixelFormatARB didn't recommend a pixel format");
- if (capabilities.getSampleBuffers()) {
- System.err.print(" for multisampled GLCapabilities");
- }
- System.err.println();
- }
- }
-
- // Produce a list of GLCapabilities to give to the
- // GLCapabilitiesChooser.
- // Use wglGetPixelFormatAttribivARB instead of
- // DescribePixelFormat to get higher-precision information
- // about the pixel format (should make the GLCapabilities
- // more precise as well...i.e., remove the
- // "HardwareAccelerated" bit, which is basically
- // meaningless, and put in whether it can render to a
- // window, to a pbuffer, or to a pixmap)
- niattribs = 0;
- iattributes[0] = GL.WGL_NUMBER_PIXEL_FORMATS_ARB;
- if (dummyGL.wglGetPixelFormatAttribivARB(hdc, 0, 0, 1, iattributes, iresults)) {
- numFormats = iresults[0];
- // Should we be filtering out the pixel formats which aren't
- // applicable, as we are doing here?
- // We don't have enough information in the GLCapabilities to
- // represent those that aren't...
- iattributes[niattribs++] = GL.WGL_DRAW_TO_WINDOW_ARB;
- iattributes[niattribs++] = GL.WGL_ACCELERATION_ARB;
- iattributes[niattribs++] = GL.WGL_SUPPORT_OPENGL_ARB;
- iattributes[niattribs++] = GL.WGL_DEPTH_BITS_ARB;
- iattributes[niattribs++] = GL.WGL_STENCIL_BITS_ARB;
- iattributes[niattribs++] = GL.WGL_DOUBLE_BUFFER_ARB;
- iattributes[niattribs++] = GL.WGL_STEREO_ARB;
- iattributes[niattribs++] = GL.WGL_PIXEL_TYPE_ARB;
- iattributes[niattribs++] = GL.WGL_RED_BITS_ARB;
- iattributes[niattribs++] = GL.WGL_GREEN_BITS_ARB;
- iattributes[niattribs++] = GL.WGL_BLUE_BITS_ARB;
- iattributes[niattribs++] = GL.WGL_ALPHA_BITS_ARB;
- iattributes[niattribs++] = GL.WGL_ACCUM_RED_BITS_ARB;
- iattributes[niattribs++] = GL.WGL_ACCUM_GREEN_BITS_ARB;
- iattributes[niattribs++] = GL.WGL_ACCUM_BLUE_BITS_ARB;
- iattributes[niattribs++] = GL.WGL_ACCUM_ALPHA_BITS_ARB;
- if (haveWGLARBMultisample) {
- iattributes[niattribs++] = GL.WGL_SAMPLE_BUFFERS_ARB;
- iattributes[niattribs++] = GL.WGL_SAMPLES_ARB;
- }
-
- availableCaps = new GLCapabilities[numFormats];
- for (int i = 0; i < numFormats; i++) {
- if (!dummyGL.wglGetPixelFormatAttribivARB(hdc, i+1, 0, niattribs, iattributes, iresults)) {
- throw new GLException("Error getting pixel format attributes for pixel format " + (i + 1) + " of device context");
- }
- availableCaps[i] = iattributes2GLCapabilities(iattributes, iresults, niattribs, true);
- }
- if( freeWGLC ) {
- WGL.wglMakeCurrent( 0, 0 );
- }
- gotAvailableCaps = true;
- } else {
- int lastErr = WGL.GetLastError();
- // Intel Extreme graphics fails with a zero error code
- if (lastErr != 0) {
- throw new GLException("Unable to enumerate pixel formats of window using wglGetPixelFormatAttribivARB: error code " + WGL.GetLastError());
- }
- }
- }
-
- if (!gotAvailableCaps) {
- if (DEBUG) {
- if (!capabilities.getSampleBuffers()) {
- System.err.println(getThreadName() + ": Using ChoosePixelFormat because multisampling not requested");
- } else {
- System.err.println(getThreadName() + ": Using ChoosePixelFormat because no wglChoosePixelFormatARB: dummyGL = " + dummyGL);
- }
- }
- pfd = glCapabilities2PFD(capabilities, onscreen);
- // Remove one-basing of pixel format (added on later)
- recommendedPixelFormat = WGL.ChoosePixelFormat(hdc, pfd) - 1;
-
- numFormats = WGL.DescribePixelFormat(hdc, 1, 0, null);
- if (numFormats == 0) {
- throw new GLException("Unable to enumerate pixel formats of window for GLCapabilitiesChooser");
- }
- availableCaps = new GLCapabilities[numFormats];
- for (int i = 0; i < numFormats; i++) {
- if (WGL.DescribePixelFormat(hdc, 1 + i, pfd.size(), pfd) == 0) {
- throw new GLException("Error describing pixel format " + (1 + i) + " of device context");
- }
- availableCaps[i] = pfd2GLCapabilities(pfd);
- }
- }
-
- // Supply information to chooser
- pixelFormat = chooser.chooseCapabilities(capabilities, availableCaps, recommendedPixelFormat);
- if ((pixelFormat < 0) || (pixelFormat >= numFormats)) {
- throw new GLException("Invalid result " + pixelFormat +
- " from GLCapabilitiesChooser (should be between 0 and " +
- (numFormats - 1) + ")");
- }
- if (DEBUG) {
- System.err.println(getThreadName() + ": Chosen pixel format (" + pixelFormat + "):");
- System.err.println(availableCaps[pixelFormat]);
- }
- pixelFormat += 1; // one-base the index
- if (WGL.DescribePixelFormat(hdc, pixelFormat, pfd.size(), pfd) == 0) {
- throw new GLException("Error re-describing the chosen pixel format: " + WGL.GetLastError());
- }
- } else {
- // For now, use ChoosePixelFormat for offscreen surfaces until
- // we figure out how to properly choose an offscreen-
- // compatible pixel format
- pfd = glCapabilities2PFD(capabilities, onscreen);
- pixelFormat = WGL.ChoosePixelFormat(hdc, pfd);
- }
- if (!WGL.SetPixelFormat(hdc, pixelFormat, pfd)) {
- int lastError = WGL.GetLastError();
- if (DEBUG) {
- System.err.println(getThreadName() + ": SetPixelFormat failed: current context = " + WGL.wglGetCurrentContext() +
- ", current DC = " + WGL.wglGetCurrentDC());
- System.err.println(getThreadName() + ": GetPixelFormat(hdc " + hdcToString(hdc) + ") returns " + WGL.GetPixelFormat(hdc));
- }
- throw new GLException("Unable to set pixel format " + pixelFormat + " for device context " + hdcToString(hdc) + ": error code " + lastError);
- }
- hglrc = WGL.wglCreateContext(hdc);
- if (DEBUG) {
- System.err.println(getThreadName() + ": !!! Created OpenGL context " + hglrc + " for device context " + hdcToString(hdc) + " using pixel format " + pixelFormat);
- }
- if (hglrc == 0) {
- throw new GLException("Unable to create OpenGL context");
- }
- }
-
- protected long getHGLRC() {
- return hglrc;
- }
-
- static PIXELFORMATDESCRIPTOR glCapabilities2PFD(GLCapabilities caps, boolean onscreen) {
- int colorDepth = (caps.getRedBits() +
- caps.getGreenBits() +
- caps.getBlueBits());
- if (colorDepth < 15) {
- throw new GLException("Bit depths < 15 (i.e., non-true-color) not supported");
- }
- PIXELFORMATDESCRIPTOR pfd = newPixelFormatDescriptor();
- int pfdFlags = (WGL.PFD_SUPPORT_OPENGL |
- WGL.PFD_GENERIC_ACCELERATED);
- if (caps.getDoubleBuffered()) {
- pfdFlags |= WGL.PFD_DOUBLEBUFFER;
- }
- if (onscreen) {
- pfdFlags |= WGL.PFD_DRAW_TO_WINDOW;
- } else {
- pfdFlags |= WGL.PFD_DRAW_TO_BITMAP;
- }
- pfd.dwFlags(pfdFlags);
- pfd.iPixelType((byte) WGL.PFD_TYPE_RGBA);
- pfd.cColorBits((byte) colorDepth);
- pfd.cRedBits ((byte) caps.getRedBits());
- pfd.cGreenBits((byte) caps.getGreenBits());
- pfd.cBlueBits ((byte) caps.getBlueBits());
- pfd.cAlphaBits((byte) caps.getAlphaBits());
- int accumDepth = (caps.getAccumRedBits() +
- caps.getAccumGreenBits() +
- caps.getAccumBlueBits());
- pfd.cAccumBits ((byte) accumDepth);
- pfd.cAccumRedBits ((byte) caps.getAccumRedBits());
- pfd.cAccumGreenBits((byte) caps.getAccumGreenBits());
- pfd.cAccumBlueBits ((byte) caps.getAccumBlueBits());
- pfd.cAccumAlphaBits((byte) caps.getAccumAlphaBits());
- pfd.cDepthBits((byte) caps.getDepthBits());
- pfd.cStencilBits((byte) caps.getStencilBits());
- pfd.iLayerType((byte) WGL.PFD_MAIN_PLANE);
- return pfd;
- }
-
- static PIXELFORMATDESCRIPTOR newPixelFormatDescriptor() {
- PIXELFORMATDESCRIPTOR pfd = new PIXELFORMATDESCRIPTOR();
- pfd.nSize((short) pfd.size());
- pfd.nVersion((short) 1);
- return pfd;
- }
-
- static GLCapabilities pfd2GLCapabilities(PIXELFORMATDESCRIPTOR pfd) {
- if ((pfd.dwFlags() & WGL.PFD_SUPPORT_OPENGL) == 0) {
- return null;
- }
- GLCapabilities res = new GLCapabilities();
- res.setRedBits (pfd.cRedBits());
- res.setGreenBits (pfd.cGreenBits());
- res.setBlueBits (pfd.cBlueBits());
- res.setAlphaBits (pfd.cAlphaBits());
- res.setAccumRedBits (pfd.cAccumRedBits());
- res.setAccumGreenBits(pfd.cAccumGreenBits());
- res.setAccumBlueBits (pfd.cAccumBlueBits());
- res.setAccumAlphaBits(pfd.cAccumAlphaBits());
- res.setDepthBits (pfd.cDepthBits());
- res.setStencilBits (pfd.cStencilBits());
- res.setDoubleBuffered((pfd.dwFlags() & WGL.PFD_DOUBLEBUFFER) != 0);
- res.setStereo ((pfd.dwFlags() & WGL.PFD_STEREO) != 0);
- res.setHardwareAccelerated(((pfd.dwFlags() & WGL.PFD_GENERIC_FORMAT) == 0) ||
- ((pfd.dwFlags() & WGL.PFD_GENERIC_ACCELERATED) != 0));
- return res;
- }
-
- static GLCapabilities iattributes2GLCapabilities(int[] iattribs,
- int[] iresults,
- int niattribs,
- boolean requireRenderToWindow) {
- GLCapabilities res = new GLCapabilities();
- for (int i = 0; i < niattribs; i++) {
- switch (iattribs[i]) {
- case GL.WGL_DRAW_TO_WINDOW_ARB:
- if (iresults[i] != GL.GL_TRUE)
- return null;
- break;
-
- case GL.WGL_ACCELERATION_ARB:
- res.setHardwareAccelerated(iresults[i] == GL.WGL_FULL_ACCELERATION_ARB);
- break;
-
- case GL.WGL_SUPPORT_OPENGL_ARB:
- if (iresults[i] != GL.GL_TRUE)
- return null;
- break;
-
- case GL.WGL_DEPTH_BITS_ARB:
- res.setDepthBits(iresults[i]);
- break;
-
- case GL.WGL_STENCIL_BITS_ARB:
- res.setStencilBits(iresults[i]);
- break;
-
- case GL.WGL_DOUBLE_BUFFER_ARB:
- res.setDoubleBuffered(iresults[i] == GL.GL_TRUE);
- break;
-
- case GL.WGL_STEREO_ARB:
- res.setStereo(iresults[i] == GL.GL_TRUE);
- break;
-
- case GL.WGL_PIXEL_TYPE_ARB:
- if (iresults[i] != GL.WGL_TYPE_RGBA_ARB)
- return null;
- break;
-
- case GL.WGL_RED_BITS_ARB:
- res.setRedBits(iresults[i]);
- break;
-
- case GL.WGL_GREEN_BITS_ARB:
- res.setGreenBits(iresults[i]);
- break;
-
- case GL.WGL_BLUE_BITS_ARB:
- res.setBlueBits(iresults[i]);
- break;
-
- case GL.WGL_ALPHA_BITS_ARB:
- res.setAlphaBits(iresults[i]);
- break;
-
- case GL.WGL_ACCUM_RED_BITS_ARB:
- res.setAccumRedBits(iresults[i]);
- break;
-
- case GL.WGL_ACCUM_GREEN_BITS_ARB:
- res.setAccumGreenBits(iresults[i]);
- break;
-
- case GL.WGL_ACCUM_BLUE_BITS_ARB:
- res.setAccumBlueBits(iresults[i]);
- break;
-
- case GL.WGL_ACCUM_ALPHA_BITS_ARB:
- res.setAccumAlphaBits(iresults[i]);
- break;
-
- case GL.WGL_SAMPLE_BUFFERS_ARB:
- res.setSampleBuffers(iresults[i] == GL.GL_TRUE);
- break;
-
- case GL.WGL_SAMPLES_ARB:
- res.setNumSamples(iresults[i]);
- break;
-
- default:
- throw new GLException("Unknown pixel format attribute " + iattribs[i]);
- }
- }
- return res;
- }
-
- protected static String hdcToString(long hdc) {
- return "0x" + Long.toHexString(hdc);
- }
-
- protected boolean haveWGLARBPbuffer() {
- return haveWGLARBPbuffer;
- }
-}
diff --git a/src/net/java/games/jogl/impl/windows/WindowsGLContextFactory.java b/src/net/java/games/jogl/impl/windows/WindowsGLContextFactory.java
deleted file mode 100644
index dd6f8daca..000000000
--- a/src/net/java/games/jogl/impl/windows/WindowsGLContextFactory.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl.impl.windows;
-
-import java.awt.Component;
-import java.awt.GraphicsConfiguration;
-import java.awt.GraphicsDevice;
-import java.awt.Rectangle;
-import java.io.File;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.Collection;
-import java.util.Iterator;
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
-
-public class WindowsGLContextFactory extends GLContextFactory {
- private static final boolean DEBUG = Debug.debug("WindowsGLContextFactory");
- private static final boolean VERBOSE = Debug.verbose();
-
- // On Windows we want to be able to use some extension routines like
- // wglChoosePixelFormatARB during the creation of the user's first
- // GLContext. However, this and other routines' function pointers
- // aren't loaded by the driver until the first OpenGL context is
- // created. The standard way of working around this chicken-and-egg
- // problem is to create a dummy window, show it, send it a paint
- // message, create an OpenGL context, fetch the needed function
- // pointers, and then destroy the dummy window and context. It turns
- // out that ATI cards need the dummy context to be current while
- // wglChoosePixelFormatARB is called, so we cache the extension
- // strings the dummy context reports as being available.
- private static Map/*<GraphicsDevice, GL>*/ dummyContextMap = new HashMap();
- private static Map/*<GraphicsDevice, String>*/ dummyExtensionsMap = new HashMap();
- private static Set/*<GraphicsDevice >*/ pendingContextSet = new HashSet();
-
- public WindowsGLContextFactory() {
- AccessController.doPrivileged( new PrivilegedAction() {
- public Object run() {
- Runtime.getRuntime().addShutdownHook( new ShutdownHook() );
-
- // Test for whether we should enable the single-threaded
- // workaround for ATI cards. It appears that if we make any
- // OpenGL context current on more than one thread on ATI cards
- // on Windows then we see random failures like the inability
- // to create more OpenGL contexts, or having just the next
- // OpenGL SetPixelFormat operation fail with a GetNextError()
- // code of 0 (but subsequent ones on subsequently-created
- // windows succeed). These kinds of failures are obviously due
- // to bugs in ATI's OpenGL drivers. Through trial and error it
- // was found that specifying
- // -DJOGL_SINGLE_THREADED_WORKAROUND=true on the command line
- // caused these problems to completely disappear. Therefore at
- // least on Windows we try to enable the single-threaded
- // workaround before creating any OpenGL contexts. In the
- // future, if problems are encountered on other platforms and
- // -DJOGL_SINGLE_THREADED_WORKAROUND=true works around them,
- // we may want to implement a workaround like this on other
- // platforms.
-
- // The algorithm here is to try to find the system directory
- // (assuming it is on the same drive as TMPDIR, exposed
- // through the system property java.io.tmpdir) and see whether
- // a known file in the ATI drivers is present; if it is, we
- // enable the single-threaded workaround.
-
- // If any path down this code fails, we simply bail out -- we
- // don't go to great lengths to figure out if the ATI drivers
- // are present. We could add more checks here in the future if
- // these appear to be insufficient.
-
- String tmpDirProp = System.getProperty("java.io.tmpdir");
- if (tmpDirProp != null) {
- File file = new File(tmpDirProp);
- if (file.isAbsolute()) {
- File parent = null;
- do {
- parent = file.getParentFile();
- if (parent != null) {
- file = parent;
- }
- } while (parent != null);
- // Now the file contains just the drive letter
- file = new File(new File(new File(file, "windows"), "system32"), "atioglxx.dll");
- if (file.exists()) {
- SingleThreadedWorkaround.shouldDoWorkaround();
- }
- }
- }
-
- return( null );
- }
- });
- }
-
- public GraphicsConfiguration chooseGraphicsConfiguration(GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GraphicsDevice device) {
- return null;
- }
-
- public GLContext createGLContext(Component component,
- GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLContext shareWith) {
- if (component != null) {
- return new WindowsOnscreenGLContext(component, capabilities, chooser, shareWith);
- } else {
- return new WindowsOffscreenGLContext(capabilities, chooser, shareWith);
- }
- }
-
- // Return cached GL context
- public static WindowsGLContext getDummyGLContext( final GraphicsDevice device ) {
- checkForDummyContext( device );
- NativeWindowStruct nws = (NativeWindowStruct) dummyContextMap.get(device);
- return nws.getWindowsContext();
- }
-
- // Return cached extension string
- public static String getDummyGLExtensions(final GraphicsDevice device) {
- checkForDummyContext( device );
- String exts = (String) dummyExtensionsMap.get(device);
- return (exts == null) ? "" : exts;
- }
-
- // Return cached GL function pointers
- public static GL getDummyGL(final GraphicsDevice device) {
- checkForDummyContext( device );
- NativeWindowStruct nws = (NativeWindowStruct) dummyContextMap.get(device);
- return( nws.getWindowsContext().getGL() );
- }
-
- /*
- * Locate a cached native window, if one doesn't exist create one amd
- * cache it.
- */
- private static void checkForDummyContext( final GraphicsDevice device ) {
- if (!pendingContextSet.contains(device) && !dummyContextMap.containsKey( device ) ) {
- if (DEBUG) {
- System.err.println("WindowsGLContextFactory.checkForDummyContext() called on thread " +
- Thread.currentThread().getName());
- }
-
- pendingContextSet.add(device);
- GraphicsConfiguration config = device.getDefaultConfiguration();
- Rectangle rect = config.getBounds();
- GLCapabilities caps = new GLCapabilities();
- caps.setDepthBits( 16 );
- // Create a context that we use to query pixel formats
- WindowsOnscreenGLContext context = new WindowsOnscreenGLContext( null, caps, null, null );
- // Start a native thread and grab native screen resources from the thread
- NativeWindowThread nwt = new NativeWindowThread( rect );
- nwt.start();
- long hWnd = 0;
- long tempHDC = 0;
- while( (hWnd = nwt.getHWND()) == 0 || (tempHDC = nwt.getHDC()) == 0 ) {
- Thread.yield();
- }
- // Choose a hardware accelerated pixel format
- PIXELFORMATDESCRIPTOR pfd = context.glCapabilities2PFD( caps, true );
- int pixelFormat = WGL.ChoosePixelFormat( tempHDC, pfd );
- if( pixelFormat == 0 ) {
- System.err.println("Pixel Format is Zero");
- pendingContextSet.remove(device);
- return;
- }
- // Set the hardware accelerated pixel format
- if (!WGL.SetPixelFormat(tempHDC, pixelFormat, pfd)) {
- System.err.println("SetPixelFormat Failed");
- pendingContextSet.remove( device );
- return;
- }
- // Create a rendering context
- long tempHGLRC = WGL.wglCreateContext( tempHDC );
- if( hWnd == 0 || tempHDC == 0 || tempHGLRC == 0 ) {
- pendingContextSet.remove( device );
- return;
- }
- // Store native handles for later use
- NativeWindowStruct nws = new NativeWindowStruct();
- nws.setHWND( hWnd );
- nws.setWindowsContext( context );
- nws.setWindowThread( nwt );
- long currentHDC = WGL.wglGetCurrentDC();
- long currentHGLRC = WGL.wglGetCurrentContext();
- // Make the new hardware accelerated context current
- if( !WGL.wglMakeCurrent( tempHDC, tempHGLRC ) ) {
- pendingContextSet.remove( device );
- return;
- }
- // Grab function pointers
- context.hdc = tempHDC;
- context.hglrc = tempHGLRC;
- context.resetGLFunctionAvailability();
- context.createGL();
- pendingContextSet.remove( device );
- dummyContextMap.put( device, nws );
- String availableGLExtensions = "";
- String availableWGLExtensions = "";
- String availableEXTExtensions = "";
- try {
- availableWGLExtensions = context.getGL().wglGetExtensionsStringARB( currentHDC );
- } catch( GLException e ) {
- }
- try {
- availableEXTExtensions = context.getGL().wglGetExtensionsStringEXT();
- } catch( GLException e ) {
- }
- availableGLExtensions = context.getGL().glGetString( GL.GL_EXTENSIONS );
- dummyExtensionsMap.put(device, availableGLExtensions + " " + availableEXTExtensions + " " + availableWGLExtensions);
- WGL.wglMakeCurrent( currentHDC, currentHGLRC );
- }
- }
-
- /*
- * This class stores handles to native resources that need to be destroyed
- * at JVM shutdown.
- */
- static class NativeWindowStruct {
- private long HWND;
- private WindowsGLContext windowsContext;
- private Thread windowThread;
-
- public NativeWindowStruct() {
- }
-
- public long getHDC() {
- return( windowsContext.hdc );
- }
-
- public long getHGLRC() {
- return( windowsContext.hglrc );
- }
-
- public void setHWND( long hwnd ) {
- HWND = hwnd;
- }
-
- public long getHWND() {
- return( HWND );
- }
-
- public void setWindowsContext( WindowsGLContext context ) {
- windowsContext = context;
- }
-
- public WindowsGLContext getWindowsContext() {
- return( windowsContext );
- }
-
- public void setWindowThread( Thread thread ) {
- windowThread = thread;
- }
-
- public Thread getWindowThread() {
- return( windowThread );
- }
- }
-
- /*
- * Native HWDN and HDC handles must be created and destroyed on the same
- * thread.
- */
-
- static class NativeWindowThread extends Thread {
- private long HWND = 0;
- private long HDC = 0;
- private Rectangle rectangle;
-
- public NativeWindowThread( Rectangle rect ) {
- rectangle = rect;
- }
-
- public synchronized long getHWND() {
- return( HWND );
- }
-
- public synchronized long getHDC() {
- return( HDC );
- }
-
- public void run() {
- // Create a native window and device context
- synchronized (WindowsGLContextFactory.class) {
- HWND = WGL.CreateDummyWindow( rectangle.x, rectangle.y, rectangle.width, rectangle.height );
- }
- HDC = WGL.GetDC( HWND );
-
- // Start the message pump at shutdown
- WGL.NativeEventLoop();
- }
- }
-
- /*
- * This class is registered with the JVM to destroy all cached redering
- * contexts, device contexts, and window handles.
- */
-
- class ShutdownHook extends Thread {
- public void run() {
- // Collect all saved screen resources
- Collection c = dummyContextMap.values();
- Iterator iter = c.iterator();
- while( iter.hasNext() ) {
- // NativeWindowStruct holds refs to native resources that need to be destroyed
- NativeWindowStruct struct = (NativeWindowStruct)iter.next();
- // Restart native window threads to respond to window closing events
- synchronized( struct.getWindowThread() ) {
- struct.getWindowThread().notifyAll();
- }
- // Destroy OpenGL rendering context
- if( !WGL.wglDeleteContext( struct.getHGLRC() ) ) {
- System.err.println( "Error Destroying NativeWindowStruct RC: " + WGL.GetLastError() );
- }
- // Send context handles to native method for deletion
- WGL.DestroyDummyWindow( struct.getHWND(), struct.getHDC() );
- }
- }
- }
-}
diff --git a/src/net/java/games/jogl/impl/windows/WindowsOnscreenGLContext.java b/src/net/java/games/jogl/impl/windows/WindowsOnscreenGLContext.java
deleted file mode 100644
index 0dc1818fb..000000000
--- a/src/net/java/games/jogl/impl/windows/WindowsOnscreenGLContext.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl.impl.windows;
-
-import java.awt.Component;
-import java.util.*;
-
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
-
-public class WindowsOnscreenGLContext extends WindowsGLContext {
- // Variables for lockSurface/unlockSurface
- JAWT_DrawingSurface ds;
- JAWT_DrawingSurfaceInfo dsi;
- JAWT_Win32DrawingSurfaceInfo win32dsi;
-
- // Variables for pbuffer support
- List pbuffersToInstantiate = new ArrayList();
-
- public WindowsOnscreenGLContext(Component component,
- GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLContext shareWith) {
- super(component, capabilities, chooser, shareWith);
- }
-
- public void invokeGL(Runnable runnable, boolean isReshape, Runnable initAction) throws GLException {
- // Unfortunately, invokeGL can be called with the AWT tree lock
- // held, and the Windows onscreen implementation of
- // choosePixelFormatAndCreateContext calls
- // Component.getGraphicsConfiguration(), which grabs the tree
- // lock. To avoid deadlock we have to lock the tree lock before
- // grabbing the GLContext's lock if we're going to create an
- // OpenGL context during this call. This code might not be
- // completely correct, and we might need to uniformly grab the AWT
- // tree lock, which might become a performance issue...
- if (hglrc == 0) {
- synchronized(component.getTreeLock()) {
- super.invokeGL(runnable, isReshape, initAction);
- }
- } else {
- super.invokeGL(runnable, isReshape, initAction);
- }
- }
-
- protected GL createGL()
- {
- return new WindowsGLImpl(this);
- }
-
- protected boolean isOffscreen() {
- return false;
- }
-
- public int getOffscreenContextReadBuffer() {
- throw new GLException("Should not call this");
- }
-
- public boolean offscreenImageNeedsVerticalFlip() {
- throw new GLException("Should not call this");
- }
-
- public boolean canCreatePbufferContext() {
- return haveWGLARBPbuffer();
- }
-
- public synchronized GLContext createPbufferContext(GLCapabilities capabilities,
- int initialWidth,
- int initialHeight) {
- WindowsPbufferGLContext ctx = new WindowsPbufferGLContext(capabilities, initialWidth, initialHeight);
- pbuffersToInstantiate.add(ctx);
- return ctx;
- }
-
- public void bindPbufferToTexture() {
- throw new GLException("Should not call this");
- }
-
- public void releasePbufferFromTexture() {
- throw new GLException("Should not call this");
- }
-
- protected synchronized boolean makeCurrent(Runnable initAction) throws GLException {
- try {
- if (!lockSurface()) {
- return false;
- }
- boolean ret = super.makeCurrent(initAction);
- if (ret) {
- // Instantiate any pending pbuffers
- while (!pbuffersToInstantiate.isEmpty()) {
- WindowsPbufferGLContext ctx =
- (WindowsPbufferGLContext) pbuffersToInstantiate.remove(pbuffersToInstantiate.size() - 1);
- ctx.createPbuffer(hdc, hglrc);
- }
- }
- return ret;
- } catch (RuntimeException e) {
- try {
- unlockSurface();
- } catch (Exception e2) {
- // do nothing if unlockSurface throws
- }
- throw(e);
- }
- }
-
- protected synchronized void free() throws GLException {
- try {
- super.free();
- } finally {
- unlockSurface();
- }
- }
-
- public synchronized void swapBuffers() throws GLException {
- if (!WGL.SwapBuffers(hdc) && (WGL.GetLastError() != 0)) {
- throw new GLException("Error swapping buffers");
- }
- }
-
- private boolean lockSurface() throws GLException {
- if (hdc != 0) {
- throw new GLException("Surface already locked");
- }
- ds = getJAWT().GetDrawingSurface(component);
- if (ds == null) {
- // Widget not yet realized
- return false;
- }
- int res = ds.Lock();
- if ((res & JAWTFactory.JAWT_LOCK_ERROR) != 0) {
- throw new GLException("Unable to lock surface");
- }
- // See whether the surface changed and if so destroy the old
- // OpenGL context so it will be recreated (NOTE: removeNotify
- // should handle this case, but it may be possible that race
- // conditions can cause this code to be triggered -- should test
- // more)
- if ((res & JAWTFactory.JAWT_LOCK_SURFACE_CHANGED) != 0) {
- if (hglrc != 0) {
- if (!WGL.wglDeleteContext(hglrc)) {
- throw new GLException("Unable to delete old GL context after surface changed");
- }
- GLContextShareSet.contextDestroyed(this);
- if (DEBUG) {
- System.err.println(getThreadName() + ": !!! Destroyed OpenGL context " + hglrc + " due to JAWT_LOCK_SURFACE_CHANGED");
- }
- hglrc = 0;
- }
- }
- dsi = ds.GetDrawingSurfaceInfo();
- if (dsi == null) {
- // Widget not yet realized
- ds.Unlock();
- getJAWT().FreeDrawingSurface(ds);
- ds = null;
- return false;
- }
- win32dsi = (JAWT_Win32DrawingSurfaceInfo) dsi.platformInfo();
- hdc = win32dsi.hdc();
- if (hdc == 0) {
- // Widget not yet realized
- ds.FreeDrawingSurfaceInfo(dsi);
- ds.Unlock();
- getJAWT().FreeDrawingSurface(ds);
- ds = null;
- dsi = null;
- win32dsi = null;
- return false;
- }
- return true;
- }
-
- private void unlockSurface() {
- if (hdc == 0) {
- throw new GLException("Surface already unlocked");
- }
- ds.FreeDrawingSurfaceInfo(dsi);
- ds.Unlock();
- getJAWT().FreeDrawingSurface(ds);
- ds = null;
- dsi = null;
- win32dsi = null;
- hdc = 0;
- }
-
- protected void create() {
- choosePixelFormatAndCreateContext(true);
- }
-}
diff --git a/src/net/java/games/jogl/impl/windows/WindowsPbufferGLContext.java b/src/net/java/games/jogl/impl/windows/WindowsPbufferGLContext.java
deleted file mode 100644
index 1d5d78296..000000000
--- a/src/net/java/games/jogl/impl/windows/WindowsPbufferGLContext.java
+++ /dev/null
@@ -1,529 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl.impl.windows;
-
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
-
-public class WindowsPbufferGLContext extends WindowsGLContext {
- private static final boolean DEBUG = Debug.debug("WindowsPbufferGLContext");
-
- private int initWidth;
- private int initHeight;
-
- private long buffer; // pbuffer handle
- private int width;
- private int height;
-
- // FIXME: kept around because we create the OpenGL context lazily to
- // better integrate with the WindowsGLContext framework
- private long parentHglrc;
-
- private static final int MAX_PFORMATS = 256;
- private static final int MAX_ATTRIBS = 256;
-
- // State for render-to-texture and render-to-texture-rectangle support
- private boolean created;
- private boolean rtt; // render-to-texture?
- private boolean hasRTT; // render-to-texture extension available?
- private boolean rect; // render-to-texture-rectangle?
- private int textureTarget; // e.g. GL_TEXTURE_2D, GL_TEXTURE_RECTANGLE_NV
- private int texture; // actual texture object
- private int floatMode;
-
- public WindowsPbufferGLContext(GLCapabilities capabilities, int initialWidth, int initialHeight) {
- super(null, capabilities, null, null);
- this.initWidth = initialWidth;
- this.initHeight = initialHeight;
- if (initWidth <= 0 || initHeight <= 0) {
- throw new GLException("Initial width and height of pbuffer must be positive (were (" +
- initWidth + ", " + initHeight + "))");
- }
-
- if (DEBUG) {
- System.out.println("Pbuffer caps on init: " + capabilities +
- (capabilities.getOffscreenRenderToTexture() ? " [rtt]" : "") +
- (capabilities.getOffscreenRenderToTextureRectangle() ? " [rect]" : "") +
- (capabilities.getOffscreenFloatingPointBuffers() ? " [float]" : ""));
- }
- }
-
- public boolean canCreatePbufferContext() {
- return false;
- }
-
- public GLContext createPbufferContext(GLCapabilities capabilities,
- int initialWidth,
- int initialHeight) {
- throw new GLException("Not supported");
- }
-
- public void bindPbufferToTexture() {
- if (!rtt) {
- throw new GLException("Shouldn't try to bind a pbuffer to a texture if render-to-texture hasn't been " +
- "specified in its GLCapabilities");
- }
- GL gl = getGL();
- gl.glBindTexture(textureTarget, texture);
- if (rtt && hasRTT) {
- if (!gl.wglBindTexImageARB(buffer, GL.WGL_FRONT_LEFT_ARB)) {
- throw new GLException("Binding of pbuffer to texture failed: " + wglGetLastError());
- }
- }
- // Note that if the render-to-texture extension is not supported,
- // we perform a glCopyTexImage2D in swapBuffers().
- }
-
- public void releasePbufferFromTexture() {
- if (!rtt) {
- throw new GLException("Shouldn't try to bind a pbuffer to a texture if render-to-texture hasn't been " +
- "specified in its GLCapabilities");
- }
- if (rtt && hasRTT) {
- GL gl = getGL();
- if (!gl.wglReleaseTexImageARB(buffer, GL.WGL_FRONT_LEFT_ARB)) {
- throw new GLException("Releasing of pbuffer from texture failed: " + wglGetLastError());
- }
- }
- }
-
- public void createPbuffer(long parentHdc, long parentHglrc) {
- GL gl = getGL();
- // Must initally grab OpenGL function pointers while parent's
- // context is current because otherwise we don't have the wgl
- // extensions available to us
- resetGLFunctionAvailability();
-
- int[] iattributes = new int [2*MAX_ATTRIBS];
- float[] fattributes = new float[2*MAX_ATTRIBS];
- int nfattribs = 0;
- int niattribs = 0;
-
- if (DEBUG) {
- System.out.println("Pbuffer caps: " + capabilities +
- (capabilities.getOffscreenRenderToTexture() ? " [rtt]" : "") +
- (capabilities.getOffscreenRenderToTextureRectangle() ? " [rect]" : "") +
- (capabilities.getOffscreenFloatingPointBuffers() ? " [float]" : ""));
- }
-
- rtt = capabilities.getOffscreenRenderToTexture();
- rect = capabilities.getOffscreenRenderToTextureRectangle();
- boolean useFloat = capabilities.getOffscreenFloatingPointBuffers();
- boolean ati = false;
-
- // Since we are trying to create a pbuffer, the pixel format we
- // request (and subsequently use) must be "p-buffer capable".
- iattributes[niattribs++] = GL.WGL_DRAW_TO_PBUFFER_ARB;
- iattributes[niattribs++] = GL.GL_TRUE;
-
- if (rtt && !rect) {
- throw new GLException("Render-to-texture-rectangle requires render-to-texture to be specified");
- }
-
- if (rect) {
- if (!gl.isExtensionAvailable("GL_NV_texture_rectangle")) {
- throw new GLException("Render-to-texture-rectangle requires GL_NV_texture_rectangle extension");
- }
- }
-
- if (useFloat) {
- if (!gl.isExtensionAvailable("WGL_ATI_pixel_format_float") &&
- !gl.isExtensionAvailable("WGL_NV_float_buffer")) {
- throw new GLException("Floating-point pbuffers not supported by this hardware");
- }
-
- // Prefer NVidia extension over ATI
- if (gl.isExtensionAvailable("WGL_NV_float_buffer")) {
- ati = false;
- floatMode = GLPbuffer.NV_FLOAT;
- } else {
- ati = true;
- floatMode = GLPbuffer.ATI_FLOAT;
- }
- if (DEBUG) {
- System.err.println("Using " + (ati ? "ATI" : "NVidia") + " floating-point extension");
- }
- }
-
- if (useFloat && ati) {
- if (rtt) {
- throw new GLException("Render-to-floating-point-texture not supported on ATI hardware");
- } else {
- iattributes[niattribs++] = GL.WGL_PIXEL_TYPE_ARB;
- iattributes[niattribs++] = GL.WGL_TYPE_RGBA_FLOAT_ATI;
- }
- } else {
- if (!rtt) {
- // Currently we don't support non-truecolor visuals in the
- // GLCapabilities, so we don't offer the option of making
- // color-index pbuffers.
- iattributes[niattribs++] = GL.WGL_PIXEL_TYPE_ARB;
- iattributes[niattribs++] = GL.WGL_TYPE_RGBA_ARB;
- }
- }
-
- iattributes[niattribs++] = GL.WGL_DOUBLE_BUFFER_ARB;
- if (capabilities.getDoubleBuffered()) {
- iattributes[niattribs++] = GL.GL_TRUE;
- } else {
- iattributes[niattribs++] = GL.GL_FALSE;
- }
-
- iattributes[niattribs++] = GL.WGL_DEPTH_BITS_ARB;
- iattributes[niattribs++] = capabilities.getDepthBits();
-
- iattributes[niattribs++] = GL.WGL_RED_BITS_ARB;
- iattributes[niattribs++] = capabilities.getRedBits();
-
- iattributes[niattribs++] = GL.WGL_GREEN_BITS_ARB;
- iattributes[niattribs++] = capabilities.getGreenBits();
-
- iattributes[niattribs++] = GL.WGL_BLUE_BITS_ARB;
- iattributes[niattribs++] = capabilities.getBlueBits();
-
- iattributes[niattribs++] = GL.WGL_ALPHA_BITS_ARB;
- iattributes[niattribs++] = capabilities.getAlphaBits();
-
- iattributes[niattribs++] = GL.WGL_STENCIL_BITS_ARB;
- if (capabilities.getStencilBits() > 0) {
- iattributes[niattribs++] = GL.GL_TRUE;
- } else {
- iattributes[niattribs++] = GL.GL_FALSE;
- }
-
- if (capabilities.getAccumRedBits() > 0 ||
- capabilities.getAccumGreenBits() > 0 ||
- capabilities.getAccumBlueBits() > 0) {
- iattributes[niattribs++] = GL.WGL_ACCUM_BITS_ARB;
- iattributes[niattribs++] = GL.GL_TRUE;
- }
-
- if (useFloat && !ati) {
- iattributes[niattribs++] = GL.WGL_FLOAT_COMPONENTS_NV;
- iattributes[niattribs++] = GL.GL_TRUE;
- }
-
- if (rtt) {
- if (useFloat) {
- assert(!ati);
- if (!rect) {
- throw new GLException("Render-to-floating-point-texture only supported on NVidia hardware with render-to-texture-rectangle");
- }
- iattributes[niattribs++] = GL.WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV;
- iattributes[niattribs++] = GL.GL_TRUE;
- } else {
- iattributes[niattribs++] = rect ? GL.WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV : GL.WGL_BIND_TO_TEXTURE_RGB_ARB;
- iattributes[niattribs++] = GL.GL_TRUE;
- }
- }
-
- iattributes[niattribs++] = GL.WGL_SUPPORT_OPENGL_ARB;
- iattributes[niattribs++] = GL.GL_TRUE;
-
- int[] pformats = new int[MAX_PFORMATS];
- int nformats;
- int[] nformatsTmp = new int[1];
- if (!gl.wglChoosePixelFormatARB(parentHdc,
- iattributes,
- fattributes,
- MAX_PFORMATS,
- pformats,
- nformatsTmp)) {
- throw new GLException("pbuffer creation error: wglChoosePixelFormatARB() failed");
- }
- nformats = nformatsTmp[0];
- if (nformats <= 0) {
- throw new GLException("pbuffer creation error: Couldn't find a suitable pixel format");
- }
-
- if (DEBUG) {
- System.err.println("" + nformats + " suitable pixel formats found");
- // query pixel format
- iattributes[0] = GL.WGL_RED_BITS_ARB;
- iattributes[1] = GL.WGL_GREEN_BITS_ARB;
- iattributes[2] = GL.WGL_BLUE_BITS_ARB;
- iattributes[3] = GL.WGL_ALPHA_BITS_ARB;
- iattributes[4] = GL.WGL_DEPTH_BITS_ARB;
- iattributes[5] = (useFloat ? (ati ? GL.WGL_PIXEL_TYPE_ARB : GL.WGL_FLOAT_COMPONENTS_NV) : GL.WGL_RED_BITS_ARB);
- iattributes[6] = GL.WGL_SAMPLE_BUFFERS_EXT;
- iattributes[7] = GL.WGL_SAMPLES_EXT;
- iattributes[8] = GL.WGL_DRAW_TO_PBUFFER_ARB;
- int[] ivalues = new int[9];
- for (int i = 0; i < nformats; i++) {
- if (!gl.wglGetPixelFormatAttribivARB(parentHdc, pformats[i], 0, 9, iattributes, ivalues)) {
- throw new GLException("Error while querying pixel format " + pformats[i] +
- "'s (index " + i + "'s) capabilities for debugging");
- }
- System.err.print("pixel format " + pformats[i] + " (index " + i + "): ");
- System.err.print( "r: " + ivalues[0]);
- System.err.print(" g: " + ivalues[1]);
- System.err.print(" b: " + ivalues[2]);
- System.err.print(" a: " + ivalues[3]);
- System.err.print(" depth: " + ivalues[4]);
- System.err.print(" multisample: " + ivalues[6]);
- System.err.print(" samples: " + ivalues[7]);
- if (useFloat) {
- if (ati) {
- if (ivalues[5] == GL.WGL_TYPE_RGBA_FLOAT_ATI) {
- System.err.print(" [ati float]");
- } else if (ivalues[5] != GL.WGL_TYPE_RGBA_ARB) {
- System.err.print(" [unknown pixel type " + ivalues[5] + "]");
- }
- } else {
- if (ivalues[5] != 0) {
- System.err.print(" [float]");
- }
- }
- }
-
- if (ivalues[8] != 0) {
- System.err.print(" [pbuffer]");
- }
- System.err.println();
- }
- }
-
- long tmpBuffer = 0;
- int whichFormat = 0;
- // Loop is a workaround for bugs in NVidia's recent drivers
- do {
- int format = pformats[whichFormat];
-
- // Create the p-buffer.
- niattribs = 0;
-
- if (rtt) {
- iattributes[niattribs++] = GL.WGL_TEXTURE_FORMAT_ARB;
- if (useFloat) {
- iattributes[niattribs++] = GL.WGL_TEXTURE_FLOAT_RGB_NV;
- } else {
- iattributes[niattribs++] = GL.WGL_TEXTURE_RGBA_ARB;
- }
-
- iattributes[niattribs++] = GL.WGL_TEXTURE_TARGET_ARB;
- iattributes[niattribs++] = rect ? GL.WGL_TEXTURE_RECTANGLE_NV : GL.WGL_TEXTURE_2D_ARB;
-
- iattributes[niattribs++] = GL.WGL_MIPMAP_TEXTURE_ARB;
- iattributes[niattribs++] = GL.GL_FALSE;
-
- iattributes[niattribs++] = GL.WGL_PBUFFER_LARGEST_ARB;
- iattributes[niattribs++] = GL.GL_FALSE;
- }
-
- iattributes[niattribs++] = 0;
-
- tmpBuffer = gl.wglCreatePbufferARB(parentHdc, format, initWidth, initHeight, iattributes);
- ++whichFormat;
- } while ((tmpBuffer == 0) && (whichFormat < nformats));
-
- if (tmpBuffer == 0) {
- throw new GLException("pbuffer creation error: wglCreatePbufferARB() failed: tried " + nformats +
- " pixel formats, last error was: " + wglGetLastError());
- }
-
- // Get the device context.
- long tmpHdc = gl.wglGetPbufferDCARB(tmpBuffer);
- if (tmpHdc == 0) {
- throw new GLException("pbuffer creation error: wglGetPbufferDCARB() failed");
- }
-
- this.parentHglrc = parentHglrc;
-
- // Set up instance variables
- buffer = tmpBuffer;
- hdc = tmpHdc;
-
- // Determine the actual width and height we were able to create.
- int[] tmp = new int[1];
- gl.wglQueryPbufferARB( buffer, GL.WGL_PBUFFER_WIDTH_ARB, tmp );
- width = tmp[0];
- gl.wglQueryPbufferARB( buffer, GL.WGL_PBUFFER_HEIGHT_ARB, tmp );
- height = tmp[0];
-
- if (DEBUG) {
- System.err.println("Created pbuffer " + width + " x " + height);
- }
- }
-
- protected synchronized boolean makeCurrent(Runnable initAction) throws GLException {
- created = false;
-
- if (buffer == 0) {
- // pbuffer not instantiated yet
- if (DEBUG) {
- System.err.println("pbuffer not instantiated yet");
- }
- return false;
- }
-
- boolean res = super.makeCurrent(initAction);
- if (DEBUG) {
- System.err.println("super.makeCurrent() = " + res + ", created = " + created);
- }
- if (created) {
- // Initialize render-to-texture support if requested
- rtt = capabilities.getOffscreenRenderToTexture();
- rect = capabilities.getOffscreenRenderToTextureRectangle();
-
- if (rtt) {
- if (DEBUG) {
- System.err.println("Initializing render-to-texture support");
- }
-
- if (!gl.isExtensionAvailable("WGL_ARB_render_texture")) {
- System.err.println("WindowsPbufferGLContext: WARNING: WGL_ARB_render_texture extension not " +
- "supported; implementing render_to_texture support using slow texture readback");
- } else {
- hasRTT = true;
- GL gl = getGL();
-
- if (rect && !gl.isExtensionAvailable("GL_NV_texture_rectangle")) {
- System.err.println("WindowsPbufferGLContext: WARNING: GL_NV_texture_rectangle extension not " +
- "supported; skipping requested render_to_texture_rectangle support for pbuffer");
- rect = false;
- }
- if (rect) {
- if (DEBUG) {
- System.err.println(" Using render-to-texture-rectangle");
- }
- textureTarget = GL.GL_TEXTURE_RECTANGLE_NV;
- } else {
- if (DEBUG) {
- System.err.println(" Using vanilla render-to-texture");
- }
- textureTarget = GL.GL_TEXTURE_2D;
- }
- int[] tmp = new int[1];
- gl.glGenTextures(1, tmp);
- texture = tmp[0];
- gl.glBindTexture(textureTarget, texture);
- gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
- gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
- gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP_TO_EDGE);
- gl.glTexParameteri(textureTarget, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP_TO_EDGE);
- gl.glCopyTexImage2D(textureTarget, 0, GL.GL_RGB, 0, 0, width, height, 0);
- }
- }
- }
- return res;
- }
-
- public void handleModeSwitch(long parentHdc, long parentHglrc) {
- throw new GLException("Not yet implemented");
- }
-
- protected boolean isOffscreen() {
- // FIXME: currently the only caller of this won't cause proper
- // resizing of the pbuffer anyway.
- return false;
- }
-
- public int getOffscreenContextReadBuffer() {
- throw new GLException("Should not call this");
- }
-
- public boolean offscreenImageNeedsVerticalFlip() {
- throw new GLException("Should not call this");
- }
-
- protected void create() {
- created = true;
- // Create a gl context for the p-buffer.
- hglrc = WGL.wglCreateContext(hdc);
- if (hglrc == 0) {
- throw new GLException("pbuffer creation error: wglCreateContext() failed");
- }
-
- // FIXME: provide option to not share display lists with subordinate pbuffer?
- if (!WGL.wglShareLists(parentHglrc, hglrc)) {
- throw new GLException("pbuffer: wglShareLists() failed");
- }
- }
-
- protected void destroyImpl() throws GLException {
- if (hglrc != 0) {
- super.destroyImpl();
- // Must release DC and pbuffer
- // NOTE that since the context is not current, glGetError() can
- // not be called here, so we skip the use of any composable
- // pipelines
- GL gl = createGL();
- if (gl.wglReleasePbufferDCARB(buffer, hdc) == 0) {
- throw new GLException("Error releasing pbuffer device context: error code " + WGL.GetLastError());
- }
- hdc = 0;
- if (!gl.wglDestroyPbufferARB(buffer)) {
- throw new GLException("Error destroying pbuffer: error code " + WGL.GetLastError());
- }
- buffer = 0;
- }
- }
-
- public void swapBuffers() throws GLException {
- // FIXME: do we need to do anything if the pbuffer is double-buffered?
- // For now, just grab the pixels for the render-to-texture support.
- if (rtt && !hasRTT) {
- if (DEBUG) {
- System.err.println("Copying pbuffer data to GL_TEXTURE_2D state");
- }
-
- GL gl = getGL();
- gl.glCopyTexSubImage2D(textureTarget, 0, 0, 0, 0, 0, width, height);
- }
- }
-
- public int getFloatingPointMode() {
- return floatMode;
- }
-
- private String wglGetLastError() {
- int err = WGL.GetLastError();
- String detail = null;
- switch (err) {
- case WGL.ERROR_INVALID_PIXEL_FORMAT: detail = "ERROR_INVALID_PIXEL_FORMAT"; break;
- case WGL.ERROR_NO_SYSTEM_RESOURCES: detail = "ERROR_NO_SYSTEM_RESOURCES"; break;
- case WGL.ERROR_INVALID_DATA: detail = "ERROR_INVALID_DATA"; break;
- case WGL.ERROR_PROC_NOT_FOUND: detail = "ERROR_PROC_NOT_FOUND"; break;
- case WGL.ERROR_INVALID_WINDOW_HANDLE:detail = "ERROR_INVALID_WINDOW_HANDLE"; break;
- default: detail = "(Unknown error code " + err + ")"; break;
- }
- return detail;
- }
-}
diff --git a/src/net/java/games/jogl/impl/x11/X11GLContext.java b/src/net/java/games/jogl/impl/x11/X11GLContext.java
deleted file mode 100644
index 53f44101f..000000000
--- a/src/net/java/games/jogl/impl/x11/X11GLContext.java
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl.impl.x11;
-
-import java.awt.Component;
-import java.security.*;
-import java.util.*;
-import net.java.games.gluegen.runtime.*; // for PROCADDRESS_VAR_PREFIX
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
-
-public abstract class X11GLContext extends GLContext {
- protected long display;
- protected long drawable;
- protected long visualID;
- protected long context;
- private boolean glXQueryExtensionsStringInitialized;
- private boolean glXQueryExtensionsStringAvailable;
- private static final Map/*<String, String>*/ functionNameMap;
- private boolean isGLX13;
- // Table that holds the addresses of the native C-language entry points for
- // OpenGL functions.
- private GLProcAddressTable glProcAddressTable;
- private static boolean haveResetGLXProcAddressTable;
- // Cache the most recent value of the "display" variable (which we
- // only guarantee to be valid in between makeCurrent / free pairs)
- // so that we can implement displayImpl() (which must be done when
- // the context is not current)
- protected long mostRecentDisplay;
- // There is currently a bug on Linux/AMD64 distributions in glXGetProcAddressARB
- protected static boolean isLinuxAMD64;
-
- static {
- functionNameMap = new HashMap();
- functionNameMap.put("glAllocateMemoryNV", "glXAllocateMemoryNV");
- functionNameMap.put("glFreeMemoryNV", "glXFreeMemoryNV");
-
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- String os = System.getProperty("os.name").toLowerCase();
- String arch = System.getProperty("os.arch").toLowerCase();
- if (os.startsWith("linux") && arch.equals("amd64")) {
- isLinuxAMD64 = true;
- }
- return null;
- }
- });
- }
-
- public X11GLContext(Component component,
- GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLContext shareWith) {
- super(component, capabilities, chooser, shareWith);
- }
-
- protected GL createGL()
- {
- return new X11GLImpl(this);
- }
-
- protected String mapToRealGLFunctionName(String glFunctionName) {
- String lookup = (String) functionNameMap.get(glFunctionName);
- if (lookup != null) {
- return lookup;
- }
- return glFunctionName;
- }
-
- protected String mapToRealGLExtensionName(String glExtensionName) {
- return glExtensionName;
- }
-
- protected abstract boolean isOffscreen();
-
- public int getOffscreenContextWidth() {
- throw new GLException("Should not call this");
- }
-
- public int getOffscreenContextHeight() {
- throw new GLException("Should not call this");
- }
-
- public int getOffscreenContextPixelDataType() {
- throw new GLException("Should not call this");
- }
-
- public abstract int getOffscreenContextReadBuffer();
-
- public abstract boolean offscreenImageNeedsVerticalFlip();
-
- public synchronized void setRenderingThread(Thread currentThreadOrNull, Runnable initAction) {
- this.willSetRenderingThread = false;
- // FIXME: the JAWT on X11 grabs the AWT lock while the
- // DrawingSurface is locked, which means that no other events can
- // be processed. Currently we handle this by preventing the
- // effects of setRenderingThread. We should figure out a better
- // solution that is reasonably robust. Must file a bug to be fixed
- // in the 1.5 JAWT.
- }
-
- /**
- * Creates and initializes an appropriate OpenGl context. Should only be
- * called by {@link makeCurrent(Runnable)}.
- */
- protected abstract void create();
-
- public boolean isExtensionAvailable(String glExtensionName) {
- if (glExtensionName.equals("GL_ARB_pbuffer") ||
- glExtensionName.equals("GL_ARB_pixel_format")) {
- return isGLX13;
- }
- return super.isExtensionAvailable(glExtensionName);
- }
-
- protected synchronized boolean makeCurrent(Runnable initAction) throws GLException {
- boolean created = false;
- if (context == 0) {
- create();
- if (DEBUG) {
- System.err.println("!!! Created GL context for " + getClass().getName());
- }
- created = true;
- }
- if (drawable == 0) {
- throw new GLException("Unable to make context current; drawable was null");
- }
-
- // FIXME: this cast to int would be wrong on 64-bit platforms
- // where the argument type to glXMakeCurrent would change (should
- // probably make GLXDrawable, and maybe XID, Opaque as long)
- if (!GLX.glXMakeCurrent(display, (int) drawable, context)) {
- throw new GLException("Error making context current");
- }
-
- if (created) {
- resetGLFunctionAvailability();
- initAction.run();
- }
- return true;
- }
-
- protected synchronized void free() throws GLException {
- if (!GLX.glXMakeCurrent(display, 0, 0)) {
- throw new GLException("Error freeing OpenGL context");
- }
- }
-
- protected void destroyImpl() throws GLException {
- lockAWT();
- if (context != 0) {
- GLX.glXDestroyContext(mostRecentDisplay, context);
- if (DEBUG) {
- System.err.println("!!! Destroyed OpenGL context " + context);
- }
- context = 0;
- }
- unlockAWT();
- }
-
- public abstract void swapBuffers() throws GLException;
-
- protected long dynamicLookupFunction(String glFuncName) {
- long res = 0;
- if (!isLinuxAMD64) {
- res = GLX.glXGetProcAddressARB(glFuncName);
- }
- if (res == 0) {
- // GLU routines aren't known to the OpenGL function lookup
- res = GLX.dlsym(glFuncName);
- }
- return res;
- }
-
- public boolean isCreated() {
- return (context != 0);
- }
-
- protected void resetGLFunctionAvailability() {
- super.resetGLFunctionAvailability();
- if (DEBUG) {
- System.err.println("!!! Initializing OpenGL extension address table");
- }
- resetProcAddressTable(getGLProcAddressTable());
-
- if (!haveResetGLXProcAddressTable) {
- resetProcAddressTable(GLX.getGLXProcAddressTable());
- }
-
- // Figure out whether we are running GLX version 1.3 or above and
- // therefore have pbuffer support
- if (display == 0) {
- throw new GLException("Expected non-null DISPLAY for querying GLX version");
- }
- int[] major = new int[1];
- int[] minor = new int[1];
- if (!GLX.glXQueryVersion(display, major, minor)) {
- throw new GLException("glXQueryVersion failed");
- }
- if (DEBUG) {
- System.err.println("!!! GLX version: major " + major[0] +
- ", minor " + minor[0]);
- }
-
- // Work around bugs in ATI's Linux drivers where they report they
- // only implement GLX version 1.2 but actually do support pbuffers
- if (major[0] == 1 && minor[0] == 2) {
- GL gl = getGL();
- String str = gl.glGetString(GL.GL_VENDOR);
- if (str != null && str.indexOf("ATI") >= 0) {
- isGLX13 = true;
- return;
- }
- }
-
- isGLX13 = ((major[0] > 1) || (minor[0] > 2));
- }
-
- public GLProcAddressTable getGLProcAddressTable() {
- if (glProcAddressTable == null) {
- // FIXME: cache ProcAddressTables by capability bits so we can
- // share them among contexts with the same capabilities
- glProcAddressTable = new GLProcAddressTable();
- }
- return glProcAddressTable;
- }
-
- public synchronized String getPlatformExtensionsString() {
- if (display == 0) {
- throw new GLException("Context not current");
- }
- if (!glXQueryExtensionsStringInitialized) {
- glXQueryExtensionsStringAvailable = (dynamicLookupFunction("glXQueryExtensionsString") != 0);
- glXQueryExtensionsStringInitialized = true;
- }
- if (glXQueryExtensionsStringAvailable) {
- lockAWT();
- try {
- String ret = GLX.glXQueryExtensionsString(display, GLX.DefaultScreen(display));
- if (DEBUG) {
- System.err.println("!!! GLX extensions: " + ret);
- }
- return ret;
- } finally {
- unlockAWT();
- }
- } else {
- return "";
- }
- }
-
- protected boolean isFunctionAvailable(String glFunctionName)
- {
- boolean available = super.isFunctionAvailable(glFunctionName);
-
- // Sanity check for implementations that use proc addresses for run-time
- // linking: if the function IS available, then make sure there's a proc
- // address for it if it's an extension or not part of the OpenGL 1.1 core
- // (post GL 1.1 functions are run-time linked on windows).
- assert(!available ||
- (getGLProcAddressTable().getAddressFor(mapToRealGLFunctionName(glFunctionName)) != 0 ||
- FunctionAvailabilityCache.isPartOfGLCore("1.1", mapToRealGLFunctionName(glFunctionName)))
- );
-
- return available;
- }
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- protected JAWT getJAWT() {
- return X11GLContextFactory.getJAWT();
- }
-
- protected XVisualInfo chooseVisual() {
- if (!isOffscreen()) {
- // The visual has already been chosen by the time we get here;
- // it's specified by the GraphicsConfiguration of the
- // GLCanvas. Fortunately, the JAWT supplies the visual ID for
- // the component in a portable fashion, so all we have to do is
- // use XGetVisualInfo with a VisualIDMask to get the
- // corresponding XVisualInfo to pass into glXChooseVisual.
- int[] count = new int[1];
- XVisualInfo template = new XVisualInfo();
- // FIXME: probably not 64-bit clean
- template.visualid((int) visualID);
- XVisualInfo[] infos = GLX.XGetVisualInfo(display, GLX.VisualIDMask, template, count);
- if (infos == null || infos.length == 0) {
- throw new GLException("Error while getting XVisualInfo for visual ID " + visualID);
- }
- // FIXME: the storage for the infos array is leaked (should
- // clean it up somehow when we're done with the visual we're
- // returning)
- return infos[0];
- } else {
- // It isn't clear to me whether we need this much code to handle
- // the offscreen case, where we're creating a pixmap into which
- // to render...this is what we (incorrectly) used to do for the
- // onscreen case
-
- int screen = 0; // FIXME: provide way to specify this?
- XVisualInfo vis = null;
- int[] count = new int[1];
- XVisualInfo template = new XVisualInfo();
- template.screen(screen);
- XVisualInfo[] infos = GLX.XGetVisualInfo(display, GLX.VisualScreenMask, template, count);
- if (infos == null) {
- throw new GLException("Error while enumerating available XVisualInfos");
- }
- GLCapabilities[] caps = new GLCapabilities[infos.length];
- for (int i = 0; i < infos.length; i++) {
- caps[i] = X11GLContextFactory.xvi2GLCapabilities(display, infos[i]);
- }
- int chosen = chooser.chooseCapabilities(capabilities, caps, -1);
- if (chosen < 0 || chosen >= caps.length) {
- throw new GLException("GLCapabilitiesChooser specified invalid index (expected 0.." + (caps.length - 1) + ")");
- }
- if (DEBUG) {
- System.err.println("Chosen visual (" + chosen + "):");
- System.err.println(caps[chosen]);
- }
- vis = infos[chosen];
- if (vis == null) {
- throw new GLException("GLCapabilitiesChooser chose an invalid visual");
- }
- // FIXME: the storage for the infos array is leaked (should
- // clean it up somehow when we're done with the visual we're
- // returning)
-
- return vis;
- }
- }
-
- protected long createContext(XVisualInfo vis, boolean onscreen) {
- X11GLContext other = (X11GLContext) GLContextShareSet.getShareContext(this);
- long share = 0;
- if (other != null) {
- share = other.getContext();
- if (share == 0) {
- throw new GLException("GLContextShareSet returned an invalid OpenGL context");
- }
- }
- long res = GLX.glXCreateContext(display, vis, share, onscreen);
- if (res != 0) {
- GLContextShareSet.contextCreated(this);
- }
- return res;
- }
-
- // Helper routine for the overridden create() to call
- protected void chooseVisualAndCreateContext(boolean onscreen) {
- XVisualInfo vis = chooseVisual();
- context = createContext(vis, onscreen);
- if (context == 0) {
- throw new GLException("Unable to create OpenGL context");
- }
- }
-
- protected long getContext() {
- return context;
- }
-
- // These synchronization primitives prevent the AWT from making
- // requests from the X server asynchronously to this code.
- protected void lockAWT() {
- X11GLContextFactory.lockAWT();
- }
-
- protected void unlockAWT() {
- X11GLContextFactory.unlockAWT();
- }
-}
diff --git a/src/net/java/games/jogl/impl/x11/X11OffscreenGLContext.java b/src/net/java/games/jogl/impl/x11/X11OffscreenGLContext.java
deleted file mode 100644
index 8f0aa06a5..000000000
--- a/src/net/java/games/jogl/impl/x11/X11OffscreenGLContext.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl.impl.x11;
-
-import java.awt.image.BufferedImage;
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
-
-public class X11OffscreenGLContext extends X11GLContext {
- private long pixmap;
- private boolean isDoubleBuffered;
- // Width and height of the underlying bitmap
- private int width;
- private int height;
-
- public X11OffscreenGLContext(GLCapabilities capabilities,
- GLCapabilitiesChooser chooser,
- GLContext shareWith) {
- super(null, capabilities, chooser, shareWith);
- }
-
- protected GL createGL()
- {
- return new X11GLImpl(this);
- }
-
- protected boolean isOffscreen() {
- return true;
- }
-
- public int getOffscreenContextWidth() {
- return width;
- }
-
- public int getOffscreenContextHeight() {
- return height;
- }
-
- public int getOffscreenContextPixelDataType() {
- return GL.GL_UNSIGNED_BYTE;
- }
-
- public int getOffscreenContextReadBuffer() {
- if (isDoubleBuffered) {
- return GL.GL_BACK;
- }
- return GL.GL_FRONT;
- }
-
- public boolean offscreenImageNeedsVerticalFlip() {
- // There doesn't seem to be a way to do this in the construction
- // of the Pixmap or GLXPixmap
- return true;
- }
-
- public boolean canCreatePbufferContext() {
- // For now say no
- return false;
- }
-
- public synchronized GLContext createPbufferContext(GLCapabilities capabilities,
- int initialWidth,
- int initialHeight) {
- throw new GLException("Not supported");
- }
-
- public void bindPbufferToTexture() {
- throw new GLException("Should not call this");
- }
-
- public void releasePbufferFromTexture() {
- throw new GLException("Should not call this");
- }
-
- protected synchronized boolean makeCurrent(Runnable initAction) throws GLException {
- display = X11GLContextFactory.getDisplayConnection();
- if (pendingOffscreenResize) {
- if (pendingOffscreenWidth != width || pendingOffscreenHeight != height) {
- if (context != 0) {
- destroy();
- }
- width = pendingOffscreenWidth;
- height = pendingOffscreenHeight;
- pendingOffscreenResize = false;
- }
- }
- mostRecentDisplay = display;
- return super.makeCurrent(initAction);
- }
-
- public synchronized void swapBuffers() throws GLException {
- }
-
- protected synchronized void free() throws GLException {
- try {
- super.free();
- } finally {
- display = 0;
- }
- }
-
- protected void create() {
- XVisualInfo vis = chooseVisual();
- int bitsPerPixel = vis.depth();
-
- if (display == 0) {
- throw new GLException("No active display");
- }
- int screen = GLX.DefaultScreen(display);
- pixmap = GLX.XCreatePixmap(display, (int) GLX.RootWindow(display, screen), width, height, bitsPerPixel);
- if (pixmap == 0) {
- throw new GLException("XCreatePixmap failed");
- }
- drawable = GLX.glXCreateGLXPixmap(display, vis, pixmap);
- if (drawable == 0) {
- throw new GLException("glXCreateGLXPixmap failed");
- }
- context = createContext(vis, false);
- if (context == 0) {
- throw new GLException("Unable to create OpenGL context");
- }
- isDoubleBuffered = (X11GLContextFactory.glXGetConfig(display, vis, GLX.GLX_DOUBLEBUFFER, new int[1]) != 0);
- }
-
- protected void destroyImpl() {
- if (context != 0) {
- super.destroyImpl();
- // Must destroy OpenGL context, pixmap and GLXPixmap
- GLX.glXDestroyContext(display, context);
- GLX.glXDestroyGLXPixmap(display, (int) drawable);
- GLX.XFreePixmap(display, pixmap);
- context = 0;
- drawable = 0;
- pixmap = 0;
- GLContextShareSet.contextDestroyed(this);
- }
- }
-}
diff --git a/src/net/java/games/jogl/impl/x11/X11PbufferGLContext.java b/src/net/java/games/jogl/impl/x11/X11PbufferGLContext.java
deleted file mode 100644
index d9f18a760..000000000
--- a/src/net/java/games/jogl/impl/x11/X11PbufferGLContext.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl.impl.x11;
-
-import net.java.games.jogl.*;
-import net.java.games.jogl.impl.*;
-
-public class X11PbufferGLContext extends X11GLContext {
- private static final boolean DEBUG = Debug.debug("X11PbufferGLContext");
-
- private int initWidth;
- private int initHeight;
-
- private long buffer; // GLXPbuffer
- private GLXFBConfig fbConfig;
- private int width;
- private int height;
-
- // FIXME: kept around because we create the OpenGL context lazily to
- // better integrate with the X11GLContext framework
- private long parentContext;
-
- private static final int MAX_PFORMATS = 256;
- private static final int MAX_ATTRIBS = 256;
-
- public X11PbufferGLContext(GLCapabilities capabilities, int initialWidth, int initialHeight) {
- super(null, capabilities, null, null);
- this.initWidth = initialWidth;
- this.initHeight = initialHeight;
- if (initWidth <= 0 || initHeight <= 0) {
- throw new GLException("Initial width and height of pbuffer must be positive (were (" +
- initWidth + ", " + initHeight + "))");
- }
- }
-
- public boolean canCreatePbufferContext() {
- return false;
- }
-
- public GLContext createPbufferContext(GLCapabilities capabilities,
- int initialWidth,
- int initialHeight) {
- throw new GLException("Not supported");
- }
-
- public void bindPbufferToTexture() {
- // FIXME: figure out how to implement this
- throw new GLException("Not yet implemented");
- }
-
- public void releasePbufferFromTexture() {
- // FIXME: figure out how to implement this
- throw new GLException("Not yet implemented");
- }
-
- public void createPbuffer(long display, long parentContext, GL gl) {
- if (display == 0) {
- throw new GLException("Null display");
- }
-
- if (parentContext == 0) {
- throw new GLException("Null parentContext");
- }
-
- if (capabilities.getOffscreenRenderToTexture()) {
- throw new GLException("Render-to-texture pbuffers not supported yet on X11");
- }
-
- if (capabilities.getOffscreenRenderToTextureRectangle()) {
- throw new GLException("Render-to-texture-rectangle pbuffers not supported yet on X11");
- }
-
- int[] iattributes = new int [2*MAX_ATTRIBS];
- float[] fattributes = new float[2*MAX_ATTRIBS];
- int nfattribs = 0;
- int niattribs = 0;
-
- // Since we are trying to create a pbuffer, the GLXFBConfig we
- // request (and subsequently use) must be "p-buffer capable".
- iattributes[niattribs++] = GL.GLX_DRAWABLE_TYPE;
- iattributes[niattribs++] = GL.GLX_PBUFFER_BIT;
-
- iattributes[niattribs++] = GL.GLX_RENDER_TYPE;
- iattributes[niattribs++] = GL.GLX_RGBA_BIT;
-
- iattributes[niattribs++] = GLX.GLX_DOUBLEBUFFER;
- if (capabilities.getDoubleBuffered()) {
- iattributes[niattribs++] = GL.GL_TRUE;
- } else {
- iattributes[niattribs++] = GL.GL_FALSE;
- }
-
- iattributes[niattribs++] = GLX.GLX_DEPTH_SIZE;
- iattributes[niattribs++] = capabilities.getDepthBits();
-
- iattributes[niattribs++] = GLX.GLX_RED_SIZE;
- iattributes[niattribs++] = capabilities.getRedBits();
-
- iattributes[niattribs++] = GLX.GLX_GREEN_SIZE;
- iattributes[niattribs++] = capabilities.getGreenBits();
-
- iattributes[niattribs++] = GLX.GLX_BLUE_SIZE;
- iattributes[niattribs++] = capabilities.getBlueBits();
-
- iattributes[niattribs++] = GLX.GLX_ALPHA_SIZE;
- iattributes[niattribs++] = capabilities.getAlphaBits();
-
- if (capabilities.getStencilBits() > 0) {
- iattributes[niattribs++] = GLX.GLX_STENCIL_SIZE;
- iattributes[niattribs++] = capabilities.getStencilBits();
- }
-
- if (capabilities.getAccumRedBits() > 0 ||
- capabilities.getAccumGreenBits() > 0 ||
- capabilities.getAccumBlueBits() > 0) {
- iattributes[niattribs++] = GLX.GLX_ACCUM_RED_SIZE;
- iattributes[niattribs++] = capabilities.getAccumRedBits();
- iattributes[niattribs++] = GLX.GLX_ACCUM_GREEN_SIZE;
- iattributes[niattribs++] = capabilities.getAccumGreenBits();
- iattributes[niattribs++] = GLX.GLX_ACCUM_BLUE_SIZE;
- iattributes[niattribs++] = capabilities.getAccumBlueBits();
- }
-
- if (capabilities.getOffscreenFloatingPointBuffers()) {
- if (!gl.isExtensionAvailable("GLX_NV_float_buffer")) {
- throw new GLException("Floating-point pbuffers on X11 currently require NVidia hardware");
- }
- iattributes[niattribs++] = GLX.GLX_FLOAT_COMPONENTS_NV;
- iattributes[niattribs++] = GL.GL_TRUE;
- }
-
- // FIXME: add FSAA support? Don't want to get into a situation
- // where we have to retry the glXChooseFBConfig call if it fails
- // due to a lack of an antialiased visual...
-
- iattributes[niattribs++] = 0; // null-terminate
-
- int screen = 0; // FIXME: provide way to specify this?
- int[] nelementsTmp = new int[1];
- GLXFBConfig[] fbConfigs = GLX.glXChooseFBConfig(display, screen, iattributes, nelementsTmp);
- if (fbConfigs == null || fbConfigs.length == 0 || fbConfigs[0] == null) {
- throw new GLException("pbuffer creation error: glXChooseFBConfig() failed");
- }
- // Note that we currently don't allow selection of anything but
- // the first GLXFBConfig in the returned list
- GLXFBConfig fbConfig = fbConfigs[0];
- int nelements = nelementsTmp[0];
- if (nelements <= 0) {
- throw new GLException("pbuffer creation error: couldn't find a suitable frame buffer configuration");
- }
-
- if (DEBUG) {
- System.err.println("Found " + fbConfigs.length + " matching GLXFBConfigs");
- System.err.println("Parameters of default one:");
- System.err.println("render type: 0x" + Integer.toHexString(queryFBConfig(display, fbConfig, GLX.GLX_RENDER_TYPE)));
- System.err.println("rgba: " + ((queryFBConfig(display, fbConfig, GLX.GLX_RENDER_TYPE) & GLX.GLX_RGBA_BIT) != 0));
- System.err.println("r: " + queryFBConfig(display, fbConfig, GLX.GLX_RED_SIZE));
- System.err.println("g: " + queryFBConfig(display, fbConfig, GLX.GLX_GREEN_SIZE));
- System.err.println("b: " + queryFBConfig(display, fbConfig, GLX.GLX_BLUE_SIZE));
- System.err.println("a: " + queryFBConfig(display, fbConfig, GLX.GLX_ALPHA_SIZE));
- System.err.println("depth: " + queryFBConfig(display, fbConfig, GLX.GLX_DEPTH_SIZE));
- System.err.println("double buffered: " + queryFBConfig(display, fbConfig, GLX.GLX_DOUBLEBUFFER));
- }
-
- // Create the p-buffer.
- niattribs = 0;
-
- iattributes[niattribs++] = GL.GLX_PBUFFER_WIDTH;
- iattributes[niattribs++] = initWidth;
- iattributes[niattribs++] = GL.GLX_PBUFFER_HEIGHT;
- iattributes[niattribs++] = initHeight;
-
- iattributes[niattribs++] = 0;
-
- long tmpBuffer = GLX.glXCreatePbuffer(display, fbConfig, iattributes);
- if (tmpBuffer == 0) {
- // FIXME: query X error code for detail error message
- throw new GLException("pbuffer creation error: glXCreatePbuffer() failed");
- }
-
- // Set up instance variables
- this.display = display;
- mostRecentDisplay = display;
- this.parentContext = parentContext;
- buffer = tmpBuffer;
- this.fbConfig = fbConfig;
-
- // Determine the actual width and height we were able to create.
- int[] tmp = new int[1];
- GLX.glXQueryDrawable(display, (int) buffer, GL.GLX_WIDTH, tmp);
- width = tmp[0];
- GLX.glXQueryDrawable(display, (int) buffer, GL.GLX_HEIGHT, tmp);
- height = tmp[0];
-
- if (DEBUG) {
- System.err.println("Created pbuffer " + width + " x " + height);
- }
- }
-
- protected synchronized boolean makeCurrent(Runnable initAction) throws GLException {
- if (buffer == 0) {
- // pbuffer not instantiated yet
- return false;
- }
-
- lockAWT();
- try {
- boolean created = false;
- if (context == 0) {
- create();
- if (DEBUG) {
- System.err.println("!!! Created GL context for " + getClass().getName());
- }
- created = true;
- }
-
- if (!GLX.glXMakeContextCurrent(display, buffer, buffer, context)) {
- throw new GLException("Error making context current");
- }
-
- if (created) {
- resetGLFunctionAvailability();
- initAction.run();
- }
- return true;
- } finally {
- unlockAWT();
- }
- }
-
- protected synchronized void free() throws GLException {
- lockAWT();
- try {
- if (!GLX.glXMakeContextCurrent(display, 0, 0, 0)) {
- throw new GLException("Error freeing OpenGL context");
- }
- } finally {
- unlockAWT();
- }
- }
-
- public void handleModeSwitch(long parentHdc, long parentHglrc) {
- throw new GLException("Not yet implemented");
- }
-
- protected boolean isOffscreen() {
- // FIXME: currently the only caller of this won't cause proper
- // resizing of the pbuffer anyway.
- return false;
- }
-
- public int getOffscreenContextReadBuffer() {
- throw new GLException("Should not call this");
- }
-
- public boolean offscreenImageNeedsVerticalFlip() {
- throw new GLException("Should not call this");
- }
-
- protected void create() {
- if (DEBUG) {
- System.err.println("Creating context for pbuffer " + width + " x " + height);
- }
-
- // Create a gl context for the p-buffer.
- // FIXME: provide option to not share display lists with subordinate pbuffer?
- context = GLX.glXCreateNewContext(display, fbConfig, GL.GLX_RGBA_TYPE, parentContext, true);
- if (context == 0) {
- throw new GLException("pbuffer creation error: glXCreateNewContext() failed");
- }
-
- if (DEBUG) {
- System.err.println("Created context for pbuffer " + width + " x " + height);
- }
- }
-
- protected void destroyImpl() throws GLException {
- lockAWT();
- try {
- if (context != 0) {
- super.destroyImpl();
- GLX.glXDestroyPbuffer(display, buffer);
- buffer = 0;
- }
- } finally {
- unlockAWT();
- }
- }
-
- public void swapBuffers() throws GLException {
- // FIXME: do we need to do anything if the pbuffer is double-buffered?
- }
-
- public int getFloatingPointMode() {
- // Floating-point pbuffers currently require NVidia hardware on X11
- return GLPbuffer.NV_FLOAT;
- }
-
- private int queryFBConfig(long display, GLXFBConfig fbConfig, int attrib) {
- int[] tmp = new int[1];
- if (GLX.glXGetFBConfigAttrib(display, fbConfig, attrib, tmp) != 0) {
- throw new GLException("glXGetFBConfigAttrib failed");
- }
- return tmp[0];
- }
-}
diff --git a/src/net/java/games/jogl/util/BufferUtils.java b/src/net/java/games/jogl/util/BufferUtils.java
deleted file mode 100644
index 903a27366..000000000
--- a/src/net/java/games/jogl/util/BufferUtils.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution 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 Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package net.java.games.jogl.util;
-
-import java.nio.*;
-import java.util.*;
-
-/** Utility routines for dealing with direct buffers. */
-
-public class BufferUtils {
- public static final int SIZEOF_DOUBLE = 8;
- public static final int SIZEOF_FLOAT = 4;
- public static final int SIZEOF_INT = 4;
-
- public static DoubleBuffer newDoubleBuffer(int numElements) {
- ByteBuffer bb = newByteBuffer(numElements * SIZEOF_DOUBLE);
- return bb.asDoubleBuffer();
- }
-
- public static FloatBuffer newFloatBuffer(int numElements) {
- ByteBuffer bb = newByteBuffer(numElements * SIZEOF_FLOAT);
- return bb.asFloatBuffer();
- }
-
- public static IntBuffer newIntBuffer(int numElements) {
- ByteBuffer bb = newByteBuffer(numElements * SIZEOF_INT);
- return bb.asIntBuffer();
- }
-
- public static ByteBuffer newByteBuffer(int numElements) {
- ByteBuffer bb = ByteBuffer.allocateDirect(numElements);
- bb.order(ByteOrder.nativeOrder());
- return bb;
- }
-
- public static DoubleBuffer copyDoubleBuffer(DoubleBuffer orig) {
- DoubleBuffer dest = newDoubleBuffer(orig.capacity());
- orig.rewind();
- dest.put(orig);
- return dest;
- }
-
- public static FloatBuffer copyFloatBuffer(FloatBuffer orig) {
- FloatBuffer dest = newFloatBuffer(orig.capacity());
- orig.rewind();
- dest.put(orig);
- return dest;
- }
-
- public static IntBuffer copyIntBuffer(IntBuffer orig) {
- IntBuffer dest = newIntBuffer(orig.capacity());
- orig.rewind();
- dest.put(orig);
- return dest;
- }
-
- public static ByteBuffer copyByteBuffer(ByteBuffer orig) {
- ByteBuffer dest = newByteBuffer(orig.capacity());
- orig.rewind();
- dest.put(orig);
- return dest;
- }
-
- private static Map bufferOffsetCache = Collections.synchronizedMap(new HashMap());
-
- /** Creates an "offset buffer" for use with the
- ARB_vertex_buffer_object extension. The resulting Buffers are
- suitable for use with routines such as glVertexPointer <em>when
- used in conjunction with that extension</em>. They have no
- capacity and are not suitable for passing to OpenGL routines
- that do not support buffer offsets, or to non-OpenGL
- routines. */
- public static ByteBuffer bufferOffset(int offset) {
- Integer key = new Integer(offset);
- ByteBuffer buf = (ByteBuffer) bufferOffsetCache.get(key);
- if (buf == null) {
- buf = bufferOffset0(offset);
- bufferOffsetCache.put(key, buf);
- }
- return buf;
- }
-
- private static native ByteBuffer bufferOffset0(int offset);
-}