2016-12-30 23 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。無視することができます。 シェーダについて変更したいことの1つは、頂点が生成されていなくても常にEndPrimitiveを呼び出すことです。 それでもクラッシュした場合、レポケースを実行して、コードがクラッシュするIHVに渡すことができます。 –

+0

また、GLSL 4.50を求めました。これには、あなたが求める拡張機能の両方が含まれます。だから...なぜ彼らに頼んでいるのですか? –

+0

このバージョンの修正版(texCoord + tran。matrixの代わりにカラー)が私のために機能するようです。だから**おそらく** glslangValidator(1.0.37 SDK)とシェーダコードに間違っているものはありません。別のドライバを試してください。 – krOoze

答えて

1

将来の読者のために、これはドライバの問題であるように思われます。最新のLunarG Vulkan SDK(1.0.37.0)とともに最新のドライバ(Radeon Driver Packaging Version 16.50.2011-161219a-309792E)にアップデートしたので、問題は解決しました。注:私は AMD Radeon R9 380シリーズで動作していました。

関連する問題