From 9c498441078690bb0607316a21bfd7ed4bed526f Mon Sep 17 00:00:00 2001 From: psucien Date: Fri, 19 Jul 2024 20:32:50 +0200 Subject: [PATCH] shader_recompiler: fixed sin/cos Thanks to red_pring and gandalfthewhite0173 --- .../backend/spirv/emit_spirv_floating_point.cpp | 4 ++-- .../backend/spirv/spirv_emit_context.cpp | 9 +++++++-- src/shader_recompiler/backend/spirv/spirv_emit_context.h | 2 ++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp index ce95b3709..911983a41 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp @@ -100,11 +100,11 @@ Id EmitFPNeg64(EmitContext& ctx, Id value) { } Id EmitFPSin(EmitContext& ctx, Id value) { - return ctx.OpSin(ctx.F32[1], value); + return ctx.OpSin(ctx.F32[1], ctx.OpFMul(ctx.F32[1], ctx.pi_x2, value)); } Id EmitFPCos(EmitContext& ctx, Id value) { - return ctx.OpCos(ctx.F32[1], value); + return ctx.OpCos(ctx.F32[1], ctx.OpFMul(ctx.F32[1], ctx.pi_x2, value)); } Id EmitFPExp2(EmitContext& ctx, Id value) { diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 3ea01a1de..c12ae4b29 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -1,11 +1,14 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include -#include #include "common/div_ceil.h" #include "shader_recompiler/backend/spirv/spirv_emit_context.h" +#include +#include + +static constexpr auto M_PI = 3.14159265358979323846f; + namespace Shader::Backend::SPIRV { namespace { @@ -100,6 +103,8 @@ void EmitContext::DefineArithmeticTypes() { u32_zero_value = ConstU32(0U); f32_zero_value = ConstF32(0.0f); + pi_x2 = ConstF32(2.0f * float(M_PI)); + input_f32 = Name(TypePointer(spv::StorageClass::Input, F32[1]), "input_f32"); input_u32 = Name(TypePointer(spv::StorageClass::Input, U32[1]), "input_u32"); input_s32 = Name(TypePointer(spv::StorageClass::Input, S32[1]), "input_s32"); diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h index 0f8081fd9..fc6783442 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h @@ -143,6 +143,8 @@ public: Id full_result_i32x2; Id full_result_u32x2; + Id pi_x2; + Id true_value{}; Id false_value{}; Id u32_one_value{};