mirror of
https://github.com/VirtualDrivers/Virtual-Display-Driver.git
synced 2026-10-21 22:22:27 -05:00
changed the const to a byte pointer, then on start laod a edid into a vectro and point to it.
107 lines
2.9 KiB
C++
107 lines
2.9 KiB
C++
#pragma once
|
|
|
|
#define NOMINMAX
|
|
#include <windows.h>
|
|
#include <bugcodes.h>
|
|
#include <wudfwdm.h>
|
|
#include <wdf.h>
|
|
#include <iddcx.h>
|
|
|
|
#include <dxgi1_5.h>
|
|
#include <d3d11_2.h>
|
|
#include <avrt.h>
|
|
#include <wrl.h>
|
|
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#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<HandleTraits::HANDLENullTraits> Thread;
|
|
}
|
|
}
|
|
}
|
|
|
|
namespace Microsoft
|
|
{
|
|
namespace IndirectDisp
|
|
{
|
|
/// <summary>
|
|
/// Manages the creation and lifetime of a Direct3D render device.
|
|
/// </summary>
|
|
struct Direct3DDevice
|
|
{
|
|
Direct3DDevice(LUID AdapterLuid);
|
|
Direct3DDevice();
|
|
HRESULT Init();
|
|
|
|
LUID AdapterLuid;
|
|
Microsoft::WRL::ComPtr<IDXGIFactory5> DxgiFactory;
|
|
Microsoft::WRL::ComPtr<IDXGIAdapter1> Adapter;
|
|
Microsoft::WRL::ComPtr<ID3D11Device> Device;
|
|
Microsoft::WRL::ComPtr<ID3D11DeviceContext> DeviceContext;
|
|
};
|
|
|
|
/// <summary>
|
|
/// Manages a thread that consumes buffers from an indirect display swap-chain object.
|
|
/// </summary>
|
|
class SwapChainProcessor
|
|
{
|
|
public:
|
|
SwapChainProcessor(IDDCX_SWAPCHAIN hSwapChain, std::shared_ptr<Direct3DDevice> Device, HANDLE NewFrameEvent);
|
|
~SwapChainProcessor();
|
|
|
|
private:
|
|
static DWORD CALLBACK RunThread(LPVOID Argument);
|
|
|
|
void Run();
|
|
void RunCore();
|
|
|
|
public:
|
|
IDDCX_SWAPCHAIN m_hSwapChain;
|
|
std::shared_ptr<Direct3DDevice> m_Device;
|
|
HANDLE m_hAvailableBufferEvent;
|
|
Microsoft::WRL::Wrappers::Thread m_hThread;
|
|
Microsoft::WRL::Wrappers::Event m_hTerminateEvent;
|
|
};
|
|
|
|
/// <summary>
|
|
/// Provides a sample implementation of an indirect display driver.
|
|
/// </summary>
|
|
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<SwapChainProcessor> m_ProcessingThread;
|
|
|
|
public:
|
|
static const DISPLAYCONFIG_VIDEO_SIGNAL_INFO s_KnownMonitorModes[];
|
|
static BYTE* s_KnownMonitorEdid();
|
|
static std::vector<BYTE> s_knownMonitorEdidData;
|
|
};
|
|
};
|
|
} |