package com.jogamp.opengl.test.junit.jogl.acore;
import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2GL3;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLContext;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLProfile;
import org.junit.Assert;
import org.junit.Test;
import org.junit.FixMethodOrder;
import org.junit.runners.MethodSorters;
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.JoglVersion;
import com.jogamp.opengl.test.junit.util.UITestCase;
/**
* The 3.1 compatibility context on Mesa >= 9.0 seems to be broken.
* <p>
* This bug lies within Mesa3D (any renderer) and is fixed in
* commit ??? (not yet).
* </p>
* <p>
* Mesa3D Version 9.0 still exposes this bug,
* where 9.?.? has it fixed w/ above commit.
* </p>
* <https://jogamp.org/bugzilla/show_bug.cgi?id=658>
*/
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestGLMesaBug658NEWT extends UITestCase {
@Test
public void test00ShowAvailProfiles() {
System.err.println(JoglVersion.getDefaultOpenGLInfo(null, null, false).toString());
}
@Test
public void test10GL2PolygonModeFailure() {
testGLNPolygonModeFailureImpl(GLProfile.GL2);
}
@Test
public void test11GL3bcPolygonModeFailure() {
testGLNPolygonModeFailureImpl(GLProfile.GL3bc);
}
@Test
public void test12GL3PolygonModeFailure() {
testGLNPolygonModeFailureImpl(GLProfile.GL3);
}
private void testGLNPolygonModeFailureImpl(final String profile) {
if(!GLProfile.isAvailable(profile)) { System.err.println(profile+" n/a"); return; }
final GLProfile pro = GLProfile.get(profile);
final GLCapabilities caps = new GLCapabilities(pro);
final GLWindow window = GLWindow.create(caps);
window.setSize(640, 480);
window.addGLEventListener(new GLEventListener() {
public void reshape(
final GLAutoDrawable drawable,
final int x,
final int y,
final int width,
final int height)
{
// Nothing.
}
public void init(
final GLAutoDrawable drawable)
{
final GLContext context = drawable.getContext();
System.err.println("CTX: "+context.getGLVersion());
final GL2GL3 gl = drawable.getGL().getGL2GL3();
System.err.println("GL_VENDOR: " + gl.glGetString(GL.GL_VENDOR));
System.err.println("GL_RENDERER: " + gl.glGetString(GL.GL_RENDERER));
System.err.println("GL_VERSION: " + gl.glGetString(GL.GL_VERSION));
System.err.println("GL Renderer Quirks:" + gl.getContext().getRendererQuirks().toString());
if( gl.isGL2() || gl.isGLES2() ) { // compatibility profile || ES2
gl.glPolygonMode(GL.GL_FRONT, GL2GL3.GL_FILL);
} else {
gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL2GL3.GL_FILL);
}
final int e = gl.glGetError();
Assert.assertTrue(e == GL.GL_NO_ERROR); // // FIXME On Mesa 9.0.1 w/ GL 3.1 -> GL.GL_INVALID_OPERATION ?
}
public void dispose(
final GLAutoDrawable drawable)
{
// Nothing.
}
public void display(
final GLAutoDrawable drawable)
{
// Nothing.
}
});
try {
window.setVisible(true);
} finally {
window.destroy();
}
}
@Test
public void test20GL2BindArrayAttributeFails() {
testGLNBindArrayAttributeFailsImpl(GLProfile.GL2);
}
@Test
public void test21GL3bcBindArrayAttributeFails() {
testGLNBindArrayAttributeFailsImpl(GLProfile.GL3bc);
}
@Test
public void test22GL3BindArrayAttributeFails() {
testGLNBindArrayAttributeFailsImpl(GLProfile.GL3);
}
private void testGLNBindArrayAttributeFailsImpl(final String profile) {
if(!GLProfile.isAvailable(profile)) { System.err.println(profile+ " n/a"); return; }
final GLProfile pro = GLProfile.get(profile);
final GLCapabilities caps = new GLCapabilities(pro);
final GLWindow window = GLWindow.create(caps);
window.setSize(640, 480);
window.addGLEventListener(new GLEventListener() {
public void reshape(
final GLAutoDrawable drawable,
final int x,
final int y,
final int width,
final int height)
{
// Nothing.
}
public void init(
final GLAutoDrawable drawable)
{
final GLContext context = drawable.getContext();
System.err.println("CTX: "+context.getGLVersion());
final GL2GL3 gl = drawable.getGL().getGL2GL3();
System.err.println("GL_VENDOR: " + gl.glGetString(GL.GL_VENDOR));
System.err.println("GL_RENDERER: " + gl.glGetString(GL.GL_RENDERER));
System.err.println("GL_VERSION: " + gl.glGetString(GL.GL_VERSION));
System.err.println("GL Renderer Quirks:" + gl.getContext().getRendererQuirks().toString());
final int[] name = new int[] { 0 };
gl.glGenBuffers(1, name, 0);
Assert.assertTrue(gl.glGetError() == GL.GL_NO_ERROR);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, name[0]);
Assert.assertTrue(gl.glGetError() == 0);
gl.glBufferData(GL.GL_ARRAY_BUFFER, 4 * 32, null, GL.GL_STATIC_DRAW);
Assert.assertTrue(gl.glGetError() == 0);
Assert.assertTrue(gl.getBoundBuffer(GL.GL_ARRAY_BUFFER) == name[0]);
gl.glEnableVertexAttribArray(1);
Assert.assertTrue(gl.glGetError() == GL.GL_NO_ERROR);
gl.glVertexAttribPointer(1, 4, GL.GL_FLOAT, false, 0, 0L);
Assert.assertTrue(gl.glGetError() == GL.GL_NO_ERROR); // FIXME On Mesa 9.0.1 w/ GL 3.1 -> GL.GL_INVALID_OPERATION ?
}
public void dispose(
final GLAutoDrawable drawable)
{
// Nothing.
}
public void display(
final GLAutoDrawable drawable)
{
// Nothing.
}
});
try {
window.setVisible(true);
} finally {
window.destroy();
}
}
public static void main(final String args[]) {
org.junit.runner.JUnitCore.main(TestGLMesaBug658NEWT.class.getName());
}
}