From e4fd52c367120feb7d1a0f9d338cadb3c1fb86d7 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 2 Feb 2022 13:42:15 +0000 Subject: [PATCH] Fix generation of NaNs in vulkan shader debug zoo test --- util/test/demos/vk/vk_shader_debug_zoo.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/util/test/demos/vk/vk_shader_debug_zoo.cpp b/util/test/demos/vk/vk_shader_debug_zoo.cpp index cb5869ae0..33f6a41a8 100644 --- a/util/test/demos/vk/vk_shader_debug_zoo.cpp +++ b/util/test/demos/vk/vk_shader_debug_zoo.cpp @@ -22,6 +22,7 @@ * THE SOFTWARE. ******************************************************************************/ +#include #include "3rdparty/fmt/core.h" #include "vk_test.h" @@ -110,7 +111,7 @@ layout(set = 0, binding = 10, std140) uniform constsbuf vec4 first; uint uniformIndex; vec4 second; - vec4 pad2; + vec4 nan; vec4 third; vec4 pad3; vec4 fourth; @@ -317,6 +318,7 @@ void main() float posinf = linearData.oneVal/linearData.zeroVal.x; float neginf = linearData.negoneVal/linearData.zeroVal.x; float nan = linearData.zeroVal.x/linearData.zeroVal.y; + nan *= cbuf.nan.x; float negone = linearData.negoneVal; float posone = linearData.oneVal; @@ -507,7 +509,7 @@ void main() case 30: { Color = cbuf.first + cbuf.second + cbuf.third + cbuf.fourth + - cbuf.pad2 + cbuf.pad3; + cbuf.pad3; break; } case 31: @@ -3163,7 +3165,7 @@ OpDecorate %cbuffer Binding 10 OpMemberDecorate %cbuffer_struct 0 Offset 0 ; vec4 first OpMemberDecorate %cbuffer_struct 1 Offset 16 ; vec4 pad1 OpMemberDecorate %cbuffer_struct 2 Offset 32 ; vec4 second -OpMemberDecorate %cbuffer_struct 3 Offset 48 ; vec4 pad2 +OpMemberDecorate %cbuffer_struct 3 Offset 48 ; vec4 nan OpMemberDecorate %cbuffer_struct 4 Offset 64 ; vec4 third OpMemberDecorate %cbuffer_struct 5 Offset 80 ; vec4 pad3 OpMemberDecorate %cbuffer_struct 6 Offset 96 ; vec4 fourth @@ -3278,7 +3280,16 @@ OpMemberDecorate %cbuffer_struct 17 Offset 216 ; double doublePackSource %posinf = OpFDiv %float %oneVal %zerof %neginf = OpFDiv %float %negoneVal %zerof - %nan = OpFDiv %float %zerof %zerof + + ; NaN generation is hard and we want to avoid compilers compiling it out, so generate + ; it in shader and multiply by one from a UBO so we get NaN either way + ; (since NaN * anything = NaN) + %nan_shad = OpFDiv %float %zerof %zerof + + %nan_ptr = OpAccessChain %ptr_Uniform_float4 %cbuffer %uint_3 + %nan_ubo = OpLoad %float4 %nan_ptr +%nan_ubo_x = OpCompositeExtract %float %nan_ubo 0 + %nan = OpFMul %float %nan_shad %nan_ubo_x %intval_ptr = OpAccessChain %ptr_Input_uint %flatData %flatv2f_intval_idx %intval = OpLoad %uint %intval_ptr @@ -3952,6 +3963,7 @@ OpMemberDecorate %cbuffer_struct 17 Offset 216 ; double doublePackSource cbufferdata[1] = Vec4f(1.1f, 2.2f, 3.3f, 4.4f); cbufferdata[2] = Vec4f(5.5f, 6.6f, 7.7f, 8.8f); + cbufferdata[3] = Vec4f(std::numeric_limits::quiet_NaN()); cbufferdata[4] = Vec4f(9.9f, 9.99f, 9.999f, 9.999f); cbufferdata[6] = Vec4f(100.0f, 200.0f, 300.0f, 400.0f);