Skip to content

Commit

Permalink
Adds a different animator depending on the architecture and os
Browse files Browse the repository at this point in the history
Use the native FPS counter when possible
  • Loading branch information
across committed Mar 17, 2022
1 parent 4571e7b commit f3792e8
Show file tree
Hide file tree
Showing 3 changed files with 141 additions and 40 deletions.
4 changes: 4 additions & 0 deletions msi.gama.core/src/msi/gama/runtime/PlatformHelper.java
Expand Up @@ -128,4 +128,8 @@ public static int javaVersion(final int major, final int minor, final int micro)
return (major << 16) + (minor << 8) + micro;
}

public static boolean isARM() {
return Platform.ARCH_AARCH64.equals(Platform.getOSArch());
}

}
160 changes: 136 additions & 24 deletions ummisco.gama.opengl/src/ummisco/gama/opengl/view/GamaGLCanvas.java
Expand Up @@ -10,6 +10,7 @@
********************************************************************************************************/
package ummisco.gama.opengl.view;

import java.io.PrintStream;
import java.util.List;

import org.eclipse.swt.SWT;
Expand Down Expand Up @@ -49,14 +50,16 @@
/**
* The Class GamaGLCanvas.
*/
public class GamaGLCanvas extends Composite implements GLAutoDrawable, IDelegateEventsToParent {
public class GamaGLCanvas extends Composite implements GLAutoDrawable, IDelegateEventsToParent, FPSCounter {

/** The canvas. */
final Control canvas;

/** The drawable. */
final GLAutoDrawable drawable;

final FPSCounter fpsDelegate;

/** The detached. */
protected boolean detached = false;

Expand Down Expand Up @@ -100,12 +103,21 @@ public void controlResized(final ControlEvent e) {
} else {
canvas = new GLCanvas(this, SWT.NONE, cap, null);
drawable = (GLAutoDrawable) canvas;

}
drawable.setAutoSwapBufferMode(true);

drawable.addGLEventListener(renderer);
GLAnimatorControl animator = defineAnimator();
if (drawable instanceof GLWindow w) {
fpsDelegate = w;
} else
fpsDelegate = animator;
drawable.setExclusiveContextThread(animator.getThread());
renderer.setCanvas(this);
addDisposeListener(e -> new Thread(() -> { animator.stop(); }).start());
addDisposeListener(e -> new Thread(() -> {
animator.stop();
}).start());
}

/**
Expand All @@ -114,7 +126,13 @@ public void controlResized(final ControlEvent e) {
* @return the GL animator control
*/
private GLAnimatorControl defineAnimator() {
GLAnimatorControl animator = new BareBonesGLAnimator(drawable);
GLAnimatorControl animator ;
if (PlatformHelper.isARM())
animator = new BareBonesGLAnimator(drawable);
else if (PlatformHelper.isLinux())
animator = new SingleThreadGLAnimator(drawable);
else
animator = new MultithreadGLAnimator(drawable);
// FLAGS.USE_OLD_ANIMATOR ? new SingleThreadGLAnimator(drawable) : new MultithreadGLAnimator(drawable);
animator.setUpdateFPSFrames(FPSCounter.DEFAULT_FRAMES_PER_INTERVAL, null);
return animator;
Expand Down Expand Up @@ -145,45 +163,69 @@ public void setRealized(final boolean realized) {
}

@Override
public boolean isRealized() { return drawable.isRealized(); }
public boolean isRealized() {
return drawable.isRealized();
}

@Override
public int getSurfaceWidth() { return drawable.getSurfaceWidth(); }
public int getSurfaceWidth() {
return drawable.getSurfaceWidth();
}

@Override
public int getSurfaceHeight() { return drawable.getSurfaceHeight(); }
public int getSurfaceHeight() {
return drawable.getSurfaceHeight();
}

@Override
public boolean isGLOriented() { return drawable.isGLOriented(); }
public boolean isGLOriented() {
return drawable.isGLOriented();
}

@Override
public void swapBuffers() throws GLException {
drawable.swapBuffers();
}

@Override
public GLCapabilitiesImmutable getChosenGLCapabilities() { return drawable.getChosenGLCapabilities(); }
public GLCapabilitiesImmutable getChosenGLCapabilities() {
return drawable.getChosenGLCapabilities();
}

@Override
public GLCapabilitiesImmutable getRequestedGLCapabilities() { return drawable.getRequestedGLCapabilities(); }
public GLCapabilitiesImmutable getRequestedGLCapabilities() {
return drawable.getRequestedGLCapabilities();
}

@Override
public GLProfile getGLProfile() { return drawable.getGLProfile(); }
public GLProfile getGLProfile() {
return drawable.getGLProfile();
}

@Override
public NativeSurface getNativeSurface() { return drawable.getNativeSurface(); }
public NativeSurface getNativeSurface() {
return drawable.getNativeSurface();
}

@Override
public long getHandle() { return drawable.getHandle(); }
public long getHandle() {
return drawable.getHandle();
}

@Override
public GLDrawableFactory getFactory() { return drawable.getFactory(); }
public GLDrawableFactory getFactory() {
return drawable.getFactory();
}

@Override
public GLDrawable getDelegatedDrawable() { return drawable.getDelegatedDrawable(); }
public GLDrawable getDelegatedDrawable() {
return drawable.getDelegatedDrawable();
}

@Override
public GLContext getContext() { return drawable.getContext(); }
public GLContext getContext() {
return drawable.getContext();
}

@Override
public GLContext setContext(final GLContext newCtx, final boolean destroyPrevCtx) {
Expand All @@ -201,7 +243,9 @@ public void addGLEventListener(final int index, final GLEventListener listener)
}

@Override
public int getGLEventListenerCount() { return drawable.getGLEventListenerCount(); }
public int getGLEventListenerCount() {
return drawable.getGLEventListenerCount();
}

@Override
public boolean areAllGLEventListenerInitialized() {
Expand Down Expand Up @@ -239,15 +283,19 @@ public void setAnimator(final GLAnimatorControl animatorControl) throws GLExcept
}

@Override
public GLAnimatorControl getAnimator() { return drawable.getAnimator(); }
public GLAnimatorControl getAnimator() {
return drawable.getAnimator();
}

@Override
public Thread setExclusiveContextThread(final Thread t) throws GLException {
return drawable.setExclusiveContextThread(t);
}

@Override
public Thread getExclusiveContextThread() { return drawable.getExclusiveContextThread(); }
public Thread getExclusiveContextThread() {
return drawable.getExclusiveContextThread();
}

@Override
public boolean invoke(final boolean wait, final GLRunnable glRunnable) throws IllegalStateException {
Expand Down Expand Up @@ -280,37 +328,49 @@ public void setAutoSwapBufferMode(final boolean enable) {
}

@Override
public boolean getAutoSwapBufferMode() { return drawable.getAutoSwapBufferMode(); }
public boolean getAutoSwapBufferMode() {
return drawable.getAutoSwapBufferMode();
}

@Override
public void setContextCreationFlags(final int flags) {
drawable.setContextCreationFlags(flags);
}

@Override
public int getContextCreationFlags() { return drawable.getContextCreationFlags(); }
public int getContextCreationFlags() {
return drawable.getContextCreationFlags();
}

@Override
public GLContext createContext(final GLContext shareWith) {
return drawable.createContext(shareWith);
}

@Override
public GL getGL() { return drawable.getGL(); }
public GL getGL() {
return drawable.getGL();
}

@Override
public GL setGL(final GL gl) {
return drawable.setGL(gl);
}

@Override
public Object getUpstreamWidget() { return drawable.getUpstreamWidget(); }
public Object getUpstreamWidget() {
return drawable.getUpstreamWidget();
}

@Override
public RecursiveLock getUpstreamLock() { return drawable.getUpstreamLock(); }
public RecursiveLock getUpstreamLock() {
return drawable.getUpstreamLock();
}

@Override
public boolean isThreadGLCapable() { return drawable.isThreadGLCapable(); }
public boolean isThreadGLCapable() {
return drawable.isThreadGLCapable();
}

/**
* Gets the NEWT window.
Expand Down Expand Up @@ -404,4 +464,56 @@ public void removeCameraListeners(final IMultiListener camera) {
});
}

@Override
public void setUpdateFPSFrames(int frames, PrintStream out) {
fpsDelegate.setUpdateFPSFrames(frames, out);
}

@Override
public void resetFPSCounter() {
fpsDelegate.resetFPSCounter();
}

@Override
public int getUpdateFPSFrames() {
return fpsDelegate.getUpdateFPSFrames();

}

@Override
public long getFPSStartTime() {
return fpsDelegate.getFPSStartTime();
}

@Override
public long getLastFPSUpdateTime() {
return fpsDelegate.getLastFPSUpdateTime();

}

@Override
public long getLastFPSPeriod() {
return fpsDelegate.getLastFPSPeriod();
}

@Override
public float getLastFPS() {
return fpsDelegate.getLastFPS();
}

@Override
public int getTotalFPSFrames() {
return fpsDelegate.getTotalFPSFrames();
}

@Override
public long getTotalFPSDuration() {
return fpsDelegate.getTotalFPSDuration();
}

@Override
public float getTotalFPS() {
return fpsDelegate.getTotalFPS();
}

}
Expand Up @@ -247,25 +247,10 @@ protected BufferedImage getImage(final GL2 gl3, final int ww, final int hh) {
*/
@Override
public void updateDisplay(final boolean force) {

if (alreadyUpdating) return;
try {
alreadyUpdating = true;

final boolean oldState = animator.isPaused();
if (force) { animator.resume(); }
layerManager.drawLayersOn(renderer);

// EXPERIMENTAL

// if (temp_focus != null) {
// final IShape geometry = Cast.asGeometry(getScope(), temp_focus.value(getScope()));
// if (geometry != null) {
// temp_focus = null;
// focusOn(geometry);
// }
// }
if (force && oldState) { animator.pause(); }
} finally {
alreadyUpdating = false;
}
Expand Down Expand Up @@ -741,7 +726,7 @@ public void invalidateVisibleRegions() {
* @see msi.gama.common.interfaces.IDisplaySurface#getFPS()
*/
@Override
public int getFPS() { return Math.round(this.animator.getLastFPS()); }
public int getFPS() { return Math.round(renderer.getCanvas().getLastFPS()); }

// @Override
// public boolean isRealized() {
Expand Down

0 comments on commit f3792e8

Please sign in to comment.