DX runtime分析
最近简单研究了一下DX 的runtime里的DLL,主要使用了dependencies进行分析(以下以DX11为例)
一般来说,首先要经过校验层才能进入Runtime,所以我们首先看d3d11_3SDKLayer.dll
这里可以很清楚的看到d3d11_3SDKLayer.dll会加载真正Runtime d3d11.dll,这里d3d11_3SDKLayer.dll导出了两个接口,D3D11RegisterLayers和D3D11TranslateCreateDevice,其中又调用d3d11.dll的D3D11CoreRegisterLayers和D3D11CoreGetLayeredDeviceSize、D3D11CoreCreateLayeredDevice。(注意这里并不是CreateDevice)
在d3d11.dll中,查看如下
这里可以看到dxgi.dll就是在这里被加载的
d3d11.dll是DXRuntime的核心,这里可以看到导出的接口主要有2类,一类是D3DKMT这种,这种是UMD回调RunTime的接口。另一种就是openAdapter10.openAdapter10_2分别代表DX10,DX11。
这里可以简单再看下DX10的
观查system32下面的DX相关的dll,可以发现DX10都会有一个d3d10core.dll,d3d10_1core.dll,这两个导出接口类似,而DX11是没有的,但是我们对比d3d10core.dll和d3d11.dll的导出接口,可以发现导出接口也基本类似,因此可以把d3d11.dll看作和d3d10core.dll基本一样,但实际跑DX10测试发现,d3d10core和d3d11.dll都会被调用起来,其原因是d3d10.dll都会加载这两个,观察调用的接口,d3d10.dll调用了d310core.dll的D3D10CoreGetVersion和D3D10CoreRegisterLayers,并且调用了d3d11.dll的D3D11CreateDeviceAndSwapChain(现在DX10都是转成11?)
接下来看下Ref和warp的dll
d3d10warp.dll
可以看到虽然叫d3d10,但是实际上支持dx9,dx11,dx12,通过调用msvcp相关dll,也可以看出确实是Warp的。
D3D11Ref.dll
这个就是refence了。可以看到referece是区分DX版本的,这个只支持DX10/11,不像warp,DX9/11/12都在一个dll里面,有意思的是这里会导出D3DKMT接口,而Warp是没有导出D3DKMT的。