aboutsummaryrefslogtreecommitdiffstats
path: root/support/hololens/ServoApp/Common/DeviceResources.h
diff options
context:
space:
mode:
Diffstat (limited to 'support/hololens/ServoApp/Common/DeviceResources.h')
-rw-r--r--support/hololens/ServoApp/Common/DeviceResources.h119
1 files changed, 119 insertions, 0 deletions
diff --git a/support/hololens/ServoApp/Common/DeviceResources.h b/support/hololens/ServoApp/Common/DeviceResources.h
new file mode 100644
index 00000000000..ff0248b221d
--- /dev/null
+++ b/support/hololens/ServoApp/Common/DeviceResources.h
@@ -0,0 +1,119 @@
+
+#pragma once
+
+#include "CameraResources.h"
+
+namespace DX {
+// Provides an interface for an application that owns DeviceResources to be
+// notified of the device being lost or created.
+interface IDeviceNotify {
+ virtual void OnDeviceLost() = 0;
+ virtual void OnDeviceRestored() = 0;
+};
+
+// Creates and manages a Direct3D device and immediate context, Direct2D device
+// and context (for debug), and the holographic swap chain.
+class DeviceResources {
+public:
+ DeviceResources();
+
+ // Public methods related to Direct3D devices.
+ void HandleDeviceLost();
+ void RegisterDeviceNotify(IDeviceNotify *deviceNotify);
+ void Trim();
+ void Present(winrt::Windows::Graphics::Holographic::HolographicFrame frame);
+
+ // Public methods related to holographic devices.
+ void SetHolographicSpace(
+ winrt::Windows::Graphics::Holographic::HolographicSpace space);
+ void EnsureCameraResources(
+ winrt::Windows::Graphics::Holographic::HolographicFrame frame,
+ winrt::Windows::Graphics::Holographic::HolographicFramePrediction
+ prediction);
+
+ void AddHolographicCamera(
+ winrt::Windows::Graphics::Holographic::HolographicCamera camera);
+ void RemoveHolographicCamera(
+ winrt::Windows::Graphics::Holographic::HolographicCamera camera);
+
+ // Holographic accessors.
+ template <typename RetType, typename LCallback>
+ RetType UseHolographicCameraResources(LCallback const &callback);
+
+ winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice
+ GetD3DInteropDevice() const {
+ return m_d3dInteropDevice;
+ }
+
+ // D3D accessors.
+ ID3D11Device4 *GetD3DDevice() const { return m_d3dDevice.Get(); }
+ ID3D11DeviceContext3 *GetD3DDeviceContext() const {
+ return m_d3dContext.Get();
+ }
+ D3D_FEATURE_LEVEL GetDeviceFeatureLevel() const { return m_d3dFeatureLevel; }
+ bool GetDeviceSupportsVprt() const { return m_supportsVprt; }
+
+ // DXGI acessors.
+ IDXGIAdapter3 *GetDXGIAdapter() const { return m_dxgiAdapter.Get(); }
+
+ // D2D accessors.
+ ID2D1Factory2 *GetD2DFactory() const { return m_d2dFactory.Get(); }
+ IDWriteFactory2 *GetDWriteFactory() const { return m_dwriteFactory.Get(); }
+ IWICImagingFactory2 *GetWicImagingFactory() const {
+ return m_wicFactory.Get();
+ }
+
+private:
+ // Private methods related to the Direct3D device, and resources based on that
+ // device.
+ void CreateDeviceIndependentResources();
+ void InitializeUsingHolographicSpace();
+ void CreateDeviceResources();
+
+ // Direct3D objects.
+ Microsoft::WRL::ComPtr<ID3D11Device4> m_d3dDevice;
+ Microsoft::WRL::ComPtr<ID3D11DeviceContext3> m_d3dContext;
+ Microsoft::WRL::ComPtr<IDXGIAdapter3> m_dxgiAdapter;
+
+ // Direct3D interop objects.
+ winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice
+ m_d3dInteropDevice;
+
+ // Direct2D factories.
+ Microsoft::WRL::ComPtr<ID2D1Factory2> m_d2dFactory;
+ Microsoft::WRL::ComPtr<IDWriteFactory2> m_dwriteFactory;
+ Microsoft::WRL::ComPtr<IWICImagingFactory2> m_wicFactory;
+
+ // The holographic space provides a preferred DXGI adapter ID.
+ winrt::Windows::Graphics::Holographic::HolographicSpace m_holographicSpace =
+ nullptr;
+
+ // Properties of the Direct3D device currently in use.
+ D3D_FEATURE_LEVEL m_d3dFeatureLevel = D3D_FEATURE_LEVEL_10_0;
+
+ // The IDeviceNotify can be held directly as it owns the DeviceResources.
+ IDeviceNotify *m_deviceNotify = nullptr;
+
+ // Whether or not the current Direct3D device supports the optional feature
+ // for setting the render target array index from the vertex shader stage.
+ bool m_supportsVprt = false;
+
+ // Back buffer resources, etc. for attached holographic cameras.
+ std::map<UINT32, std::unique_ptr<CameraResources>> m_cameraResources;
+ std::mutex m_cameraResourcesLock;
+};
+} // namespace DX
+
+// Device-based resources for holographic cameras are stored in a std::map.
+// Access this list by providing a callback to this function, and the std::map
+// will be guarded from add and remove events until the callback returns. The
+// callback is processed immediately and must not contain any nested calls to
+// UseHolographicCameraResources. The callback takes a parameter of type
+// std::map<UINT32, std::unique_ptr<DX::CameraResources>>& through which the
+// list of cameras will be accessed.
+template <typename RetType, typename LCallback>
+RetType
+DX::DeviceResources::UseHolographicCameraResources(LCallback const &callback) {
+ std::lock_guard<std::mutex> guard(m_cameraResourcesLock);
+ return callback(m_cameraResources);
+}