Visual Studio 11的图形调试器的目标应用程序的要求

Sim*_*han 7 c++ direct3d visual-studio-2012

当Visual Studio 11宣布"图形调试器"功能时,我感到非常高兴,我立即尝试让它在我所拥有的各种项目上工作,不幸的是我只是设法让它适用于Windows 8 Metro应用程序!具体而言,C++ Metro项目模板可以正确运行并捕获所有预期信息.

使用Visual Studio的Developer Preview版本,在Windows 7上,任何在图形调试器(Alt-F5)下启动应用程序的尝试都会在D3D11CreateDeviceAndSwapChain()上崩溃,即使它们正常工作.在我工作的Windows 8 Consumer Preview机器上的Visual Studio 11 Beta上,我得到了更多,图形调试器HUD正确显示,但任何获取捕获的尝试(应用程序中的打印屏幕或工具栏按钮)只会导致一条消息(在输出日志和打开的.vsglog顶部的黄色栏中):

图形诊断引擎无法提供结果,很可能是因为vsglog使得此计算机上不支持DirectX调用.

直接从Metro模板应用程序移植Direct3D调用就是这种情况!我没有看到来自MSDN文档的任何消息,该功能仅用于Metro,所以我希望我只是做一些愚蠢的事情,但是当不在图形调试器下时应用程序正常工作.

其他信息:D3D11_CREATE_DEVICE_DEBUG设置,DirectX控制面板启用Direct3D调试,我得到预期的创建/销毁信息消息,而输出中没有其他消息.

Sim*_*han 9

Windows 8:A-ha!通过将另一个调试器附加到图形调试器主机VsGraphicsDesktopEngine.exe(在C:\ Program Files(x86)\ Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\VsGraphics\x86中找到)并通过DirectX控制面板强制Direct3D调试,我得到了输出:

DXGI错误:DXGI_SWAP_CHAIN_DESC中没有指定目标窗口,也没有与拥有工厂关联的窗口.[UNKNOWN ERROR#7:]

PIX:IDXGIFactory2 :: CreateSwapChainForHwnd返回887a0001

我认为这很奇怪,因为虽然我使用的是CreateSwapChainForHwnd(),但它使用DXGI_SWAP_CHAIN_DESC 1,它甚至没有该字段OutputWindow.但是我尝试用CreateSwapChain()交换我对CreateSwapChainForHwnd()的使用,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
...
Run Code Online (Sandbox Code Playgroud)

似乎只有D3D11CreateDevice()后跟IDXGIFactory :: CreateSwapChain()才能工作 - 通过指定适配器或稍后查询设备的工厂.

Windows 7中有另一种疑难杂症:你必须使用D3D11CreateDevice()/ IDXGIFactory::CreateSwapChain()还在,但它也提出了第一个支持DirectX调试层的错误Present(),如果你使用的是1.0 DXGI工厂(CreateDXGIFactory()CreateDXGIFactory1()):

D3D11:错误:ID3D11Device :: CreateTexture2D:D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX仅适用于从Dxgi1.1工厂或更高版本创建的设备.[STATE_CREATION错误#103:CREATETEXTURE2D_INVALIDMISCFLAGS]

如果您打开了调试层"打破严重性"选项(一般情况下应该这样),这将在调试器中引发异常,使其看起来像另一个崩溃,但它可以安全地继续 - 但是你没有获取VS Graphics Debugger HUD,对象表窗口中断内容.另一方面,如果你遵循它的建议并使用DXGI 1.1工厂,你会在Present()中遇到真正的崩溃.

总之,看起来图形调试器尚未完全烘焙!

支持@MrGomez调试调试器的想法