Skip to content

Commit

Permalink
gl-410-buffer-uniform-array direct buffers
Browse files Browse the repository at this point in the history
  • Loading branch information
elect86 committed Apr 24, 2016
1 parent 250688c commit d066575
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 41 deletions.
2 changes: 0 additions & 2 deletions jogl-samples/src/framework/Test.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import com.jogamp.newt.event.KeyListener;
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.GL;
import static com.jogamp.opengl.GL.GL_DONT_CARE;
import static com.jogamp.opengl.GL2ES2.GL_DEBUG_SEVERITY_LOW;
import static com.jogamp.opengl.GL2ES2.GL_DEBUG_SOURCE_APPLICATION;
import static com.jogamp.opengl.GL2ES2.GL_DEBUG_TYPE_OTHER;
Expand All @@ -39,7 +38,6 @@
import glm.vec._2.Vec2;
import glm.vec._2.i.Vec2i;
import glm.vec._3.Vec3;
import glm.vec._4.Vec4;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;

Expand Down
86 changes: 47 additions & 39 deletions jogl-samples/src/tests/gl_410/Gl_410_buffer_uniform_array.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,9 @@ private class Buffer {
public static final int MAX = 5;
}

private int[] vertexArrayName = {0}, bufferName = new int[Buffer.MAX], uniformBufferAlignment = {0};
private IntBuffer vertexArrayName = GLBuffers.newDirectIntBuffer(1),
bufferName = GLBuffers.newDirectIntBuffer(Buffer.MAX),
uniformBufferAlignment = GLBuffers.newDirectIntBuffer(1);
private int programName;

@Override
Expand Down Expand Up @@ -103,10 +105,10 @@ private boolean initProgram(GL4 gl4) {

ShaderProgram shaderProgram = new ShaderProgram();

ShaderCode vertexShaderCode = ShaderCode.create(gl4, GL_VERTEX_SHADER,
this.getClass(), SHADERS_ROOT, null, SHADERS_SOURCE, "vert", null, true);
ShaderCode fragmentShaderCode = ShaderCode.create(gl4, GL_FRAGMENT_SHADER,
this.getClass(), SHADERS_ROOT, null, SHADERS_SOURCE, "frag", null, true);
ShaderCode vertexShaderCode = ShaderCode.create(gl4, GL_VERTEX_SHADER, this.getClass(), SHADERS_ROOT,
null, SHADERS_SOURCE, "vert", null, true);
ShaderCode fragmentShaderCode = ShaderCode.create(gl4, GL_FRAGMENT_SHADER, this.getClass(), SHADERS_ROOT,
null, SHADERS_SOURCE, "frag", null, true);

shaderProgram.init(gl4);

Expand Down Expand Up @@ -136,19 +138,19 @@ private boolean initProgram(GL4 gl4) {

private boolean initVertexArray(GL4 gl4) {

gl4.glGenVertexArrays(1, vertexArrayName, 0);
gl4.glBindVertexArray(vertexArrayName[0]);
gl4.glGenVertexArrays(1, vertexArrayName);
gl4.glBindVertexArray(vertexArrayName.get(0));
{
gl4.glBindBuffer(GL_ARRAY_BUFFER, bufferName[Buffer.VERTEX]);
gl4.glBindBuffer(GL_ARRAY_BUFFER, bufferName.get(Buffer.VERTEX));
gl4.glVertexAttribPointer(Semantic.Attr.POSITION, 2, GL_FLOAT, false, 0, 0);
gl4.glEnableVertexAttribArray(Semantic.Attr.POSITION);

gl4.glBindBuffer(GL_ARRAY_BUFFER, bufferName[Buffer.INSTANCE]);
gl4.glBindBuffer(GL_ARRAY_BUFFER, bufferName.get(Buffer.INSTANCE));
gl4.glVertexAttribIPointer(Semantic.Attr.DRAW_ID, 1, GL_INT, 0, 0);
gl4.glVertexAttribDivisor(Semantic.Attr.DRAW_ID, 1);
gl4.glEnableVertexAttribArray(Semantic.Attr.DRAW_ID);

gl4.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferName[Buffer.ELEMENT]);
gl4.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferName.get(Buffer.ELEMENT));
}
gl4.glBindVertexArray(0);

Expand All @@ -157,50 +159,51 @@ private boolean initVertexArray(GL4 gl4) {

private boolean initBuffer(GL4 gl4) {

gl4.glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, uniformBufferAlignment, 0);
ShortBuffer elementBuffer = GLBuffers.newDirectShortBuffer(elementData);
ByteBuffer positionBuffer = GLBuffers.newDirectByteBuffer(positionSize);
IntBuffer instanceBuffer = GLBuffers.newDirectIntBuffer(new int[]{0, 1});
FloatBuffer diffuseBuffer = GLBuffers.newDirectFloatBuffer(
new float[]{1.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.5f, 1.0f, 1.0f});

gl4.glGenBuffers(Buffer.MAX, bufferName, 0);
gl4.glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, uniformBufferAlignment);

gl4.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferName[Buffer.ELEMENT]);
ShortBuffer elementBuffer = GLBuffers.newDirectShortBuffer(elementData);
gl4.glGenBuffers(Buffer.MAX, bufferName);

