图形/仿真

使用 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. */
 } NV_ENC_FENCE_POINT_D3D12; 

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

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

在 DirectX 12 中,需要有关围栏和围栏值的附加信息作为编码图片 API 的输入参数。这些围栏和围栏值用于同步 CPU – GPU 和 GPU – GPU 操作。应用程序必须在NV_ENC_PIC_PARAMS::inputBufferNV_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;     
     …
 } NV_ENC_OUTPUT_RESOURCE_D3D12; 

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

有关更多信息,请参阅视频编解码器 SDK 编程指南。与其他 DirectX 接口相比, DirectX 12 中的编码器性能接近。编码器质量在所有接口上都是相同的。

 

Tags