This library allows for using OpenGL and Vulkan LWJGL 3 surfaces in AWT (and by extension, Swing) frames. Works with MacOS X, Windows, and Linux.
Support for OpenGL:
- creating OpenGL 3.0 and 3.2 core/compatibility contexts (including debug/forward compatible)
- OpenGL ES contexts
- floating-point and sRGB pixel formats
- multisampled framebuffers (also with different number of color samples - Nvidia only)
- v-sync/swap control
- context flush control
- robust buffer access (with application/share-group isolation)
- sync'ing buffer swaps over multiple windows and cards - Nvidia only
- delay before swap - Nvidia only
Support for Vulkan:
- Vulkan 1.0, 1.1, 1.2, 1.3
- MoltenVK support
Note about compatibility: The minimum macOS version for OpenGL is 10.5, and the minimum for Vulkan is 10.11, since Vulkan runs on top of the Metal API introduced in that version.
Full code samples:
- AWTTest
- AWTThreadTest
- Core32Test
- SimpleDemo (Vulkan)
In order to create an OpenGL 3.3 core profile context with 4 sample MSAA, use:
JFrame frame = new JFrame("AWT test");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLayout(new BorderLayout());
GLData data = new GLData();
data.majorVersion = 3;
data.minorVersion = 3;
data.profile = GLData.Profile.CORE;
data.samples = 4;
frame.add(new AWTGLCanvas(data) {
public void initGL() {
}
public void paintGL() {
}
});
if (!AWTVK.isPlatformSupported()) {
throw new RuntimeException("Platform not supported.");
}
JFrame frame = new JFrame("AWT test");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.setPreferredSize(new Dimension(600, 600));
Canvas canvas = new Canvas();
frame.add(canvas, BorderLayout.CENTER);
frame.pack(); // Packing causes the canvas to be lockable, and is the earliest time it can be used
long surface = AWTVK.create(canvas, instance);
// Do things with the surface
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
// Destroy the surface to prevent leaks and errors
KHRSurface.vkDestroySurfaceKHR(instance, surface, null);
}});