使用NVIDIA SDK 11.1对DirectX 12进行编码

描述

DirectX 12 是 Microsoft 提供的一种低级编程 API ,与以前的版本相比,它减少了驱动程序开销。 DirectX 12 使用命令队列、命令列表等在底层硬件上提供了更大的灵活性和细粒度控制,从而提高了资源利用率。您可以利用这些功能,优化应用程序,并获得比早期 DirectX 版本更好的性能。同时,应用程序本身必须负责资源管理、同步等。

越来越多的游戏标题和其他图形应用程序采用 DirectX12 API 。视频编解码器 SDK 11 . 1 在 Windows 20H1 及更高版本的操作系统上引入了 DirectX 12 编码支持。这使 DirectX 12 应用程序能够在所有受支持的 GPU 代中使用 NVENC 。视频编解码器 SDK 包包含 Nvencodepi 头文件、演示用法的示例应用程序以及使用 API 的编程指南。示例应用程序包含 C ++包装类,可以根据需要重用或修改。

typedef struct _NV_ENC_FENCE_POINT_D3D12
 {
     void*                   pFence; /**< [in]: Pointer to ID3D12Fence. This fence object is  
                                                used for synchronization. */
     uint64_t                value;  /**< [in]: Fence value to reach or exceed before the GPU 
                                                operation or fence value to set the fence to,                                                                
                                                after the GPU operation. */ 

初始化 NVENC 时,客户端应用程序还必须指定输入缓冲区格式。

尽管在 DirectX 12 中传递给 Encode picture API 的大多数参数与其他接口中的参数相同,但仍存在某些功能差异。输入端(客户端应用程序写入输入面, NVENC 读取输入面)和输出端( NVENC 写入位流面,应用程序读取位流面)的同步必须使用 fences 进行管理。这与以前的 DirectX 接口不同,后者由操作系统运行时和驱动程序自动处理。

在 DirectX 12 中,需要有关围栏和围栏值的附加信息作为编码图片 API 的输入参数。这些围栏和围栏值用于同步 CPU – GPU 和 GPU – GPU 操作。应用程序必须在NV_ENC_PIC_PARAMS::inputBuffer和NV_ENC_PIC_PARAMS:: outputBitstream中发送以下输入和输出结构指针,其中包含围栏和围栏值:

typedef struct _NV_ENC_INPUT_RESOURCE_D3D12
 {
     NV_ENC_REGISTERED_PTR       pInputBuffer
     NV_ENC_FENCE_POINT_D3D12    inputFencePoint;       
     …
 } NV_ENC_INPUT_RESOURCE_D3D12;
  
 typedef struct _NV_ENC_OUTPUT_RESOURCE_D3D12
 {
     NV_ENC_REGISTERED_PTR      pOutputBuffer;
     NV_ENC_FENCE_POINT_D3D12   outputFencePoint;     
     … 

要在异步操作模式下检索编码输出,应用程序应在调用NvEncLockBitstream之前等待完成事件。在同步操作模式下,应用程序可以调用NvEncLockBitstream,因为 NVENCODE API 在返回编码输出之前确保编码已完成。但是,在这两种情况下,客户机应用程序都应该在NV_ENC_LOCK_BITSTREAM::outputBitstream中传递指向NV_ENC_OUTPUT_RESOURCE_D3D12的指针,该指针在NvEncEncodePicture API 中使用。

关于作者

Dipti Taur 是 NVIDIA 多媒体驱动程序团队的高级系统软件工程师。她曾从事DirectX 12的各种视频编解码器、视频驱动程序开发和应用程序编程接口设计。她拥有印度孟买IIT电子工程硕士学位,专业从事通信和信号处理。

Sampurnananda Mishra 是 NVIDIA 负责多媒体驱动程序的高级经理。他研究过 NVIDIA GPU s 上支持的各种多媒体用例。他的兴趣包括视频编码、计算机视觉、视频安全、深度学习和系统软件。他拥有印度 IIT 坎普尔电子工程硕士学位,主攻数字信号处理。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分