我目前正在重构大量旧代码,并最终深入到 HLSL
部分,由于缺乏实践,我的知识很少。我遇到过some documentation在线指定哪些寄存器用于哪些目的:
- t – for shader resource views (SRV)
- s – for samplers
- u – for unordered access views (UAV)
- b – for constant buffer views (CBV)
这部分是非常不言自明的。如果我想创建一个常量缓冲区,我可以声明为:
cbuffer LightBuffer: register(b0) { };
cbuffer CameraBuffer: register(b1) { };
cbuffer MaterialBuffer: register(b2) { };
cbuffer ViewBuffer: register(b3) { };
但是,来自 MIPS Assembly
的世界,我不禁想知道这些是否有有限和受限的范围。例如,在 MIPS Assembly
中,临时寄存器被限制在 t0 - t7
范围内。就 HLSL 而言,我无法找到围绕该主题的任何文档,因为所有内容似乎都指向汇编语言和微处理器(例如 8051,如果您想阅读随机主题)上)。
HLSL 中的四种寄存器类型是否有一个设定范围,或者我是否只是按顺序继续所需的数量,并让底层程序集处理困惑的细节?
注意
我已经部分回答了这个问题,因为我目前无法找到 u
的范围;然而,如果有人有比我通过测试给出的更好、更详细的答案,那么请随意发布它,我会将其标记为正确答案。我将在2018 年 12 月 1 日之前开放这个问题,以便其他人有机会为 future 的读者提供更好的答案。
最佳答案
资源槽计数(对于 d3d11,实际上 d3d12 情况扩展了)在 Resource Limit 中指定msdn 页面。
您感兴趣的是:
- D3D11_COMMONSHADER_INPUT_RESOURCE_REGISTER_COUNT(即 t)= 128
- D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT(即 s)= 16
- D3D11_COMMONSHADER_CONSTANT_BUFFER_HW_SLOT_COUNT(即 b)= 15,但保留一个用于最终存储来自着色器的一些常量数据(例如,如果您有一个静态 const 大数组)
u 的情况有所不同,因为它取决于功能级别(而且说实话,这是供应商/操作系统版本的困惑):
- D3D11_FEATURE_LEVEL_11_1 或更高版本,这是 64 个插槽
- D3D11_FEATURE_LEVEL_11:它始终是 8(但某些卡/驱动程序最终支持 64,您至少需要 Windows 8(它也可能在 Windows 7 中提供一些平台更新)。我不记得有什么方法测试是否支持 64(例如,许多 nvidia 的 700 系列都支持)。
- D3D11_FEATURE_LEVEL_10_1:0 或 1,有一种方法可以检查是否支持计算
您需要执行feature check :
D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS checkData;
d3dDevice->CheckFeatureSupport(D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS, &checkData);
BOOL computeSupport = checkData.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x
请注意,对于某些操作系统/驱动程序版本,我在不支持的情况下返回 TRUE (Intel 在 win7/8 上这样做),因此在这种情况下,唯一有效的解决方案是尝试创建一个小的 Raw/字节地址缓冲区或结构化缓冲区并检查 HRESULT
作为旁注,功能级别 10 或更低的功能级别适用于当今相当旧的配置,因此除了极少数情况外,您可能可以安全地忽略它(我只是将其保留以供引用)。
关于range - HLSL 中的寄存器范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53340681/