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_DESC1, в котором даже не имеет поля 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 за идею отладки отладчика
person
Simon Buchan
schedule
21.03.2012