Vulkan 几何着色器意外崩溃
Unexpected crashes in Vulkan geometry shader
我在 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 冻结(屏幕暂时变黑)而崩溃并退出时,不会抛出有用的错误。
对于未来的读者来说,这似乎是一个驱动程序问题。由于更新到最新的驱动程序(Radeon Driver Packaging Version
16.50.2011-161219a-309792E) 以及最新的 LunarG Vulkan SDK (1.0.37.0) 问题已自行解决。请注意,我在 运行
AMD Radeon R9 380 系列。
我在 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 冻结(屏幕暂时变黑)而崩溃并退出时,不会抛出有用的错误。
对于未来的读者来说,这似乎是一个驱动程序问题。由于更新到最新的驱动程序(Radeon Driver Packaging Version 16.50.2011-161219a-309792E) 以及最新的 LunarG Vulkan SDK (1.0.37.0) 问题已自行解决。请注意,我在 运行 AMD Radeon R9 380 系列。