package trvis.test; import java.awt.BorderLayout; import java.nio.FloatBuffer; import javax.media.opengl.GL3; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLEventListener; import javax.media.opengl.GLProfile; import javax.media.opengl.awt.GLCanvas; import javax.swing.JFrame; import com.jogamp.common.nio.Buffers; public class GlMapBufferTest extends GLCanvas implements GLEventListener { private int VBO = 0; public static void main(String[] args) { GLProfile.initSingleton(); java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame f = new JFrame("GlMapBuffer Test"); f.setSize(100, 100); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().setLayout(new BorderLayout()); f.getContentPane().add(new GlMapBufferTest(), BorderLayout.CENTER); f.setVisible(true); } }); } public GlMapBufferTest() { addGLEventListener(this); } @Override public void init(GLAutoDrawable glDrawable) { GL3 gl = glDrawable.getGL().getGL3(); int handle[] = new int[1]; gl.glGenBuffers(1, handle, 0); VBO = handle[0]; // Create VBO for 3 float values gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, VBO); gl.glBufferData(GL3.GL_ARRAY_BUFFER, 3 * Buffers.SIZEOF_FLOAT, null, GL3.GL_DYNAMIC_DRAW); gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, 0); } @Override public void reshape(GLAutoDrawable glDrawable, int x, int y, int w, int h) { } @Override public void dispose(GLAutoDrawable glDrawable) { GL3 gl = glDrawable.getGL().getGL3(); gl.glDeleteBuffers(1, new int[] { VBO }, 0); } @Override public void display(GLAutoDrawable glDrawable) { System.out.print("DISPLAY: "); long millis = System.currentTimeMillis(); GL3 gl = glDrawable.getGL().getGL3(); for (int i = 0; i < 100; i++) { // Map VBO 100 times gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, VBO); FloatBuffer vboData = gl.glMapBuffer(GL3.GL_ARRAY_BUFFER, GL3.GL_WRITE_ONLY).asFloatBuffer(); vboData.put(1).put(2).put(3); vboData.rewind(); gl.glUnmapBuffer(GL3.GL_ARRAY_BUFFER); gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, 0); } millis = System.currentTimeMillis() - millis; System.out.println(millis + "ms"); System.out.flush(); repaint(); // Refresh immediately } }