From 992bae4e2a14ca2547c09637b7dc6fc5f73b353a Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 22 Oct 2025 02:56:28 +0200 Subject: [PATCH] [common] replace Common::BitCast with libc++ provided one (#2774) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2774 Reviewed-by: MaranBr Reviewed-by: crueter Co-authored-by: lizzie Co-committed-by: lizzie --- .../renderer/command/effect/biquad_filter.cpp | 27 +++++++------ src/common/CMakeLists.txt | 1 - src/common/bit_cast.h | 23 ----------- src/common/overflow.h | 11 +++-- src/core/arm/nce/interpreter_visitor.cpp | 5 ++- src/core/arm/nce/patcher.cpp | 5 ++- .../internal_network/network_interface.cpp | 17 ++++---- src/dynarmic/tests/native/testenv.h | 36 ++++++----------- .../backend/glasm/reg_alloc.cpp | 6 +-- .../backend/glasm/reg_alloc.h | 11 +++-- .../frontend/ir/basic_block.h | 11 +++-- .../frontend/ir/ir_emitter.cpp | 5 ++- src/shader_recompiler/frontend/ir/value.h | 9 +++-- .../frontend/maxwell/translate/impl/impl.cpp | 6 +-- .../ir_opt/constant_propagation_pass.cpp | 12 +++--- .../engines/sw_blitter/converter.cpp | 20 +++++----- src/video_core/fsr.cpp | 40 ++++++++++--------- src/video_core/fsr.h | 5 ++- .../renderer_opengl/gl_compute_pipeline.cpp | 10 +++-- .../renderer_opengl/gl_graphics_pipeline.cpp | 7 ++-- .../renderer_opengl/renderer_opengl.h | 3 ++ .../renderer_vulkan/fixed_pipeline_state.cpp | 10 ++--- .../renderer_vulkan/vk_pipeline_cache.cpp | 8 ++-- .../renderer_vulkan/vk_texture_cache.cpp | 6 +-- src/video_core/texture_cache/render_targets.h | 9 +++-- 25 files changed, 152 insertions(+), 151 deletions(-) delete mode 100644 src/common/bit_cast.h diff --git a/src/audio_core/renderer/command/effect/biquad_filter.cpp b/src/audio_core/renderer/command/effect/biquad_filter.cpp index 4ad3184079..04e739d289 100644 --- a/src/audio_core/renderer/command/effect/biquad_filter.cpp +++ b/src/audio_core/renderer/command/effect/biquad_filter.cpp @@ -7,7 +7,8 @@ #include "audio_core/adsp/apps/audio_renderer/command_list_processor.h" #include "audio_core/renderer/command/effect/biquad_filter.h" #include "audio_core/renderer/voice/voice_state.h" -#include "common/bit_cast.h" +#include +#include namespace AudioCore::Renderer { /** @@ -30,8 +31,8 @@ void ApplyBiquadFilterFloat(std::span output, std::span input, Common::FixedPoint<50, 14>::from_base(b_[2]).to_double()}; std::array a{Common::FixedPoint<50, 14>::from_base(a_[0]).to_double(), Common::FixedPoint<50, 14>::from_base(a_[1]).to_double()}; - std::array s{Common::BitCast(state.s0), Common::BitCast(state.s1), - Common::BitCast(state.s2), Common::BitCast(state.s3)}; + std::array s{std::bit_cast(state.s0), std::bit_cast(state.s1), + std::bit_cast(state.s2), std::bit_cast(state.s3)}; for (u32 i = 0; i < sample_count; i++) { f64 in_sample{static_cast(input[i])}; @@ -45,10 +46,10 @@ void ApplyBiquadFilterFloat(std::span output, std::span input, s[2] = sample; } - state.s0 = Common::BitCast(s[0]); - state.s1 = Common::BitCast(s[1]); - state.s2 = Common::BitCast(s[2]); - state.s3 = Common::BitCast(s[3]); + state.s0 = std::bit_cast(s[0]); + state.s1 = std::bit_cast(s[1]); + state.s2 = std::bit_cast(s[2]); + state.s3 = std::bit_cast(s[3]); } /** @@ -63,8 +64,8 @@ void ApplyBiquadFilterFloat2(std::span output, std::span input, std::array b_double{static_cast(b[0]), static_cast(b[1]), static_cast(b[2])}; std::array a_double{static_cast(a[0]), static_cast(a[1])}; - std::array s{Common::BitCast(state.s0), Common::BitCast(state.s1), - Common::BitCast(state.s2), Common::BitCast(state.s3)}; + std::array s{std::bit_cast(state.s0), std::bit_cast(state.s1), + std::bit_cast(state.s2), std::bit_cast(state.s3)}; for (u32 i = 0; i < sample_count; i++) { f64 in_sample{static_cast(input[i])}; @@ -79,10 +80,10 @@ void ApplyBiquadFilterFloat2(std::span output, std::span input, s[2] = sample; } - state.s0 = Common::BitCast(s[0]); - state.s1 = Common::BitCast(s[1]); - state.s2 = Common::BitCast(s[2]); - state.s3 = Common::BitCast(s[3]); + state.s0 = std::bit_cast(s[0]); + state.s1 = std::bit_cast(s[1]); + state.s2 = std::bit_cast(s[2]); + state.s3 = std::bit_cast(s[3]); } /** diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 2bd74503f4..21f2ab4ed4 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -30,7 +30,6 @@ add_library( assert.h atomic_helpers.h atomic_ops.h - bit_cast.h bit_field.h bit_util.h bounded_threadsafe_queue.h diff --git a/src/common/bit_cast.h b/src/common/bit_cast.h deleted file mode 100644 index c6110c5426..0000000000 --- a/src/common/bit_cast.h +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include - -#ifdef __cpp_lib_bit_cast -#include -#endif - -namespace Common { - -template -constexpr inline To BitCast(const From& from) { -#ifdef __cpp_lib_bit_cast - return std::bit_cast(from); -#else - return __builtin_bit_cast(To, from); -#endif -} - -} // namespace Common diff --git a/src/common/overflow.h b/src/common/overflow.h index 5f048de7e6..e82747795b 100644 --- a/src/common/overflow.h +++ b/src/common/overflow.h @@ -8,7 +8,8 @@ #include #include -#include "bit_cast.h" +#include +#include namespace Common { @@ -16,11 +17,9 @@ template requires(std::is_integral_v && std::is_signed_v) inline T WrappingAdd(T lhs, T rhs) { using U = std::make_unsigned_t; - - U lhs_u = BitCast(lhs); - U rhs_u = BitCast(rhs); - - return BitCast(lhs_u + rhs_u); + U lhs_u = std::bit_cast(lhs); + U rhs_u = std::bit_cast(rhs); + return std::bit_cast(lhs_u + rhs_u); } template diff --git a/src/core/arm/nce/interpreter_visitor.cpp b/src/core/arm/nce/interpreter_visitor.cpp index bbe0289f8e..aa796ed929 100644 --- a/src/core/arm/nce/interpreter_visitor.cpp +++ b/src/core/arm/nce/interpreter_visitor.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2023 merryhime // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/bit_cast.h" +#include #include "core/arm/nce/interpreter_visitor.h" namespace Core { diff --git a/src/core/arm/nce/patcher.cpp b/src/core/arm/nce/patcher.cpp index 9321258ae9..28862c80b9 100644 --- a/src/core/arm/nce/patcher.cpp +++ b/src/core/arm/nce/patcher.cpp @@ -1,8 +1,9 @@ // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +#include +#include #include "common/arm64/native_clock.h" -#include "common/bit_cast.h" #include "common/literals.h" #include "core/arm/nce/arm_nce.h" #include "core/arm/nce/guest_context.h" @@ -435,7 +436,7 @@ void Patcher::WriteMsrHandler(ModuleDestLabel module_dest, oaknut::XReg src_reg) void Patcher::WriteCntpctHandler(ModuleDestLabel module_dest, oaknut::XReg dest_reg) { static Common::Arm64::NativeClock clock{}; const auto factor = clock.GetGuestCNTFRQFactor(); - const auto raw_factor = Common::BitCast>(factor); + const auto raw_factor = std::bit_cast>(factor); const auto use_x2_x3 = dest_reg.index() == 0 || dest_reg.index() == 1; oaknut::XReg scratch0 = use_x2_x3 ? X2 : X0; diff --git a/src/core/internal_network/network_interface.cpp b/src/core/internal_network/network_interface.cpp index 7be9434afe..8e8f099be8 100644 --- a/src/core/internal_network/network_interface.cpp +++ b/src/core/internal_network/network_interface.cpp @@ -5,11 +5,12 @@ #include #include #include +#include +#include +#include -#include "common/bit_cast.h" #include "common/common_types.h" #include "common/logging/log.h" -#include #include "common/settings.h" #include "common/string_util.h" #include "core/internal_network/emu_net_state.h" @@ -123,8 +124,8 @@ std::vector GetAvailableNetworkInterfaces() { // Just use 0 as the gateway address result.emplace_back(Network::NetworkInterface{ .name{ifa->ifa_name}, - .ip_address{Common::BitCast(*ifa->ifa_addr).sin_addr}, - .subnet_mask{Common::BitCast(*ifa->ifa_netmask).sin_addr}, + .ip_address{std::bit_cast(*ifa->ifa_addr).sin_addr}, + .subnet_mask{std::bit_cast(*ifa->ifa_netmask).sin_addr}, .gateway{in_addr{.s_addr = 0}} }); #else @@ -139,8 +140,8 @@ std::vector GetAvailableNetworkInterfaces() { gateway_0.s_addr = gateway; result.emplace_back(Network::NetworkInterface{ .name = ifa->ifa_name, - .ip_address = Common::BitCast(*ifa->ifa_addr).sin_addr, - .subnet_mask = Common::BitCast(*ifa->ifa_netmask).sin_addr, + .ip_address = std::bit_cast(*ifa->ifa_addr).sin_addr, + .subnet_mask = std::bit_cast(*ifa->ifa_netmask).sin_addr, .gateway = gateway_0 }); continue; @@ -191,8 +192,8 @@ std::vector GetAvailableNetworkInterfaces() { gateway_0.s_addr = gateway; result.emplace_back(Network::NetworkInterface{ .name = ifa->ifa_name, - .ip_address = Common::BitCast(*ifa->ifa_addr).sin_addr, - .subnet_mask = Common::BitCast(*ifa->ifa_netmask).sin_addr, + .ip_address = std::bit_cast(*ifa->ifa_addr).sin_addr, + .subnet_mask = std::bit_cast(*ifa->ifa_netmask).sin_addr, .gateway = gateway_0 }); #endif // ANDROID diff --git a/src/dynarmic/tests/native/testenv.h b/src/dynarmic/tests/native/testenv.h index f7a8622ed8..947abe716e 100644 --- a/src/dynarmic/tests/native/testenv.h +++ b/src/dynarmic/tests/native/testenv.h @@ -7,18 +7,8 @@ #ifdef __AVX__ #include #endif - -// NetBSD apparently still needs these... ugh -#ifdef __cpp_lib_bit_cast +#include #include -template constexpr inline To BitCast(const From& from) { - return std::bit_cast(from); -} -#else -template constexpr inline To BitCast(const From& from) { - return __builtin_bit_cast(To, from); -} -#endif template void CheckedRun(F&& fn) { @@ -48,18 +38,18 @@ void CheckedRun(F&& fn) { , "+x"(xmm8), "+x"(xmm9), "+x"(xmm10), "+x"(xmm11) : ); - CHECK(BitCast(xmm0[0]) == 0); - CHECK(BitCast(xmm1[0]) == 1); - CHECK(BitCast(xmm2[0]) == 2); - CHECK(BitCast(xmm3[0]) == 3); - CHECK(BitCast(xmm4[0]) == 4); - CHECK(BitCast(xmm5[0]) == 5); - CHECK(BitCast(xmm6[0]) == 6); - CHECK(BitCast(xmm7[0]) == 7); - CHECK(BitCast(xmm8[0]) == 8); - CHECK(BitCast(xmm9[0]) == 9); - CHECK(BitCast(xmm10[0]) == 10); - CHECK(BitCast(xmm11[0]) == 11); + CHECK(std::bit_cast(xmm0[0]) == 0); + CHECK(std::bit_cast(xmm1[0]) == 1); + CHECK(std::bit_cast(xmm2[0]) == 2); + CHECK(std::bit_cast(xmm3[0]) == 3); + CHECK(std::bit_cast(xmm4[0]) == 4); + CHECK(std::bit_cast(xmm5[0]) == 5); + CHECK(std::bit_cast(xmm6[0]) == 6); + CHECK(std::bit_cast(xmm7[0]) == 7); + CHECK(std::bit_cast(xmm8[0]) == 8); + CHECK(std::bit_cast(xmm9[0]) == 9); + CHECK(std::bit_cast(xmm10[0]) == 10); + CHECK(std::bit_cast(xmm11[0]) == 11); #else fn(); #endif diff --git a/src/shader_recompiler/backend/glasm/reg_alloc.cpp b/src/shader_recompiler/backend/glasm/reg_alloc.cpp index e78aee23d1..be6cab336b 100644 --- a/src/shader_recompiler/backend/glasm/reg_alloc.cpp +++ b/src/shader_recompiler/backend/glasm/reg_alloc.cpp @@ -5,7 +5,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include - +#include #include "shader_recompiler/backend/glasm/reg_alloc.h" #include "shader_recompiler/exception.h" #include "shader_recompiler/frontend/ir/value.h" @@ -78,7 +78,7 @@ Value RegAlloc::MakeImm(const IR::Value& value) { break; case IR::Type::F32: ret.type = Type::U32; - ret.imm_u32 = Common::BitCast(value.F32()); + ret.imm_u32 = std::bit_cast(value.F32()); break; case IR::Type::U64: ret.type = Type::U64; @@ -86,7 +86,7 @@ Value RegAlloc::MakeImm(const IR::Value& value) { break; case IR::Type::F64: ret.type = Type::U64; - ret.imm_u64 = Common::BitCast(value.F64()); + ret.imm_u64 = std::bit_cast(value.F64()); break; default: throw NotImplementedException("Immediate type {}", value.Type()); diff --git a/src/shader_recompiler/backend/glasm/reg_alloc.h b/src/shader_recompiler/backend/glasm/reg_alloc.h index 9cd0091326..6fae03616c 100644 --- a/src/shader_recompiler/backend/glasm/reg_alloc.h +++ b/src/shader_recompiler/backend/glasm/reg_alloc.h @@ -1,13 +1,16 @@ +// SPDX-FileCopyrightText: Copyright 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 #pragma once #include - +#include #include +#include -#include "common/bit_cast.h" #include "common/bit_field.h" #include "common/common_types.h" #include "shader_recompiler/exception.h" @@ -272,7 +275,7 @@ struct fmt::formatter { case Shader::Backend::GLASM::Type::Register: return Shader::Backend::GLASM::FormatTo(ctx, value.id); case Shader::Backend::GLASM::Type::U32: - return fmt::format_to(ctx.out(), "{}", Common::BitCast(value.imm_u32)); + return fmt::format_to(ctx.out(), "{}", std::bit_cast(value.imm_u32)); case Shader::Backend::GLASM::Type::U64: break; } @@ -295,7 +298,7 @@ struct fmt::formatter { case Shader::Backend::GLASM::Type::U32: break; case Shader::Backend::GLASM::Type::U64: - return fmt::format_to(ctx.out(), "{}", Common::BitCast(value.imm_u64)); + return fmt::format_to(ctx.out(), "{}", std::bit_cast(value.imm_u64)); } throw Shader::InvalidArgument("Invalid value type {}", value.type); } diff --git a/src/shader_recompiler/frontend/ir/basic_block.h b/src/shader_recompiler/frontend/ir/basic_block.h index c9d83661a4..d3a66caac9 100644 --- a/src/shader_recompiler/frontend/ir/basic_block.h +++ b/src/shader_recompiler/frontend/ir/basic_block.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 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 @@ -7,10 +10,10 @@ #include #include #include - +#include +#include #include -#include "common/bit_cast.h" #include "common/common_types.h" #include "shader_recompiler/frontend/ir/condition.h" #include "shader_recompiler/frontend/ir/value.h" @@ -70,13 +73,13 @@ public: /// Intrusively store the host definition of this instruction. template void SetDefinition(DefinitionType def) { - definition = Common::BitCast(def); + definition = std::bit_cast(def); } /// Return the intrusively stored host definition of this instruction. template [[nodiscard]] DefinitionType Definition() const noexcept { - return Common::BitCast(definition); + return std::bit_cast(definition); } void SetSsaRegValue(IR::Reg reg, const Value& value) noexcept { diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.cpp b/src/shader_recompiler/frontend/ir/ir_emitter.cpp index a2fa9b1588..0d9d05ddb5 100644 --- a/src/shader_recompiler/frontend/ir/ir_emitter.cpp +++ b/src/shader_recompiler/frontend/ir/ir_emitter.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 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 -#include "common/bit_cast.h" +#include #include "shader_recompiler/frontend/ir/ir_emitter.h" #include "shader_recompiler/frontend/ir/value.h" diff --git a/src/shader_recompiler/frontend/ir/value.h b/src/shader_recompiler/frontend/ir/value.h index 514344dfe3..7ecc99c41d 100644 --- a/src/shader_recompiler/frontend/ir/value.h +++ b/src/shader_recompiler/frontend/ir/value.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 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 @@ -14,7 +17,7 @@ #include #include "common/assert.h" -#include "common/bit_cast.h" +#include #include "common/common_types.h" #include "shader_recompiler/exception.h" #include "shader_recompiler/frontend/ir/attribute.h" @@ -206,13 +209,13 @@ public: /// Intrusively store the host definition of this instruction. template void SetDefinition(DefinitionType def) { - definition = Common::BitCast(def); + definition = std::bit_cast(def); } /// Return the intrusively stored host definition of this instruction. template [[nodiscard]] DefinitionType Definition() const noexcept { - return Common::BitCast(definition); + return std::bit_cast(definition); } /// Destructively remove one reference count from the instruction diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp index 8b5a103006..b545cb0b73 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp @@ -204,7 +204,7 @@ IR::F32 TranslatorVisitor::GetFloatImm20(u64 insn) { } const imm{insn}; const u32 sign_bit{static_cast(imm.is_negative != 0 ? (1ULL << 31) : 0)}; const u32 value{static_cast(imm.value) << 12}; - return ir.Imm32(Common::BitCast(value | sign_bit)); + return ir.Imm32(std::bit_cast(value | sign_bit)); } IR::F64 TranslatorVisitor::GetDoubleImm20(u64 insn) { @@ -215,7 +215,7 @@ IR::F64 TranslatorVisitor::GetDoubleImm20(u64 insn) { } const imm{insn}; const u64 sign_bit{imm.is_negative != 0 ? (1ULL << 63) : 0}; const u64 value{imm.value << 44}; - return ir.Imm64(Common::BitCast(value | sign_bit)); + return ir.Imm64(std::bit_cast(value | sign_bit)); } IR::U64 TranslatorVisitor::GetPackedImm20(u64 insn) { @@ -236,7 +236,7 @@ IR::F32 TranslatorVisitor::GetFloatImm32(u64 insn) { u64 raw; BitField<20, 32, u64> value; } const imm{insn}; - return ir.Imm32(Common::BitCast(static_cast(imm.value))); + return ir.Imm32(std::bit_cast(static_cast(imm.value))); } void TranslatorVisitor::SetZFlag(const IR::U1& value) { diff --git a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp index 2791703307..57c08588fb 100644 --- a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp +++ b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp @@ -8,8 +8,8 @@ #include #include #include - -#include "common/bit_cast.h" +#include +#include #include "shader_recompiler/environment.h" #include "shader_recompiler/exception.h" #include "shader_recompiler/frontend/ir/ir_emitter.h" @@ -536,7 +536,7 @@ template void FoldBitCast(IR::Inst& inst, IR::Opcode reverse) { const IR::Value value{inst.Arg(0)}; if (value.IsImmediate()) { - inst.ReplaceUsesWith(IR::Value{Common::BitCast(Arg(value))}); + inst.ReplaceUsesWith(IR::Value{std::bit_cast(Arg(value))}); return; } IR::Inst* const arg_inst{value.InstRecursive()}; @@ -674,7 +674,7 @@ void FoldFSwizzleAdd(IR::Block& block, IR::Inst& inst) { if (!value_2.IsImmediate() || !value_3.IsImmediate()) { return; } - if (Common::BitCast(value_2.F32()) != value_3.U32()) { + if (std::bit_cast(value_2.F32()) != value_3.U32()) { return; } } @@ -821,7 +821,7 @@ bool FindGradient3DDerivatives(std::array& results, IR::Value coor void ConvertDerivatives(std::array& results, IR::IREmitter& ir) { for (size_t i = 0; i < 3; i++) { if (results[i].Type() == IR::Type::U32) { - results[i] = results[i].IsImmediate() ? ir.Imm32(Common::BitCast(results[i].U32())) + results[i] = results[i].IsImmediate() ? ir.Imm32(std::bit_cast(results[i].U32())) : ir.BitCast(IR::U32(results[i])); } } @@ -927,7 +927,7 @@ void FoldDriverConstBuffer(Environment& env, IR::Block& block, IR::Inst& inst, u inst.ReplaceUsesWith(IR::Value{env.ReadCbufValue(bank_value, offset_value)}); } else { inst.ReplaceUsesWith( - IR::Value{Common::BitCast(env.ReadCbufValue(bank_value, offset_value))}); + IR::Value{std::bit_cast(env.ReadCbufValue(bank_value, offset_value))}); } } diff --git a/src/video_core/engines/sw_blitter/converter.cpp b/src/video_core/engines/sw_blitter/converter.cpp index 1d1d3b2087..b4722f7976 100644 --- a/src/video_core/engines/sw_blitter/converter.cpp +++ b/src/video_core/engines/sw_blitter/converter.cpp @@ -8,9 +8,9 @@ #include #include #include - +#include +#include #include "common/assert.h" -#include "common/bit_cast.h" #include "video_core/engines/sw_blitter/converter.h" #include "video_core/surface.h" #include "video_core/textures/decoders.h" @@ -696,21 +696,21 @@ private: return shifted_value >> shift_amount; }; const auto force_to_fp16 = [](f32 base_value) { - u32 tmp = Common::BitCast(base_value); + u32 tmp = std::bit_cast(base_value); constexpr size_t fp32_mantissa_bits = 23; constexpr size_t fp16_mantissa_bits = 10; constexpr size_t mantissa_mask = ~((1ULL << (fp32_mantissa_bits - fp16_mantissa_bits)) - 1ULL); tmp = tmp & static_cast(mantissa_mask); // TODO: force the exponent within the range of half float. Not needed in UNORM / SNORM - return Common::BitCast(tmp); + return std::bit_cast(tmp); }; const auto from_fp_n = [&sign_extend](u32 base_value, size_t bits, size_t mantissa) { constexpr size_t fp32_mantissa_bits = 23; size_t shift_towards = fp32_mantissa_bits - mantissa; const u32 new_value = static_cast(sign_extend(base_value, bits) << shift_towards) & (~(1U << 31)); - return Common::BitCast(new_value); + return std::bit_cast(new_value); }; const auto calculate_snorm = [&]() { return static_cast( @@ -740,11 +740,11 @@ private: out_component = force_to_fp16(out_component); } else if constexpr (component_types[which_component] == ComponentType::FLOAT) { if constexpr (component_sizes[which_component] == 32) { - out_component = Common::BitCast(value); + out_component = std::bit_cast(value); } else if constexpr (component_sizes[which_component] == 16) { static constexpr u32 sign_mask = 0x8000; static constexpr u32 mantissa_mask = 0x8000; - out_component = Common::BitCast(((value & sign_mask) << 16) | + out_component = std::bit_cast(((value & sign_mask) << 16) | (((value & 0x7c00) + 0x1C000) << 13) | ((value & mantissa_mask) << 13)); } else { @@ -774,7 +774,7 @@ private: }; const auto to_fp_n = [](f32 base_value, size_t bits, size_t mantissa) { constexpr size_t fp32_mantissa_bits = 23; - u32 tmp_value = Common::BitCast((std::max)(base_value, 0.0f)); + u32 tmp_value = std::bit_cast((std::max)(base_value, 0.0f)); size_t shift_towards = fp32_mantissa_bits - mantissa; return tmp_value >> shift_towards; }; @@ -802,13 +802,13 @@ private: insert_to_word(tmp_word); } else if constexpr (component_types[which_component] == ComponentType::FLOAT) { if constexpr (component_sizes[which_component] == 32) { - u32 tmp_word = Common::BitCast(in_component); + u32 tmp_word = std::bit_cast(in_component); insert_to_word(tmp_word); } else if constexpr (component_sizes[which_component] == 16) { static constexpr u32 sign_mask = 0x8000; static constexpr u32 mantissa_mask = 0x03ff; static constexpr u32 exponent_mask = 0x7c00; - const u32 tmp_word = Common::BitCast(in_component); + const u32 tmp_word = std::bit_cast(in_component); const u32 half = ((tmp_word >> 16) & sign_mask) | ((((tmp_word & 0x7f800000) - 0x38000000) >> 13) & exponent_mask) | ((tmp_word >> 13) & mantissa_mask); diff --git a/src/video_core/fsr.cpp b/src/video_core/fsr.cpp index 5653c64fcc..a222fa3b1f 100644 --- a/src/video_core/fsr.cpp +++ b/src/video_core/fsr.cpp @@ -1,7 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include +#include #include "video_core/fsr.h" namespace FSR { @@ -95,7 +99,7 @@ u32 AU1_AH1_AF1(f32 f) { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, }; - const u32 u = Common::BitCast(f); + const u32 u = std::bit_cast(f); const u32 i = u >> 23; return base[i] + ((u & 0x7fffff) >> shift[i]); } @@ -107,20 +111,20 @@ u32 AU1_AH2_AF2(f32 a[2]) { void FsrEasuCon(u32 con0[4], u32 con1[4], u32 con2[4], u32 con3[4], f32 inputViewportInPixelsX, f32 inputViewportInPixelsY, f32 inputSizeInPixelsX, f32 inputSizeInPixelsY, f32 outputSizeInPixelsX, f32 outputSizeInPixelsY) { - con0[0] = Common::BitCast(inputViewportInPixelsX / outputSizeInPixelsX); - con0[1] = Common::BitCast(inputViewportInPixelsY / outputSizeInPixelsY); - con0[2] = Common::BitCast(0.5f * inputViewportInPixelsX / outputSizeInPixelsX - 0.5f); - con0[3] = Common::BitCast(0.5f * inputViewportInPixelsY / outputSizeInPixelsY - 0.5f); - con1[0] = Common::BitCast(1.0f / inputSizeInPixelsX); - con1[1] = Common::BitCast(1.0f / inputSizeInPixelsY); - con1[2] = Common::BitCast(1.0f / inputSizeInPixelsX); - con1[3] = Common::BitCast(-1.0f / inputSizeInPixelsY); - con2[0] = Common::BitCast(-1.0f / inputSizeInPixelsX); - con2[1] = Common::BitCast(2.0f / inputSizeInPixelsY); - con2[2] = Common::BitCast(1.0f / inputSizeInPixelsX); - con2[3] = Common::BitCast(2.0f / inputSizeInPixelsY); - con3[0] = Common::BitCast(0.0f / inputSizeInPixelsX); - con3[1] = Common::BitCast(4.0f / inputSizeInPixelsY); + con0[0] = std::bit_cast(inputViewportInPixelsX / outputSizeInPixelsX); + con0[1] = std::bit_cast(inputViewportInPixelsY / outputSizeInPixelsY); + con0[2] = std::bit_cast(0.5f * inputViewportInPixelsX / outputSizeInPixelsX - 0.5f); + con0[3] = std::bit_cast(0.5f * inputViewportInPixelsY / outputSizeInPixelsY - 0.5f); + con1[0] = std::bit_cast(1.0f / inputSizeInPixelsX); + con1[1] = std::bit_cast(1.0f / inputSizeInPixelsY); + con1[2] = std::bit_cast(1.0f / inputSizeInPixelsX); + con1[3] = std::bit_cast(-1.0f / inputSizeInPixelsY); + con2[0] = std::bit_cast(-1.0f / inputSizeInPixelsX); + con2[1] = std::bit_cast(2.0f / inputSizeInPixelsY); + con2[2] = std::bit_cast(1.0f / inputSizeInPixelsX); + con2[3] = std::bit_cast(2.0f / inputSizeInPixelsY); + con3[0] = std::bit_cast(0.0f / inputSizeInPixelsX); + con3[1] = std::bit_cast(4.0f / inputSizeInPixelsY); con3[2] = con3[3] = 0; } } // Anonymous namespace @@ -131,16 +135,16 @@ void FsrEasuConOffset(u32 con0[4], u32 con1[4], u32 con2[4], u32 con3[4], f32 outputSizeInPixelsY, f32 inputOffsetInPixelsX, f32 inputOffsetInPixelsY) { FsrEasuCon(con0, con1, con2, con3, inputViewportInPixelsX, inputViewportInPixelsY, inputSizeInPixelsX, inputSizeInPixelsY, outputSizeInPixelsX, outputSizeInPixelsY); - con0[2] = Common::BitCast(0.5f * inputViewportInPixelsX / outputSizeInPixelsX - 0.5f + + con0[2] = std::bit_cast(0.5f * inputViewportInPixelsX / outputSizeInPixelsX - 0.5f + inputOffsetInPixelsX); - con0[3] = Common::BitCast(0.5f * inputViewportInPixelsY / outputSizeInPixelsY - 0.5f + + con0[3] = std::bit_cast(0.5f * inputViewportInPixelsY / outputSizeInPixelsY - 0.5f + inputOffsetInPixelsY); } void FsrRcasCon(u32* con, f32 sharpness) { sharpness = std::exp2f(-sharpness); f32 hSharp[2]{sharpness, sharpness}; - con[0] = Common::BitCast(sharpness); + con[0] = std::bit_cast(sharpness); con[1] = AU1_AH2_AF2(hSharp); con[2] = 0; con[3] = 0; diff --git a/src/video_core/fsr.h b/src/video_core/fsr.h index db0d4ec6fb..bf0588b416 100644 --- a/src/video_core/fsr.h +++ b/src/video_core/fsr.h @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#include "common/bit_cast.h" +#include #include "common/common_types.h" namespace FSR { diff --git a/src/video_core/renderer_opengl/gl_compute_pipeline.cpp b/src/video_core/renderer_opengl/gl_compute_pipeline.cpp index d705018607..9a69ea4e06 100644 --- a/src/video_core/renderer_opengl/gl_compute_pipeline.cpp +++ b/src/video_core/renderer_opengl/gl_compute_pipeline.cpp @@ -1,8 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 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 #include - +#include +#include #include "common/cityhash.h" #include "common/settings.h" // for enum class Settings::ShaderBackend #include "video_core/renderer_opengl/gl_compute_pipeline.h" @@ -229,8 +233,8 @@ void ComputePipeline::Configure() { } } if (info.uses_rescaling_uniform) { - const f32 float_texture_scaling_mask{Common::BitCast(texture_scaling_mask)}; - const f32 float_image_scaling_mask{Common::BitCast(image_scaling_mask)}; + const f32 float_texture_scaling_mask{std::bit_cast(texture_scaling_mask)}; + const f32 float_image_scaling_mask{std::bit_cast(image_scaling_mask)}; if (assembly_program.handle != 0) { glProgramLocalParameter4fARB(GL_COMPUTE_PROGRAM_NV, 0, float_texture_scaling_mask, float_image_scaling_mask, 0.0f, 0.0f); diff --git a/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp b/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp index b4417de703..a5815b76d4 100644 --- a/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp +++ b/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp @@ -8,7 +8,8 @@ #include #include #include - +#include +#include #include "common/settings.h" // for enum class Settings::ShaderBackend #include "common/thread_worker.h" #include "shader_recompiler/shader_info.h" @@ -511,8 +512,8 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { } } if (info.uses_rescaling_uniform) { - const f32 float_texture_scaling_mask{Common::BitCast(texture_scaling_mask)}; - const f32 float_image_scaling_mask{Common::BitCast(image_scaling_mask)}; + const f32 float_texture_scaling_mask{std::bit_cast(texture_scaling_mask)}; + const f32 float_image_scaling_mask{std::bit_cast(image_scaling_mask)}; const bool is_rescaling{texture_cache.IsRescaling()}; const f32 config_down_factor{Settings::values.resolution_info.down_factor}; const f32 down_factor{is_rescaling ? config_down_factor : 1.0f}; diff --git a/src/video_core/renderer_opengl/renderer_opengl.h b/src/video_core/renderer_opengl/renderer_opengl.h index 3b557acb96..f694dc413a 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.h +++ b/src/video_core/renderer_opengl/renderer_opengl.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp index 7cb8acec89..ff2dd90aff 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp @@ -6,11 +6,11 @@ #include #include - -#include "common/bit_cast.h" +#include +#include +#include #include "common/cityhash.h" #include "common/common_types.h" -#include #include "video_core/engines/draw_manager.h" #include "video_core/renderer_vulkan/fixed_pipeline_state.h" #include "video_core/renderer_vulkan/vk_state_tracker.h" @@ -98,8 +98,8 @@ void FixedPipelineState::Refresh(Tegra::Engines::Maxwell3D& maxwell3d, DynamicFe for (size_t i = 0; i < regs.rt.size(); ++i) { color_formats[i] = static_cast(regs.rt[i].format); } - alpha_test_ref = Common::BitCast(regs.alpha_test_ref); - point_size = Common::BitCast(regs.point_size); + alpha_test_ref = std::bit_cast(regs.alpha_test_ref); + point_size = std::bit_cast(regs.point_size); if (maxwell3d.dirty.flags[Dirty::VertexInput]) { if (features.has_dynamic_vertex_input) { diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 9cdbe5611b..10ee14773f 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -11,8 +11,8 @@ #include #include #include - -#include "common/bit_cast.h" +#include +#include #include "common/cityhash.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" @@ -160,7 +160,7 @@ Shader::RuntimeInfo MakeRuntimeInfo(std::span program const Shader::Stage stage{program.stage}; const bool has_geometry{key.unique_hashes[4] != 0 && !programs[4].is_geometry_passthrough}; const bool gl_ndc{key.state.ndc_minus_one_to_one != 0}; - const float point_size{Common::BitCast(key.state.point_size)}; + const float point_size{std::bit_cast(key.state.point_size)}; switch (stage) { case Shader::Stage::VertexB: if (!has_geometry) { @@ -228,7 +228,7 @@ Shader::RuntimeInfo MakeRuntimeInfo(std::span program case Shader::Stage::Fragment: info.alpha_test_func = MaxwellToCompareFunction( key.state.UnpackComparisonOp(key.state.alpha_test_func.Value())); - info.alpha_test_reference = Common::BitCast(key.state.alpha_test_ref); + info.alpha_test_reference = std::bit_cast(key.state.alpha_test_ref); break; default: break; diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 9b6d1704c3..5b52e88727 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -10,8 +10,8 @@ #include #include #include - -#include "common/bit_cast.h" +#include +#include #include "common/bit_util.h" #include "common/settings.h" @@ -2216,7 +2216,7 @@ Sampler::Sampler(TextureCacheRuntime& runtime, const Tegra::Texture::TSCEntry& t .sType = VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT, .pNext = nullptr, // TODO: Make use of std::bit_cast once libc++ supports it. - .customBorderColor = Common::BitCast(color), + .customBorderColor = std::bit_cast(color), .format = VK_FORMAT_UNDEFINED, }; const void* pnext = nullptr; diff --git a/src/video_core/texture_cache/render_targets.h b/src/video_core/texture_cache/render_targets.h index 0829d773a5..f3d9ac37f4 100644 --- a/src/video_core/texture_cache/render_targets.h +++ b/src/video_core/texture_cache/render_targets.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,7 @@ #include #include -#include "common/bit_cast.h" +#include #include "video_core/texture_cache/types.h" namespace VideoCommon { @@ -41,8 +44,8 @@ struct hash { for (const ImageViewId color_buffer_id : rt.color_buffer_ids) { value ^= std::hash{}(color_buffer_id); } - value ^= Common::BitCast(rt.draw_buffers); - value ^= Common::BitCast(rt.size); + value ^= std::bit_cast(rt.draw_buffers); + value ^= std::bit_cast(rt.size); return value; } };