package com.jogamp.opengl.test.junit.jogl.glu;
import java.nio.ByteBuffer;
import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GL2ES2;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLContext;
import com.jogamp.opengl.GLDrawableFactory;
import com.jogamp.opengl.GLOffscreenAutoDrawable;
import com.jogamp.opengl.GLProfile;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import jogamp.opengl.glu.mipmap.Mipmap;
import jogamp.opengl.glu.mipmap.ScaleInternal;
import com.jogamp.common.nio.Buffers;
import com.jogamp.opengl.test.junit.util.UITestCase;
import com.jogamp.opengl.util.texture.Texture;
import com.jogamp.opengl.util.texture.TextureData;
import com.jogamp.opengl.util.texture.TextureIO;
/**
* This test creates a {@link Texture} from {@link TextureData} of various pixel formats
* and pixel types with auto generate mipmaps set to {@code true}.
* <br></br>
* Bug Reference: https://jogamp.org/bugzilla/show_bug.cgi?id=365
* <br></br>
* The bug pertains to mipmap generation from a Texture and exists in {@link ScaleInternal}
* where a {@link java.nio.BufferUnderflowException} is thrown.
* <br></br>
* <ul>This suite of test cases test:
* <li>{@link ScaleInternal#scale_internal_ubyte(int, int, int, ByteBuffer, int, int, ByteBuffer, int, int, int)}</li>
* <li>{@link ScaleInternal#scale_internal_byte(int, int, int, ByteBuffer, int, int, ByteBuffer, int, int, int)}</li>
* <li>{@link ScaleInternal#scale_internal_ushort(int, int, int, ByteBuffer, int, int, java.nio.ShortBuffer, int, int, int, boolean)}</li>
* <li>{@link ScaleInternal#scale_internal_short(int, int, int, ByteBuffer, int, int, java.nio.ShortBuffer, int, int, int, boolean)}</li>
* <li>{@link ScaleInternal#scale_internal_uint(int, int, int, ByteBuffer, int, int, java.nio.IntBuffer, int, int, int, boolean)}</li>
* <li>{@link ScaleInternal#scale_internal_int(int, int, int, ByteBuffer, int, int, java.nio.IntBuffer, int, int, int, boolean)}</li>
* <li>{@link ScaleInternal#scale_internal_float(int, int, int, ByteBuffer, int, int, java.nio.FloatBuffer, int, int, int, boolean)}</li>
* </ul>
*
* @author Michael Esemplare, et.al.
*
*/
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestBug365TextureGenerateMipMaps extends UITestCase {
static GLOffscreenAutoDrawable drawable;
@BeforeClass
public static void setup() throws Throwable {
// disableNPOT
System.setProperty("jogl.texture.nonpot", "true");
try {
setUpOffscreenAutoDrawable();
} catch (final Throwable t) {
throw t;
}
}
@AfterClass
public static void teardown() {
tearDownOffscreenAutoDrawable();
}
private static void setUpOffscreenAutoDrawable() throws Throwable {
final GLProfile glp = GLProfile.getDefault();
final GLCapabilities caps = new GLCapabilities(glp);
final GLDrawableFactory factory = GLDrawableFactory.getFactory(glp);
// Make a drawable to get an offscreen context
drawable = factory.createOffscreenAutoDrawable(null, caps, null, 2, 2);
drawable.display(); // trigger context creation
final GLContext glContext = drawable.getContext();
try {
Assert.assertTrue("Could not make context current", GLContext.CONTEXT_NOT_CURRENT < glContext.makeCurrent());
} catch (final Throwable t) {
tearDownOffscreenAutoDrawable();
throw t;
}
}
private static void tearDownOffscreenAutoDrawable() {
if(drawable != null) {
drawable.getContext().release();
drawable.destroy();
drawable = null;
}
}
private static void testTextureMipMapGeneration(final int width, final int height, final int pixelFormat, final int pixelType) {
final int internalFormat = pixelFormat;
final int border = 0;
final boolean mipmap = true;
final boolean dataIsCompressed = false;
final boolean mustFlipVertically = false;
final int memReq = Mipmap.image_size( width, height, pixelFormat, pixelType );
ByteBuffer buffer = Buffers.newDirectByteBuffer( memReq );
final TextureData data = new TextureData(drawable.getGLProfile(),
internalFormat,
width,
height,
border,
pixelFormat,
pixelType,
mipmap,
dataIsCompressed,
mustFlipVertically,
buffer,
null);
final Texture texture = TextureIO.newTexture(drawable.getGL(), data);
// Cleanup
texture.destroy(drawable.getGL());
data.destroy();
buffer.clear();
buffer = null;
}
@Test
public void test00_MipMap_ScaleInternal_RGB_UBYTE () {
final int width = 1;
final int height = 7;
final int pixelFormat = GL.GL_RGB;
final int pixelType = GL.GL_UNSIGNED_BYTE;
testTextureMipMapGeneration(width, height, pixelFormat, pixelType);
}
@Test
public void test01_MipMap_ScaleInternal_RGBA_UBYTE () {
final int width = 1;
final int height = 7;
final int pixelFormat = GL.GL_RGBA;
final int pixelType = GL.GL_UNSIGNED_BYTE;
testTextureMipMapGeneration(width, height, pixelFormat, pixelType);
}
@Test
public void test02_MipMap_ScaleInternal_RGB_BYTE () {
final int width = 1;
final int height = 7;
final int pixelFormat = GL.GL_RGB;
final int pixelType = GL.GL_BYTE;
testTextureMipMapGeneration(width, height, pixelFormat, pixelType);
}
@Test
public void test03_MipMap_ScaleInternal_RGBA_BYTE () {
final int width = 1;
final int height = 7;
final int pixelFormat = GL.GL_RGBA;
final int pixelType = GL.GL_BYTE;
testTextureMipMapGeneration(width, height, pixelFormat, pixelType);
}
@Test
public void test04_MipMap_ScaleInternal_RGB_USHORT () {
final int width = 1;
final int height = 7;
final int pixelFormat = GL.GL_RGB;
final int pixelType = GL.GL_UNSIGNED_SHORT;
testTextureMipMapGeneration(width, height, pixelFormat, pixelType);
}
@Test
public void test05_MipMap_ScaleInternal_RGBA_USHORT () {
final int width = 1;
final int height = 7;
final int pixelFormat = GL.GL_RGBA;
final int pixelType = GL.GL_UNSIGNED_SHORT;
testTextureMipMapGeneration(width, height, pixelFormat, pixelType);
}
@Test
public void test06_MipMap_ScaleInternal_RGB_SHORT () {
final int width = 1;
final int height = 7;
final int pixelFormat = GL.GL_RGB;
final int pixelType = GL.GL_SHORT;
testTextureMipMapGeneration(width, height, pixelFormat, pixelType);
}
@Test
public void test07_MipMap_ScaleInternal_RGBA_SHORT () {
final int width = 1;
final int height = 7;
final int pixelFormat = GL.GL_RGBA;
final int pixelType = GL.GL_SHORT;
testTextureMipMapGeneration(width, height, pixelFormat, pixelType);
}
@Test
public void test08_MipMap_ScaleInternal_RGB_UINT () {
final int width = 1;
final int height = 7;
final int pixelFormat = GL.GL_RGB;
final int pixelType = GL.GL_UNSIGNED_INT;
testTextureMipMapGeneration(width, height, pixelFormat, pixelType);
}
@Test
public void test09_MipMap_ScaleInternal_RGBA_UINT () {
final int width = 1;
final int height = 7;
final int pixelFormat = GL.GL_RGBA;
final int pixelType = GL.GL_UNSIGNED_INT;
testTextureMipMapGeneration(width, height, pixelFormat, pixelType);
}
@Test
public void test10_MipMap_ScaleInternal_RGB_INT () {
final int width = 1;
final int height = 7;
final int pixelFormat = GL.GL_RGB;
final int pixelType = GL2ES2.GL_INT;
testTextureMipMapGeneration(width, height, pixelFormat, pixelType);
}
@Test
public void test11_MipMap_ScaleInternal_RGBA_INT () {
final int width = 1;
final int height = 7;
final int pixelFormat = GL.GL_RGBA;
final int pixelType = GL2ES2.GL_INT;
testTextureMipMapGeneration(width, height, pixelFormat, pixelType);
}
@Test
public void test12_MipMap_ScaleInternal_RGB_FLOAT () {
final int width = 1;
final int height = 7;
final int pixelFormat = GL.GL_RGB;
final int pixelType = GL.GL_FLOAT;
testTextureMipMapGeneration(width, height, pixelFormat, pixelType);
}
@Test
public void test13_MipMap_ScaleInternal_RGBA_FLOAT () {
final int width = 1;
final int height = 7;
final int pixelFormat = GL.GL_RGBA;
final int pixelType = GL.GL_FLOAT;
testTextureMipMapGeneration(width, height, pixelFormat, pixelType);
}
public static void main(final String[] args) {
org.junit.runner.JUnitCore.main(TestBug365TextureGenerateMipMaps.class.getName());
}
}