@@ -22,7 +22,7 @@ using namespace std;
2222using namespace util ;
2323using namespace util ::uwp;
2424
25- CaptureManager::CaptureManager (HINSTANCE instance) : m_options(), m_deviceName( L" Default " ), m_lastPreset(-1 ), m_instance {instance} { }
25+ CaptureManager::CaptureManager (HINSTANCE instance) : m_options(), m_lastPreset(-1 ), m_instance {instance} { }
2626
2727bool CaptureManager::Initialize ()
2828{
@@ -93,10 +93,12 @@ const std::vector<GraphicsAdapter>& CaptureManager::GraphicsAdapters()
9393 if ((desc.VendorId == 0x1414 ) && (desc.DeviceId == 0x8c ))
9494 continue ; // Microsoft Basic Render Driver
9595
96- wchar_t id[24 ];
97- _snwprintf_s (id, 24 , L" %lx:%lx" , desc.AdapterLuid .HighPart , desc.AdapterLuid .LowPart );
98- m_graphicsAdapters.emplace_back (no++, std::wstring (desc.Description ), std::wstring (id), adapter);
96+ m_graphicsAdapters.emplace_back (no++, std::wstring (desc.Description ), adapter, desc.AdapterLuid , false , false );
9997 }
98+
99+ // max GPUs
100+ if (m_graphicsAdapters.size () == 3 )
101+ break ;
100102 }
101103 }
102104 return m_graphicsAdapters;
@@ -120,35 +122,38 @@ DWORD WINAPI ThreadFuncProxy(LPVOID lpParam)
120122
121123bool CaptureManager::StartSession ()
122124{
123- bool hybrid = false ;
125+ bool cross = false ;
124126
125127 if (!m_captureDevice)
126128 {
127- m_captureDevice = CreateD3DDevice (m_captureAdapter);
128- if (m_captureAdapter != m_renderAdapter)
129+ IDXGIAdapter *captureAdapter = nullptr , *renderAdapter = nullptr ;
130+ if (m_graphicsAdapters.size () > 1 )
131+ {
132+ for (const auto & ga : m_graphicsAdapters)
133+ {
134+ if (ga.capture )
135+ captureAdapter = ga.adapter .get ();
136+ if (ga.render )
137+ renderAdapter = ga.adapter .get ();
138+ }
139+ }
140+
141+ m_captureDevice = CreateD3DDevice (captureAdapter);
142+ if (captureAdapter != nullptr && renderAdapter != nullptr && captureAdapter != renderAdapter)
129143 {
130- m_renderDevice = CreateD3DDevice (m_renderAdapter );
131- hybrid = true ;
144+ m_renderDevice = CreateD3DDevice (renderAdapter );
145+ cross = true ;
132146 }
133147 else
134148 {
135149 m_renderDevice = m_captureDevice;
136150 }
137151 m_renderDevice->GetImmediateContext (m_renderContext.put ());
138152
139- // get actual GPU name
140- {
141- auto dxgiDevice = m_renderDevice.as <IDXGIDevice>();
142- winrt::com_ptr<IDXGIAdapter> adapter;
143- if (SUCCEEDED (dxgiDevice->GetAdapter (adapter.put ())))
144- {
145- DXGI_ADAPTER_DESC desc;
146- if (SUCCEEDED (adapter->GetDesc (&desc)))
147- {
148- m_deviceName = std::wstring (desc.Description );
149- }
150- }
151- }
153+ // mark GPUs
154+ LUID captureId = GetAdapterLuid (m_captureDevice);
155+ LUID renderId = GetAdapterLuid (m_renderDevice);
156+ SetGraphicsAdapters (captureId, renderId);
152157 }
153158
154159#ifdef _DEBUG
@@ -185,6 +190,8 @@ bool CaptureManager::StartSession()
185190 UpdatePixelSize ();
186191 UpdateOutputSize ();
187192 UpdateOutputFlip ();
193+ UpdateSyncSubFrame ();
194+ UpdateInternalVSync ();
188195 UpdateShaderPreset ();
189196 UpdateFrameSkip ();
190197 UpdateLockedArea ();
@@ -242,12 +249,12 @@ bool CaptureManager::StartSession()
242249 : winrt::Windows::Graphics::DirectX::DirectXPixelFormat::B8G8R8A8UIntNormalized;
243250
244251 m_session =
245- make_unique<CaptureSession>(m_captureDevice, hybrid ? m_renderDevice : nullptr , captureItem, pixelFormat, *m_shaderGlass, m_options.maxCaptureRate , m_frameEvent);
252+ make_unique<CaptureSession>(m_captureDevice, cross ? m_renderDevice : nullptr , captureItem, pixelFormat, *m_shaderGlass, m_options.maxCaptureRate , m_frameEvent);
246253 }
247254
248- m_active = true ;
249- auto thread = CreateThread (NULL , 0 , ThreadFuncProxy, this , 0 , NULL );
250- SetThreadPriority (thread , THREAD_PRIORITY_TIME_CRITICAL);
255+ m_active = true ;
256+ m_thread = CreateThread (NULL , 0 , ThreadFuncProxy, this , 0 , NULL );
257+ SetThreadPriority (m_thread , THREAD_PRIORITY_TIME_CRITICAL);
251258
252259 UpdateCursor ();
253260 return true ;
@@ -379,6 +386,9 @@ void CaptureManager::Exit()
379386 m_shaderGlass->Stop ();
380387 delete m_shaderGlass.release ();
381388
389+ m_renderContext->ClearState ();
390+ m_renderContext->Flush ();
391+
382392 if (m_debug)
383393 {
384394 m_debug->ReportLiveDeviceObjects (D3D11_RLDO_DETAIL | D3D11_RLDO_IGNORE_INTERNAL);
@@ -415,6 +425,22 @@ void CaptureManager::UpdateOutputFlip()
415425 }
416426}
417427
428+ void CaptureManager::UpdateSyncSubFrame ()
429+ {
430+ if (m_shaderGlass)
431+ {
432+ m_shaderGlass->SetSyncSubFrame (m_options.syncSubFrame );
433+ }
434+ }
435+
436+ void CaptureManager::UpdateInternalVSync ()
437+ {
438+ if (m_shaderGlass)
439+ {
440+ m_shaderGlass->SetInternalVSync (m_options.internalVSync );
441+ }
442+ }
443+
418444void CaptureManager::UpdateShaderPreset ()
419445{
420446 if (m_shaderGlass)
@@ -573,19 +599,56 @@ bool CaptureManager::FindDeviceFormat(int deviceFormatNo, std::vector<CaptureDev
573599 return false ;
574600}
575601
576- void CaptureManager::SetCaptureAdapters (const std::wstring& captureId, const std::wstring& renderId)
602+ void CaptureManager::SetGraphicsAdapters (LUID captureId, LUID renderId)
603+ {
604+ for (auto & ga : m_graphicsAdapters)
605+ {
606+ ga.capture = (ga.luid .HighPart == captureId.HighPart && ga.luid .LowPart == captureId.LowPart );
607+ ga.render = (ga.luid .HighPart == renderId.HighPart && ga.luid .LowPart == renderId.LowPart );
608+ }
609+ }
610+
611+ void CaptureManager::SetGraphicsAdapters (int captureNo, int renderNo, LUID& captureId, LUID& renderId)
612+ {
613+ bool active = m_active;
614+ if (active)
615+ StopSession ();
616+ captureId.LowPart = 0 ;
617+ captureId.HighPart = 0 ;
618+ renderId.LowPart = 0 ;
619+ renderId.HighPart = 0 ;
620+ for (auto & ga : m_graphicsAdapters)
621+ {
622+ if (captureNo == ga.no )
623+ {
624+ captureId = ga.luid ;
625+ }
626+ if (renderNo == ga.no )
627+ {
628+ renderId = ga.luid ;
629+ }
630+ }
631+ SetGraphicsAdapters (captureId, renderId);
632+ m_defaultAdapter = (captureNo == 0 && renderNo == 0 );
633+ m_captureDevice = nullptr ;
634+ m_renderDevice = nullptr ;
635+
636+ Sleep (1000 );
637+ if (active)
638+ StartSession ();
639+ }
640+
641+ LUID CaptureManager::GetAdapterLuid (winrt::com_ptr<ID3D11Device> device)
577642{
578- m_captureAdapter = nullptr ;
579- m_renderAdapter = nullptr ;
580- if (captureId. size () || renderId. size ( ))
643+ auto dxgiDevice = device. as <IDXGIDevice>() ;
644+ winrt::com_ptr<IDXGIAdapter> adapter ;
645+ if (SUCCEEDED (dxgiDevice-> GetAdapter (adapter. put ()) ))
581646 {
582- const auto & graphicsAdapters = GraphicsAdapters () ;
583- for ( const auto & ga : graphicsAdapters )
647+ DXGI_ADAPTER_DESC desc ;
648+ if ( SUCCEEDED (adapter-> GetDesc (&desc)) )
584649 {
585- if (ga.id == captureId)
586- m_captureAdapter = ga.adapter ;
587- if (ga.id == renderId)
588- m_renderAdapter = ga.adapter ;
650+ return desc.AdapterLuid ;
589651 }
590652 }
653+ return LUID ();
591654}
0 commit comments