From: Conor McCarthy cmccarthy@codeweavers.com
--- libs/vkd3d-shader/spirv.c | 9 +++++---- libs/vkd3d-shader/vkd3d_shader_private.h | 1 + 2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index b4ff4a027..f9b3fb688 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -7384,6 +7384,7 @@ static void spirv_compiler_emit_f32tof16(struct spirv_compiler *compiler, static void spirv_compiler_emit_comparison_instruction(struct spirv_compiler *compiler, const struct vkd3d_shader_instruction *instruction) { + bool inv_is_ord = instruction->flags & VKD3DSI_FCMP_INVERT_IS_ORDERED; struct vkd3d_spirv_builder *builder = &compiler->spirv_builder; const struct vkd3d_shader_dst_param *dst = instruction->dst; const struct vkd3d_shader_src_param *src = instruction->src; @@ -7394,17 +7395,17 @@ static void spirv_compiler_emit_comparison_instruction(struct spirv_compiler *co switch (instruction->handler_idx) { case VKD3DSIH_DEQ: - case VKD3DSIH_EQ: op = SpvOpFOrdEqual; break; + case VKD3DSIH_EQ: op = inv_is_ord ? SpvOpFUnordEqual : SpvOpFOrdEqual; break; case VKD3DSIH_DGE: - case VKD3DSIH_GE: op = SpvOpFOrdGreaterThanEqual; break; + case VKD3DSIH_GE: op = inv_is_ord ? SpvOpFUnordGreaterThanEqual : SpvOpFOrdGreaterThanEqual; break; case VKD3DSIH_IEQ: op = SpvOpIEqual; break; case VKD3DSIH_IGE: op = SpvOpSGreaterThanEqual; break; case VKD3DSIH_ILT: op = SpvOpSLessThan; break; case VKD3DSIH_INE: op = SpvOpINotEqual; break; case VKD3DSIH_DLT: - case VKD3DSIH_LT: op = SpvOpFOrdLessThan; break; + case VKD3DSIH_LT: op = inv_is_ord ? SpvOpFUnordLessThan : SpvOpFOrdLessThan; break; case VKD3DSIH_DNE: - case VKD3DSIH_NE: op = SpvOpFUnordNotEqual; break; + case VKD3DSIH_NE: op = inv_is_ord ? SpvOpFOrdNotEqual : SpvOpFUnordNotEqual; break; case VKD3DSIH_UGE: op = SpvOpUGreaterThanEqual; break; case VKD3DSIH_ULT: op = SpvOpULessThan; break; default: diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index c10e77f53..618e15bc8 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -731,6 +731,7 @@ enum vkd3d_tessellator_domain #define VKD3DSI_RESINFO_UINT 0x2 #define VKD3DSI_SAMPLE_INFO_UINT 0x1 #define VKD3DSI_SAMPLER_COMPARISON_MODE 0x1 +#define VKD3DSI_FCMP_INVERT_IS_ORDERED 0x1
#define VKD3DSI_PRECISE_X 0x100 #define VKD3DSI_PRECISE_Y 0x200