Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Glsl 扩展以增加编译着色器程序的最大寄存器数?_Glsl_Vulkan - Fatal编程技术网

Glsl 扩展以增加编译着色器程序的最大寄存器数?

Glsl 扩展以增加编译着色器程序的最大寄存器数?,glsl,vulkan,Glsl,Vulkan,我正在尝试将GLSL代码中的内核存储为vec4的直接数组,如下所示: vec4 kernel1[512] = vec4[512]( vec4(0,0,0,0), ...); vec4 kernel2[512] = vec4[512]( vec4(0,0,0,0), ...); vec4 identity matrix[4] = vec4[4](...); 所有这些都在GLSL代码中使用。现在的问题是,vulkan无法使用着色器,调试扩展将报告以下错误消息: 超过XXXXX时的恒定寄

我正在尝试将GLSL代码中的内核存储为vec4的直接数组,如下所示:

vec4 kernel1[512] = vec4[512](
   vec4(0,0,0,0), ...);
vec4 kernel2[512] = vec4[512](
   vec4(0,0,0,0), ...);
vec4 identity matrix[4] = vec4[4](...);
所有这些都在GLSL代码中使用。现在的问题是,vulkan无法使用着色器,调试扩展将报告以下错误消息:

超过XXXXX时的恒定寄存器限制;编译程序需要超过1024个寄存器


我在dx11代码中有相同的设置,一切正常。我想知道是否有一个扩展允许我使用更多1024个寄存器。如果您知道另一种在vulkan中具有相同设置的解决方案,我将不胜感激。

为该着色器生成的SPIR-V是对您的代码的非常简单的翻译。驱动程序的编译器需要在某个位置存储至少1024个vec4文本值,以创建动态数组。将其视为存储在代码段中的数据。显然,这超出了Nvidia的一些内部限制(这可能是无效的,但您无论如何都不想这样做,请参见下文)

我手头没有DX11 fxc,但如果我没记错的话,它需要这样的代码,并将kernel1和kernel2声明移动到一个隐藏的常量缓冲区中,该缓冲区是为hlsl编译器保留的。这是由前端编译器完成的,而不是由驱动程序的编译器完成的(尽管驱动程序可以将保留的常量缓冲区映射到代码段数据,或者映射到普通常量缓冲区插槽,或者其他任何它想要的东西)


Vulkan和SPIR-V没有为编译器保留的统一(常量)缓冲区绑定,但是您需要的实际上与HLSL编译器所做的相同。只需将这些声明替换为统一的缓冲区声明,并通过API将数据放入这些缓冲区。

为该着色器生成的SPIR-V是对代码的非常简单的翻译。驱动程序的编译器需要在某个位置存储至少1024个vec4文本值,以创建动态数组。将其视为存储在代码段中的数据。显然,这超出了Nvidia的一些内部限制(这可能是无效的,但您无论如何都不想这样做,请参见下文)

我手头没有DX11 fxc,但如果我没记错的话,它需要这样的代码,并将kernel1和kernel2声明移动到一个隐藏的常量缓冲区中,该缓冲区是为hlsl编译器保留的。这是由前端编译器完成的,而不是由驱动程序的编译器完成的(尽管驱动程序可以将保留的常量缓冲区映射到代码段数据,或者映射到普通常量缓冲区插槽,或者其他任何它想要的东西)


Vulkan和SPIR-V没有为编译器保留的统一(常量)缓冲区绑定,但是您需要的实际上与HLSL编译器所做的相同。只需将这些声明替换为统一的缓冲区声明,并通过API将数据放入这些缓冲区。

听起来像是驱动程序消息。您是否在禁用验证层(但启用调试扩展)的情况下收到该消息?@KrOoze否,两者都已启用。据我所知,要使调试扩展工作,验证层也需要启用。通常它们可以独立使用(您可以查询
vkEnumerateInstanceExtensionProperties(nullptr,…)
,此外,在创建实例时,您会得到
VK\u ERROR\u extension\u NOT\u PRESENT
)。我只想验证消息是否来自驱动程序,而不是来自验证层。在这一点上,我将告诉您,TMK Vulkan并没有施加这样的限制(这都是关于这个特定的驱动程序实现的),因此没有任何扩展可以提供帮助。然后我建议使用统一的缓冲区。为什么nvidia实现的vk驱动程序比dx11更受限制?这有意义吗?即时数组不是比统一缓冲区快吗?考虑到OpenGL存在与完全相同的消息相关的问题,我认为这是某种驱动程序代码库继承。另一种世界观可能是DX11在你背后做了一些事情来让它工作,你为此付出了未知的代价。而Vulkan驱动程序版本试图坚持明确性的范式,并试图告知您偏离了快速路径。无论哪种方式,这都是NV的问题;;我不会猜哪个更快。但是统一缓冲区是为“中等大小的常量数组”设计的,你似乎有这些。听起来像是一条驱动程序消息。您是否在禁用验证层(但启用调试扩展)的情况下收到该消息?@KrOoze否,两者都已启用。据我所知,要使调试扩展工作,验证层也需要启用。通常它们可以独立使用(您可以查询
vkEnumerateInstanceExtensionProperties(nullptr,…)
,此外,在创建实例时,您会得到
VK\u ERROR\u extension\u NOT\u PRESENT
)。我只想验证消息是否来自驱动程序,而不是来自验证层。在这一点上,我将告诉您,TMK Vulkan并没有施加这样的限制(这都是关于这个特定的驱动程序实现的),因此没有任何扩展可以提供帮助。然后我建议使用统一的缓冲区。为什么nvidia实现的vk驱动程序比dx11更受限制?这有意义吗?即时数组不是比统一缓冲区快吗?考虑到OpenGL存在与完全相同的消息相关的问题,我认为这是某种驱动程序代码库继承。另一种世界观可能是DX11在你背后做了一些事情来让它工作,你为此付出了未知的代价。而Vulkan驱动程序版本试图坚持明确性的范式,并试图告知您偏离了快速路径。无论哪种方式,这都是NV的问题;;我不会猜哪个更快。但统一缓冲区是为“中等大小的常量数组”而设计的,您似乎有这些。