gl4.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferName.get(Buffer.ELEMENT));
gl4.glBufferData(GL_ELEMENT_ARRAY_BUFFER, elementSize, elementBuffer, GL_STATIC_DRAW);
BufferUtils.destroyDirectBuffer(elementBuffer);
gl4.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

gl4.glBindBuffer(GL_ARRAY_BUFFER, bufferName[Buffer.VERTEX]);
ByteBuffer positionBuffer = GLBuffers.newDirectByteBuffer(positionSize);
gl4.glBindBuffer(GL_ARRAY_BUFFER, bufferName.get(Buffer.VERTEX));
for (int i = 0; i < vertexCount; i++) {
positionData[i].toDbb(positionBuffer, i * Vec2.SIZE);
}
gl4.glBufferData(GL_ARRAY_BUFFER, positionSize, positionBuffer, GL_STATIC_DRAW);
BufferUtils.destroyDirectBuffer(positionBuffer);
gl4.glBindBuffer(GL_ARRAY_BUFFER, 0);

int[] instance = {0, 1};
gl4.glBindBuffer(GL_ARRAY_BUFFER, bufferName[Buffer.INSTANCE]);
IntBuffer instanceBuffer = GLBuffers.newDirectIntBuffer(instance);
gl4.glBufferData(GL_ARRAY_BUFFER, instance.length * Integer.BYTES, instanceBuffer, GL_STATIC_DRAW);
BufferUtils.destroyDirectBuffer(instanceBuffer);
gl4.glBindBuffer(GL_ARRAY_BUFFER, bufferName.get(Buffer.INSTANCE));
gl4.glBufferData(GL_ARRAY_BUFFER, instanceBuffer.capacity() * Integer.BYTES, instanceBuffer, GL_STATIC_DRAW);
gl4.glBindBuffer(GL_ARRAY_BUFFER, 0);

int uniformBufferSize = Math.max(uniformBufferAlignment[0], Mat4.SIZE) * 2;
int uniformBufferSize = Math.max(uniformBufferAlignment.get(0), Mat4.SIZE) * 2;

{
gl4.glBindBuffer(GL_UNIFORM_BUFFER, bufferName[Buffer.TRANSFORM]);
gl4.glBindBuffer(GL_UNIFORM_BUFFER, bufferName.get(Buffer.TRANSFORM));
gl4.glBufferData(GL_UNIFORM_BUFFER, uniformBufferSize, null, GL_DYNAMIC_DRAW);
gl4.glBindBuffer(GL_UNIFORM_BUFFER, 0);
}

{
float[] diffuse = new float[]{1.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.5f, 1.0f, 1.0f};
FloatBuffer diffuseBuffer = GLBuffers.newDirectFloatBuffer(diffuse);

gl4.glBindBuffer(GL_UNIFORM_BUFFER, bufferName[Buffer.MATERIAL]);
gl4.glBufferData(GL_UNIFORM_BUFFER, diffuse.length * Float.BYTES, diffuseBuffer, GL_STATIC_DRAW);
BufferUtils.destroyDirectBuffer(diffuseBuffer);
gl4.glBindBuffer(GL_UNIFORM_BUFFER, bufferName.get(Buffer.MATERIAL));
gl4.glBufferData(GL_UNIFORM_BUFFER, diffuseBuffer.capacity() * Float.BYTES, diffuseBuffer, GL_STATIC_DRAW);
gl4.glBindBuffer(GL_UNIFORM_BUFFER, 0);
}

