2016-12-30 53 views
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凍結時程序崩潰(屏幕瞬間變黑)並退出程序時,不會引發有用的錯誤。

+1

如果通過運行到TDR來重置驅動程序,很難說明原因。我的第一個懷疑是驅動程序中的SPIR-V反射錯誤,但如果着色器實際上工作,如果你只是改變你比較的值,我不會'認爲這是這種情況。 版本警告btw。可以忽略。 關於着色器我會改變一件事,即使沒有生成頂點,也總是調用EndPrimitive。 如果它仍然崩潰,您可能想要做一個回購案例並將其傳遞給代碼崩潰的IHV。 –

+0

另外,您要求提供GLSL 4.50。這包括你要求的兩個擴展。所以......你爲什麼要問他們? –

+0

這個似乎適用於我的修改版本(顏色代替texCoord +刪除傳輸矩陣)。所以有可能**沒有錯誤glslangValidator(1.0.37 SDK)和着色器代碼。嘗試不同的驅動程序。 – krOoze

回答

1

對於未來的讀者來說,這似乎是一個驅動程序問題。由於更新到最新的驅動程序(Radeon驅動程序封裝版本 16.50.2011-161219a-309792E)以及最新的LunarG Vulkan SDK(1.0.37.0),問題已經解決。注意我正在運行一個 AMD Radeon R9 380系列。