转过头再找个复杂的播放程序验证一下,还是用我比较熟悉的MediaSDK的播放程序。基本思路就是
实现的时候基本难度不大,有了前面共享opengl和opencl的经验,很快就集成好了。集成的过程里有2个坑:
hres = CreateDXGIFactory(__uuidof(IDXGIFactory2), (void**)(&m_pDXGIFactory));if (FAILED(hres))return MFX_ERR_DEVICE_FAILED;hres = m_pDXGIFactory->EnumAdapters(nAdapterNum,&m_pAdapter);if (FAILED(hres))return MFX_ERR_DEVICE_FAILED;hres = D3D11CreateDevice(m_pAdapter ,D3D_DRIVER_TYPE_UNKNOWN,NULL,0,FeatureLevels,MSDK_ARRAY_LEN(FeatureLevels),D3D11_SDK_VERSION,&m_pD3D11Device,&pFeatureLevelsOut,&m_pD3D11Ctx);if (FAILED(hres))return MFX_ERR_DEVICE_FAILED;#if 1CD3D11_TEXTURE2D_DESC TextureDesc2(DXGI_FORMAT_R8G8B8A8_UNORM, SHARED_TEXTURE_WIDTH, SHARED_TEXTURE_HEIGHT, 1, 1);TextureDesc2.BindFlags = D3D11_BIND_RENDER_TARGET;//当MiscFlags有D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX时TextureDesc2.MiscFlags = D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX | D3D11_RESOURCE_MISC_SHARED_NTHANDLE;hres = m_pD3D11Device->CreateTexture2D(&TextureDesc2, 0, &Shared_Texture);//这里hres返回E_INVALIDARGif (FAILED(hres))return MFX_ERR_DEVICE_FAILED;
#endif
经过反复比对,最终定位到了这个函数,MediaSDK sample_decode调用的是
hres = CreateDXGIFactory(__uuidof(IDXGIFactory2), (void**)(&m_pDXGIFactory) );
vulkan tutorial调用的是
VERIFY(SUCCEEDED(CreateDXGIFactory2(0, IID_PPV_ARGS(&DxgiFactory))));
上网搜索了一下,在这里找到了答案
CreateDXGIFactory was the original DXGI 1.0 factory function for Direct3D 10. For Direct3D 11, you should always use CreateDXGIFactory1 and create a IDXGIFactory1 or later interface.
最后验证一下,把原来代码里的 hres = CreateDXGIFactory(__uuidof(IDXGIFactory2), (void**)(&m_pDXGIFactory) );
改成hres = CreateDXGIFactory1(__uuidof(IDXGIFactory2), (void**)(&m_pDXGIFactory) );
下面的CreateTexture2D()就返回S_OK了
查了一下,主要原因是MediaSDK的sample_decode/sample_common工程的编译参数里Runtime Library设置的是Multi-threaded. 而link的GLFW库我在编译的时候用的是默认设置,Runtime Library用的是Multi-threaded DLL设置,所以把GLFW项目设置成Multi-threaded, 重新编译一遍就链接成功了
Windows specific CMake options USE_MSVC_RUNTIME_LIBRARY_DLL determines whether to use the DLL version or the static library version of the Visual C++ runtime library. When enabled, the DLL version of the Visual C++ library is used. This is enabled by default. On CMake 3.15 and later you can set the standard CMake CMAKE_MSVC_RUNTIME_LIBRARY variable instead of this GLFW-specific option.
最后运行一下编译出的代码,
一切正常,收工 :)
最后按照惯例,源码奉上,仅供参考
Intel_mediasdk2021_sample_decode_with_vulkan_sharing: MSDK 2021 解码例程,用来演示D3D11 texture2D和vulkan vkImage共享buffer