Automated import from //branches/donutburger/...@142486,142486

This commit is contained in:
Jack Palevich
2009-03-24 22:49:06 -07:00
committed by The Android Open Source Project
parent 4c7533cfc8
commit c2310f32b0
2 changed files with 266 additions and 31 deletions

View File

@@ -73401,6 +73401,55 @@
<parameter name="debugFlags" type="int">
</parameter>
</method>
<method name="setEGLConfigChooser"
return="void"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
<parameter name="configChooser" type="android.opengl.GLSurfaceView.EGLConfigChooser">
</parameter>
</method>
<method name="setEGLConfigChooser"
return="void"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
<parameter name="needDepth" type="boolean">
</parameter>
</method>
<method name="setEGLConfigChooser"
return="void"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
<parameter name="redSize" type="int">
</parameter>
<parameter name="greenSize" type="int">
</parameter>
<parameter name="blueSize" type="int">
</parameter>
<parameter name="alphaSize" type="int">
</parameter>
<parameter name="depthSize" type="int">
</parameter>
<parameter name="stencilSize" type="int">
</parameter>
</method>
<method name="setGLWrapper"
return="void"
abstract="false"
@@ -73530,6 +73579,29 @@
>
</field>
</class>
<interface name="GLSurfaceView.EGLConfigChooser"
abstract="true"
static="true"
final="false"
deprecated="not deprecated"
visibility="public"
>
<method name="chooseConfig"
return="javax.microedition.khronos.egl.EGLConfig"
abstract="true"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
<parameter name="egl" type="javax.microedition.khronos.egl.EGL10">
</parameter>
<parameter name="display" type="javax.microedition.khronos.egl.EGLDisplay">
</parameter>
</method>
</interface>
<interface name="GLSurfaceView.GLWrapper"
abstract="true"
static="true"
@@ -73558,17 +73630,6 @@
deprecated="not deprecated"
visibility="public"
>
<method name="getConfigSpec"
return="int[]"
abstract="true"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
</method>
<method name="onDrawFrame"
return="void"
abstract="true"

View File

