Windows 8 : А-ха! Путем подключения другого отладчика к хосту графического отладчика VsGraphicsDesktopEngine.exe
(находится в C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ Extensions \ Microsoft \ VsGraphics \ x86) и принудительной отладке Direct3D через панель управления DirectX Я получил вывод:
DXGI ОШИБКА: целевое окно не указано в DXGI_SWAP_CHAIN_DESC, и нет окна, связанного с владельцем фабрики. [НЕИЗВЕСТНАЯ ОШИБКА № 7:]
PIX: IDXGIFactory2 :: CreateSwapChainForHwnd вернул 887a0001
Я подумал, что это довольно странно, поскольку, хотя я использую CreateSwapChainForHwnd (), он использует DXGI_SWAP_CHAIN_DESC 1 , который даже не имеет поля OutputWindow
. Однако я попытался поменять местами использование CreateSwapChainForHwnd () с CreateSwapChain () с указанным OutputWindow
и все работает !
При дальнейшем тестировании я обнаружил, что любая попытка D3D11CreateDeviceAndSwapChain () завершается неудачно, с нулевым адаптером, который он запускает, но захваты дают причудливый «Этот механизм диагностики графики не поддерживает D3D9. Воспроизведение вашего приложения может быть неполным», и с указанным адаптером он падает с этим стеком:
04246c83()
[Frames below may be incorrect and/or missing]
dxgi.dll!CDXGIFactory::CreateSwapChainForHwndImpl(struct IUnknown *,struct DXGI_SWAP_CHAIN_DESC_INTERNAL *,bool,struct IDXGIOutput *,struct IDXGISwapChain1 * *)
dxgi.dll!CDXGIFactory::CreateSwapChain(struct IUnknown *,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *)
VsGraphicsHelper.dll!CHookedIDXGIFactory::CreateSwapChain(struct IUnknown *,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *)
VsGraphicsHelper.dll!CSpyHookedIDXGIFactory::CreateSwapChain(struct IUnknown *,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *)
d3d11.dll!_D3D11CreateDeviceAndSwapChain@48()
VsGraphicsHelper.dll!CHookedD3D11Top::D3D11CreateDeviceAndSwapChain(struct IDXGIAdapter *,enum D3D_DRIVER_TYPE,struct HINSTANCE__ *,unsigned int,enum D3D_FEATURE_LEVEL *,unsigned int,unsigned int,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *,struct ID3D11Device * *,enum D3D_FEATURE_LEVEL *,struct ID3D11DeviceContext * *)
VsGraphicsHelper.dll!CSpyHookedD3D11Top::D3D11CreateDeviceAndSwapChain(struct IDXGIAdapter *,enum D3D_DRIVER_TYPE,struct HINSTANCE__ *,unsigned int,enum D3D_FEATURE_LEVEL *,unsigned int,unsigned int,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *,struct ID3D11Device * *,enum D3D_FEATURE_LEVEL *,struct ID3D11DeviceContext * *)
Win32ProjectScratch.exe!Direct3DWindowBase::CreateDeviceResources() Line 363
...
Кажется, работает только D3D11CreateDevice (), за которым следует IDXGIFactory :: CreateSwapChain () - либо указав адаптер, либо запросив устройство на заводе позже.
В Windows 7 есть еще один недостаток: вам все равно нужно использовать D3D11CreateDevice()
/ IDXGIFactory::CreateSwapChain()
, но это также вызывает ошибку уровня отладки DirectX на первом Present()
, если вы используете DXGI 1.0 заводская (CreateDXGIFactory()
против CreateDXGIFactory
1 ()
):
D3D11: ОШИБКА: ID3D11Device :: CreateTexture2D: D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX доступна только для устройств, созданных на фабриках Dxgi1.1 или новее. [STATE_CREATION ERROR # 103: CREATETEXTURE2D_INVALIDMISCFLAGS]
Если у вас включена опция «разбить по степени серьезности» на уровне отладки (что, в общем, вам следует), это вызовет исключение в отладчике, сделав его похожим на еще один сбой, однако его можно безопасно продолжить - однако вы не получите VS Graphics Debugger HUD, и окно таблицы объектов имеет поврежденный контент. С другой стороны, если вы будете следовать его советам и использовать фабрику DXGI 1.1, вы получите настоящий сбой в Present ().
В общем, кажется, что графический отладчик еще не полностью выпечен!
Запрос @MrGomez об идее отладки отладчика