Completely collapse GeckoGLLayerClient into GeckoLayerClient.

This commit is contained in:
Kartikaya Gupta 2012-02-22 14:45:44 -05:00
Родитель 6e5fbc99ac
Коммит 1f588cc799
8 изменённых файлов: 84 добавлений и 180 удалений

Просмотреть файл

@ -42,7 +42,6 @@ package org.mozilla.gecko;
import org.mozilla.gecko.db.BrowserDB; import org.mozilla.gecko.db.BrowserDB;
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.IntSize; import org.mozilla.gecko.gfx.IntSize;
import org.mozilla.gecko.gfx.Layer; import org.mozilla.gecko.gfx.Layer;
@ -1781,14 +1780,11 @@ abstract public class GeckoApp
if (mLayerController == null) { if (mLayerController == null) {
/* /*
* Create a layer client so that Gecko will have a buffer to draw into, but don't hook * Create a layer client, 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.
*/ */
Log.e(LOGTAG, "### Creating GeckoGLLayerClient"); Log.e(LOGTAG, "### Creating GeckoLayerClient");
mLayerClient = new GeckoGLLayerClient(this); mLayerClient = new GeckoLayerClient(this);
Log.e(LOGTAG, "### Done creating GeckoGLLayerClient"); Log.e(LOGTAG, "### Done creating GeckoLayerClient");
/* /*
* 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

Просмотреть файл

@ -110,7 +110,6 @@ 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/GLController.java \ gfx/GLController.java \
gfx/GLThread.java \ gfx/GLThread.java \

Просмотреть файл

@ -1,104 +0,0 @@
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Android code.
*
* The Initial Developer of the Original Code is Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2009-2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Patrick Walton <pcwalton@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package org.mozilla.gecko.gfx;
import org.mozilla.gecko.GeckoAppShell;
import org.mozilla.gecko.GeckoEvent;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.Log;
import android.view.View;
public class GeckoGLLayerClient extends GeckoLayerClient {
private static final String LOGTAG = "GeckoGLLayerClient";
private boolean mLayerRendererInitialized;
public GeckoGLLayerClient(Context context) {
super(context);
}
/** This function is invoked by Gecko via JNI; be careful when modifying signature. */
public ViewTransform getViewTransform() {
Log.e(LOGTAG, "### getViewTransform()");
// NB: We don't begin a transaction here because this can be called in a synchronous
// manner between beginDrawing() and endDrawing(), and that will cause a deadlock.
synchronized (mLayerController) {
ViewportMetrics viewportMetrics = mLayerController.getViewportMetrics();
PointF viewportOrigin = viewportMetrics.getOrigin();
Point tileOrigin = mTileLayer.getOrigin();
float scrollX = viewportOrigin.x;
float scrollY = viewportOrigin.y;
float zoomFactor = viewportMetrics.getZoomFactor();
Log.e(LOGTAG, "### Viewport metrics = " + viewportMetrics + " tile reso = " +
mTileLayer.getResolution());
return new ViewTransform(scrollX, scrollY, zoomFactor);
}
}
/** This function is invoked by Gecko via JNI; be careful when modifying signature. */
public LayerRenderer.Frame createFrame() {
// Create the shaders and textures if necessary.
if (!mLayerRendererInitialized) {
mLayerRenderer.createProgram();
mLayerRendererInitialized = true;
}
// Build the contexts and create the frame.
Layer.RenderContext pageContext = mLayerRenderer.createPageContext();
Layer.RenderContext screenContext = mLayerRenderer.createScreenContext();
return mLayerRenderer.createFrame(pageContext, screenContext);
}
/** This function is invoked by Gecko via JNI; be careful when modifying signature. */
public void activateProgram() {
mLayerRenderer.activateProgram();
}
/** This function is invoked by Gecko via JNI; be careful when modifying signature. */
public void deactivateProgram() {
mLayerRenderer.deactivateProgram();
}
}

Просмотреть файл

@ -59,13 +59,14 @@ import android.view.View;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public abstract class GeckoLayerClient implements GeckoEventListener, public class GeckoLayerClient implements GeckoEventListener,
FlexibleGLSurfaceView.Listener, FlexibleGLSurfaceView.Listener,
VirtualLayer.Listener { VirtualLayer.Listener {
private static final String LOGTAG = "GeckoLayerClient"; private static final String LOGTAG = "GeckoLayerClient";
protected LayerController mLayerController; protected LayerController mLayerController;
protected LayerRenderer mLayerRenderer; private LayerRenderer mLayerRenderer;
private boolean mLayerRendererInitialized;
protected IntSize mScreenSize; protected IntSize mScreenSize;
protected IntSize mWindowSize; protected IntSize mWindowSize;
@ -436,6 +437,49 @@ public abstract class GeckoLayerClient implements GeckoEventListener,
sendResizeEventIfNecessary(false); sendResizeEventIfNecessary(false);
} }
/** This function is invoked by Gecko via JNI; be careful when modifying signature. */
public ViewTransform getViewTransform() {
Log.e(LOGTAG, "### getViewTransform()");
// NB: We don't begin a transaction here because this can be called in a synchronous
// manner between beginDrawing() and endDrawing(), and that will cause a deadlock.
synchronized (mLayerController) {
ViewportMetrics viewportMetrics = mLayerController.getViewportMetrics();
PointF viewportOrigin = viewportMetrics.getOrigin();
Point tileOrigin = mTileLayer.getOrigin();
float scrollX = viewportOrigin.x;
float scrollY = viewportOrigin.y;
float zoomFactor = viewportMetrics.getZoomFactor();
Log.e(LOGTAG, "### Viewport metrics = " + viewportMetrics + " tile reso = " +
mTileLayer.getResolution());
return new ViewTransform(scrollX, scrollY, zoomFactor);
}
}
/** This function is invoked by Gecko via JNI; be careful when modifying signature. */
public LayerRenderer.Frame createFrame() {
// Create the shaders and textures if necessary.
if (!mLayerRendererInitialized) {
mLayerRenderer.createProgram();
mLayerRendererInitialized = true;
}
// Build the contexts and create the frame.
Layer.RenderContext pageContext = mLayerRenderer.createPageContext();
Layer.RenderContext screenContext = mLayerRenderer.createScreenContext();
return mLayerRenderer.createFrame(pageContext, screenContext);
}
/** This function is invoked by Gecko via JNI; be careful when modifying signature. */
public void activateProgram() {
mLayerRenderer.activateProgram();
}
/** This function is invoked by Gecko via JNI; be careful when modifying signature. */
public void deactivateProgram() {
mLayerRenderer.deactivateProgram();
}
/** Implementation of FlexibleGLSurfaceView.Listener */ /** Implementation of FlexibleGLSurfaceView.Listener */
public void renderRequested() { public void renderRequested() {
Log.e(LOGTAG, "### Render requested, scheduling composite"); Log.e(LOGTAG, "### Render requested, scheduling composite");

Просмотреть файл

@ -990,7 +990,7 @@ AndroidBridge::SetSurfaceView(jobject obj)
void void
AndroidBridge::SetLayerClient(jobject obj) AndroidBridge::SetLayerClient(jobject obj)
{ {
AndroidGeckoGLLayerClient *client = new AndroidGeckoGLLayerClient(); AndroidGeckoLayerClient *client = new AndroidGeckoLayerClient();
client->Init(obj); client->Init(obj);
mLayerClient = client; mLayerClient = client;
} }

Просмотреть файл

@ -113,12 +113,10 @@ jmethodID AndroidAddress::jGetThoroughfareMethod;
jclass AndroidGeckoLayerClient::jGeckoLayerClientClass = 0; jclass AndroidGeckoLayerClient::jGeckoLayerClientClass = 0;
jmethodID AndroidGeckoLayerClient::jBeginDrawingMethod = 0; jmethodID AndroidGeckoLayerClient::jBeginDrawingMethod = 0;
jmethodID AndroidGeckoLayerClient::jEndDrawingMethod = 0; jmethodID AndroidGeckoLayerClient::jEndDrawingMethod = 0;
jmethodID AndroidGeckoLayerClient::jGetViewTransformMethod = 0;
jclass AndroidGeckoGLLayerClient::jGeckoGLLayerClientClass = 0; jmethodID AndroidGeckoLayerClient::jCreateFrameMethod = 0;
jmethodID AndroidGeckoGLLayerClient::jGetViewTransformMethod = 0; jmethodID AndroidGeckoLayerClient::jActivateProgramMethod = 0;
jmethodID AndroidGeckoGLLayerClient::jCreateFrameMethod = 0; jmethodID AndroidGeckoLayerClient::jDeactivateProgramMethod = 0;
jmethodID AndroidGeckoGLLayerClient::jActivateProgramMethod = 0;
jmethodID AndroidGeckoGLLayerClient::jDeactivateProgramMethod = 0;
jclass AndroidLayerRendererFrame::jLayerRendererFrameClass = 0; jclass AndroidLayerRendererFrame::jLayerRendererFrameClass = 0;
jmethodID AndroidLayerRendererFrame::jBeginDrawingMethod = 0; jmethodID AndroidLayerRendererFrame::jBeginDrawingMethod = 0;
@ -162,7 +160,6 @@ mozilla::InitAndroidJavaWrappers(JNIEnv *jEnv)
AndroidAddress::InitAddressClass(jEnv); AndroidAddress::InitAddressClass(jEnv);
AndroidRect::InitRectClass(jEnv); AndroidRect::InitRectClass(jEnv);
AndroidGeckoLayerClient::InitGeckoLayerClientClass(jEnv); AndroidGeckoLayerClient::InitGeckoLayerClientClass(jEnv);
AndroidGeckoGLLayerClient::InitGeckoGLLayerClientClass(jEnv);
AndroidLayerRendererFrame::InitLayerRendererFrameClass(jEnv); AndroidLayerRendererFrame::InitLayerRendererFrameClass(jEnv);
AndroidViewTransform::InitViewTransformClass(jEnv); AndroidViewTransform::InitViewTransformClass(jEnv);
AndroidGeckoSurfaceView::InitGeckoSurfaceViewClass(jEnv); AndroidGeckoSurfaceView::InitGeckoSurfaceViewClass(jEnv);
@ -352,17 +349,6 @@ AndroidGeckoLayerClient::InitGeckoLayerClientClass(JNIEnv *jEnv)
jBeginDrawingMethod = getMethod("beginDrawing", "(IIIILjava/lang/String;Z)Landroid/graphics/Rect;"); jBeginDrawingMethod = getMethod("beginDrawing", "(IIIILjava/lang/String;Z)Landroid/graphics/Rect;");
jEndDrawingMethod = getMethod("endDrawing", "(IIII)V"); jEndDrawingMethod = getMethod("endDrawing", "(IIII)V");
#endif
}
void
AndroidGeckoGLLayerClient::InitGeckoGLLayerClientClass(JNIEnv *jEnv)
{
#ifdef MOZ_JAVA_COMPOSITOR
initInit();
jGeckoGLLayerClientClass = getClassGlobalRef("org/mozilla/gecko/gfx/GeckoGLLayerClient");
jGetViewTransformMethod = getMethod("getViewTransform", jGetViewTransformMethod = getMethod("getViewTransform",
"()Lorg/mozilla/gecko/gfx/ViewTransform;"); "()Lorg/mozilla/gecko/gfx/ViewTransform;");
jCreateFrameMethod = getMethod("createFrame", "()Lorg/mozilla/gecko/gfx/LayerRenderer$Frame;"); jCreateFrameMethod = getMethod("createFrame", "()Lorg/mozilla/gecko/gfx/LayerRenderer$Frame;");
@ -690,7 +676,7 @@ AndroidGeckoEvent::DoCallback(const nsAString& data) {
} }
void void
AndroidGeckoGLLayerClient::Init(jobject jobj) AndroidGeckoLayerClient::Init(jobject jobj)
{ {
NS_ASSERTION(wrapped_obj == nsnull, "Init called on non-null wrapped_obj!"); NS_ASSERTION(wrapped_obj == nsnull, "Init called on non-null wrapped_obj!");
wrapped_obj = jobj; wrapped_obj = jobj;
@ -854,7 +840,7 @@ AndroidGeckoSurfaceView::GetSurfaceHolder()
} }
void void
AndroidGeckoGLLayerClient::GetViewTransform(AndroidViewTransform& aViewTransform) AndroidGeckoLayerClient::GetViewTransform(AndroidViewTransform& aViewTransform)
{ {
JNIEnv *env = GetJNIForThread(); JNIEnv *env = GetJNIForThread();
NS_ABORT_IF_FALSE(env, "No JNI environment at GetViewTransform()!"); NS_ABORT_IF_FALSE(env, "No JNI environment at GetViewTransform()!");
@ -868,7 +854,7 @@ AndroidGeckoGLLayerClient::GetViewTransform(AndroidViewTransform& aViewTransform
} }
void void
AndroidGeckoGLLayerClient::CreateFrame(AndroidLayerRendererFrame& aFrame) AndroidGeckoLayerClient::CreateFrame(AndroidLayerRendererFrame& aFrame)
{ {
JNIEnv *env = GetJNIForThread(); JNIEnv *env = GetJNIForThread();
NS_ABORT_IF_FALSE(env, "No JNI environment at CreateFrame()!"); NS_ABORT_IF_FALSE(env, "No JNI environment at CreateFrame()!");
@ -882,7 +868,7 @@ AndroidGeckoGLLayerClient::CreateFrame(AndroidLayerRendererFrame& aFrame)
} }
void void
AndroidGeckoGLLayerClient::ActivateProgram() AndroidGeckoLayerClient::ActivateProgram()
{ {
JNIEnv *env = GetJNIForThread(); JNIEnv *env = GetJNIForThread();
NS_ABORT_IF_FALSE(env, "No JNI environment at ActivateProgram()!"); NS_ABORT_IF_FALSE(env, "No JNI environment at ActivateProgram()!");
@ -894,7 +880,7 @@ AndroidGeckoGLLayerClient::ActivateProgram()
} }
void void
AndroidGeckoGLLayerClient::DeactivateProgram() AndroidGeckoLayerClient::DeactivateProgram()
{ {
JNIEnv *env = GetJNIForThread(); JNIEnv *env = GetJNIForThread();
NS_ABORT_IF_FALSE(env, "No JNI environment at DeactivateProgram()!"); NS_ABORT_IF_FALSE(env, "No JNI environment at DeactivateProgram()!");
@ -981,7 +967,7 @@ AndroidViewTransform::GetScale()
} }
void void
AndroidGeckoGLLayerClientViewTransformGetter::operator()(nsIntPoint& aScrollOffset, float& aScaleX, AndroidGeckoLayerClientViewTransformGetter::operator()(nsIntPoint& aScrollOffset, float& aScaleX,
float& aScaleY) float& aScaleY)
{ {
AndroidViewTransform viewTransform; AndroidViewTransform viewTransform;

Просмотреть файл

@ -58,7 +58,7 @@
namespace mozilla { namespace mozilla {
class AndroidGeckoGLLayerClient; class AndroidGeckoLayerClient;
void InitAndroidJavaWrappers(JNIEnv *jEnv); void InitAndroidJavaWrappers(JNIEnv *jEnv);
@ -153,26 +153,6 @@ protected:
static jfieldID jTopField; static jfieldID jTopField;
}; };
class AndroidGeckoLayerClient : public WrappedJavaObject {
public:
static void InitGeckoLayerClientClass(JNIEnv *jEnv);
void Init(jobject jobj);
bool BeginDrawing(int aWidth, int aHeight, int aTileWidth, int aTileHeight,
nsIntRect &aDirtyRect, const nsAString &aMetadata, bool aHasDirectTexture);
void EndDrawing(const nsIntRect &aRect);
protected:
AndroidGeckoLayerClient() {
// You shouldn't directly instantiate one of these; instead use one of the concrete derived
// classes.
}
static jclass jGeckoLayerClientClass;
static jmethodID jBeginDrawingMethod;
static jmethodID jEndDrawingMethod;
};
/** A callback that retrieves the view transform. */ /** A callback that retrieves the view transform. */
class AndroidViewTransformGetter class AndroidViewTransformGetter
@ -181,15 +161,15 @@ public:
virtual void operator()(nsIntPoint& aScrollOffset, float& aScaleX, float& aScaleY) = 0; virtual void operator()(nsIntPoint& aScrollOffset, float& aScaleX, float& aScaleY) = 0;
}; };
class AndroidGeckoGLLayerClientViewTransformGetter : public AndroidViewTransformGetter { class AndroidGeckoLayerClientViewTransformGetter : public AndroidViewTransformGetter {
public: public:
AndroidGeckoGLLayerClientViewTransformGetter(AndroidGeckoGLLayerClient& aLayerClient) AndroidGeckoLayerClientViewTransformGetter(AndroidGeckoLayerClient& aLayerClient)
: mLayerClient(aLayerClient) {} : mLayerClient(aLayerClient) {}
virtual void operator()(nsIntPoint& aScrollOffset, float& aScaleX, float& aScaleY); virtual void operator()(nsIntPoint& aScrollOffset, float& aScaleX, float& aScaleY);
private: private:
AndroidGeckoGLLayerClient& mLayerClient; AndroidGeckoLayerClient& mLayerClient;
}; };
class AndroidViewTransform : public WrappedJavaObject { class AndroidViewTransform : public WrappedJavaObject {
@ -232,31 +212,36 @@ private:
static jmethodID jEndDrawingMethod; static jmethodID jEndDrawingMethod;
}; };
class AndroidGeckoGLLayerClient : public AndroidGeckoLayerClient { class AndroidGeckoLayerClient : public WrappedJavaObject {
public: public:
static void InitGeckoGLLayerClientClass(JNIEnv *jEnv); static void InitGeckoLayerClientClass(JNIEnv *jEnv);
void Init(jobject jobj); void Init(jobject jobj);
AndroidGeckoGLLayerClient() AndroidGeckoLayerClient()
: mViewTransformGetter(*this) {} : mViewTransformGetter(*this) {}
AndroidGeckoGLLayerClient(jobject jobj) AndroidGeckoLayerClient(jobject jobj)
: mViewTransformGetter(*this) { Init(jobj); } : mViewTransformGetter(*this) { Init(jobj); }
bool BeginDrawing(int aWidth, int aHeight, int aTileWidth, int aTileHeight,
nsIntRect &aDirtyRect, const nsAString &aMetadata, bool aHasDirectTexture);
void EndDrawing(const nsIntRect &aRect);
void GetViewTransform(AndroidViewTransform& aViewTransform); void GetViewTransform(AndroidViewTransform& aViewTransform);
void CreateFrame(AndroidLayerRendererFrame& aFrame); void CreateFrame(AndroidLayerRendererFrame& aFrame);
void ActivateProgram(); void ActivateProgram();
void DeactivateProgram(); void DeactivateProgram();
private: protected:
static jclass jGeckoGLLayerClientClass; static jclass jGeckoLayerClientClass;
static jmethodID jBeginDrawingMethod;
static jmethodID jEndDrawingMethod;
static jmethodID jGetViewTransformMethod; static jmethodID jGetViewTransformMethod;
static jmethodID jCreateFrameMethod; static jmethodID jCreateFrameMethod;
static jmethodID jActivateProgramMethod; static jmethodID jActivateProgramMethod;
static jmethodID jDeactivateProgramMethod; static jmethodID jDeactivateProgramMethod;
AndroidGeckoGLLayerClientViewTransformGetter mViewTransformGetter; AndroidGeckoLayerClientViewTransformGetter mViewTransformGetter;
}; };
class AndroidGeckoSurfaceView : public WrappedJavaObject class AndroidGeckoSurfaceView : public WrappedJavaObject

Просмотреть файл

@ -2390,13 +2390,12 @@ nsWindow::DrawWindowUnderlay(LayerManager* aManager, nsIntRect aRect) {
AndroidBridge::AutoLocalJNIFrame jniFrame(GetJNIForThread()); AndroidBridge::AutoLocalJNIFrame jniFrame(GetJNIForThread());
AndroidGeckoLayerClient& client = AndroidBridge::Bridge()->GetLayerClient(); AndroidGeckoLayerClient& client = AndroidBridge::Bridge()->GetLayerClient();
AndroidGeckoGLLayerClient& glClient = static_cast<AndroidGeckoGLLayerClient&>(client); client.CreateFrame(mLayerRendererFrame);
glClient.CreateFrame(mLayerRendererFrame);
glClient.ActivateProgram(); client.ActivateProgram();
mLayerRendererFrame.BeginDrawing(); mLayerRendererFrame.BeginDrawing();
mLayerRendererFrame.DrawBackground(); mLayerRendererFrame.DrawBackground();
glClient.DeactivateProgram(); client.DeactivateProgram();
} }
void void
@ -2406,12 +2405,11 @@ nsWindow::DrawWindowOverlay(LayerManager* aManager, nsIntRect aRect) {
"Frame should have been created in DrawWindowUnderlay()!"); "Frame should have been created in DrawWindowUnderlay()!");
AndroidGeckoLayerClient& client = AndroidBridge::Bridge()->GetLayerClient(); AndroidGeckoLayerClient& client = AndroidBridge::Bridge()->GetLayerClient();
AndroidGeckoGLLayerClient& glClient = static_cast<AndroidGeckoGLLayerClient&>(client);
glClient.ActivateProgram(); client.ActivateProgram();
mLayerRendererFrame.DrawForeground(); mLayerRendererFrame.DrawForeground();
mLayerRendererFrame.EndDrawing(); mLayerRendererFrame.EndDrawing();
glClient.DeactivateProgram(); client.DeactivateProgram();
mLayerRendererFrame.Dispose(); mLayerRendererFrame.Dispose();
} }