/** * Copyright 2013 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ package com.jogamp.opengl.test.junit.jogl.perf; import java.lang.reflect.InvocationTargetException; import com.jogamp.nativewindow.AbstractGraphicsConfiguration; import com.jogamp.nativewindow.GraphicsConfigurationFactory; import com.jogamp.nativewindow.VisualIDHolder; import com.jogamp.opengl.GLCapabilities; import com.jogamp.opengl.GLCapabilitiesImmutable; import com.jogamp.opengl.GLContext; import com.jogamp.opengl.GLDrawable; import com.jogamp.opengl.GLDrawableFactory; import com.jogamp.opengl.GLProfile; import org.junit.BeforeClass; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; import com.jogamp.common.os.Platform; import com.jogamp.newt.Display; import com.jogamp.newt.NewtFactory; import com.jogamp.newt.Screen; import com.jogamp.opengl.test.junit.util.MiscUtils; import com.jogamp.opengl.test.junit.util.UITestCase; /** * Raw initialization of multiple offscreen GLAutoDrawables */ @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class TestPerf001RawInit00NEWT extends UITestCase { @BeforeClass public static void initClass() { GLProfile.initSingleton(); } public void testChooseOnly(final int runNum, final Screen screen, final int count) throws InterruptedException { final long[] t = new long[10]; final GLProfile glp = GLProfile.getGL2ES2(); final int[] chosenCfgs = { 0 }; final GLCapabilitiesImmutable caps = new GLCapabilities(glp); final GraphicsConfigurationFactory factory = GraphicsConfigurationFactory.getFactory(screen.getDisplay().getGraphicsDevice(), caps); if( wait && 0 == runNum ) { UITestCase.waitForKey("Pre-Init"); } System.err.println("INIT START #"+runNum); screen.getDisplay().getEDTUtil().invoke(true, new Runnable() { public void run() { t[0] = Platform.currentTimeMillis(); for(int i=0; i<count; i++) { final AbstractGraphicsConfiguration cfg = factory.chooseGraphicsConfiguration(caps, caps, null, screen.getGraphicsScreen(), VisualIDHolder.VID_UNDEFINED); if( null != cfg ) { chosenCfgs[0]++; } } t[1] = Platform.currentTimeMillis(); } } ); final double countF = count; System.err.printf("Run: %d, count %d/%d raw:%n\tchoose\t%6d/t %6.2f/1%n", runNum, chosenCfgs[0], count, t[1]-t[0], (t[1]-t[0])/countF); System.err.println("INIT END #"+runNum); if( wait && 2 == runNum ) { UITestCase.waitForKey("Post-Init"); } } public void testFull(final int runNum, final int width, final int height, final int count) { // panel.setBounds(0, 0, width, height); final long[] t = new long[10]; final GLDrawable[] glDrawables = new GLDrawable[count]; final GLContext[] glConti = new GLContext[count]; final GLProfile glp = GLProfile.getGL2ES2(); final GLCapabilitiesImmutable caps = new GLCapabilities(glp); final GLDrawableFactory factory = GLDrawableFactory.getFactory(glp); if( wait && 0 == runNum ) { UITestCase.waitForKey("Pre-Init"); } System.err.println("INIT START #"+runNum); t[0] = Platform.currentTimeMillis(); for(int i=0; i<count; i++) { glDrawables[i] = factory.createOffscreenDrawable(null, caps, null, width, height); } t[1] = Platform.currentTimeMillis(); for(int i=0; i<count; i++) { glDrawables[i].setRealized(true); } t[2] = Platform.currentTimeMillis(); // 1st makeCurrent - context creation incl. release for(int i=0; i<count; i++) { final GLContext context = glDrawables[i].createContext(null); if( GLContext.CONTEXT_NOT_CURRENT >= context.makeCurrent() ) { // oops glDrawables[i].setRealized(false); glDrawables[i] = null; glConti[i] = null; continue; } glConti[i] = context; context.release(); } t[3] = Platform.currentTimeMillis(); // 2nd makeCurrent and release for(int i=0; i<count; i++) { final GLContext context = glConti[i]; if( GLContext.CONTEXT_NOT_CURRENT >= context.makeCurrent() ) { // oops glDrawables[i].setRealized(false); glDrawables[i] = null; glConti[i] = null; continue; } context.release(); } t[4] = Platform.currentTimeMillis(); final double countF = count; System.err.printf("Run: %d, count %d raw:%n\tglad-create\t%6d/t %6.2f/1%n"+ "\tglad-realize\t%6d/t %6.2f/1%n"+ "\tctx-create1\t%6d/t %6.2f/1%n"+ "\tctx-curren2\t%6d/t %6.2f/1%n"+ "\tglad-ctx-init\t%6d/t %6.2f/1%n", runNum, count, t[1]-t[0], (t[1]-t[0])/countF, // create t[2]-t[1], (t[2]-t[1])/countF, // realize t[3]-t[2], (t[3]-t[2])/countF, // context-create1 t[4]-t[3], (t[4]-t[3])/countF, // context-curren2 t[3]-t[0], (t[3]-t[0])/countF);// init total System.err.println("INIT END #"+runNum); if( wait && 2 == runNum ) { UITestCase.waitForKey("Post-Init"); } // destroy for(int i=0; i<count; i++) { final GLContext context = glConti[i]; if( null != context ) { context.destroy(); } final GLDrawable glDrawable = glDrawables[i]; if( null != glDrawable ) { glDrawable.setRealized(false); } glConti[i] = null; glDrawables[i] = null; } } @Test public void test01ChooseOnly() throws InterruptedException, InvocationTargetException { if( 0 != manualTest && 1 != manualTest ) { return; } final Display display = NewtFactory.createDisplay(null, false); final Screen screen = NewtFactory.createScreen(display, 0); screen.addReference(); try { testChooseOnly(0, screen, count); // warm-up testChooseOnly(1, screen, count); testChooseOnly(2, screen, count); } finally { screen.removeReference(); } } @Test public void test02Full() throws InterruptedException, InvocationTargetException { if( 0 != manualTest && 2 != manualTest ) { return; } testFull(0, width, height, count); // warm-up testFull(1, width, height, count); testFull(2, width, height, count); } static boolean wait = false; static int manualTest = 0; static int width = 800, height = 600, count = 50; public static void main(final String[] args) { boolean waitMain = false; for(int i=0; i<args.length; i++) { if(args[i].equals("-width")) { width = MiscUtils.atoi(args[++i], width); } else if(args[i].equals("-height")) { height = MiscUtils.atoi(args[++i], height); } else if(args[i].equals("-count")) { count = MiscUtils.atoi(args[++i], count); } else if(args[i].equals("-wait")) { wait = true; } else if(args[i].equals("-waitMain")) { waitMain = true; } else if(args[i].equals("-test")) { manualTest = MiscUtils.atoi(args[++i], manualTest); } } if( waitMain ) { UITestCase.waitForKey("Main-Start"); } org.junit.runner.JUnitCore.main(TestPerf001RawInit00NEWT.class.getName()); } }