diff --git a/README.md b/README.md
index 5d82bc0..13c5931 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,7 @@ products:
| Holographic Remoting version |
:-----------------: |
-|2.6.0 |
+|2.6.1 |
The [Holographic Remoting Samples](https://github.com/microsoft/MixedReality-HolographicRemoting-Samples) repository hosts sample applications for [Holographic Remoting](https://docs.microsoft.com/en-us/windows/mixed-reality/holographic-remoting-player). The two remote samples show how to write an application for streaming content to a Microsoft HoloLens 2 or a PC running Windows Mixed Reality.
diff --git a/player/sample/Package.appxmanifest b/player/sample/Package.appxmanifest
index f0c2e40..bbca59f 100644
--- a/player/sample/Package.appxmanifest
+++ b/player/sample/Package.appxmanifest
@@ -1,6 +1,6 @@
-
+
Sample Holographic AppRemoting Player
diff --git a/player/sample/SamplePlayer.vcxproj b/player/sample/SamplePlayer.vcxproj
index a0aa3ec..c558d00 100644
--- a/player/sample/SamplePlayer.vcxproj
+++ b/player/sample/SamplePlayer.vcxproj
@@ -342,6 +342,6 @@
-
+
\ No newline at end of file
diff --git a/player/sample/SamplePlayerMain.cpp b/player/sample/SamplePlayerMain.cpp
index e4f904b..53f47ad 100644
--- a/player/sample/SamplePlayerMain.cpp
+++ b/player/sample/SamplePlayerMain.cpp
@@ -424,14 +424,27 @@ void SamplePlayerMain::SetWindow(const CoreWindow& window)
#ifdef ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE
try
{
- m_playerContext.OnDataChannelCreated([this](const IDataChannel& dataChannel, uint8_t channelId) {
- std::lock_guard lock(m_customDataChannelLock);
- m_customDataChannel = dataChannel.as();
+ m_playerContext.OnDataChannelCreated([weakThis = get_weak()](const IDataChannel& dataChannel, uint8_t channelId) {
+ if (auto strongThis = weakThis.get())
+ {
+ std::lock_guard lock(strongThis->m_customDataChannelLock);
+ strongThis->m_customDataChannel = dataChannel.as();
- m_customChannelDataReceivedEventRevoker = m_customDataChannel.OnDataReceived(
- winrt::auto_revoke, [this](winrt::array_view dataView) { OnCustomDataChannelDataReceived(); });
+ strongThis->m_customChannelDataReceivedEventRevoker = strongThis->m_customDataChannel.OnDataReceived(
+ winrt::auto_revoke, [weakThis](winrt::array_view dataView) {
+ if (auto strongThis = weakThis.get())
+ {
+ strongThis->OnCustomDataChannelDataReceived();
+ }
+ });
- m_customChannelClosedEventRevoker = m_customDataChannel.OnClosed(winrt::auto_revoke, [this]() { OnCustomDataChannelClosed(); });
+ strongThis->m_customChannelClosedEventRevoker = strongThis->m_customDataChannel.OnClosed(winrt::auto_revoke, [weakThis]() {
+ if (auto strongThis = weakThis.get())
+ {
+ strongThis->OnCustomDataChannelClosed();
+ }
+ });
+ }
});
}
catch (winrt::hresult_error err)
diff --git a/player/sample/packages.config b/player/sample/packages.config
index 365b43b..5bc0eca 100644
--- a/player/sample/packages.config
+++ b/player/sample/packages.config
@@ -1,5 +1,5 @@
-
-
\ No newline at end of file
+
+
diff --git a/remote/desktop/Content/QRCodeRenderer.cpp b/remote/desktop/Content/QRCodeRenderer.cpp
index 18614a9..b5634fb 100644
--- a/remote/desktop/Content/QRCodeRenderer.cpp
+++ b/remote/desktop/Content/QRCodeRenderer.cpp
@@ -29,12 +29,6 @@ QRCodeRenderer::QRCodeRenderer(const std::shared_ptr&
{
}
-void QRCodeRenderer::OnAddedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code)
-{
- std::scoped_lock lock(m_mutex);
- m_qrCodes.insert({code, nullptr});
-}
-
void QRCodeRenderer::OnUpdatedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code)
{
std::scoped_lock lock(m_mutex);
diff --git a/remote/desktop/Content/QRCodeRenderer.h b/remote/desktop/Content/QRCodeRenderer.h
index 42cfa57..5d48d56 100644
--- a/remote/desktop/Content/QRCodeRenderer.h
+++ b/remote/desktop/Content/QRCodeRenderer.h
@@ -32,8 +32,6 @@ public:
void Update(winrt::Windows::Perception::Spatial::SpatialCoordinateSystem renderingCoordinateSystem);
- void OnAddedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code);
-
void OnUpdatedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code);
void Reset();
diff --git a/remote/desktop/Package.appxmanifest b/remote/desktop/Package.appxmanifest
index 2e7f902..600b201 100644
--- a/remote/desktop/Package.appxmanifest
+++ b/remote/desktop/Package.appxmanifest
@@ -1,6 +1,6 @@
-
+
-
+
SampleRemote
diff --git a/remote/desktop/SampleRemote.vcxproj b/remote/desktop/SampleRemote.vcxproj
index 0c31729..6e2a64c 100644
--- a/remote/desktop/SampleRemote.vcxproj
+++ b/remote/desktop/SampleRemote.vcxproj
@@ -332,6 +332,6 @@
-
+
\ No newline at end of file
diff --git a/remote/desktop/SampleRemoteApp.cpp b/remote/desktop/SampleRemoteApp.cpp
index 716da10..4707630 100644
--- a/remote/desktop/SampleRemoteApp.cpp
+++ b/remote/desktop/SampleRemoteApp.cpp
@@ -159,7 +159,15 @@ void SampleRemoteApp::OnResize(int width, int height)
if (m_swapChain)
{
- winrt::check_hresult(m_swapChain->ResizeBuffers(2, m_width, m_height, DXGI_FORMAT_B8G8R8A8_UNORM, 0));
+ winrt::hresult hr = m_swapChain->ResizeBuffers(2, m_width, m_height, DXGI_FORMAT_B8G8R8A8_UNORM, 0);
+ if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)
+ {
+ m_swapChain = nullptr;
+ }
+ else
+ {
+ winrt::check_hresult(hr);
+ }
}
}
}
@@ -573,16 +581,15 @@ void SampleRemoteApp::Render(HolographicFrame holographicFrame)
// * Holographic streamer
// * Renderer
// * Holographic space
- // The InitializeRemoteContext() function will call the functions necessary to recreate these resources.
+ // Call the InitializeRemoteContextAndConnectOrListen() function will call the functions necessary to recreate these resources.
ShutdownRemoteContext();
- InitializeRemoteContextAndConnectOrListen();
}
// Determine whether or not to copy to the preview buffer.
bool copyPreview;
{
std::lock_guard remoteContextLock(m_remoteContextAccess);
- copyPreview = m_remoteContext == nullptr || m_remoteContext.ConnectionState() != ConnectionState::Connected;
+ copyPreview = m_swapChain && (m_remoteContext == nullptr || m_remoteContext.ConnectionState() != ConnectionState::Connected);
}
if (copyPreview && m_isInitialized)
{
@@ -710,16 +717,29 @@ void SampleRemoteApp::InitializeRemoteContextAndConnectOrListen()
});
#ifdef ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE
- m_onDataChannelCreatedEventRevoker =
- m_remoteContext.OnDataChannelCreated(winrt::auto_revoke, [this](const IDataChannel& dataChannel, uint8_t channelId) {
- std::lock_guard lock(m_customDataChannelLock);
- m_customDataChannel = dataChannel.as();
+ m_onDataChannelCreatedEventRevoker = m_remoteContext.OnDataChannelCreated(
+ winrt::auto_revoke, [weakThis = weak_from_this()](const IDataChannel& dataChannel, uint8_t channelId) {
+ if (auto strongThis = weakThis.lock())
+ {
+ std::lock_guard lock(strongThis->m_customDataChannelLock);
+ strongThis->m_customDataChannel = dataChannel.as();
- m_customChannelDataReceivedEventRevoker = m_customDataChannel.OnDataReceived(
- winrt::auto_revoke, [this](winrt::array_view dataView) { OnCustomDataChannelDataReceived(dataView); });
+ strongThis->m_customChannelDataReceivedEventRevoker = strongThis->m_customDataChannel.OnDataReceived(
+ winrt::auto_revoke, [weakThis](winrt::array_view dataView) {
+ if (auto strongThis = weakThis.lock())
+ {
+ strongThis->OnCustomDataChannelDataReceived(dataView);
+ }
+ });
- m_customChannelClosedEventRevoker =
- m_customDataChannel.OnClosed(winrt::auto_revoke, [this]() { OnCustomDataChannelClosed(); });
+ strongThis->m_customChannelClosedEventRevoker =
+ strongThis->m_customDataChannel.OnClosed(winrt::auto_revoke, [weakThis]() {
+ if (auto strongThis = weakThis.lock())
+ {
+ strongThis->OnCustomDataChannelClosed();
+ }
+ });
+ }
});
#endif
@@ -866,23 +886,26 @@ void SampleRemoteApp::SavePosition()
auto position = SpatialAnchor::TryCreateRelativeTo(m_referenceFrame.CoordinateSystem(), m_spinningCubeRenderer->GetPosition());
- auto storeRequest = SpatialAnchorManager::RequestStoreAsync();
- storeRequest.Completed([position](winrt::Windows::Foundation::IAsyncOperation result, auto asyncStatus) {
- if (result.Status() != winrt::Windows::Foundation::AsyncStatus::Completed)
- {
- return;
- }
-
- const SpatialAnchorStore& store = result.GetResults();
- if (store)
- {
- store.Clear();
- if (store.TrySave(L"position", position))
+ if (position)
+ {
+ auto storeRequest = SpatialAnchorManager::RequestStoreAsync();
+ storeRequest.Completed([position](winrt::Windows::Foundation::IAsyncOperation result, auto asyncStatus) {
+ if (result.Status() != winrt::Windows::Foundation::AsyncStatus::Completed)
{
- OutputDebugStringW(L"Saved cube position to SpatialAnchorStore.\n");
+ return;
}
- }
- });
+
+ const SpatialAnchorStore& store = result.GetResults();
+ if (store)
+ {
+ store.Clear();
+ if (store.TrySave(L"position", position))
+ {
+ OutputDebugStringW(L"Saved cube position to SpatialAnchorStore.\n");
+ }
+ }
+ });
+ }
}
winrt::fire_and_forget SampleRemoteApp::ExportPosition()
@@ -1087,17 +1110,6 @@ winrt::fire_and_forget SampleRemoteApp::RequestQRCodeWatcherUpdates()
m_qrWatcher = QRCodeWatcher();
- m_qrAddedRevoker = m_qrWatcher.Added(
- winrt::auto_revoke,
- [&, weakThis = weak_from_this()](
- const winrt::Microsoft::MixedReality::QR::QRCodeWatcher&,
- const winrt::Microsoft::MixedReality::QR::QRCodeAddedEventArgs& args) {
- if (auto strongThis = weakThis.lock())
- {
- m_qrCodeRenderer->OnAddedQRCode(args.Code());
- }
- });
-
m_qrUpdatedRevoker = m_qrWatcher.Updated(
winrt::auto_revoke,
[&, weakThis = weak_from_this()](
@@ -1290,8 +1302,15 @@ void SampleRemoteApp::OnDisconnected(winrt::Microsoft::Holographic::AppRemoting:
m_hasSceneObserverAccess = false;
- m_sceneUnderstandingRenderer->Reset();
- m_qrCodeRenderer->Reset();
+ if (m_sceneUnderstandingRenderer)
+ {
+ m_sceneUnderstandingRenderer->Reset();
+ }
+
+ if (m_qrCodeRenderer)
+ {
+ m_qrCodeRenderer->Reset();
+ }
}
void SampleRemoteApp::OnSendFrame(const winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DSurface& texture)
diff --git a/remote/desktop/packages.config b/remote/desktop/packages.config
index 33d8345..d362109 100644
--- a/remote/desktop/packages.config
+++ b/remote/desktop/packages.config
@@ -1,8 +1,8 @@
-
+
-
\ No newline at end of file
+
diff --git a/remote/uwp/Content/QRCodeRenderer.cpp b/remote/uwp/Content/QRCodeRenderer.cpp
index 18614a9..b5634fb 100644
--- a/remote/uwp/Content/QRCodeRenderer.cpp
+++ b/remote/uwp/Content/QRCodeRenderer.cpp
@@ -29,12 +29,6 @@ QRCodeRenderer::QRCodeRenderer(const std::shared_ptr&
{
}
-void QRCodeRenderer::OnAddedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code)
-{
- std::scoped_lock lock(m_mutex);
- m_qrCodes.insert({code, nullptr});
-}
-
void QRCodeRenderer::OnUpdatedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code)
{
std::scoped_lock lock(m_mutex);
diff --git a/remote/uwp/Content/QRCodeRenderer.h b/remote/uwp/Content/QRCodeRenderer.h
index 42cfa57..5d48d56 100644
--- a/remote/uwp/Content/QRCodeRenderer.h
+++ b/remote/uwp/Content/QRCodeRenderer.h
@@ -32,8 +32,6 @@ public:
void Update(winrt::Windows::Perception::Spatial::SpatialCoordinateSystem renderingCoordinateSystem);
- void OnAddedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code);
-
void OnUpdatedQRCode(const winrt::Microsoft::MixedReality::QR::QRCode& code);
void Reset();
diff --git a/remote/uwp/Package.appxmanifest b/remote/uwp/Package.appxmanifest
index 2e7f902..600b201 100644
--- a/remote/uwp/Package.appxmanifest
+++ b/remote/uwp/Package.appxmanifest
@@ -1,6 +1,6 @@
-
+
-
+
SampleRemote
diff --git a/remote/uwp/SampleRemote.vcxproj b/remote/uwp/SampleRemote.vcxproj
index 647a4b3..81e3c9c 100644
--- a/remote/uwp/SampleRemote.vcxproj
+++ b/remote/uwp/SampleRemote.vcxproj
@@ -389,6 +389,6 @@
-
+
\ No newline at end of file
diff --git a/remote/uwp/SampleRemoteApp.cpp b/remote/uwp/SampleRemoteApp.cpp
index 716da10..4707630 100644
--- a/remote/uwp/SampleRemoteApp.cpp
+++ b/remote/uwp/SampleRemoteApp.cpp
@@ -159,7 +159,15 @@ void SampleRemoteApp::OnResize(int width, int height)
if (m_swapChain)
{
- winrt::check_hresult(m_swapChain->ResizeBuffers(2, m_width, m_height, DXGI_FORMAT_B8G8R8A8_UNORM, 0));
+ winrt::hresult hr = m_swapChain->ResizeBuffers(2, m_width, m_height, DXGI_FORMAT_B8G8R8A8_UNORM, 0);
+ if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)
+ {
+ m_swapChain = nullptr;
+ }
+ else
+ {
+ winrt::check_hresult(hr);
+ }
}
}
}
@@ -573,16 +581,15 @@ void SampleRemoteApp::Render(HolographicFrame holographicFrame)
// * Holographic streamer
// * Renderer
// * Holographic space
- // The InitializeRemoteContext() function will call the functions necessary to recreate these resources.
+ // Call the InitializeRemoteContextAndConnectOrListen() function will call the functions necessary to recreate these resources.
ShutdownRemoteContext();
- InitializeRemoteContextAndConnectOrListen();
}
// Determine whether or not to copy to the preview buffer.
bool copyPreview;
{
std::lock_guard remoteContextLock(m_remoteContextAccess);
- copyPreview = m_remoteContext == nullptr || m_remoteContext.ConnectionState() != ConnectionState::Connected;
+ copyPreview = m_swapChain && (m_remoteContext == nullptr || m_remoteContext.ConnectionState() != ConnectionState::Connected);
}
if (copyPreview && m_isInitialized)
{
@@ -710,16 +717,29 @@ void SampleRemoteApp::InitializeRemoteContextAndConnectOrListen()
});
#ifdef ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE
- m_onDataChannelCreatedEventRevoker =
- m_remoteContext.OnDataChannelCreated(winrt::auto_revoke, [this](const IDataChannel& dataChannel, uint8_t channelId) {
- std::lock_guard lock(m_customDataChannelLock);
- m_customDataChannel = dataChannel.as();
+ m_onDataChannelCreatedEventRevoker = m_remoteContext.OnDataChannelCreated(
+ winrt::auto_revoke, [weakThis = weak_from_this()](const IDataChannel& dataChannel, uint8_t channelId) {
+ if (auto strongThis = weakThis.lock())
+ {
+ std::lock_guard lock(strongThis->m_customDataChannelLock);
+ strongThis->m_customDataChannel = dataChannel.as();
- m_customChannelDataReceivedEventRevoker = m_customDataChannel.OnDataReceived(
- winrt::auto_revoke, [this](winrt::array_view dataView) { OnCustomDataChannelDataReceived(dataView); });
+ strongThis->m_customChannelDataReceivedEventRevoker = strongThis->m_customDataChannel.OnDataReceived(
+ winrt::auto_revoke, [weakThis](winrt::array_view dataView) {
+ if (auto strongThis = weakThis.lock())
+ {
+ strongThis->OnCustomDataChannelDataReceived(dataView);
+ }
+ });
- m_customChannelClosedEventRevoker =
- m_customDataChannel.OnClosed(winrt::auto_revoke, [this]() { OnCustomDataChannelClosed(); });
+ strongThis->m_customChannelClosedEventRevoker =
+ strongThis->m_customDataChannel.OnClosed(winrt::auto_revoke, [weakThis]() {
+ if (auto strongThis = weakThis.lock())
+ {
+ strongThis->OnCustomDataChannelClosed();
+ }
+ });
+ }
});
#endif
@@ -866,23 +886,26 @@ void SampleRemoteApp::SavePosition()
auto position = SpatialAnchor::TryCreateRelativeTo(m_referenceFrame.CoordinateSystem(), m_spinningCubeRenderer->GetPosition());
- auto storeRequest = SpatialAnchorManager::RequestStoreAsync();
- storeRequest.Completed([position](winrt::Windows::Foundation::IAsyncOperation result, auto asyncStatus) {
- if (result.Status() != winrt::Windows::Foundation::AsyncStatus::Completed)
- {
- return;
- }
-
- const SpatialAnchorStore& store = result.GetResults();
- if (store)
- {
- store.Clear();
- if (store.TrySave(L"position", position))
+ if (position)
+ {
+ auto storeRequest = SpatialAnchorManager::RequestStoreAsync();
+ storeRequest.Completed([position](winrt::Windows::Foundation::IAsyncOperation result, auto asyncStatus) {
+ if (result.Status() != winrt::Windows::Foundation::AsyncStatus::Completed)
{
- OutputDebugStringW(L"Saved cube position to SpatialAnchorStore.\n");
+ return;
}
- }
- });
+
+ const SpatialAnchorStore& store = result.GetResults();
+ if (store)
+ {
+ store.Clear();
+ if (store.TrySave(L"position", position))
+ {
+ OutputDebugStringW(L"Saved cube position to SpatialAnchorStore.\n");
+ }
+ }
+ });
+ }
}
winrt::fire_and_forget SampleRemoteApp::ExportPosition()
@@ -1087,17 +1110,6 @@ winrt::fire_and_forget SampleRemoteApp::RequestQRCodeWatcherUpdates()
m_qrWatcher = QRCodeWatcher();
- m_qrAddedRevoker = m_qrWatcher.Added(
- winrt::auto_revoke,
- [&, weakThis = weak_from_this()](
- const winrt::Microsoft::MixedReality::QR::QRCodeWatcher&,
- const winrt::Microsoft::MixedReality::QR::QRCodeAddedEventArgs& args) {
- if (auto strongThis = weakThis.lock())
- {
- m_qrCodeRenderer->OnAddedQRCode(args.Code());
- }
- });
-
m_qrUpdatedRevoker = m_qrWatcher.Updated(
winrt::auto_revoke,
[&, weakThis = weak_from_this()](
@@ -1290,8 +1302,15 @@ void SampleRemoteApp::OnDisconnected(winrt::Microsoft::Holographic::AppRemoting:
m_hasSceneObserverAccess = false;
- m_sceneUnderstandingRenderer->Reset();
- m_qrCodeRenderer->Reset();
+ if (m_sceneUnderstandingRenderer)
+ {
+ m_sceneUnderstandingRenderer->Reset();
+ }
+
+ if (m_qrCodeRenderer)
+ {
+ m_qrCodeRenderer->Reset();
+ }
}
void SampleRemoteApp::OnSendFrame(const winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DSurface& texture)
diff --git a/remote/uwp/packages.config b/remote/uwp/packages.config
index 00bcca1..9140447 100644
--- a/remote/uwp/packages.config
+++ b/remote/uwp/packages.config
@@ -1,7 +1,7 @@
-
+
-
\ No newline at end of file
+
diff --git a/remote_openxr/desktop/SampleRemoteOpenXR.vcxproj b/remote_openxr/desktop/SampleRemoteOpenXR.vcxproj
index 8c31b5b..62f309d 100644
--- a/remote_openxr/desktop/SampleRemoteOpenXR.vcxproj
+++ b/remote_openxr/desktop/SampleRemoteOpenXR.vcxproj
@@ -259,6 +259,6 @@
-
+
\ No newline at end of file
diff --git a/remote_openxr/desktop/packages.config b/remote_openxr/desktop/packages.config
index c9ff9bf..8e69f1f 100644
--- a/remote_openxr/desktop/packages.config
+++ b/remote_openxr/desktop/packages.config
@@ -3,5 +3,5 @@
-
+
diff --git a/remote_openxr/specification.html b/remote_openxr/specification.html
index 31d9019..4b4bf50 100644
--- a/remote_openxr/specification.html
+++ b/remote_openxr/specification.html
@@ -4363,7 +4363,7 @@ No such structures are defined in core OpenXR or this extension.
Revision
-2
+3
Extension and Version Dependencies
@@ -4381,7 +4381,7 @@ No such structures are defined in core OpenXR or this extension.
- Last Modified Date
-
-
2021-06-01
+2021-07-20
- IP Status
-
@@ -4400,7 +4400,7 @@ Felix Reeh, Microsoft
1.2.1. Overview
-
This holographic remoting extension allows the remote application to react to speech commands detected by the player application.
+
This holographic remoting extension allows the remote application to react to speech commands recognized by the player application using Windows Speech Recognition API.
-
To initialize a speech recognizer on the player application, the remote application can call xrInitializeRemotingSpeechMSFT. This transmits speech initialization parameters, i.e. a language, a dictionary of phrases, and the contents of a grammar file, to the player application. The speech recognizer must only be initialized once per XrSession.
+
To initialize a speech recognizer on the player application, the remote application can call xrInitializeRemotingSpeechMSFT. This transmits speech initialization parameters, i.e. a language, a dictionary of phrases, and the contents of a grammar file, to the player application. it can also be used to reinitialize the speech recognizer with new parameters during a running XrSession.
@@ -4792,7 +4789,7 @@ No such structures are defined in core OpenXR or this extension.
-
The XrRemotingSpeechRecognitionConfidenceMSFT is a direct mapping of the SpeechRecognitionConfidence enum returned with the speech recognition result by the Windows Speech Recognition API. It is defined as:
+
The XrRemotingSpeechRecognitionConfidenceMSFT is a direct mapping of the SpeechRecognitionConfidence enum returned with the speech recognition result by Windows Speech Recognition API. It is defined as:
@@ -4831,7 +4828,7 @@ No such structures are defined in core OpenXR or this extension.
Retrieve recognized speech text
The xrRetrieveRemotingSpeechRecognizedTextMSFT function is defined as:
@@ -4985,9 +4982,6 @@ No such structures are defined in core OpenXR or this extension.
@@ -5067,7 +5061,17 @@ No such structures are defined in core OpenXR or this extension.
+
+
-
+
Revision 3, 2021-07-20 (Felix Reeh, Hanaa Elghobashi)
+
@@ -5075,7 +5079,6 @@ No such structures are defined in core OpenXR or this extension.
-
1.3. XR_MSFT_remoting_frame_mirroring