Add a virtual layer and GL layer client implementation

This commit is contained in:
Patrick Walton 2012-02-03 15:48:26 -08:00
parent 3235b71537
commit d6e3afde17
8 changed files with 69 additions and 10 deletions

View File

@ -41,6 +41,7 @@
package org.mozilla.gecko; package org.mozilla.gecko;
import org.mozilla.gecko.gfx.FloatSize; import org.mozilla.gecko.gfx.FloatSize;
import org.mozilla.gecko.gfx.GeckoGLLayerClient;
import org.mozilla.gecko.gfx.GeckoLayerClient; import org.mozilla.gecko.gfx.GeckoLayerClient;
import org.mozilla.gecko.gfx.GeckoSoftwareLayerClient; import org.mozilla.gecko.gfx.GeckoSoftwareLayerClient;
import org.mozilla.gecko.gfx.IntSize; import org.mozilla.gecko.gfx.IntSize;
@ -1591,8 +1592,12 @@ abstract public class GeckoApp
/* /*
* Create a layer client so that Gecko will have a buffer to draw into, but don't hook * Create a layer client so that Gecko will have a buffer to draw into, but don't hook
* it up to the layer controller yet. * it up to the layer controller yet.
*
* TODO: Switch between software and GL appropriately.
*/ */
mLayerClient = new GeckoSoftwareLayerClient(this); Log.e(LOGTAG, "### Creating GeckoGLLayerClient");
mLayerClient = new GeckoGLLayerClient(this);
Log.e(LOGTAG, "### Done creating GeckoGLLayerClient");
/* /*
* Hook a placeholder layer client up to the layer controller so that the user can pan * Hook a placeholder layer client up to the layer controller so that the user can pan

View File

@ -110,6 +110,7 @@ FENNEC_JAVA_FILES = \
gfx/CheckerboardImage.java \ gfx/CheckerboardImage.java \
gfx/FlexibleGLSurfaceView.java \ gfx/FlexibleGLSurfaceView.java \
gfx/FloatSize.java \ gfx/FloatSize.java \
gfx/GeckoGLLayerClient.java \
gfx/GeckoLayerClient.java \ gfx/GeckoLayerClient.java \
gfx/GeckoSoftwareLayerClient.java \ gfx/GeckoSoftwareLayerClient.java \
gfx/GLController.java \ gfx/GLController.java \
@ -133,6 +134,7 @@ FENNEC_JAVA_FILES = \
gfx/TextureReaper.java \ gfx/TextureReaper.java \
gfx/TileLayer.java \ gfx/TileLayer.java \
gfx/ViewportMetrics.java \ gfx/ViewportMetrics.java \
gfx/VirtualLayer.java \
gfx/WidgetTileLayer.java \ gfx/WidgetTileLayer.java \
ui/Axis.java \ ui/Axis.java \
ui/PanZoomController.java \ ui/PanZoomController.java \

View File

@ -122,12 +122,17 @@ public abstract class GeckoLayerClient extends LayerClient implements GeckoEvent
public boolean beginDrawing(int width, int height, int tileWidth, int tileHeight, public boolean beginDrawing(int width, int height, int tileWidth, int tileHeight,
String metadata, boolean hasDirectTexture) { String metadata, boolean hasDirectTexture) {
Log.e(LOGTAG, "### beginDrawing " + width + " " + height + " " + tileWidth + " " +
tileHeight + " " + hasDirectTexture);
// If we've changed surface types, cancel this draw // If we've changed surface types, cancel this draw
if (handleDirectTextureChange(hasDirectTexture)) { if (handleDirectTextureChange(hasDirectTexture)) {
Log.e(LOGTAG, "### Cancelling draw due to direct texture change");
return false; return false;
} }
if (!shouldDrawProceed(tileWidth, tileHeight)) { if (!shouldDrawProceed(tileWidth, tileHeight)) {
Log.e(LOGTAG, "### Cancelling draw due to shouldDrawProceed()");
return false; return false;
} }
@ -202,6 +207,8 @@ public abstract class GeckoLayerClient extends LayerClient implements GeckoEvent
/* Informs Gecko that the screen size has changed. */ /* Informs Gecko that the screen size has changed. */
protected void sendResizeEventIfNecessary(boolean force) { protected void sendResizeEventIfNecessary(boolean force) {
Log.e(LOGTAG, "### sendResizeEventIfNecessary " + force);
DisplayMetrics metrics = new DisplayMetrics(); DisplayMetrics metrics = new DisplayMetrics();
GeckoApp.mAppContext.getWindowManager().getDefaultDisplay().getMetrics(metrics); GeckoApp.mAppContext.getWindowManager().getDefaultDisplay().getMetrics(metrics);
@ -219,7 +226,7 @@ public abstract class GeckoLayerClient extends LayerClient implements GeckoEvent
mScreenSize = new IntSize(metrics.widthPixels, metrics.heightPixels); mScreenSize = new IntSize(metrics.widthPixels, metrics.heightPixels);
IntSize bufferSize = getBufferSize(), tileSize = getTileSize(); IntSize bufferSize = getBufferSize(), tileSize = getTileSize();
Log.i(LOGTAG, "Screen-size changed to " + mScreenSize); Log.e(LOGTAG, "### Screen-size changed to " + mScreenSize);
GeckoEvent event = new GeckoEvent(GeckoEvent.SIZE_CHANGED, GeckoEvent event = new GeckoEvent(GeckoEvent.SIZE_CHANGED,
bufferSize.width, bufferSize.height, bufferSize.width, bufferSize.height,
metrics.widthPixels, metrics.heightPixels, metrics.widthPixels, metrics.heightPixels,

View File

@ -186,6 +186,10 @@ public abstract class Layer {
return true; return true;
} }
protected boolean dimensionChangesPending() {
return (mNewOrigin != null) || (mNewResolution != 0.0f);
}
public static class RenderContext { public static class RenderContext {
public final RectF viewport; public final RectF viewport;
public final FloatSize pageSize; public final FloatSize pageSize;

View File

@ -966,12 +966,9 @@ AndroidBridge::SetLayerClient(jobject obj, jint type)
break; break;
} }
case LAYER_CLIENT_TYPE_GL: { case LAYER_CLIENT_TYPE_GL: {
// TODO: Implement.
#if 0
AndroidGeckoGLLayerClient *client = new AndroidGeckoGLLayerClient(); AndroidGeckoGLLayerClient *client = new AndroidGeckoGLLayerClient();
client->Init(obj); client->Init(obj);
mLayerClient = client; mLayerClient = client;
#endif
break; break;
} }
default: default:

View File

@ -117,6 +117,8 @@ jmethodID AndroidGeckoSoftwareLayerClient::jLockBufferMethod = 0;
jmethodID AndroidGeckoSoftwareLayerClient::jUnlockBufferMethod = 0; jmethodID AndroidGeckoSoftwareLayerClient::jUnlockBufferMethod = 0;
jmethodID AndroidGeckoSoftwareLayerClient::jGetRenderOffsetMethod = 0; jmethodID AndroidGeckoSoftwareLayerClient::jGetRenderOffsetMethod = 0;
jclass AndroidGeckoGLLayerClient::jGeckoGLLayerClientClass = 0;
jclass AndroidGeckoSurfaceView::jGeckoSurfaceViewClass = 0; jclass AndroidGeckoSurfaceView::jGeckoSurfaceViewClass = 0;
jmethodID AndroidGeckoSurfaceView::jBeginDrawingMethod = 0; jmethodID AndroidGeckoSurfaceView::jBeginDrawingMethod = 0;
jmethodID AndroidGeckoSurfaceView::jEndDrawingMethod = 0; jmethodID AndroidGeckoSurfaceView::jEndDrawingMethod = 0;
@ -351,6 +353,16 @@ AndroidGeckoSoftwareLayerClient::InitGeckoSoftwareLayerClientClass(JNIEnv *jEnv)
#endif #endif
} }
void
AndroidGeckoGLLayerClient::InitGeckoGLLayerClientClass(JNIEnv *jEnv)
{
#ifdef MOZ_JAVA_COMPOSITOR
initInit();
jGeckoGLLayerClientClass = getClassGlobalRef("org/mozilla/gecko/gfx/GeckoGLLayerClient");
#endif
}
#undef initInit #undef initInit
#undef initClassGlobalRef #undef initClassGlobalRef
#undef getField #undef getField
@ -608,6 +620,13 @@ AndroidGeckoSoftwareLayerClient::Init(jobject jobj)
wrapped_obj = jobj; wrapped_obj = jobj;
} }
void
AndroidGeckoGLLayerClient::Init(jobject jobj)
{
NS_ASSERTION(wrapped_obj == nsnull, "Init called on non-null wrapped_obj!");
wrapped_obj = jobj;
}
void void
AndroidGeckoSurfaceView::Init(jobject jobj) AndroidGeckoSurfaceView::Init(jobject jobj)
{ {

View File

@ -193,6 +193,19 @@ protected:
static jmethodID jGetRenderOffsetMethod; static jmethodID jGetRenderOffsetMethod;
}; };
class AndroidGeckoGLLayerClient : public AndroidGeckoLayerClient {
public:
static void InitGeckoGLLayerClientClass(JNIEnv *jEnv);
void Init(jobject jobj);
AndroidGeckoGLLayerClient() {}
AndroidGeckoGLLayerClient(jobject jobj) { Init(jobj); }
private:
static jclass jGeckoGLLayerClientClass;
};
class AndroidGeckoSurfaceView : public WrappedJavaObject class AndroidGeckoSurfaceView : public WrappedJavaObject
{ {
public: public:

View File

@ -1200,13 +1200,18 @@ nsWindow::OnDraw(AndroidGeckoEvent *ae)
return; return;
} }
__android_log_print(ANDROID_LOG_ERROR, "Gecko", "### OnDraw()");
nsRefPtr<nsWindow> kungFuDeathGrip(this); nsRefPtr<nsWindow> kungFuDeathGrip(this);
AndroidBridge::AutoLocalJNIFrame jniFrame; AndroidBridge::AutoLocalJNIFrame jniFrame;
#ifdef MOZ_JAVA_COMPOSITOR #ifdef MOZ_JAVA_COMPOSITOR
// We haven't been given a window-size yet, so do nothing // We haven't been given a window-size yet, so do nothing
if (gAndroidBounds.width <= 0 || gAndroidBounds.height <= 0) if (gAndroidBounds.width <= 0 || gAndroidBounds.height <= 0) {
__android_log_print(ANDROID_LOG_ERROR, "Gecko",
"### No window size yet -- skipping draw!");
return; return;
}
/* /*
* Check to see whether the presentation shell corresponding to the document on the screen * Check to see whether the presentation shell corresponding to the document on the screen
@ -1221,6 +1226,7 @@ nsWindow::OnDraw(AndroidGeckoEvent *ae)
metadataProvider->PaintingSuppressed(&paintingSuppressed); metadataProvider->PaintingSuppressed(&paintingSuppressed);
} }
if (paintingSuppressed) { if (paintingSuppressed) {
__android_log_print(ANDROID_LOG_ERROR, "Gecko", "### Painting suppressed!");
return; return;
} }
@ -1267,6 +1273,7 @@ nsWindow::OnDraw(AndroidGeckoEvent *ae)
if (!client.BeginDrawing(gAndroidBounds.width, gAndroidBounds.height, if (!client.BeginDrawing(gAndroidBounds.width, gAndroidBounds.height,
gAndroidTileSize.width, gAndroidTileSize.height, gAndroidTileSize.width, gAndroidTileSize.height,
metadata, HasDirectTexture())) { metadata, HasDirectTexture())) {
__android_log_print(ANDROID_LOG_ERROR, "Gecko", "### BeginDrawing returned false!");
return; return;
} }
@ -1276,6 +1283,7 @@ nsWindow::OnDraw(AndroidGeckoEvent *ae)
unsigned char *bits = NULL; unsigned char *bits = NULL;
if (HasDirectTexture()) { if (HasDirectTexture()) {
__android_log_print(ANDROID_LOG_ERROR, "Gecko", "### Have direct texture!");
if (sDirectTexture->Width() != gAndroidBounds.width || if (sDirectTexture->Width() != gAndroidBounds.width ||
sDirectTexture->Height() != gAndroidBounds.height) { sDirectTexture->Height() != gAndroidBounds.height) {
sDirectTexture->Reallocate(gAndroidBounds.width, gAndroidBounds.height); sDirectTexture->Reallocate(gAndroidBounds.width, gAndroidBounds.height);
@ -1283,14 +1291,17 @@ nsWindow::OnDraw(AndroidGeckoEvent *ae)
sDirectTexture->Lock(AndroidGraphicBuffer::UsageSoftwareWrite, dirtyRect, &bits); sDirectTexture->Lock(AndroidGraphicBuffer::UsageSoftwareWrite, dirtyRect, &bits);
} else if (layerClientType == AndroidBridge::LAYER_CLIENT_TYPE_SOFTWARE) { } else if (layerClientType == AndroidBridge::LAYER_CLIENT_TYPE_SOFTWARE) {
__android_log_print(ANDROID_LOG_ERROR, "Gecko", "### Software layer client!");
bits = ((AndroidGeckoSoftwareLayerClient &)client).LockBufferBits(); bits = ((AndroidGeckoSoftwareLayerClient &)client).LockBufferBits();
if (!bits) {
ALOG("### Failed to lock buffer");
}
} }
if (!bits) { if (targetSurface->CairoStatus()) {
ALOG("### Failed to lock buffer");
} else if (targetSurface->CairoStatus()) {
ALOG("### Failed to create a valid surface from the bitmap"); ALOG("### Failed to create a valid surface from the bitmap");
} else { } else if (bits || layerClientType == AndroidBridge::LAYER_CLIENT_TYPE_GL) {
__android_log_print(ANDROID_LOG_ERROR, "Gecko", "### Calling DrawTo()!");
DrawTo(targetSurface, dirtyRect); DrawTo(targetSurface, dirtyRect);
} }
@ -1300,6 +1311,7 @@ nsWindow::OnDraw(AndroidGeckoEvent *ae)
((AndroidGeckoSoftwareLayerClient &)client).UnlockBuffer(); ((AndroidGeckoSoftwareLayerClient &)client).UnlockBuffer();
} }
__android_log_print(ANDROID_LOG_ERROR, "Gecko", "### Calling EndDrawing()!");
client.EndDrawing(dirtyRect); client.EndDrawing(dirtyRect);
return; return;
#endif #endif