转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=3437

Win10 TH2 (10586)正式版已于11月12日发布,其SDK也在11月30日随着VS2015 Update 1正式发布。本来不觉得D3D/DXGI部分会有什么变化,毕竟没有任何正式宣布。但SDK里俨然出现了d3d11_4.h和dxgi1_5.h。换句话说,D3D 11.4和DXGI 1.5就这么悄悄发布了。

但是,到目前为止,不管是msdn还是网上搜索,都找不到没有任何资料。从头文件的内容来看,其实与其说是一个新版本,不如说是对以前的略微增强。下面我们就来看看到底变了什么。

D3D 11.4

d3d11_4.h里面,唯一增加的是定义了ID3D11Device4,包含两个新函数。

HRESULT RegisterDeviceRemovedEvent(HANDLE hEvent,  DWORD *pdwCookie);
void UnregisterDeviceRemoved(DWORD dwCookie);

从函数名就很直接能看出来它们的功能,注册和撤销设备移除的事件。

Device lost是D3D9/XPDM时代一个恼人的问题。它很经常发生,一旦出现所有default的资源内容都会被清除。到了D3D10/WDDM时代,device lost已经消失,取而代之的是,在极其罕见的情况下,会出现device removed。它出现的频率远远低于device lost,比如只有重装驱动、启用显卡、显卡热拔插等极端情况下,才会出现device remove。如果遇到device removed,设备需要重建,所有资源都不可使用了。所以,如果真要处理这个情况,就需要在任何一个有HRESULT的D3D和DXGI调用上,检测是否返回了DXGI_ERROR_DEVICE_REMOVED或D3DERR_DEVICEREMOVED。注意,是所有,因为它可能发生在任何时候。错过一个就会崩溃,不像device lost那样,可以就在Present的时候检查。

正因为几乎不会出现,一旦出现就是麻烦大了。一般来说,程序都不用去处理这个事件,崩溃就是了。

但是,现在有了Surface Book!在Surface Book上,按一个键就能拔除底座的显卡,并且要求程序自动无缝地切换到集成显卡上。也就是说,现在程序必须自己处理device removed。在这种情况下,要求到处检查HRESULT代码会变得很丑陋。增加一个事件,让D3D在遇到设备移除的时候主动发送一个消息给程序,会变得容易很多,原有代码也都不用改。看来这个功能对Surface Book和一些动态切换显卡的笔记本是个好事。

DXGI 1.5

dxgi1_5.h也很小,就加了一个IDXGIOutput5。

HRESULT DuplicateOutput1(IUnknown *pDevice, UINT Flags, UINT SupportedFormatsCount,  const DXGI_FORMAT *pSupportedFormats, IDXGIOutputDuplication **ppOutputDuplication);

这个函数类似于IDXGIOutput1::DuplicateOutput,都可以用来把桌面内容复制到指定的dxgi output上。但从接口上看,这个版本可以支持格式转换,限制比以前少。

Universal DX SDK已经更新

前不久我新建的一个开源项目Universal DX SDK昨天已经更新,加入了包括D3D 11.4和DXGI 1.5在内的一些TH2修改。