Vulkan与DX11交互
Demo演示地址07_wintest
有什么用
在android平台主流是用opengl es,android下vulkan与opengles纹理互通。 而在win平台,主流游戏还用的是DX11,如果只是把结果通过CPU的内存输出,然后接到dx11,这个性能损失太大了,我们就需要Vulkan与DX11交互。 以及完成这个交互后,aoce我就不做dx11模块了,我比较了oeip中的dx11模块与当前的vulkan模块性能相差不大,都比CUDA差,但是通用性更好。
主要实现
如果有兴趣,可以看下aoce_vulkan/win32/VkWinImage类的实现,dx11与vulkan绑定的逻辑主要在这。
与opengles交互类似,资料不多,主要看到vulkan下有个vulkan_win32的头文件,看到如VkImportMemoryWin32HandleInfoKHR这些结构,用google搜下,
可以看到BindImageMemory有比较完整的交互逻辑,主要就是用DX11Texture共享纹理,注意这里要用NT句柄,就是相关MiscFlags需要包含D3D11_RESOURCE_MISC_SHARED_NTHANDLE,而在cuda/dx11交互里用cudaGraphicsD3D11RegisterResource用NT句柄 会失败,所以最好用个标志表示是否需要NT句柄,NT句柄需要自己CreateSharedHandle,从NT句柄得到相应shader buffer需要通过ID3D11Device1拿到,余下的逻辑和非NT句柄差不多了,相关代码aoce_win/DX11/Dx11SharedTex查看具体实现。
然后就是按照cuda/dx11交互那样,vulkan最后输出结果到绑定dx11texture上的那个vkImage,然后在dx11渲染的另外一个线程把上面的dx11texture结果输出来就行,想的应该是这样,然后就开始不断启动就报device lost,然后启动几次后机器卡死/死机蓝屏,最开始我想的肯定是同步问题,继续在vulkan_win32的头文件找,找到如下VkWin32KeyedMutexAcquireReleaseInfoKHR结构,这个结构不就是 dx11不同线程交互的同步API的AcquireSync/ReleaseSync,根据这个结构搜索到dx11-vulkan-keymutex根据这里的逻辑改下,然后发现还是卡死/死机,我开始根据新增加代码一行行屏蔽测试,不断死机/蓝屏,最后我忽然想到解决动态启用/关闭层时遇到的一个问题,其中把运算结果复制给绑定dx11资源的vkImage,用的是vkCmdBlitImage,改成vkCmdCopyImage,然后问题解决,以前我因为vkCmdBlitImage里源和目标纹理不需要同样大小就一直用的这个,我猜测这个API应该是需要渲染管线与交换链那一套的, 在这里我只有计算管线所以会导致问题,后面有时间验证下这个问题。
这个问题解决后,可以正常运行了,但是,你不动窗口运行多久没问题,但是一动窗口vulkan就报timeout,而这timeout一看就是VkWin32KeyedMutexAcquireReleaseInfoKHR上面的, 我猜测在移动窗口时,导致绑定dx11texture上的那个vkImage那个资源一直被dx11渲染占用着,所以就有这个问题,而我设计输出层时,设计要求运行线程与输出线程没有等待关系,二个线程可以分别以自己桢率运行 ,就和我在cuda交互里的处理,设置timeout为0,检查锁,如果锁timeout,就马上放弃复制,线程继续运行,而在这,我并不能通过这个接口实现这种逻辑。
最后想了想,vulkan运行线程中,我可以用vkFence知道是否在执行commandbuffer,那么在二次执行中先复制结果一个临时dx11纹理中, 这样也不需要针对这个临时dx11纹理与vulkan执行线程同步,把原来的绑定dx11texture上的那个vkImage的MiscFlags中的D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX改成D3D11_RESOURCE_MISC_SHARED,然后把相关的 VkWin32KeyedMutexAcquireReleaseInfoKHR代码去掉,vulkan执行comandbuffer执行完成后,使用vkFence等待,等待完成后把绑定dx11texture上的那个vkImage输出到临时dx11纹理中。
最后在Dx11的渲染线程中,把临时dx11纹理结果拿出来渲染,现在移动窗口正常了。
Vulkan与DX11交互的更多相关文章
- GPUImage移植总结
项目github地址: aoce 我是去年年底才知道有GPUImage这个项目,以前也一直没有在移动平台开发过,但是我在win平台有编写一个类似的项目oeip(不要关注了,所有功能都移植或快移植到ao ...
- 整合Yolov3到游戏引擎
这篇其实是前文 CUDA版Grabcut的实现 的后续,和上文一样,先放视频. (博客园好像不支持视频,gif文件太大,视频链接) 在上文用CUDA实现opencv下的grabcut后,当时问题主要是 ...
- Vulkan Tutorial 05 逻辑设备与队列
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 在选择要使用的物理设备之后,我们需要设置一个逻辑设备用于交 ...
- Vulkan Tutorial 07 Window surface
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 到目前为止,我们了解到Vulkan是一个与平台特性无关联的API集合.它不能直接与窗 ...
- Vulkan入门流程
原文摘自Vulkan入门流程 Vulkan是Khronos Group(OpenGL标准的维护组织)开发的一个新API,它提供了对现代显卡的一个更好的抽象,与OpenGL和Direct3D等现有api ...
- Vulkan vs OpenGL ES
Vulkan 简介 Vulkan是一个免费开放的.跨平台的.底层的图形API,在一定程度上比AMD Mantle.微软DirectX 12.苹果Metal更值得开发者关注. Vulkan的最大任务不是 ...
- Vulkan Tutorial 06 逻辑设备与队列
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 在选择要使用的物理设备之后,我们需要设置一个逻辑设备用于交 ...
- Vulkan Tutorial 03 理解Instance
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Creating an instance 与Vulkan打交道,通常的步骤是创建一个 ...
- [译]Vulkan教程(09)窗口表面
[译]Vulkan教程(09)窗口表面 Since Vulkan is a platform agnostic API, it can not interface directly with the ...
随机推荐
- docker logs 查看容器日志操作
查看日志 官方文档:https://docs.docker.com/engine/reference/commandline/logs/ # 查看指定数量的实时日志 # docker logs -tf ...
- 【十天自制软渲染器】DAY 02:画一条直线(DDA 算法 & Bresenham’s 算法)
推荐关注公众号「卤蛋实验室」或访问博客原文,更新更及时,阅读体验更佳 第一天我们搭建了 C++ 的运行环境并画了一个点,根据 点 → 线 → 面 的顺序,今天我们讲讲如何画一条直线. 本文主要讲解直线 ...
- LeetCode563. 二叉树的坡度
题目 1 class Solution { 2 public: 3 int ans = 0; 4 int findTilt(TreeNode* root) { 5 postOrder(root); 6 ...
- 一文读懂k8s之Pod安全策略
导读 Pod容器想要获取集群的资源信息,需要配置角色和ServiceAccount进行授权.为了更精细地控制Pod对资源的使用方式,Kubernetes从1.4版本开始引入了PodSecurityPo ...
- 【2020CSP-S模拟赛day5】总结
爆零自闭赛 写在前面 于2022.11.1 这一次题目质量很高(以至于什么都不会) 再一度体验了省选Orz.比赛大体情况,刨去std, wzc神仙230分,比剩下的加起来都高.zyz神仙60分. 其余 ...
- python系统监控及邮件发送
python系统监控及邮件发送 #psutil模块是一个跨平台库,能轻松实现获取系统运行的进程和系统利用率 import psutil ...
- Mybatis总结(一)
Mybatis总结(一) 一.Mybatis启动流程(代码层面) 关于config.xml <?xml version="1.0" encoding="UTF-8& ...
- Correct the classpath of your application so that it contains a single, compatible version of org.thymeleaf.spring5.SpringTemplateEngine
Error starting ApplicationContext. To display the conditions report re-run your application with 'de ...
- Var_init class
1 import org.apache.hadoop.conf.Configuration; 2 import org.apache.hadoop.fs.FSDataInputStream; 3 im ...
- Linux 下安装 JDK
JDK 依赖包: yum install glibc.i686 卸载原有的 JDK 查看本机已安装软件:rpm -qa 查看与java相关的软件:rpm -qa | grep java 删除自带软件: ...