Требования к целевому приложению для графического отладчика Visual Studio 11 - PullRequest
7 голосов
/ 14 марта 2012

Я был очень счастлив, когда была объявлена ​​функция «Graphics Debugger» для Visual Studio 11, я сразу же попытался заставить ее работать над различными проектами, которые у меня были, к сожалению, мне удалось заставить ее работать только для приложений Windows 8 Metro!В частности, шаблоны проектов C ++ Metro запускаются и правильно собирают всю ожидаемую информацию.

В версиях Developer Preview для Visual Studio и в Windows 7 любая попытка запуска приложений при сбое графического отладчика (Alt-F5) на D3D11CreateDeviceAndSwapChain(), даже если они работают нормально.На моей машине Visual Studio 11 Beta на Windows 8 Consumer Preview на работе, я получаю немного дальше, графический отладчик HUD отображает правильно, но любая попытка получить захват (печать экрана в приложении или кнопку на панели инструментов) просто приводит ксообщение (в журнале вывода и желтой полосе в верхней части открытого .vsglog):

Модуль диагностики графики не может предоставить результаты, скорее всего из-за того, что vsglog выполняет вызовы DirectXне поддерживается на этом аппарате.

Это даже в случае прямого переноса вызовов Direct3D из шаблонных приложений Metro!Я не вижу сообщений из документации MSDN о том, что эта функция предназначена только для Metro, поэтому я ожидаю, что просто делаю что-то глупое, но приложения работают правильно, когда не в графическом отладчике.

Другоеинформация: D3D11_CREATE_DEVICE_DEBUG установлен, при этом панель управления DirectX включает отладку Direct3D, и я получаю ожидаемое создание / уничтожение информационных сообщений и никаких других в выходных данных.

Ответы [ 2 ]

9 голосов
/ 21 марта 2012

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 об идее отладки отладчика

3 голосов
/ 19 марта 2012

На основании предоставленной вами информации инструмент падает на D3D11CreateDeviceAndSwapChain, поскольку уровень абстракции не может удовлетворить необходимые расширения Direct3D во время рендеринга. Это подтверждается приведенным вами сообщением об ошибке, поскольку запрашиваемые вызовы Direct3D не поддерживаются вашей текущей машиной.

MSDN предоставляет справочную статью по этому сценарию , в которой описываются стандартные инструменты для отладки этого процесса. В частности, хотя вы, вероятно, уже рассмотрели это, dxdiag может помочь в отладке текущих работающих расширений в вашей системе для Windows 7 или Windows 8 Consumer Preview. Вы также должны иметь возможность сохранить аварийный дамп, когда Visual Studio 11 аварийно завершает работу для последующей отладки, что должно подсвечивать, какой вызов процесса не удался.

Пожалуйста, сделайте это и, если возможно, обновите этот вопрос с результатами. Это должно осветить вызов API, который требуется вашей системе, чтобы мы могли решить эту проблему.

...