4
在Vulkan幾何着色器中進行浮點比較時,我遇到了奇怪的崩潰。着色器的代碼如下: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反射錯誤,但如果着色器實際上工作,如果你只是改變你比較的值,我不會'認爲這是這種情況。 版本警告btw。可以忽略。 關於着色器我會改變一件事,即使沒有生成頂點,也總是調用EndPrimitive。 如果它仍然崩潰,您可能想要做一個回購案例並將其傳遞給代碼崩潰的IHV。 –
另外,您要求提供GLSL 4.50。這包括你要求的兩個擴展。所以......你爲什麼要問他們? –
這個似乎適用於我的修改版本(顏色代替texCoord +刪除傳輸矩陣)。所以有可能**沒有錯誤glslangValidator(1.0.37 SDK)和着色器代碼。嘗試不同的驅動程序。 – krOoze