mirror of
https://github.com/libretro/RetroArch
synced 2025-04-24 15:02:35 +00:00
This will apply changes asynchronously, so it gets rid of some blocking IO. It probably doesn't matter, but is considered good practice.
130 lines
3.5 KiB
Java
130 lines
3.5 KiB
Java
package com.retroarch.browser;
|
|
|
|
import javax.microedition.khronos.egl.EGLConfig;
|
|
import javax.microedition.khronos.opengles.GL10;
|
|
|
|
import com.retroarch.R;
|
|
import com.retroarch.browser.preferences.util.UserPreferences;
|
|
|
|
import android.app.Activity;
|
|
import android.content.SharedPreferences;
|
|
import android.opengl.GLES20;
|
|
import android.opengl.GLSurfaceView;
|
|
import android.os.Bundle;
|
|
import android.util.Log;
|
|
import android.view.WindowManager;
|
|
import android.widget.Toast;
|
|
|
|
/**
|
|
* {@link Activity} subclass that provides the functionality
|
|
* for the refresh rate testing for device displays.
|
|
*/
|
|
public final class DisplayRefreshRateTest extends Activity {
|
|
|
|
private class Renderer implements GLSurfaceView.Renderer {
|
|
private static final String TAG = "GLESRenderer";
|
|
private static final double WARMUP_SECONDS = 2.0;
|
|
private static final double TEST_SECONDS = 10.0;
|
|
// Test states
|
|
private static final int STATE_START = 0;
|
|
private static final int STATE_WARMUP = 1;
|
|
private static final int STATE_TEST = 2;
|
|
private static final int STATE_DONE = 3;
|
|
private static final int STATE_DEAD = 4;
|
|
private int mState = STATE_START;
|
|
private double mStartTime = 0.0;
|
|
private int mNumFrames = 0;
|
|
|
|
private Activity activity;
|
|
|
|
public Renderer(Activity activity) {
|
|
this.activity = activity;
|
|
}
|
|
|
|
private void setFPSSetting(double fps) {
|
|
SharedPreferences prefs = UserPreferences.getPreferences(DisplayRefreshRateTest.this);
|
|
SharedPreferences.Editor edit = prefs.edit();
|
|
edit.putString("video_refresh_rate", Double.toString(fps));
|
|
edit.apply();
|
|
}
|
|
|
|
@Override
|
|
public void onDrawFrame(GL10 gl) {
|
|
double t = System.nanoTime() * 1.0e-9;
|
|
switch (mState) {
|
|
case STATE_START:
|
|
mStartTime = t;
|
|
mState = STATE_WARMUP;
|
|
break;
|
|
|
|
case STATE_WARMUP:
|
|
if ((t - mStartTime) >= WARMUP_SECONDS) {
|
|
mStartTime = t;
|
|
mNumFrames = 0;
|
|
mState = STATE_TEST;
|
|
}
|
|
break;
|
|
|
|
case STATE_TEST:
|
|
mNumFrames++;
|
|
double elapsed = t - mStartTime;
|
|
if (elapsed >= TEST_SECONDS) {
|
|
double fps = (double)mNumFrames / elapsed;
|
|
Log.i(TAG, "Measured FPS to: " + fps);
|
|
setFPSSetting(fps);
|
|
mState = STATE_DONE;
|
|
}
|
|
break;
|
|
|
|
case STATE_DONE:
|
|
activity.runOnUiThread(new Runnable() {
|
|
public void run() {
|
|
finish();
|
|
}
|
|
});
|
|
mState = STATE_DEAD;
|
|
break;
|
|
|
|
case STATE_DEAD:
|
|
break;
|
|
}
|
|
|
|
float luma = (float)Math.sin((double)mNumFrames * 0.10);
|
|
luma *= 0.2f;
|
|
luma += 0.5f;
|
|
GLES20.glClearColor(luma, luma, luma, 1.0f);
|
|
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
|
|
}
|
|
|
|
@Override
|
|
public void onSurfaceChanged(GL10 gl, int width, int height) {
|
|
// TODO Auto-generated method stub
|
|
}
|
|
|
|
@Override
|
|
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
|
|
// TODO Auto-generated method stub
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
Toast.makeText(this, R.string.touch_screen_with_fingers, Toast.LENGTH_LONG).show();
|
|
final GLSurfaceView surfaceView = new GLSurfaceView(this);
|
|
surfaceView.setEGLContextClientVersion(2);
|
|
surfaceView.setRenderer(new Renderer(this));
|
|
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
|
setTitle(R.string.refresh_rate_calibration);
|
|
setContentView(surfaceView);
|
|
}
|
|
|
|
@Override
|
|
protected void onDestroy() {
|
|
SharedPreferences prefs = UserPreferences.getPreferences(this);
|
|
String fps = prefs.getString("video_refresh_rate", "ERROR");
|
|
Toast.makeText(this, String.format(getString(R.string.refresh_rate_measured_to), fps), Toast.LENGTH_LONG).show();
|
|
super.onDestroy();
|
|
}
|
|
}
|