| Index: chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java
|
| index 6c4b688ad4e7c7059a26103ccd6224bdfc41e3b2..74752b9204fcb73d342e6021cd42be21719bfe2c 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java
|
| @@ -12,20 +12,35 @@ import static android.opengl.GLES20.glGenTextures;
|
| import static android.opengl.GLES20.glTexParameteri;
|
|
|
| import android.app.Activity;
|
| +import android.graphics.PixelFormat;
|
| import android.graphics.SurfaceTexture;
|
| import android.graphics.SurfaceTexture.OnFrameAvailableListener;
|
| import android.opengl.GLES11Ext;
|
| import android.opengl.GLSurfaceView;
|
| import android.view.MotionEvent;
|
| +import android.view.Surface;
|
|
|
| import com.google.vr.ndk.base.AndroidCompat;
|
| import com.google.vr.ndk.base.GvrLayout;
|
|
|
| +import org.chromium.base.Log;
|
| import org.chromium.base.annotations.JNINamespace;
|
| +import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
|
| +import org.chromium.ui.base.WindowAndroid;
|
|
|
| import javax.microedition.khronos.egl.EGLConfig;
|
| import javax.microedition.khronos.opengles.GL10;
|
|
|
| +import java.util.ArrayList;
|
| +import java.util.List;
|
| +import org.chromium.content.browser.ContentViewClient;
|
| +import org.chromium.content.browser.ContentViewCore;
|
| +import org.chromium.chrome.browser.tab.Tab;
|
| +import org.chromium.chrome.browser.tabmodel.TabModelSelector;
|
| +import org.chromium.content_public.browser.WebContents;
|
| +
|
| +import android.os.Handler;
|
| +import android.os.Looper;
|
| /**
|
| * This view extends from GvrLayout which wraps a GLSurfaceView that renders VR shell.
|
| */
|
| @@ -35,7 +50,13 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, OnFram
|
|
|
| private GLSurfaceView mGlSurfaceView;
|
|
|
| + private static List<ContentViewCore> sCachedCVCList = new ArrayList<ContentViewCore>();
|
| +
|
| private SurfaceTexture mSurfaceTexture;
|
| + private Surface mSurface;
|
| +
|
| + private int mWidth = 0;
|
| + private int mHeight = 0;
|
|
|
| private long mNativeVrShell = 0;
|
|
|
| @@ -44,8 +65,9 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, OnFram
|
| mActivity = activity;
|
| }
|
|
|
| - public void onNativeLibraryReady() {
|
| - mNativeVrShell = nativeInit();
|
| + public void onNativeLibraryReady(WindowAndroid windowAndroid) {
|
| + // lowMemDevice should be false
|
| + mNativeVrShell = nativeInit(false, windowAndroid.getNativePointer());
|
| mGlSurfaceView = new GLSurfaceView(getContext());
|
| mGlSurfaceView.setEGLContextClientVersion(2);
|
| mGlSurfaceView.setEGLConfigChooser(8, 8, 8, 0, 0, 0);
|
| @@ -58,12 +80,26 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, OnFram
|
| }
|
| }
|
|
|
| + public void onWebContentsReady(WebContents webContents) {
|
| + Log.e("bshe", "Web contents ready" + webContents.getUrl());
|
| + // sCachedCVCList.clear();
|
| + // mTabModelSelector.getCurrentTab().getAllContentViewCores(sCachedCVCList);
|
| + // for (int i = 0; i < sCachedCVCList.size(); i++) {
|
| + // adjustPhysicalBackingSize(sCachedCVCList.get(i), width, height);
|
| + //}
|
| + // sCachedCVCList.clear();
|
| + Log.e("bshe", "width and height" + mWidth + " " + mHeight);
|
| + adjustPhysicalBackingSize(ContentViewCore.fromWebContents(webContents), mWidth, mHeight);
|
| + nativeOnWebContentsReady(mNativeVrShell, webContents);
|
| + }
|
| +
|
| @Override
|
| public void onFrameAvailable(SurfaceTexture surfaceTexture) {
|
| mGlSurfaceView.queueEvent(new Runnable() {
|
| @Override
|
| public void run() {
|
| try {
|
| + Log.e("bshe", "Frame available");
|
| mSurfaceTexture.updateTexImage();
|
| } catch (IllegalStateException e) {
|
| }
|
| @@ -79,14 +115,50 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, OnFram
|
| int textureDataHandle = createExternalTextureHandle();
|
| mSurfaceTexture = new SurfaceTexture(textureDataHandle);
|
| mSurfaceTexture.setOnFrameAvailableListener(this);
|
| - // TODO(bshe): Use this SurfaceTexture to create a Surface and then pass the Surface to a
|
| - // compositor to get frames of web page.
|
| + mSurface = new Surface(mSurfaceTexture);
|
| + mSurfaceTexture.setDefaultBufferSize(196, 95);
|
| + Log.e("bshe", "surface created");
|
| + new Handler(Looper.getMainLooper()).post(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + nativeSurfaceCreated(mNativeVrShell);
|
| + }
|
| + });
|
| nativeGvrInit(mNativeVrShell, getGvrApi().getNativeGvrContext());
|
| nativeInitializeGl(mNativeVrShell, textureDataHandle);
|
| }
|
|
|
| @Override
|
| - public void onSurfaceChanged(GL10 gl, int width, int height) {}
|
| + public void onSurfaceChanged(GL10 gl, int width, int height) {
|
| + // final int format = PixelFormat.RGBA_8888;
|
| + final int format = 4;
|
| + mWidth = width;
|
| + mHeight = height;
|
| + final int f_width = width;
|
| + final int f_height = height;
|
| + new Handler(Looper.getMainLooper()).post(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + nativeSurfaceChanged(mNativeVrShell, format, f_width, f_height, mSurface);
|
| + }
|
| + });
|
| + }
|
| +
|
| + private void adjustPhysicalBackingSize(ContentViewCore contentViewCore, int width, int height) {
|
| + ContentViewClient client = contentViewCore.getContentViewClient();
|
| +
|
| + int desiredWidthMeasureSpec = client.getDesiredWidthMeasureSpec();
|
| + if (MeasureSpec.getMode(desiredWidthMeasureSpec) != MeasureSpec.UNSPECIFIED) {
|
| + width = MeasureSpec.getSize(desiredWidthMeasureSpec);
|
| + }
|
| +
|
| + int desiredHeightMeasureSpec = client.getDesiredHeightMeasureSpec();
|
| + if (MeasureSpec.getMode(desiredHeightMeasureSpec) != MeasureSpec.UNSPECIFIED) {
|
| + height = MeasureSpec.getSize(desiredHeightMeasureSpec);
|
| + }
|
| +
|
| + contentViewCore.onPhysicalBackingSizeChanged(width, height);
|
| + }
|
|
|
| @Override
|
| public boolean onTouchEvent(MotionEvent event) {
|
| @@ -143,17 +215,17 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, OnFram
|
| }
|
| }
|
|
|
| - private native long nativeInit();
|
| -
|
| + private native long nativeInit(boolean lowMemDevice, long nativeWindowAndroid);
|
| + private native void nativeOnWebContentsReady(long nativeVrShell, WebContents webContents);
|
| private native void nativeGvrInit(long nativeVrShell, long nativeGvrApi);
|
| -
|
| private native void nativeDestroy(long nativeVrShell);
|
| -
|
| private native void nativeInitializeGl(long nativeVrShell, int textureDataHandle);
|
| -
|
| private native void nativeDrawFrame(long nativeVrShell);
|
| -
|
| private native void nativeOnPause(long nativeVrShell);
|
| -
|
| private native void nativeOnResume(long nativeVrShell);
|
| + private native void nativeSurfaceCreated(long nativeVrShell);
|
| + private native void nativeSurfaceDestroyed(long nativeVrShell);
|
| + private native void nativeSurfaceChanged(
|
| + long nativeVrShell, int format, int width, int height, Surface surface);
|
| + private native void nativeSetNeedsComposite(long nativeVrShell);
|
| }
|
|
|