@@ -107,12 +107,66 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
*/
public void setRenderer(Renderer renderer) {
if (mGLThread != null) {
throw new IllegalStateException("setRenderer has already been called for this instance.");
throw new IllegalStateException(
"setRenderer has already been called for this instance.");
}
if (mEGLConfigChooser == null) {
mEGLConfigChooser = new SimpleEGLConfigChooser(true);
}
mGLThread = new GLThread(renderer);
mGLThread.start();
}
/**
* Set the EGLConfigChooser associated with this view. If this method is
* called at all, it must be called before {@link #setRenderer(Renderer)}
* is called.
* <p>
* The supplied configChooser will be used to choose a configuration.
* @param configChooser
*/
public void setEGLConfigChooser(EGLConfigChooser configChooser) {
if (mGLThread != null) {
throw new IllegalStateException(
"setRenderer has already been called for this instance.");
}
mEGLConfigChooser = configChooser;
}
/**
* Set the EGLConfigChooser associated with this view. If this method is
* called, it must be called before {@link #setRenderer(Renderer)}
* is called.
* <p>
* This method installs a config chooser which will choose a config
* as close to 16-bit RGB as possible, with or without an optional depth
* buffer as close to 16-bits as possible.
* <p>
* If no setEGLConfigChooser method is called, then by default the
* view will choose a config as close to 16-bit RGB as possible, with
* a depth buffer as close to 16-bits as possible.
*
* @param needDepth
*/
public void setEGLConfigChooser(boolean needDepth) {
setEGLConfigChooser(new SimpleEGLConfigChooser(needDepth));
}
/**
* Set the EGLConfigChooser associated with this view. If this method is
* called, it must be called before {@link #setRenderer(Renderer)}
* is called.
* <p>
* This method installs a config chooser which will choose a config
* with at least the specified component sizes, and as close
* to the specified component sizes as possible.
*
*/
public void setEGLConfigChooser(int redSize, int greenSize, int blueSize,
int alphaSize, int depthSize, int stencilSize) {
setEGLConfigChooser(new ComponentSizeChooser(redSize, greenSize,
blueSize, alphaSize, depthSize, stencilSize));
}
/**
* Set the rendering mode. When the renderMode is
* RENDERMODE_CONTINUOUSLY, the renderer is called
@@ -199,11 +253,6 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
* A generic renderer interface.
*/
public interface Renderer {
/**
* @return the EGL configuration specification desired by the renderer.
*/
int[] getConfigSpec();
/**
* Surface created.
* Called when the surface is created. Called when the application
@@ -234,6 +283,140 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
void onDrawFrame(GL10 gl);
}
/**
* An interface for choosing a configuration from a list of
* potential configurations.
*
*/
public interface EGLConfigChooser {
/**
* Choose a configuration from the list. Implementors typically
* implement this method by calling
* {@link EGL10#eglChooseConfig} and iterating through the results.
* @param egl the EGL10 for the current display.
* @param display the current display.
* @return the chosen configuration.
*/
EGLConfig chooseConfig(EGL10 egl, EGLDisplay display);
}
private static abstract class BaseConfigChooser
implements EGLConfigChooser {
public BaseConfigChooser(int[] configSpec) {
mConfigSpec = configSpec;
}
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
int[] num_config = new int[1];
egl.eglChooseConfig(display, mConfigSpec, null, 0, num_config);
int numConfigs = num_config[0];
if (numConfigs <= 0) {
throw new IllegalArgumentException(
"No configs match configSpec");
}
EGLConfig[] configs = new EGLConfig[numConfigs];
egl.eglChooseConfig(display, mConfigSpec, configs, numConfigs,
num_config);
EGLConfig config = chooseConfig(egl, display, configs);
if (config == null) {
throw new IllegalArgumentException("No config chosen");
}
return config;
}
abstract EGLConfig chooseConfig(EGL10 egl, EGLDisplay display,
EGLConfig[] configs);
protected int[] mConfigSpec;
}
private static class ComponentSizeChooser extends BaseConfigChooser {
public ComponentSizeChooser(int redSize, int greenSize, int blueSize,
int alphaSize, int depthSize, int stencilSize) {
super(new int[] {
EGL10.EGL_RED_SIZE, redSize,
EGL10.EGL_GREEN_SIZE, greenSize,
EGL10.EGL_BLUE_SIZE, blueSize,
EGL10.EGL_ALPHA_SIZE, alphaSize,
EGL10.EGL_DEPTH_SIZE, depthSize,
EGL10.EGL_STENCIL_SIZE, stencilSize,
EGL10.EGL_NONE});
mValue = new int[1];
mRedSize = redSize;
mGreenSize = greenSize;
mBlueSize = blueSize;
mAlphaSize = alphaSize;
mDepthSize = depthSize;
mStencilSize = stencilSize;
}
@Override
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display,
EGLConfig[] configs) {
EGLConfig closestConfig = null;
int closestDistance = 1000;
for(EGLConfig config : configs) {
int r = findConfigAttrib(egl, display, config,
EGL10.EGL_RED_SIZE, 0);
int g = findConfigAttrib(egl, display, config,
EGL10.EGL_GREEN_SIZE, 0);
int b = findConfigAttrib(egl, display, config,
EGL10.EGL_BLUE_SIZE, 0);
int a = findConfigAttrib(egl, display, config,
EGL10.EGL_ALPHA_SIZE, 0);
int d = findConfigAttrib(egl, display, config,
EGL10.EGL_DEPTH_SIZE, 0);
int s = findConfigAttrib(egl, display, config,
EGL10.EGL_STENCIL_SIZE, 0);
int distance = Math.abs(r - mRedSize)
+ Math.abs(g - mGreenSize)
+ Math.abs(b - mBlueSize) + Math.abs(a - mAlphaSize)
+ Math.abs(d - mDepthSize) + Math.abs(s - mStencilSize);
if (distance < closestDistance) {
closestDistance = distance;
closestConfig = config;
}
}
return closestConfig;
}
private int findConfigAttrib(EGL10 egl, EGLDisplay display,
EGLConfig config, int attribute, int defaultValue) {
if (egl.eglGetConfigAttrib(display, config, attribute, mValue)) {
return mValue[0];
}
return defaultValue;
}
private int[] mValue;
// Subclasses can adjust these values:
protected int mRedSize;
protected int mGreenSize;
protected int mBlueSize;
protected int mAlphaSize;
protected int mDepthSize;
protected int mStencilSize;
}
/**
* This class will choose a supported surface as close to
* RGB565 as possible, with or without a depth buffer.
*
*/
private static class SimpleEGLConfigChooser extends ComponentSizeChooser {
public SimpleEGLConfigChooser(boolean withDepthBuffer) {
super(4, 4, 4, 0, withDepthBuffer ? 16 : 0, 0);
// Adjust target values. This way we'll accept a 4444 or
// 555 buffer if there's no 565 buffer available.
mRedSize = 5;
mGreenSize = 6;
mBlueSize = 5;
}
}
/**
* An EGL helper class.
*/
@@ -247,7 +430,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
* Initialize EGL for a given configuration spec.
* @param configSpec
*/
public void start(int[] configSpec){
public void start(){
/*
* Get an EGL instance
*/
@@ -263,12 +446,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
*/
int[] version = new int[2];
mEgl.eglInitialize(mEglDisplay, version);
EGLConfig[] configs = new EGLConfig[1];
int[] num_config = new int[1];
mEgl.eglChooseConfig(mEglDisplay, configSpec, configs, 1,
num_config);
mEglConfig = configs[0];
mEglConfig = mEGLConfigChooser.chooseConfig(mEgl, mEglDisplay);
/*
* Create an OpenGL ES context. This must be done only once, an
@@ -418,12 +596,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
private void guardedRun() throws InterruptedException {
mEglHelper = new EglHelper();
/*
* Specify a configuration for our opengl session
* and grab the first configuration that matches is
*/
int[] configSpec = mRenderer.getConfigSpec();
mEglHelper.start(configSpec);
mEglHelper.start();
GL10 gl = null;
boolean tellRendererSurfaceCreated = true;
@@ -463,7 +636,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
mRequestRender = false;
}
if (needStart) {
mEglHelper.start(configSpec);
mEglHelper.start();
tellRendererSurfaceCreated = true;
changed = true;
}
@@ -656,6 +829,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
private boolean mSizeChanged = true;
private GLThread mGLThread;
private EGLConfigChooser mEGLConfigChooser;
private GLWrapper mGLWrapper;
private int mDebugFlags;
}