Skip to content

Commit

Permalink
Recreate SwapChain on layer resize. ANativeWindow_setBuffersGeometry(…
Browse files Browse the repository at this point in the history
…) is not reliable.
  • Loading branch information
MortimerGoro committed Nov 22, 2018
1 parent e92f5a3 commit 7ce45a2
Show file tree
Hide file tree
Showing 11 changed files with 148 additions and 73 deletions.
21 changes: 14 additions & 7 deletions app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java
Expand Up @@ -448,21 +448,24 @@ public void onFrameAvailable(SurfaceTexture surfaceTexture) {

@Keep
@SuppressWarnings("unused")
void dispatchCreateWidgetLayer(final int aHandle, final Surface aSurface, final int aWidth, final int aHeight) {
void dispatchCreateWidgetLayer(final int aHandle, final Surface aSurface, final int aWidth, final int aHeight, final long aNativeCallback) {
runOnUiThread(() -> {
final Widget widget = mWidgets.get(aHandle);
if (widget == null) {
Log.e(LOGTAG, "Widget " + aHandle + " not found");
return;
}

Runnable aFirstDrawCallback = null;
if (aSurface != null && !widget.getFirstDraw()) {
aFirstDrawCallback = () -> {
Runnable aFirstDrawCallback = () -> {
if (aNativeCallback != 0) {
queueRunnable(() -> runCallbackNative(aNativeCallback));
}
if (aSurface != null && !widget.getFirstDraw()) {
widget.setFirstDraw(true);
updateWidget(widget);
};
}
}
};


widget.setSurface(aSurface, aWidth, aHeight, aFirstDrawCallback);

Expand Down Expand Up @@ -630,7 +633,7 @@ void resumeGeckoViewCompositor() {

@Keep
@SuppressWarnings("unused")
void renderPointerLayer(final Surface aSurface) {
void renderPointerLayer(final Surface aSurface, final long aNativeCallback) {
runOnUiThread(() -> {
try {
Canvas canvas = aSurface.lockHardwareCanvas();
Expand All @@ -653,6 +656,9 @@ void renderPointerLayer(final Surface aSurface) {
catch (Exception ex) {
ex.printStackTrace();
}
if (aNativeCallback != 0) {
queueRunnable(() -> runCallbackNative(aNativeCallback));
}
});
}

Expand Down Expand Up @@ -977,4 +983,5 @@ public void resetUIYaw() {
private native void hideVRVideoNative();
private native void resetUIYawNative();
private native void setControllersVisibleNative(boolean aVisible);
private native void runCallbackNative(long aCallback);
}
9 changes: 9 additions & 0 deletions app/src/main/cpp/BrowserWorld.cpp
Expand Up @@ -1250,5 +1250,14 @@ JNI_METHOD(void, resetUIYawNative)
crow::BrowserWorld::Instance().ResetUIYaw();
}

JNI_METHOD(void, runCallbackNative)
(JNIEnv* aEnv, jobject, jlong aCallback) {
if (aCallback) {
auto func = reinterpret_cast<std::function<void()> *>((uintptr_t)aCallback);
(*func)();
delete func;
}
}


} // extern "C"
6 changes: 3 additions & 3 deletions app/src/main/cpp/Pointer.cpp
Expand Up @@ -127,10 +127,10 @@ Pointer::Load(const DeviceDelegatePtr& aDevice) {
m.layer = layer;
const float size = kOuterRadius * 2.0f;
layer->SetWorldSize(size, size);
layer->SetInitializeDelegate([](const VRLayer& aLayer) {
layer->SetSurfaceChangedDelegate([](const VRLayer& aLayer, VRLayer::SurfaceChange aChange, const std::function<void()>& aCallback) {
const VRLayerQuad& quad = static_cast<const VRLayerQuad&>(aLayer);
if (quad.IsInitialized()) {
VRBrowser::RenderPointerLayer(quad.GetSurface());
if (aChange == VRLayer::SurfaceChange::Create) {
VRBrowser::RenderPointerLayer(quad.GetSurface(), aCallback);
}
});
vrb::CreationContextPtr create = m.context.lock();
Expand Down
5 changes: 4 additions & 1 deletion app/src/main/cpp/Skybox.cpp
Expand Up @@ -59,9 +59,12 @@ struct Skybox::State {
transform = vrb::Transform::Create(create);
if (layer) {
root->AddNode(VRLayerNode::Create(create, layer));
layer->SetInitializeDelegate([=](const VRLayer& aLayer) {
layer->SetSurfaceChangedDelegate([=](const VRLayer& aLayer, VRLayer::SurfaceChange aChange, const std::function<void()>& aCallback) {
this->layerTextureHandle = layer->GetTextureHandle();
LoadLayer();
if (aCallback) {
aCallback();
}
});
} else {
root->AddNode(transform);
Expand Down
7 changes: 5 additions & 2 deletions app/src/main/cpp/SplashAnimation.cpp
Expand Up @@ -97,10 +97,13 @@ SplashAnimation::Load(vrb::RenderContextPtr& aContext, const DeviceDelegatePtr&
if (!m.read->IsValid()) {
VRB_WARN("Splash FBO is not valid");
}
m.layer->SetInitializeDelegate([=](const VRLayer& aLayer){
if (aLayer.IsInitialized()) {
m.layer->SetSurfaceChangedDelegate([=](const VRLayer& aLayer, VRLayer::SurfaceChange aChange, const std::function<void()>& aCallback){
if (aChange == VRLayer::SurfaceChange::Create) {
m.HandleLayerInitialized(texture);
}
if (aCallback) {
aCallback();
}
});
}
m.logo = Quad::Create(create, w, w / aspect, m.layer);
Expand Down
20 changes: 14 additions & 6 deletions app/src/main/cpp/VRBrowser.cpp
Expand Up @@ -13,7 +13,7 @@ namespace {
static const char* kDispatchCreateWidgetName = "dispatchCreateWidget";
static const char* kDispatchCreateWidgetSignature = "(ILandroid/graphics/SurfaceTexture;II)V";
static const char* kDispatchCreateWidgetLayerName = "dispatchCreateWidgetLayer";
static const char* kDispatchCreateWidgetLayerSignature = "(ILandroid/view/Surface;II)V";
static const char* kDispatchCreateWidgetLayerSignature = "(ILandroid/view/Surface;IIJ)V";
static const char* kHandleMotionEventName = "handleMotionEvent";
static const char* kHandleMotionEventSignature = "(IIZFF)V";
static const char* kHandleScrollEventName = "handleScrollEvent";
Expand All @@ -33,7 +33,7 @@ static const char* kPauseCompositorSignature = "()V";
static const char* kResumeCompositorName = "resumeGeckoViewCompositor";
static const char* kResumeCompositorSignature = "()V";
static const char* kRenderPointerLayerName = "renderPointerLayer";
static const char* kRenderPointerLayerSignature = "(Landroid/view/Surface;)V";
static const char* kRenderPointerLayerSignature = "(Landroid/view/Surface;J)V";
static const char* kGetStorageAbsolutePathName = "getStorageAbsolutePath";
static const char* kGetStorageAbsolutePathSignature = "()Ljava/lang/String;";
static const char* kIsOverrideEnvPathEnabledName = "isOverrideEnvPathEnabled";
Expand Down Expand Up @@ -136,9 +136,13 @@ VRBrowser::DispatchCreateWidget(jint aWidgetHandle, jobject aSurface, jint aWidt


void
VRBrowser::DispatchCreateWidgetLayer(jint aWidgetHandle, jobject aSurface, jint aWidth, jint aHeight) {
VRBrowser::DispatchCreateWidgetLayer(jint aWidgetHandle, jobject aSurface, jint aWidth, jint aHeight, const std::function<void()>& aFirstCompositeCallback) {
if (!ValidateMethodID(sEnv, sActivity, sDispatchCreateWidgetLayer, __FUNCTION__)) { return; }
sEnv->CallVoidMethod(sActivity, sDispatchCreateWidgetLayer, aWidgetHandle, aSurface, aWidth, aHeight);
jlong callback = 0;
if (aFirstCompositeCallback) {
callback = reinterpret_cast<jlong>(new std::function<void()>(aFirstCompositeCallback));
}
sEnv->CallVoidMethod(sActivity, sDispatchCreateWidgetLayer, aWidgetHandle, aSurface, aWidth, aHeight, callback);
CheckJNIException(sEnv, __FUNCTION__);
}

Expand Down Expand Up @@ -207,9 +211,13 @@ VRBrowser::ResumeCompositor() {
}

void
VRBrowser::RenderPointerLayer(jobject aSurface) {
VRBrowser::RenderPointerLayer(jobject aSurface, const std::function<void()>& aFirstCompositeCallback) {
if (!ValidateMethodID(sEnv, sActivity, sRenderPointerLayer, __FUNCTION__)) { return; }
sEnv->CallVoidMethod(sActivity, sRenderPointerLayer, aSurface);
jlong callback = 0;
if (aFirstCompositeCallback) {
callback = reinterpret_cast<jlong>(new std::function<void()>(aFirstCompositeCallback));
}
sEnv->CallVoidMethod(sActivity, sRenderPointerLayer, aSurface, callback);
CheckJNIException(sEnv, __FUNCTION__);
}

Expand Down
4 changes: 2 additions & 2 deletions app/src/main/cpp/VRBrowser.h
Expand Up @@ -18,7 +18,7 @@ namespace VRBrowser {
void InitializeJava(JNIEnv* aEnv, jobject aActivity);
void ShutdownJava();
void DispatchCreateWidget(jint aWidgetHandle, jobject aSurfaceTexture, jint aWidth, jint aHeight);
void DispatchCreateWidgetLayer(jint aWidgetHandle, jobject aSurface, jint aWidth, jint aHeight);
void DispatchCreateWidgetLayer(jint aWidgetHandle, jobject aSurface, jint aWidth, jint aHeight, const std::function<void()>& aFirstCompositeCallback);
void HandleMotionEvent(jint aWidgetHandle, jint aController, jboolean aPressed, jfloat aX, jfloat aY);
void HandleScrollEvent(jint aWidgetHandle, jint aController, jfloat aX, jfloat aY);
void HandleAudioPose(jfloat qx, jfloat qy, jfloat qz, jfloat qw, jfloat px, jfloat py, jfloat pz);
Expand All @@ -28,7 +28,7 @@ void HandleBack();
void RegisterExternalContext(jlong aContext);
void PauseCompositor();
void ResumeCompositor();
void RenderPointerLayer(jobject aSurface);
void RenderPointerLayer(jobject aSurface, const std::function<void()>& aFirstCompositeCallback);
std::string GetStorageAbsolutePath(const std::string& aRelativePath);
bool isOverrideEnvPathEnabled();
std::string GetActiveEnvironment();
Expand Down
30 changes: 18 additions & 12 deletions app/src/main/cpp/VRLayer.cpp
Expand Up @@ -24,7 +24,8 @@ struct VRLayer::State {
device::Eye currentEye;
vrb::Color tintColor;
device::EyeRect textureRect[2];
InitializeDelegate initDelegate;
SurfaceChangedDelegate surfaceChangedDelegate;
std::function<void()> pendingEvent;
State():
initialized(false),
priority(0),
Expand Down Expand Up @@ -112,13 +113,7 @@ VRLayer::ShouldDrawBefore(const VRLayer& aLayer) {

void
VRLayer::SetInitialized(bool aInitialized) {
if (m.initialized != aInitialized) {
m.initialized = aInitialized;
if (m.initDelegate) {
m.initDelegate(*this);
}
}

m.initialized = aInitialized;
}

void
Expand Down Expand Up @@ -169,10 +164,11 @@ VRLayer::SetTextureRect(device::Eye aEye, const crow::device::EyeRect &aTextureR
}

void
VRLayer::SetInitializeDelegate(const VRLayer::InitializeDelegate& aDelegate) {
m.initDelegate = aDelegate;
if (m.initialized && m.initDelegate) {
m.initDelegate(*this);
VRLayer::SetSurfaceChangedDelegate(const crow::VRLayer::SurfaceChangedDelegate &aDelegate){
m.surfaceChangedDelegate = aDelegate;
if (m.pendingEvent && m.surfaceChangedDelegate) {
m.pendingEvent();
m.pendingEvent = nullptr;
}
}

Expand All @@ -181,6 +177,16 @@ VRLayer::SetDrawInFront(bool aDrawInFront) {
m.drawInFront = aDrawInFront;
}

void VRLayer::NotifySurfaceChanged(SurfaceChange aChange, const std::function<void()>& aFirstCompositeCallback) {
if (m.surfaceChangedDelegate) {
m.surfaceChangedDelegate(*this, aChange, aFirstCompositeCallback);
} else {
m.pendingEvent = [=](){
NotifySurfaceChanged(aChange, aFirstCompositeCallback);
};
}
}

// Layer Quad

struct VRLayerQuad::State: public VRLayer::State {
Expand Down
12 changes: 9 additions & 3 deletions app/src/main/cpp/VRLayer.h
Expand Up @@ -29,7 +29,13 @@ class VRLayer {
EQUIRECTANGULAR
};

typedef std::function<void(const VRLayer& aLayer)> InitializeDelegate;
enum class SurfaceChange {
Create,
Destroy
};
typedef std::function<void(const VRLayer& aLayer,
SurfaceChange aChange,
const std::function<void()>& aFirstCompositeCallback)> SurfaceChangedDelegate;

VRLayer::LayerType GetLayerType() const;
bool IsInitialized() const;
Expand All @@ -52,8 +58,9 @@ class VRLayer {
void SetPriority(int32_t aPriority);
void SetTintColor(const vrb::Color& aTintColor);
void SetTextureRect(device::Eye aEye, const device::EyeRect& aTextureRect);
void SetInitializeDelegate(const InitializeDelegate& aDelegate);
void SetSurfaceChangedDelegate(const SurfaceChangedDelegate& aDelegate);
void SetDrawInFront(bool aDrawInFront);
void NotifySurfaceChanged(SurfaceChange aChange, const std::function<void()>& aFirstCompositeCallback);
protected:
struct State;
VRLayer(State& aState, LayerType aLayerType);
Expand Down Expand Up @@ -117,7 +124,6 @@ class VRLayerCube: public VRLayer {
GLuint GetTextureHandle() const;
bool IsLoaded() const;


void SetTextureHandle(uint32_t aTextureHandle);
void SetLoaded(bool aReady);
protected:
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/cpp/Widget.cpp
Expand Up @@ -55,9 +55,9 @@ struct Widget::State {
}
layer = aLayer;
if (layer) {
layer->SetInitializeDelegate([=](const VRLayer& aLayer) {
layer->SetSurfaceChangedDelegate([=](const VRLayer& aLayer, VRLayer::SurfaceChange aChange, const std::function<void()>& aCallback) {
const VRLayerQuad& layerQuad = static_cast<const VRLayerQuad&>(aLayer);
VRBrowser::DispatchCreateWidgetLayer((jint)aHandle, layerQuad.GetSurface(), layerQuad.GetWidth(), layerQuad.GetHeight());
VRBrowser::DispatchCreateWidgetLayer((jint)aHandle, layerQuad.GetSurface(), layerQuad.GetWidth(), layerQuad.GetHeight(), aCallback);
});
} else {
surface = vrb::TextureSurface::Create(render, name);
Expand Down

0 comments on commit 7ce45a2

Please sign in to comment.