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交互的更多相关文章

  1. GPUImage移植总结

    项目github地址: aoce 我是去年年底才知道有GPUImage这个项目,以前也一直没有在移动平台开发过,但是我在win平台有编写一个类似的项目oeip(不要关注了,所有功能都移植或快移植到ao ...

  2. 整合Yolov3到游戏引擎

    这篇其实是前文 CUDA版Grabcut的实现 的后续,和上文一样,先放视频. (博客园好像不支持视频,gif文件太大,视频链接) 在上文用CUDA实现opencv下的grabcut后,当时问题主要是 ...

  3. Vulkan Tutorial 05 逻辑设备与队列

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 在选择要使用的物理设备之后,我们需要设置一个逻辑设备用于交 ...

  4. Vulkan Tutorial 07 Window surface

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 到目前为止,我们了解到Vulkan是一个与平台特性无关联的API集合.它不能直接与窗 ...

  5. Vulkan入门流程

    原文摘自Vulkan入门流程 Vulkan是Khronos Group(OpenGL标准的维护组织)开发的一个新API,它提供了对现代显卡的一个更好的抽象,与OpenGL和Direct3D等现有api ...

  6. Vulkan vs OpenGL ES

    Vulkan 简介 Vulkan是一个免费开放的.跨平台的.底层的图形API,在一定程度上比AMD Mantle.微软DirectX 12.苹果Metal更值得开发者关注. Vulkan的最大任务不是 ...

  7. Vulkan Tutorial 06 逻辑设备与队列

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 在选择要使用的物理设备之后,我们需要设置一个逻辑设备用于交 ...

  8. Vulkan Tutorial 03 理解Instance

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Creating an instance 与Vulkan打交道,通常的步骤是创建一个 ...

  9. [译]Vulkan教程(09)窗口表面

    [译]Vulkan教程(09)窗口表面 Since Vulkan is a platform agnostic API, it can not interface directly with the ...

随机推荐

  1. C++ STL getline()函数

    getline() C++11 <string> 函数原型 //(1) istream& getline (istream& is, string& str, ch ...

  2. 2021 Duilib最新入门教程(一)Duilib简介

    目录 Duilib解决什么问题? 方案一.自己画界面 方案二.使用标准控件 方案三.使用Duilib框架 Duilib是什么? 先看下Duilib官方简介 再看下DirectUI 百度百科   比起介 ...

  3. 【Android】关于连续多次点击控件的控制方案(新建监听类)

    参考:防止Android过快点击造成多次事件的三种方法_胖胖的博客-CSDN博客 实现逻辑很简单: 设置限定时间 在用户点击时开始计时 若计时未超过限定时间,则不允许触发点击事件 因还未学习过Rxja ...

  4. java进阶(33)--IO流

    一.IO流概念:1.基本概念2.IO流分类3.java.io流的四大家族4.流的close和flush方法5.java.id下常用的16个流 二.FileInputStream字节输入流1.FileI ...

  5. Python Debug工具

    最近在github上冒出了一个python的debug神器PySnooper,号称在debug时可以消灭print.那么该工具有哪些优点呢,如何使用该工具呢.本文就介绍该工具的优缺点和使用方式. 前言 ...

  6. Java并发包源码学习系列:阻塞队列BlockingQueue及实现原理分析

    目录 本篇要点 什么是阻塞队列 阻塞队列提供的方法 阻塞队列的七种实现 TransferQueue和BlockingQueue的区别 1.ArrayBlockingQueue 2.LinkedBloc ...

  7. Django--虛擬環境Virtualenv的安裝使用

    Django--虛擬環境Virtualenv的安裝使用 本次隨筆只要記錄在windows下安裝virtualenvwrapper,以及簡單的使用命令. virtualenvwrapper的安裝     ...

  8. h3c交换机配置ssh密码验证登录方式

    一.背景: 1.由于PC机串口不支持热插拔,请不要在交换机带电的情况下,将串口插入或者拔出PC机.当连接PC和交换机时,请先安装配置电缆的DB-9端到PC机,再连接RJ-45到交换机:在拆下时,先拔出 ...

  9. 浅析Linux进程空间布局

    一.进程空间分布概述 对于一个进程,其空间分布如下图所示: 1.参数说明 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码. 初始化过的数据(Data):在程序运行初已经对变量进行初 ...

  10. 淘宝APP消息推送模型

    为什么到了2020年,"统一推送联盟"依旧无法起显著作用? - 知乎 https://www.zhihu.com/question/370632447 https://mp.wei ...