AMD Render Pipeline Shaders SDK 介绍

最初发布时间:
Zhuo Chen's avatar
Zhuo Chen
Florian Herick's avatar
Florian Herick
Noah Cabral's avatar
Noah Cabral

我们很高兴地宣布,我们的 Render Pipeline Shaders (RPS) SDK 现已开放公开测试!

什么是 Render Pipeline Shaders (RPS) SDK?

RPS SDK 是一个全面且可扩展的渲染图(Render Graph)框架,专为使用显式 API(如 DirectX® 12 和 Vulkan®)的图形应用程序和引擎而设计。

背景

显式图形 API 的设计目的是减少命令录制开销,并在驱动 GPU 时实现更高的 CPU 并行度。由于其低级和状态较少的特性,诸如数据依赖性跟踪和同步之类的任务落到了 API 用户而非 GPU 驱动程序的肩上。

高效的瞬态内存管理也是一个重要方面。有状态的、按需生成的屏障和资源分配常常会导致性能不佳。

渲染图(也称为帧图或任务图)已被提议作为解决这些问题的优雅高效的方案。通过对整个帧及其各个通道(节点)之间的依赖关系进行概览,可以更有效地安排内存、屏障和工作负载。然而,在实践中,从头开始实现渲染图系统并非易事,并且需要不断努力才能使其在硬件、API 和内容不断演进的过程中保持最佳状态。在不同的渲染图系统之间移植效果和技术也可能耗费额外的工程时间。

RPS SDK 如何工作

RPS SDK 旨在使渲染图更易于访问,并提供一个普遍最优的屏障生成器和(别名)内存调度程序。它具有类似编译器的架构,包括用于指定资源和节点序列的前端,用于将线性节点序列编译成图并进行调度的运行时编译器,以及用于将计划好的渲染图转换为图形 API 命令的运行时后端。

image

RPS 还通过扩展 HLSL 的属性和内部函数来创建一个用于渲染图编程的领域特定语言,从而简化渲染图的构建。这允许通过高级的声明式编程模型隐式地指定渲染图,使用户能够专注于渲染管线逻辑而非节点配置细节。在节点声明时指定的访问属性和语义会在编译时(offline)转换为节点签名元数据,这些元数据可在运行时用于屏障生成、描述符创建和资源绑定。

// Node declarations
node Triangle([readwrite(rendertarget)] texture renderTarget : SV_Target0);
// Sample RPSL code
node Upscale ([readwrite(rendertarget)] texture dest : SV_Target0,
[readonly(ps)] texture source);
// Render Graph entry point
export void hello_rpsl([readonly(present)] texture backBuffer)
{
// Declare a transient texture resource
const ResourceDesc backBufferDesc = backBuffer.desc();
texture offscreen = create_tex2d(backBufferDesc.Format, uint(backBufferDesc.Width) / 2, uint(backBufferDesc.Height) / 2);
// Built-in clear node
clear(offscreen, float4(0.0, 0.2, 0.4, 1.0));
// Render to offscreen texture with user defined "Triangle" node
Triangle(offscreen);
// Blt offscreen to backbuffer with user defined "Upscale" node
Upscale(backBuffer, offscreen);
}

在运行时,应用程序可以设置变量并执行 RPSL 代码(或构建渲染图的 C/C++ API 的用户回调函数),从而生成完全动态的渲染图。这将生成一个活动资源和节点的列表。资源和每节点数据可以在帧之间高效缓存。运行时编译器首先遍历列表,根据节点签名和参数数据解析节点依赖关系,并在必要时插入过渡节点,生成一个 DAG,然后将其传递给调度程序。默认调度程序根据各种因素(如屏障批处理、内存使用量和占用空间、输入节点排序、队列切换要求等)对 DAG 进行调度。它还提供一组标志来控制调度行为,例如强制程序顺序、优先节省内存占用(通过积极的别名)或优先最大化屏障批处理。RPSL 还支持一组用于精细控制的语言构造。

image

一个 RPS 调度的帧示例(底部),与真实游戏跟踪中的原始帧(顶部)相比

image

一个计划好的内存布局示例,显示在帧(X 轴)的事件中由别名资源复用的堆空间(Y 轴)

image

应用程序可以动态地将节点实现回调函数绑定到渲染图实例。后端可以处理 API 对象(如堆、资源和描述符)以及 Vulkan® 的 FrameBuffers 和 RenderPasses 的创建。在支持的情况下,它还可以绑定资源(目前支持绑定大多数非着色器资源),或设置视口和剪刀矩形等基本渲染状态。这减少了节点回调中的样板代码。

RPS 可以渐进地集成到引擎和应用程序中。通过自底向上的方法,它可以用来实现渲染器的仅一小部分模块,例如多通道后处理技术。通过自顶向下的方法,它可以作为帧的骨架,而每个节点都可以是独立的、多通道的技术。RPS 渲染图也是可组合的;例如,一个渲染图可以用作另一个渲染图中的节点。

在支持下进行尝试!

完整的源代码现已在 GitHub 上提供,受存储库根目录中 `LICENSE.rtf` 文件中包含的 AMD 评估许可证约束。

如需在此公开测试期间获得支持,请联系您的 AMD 代表,或在 Twitter 上发送私信至 @GPUOpen@GPUOpen@mastodon.gamedev.place。在公开测试期间,我们可能无法及时回复 Twitter 或 Mastodon 上的消息,但您的反馈仍然非常宝贵,我们会阅读并尽力回复每一位用户。

Zhuo Chen's avatar

Zhuo Chen

Zhuo Chen 是 AMD 的 GPU DevTech 工程师,专注于性能优化。他热爱资源屏障,但也希望减少它们的使用。
Florian Herick's avatar

Florian Herick

Florian Herick 是软件工程师,也是 DevTech 工程师核心技术组的成员,在那里他从事激动人心的、最前沿的渲染技术工作。在获得慕尼黑工业大学(TUM)硕士学位期间,他曾在 AMD 实习,之后作为全职员工加入公司,帮助推动引擎和实时图形开发的边界。
Noah Cabral's avatar

Noah Cabral

Noah Cabral 是 AMD 核心技术组的图形研发实习生。他对计算机科学和计算机图形学的一切都怀有长久的热情,并希望为最先进的实时图形的发展做出贡献。

相关新闻和技术文章

© . This site is unofficial and not affiliated with AMD.