#pragma once #define NOMINMAX #include #include #include #include #include #include #include #include #include #include #include #include "Trace.h" namespace Microsoft { namespace WRL { namespace Wrappers { // Adds a wrapper for thread handles to the existing set of WRL handle wrapper classes typedef HandleT Thread; } } } namespace Microsoft { namespace IndirectDisp { /// /// Manages the creation and lifetime of a Direct3D render device. /// struct Direct3DDevice { Direct3DDevice(LUID AdapterLuid); Direct3DDevice(); HRESULT Init(); LUID AdapterLuid; Microsoft::WRL::ComPtr DxgiFactory; Microsoft::WRL::ComPtr Adapter; Microsoft::WRL::ComPtr Device; Microsoft::WRL::ComPtr DeviceContext; }; /// /// Manages a thread that consumes buffers from an indirect display swap-chain object. /// class SwapChainProcessor { public: SwapChainProcessor(IDDCX_SWAPCHAIN hSwapChain, std::shared_ptr Device, HANDLE NewFrameEvent); ~SwapChainProcessor(); private: static DWORD CALLBACK RunThread(LPVOID Argument); void Run(); void RunCore(); public: IDDCX_SWAPCHAIN m_hSwapChain; std::shared_ptr m_Device; HANDLE m_hAvailableBufferEvent; Microsoft::WRL::Wrappers::Thread m_hThread; Microsoft::WRL::Wrappers::Event m_hTerminateEvent; }; /// /// Provides a sample implementation of an indirect display driver. /// class IndirectDeviceContext { public: IndirectDeviceContext(_In_ WDFDEVICE WdfDevice); virtual ~IndirectDeviceContext(); void InitAdapter(); void FinishInit(); void CreateMonitor(unsigned int index); void AssignSwapChain(IDDCX_SWAPCHAIN SwapChain, LUID RenderAdapter, HANDLE NewFrameEvent); void UnassignSwapChain(); protected: WDFDEVICE m_WdfDevice; IDDCX_ADAPTER m_Adapter; IDDCX_MONITOR m_Monitor; IDDCX_MONITOR m_Monitor2; std::unique_ptr m_ProcessingThread; public: static const DISPLAYCONFIG_VIDEO_SIGNAL_INFO s_KnownMonitorModes[]; static const BYTE s_KnownMonitorEdid[]; }; } }