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 ...
随机推荐
- rm: cannot remove `/tmp/localhost-mysql_cacti_stats.txt': Operation not permitted
[root@DBslave tmp]# chown zabbix.zabbix /tmp/localhost-mysql_cacti_stats.txt
- a[i][j] 和 a[j][i] 有什么区别?
本文以一个简单的程序开头--数组赋值: int LEN = 10000;int[][] arr = new int[LEN][LEN]; for (int i = 0; i < LEN; i++ ...
- 【Nginx】配置nginx图片服务器
想通过nginx来访问服务器上的图片 可以搭建一个nginx图片服务器. 做法如下: 先安装nginx,这里直接用yum来进行安装的 安装方法如下: https://blog.csdn.net/iml ...
- 物理STANDBY库创建还原点(打开为read write后再变回主库)
开启STANDBY库为READ WRITE 1.取消主库传送归档 SQL> alter system set log_archive_dest_state_2=defer; 2.取消备库应用日志 ...
- Windows系统使用运行框运行程序
配置步骤 1. 在非系统盘创建一个新文件夹,自定义名称.将需要使用运行框启动的程序或文件放入文件夹,并将其更改为自己容易记忆的名称 2. 创建环境变量 右击 "此电脑" → &qu ...
- 阿里面试常问的redis数据结构,建议收藏
关于Redis redis是一个开源的使用C语言编写的一个kv存储系统,是一个速度非常快的非关系远程内存数据库.它支持包括String.List.Set.Zset.hash五种数据结构.除此之外,通过 ...
- C#+Layui开发后台管理系统
我是笑林新记,分享一下我一套C#开发的后台管理系统,希望对大家有帮助!欢迎关注微信公众号:笑林新记 后台开发语言:C# 前端框架:layui 前天用毛笔笔画制作了一个毛笔字效果的Logo,主 ...
- Linux sudo权限提升漏洞整改方法
一.漏洞概述 1月26日,Sudo发布安全通告,修复了一个类Unix操作系统在命令参数中转义反斜杠时存在基于堆的缓冲区溢出漏洞.当sudo通过-s或-i命令行选项在shell模式下运行命令时,它将在命 ...
- jmeter进行分布式压测过程与 注意事项
jmeter命令行运行但是是单节点下的, jmeter底层用java开发,耗内存.cpu,如果项目要求大并发去压测服务端的话,jmeter单节点难以完成大并发的请求,这时就需要对jmeter进行分布式 ...
- c#使用谷歌身份验证GoogleAuthenticator
此功能相当于给系统加了个令牌,只有输入对的一组数字才可以验证成功.类似于QQ令牌一样. 一丶创建最核心的一个类GoogleAuthenticator 此类包含了生成密钥,验证,将绑定密钥转为二维码. ...