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 ...
随机推荐
- Linux 文件查看相关的一些命令
文件压缩解压命令 # 解压 xxx.xz 并删除 xz -d test.tar.xz # 打包成 xxx.tar , 语法: tar -cvf 最后包名.tar ./要打包文件 ./要打包的文件 ta ...
- 【CRS】vipca最后一步执行报错CRS-0215
当我们在安装Clusterware 的时候, 需要在第二节点上vipca , 配置到最后安装的时候, 安装到 75% 左右,报错: CRS-0215 : Could not start res ...
- kubernets之向外部应用暴露应用
一 通过NodePort来暴露服务 前面已经介绍的服务的一些作用,例如将集群内部的应用暴露给集群内部的pod使用,将外部的应用通过服务暴露给内部应用使用,但是服务最大的作用不仅仅是这些 而是将集群内 ...
- postman接口测试之复制多个接口或collections到某个子文件夹或collections下
一.痛点 1.postman只支持复制一个请求,或者一个子文件夹,但是不支持复制多个请求,或者整个collections到某个子文件夹或者某个collections下. 2.网上查了好一会儿,没有一个 ...
- PKU2186 Popular Cows 受欢迎的牛
题目描述 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N(N<=10000)头牛,给你M(M<=50000)对整数(A,B),表示牛A认为牛B受欢迎.这种关系是具有传递性的,如果A认为B ...
- 求得二叉搜索树的第k小的元素
求得二叉搜索树的第k小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 须知:二叉搜索树,又叫二叉排序树,二叉查找树.特点是:左子树的所有元素都小于等 ...
- 庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境
庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境 一.介绍 说起微服务架构来,有一个环节是少不了的,那就是CI/CD持续集成的环境.当然,搭建CI/CD环境的工具很多, ...
- websocket的应用---Django
websocket的应用---Django 1.长轮询 轮询:在前端通过写js实现.缺点:有延迟.服务器压力大. 就是客户端通过一定的时间间隔以频繁请求的方式向服务器发送请求,来保持客户端和服务器端的 ...
- Crunch
Crunch 目录 1. 简介 2. 命令格式 3. options可选参数 3.1 -b number[type] 3.2 -c number 3.3 -d numbersymbol 3.4 -e ...
- 浅析Linux进程空间布局
一.进程空间分布概述 对于一个进程,其空间分布如下图所示: 1.参数说明 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码. 初始化过的数据(Data):在程序运行初已经对变量进行初 ...