range - HLSL 中的寄存器范围?

标签 range hlsl

我目前正在重构大量旧代码,并最终深入到 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/

相关文章:

javascript - 范围对象 : differences between Webkit and Mozilla based browsers

Python - For 循环和计数器

Python - FizzBu​​zz - 如何同时打印数字和字符串

c# - WPF 中的像素着色器效果

c - HLSL:浮点赋值中的比较运算符

c++ - 在 DirectX 着色器中修改曲面 segmentation 顶点

opengl - GLSL 中的 HLSL cbuffer 等效项

directx - HLSL 纹理采样器中尖括号和圆括号之间的区别

Python 3 范围与 Python 2 范围

java - 循环遍历 txt 文件,查找某个范围内的数字及其平均值