与NV12表面的D3D11VA / CUDA互操作性问题

时间:2016-10-17 12:28:14

标签: cuda direct3d11

我正在尝试构建一个转码管道,其中视频使用D3D11VA解码,然后带到CUDA,可选地使用CUDA内核进行修改和/或分析,最后使用NVENC进行编码(使用CUDA-NVENC互操作);想法是在没有视频帧的情况下在GPU上做所有事情。我能做的一件事:

  • D3D11VA解码工作(使用带有20个NV12格式表面的Texture2D阵列绑定到视频解码器);解码器为每个解码帧提供了这个数组的索引
  • 我可以通过使用与解码数组相同尺寸和格式的单独Texture2D轻松地将数据输出到主存储器,但使用D3D11_USAGE_STAGINGD3D11_CPU_ACCESS_READ;一旦解码器为我提供了解码器阵列的索引,我只需从解码器阵列切片到此分段纹理CopySubresourceRegion,然后映射分段纹理并读取数据(我可以成功读取Y和UV平面的数据) )
  • 我还可以将登台纹理注册为CUDA资源(即使CUDA手册没有将NV12列为支持的像素格式);然后,我可以映射此资源,将cudaGraphicsSubResourceGetMappedArray应用于资源,并将收到的cudaArray中的数据复制到malloced CUDA内存中。

所以问题是:我只能从cudaArray复制Y平面。我尝试了一切我能想到的从纹理中获取UV数据的方法无济于事。只有"解决方案"其工作原理是以R8格式创建另一个纹理,其原始纹理高度为1.5倍,创建两个着色器视图到分段纹理,并使用着色器将两个视图中的数据复制到此辅助纹理中;然后我可以将这个纹理映射到CUDA并将所有数据复制到CUDA内存中。

我真的不喜欢这个解决方案 - 它丑陋,臃肿,涉及额外无用的数据拷贝。有没有其他方法来实现这一目标?让CUDA看到NV12纹理中的所有数据,或者将NV12纹理中的所有数据复制到单个R8纹理或一对R8 / R8或R8 / R8G8纹理中的方法?

0 个答案:

没有答案