Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit 0026ebd

Browse files
committed
Using Surface from swap chains to render immersive frames instead of framebuffer textures.
1 parent 76affca commit 0026ebd

File tree

11 files changed

+143
-21
lines changed

11 files changed

+143
-21
lines changed

app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -949,6 +949,17 @@ public void dismiss() {
949949
});
950950
}
951951

952+
public void setExternalVRSurface(int aIndex, Surface aSurface) {
953+
if (aSurface == null) {
954+
Log.e(LOGTAG, "aSurface is null in setExternalVRSurface...");
955+
}
956+
GeckoVRManager.insertExternalSurface(aIndex, aSurface);
957+
}
958+
959+
public void releaseExternalVRSurfaces() {
960+
GeckoVRManager.releaseExternalSurfaces();
961+
}
962+
952963
void createOffscreenDisplay() {
953964
int[] ids = new int[1];
954965
GLES20.glGenTextures(1, ids, 0);

app/src/common/shared/org/mozilla/vrbrowser/browser/engine/SessionUtils.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.mozilla.gecko.GeckoProfile;
1111
import org.mozilla.vrbrowser.BuildConfig;
1212
import org.mozilla.vrbrowser.browser.SettingsStore;
13+
import org.mozilla.vrbrowser.utils.DeviceType;
1314

1415
import java.io.File;
1516
import java.io.FileNotFoundException;
@@ -55,6 +56,12 @@ public static void vrPrefsWorkAround(Context aContext, Bundle aExtras) {
5556
out.write("pref(\"media.autoplay.enabled.ask-permission\", false);\n".getBytes());
5657
out.write("pref(\"media.autoplay.default\", 0);\n".getBytes());
5758
}
59+
// In Oculus platform, we can render WebGL immersive frames info AndroidSurface.
60+
if (DeviceType.isOculusBuild()) {
61+
out.write("pref(\"webgl.enable-externalvr-surface\", true);\n".getBytes());
62+
} else {
63+
out.write("pref(\"webgl.enable-externalvr-surface\", false);\n".getBytes());
64+
}
5865
} catch (FileNotFoundException e) {
5966
Log.e(LOGTAG, "Unable to create file: '" + prefFileName + "' got exception: " + e.toString());
6067
} catch (IOException e) {

app/src/main/cpp/BrowserWorld.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,6 +1177,7 @@ void
11771177
BrowserWorld::DrawWorld() {
11781178
m.externalVR->SetCompositorEnabled(true);
11791179
m.device->SetRenderMode(device::RenderMode::StandAlone);
1180+
m.device->EnableExternalSurfaceRender(false);
11801181
if (m.fadeAnimation) {
11811182
m.fadeAnimation->UpdateAnimation();
11821183
}
@@ -1244,23 +1245,29 @@ BrowserWorld::DrawImmersive() {
12441245
m.device->StartFrame();
12451246
VRB_GL_CHECK(glDepthMask(GL_FALSE));
12461247
m.externalVR->PushFramePoses(m.device->GetHeadTransform(), m.controllers->GetControllers(), m.context->GetTimestamp());
1248+
mozilla::gfx::VRLayerTextureType surfaceType;
12471249
int32_t surfaceHandle, textureWidth, textureHeight = 0;
12481250
device::EyeRect leftEye, rightEye;
12491251
bool aDiscardFrame = !m.externalVR->WaitFrameResult();
1250-
m.externalVR->GetFrameResult(surfaceHandle, textureWidth, textureHeight, leftEye, rightEye);
1252+
m.externalVR->GetFrameResult(surfaceType, surfaceHandle, textureWidth, textureHeight, leftEye, rightEye);
12511253
ExternalVR::VRState state = m.externalVR->GetVRState();
12521254
if (state == ExternalVR::VRState::Rendering) {
12531255
if (!aDiscardFrame) {
12541256
if (textureWidth > 0 && textureHeight > 0) {
12551257
m.device->SetImmersiveSize((uint32_t) textureWidth/2, (uint32_t) textureHeight);
12561258
}
1257-
m.blitter->StartFrame(surfaceHandle, leftEye, rightEye);
1258-
m.device->BindEye(device::Eye::Left);
1259-
m.blitter->Draw(device::Eye::Left);
1259+
m.device->EnableExternalSurfaceRender(surfaceType ==
1260+
mozilla::gfx::VRLayerTextureType::LayerTextureType_ExternalVRSurface);
1261+
// In Oculus platform, we can render WebGL immersive frames info AndroidSurface.
1262+
if (surfaceType != mozilla::gfx::VRLayerTextureType::LayerTextureType_ExternalVRSurface) {
1263+
m.blitter->StartFrame(surfaceHandle, leftEye, rightEye);
1264+
m.device->BindEye(device::Eye::Left);
1265+
m.blitter->Draw(device::Eye::Left);
12601266
#if !defined(VRBROWSER_NO_VR_API)
1261-
m.device->BindEye(device::Eye::Right);
1262-
m.blitter->Draw(device::Eye::Right);
1267+
m.device->BindEye(device::Eye::Right);
1268+
m.blitter->Draw(device::Eye::Right);
12631269
#endif // !defined(VRBROWSER_NO_VR_API)
1270+
}
12641271
}
12651272
m.device->EndFrame(aDiscardFrame);
12661273
m.blitter->EndFrame();

app/src/main/cpp/DeviceDelegate.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class ImmersiveDisplay {
3737
const double aRightDegrees,
3838
const double aTopDegrees,
3939
const double aBottomDegrees) = 0;
40+
virtual void SetExternalSurfaceInfo(int32_t aExternalSurfLen, int32_t aExternalSurfId) = 0;
4041
virtual void SetEyeOffset(const device::Eye aEye, const float aX, const float aY, const float aZ) = 0;
4142
virtual void SetEyeResolution(const int32_t aWidth, const int32_t aHeight) = 0;
4243
virtual void SetSittingToStandingTransform(const vrb::Matrix& aTransform) = 0;
@@ -67,6 +68,7 @@ class DeviceDelegate {
6768
virtual void StartFrame() = 0;
6869
virtual void BindEye(const device::Eye aWhich) = 0;
6970
virtual void EndFrame(bool aDiscard = false) = 0;
71+
virtual void EnableExternalSurfaceRender(bool aEnable) {}
7072
virtual VRLayerQuadPtr CreateLayerQuad(int32_t aWidth, int32_t aHeight,
7173
VRLayerSurface::SurfaceType aSurfaceType) { return nullptr; }
7274
virtual VRLayerQuadPtr CreateLayerQuad(const VRLayerSurfacePtr& aMoveLayer) { return nullptr; }

app/src/main/cpp/ExternalVR.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,12 @@ ExternalVR::SetCapabilityFlags(const device::CapabilityFlags aFlags) {
259259
m.system.sensorState.flags = m.system.displayState.capabilityFlags;
260260
}
261261

262+
void
263+
ExternalVR::SetExternalSurfaceInfo(int32_t aExternalSurfLen, int32_t aExternalSurfId) {
264+
m.system.displayState.externalSurfaceLength = aExternalSurfLen;
265+
m.system.displayState.externalSurfaceId = aExternalSurfId;
266+
}
267+
262268
void
263269
ExternalVR::SetFieldOfView(const device::Eye aEye, const double aLeftDegrees,
264270
const double aRightDegrees,
@@ -476,10 +482,10 @@ ExternalVR::CompleteEnumeration()
476482
m.system.enumerationCompleted = true;
477483
}
478484

479-
480485
void
481-
ExternalVR::GetFrameResult(int32_t& aSurfaceHandle, int32_t& aTextureWidth, int32_t& aTextureHeight,
486+
ExternalVR::GetFrameResult(mozilla::gfx::VRLayerTextureType& aSurfaceType, int32_t& aSurfaceHandle, int32_t& aTextureWidth, int32_t& aTextureHeight,
482487
device::EyeRect& aLeftEye, device::EyeRect& aRightEye) const {
488+
aSurfaceType = m.browser.layerState[0].layer_stereo_immersive.textureType;
483489
aSurfaceHandle = (int32_t)m.browser.layerState[0].layer_stereo_immersive.textureHandle;
484490
mozilla::gfx::VRLayerEyeRect& left = m.browser.layerState[0].layer_stereo_immersive.leftEyeRect;
485491
mozilla::gfx::VRLayerEyeRect& right = m.browser.layerState[0].layer_stereo_immersive.rightEyeRect;

app/src/main/cpp/ExternalVR.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "Controller.h"
1111
#include "DeviceDelegate.h"
1212
#include "Device.h"
13+
#include "moz_external_vr.h"
1314
#include <memory>
1415
#include <string>
1516
#include <vector>
@@ -38,6 +39,7 @@ class ExternalVR : public ImmersiveDisplay {
3839
// DeviceDisplay interface
3940
void SetDeviceName(const std::string& aName) override;
4041
void SetCapabilityFlags(const device::CapabilityFlags aFlags) override;
42+
void SetExternalSurfaceInfo(int32_t aExternalSurfLen, int32_t aExternalSurfId) override;
4143
void SetFieldOfView(const device::Eye aEye, const double aLeftDegrees,
4244
const double aRightDegrees,
4345
const double aTopDegrees,
@@ -54,7 +56,8 @@ class ExternalVR : public ImmersiveDisplay {
5456
VRState GetVRState() const;
5557
void PushFramePoses(const vrb::Matrix& aHeadTransform, const std::vector<Controller>& aControllers, const double aTimestamp);
5658
bool WaitFrameResult();
57-
void GetFrameResult(int32_t& aSurfaceHandle,
59+
void GetFrameResult(mozilla::gfx::VRLayerTextureType& aSurfaceType,
60+
int32_t& aSurfaceHandle,
5861
int32_t& aTextureWidth,
5962
int32_t& aTextureHeight,
6063
device::EyeRect& aLeftEye,

app/src/main/cpp/VRBrowser.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ const char* kHaltActivity = "haltActivity";
5252
const char* kHaltActivitySignature = "(I)V";
5353
const char* kHandlePoorPerformance = "handlePoorPerformance";
5454
const char* kHandlePoorPerformanceSignature = "()V";
55+
const char* kSetExternalVRSurface = "setExternalVRSurface";
56+
const char* kSetExternalVRSurfaceSignature = "(ILandroid/view/Surface;)V";
57+
const char* kReleaseExternalSurfaces = "releaseExternalVRSurfaces";
58+
const char* kReleaseExternalSurfacesSignature = "()V";
5559

5660
JNIEnv* sEnv = nullptr;
5761
jclass sBrowserClass = nullptr;
@@ -77,6 +81,8 @@ jmethodID sAreLayersEnabled = nullptr;
7781
jmethodID sSetDeviceType = nullptr;
7882
jmethodID sHaltActivity = nullptr;
7983
jmethodID sHandlePoorPerformance = nullptr;
84+
jmethodID sSetExternalVRSurface = nullptr;
85+
jmethodID sReleaseExternalSurfaces = nullptr;
8086
}
8187

8288
namespace crow {
@@ -117,6 +123,8 @@ VRBrowser::InitializeJava(JNIEnv* aEnv, jobject aActivity) {
117123
sSetDeviceType = FindJNIMethodID(sEnv, sBrowserClass, kSetDeviceType, kSetDeviceTypeSignature);
118124
sHaltActivity = FindJNIMethodID(sEnv, sBrowserClass, kHaltActivity, kHaltActivitySignature);
119125
sHandlePoorPerformance = FindJNIMethodID(sEnv, sBrowserClass, kHandlePoorPerformance, kHandlePoorPerformanceSignature);
126+
sSetExternalVRSurface = FindJNIMethodID(sEnv, sBrowserClass, kSetExternalVRSurface, kSetExternalVRSurfaceSignature);
127+
sReleaseExternalSurfaces = FindJNIMethodID(sEnv, sBrowserClass, kReleaseExternalSurfaces, kReleaseExternalSurfacesSignature);
120128
}
121129

122130
void
@@ -151,6 +159,7 @@ VRBrowser::ShutdownJava() {
151159
sAreLayersEnabled = nullptr;
152160
sSetDeviceType = nullptr;
153161
sHaltActivity = nullptr;
162+
sSetExternalVRSurface = nullptr;
154163
sEnv = nullptr;
155164
}
156165

@@ -339,4 +348,17 @@ VRBrowser::HandlePoorPerformance() {
339348
CheckJNIException(sEnv, __FUNCTION__);
340349
}
341350

351+
void
352+
VRBrowser::SetExternalVRSurface(jint aIndex, jobject aSurface) {
353+
if (!ValidateMethodID(sEnv, sActivity, sSetExternalVRSurface, __FUNCTION__)) { return; }
354+
sEnv->CallVoidMethod(sActivity, sSetExternalVRSurface, aIndex, aSurface);
355+
CheckJNIException(sEnv, __FUNCTION__);
356+
}
357+
358+
void
359+
VRBrowser::ReleaseExternalVRSurfaces() {
360+
if (!ValidateMethodID(sEnv, sActivity, sReleaseExternalSurfaces, __FUNCTION__)) { return; }
361+
sEnv->CallVoidMethod(sActivity, sReleaseExternalSurfaces);
362+
CheckJNIException(sEnv, __FUNCTION__);
363+
}
342364
} // namespace crow

app/src/main/cpp/VRBrowser.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ bool AreLayersEnabled();
3939
void SetDeviceType(const jint aType);
4040
void HaltActivity(const jint aReason);
4141
void HandlePoorPerformance();
42+
void SetExternalVRSurfaceLength(jint aLen);
43+
void SetExternalVRSurfaceId(jint aId);
44+
void SetExternalVRSurface(jint aIndex, jobject aSurface);
45+
void ReleaseExternalVRSurfaces();
4246
} // namespace VRBrowser;
4347

4448
} // namespace crow

app/src/main/cpp/moz_external_vr.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ enum class GamepadCapabilityFlags : uint16_t;
4040
#endif // MOZILLA_INTERNAL_API
4141
namespace gfx {
4242

43-
static const int32_t kVRExternalVersion = 9;
43+
static const int32_t kVRExternalVersion = 10;
4444

4545
// We assign VR presentations to groups with a bitmask.
4646
// Currently, we will only display either content or chrome.
@@ -308,6 +308,11 @@ struct VRDisplayState {
308308
uint64_t lastSubmittedFrameId;
309309
bool lastSubmittedFrameSuccessful;
310310
uint32_t presentingGeneration;
311+
#if defined(__ANDROID__)
312+
// external VR surface
313+
uint32_t externalSurfaceLength;
314+
uint32_t externalSurfaceId;
315+
#endif
311316
// Telemetry
312317
bool reportsDroppedFrames;
313318
uint64_t droppedFrameCount;
@@ -364,7 +369,8 @@ enum class VRLayerTextureType : uint16_t {
364369
LayerTextureType_None = 0,
365370
LayerTextureType_D3D10SurfaceDescriptor = 1,
366371
LayerTextureType_MacIOSurface = 2,
367-
LayerTextureType_GeckoSurfaceTexture = 3
372+
LayerTextureType_GeckoSurfaceTexture = 3,
373+
LayerTextureType_ExternalVRSurface = 4
368374
};
369375

370376
struct VRLayer_2D_Content {

app/src/oculusvr/cpp/DeviceDelegateOculusVR.cpp

Lines changed: 61 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,8 @@ const vrb::Vector kAverageHeight(0.0f, 1.7f, 0.0f);
617617
const vrb::Vector kAverageOculusHeight(0.0f, 1.65f, 0.0f);
618618

619619
struct DeviceDelegateOculusVR::State {
620+
const static uint32_t EXTERNAL_SURFACE_BUFFER_SIZE = 2;
621+
620622
struct ControllerState {
621623
const int32_t index;
622624
const ElbowModel::HandEnum hand;
@@ -645,6 +647,7 @@ struct DeviceDelegateOculusVR::State {
645647
ovrJava java = {};
646648
ovrMobile* ovr = nullptr;
647649
OculusEyeSwapChainPtr eyeSwapChains[VRAPI_EYE_COUNT];
650+
ovrTextureSwapChain* eyeSurfaceSwapChain[EXTERNAL_SURFACE_BUFFER_SIZE];
648651
OculusLayerCubePtr cubeLayer;
649652
OculusLayerEquirectPtr equirectLayer;
650653
std::vector<OculusLayerPtr> uiLayers;
@@ -707,6 +710,9 @@ struct DeviceDelegateOculusVR::State {
707710
exit(status);
708711
return;
709712
}
713+
for (int i = 0; i < EXTERNAL_SURFACE_BUFFER_SIZE; ++i) {
714+
eyeSurfaceSwapChain[i] = nullptr;
715+
}
710716
initialized = true;
711717
SetRenderSize(device::RenderMode::StandAlone);
712718

@@ -1128,6 +1134,19 @@ DeviceDelegateOculusVR::SetRenderMode(const device::RenderMode aMode) {
11281134
m.eyeSwapChains[i]->Init(render, m.renderMode, m.renderWidth, m.renderHeight);
11291135
}
11301136

1137+
if (aMode == device::RenderMode::Immersive) {
1138+
uint32_t width, height;
1139+
m.GetImmersiveRenderSize(width, height);
1140+
for (int i = 0; i < DeviceDelegateOculusVR::State::EXTERNAL_SURFACE_BUFFER_SIZE; ++i) {
1141+
if (!m.eyeSurfaceSwapChain[i]) {
1142+
m.eyeSurfaceSwapChain[i] = vrapi_CreateAndroidSurfaceSwapChain(width, height);
1143+
auto surfaceOut = vrapi_GetTextureSwapChainAndroidSurface(m.eyeSurfaceSwapChain[i]);
1144+
surfaceOut = m.java.Env->NewGlobalRef(surfaceOut);
1145+
VRBrowser::SetExternalVRSurface(i, surfaceOut);
1146+
}
1147+
}
1148+
}
1149+
11311150
m.UpdateTrackingMode();
11321151
m.UpdateFoveatedLevel();
11331152
m.UpdateDisplayRefreshRate();
@@ -1340,8 +1359,6 @@ DeviceDelegateOculusVR::StartFrame() {
13401359
ovrMatrix4f matrix = vrapi_GetTransformFromPose(&m.predictedTracking.HeadPose.Pose);
13411360
vrb::Matrix head = vrb::Matrix::FromRowMajor(matrix.M[0]);
13421361

1343-
1344-
13451362
if (m.renderMode == device::RenderMode::StandAlone) {
13461363
head.TranslateInPlace(kAverageHeight);
13471364
}
@@ -1359,6 +1376,7 @@ DeviceDelegateOculusVR::StartFrame() {
13591376
caps |= device::PositionEmulated;
13601377
}
13611378
m.immersiveDisplay->SetCapabilityFlags(caps);
1379+
m.immersiveDisplay->SetExternalSurfaceInfo(State::EXTERNAL_SURFACE_BUFFER_SIZE, externalSurfaceId);
13621380
}
13631381

13641382
int lastReorientCount = m.reorientCount;
@@ -1458,13 +1476,33 @@ DeviceDelegateOculusVR::EndFrame(const bool aDiscard) {
14581476
projection.HeadPose = m.predictedTracking.HeadPose;
14591477
projection.Header.SrcBlend = VRAPI_FRAME_LAYER_BLEND_ONE;
14601478
projection.Header.DstBlend = VRAPI_FRAME_LAYER_BLEND_ONE_MINUS_SRC_ALPHA;
1461-
for (int i = 0; i < VRAPI_FRAME_LAYER_EYE_MAX; ++i) {
1462-
const auto &eyeSwapChain = m.eyeSwapChains[i];
1463-
const int swapChainIndex = m.frameIndex % eyeSwapChain->swapChainLength;
1464-
// Set up OVR layer textures
1465-
projection.Textures[i].ColorSwapChain = eyeSwapChain->ovrSwapChain;
1466-
projection.Textures[i].SwapChainIndex = swapChainIndex;
1467-
projection.Textures[i].TexCoordsFromTanAngles = ovrMatrix4f_TanAngleMatrixFromProjection(&projectionMatrix);
1479+
1480+
if (!enableExternalSurfaceRender) {
1481+
for (int i = 0; i < VRAPI_FRAME_LAYER_EYE_MAX; ++i) {
1482+
const auto &eyeSwapChain = m.eyeSwapChains[i];
1483+
const int swapChainIndex = m.frameIndex % eyeSwapChain->swapChainLength;
1484+
// Set up OVR layer textures
1485+
projection.Textures[i].ColorSwapChain = eyeSwapChain->ovrSwapChain;
1486+
projection.Textures[i].SwapChainIndex = swapChainIndex;
1487+
projection.Textures[i].TexCoordsFromTanAngles = ovrMatrix4f_TanAngleMatrixFromProjection(&projectionMatrix);
1488+
}
1489+
} else {
1490+
const int swapChainIndex = externalSurfaceId;
1491+
ovrMatrix4f proj(projectionMatrix);
1492+
// Flip texCoord in vertical when using WebGL frame textures.
1493+
proj.M[1][1] *= -1;
1494+
proj = ovrMatrix4f_TanAngleMatrixFromProjection(&proj);
1495+
1496+
for (int i = 0; i < VRAPI_FRAME_LAYER_EYE_MAX; ++i) {
1497+
const auto eyeSwapChain = m.eyeSurfaceSwapChain[swapChainIndex];
1498+
// Set up OVR layer textures
1499+
projection.Textures[i].ColorSwapChain = eyeSwapChain;
1500+
projection.Textures[i].SwapChainIndex = 0;
1501+
projection.Textures[i].TexCoordsFromTanAngles = proj;
1502+
}
1503+
1504+
// Switch to the next surface.
1505+
externalSurfaceId = (++externalSurfaceId) % State::EXTERNAL_SURFACE_BUFFER_SIZE;
14681506
}
14691507
layers[layerCount++] = &projection.Header;
14701508

@@ -1494,6 +1532,11 @@ DeviceDelegateOculusVR::EndFrame(const bool aDiscard) {
14941532
vrapi_SubmitFrame2(m.ovr, &frameDesc);
14951533
}
14961534

1535+
void
1536+
DeviceDelegateOculusVR::EnableExternalSurfaceRender(bool aEnable) {
1537+
enableExternalSurfaceRender = aEnable;
1538+
}
1539+
14971540
VRLayerQuadPtr
14981541
DeviceDelegateOculusVR::CreateLayerQuad(int32_t aWidth, int32_t aHeight,
14991542
VRLayerSurface::SurfaceType aSurfaceType) {
@@ -1671,6 +1714,13 @@ DeviceDelegateOculusVR::LeaveVR() {
16711714
for (int i = 0; i < VRAPI_EYE_COUNT; ++i) {
16721715
m.eyeSwapChains[i]->Destroy();
16731716
}
1717+
for (int i = 0; i < DeviceDelegateOculusVR::State::EXTERNAL_SURFACE_BUFFER_SIZE; ++i) {
1718+
if (m.eyeSurfaceSwapChain[i]) {
1719+
vrapi_DestroyTextureSwapChain(m.eyeSurfaceSwapChain[i]);
1720+
m.eyeSurfaceSwapChain[i] = nullptr;
1721+
VRBrowser::ReleaseExternalVRSurfaces();
1722+
}
1723+
}
16741724
if (m.cubeLayer) {
16751725
m.cubeLayer->Destroy();
16761726
}
@@ -1698,7 +1748,8 @@ DeviceDelegateOculusVR::ExitApp() {
16981748
return true;
16991749
}
17001750

1701-
DeviceDelegateOculusVR::DeviceDelegateOculusVR(State &aState) : m(aState) {}
1751+
DeviceDelegateOculusVR::DeviceDelegateOculusVR(State &aState) : m(aState),
1752+
externalSurfaceId(0), enableExternalSurfaceRender(false) {}
17021753

17031754
DeviceDelegateOculusVR::~DeviceDelegateOculusVR() { m.Shutdown(); }
17041755

0 commit comments

Comments
 (0)