2014-10-12 4 views
1

하나의 GPU에서 데스크탑 복제 API를 사용하여 데스크탑을 캡처하고 GPU 메모리에있는 텍스처를 다른 GPU로 복사해야합니다. 이렇게하려면 데스크톱 이미지를 가져 와서 ID3D11DeviceContext :: CopyResource를 사용하여 동일한 장치에서 생성 된 준비 리소스로 복사하는 캡처 스레드가 있습니다. 그런 다음 해당 준비 리소스를 읽기와 매핑하고 대상 동적 리소스 (다른 장치에서 생성 된)를 WriteDiscard로 매핑하고 데이터를 복사합니다. 렌더링 스레드에서 ID3D11DeviceContext :: CopyResource를 동적 텍스처에서 최종 렌더링 대상으로 처리합니다.DirectX 11의 어댑터를 통해 텍스처 전송하기

이 작동하지만 잠시 후 (일반적으로 30 초 이내에) nvwgf2umx.dll (예외 코드 : 0xc0000005)에서 임의의 충돌이 발생합니다. 두 장치는 SingleThreaded 작성 플래그없이 작성됩니다. 나는 약간의 연구를했고 using a dynamic texture은 이것을 수행하는 가장 좋은 방법처럼 보였다.

크래시의 원인에 대한 아이디어가 있습니까? Nvidia 드라이버의 버그 일 수 있습니까?

+1

최신 릴리스를 읽었을 때 오류가 해결되었습니다. 그것은 nVidia Driver 업데이트를 통해 마술 이었습니까? 아니면 코드에서 다른 방식으로 처리 했습니까? 이것이 어떻게 해결되었는지에 대한 업데이트는 훌륭합니다! – thewhiteambit

답변

0

사용중인 다른 장치와 공유 리소스의 QueryInterface가 필요합니다. 이것은 원래 캡처에서 복사 해왔다 자원이다 (나는 ++ 당신이 정말로 C에 옆에 주어진 조각을 사용하고 어떻게 됐을까)

var sharedResource = aquiredDesktopTexture11.QueryInterface<SharpDX.DXGI.Resource>(); 
var sharedSurfDesktop = device11.OpenSharedResource<SharpDX.Direct3D11.Texture2D>(sharedResource.SharedHandle); 

이 aquiredDesktopTexture11을 ..were C#에서 다음과 같이 것이고, sharedSurfDesktop는 다른 사용할 수 있습니다 장치. 또한 사용량이 상호 배타적인지 확인하십시오.

+1

나는 이미 이것을하고있다. 나는 단지 현재의 엔비디아 드라이버에 동적 텍스처가있는 버그가 있다고 생각합니다. 문제를 재현하는 샘플 프로젝트를 제출할 것입니다. –

+0

완전히 중복되지 않는 액세스 방식으로 처리하지 않는 동안 데스크탑 복제 텍스처에 액세스 할 때 스레드간에 동일한 오류가 발생했습니다 (동일한 GPU에서). @guygodin : 이전 AquireNextFrame (-1)을 해결하는 방법/우리가 https://github.com/sharpdx/SharpDX/issues/515에 대해 이야기 한 문제를 동기화하는 방법 – thewhiteambit

관련 문제