androidgpuglsurfaceview

Print GPU info (renderer, version, vendor) on TextView on Android


I searched the entire Internet for days now to find a solution and got nothing.

I want to get the main info about the GPU on Android devices (like RENDERER, VENDOR and VERSION) and be able to print it on a textview on a defined XML layout. I tryed a lot of methods and nothing worked for me. Everybody says to use this:

Log.d("GL", "GL_RENDERER = " + gl.glGetString(GL10.GL_RENDERER));
Log.d("GL", "GL_VENDOR = " + gl.glGetString(GL10.GL_VENDOR));
Log.d("GL", "GL_VERSION = " + gl.glGetString(GL10.GL_VERSION));
Log.i("GL", "GL_EXTENSIONS = " + gl.glGetString(GL10.GL_EXTENSIONS));

I implemented the next class:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mGLView = new GLSurfaceView(this);
    mGLView.setRenderer(new ClearRenderer());
    setContentView(mGLView);

}


private GLSurfaceView mGLView;
static class ClearRenderer implements GLSurfaceView.Renderer {

    public final static String renderer = null;
    Random aleatorio = new Random();

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        float r = aleatorio.nextFloat();
        float g = aleatorio.nextFloat();
        float b = aleatorio.nextFloat();
        gl.glClearColor(r, g, b, 1.0f);

        Log.d("GL", "GL_RENDERER = " + gl.glGetString(GL10.GL_RENDERER));
        Log.d("GL", "GL_VENDOR = " + gl.glGetString(GL10.GL_VENDOR));
        Log.d("GL", "GL_VERSION = " + gl.glGetString(GL10.GL_VERSION));
        Log.i("GL", "GL_EXTENSIONS = " + gl.glGetString(GL10.GL_EXTENSIONS));

    }

    public void onSurfaceChanged(GL10 gl, int w, int h) {           
    }

    public void onDrawFrame(GL10 gl) {
        gl.glClear(gl.GL_COLOR_BUFFER_BIT);         
    }
}
}

which works great but I have no idea how to put those logs into a textview. Setting up the ContentView to my GLSurfaceView I don't know how to use a TextView in there.

I aslo tryed using:

String renderer = gl.glGetString(GL10.GL_VENDOR);
Log.d("GL", renderer);

in the same place where previous Logs are, which also workg great and I can see the right value of the vendor in the LogCat.

But still, I don't know how to pass this value to a textview (for example tv.setText(renderer)) and use it on a normal layout.

I will appreciate a lot if someone could help me solve this problem with a simple example. Take in considerations that I never used OpenGL and I only want to get that info about it. I also accept if you tell me another way (easier if possible :D) to get that info.

Thanks in advance.


Solution

  • Finally after struggling with this problem, I found a possible solution. Maybe it is not the best but I had no other and it workd.

    I used shared preferences to store the info. I created a launcher activity with the implemented GLSurfaceView with a delay of 3 seconds (more than enough to store all the strings) and after this delay the activity I need starts.

    The launcher activity looks like this:

    package system.info.to.txt;
    
    import java.util.Random;
    import javax.microedition.khronos.egl.EGLConfig;
    import javax.microedition.khronos.opengles.GL10;
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.opengl.GLSurfaceView;
    import android.os.Bundle;
    import android.os.CountDownTimer;
    import android.util.Log;
    
    public class RendererLoader extends Activity {
    
    private static SharedPreferences prefs;
    private static SharedPreferences.Editor editor;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        prefs = this.getSharedPreferences("GPUinfo", Context.MODE_PRIVATE);
        mGLView = new GLSurfaceView(this);
        mGLView.setRenderer(new ClearRenderer());
        setContentView(mGLView);    
    
        final Intent intent = new Intent(this, Info.class);
        new CountDownTimer(3000, 9999)
             {
               public void onTick(long millisUntilFinished) {
                         // Not used
               }
               public void onFinish() {             
               startActivity(intent);
               finish();
               }
            }.start();  
    }
    
    
    private GLSurfaceView mGLView;
    class ClearRenderer implements GLSurfaceView.Renderer {
    
        Random aleatorio = new Random();
    
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            float r = aleatorio.nextFloat();
            float g = aleatorio.nextFloat();
            float b = aleatorio.nextFloat();
            gl.glClearColor(r, g, b, 1.0f);
    
            editor = prefs.edit();
            editor.putString("RENDERER", gl.glGetString(GL10.GL_RENDERER));
            editor.putString("VENDOR", gl.glGetString(GL10.GL_VENDOR));
            editor.putString("VERSION", gl.glGetString(GL10.GL_VERSION));
            editor.putString("EXTENSIONS", gl.glGetString(GL10.GL_EXTENSIONS));
            editor.commit();
    
        }
    
        public void onSurfaceChanged(GL10 gl, int w, int h) {
    
        }
    
        public void onDrawFrame(GL10 gl) {
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    
        }
      }
    }
    

    After that, you can retrieve the stored strings everywhere you want in your application using:

        SharedPreferences prefs =getSharedPreferences("GPUinfo",Context.MODE_PRIVATE);
        String vendor = prefs.getString("VENDOR", null);
        String renderer = prefs.getString("RENDERER", null);
        String version = prefs.getString("VERSION", null);
        String extensions = prefs.getString("EXTENSIONS", null);
    

    I hope this answer will be useful for the people with the same problem. Any other solution will be also helpful.