【问题标题】:Unexpected crashes in Vulkan geometry shaderVulkan 几何着色器中的意外崩溃
【发布时间】:2017-01-09 01:53:53
【问题描述】:

在 Vulkan 几何着色器中进行浮点比较时,我遇到了奇怪的崩溃。着色器代码如下:

#version 450
#extension GL_ARB_separate_shader_objects : enable
#extension GL_ARB_shading_language_420pack : enable

layout (triangles) in;
layout (triangle_strip,  max_vertices=3) out;

layout(binding = 0) uniform UniformBufferObject {
    mat4 modelView;
    mat4 staticModelView;
} ubo;

in vec2 texCoordGeom[];

layout(location = 0) out vec2 texCoord;

void main() {
    float dist0 = length(gl_in[0].gl_Position.xyz - gl_in[1].gl_Position.xyz);
    float dist1 = length(gl_in[1].gl_Position.xyz - gl_in[2].gl_Position.xyz);
    float dist2 = length(gl_in[0].gl_Position.xyz - gl_in[2].gl_Position.xyz);

    float maxDist = max(dist0, max(dist1, dist2));

    if(maxDist < 0.01) {
        gl_Position = ubo.modelView * gl_in[0].gl_Position;
        texCoord = texCoordGeom[0];
        EmitVertex();

        gl_Position = ubo.modelView * gl_in[1].gl_Position;
        texCoord = texCoordGeom[1];
        EmitVertex();

        gl_Position = ubo.modelView * gl_in[2].gl_Position;
        texCoord = texCoordGeom[2];
        EmitVertex();
        EndPrimitive();
    }
}

它似乎在条件下崩溃:

if(maxDist < 0.01)

当我删除这个条件时,代码运行没有问题。如果我将阈值的值从 0.01 更改为更大的值,例如 0.1 或 1,代码再次运行没有问题。

请注意,我正在使用 VulkanSDK 中的 glslangValidator.exe 来编译着色器代码。除了警告之外,不会引发任何验证错误:

警告,450 版尚未完成;大多数特定于版本的功能都存在,但有些缺失。

另请注意,当整个 GPU 冻结(屏幕暂时变黑)并且程序退出时程序确实崩溃时,不会引发任何有用的错误。

【问题讨论】:

  • 如果驱动程序因遇到 TDR 而被重置,则很难判断是什么原因。我的第一个怀疑是驱动程序中的 SPIR-V 反射错误,但如果着色器实际上正在工作,如果你只是改变你比较的值我不认为这是这种情况。版本警告顺便说一句。可以忽略。关于着色器,我要改变的一件事是始终调用 EndPrimitive,即使没有生成顶点。如果它仍然崩溃,您可能需要做一个 repo 案例并将其传递给代码崩溃的 IHV。
  • 另外,您要求 GLSL 4.50。这包括您要求的两个扩展。那么……你为什么要找他们?
  • 这似乎对我有用。因此,glslangValidator (1.0.37 SDK) 和着色器代码可能没有任何问题。尝试其他驱动程序。
  • 您引用的错误来自 GLSL 编译。您是否使用一些扩展在运行时编译它们?不用那个试试(它可能使用过时的编译器)。
  • 我没有使用任何扩展在运行时进行编译。我在运行应用程序之前预编译着色器。 @SaschaWillems,无论是否生成顶点,我都尝试调用 EndPrimitive 并且这似乎没有帮助。谢天谢地,自从我将 Vulkan SDK 和驱动程序都更新到了最新的 12 月版本后,问题似乎自行解决了。

标签: c++ glsl vulkan


【解决方案1】:

对于未来的读者来说,这似乎是一个驱动程序问题。由于更新到最新的驱动程序(Radeon 驱动程序打包版本 16.50.2011-161219a-309792E) 以及最新的 LunarG Vulkan SDK (1.0.37.0) 问题已自行解决。注意我正在运行 AMD Radeon R9 380 系列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 2015-10-08
    相关资源
    最近更新 更多