转过头再找个复杂的播放程序验证一下,还是用我比较熟悉的MediaSDK的播放程序。基本思路就是

  1. 在初始化解码输出显示的窗口的时候同时也初始化一个vulkan显示的窗口
  2. 初始化d3d11设备的时候初始化vulkan, 同时多创建一个D3D11Texture2D的共享纹理
  3. 最后在MSDK每个frame在解码结束,把视频帧输出到DXGI的back buffer的同时,也把视频帧用VideoProcessorBlt()的方法更新进共享纹理里去
  4. 通过以上3步,应该那个vulkan的窗口里的纹理也会正常显示出我的解码图像了

实现的时候基本难度不大,有了前面共享opengl和opencl的经验,很快就集成好了。集成的过程里有2个坑:

  • 在集成的时候,发现在sample_decode的程序里创建的D3D11Texture2D的属性MiscFlags如果有D3D11_RESOURCE_MISC_SHARED_KEYMUTEX则这个Texture2D对象创建失败,CreateTexture2D()返回E_INVALIDARG;但是如果MiscFlags的属性是 D3D11_RESOURCE_MISC_SHARED则没有问题。同时前一篇文章里基于vulkan tutorial的测试代码则没有问题。
    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

PS 最后补上一段后续的更新:

前面研究的一直是通过DX Texture2D创建buffer再共享给Vulkan,这条路虽然有一些坑,但是看来是通的。另外有条路是在Vulkan一边的vkAllocateMemory()创建一个buffer再通过vkGetMemoryWin32HandleKHR()走D3d11Device->OpenSharedResource()来共享给DX。这条路目前死活走不通,大概的思路是在VK侧获取的sharedHandle, 在DX侧OpenSharedResource()来创建基于共享buffer的DX Texture2D, 但是这步始终返回E_INVALIDARG, 看上去是DX的API不认识这个handle。

在Direct3D VkExternalMemoryHandleTypeFlagBits documentation is misleading #1551 这里看到的讨论,我的理解是Vulkan是不支持export出一个D3D的handle的,不知道我的理解对不对,反正目前在Intel的集显上,我尝试了各种参数设置,但是都是在OpenSharedResource()这步报错,估计这条路暂时是调不通了,只能留待以后慢慢研究了。如果有走通的大侠在这里能指点1,2。

D3D11和Vulkan共享资源 (二) - 和Intel MediaSDK sample_decode 集成相关推荐

  1. D3D11和Vulkan共享资源 (一)

    很久以前研究过 用NV_DX_interop扩展让D3D和OpenGL共享资源 , OpenGL在当初设计的时候电脑和操作系统还是个相对比较简单的东西,因此OpenGL API设计没有考虑到现在计算机 ...

  2. Intel MediaSDK sample_decode 官方GPU解码流程学习(二) - 在双显卡机器上实现DirectX11 D3D11和OpenCL共享资源

    很久以前写过有关D3D11和OCL直接共享显存的代码, Intel MediaSDK sample_decode 官方GPU解码流程学习 - DirectX11 D3D11和OpenCL共享资源 这段 ...

  3. D3D11和D3D12共享资源

    最近碰到个伪需求: 游戏串流. 游戏引擎用D3D12渲染, 再把游戏画面做视频编码, 通过网络发送到远端做解码显示. 第一反应就是走全GPU的流程, 不要用CPU把显存里的数据拷来拷去. 所以先获取渲 ...

  4. 计算机网络组建对等网,计算机网络实验二组建WINDOWS环境下的对等网并共享资源.pdf...

    实验课程名称 计算机网络实验 专 业 班 级 学 生 姓 名 学 号 指 导 教 师 2012 至 2013 学年第 一 学期第 1 至 18 周 <计算机网络实验>实验报告 __2012 ...

  5. ucosIII 共享资源(信号量、互斥信号量)

    共享资源: 变量(静态或全局变量).数据结构体.RAM表格.I/O设备等.OS在使用一些资源时候,例如IO设备打印机,当任务1在使用打印机时候必须保证资源独享,避免其他任务修改打印内容导致出错,因此需 ...

  6. (转贴)Unix与Windows共享资源的一种实现方法

    在一个较大型企业的网络环境中,多种系统如何稳定地共存并共享资源一直是摆在网管人员面前的一道难题,而具体到目前国内企业中较常见的就是Unix和Windows系统之间的问题.不同版本的Windows系统之 ...

  7. 多线程对共享资源的访问

    一.什么是多线程? 线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 所有的线程虽然在微观上是串行执行的,但是在宏观上你完全可以认为它们在并行执行 二.那什 ...

  8. 【翻译】D3D10/D3D11中的纹理资源

    [翻译]D3D10/D3D11中的纹理资源 本文翻译自DXSDK,其中DX11与DX10相一致,故只翻译了DX10部分. 翻译:Chu @ XDU 2012/11/19 转载请注明出处:http:// ...

  9. samba不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接

    背景: 背景一:同一台电脑A,访问过服务器的一个samba共享文件夹B,此时再访问服务器的另一个共享文件夹C时显示访问出错,再访问共享文件夹B时也显示访问出错,出错信息如下: 无法访问,你可能没有权限 ...

最新文章

  1. 作业05-继承、多态、抽象类与接口
  2. Windows下使用Dev-C++开发基于pthread.h的多线程程序
  3. nboot通过DNW下载并运行eboot.nb0
  4. “大树底下”的阿里电商 淘品牌的“配角变名角”
  5. OpenCV学习(1) OpenCV的安装
  6. 上海三校生应用计算机考试试卷,三校生计算机考试试题.doc
  7. Java案例:连接SQL Server数据库,显示学生表记录
  8. 白板随手一画,嗖嗖变成代码
  9. 怎么把VC++的注释语句调成其他颜色,只调注释语句
  10. 下列哪种不是python元组的定义方式_python笔试题
  11. 流程图基本图形的含义
  12. 2022-2027年中国认证检验检测行业市场全景评估及发展战略研究报告
  13. 4000汉字无一重字
  14. Ansys2019R2安装失败,更改用户名后win10用户创建临时账户登录个人总结
  15. 聊一聊芯片后端的标准单元-standard cell
  16. 全国近三成高考状元被曝有加分(图)
  17. html5文本缩进,CSS怎样缩进文本?
  18. 沃尔沃集团与戴姆勒卡车将成立燃料电池合资公司;科济生物完成超1.8亿美元C轮融资 | 美通企业日报...
  19. 用C语言实现电脑小游戏——扫雷
  20. 微信小程序抽奖插件分享

热门文章

  1. 计算机组装与维修教学反思,计算机组装维护课程教学反思.doc
  2. 利用python自己动手制作一个音乐下载器,想听什么歌自己下就好了。
  3. 进退两难——一个项目经理的日记(精典)[转]
  4. 共识机制——POS与DPOS探究
  5. (附源码)Springboot电子病历管理 毕业设计 010350
  6. EditPlus打开.tpl文件高亮显示代码
  7. Pymol入门教程--动画制作
  8. Ubuntu和Win双系统连接罗技蓝牙键盘/鼠标时:在win下Keys下面没有对应linux设备的蓝牙地址
  9. 牛客/赛码 编程题 javascript 的本地调试
  10. java调用腾讯会议api,开会录制问题