BufferUtils.destroyDirectBuffer(elementBuffer);
BufferUtils.destroyDirectBuffer(positionBuffer);
BufferUtils.destroyDirectBuffer(instanceBuffer);
BufferUtils.destroyDirectBuffer(diffuseBuffer);

return true;
}

Expand All @@ -209,11 +212,11 @@ protected boolean render(GL gl) {

GL4 gl4 = (GL4) gl;

int uniformBufferOffset = Math.max(uniformBufferAlignment[0], Mat4.SIZE);
int uniformBufferOffset = Math.max(uniformBufferAlignment.get(0), Mat4.SIZE);
int uniformBufferRange = uniformBufferOffset * 2;

{
gl4.glBindBuffer(GL_UNIFORM_BUFFER, bufferName[Buffer.TRANSFORM]);
gl4.glBindBuffer(GL_UNIFORM_BUFFER, bufferName.get(Buffer.TRANSFORM));
ByteBuffer pointer = gl4.glMapBufferRange(GL_UNIFORM_BUFFER, 0,
uniformBufferRange, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);

Expand All @@ -233,17 +236,18 @@ protected boolean render(GL gl) {
}

gl4.glViewport(0, 0, windowSize.x, windowSize.y);
gl4.glClearBufferfv(GL_COLOR, 0, new float[]{1.0f, 1.0f, 1.0f, 1.0f}, 0);
gl4.glClearBufferfv(GL_COLOR, 0, clearColor.put(0, 1).put(1, 1).put(2, 1).put(3, 1));

gl4.glUseProgram(programName);

// Attach the buffer to UBO binding point semantic::uniform::MATERIAL
gl4.glBindBufferBase(GL_UNIFORM_BUFFER, Semantic.Uniform.MATERIAL, bufferName[Buffer.MATERIAL]);
gl4.glBindVertexArray(vertexArrayName[0]);
gl4.glBindBufferBase(GL_UNIFORM_BUFFER, Semantic.Uniform.MATERIAL, bufferName.get(Buffer.MATERIAL));
gl4.glBindVertexArray(vertexArrayName.get(0));

// Attach the buffer to UBO binding point semantic::uniform::TRANSFORM0
gl4.glBindBufferRange(GL_UNIFORM_BUFFER, Semantic.Uniform.TRANSFORM0, bufferName[Buffer.TRANSFORM], 0, Mat4.SIZE);
gl4.glBindBufferRange(GL_UNIFORM_BUFFER, Semantic.Uniform.TRANSFORM1, bufferName[Buffer.TRANSFORM],
gl4.glBindBufferRange(GL_UNIFORM_BUFFER, Semantic.Uniform.TRANSFORM0, bufferName.get(Buffer.TRANSFORM), 0,
Mat4.SIZE);
gl4.glBindBufferRange(GL_UNIFORM_BUFFER, Semantic.Uniform.TRANSFORM1, bufferName.get(Buffer.TRANSFORM),
uniformBufferOffset, Mat4.SIZE);

gl4.glDrawElementsInstancedBaseVertexBaseInstance(GL_TRIANGLES, elementCount, GL_UNSIGNED_SHORT, 0, 1, 0, 0);
Expand All @@ -257,10 +261,14 @@ protected boolean end(GL gl) {

GL4 gl4 = (GL4) gl;

gl4.glDeleteVertexArrays(1, vertexArrayName, 0);
gl4.glDeleteBuffers(Buffer.MAX, bufferName, 0);
gl4.glDeleteVertexArrays(1, vertexArrayName);
gl4.glDeleteBuffers(Buffer.MAX, bufferName);
gl4.glDeleteProgram(programName);

BufferUtils.destroyDirectBuffer(vertexArrayName);
BufferUtils.destroyDirectBuffer(bufferName);
BufferUtils.destroyDirectBuffer(uniformBufferAlignment);

return true;
}
}

0 comments on commit d066575

Please sign in to comment.