From 11b152ab587ba52af9e6165c8203687d85185d5a Mon Sep 17 00:00:00 2001 From: JPikachu Date: Sun, 29 Jun 2025 17:15:46 +0000 Subject: [PATCH] [spirv] Avoid NaN when a conversion to f16 is emitted (#215) Fixes black squares in Fire Emblem: Three Houses. And fixes vertex explosions in The Legend of Zelda: Breath of the Wild shrine areas. These were caused by NaN values from overflowed conversions to float16. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/215 Co-authored-by: JPikachu Co-committed-by: JPikachu --- src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp index a88f1b7c40..b766f4cbcd 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -148,7 +150,10 @@ Id EmitConvertU32U64(EmitContext& ctx, Id value) { } Id EmitConvertF16F32(EmitContext& ctx, Id value) { - return ctx.OpFConvert(ctx.F16[1], value); + const auto result = ctx.OpFConvert(ctx.F16[1], value); + const auto isOverflowing = ctx.OpIsNan(ctx.U1, result); + return ctx.OpSelect(ctx.F16[1], isOverflowing, ctx.Constant(ctx.F16[1], 0), result); + //return ctx.OpFConvert(ctx.F16[1], value); } Id EmitConvertF32F16(EmitContext& ctx, Id value) {