diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d98b74fa..c98cc3a09 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -146,14 +146,14 @@ function(detect_architecture symbol arch) # CMake's crazy scope rules will keep it defined if (ARCHITECTURE_${arch}) set(ARCHITECTURE "${arch}" PARENT_SCOPE) - set(ARCHITECTURE_${arch} 1 PARENT_SCOPE) - add_definitions(-DARCHITECTURE_${arch}=1) endif() endif() endfunction() if (NOT ENABLE_GENERIC) - if (MSVC) + if (CMAKE_OSX_ARCHITECTURES) + set(ARCHITECTURE "${CMAKE_OSX_ARCHITECTURES}") + elseif (MSVC) detect_architecture("_M_AMD64" x86_64) detect_architecture("_M_IX86" x86) detect_architecture("_M_ARM" arm) @@ -167,8 +167,6 @@ if (NOT ENABLE_GENERIC) endif() if (NOT DEFINED ARCHITECTURE) set(ARCHITECTURE "GENERIC") - set(ARCHITECTURE_GENERIC 1) - add_definitions(-DARCHITECTURE_GENERIC=1) endif() message(STATUS "Target architecture: ${ARCHITECTURE}") @@ -194,7 +192,7 @@ find_package(Threads REQUIRED) if (ENABLE_QT) if (CITRA_USE_BUNDLED_QT) - if (MSVC_VERSION GREATER_EQUAL 1920 AND ARCHITECTURE_x86_64) + if (MSVC_VERSION GREATER_EQUAL 1920 AND "x86_64" IN_LIST ARCHITECTURE) set(QT_VER qt-5.15.7-msvc2019_64) else() message(FATAL_ERROR "No bundled Qt binaries for your toolchain. Disable CITRA_USE_BUNDLED_QT and provide your own.") @@ -231,7 +229,7 @@ endif() if (ENABLE_FFMPEG) if (CITRA_USE_BUNDLED_FFMPEG) - if ((MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1940) AND ARCHITECTURE_x86_64) + if ((MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1940) AND "x86_64" IN_LIST ARCHITECTURE) set(FFmpeg_VER "ffmpeg-4.1-win64") else() message(FATAL_ERROR "No bundled FFmpeg binaries for your toolchain. Disable CITRA_USE_BUNDLED_FFMPEG and provide your own.") diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 4a94c4ed9..dba0f3cfc 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -37,12 +37,12 @@ option(FMT_INSTALL "" ON) add_subdirectory(fmt) # Xbyak -if (ARCHITECTURE_x86_64) +if ("x86_64" IN_LIST ARCHITECTURE) add_subdirectory(xbyak) endif() # Dynarmic -if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) +if ("x86_64" IN_LIST ARCHITECTURE OR "arm64" IN_LIST ARCHITECTURE) set(DYNARMIC_TESTS OFF) set(DYNARMIC_FRONTENDS "A32") add_subdirectory(dynarmic) diff --git a/externals/dynarmic b/externals/dynarmic index cd2bee17f..9af4b970d 160000 --- a/externals/dynarmic +++ b/externals/dynarmic @@ -1 +1 @@ -Subproject commit cd2bee17f20d8ec1df09f458c0f75114b65ed470 +Subproject commit 9af4b970d302389829448a30608c7cb4fce9b662 diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index a3273cdb6..719ae0d12 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -60,6 +60,7 @@ #include "citra_qt/uisettings.h" #include "citra_qt/updater/updater.h" #include "citra_qt/util/clickable_label.h" +#include "common/arch.h" #include "common/common_paths.h" #include "common/detached_tasks.h" #include "common/file_util.h" @@ -73,7 +74,7 @@ #include "common/scm_rev.h" #include "common/scope_exit.h" #include "common/string_util.h" -#ifdef ARCHITECTURE_x86_64 +#if CITRA_ARCH(x86_64) #include "common/x64/cpu_detect.h" #endif #include "common/settings.h" @@ -204,7 +205,7 @@ GMainWindow::GMainWindow() LOG_INFO(Frontend, "Citra Version: {} | {}-{}", Common::g_build_fullname, Common::g_scm_branch, Common::g_scm_desc); -#ifdef ARCHITECTURE_x86_64 +#if CITRA_ARCH(x86_64) const auto& caps = Common::GetCPUCaps(); std::string cpu_string = caps.cpu_string; if (caps.avx || caps.avx2 || caps.avx512) { diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 0cdb362fe..43b1e1bad 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -54,6 +54,8 @@ add_custom_command(OUTPUT scm_rev.cpp ) add_library(common STATIC + aarch64/cpu_detect.cpp + aarch64/cpu_detect.h alignment.h announce_multiplayer_room.h archives.h @@ -124,34 +126,21 @@ add_library(common STATIC timer.h vector_math.h web_result.h + x64/cpu_detect.cpp + x64/cpu_detect.h + x64/xbyak_abi.h + x64/xbyak_util.h zstd_compression.cpp zstd_compression.h ) -if(ARCHITECTURE_x86_64) - target_sources(common - PRIVATE - x64/cpu_detect.cpp - - x64/cpu_detect.h - x64/xbyak_abi.h - x64/xbyak_util.h - ) -elseif(ARCHITECTURE_arm64) - target_sources(common - PRIVATE - aarch64/cpu_detect.cpp - aarch64/cpu_detect.h - ) -endif() - create_target_directory_groups(common) target_link_libraries(common PUBLIC fmt::fmt microprofile Boost::boost Boost::serialization) target_link_libraries(common PRIVATE libzstd_static) set_target_properties(common PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${ENABLE_LTO}) -if (ARCHITECTURE_x86_64) +if ("x86_64" IN_LIST ARCHITECTURE) target_link_libraries(common PRIVATE xbyak) endif() diff --git a/src/common/aarch64/cpu_detect.cpp b/src/common/aarch64/cpu_detect.cpp index 84eb8608e..52373bdef 100644 --- a/src/common/aarch64/cpu_detect.cpp +++ b/src/common/aarch64/cpu_detect.cpp @@ -2,6 +2,9 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. +#include "common/arch.h" +#if CITRA_ARCH(arm64) + #include #include #include @@ -110,3 +113,5 @@ const CPUCaps& GetCPUCaps() { } } // namespace Common + +#endif // CITRA_ARCH(arm64) diff --git a/src/common/aarch64/cpu_detect.h b/src/common/aarch64/cpu_detect.h index 79c54c2f1..8c037a528 100644 --- a/src/common/aarch64/cpu_detect.h +++ b/src/common/aarch64/cpu_detect.h @@ -4,6 +4,9 @@ #pragma once +#include "common/arch.h" +#if CITRA_ARCH(arm64) + #include namespace Common { @@ -29,3 +32,5 @@ struct CPUCaps { const CPUCaps& GetCPUCaps(); } // namespace Common + +#endif // CITRA_ARCH(arm64) diff --git a/src/common/arch.h b/src/common/arch.h new file mode 100644 index 000000000..5c70b8dca --- /dev/null +++ b/src/common/arch.h @@ -0,0 +1,13 @@ +// Copyright 2023 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include + +#define CITRA_ARCH(NAME) (CITRA_ARCH_##NAME) + +#define CITRA_ARCH_x86_64 BOOST_ARCH_X86_64 +#define CITRA_ARCH_arm64 \ + (BOOST_ARCH_ARM >= BOOST_VERSION_NUMBER(8, 0, 0) && BOOST_ARCH_WORD_BITS == 64) diff --git a/src/common/common_funcs.h b/src/common/common_funcs.h index 446965e90..c29a33b09 100644 --- a/src/common/common_funcs.h +++ b/src/common/common_funcs.h @@ -5,8 +5,9 @@ #pragma once #include +#include "common/arch.h" -#if !defined(ARCHITECTURE_x86_64) +#if !CITRA_ARCH(x86_64) #include // for exit #endif #include "common/common_types.h" @@ -36,7 +37,7 @@ #ifndef _MSC_VER -#ifdef ARCHITECTURE_x86_64 +#if CITRA_ARCH(x86_64) #define Crash() __asm__ __volatile__("int $3") #else #define Crash() exit(1) diff --git a/src/common/telemetry.cpp b/src/common/telemetry.cpp index 6241d08b3..e5fd193ef 100644 --- a/src/common/telemetry.cpp +++ b/src/common/telemetry.cpp @@ -4,11 +4,12 @@ #include #include +#include "common/arch.h" #include "common/assert.h" #include "common/scm_rev.h" #include "common/telemetry.h" -#ifdef ARCHITECTURE_x86_64 +#if CITRA_ARCH(x86_64) #include "common/x64/cpu_detect.h" #endif @@ -54,7 +55,7 @@ void AppendBuildInfo(FieldCollection& fc) { } void AppendCPUInfo(FieldCollection& fc) { -#ifdef ARCHITECTURE_x86_64 +#if CITRA_ARCH(x86_64) fc.AddField(FieldType::UserSystem, "CPU_Model", Common::GetCPUCaps().cpu_string); fc.AddField(FieldType::UserSystem, "CPU_BrandString", Common::GetCPUCaps().brand_string); fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AES", Common::GetCPUCaps().aes); diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp index f6677d5a0..2e301d377 100644 --- a/src/common/x64/cpu_detect.cpp +++ b/src/common/x64/cpu_detect.cpp @@ -2,6 +2,9 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include "common/arch.h" +#if CITRA_ARCH(x86_64) + #include #include "common/common_types.h" #include "common/x64/cpu_detect.h" @@ -144,3 +147,5 @@ const CPUCaps& GetCPUCaps() { } } // namespace Common + +#endif // CITRA_ARCH(x86_64) diff --git a/src/common/x64/cpu_detect.h b/src/common/x64/cpu_detect.h index 92c85c2ec..31ed1c584 100644 --- a/src/common/x64/cpu_detect.h +++ b/src/common/x64/cpu_detect.h @@ -4,6 +4,9 @@ #pragma once +#include "common/arch.h" +#if CITRA_ARCH(x86_64) + namespace Common { /// x86/x64 CPU capabilities that may be detected by this module @@ -33,3 +36,5 @@ struct CPUCaps { const CPUCaps& GetCPUCaps(); } // namespace Common + +#endif // CITRA_ARCH(x86_64) diff --git a/src/common/x64/xbyak_abi.h b/src/common/x64/xbyak_abi.h index 2326c87c0..9c3615346 100644 --- a/src/common/x64/xbyak_abi.h +++ b/src/common/x64/xbyak_abi.h @@ -4,6 +4,9 @@ #pragma once +#include "common/arch.h" +#if CITRA_ARCH(x86_64) + #include #include #include @@ -228,3 +231,5 @@ inline void ABI_PopRegistersAndAdjustStack(Xbyak::CodeGenerator& code, std::bits } } // namespace Common::X64 + +#endif // CITRA_ARCH(x86_64) diff --git a/src/common/x64/xbyak_util.h b/src/common/x64/xbyak_util.h index 461ca0516..32621b59d 100644 --- a/src/common/x64/xbyak_util.h +++ b/src/common/x64/xbyak_util.h @@ -4,6 +4,9 @@ #pragma once +#include "common/arch.h" +#if CITRA_ARCH(x86_64) + #include #include #include "common/x64/xbyak_abi.h" @@ -45,3 +48,5 @@ inline void CallFarFunction(Xbyak::CodeGenerator& code, const T f) { } } // namespace Common::X64 + +#endif // CITRA_ARCH(x86_64) diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index ddf905577..0f473f6fc 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -488,7 +488,7 @@ if (ENABLE_WEB_SERVICE) endif() endif() -if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) +if ("x86_64" IN_LIST ARCHITECTURE OR "arm64" IN_LIST ARCHITECTURE) target_sources(core PRIVATE arm/dynarmic/arm_dynarmic.cpp arm/dynarmic/arm_dynarmic.h diff --git a/src/core/arm/exclusive_monitor.cpp b/src/core/arm/exclusive_monitor.cpp index 53906eff9..5ba6dc9a8 100644 --- a/src/core/arm/exclusive_monitor.cpp +++ b/src/core/arm/exclusive_monitor.cpp @@ -1,7 +1,8 @@ // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64) +#include "common/arch.h" +#if CITRA_ARCH(x86_64) || CITRA_ARCH(arm64) #include "core/arm/dynarmic/arm_exclusive_monitor.h" #endif #include "common/settings.h" @@ -14,7 +15,7 @@ ExclusiveMonitor::~ExclusiveMonitor() = default; std::unique_ptr MakeExclusiveMonitor(Memory::MemorySystem& memory, std::size_t num_cores) { -#if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64) +#if CITRA_ARCH(x86_64) || CITRA_ARCH(arm64) if (Settings::values.use_cpu_jit) { return std::make_unique(memory, num_cores); } diff --git a/src/core/core.cpp b/src/core/core.cpp index 2249a41aa..c99f17a7f 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -10,11 +10,12 @@ #include "audio_core/dsp_interface.h" #include "audio_core/hle/hle.h" #include "audio_core/lle/lle.h" +#include "common/arch.h" #include "common/logging/log.h" #include "common/texture.h" #include "core/arm/arm_interface.h" #include "core/arm/exclusive_monitor.h" -#if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64) +#if CITRA_ARCH(x86_64) || CITRA_ARCH(arm64) #include "core/arm/dynarmic/arm_dynarmic.h" #endif #include "core/arm/dyncom/arm_dyncom.h" @@ -372,7 +373,7 @@ System::ResultStatus System::Init(Frontend::EmuWindow& emu_window, exclusive_monitor = MakeExclusiveMonitor(*memory, num_cores); if (Settings::values.use_cpu_jit) { -#if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64) +#if CITRA_ARCH(x86_64) || CITRA_ARCH(arm64) for (u32 i = 0; i < num_cores; ++i) { cpu_cores.push_back(std::make_shared( this, *memory, i, timing->GetTimer(i), *exclusive_monitor)); diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 118e2c9cf..5158d1348 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -12,15 +12,9 @@ add_executable(tests precompiled_headers.h audio_core/audio_fixures.h audio_core/decoder_tests.cpp + video_core/shader/shader_jit_x64_compiler.cpp ) -if (ARCHITECTURE_x86_64) - target_sources(tests - PRIVATE - video_core/shader/shader_jit_x64_compiler.cpp - ) -endif() - create_target_directory_groups(tests) target_link_libraries(tests PRIVATE common core video_core audio_core) diff --git a/src/tests/video_core/shader/shader_jit_x64_compiler.cpp b/src/tests/video_core/shader/shader_jit_x64_compiler.cpp index 464b2c276..79daca422 100644 --- a/src/tests/video_core/shader/shader_jit_x64_compiler.cpp +++ b/src/tests/video_core/shader/shader_jit_x64_compiler.cpp @@ -2,6 +2,9 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include "common/arch.h" +#if CITRA_ARCH(x86_64) + #include #include #include @@ -158,3 +161,5 @@ TEST_CASE("Nested Loop", "[video_core][shader][shader_jit]") { REQUIRE(shader_unit_jit.registers.output[0].x.ToFloat32() == Catch::Approx(expected_out)); } } + +#endif // CITRA_ARCH(x86_64) diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 6685e26d3..17d7149da 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -87,6 +87,10 @@ add_library(video_core STATIC shader/shader.h shader/shader_interpreter.cpp shader/shader_interpreter.h + shader/shader_jit_x64.cpp + shader/shader_jit_x64_compiler.cpp + shader/shader_jit_x64.h + shader/shader_jit_x64_compiler.h swrasterizer/clipper.cpp swrasterizer/clipper.h swrasterizer/framebuffer.cpp @@ -144,24 +148,13 @@ add_dependencies(video_core shaders) target_include_directories(video_core PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -if(ARCHITECTURE_x86_64) - target_sources(video_core - PRIVATE - shader/shader_jit_x64.cpp - shader/shader_jit_x64_compiler.cpp - - shader/shader_jit_x64.h - shader/shader_jit_x64_compiler.h - ) -endif() - create_target_directory_groups(video_core) target_link_libraries(video_core PUBLIC common core) target_link_libraries(video_core PRIVATE glad nihstro-headers Boost::serialization) set_target_properties(video_core PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${ENABLE_LTO}) -if (ARCHITECTURE_x86_64) +if ("x86_64" IN_LIST ARCHITECTURE) target_link_libraries(video_core PUBLIC xbyak) endif() diff --git a/src/video_core/shader/shader.cpp b/src/video_core/shader/shader.cpp index e757d2185..2e6f5d436 100644 --- a/src/video_core/shader/shader.cpp +++ b/src/video_core/shader/shader.cpp @@ -4,6 +4,7 @@ #include #include +#include "common/arch.h" #include "common/bit_set.h" #include "common/logging/log.h" #include "common/microprofile.h" @@ -12,9 +13,9 @@ #include "video_core/regs_shader.h" #include "video_core/shader/shader.h" #include "video_core/shader/shader_interpreter.h" -#ifdef ARCHITECTURE_x86_64 +#if CITRA_ARCH(x86_64) #include "video_core/shader/shader_jit_x64.h" -#endif // ARCHITECTURE_x86_64 +#endif // CITRA_ARCH(x86_64) #include "video_core/video_core.h" namespace Pica::Shader { @@ -134,13 +135,13 @@ void GSUnitState::ConfigOutput(const ShaderRegs& config) { MICROPROFILE_DEFINE(GPU_Shader, "GPU", "Shader", MP_RGB(50, 50, 240)); -#ifdef ARCHITECTURE_x86_64 +#if CITRA_ARCH(x86_64) static std::unique_ptr jit_engine; -#endif // ARCHITECTURE_x86_64 +#endif // CITRA_ARCH(x86_64) static InterpreterEngine interpreter_engine; ShaderEngine* GetEngine() { -#ifdef ARCHITECTURE_x86_64 +#if CITRA_ARCH(x86_64) // TODO(yuriks): Re-initialize on each change rather than being persistent if (VideoCore::g_shader_jit_enabled) { if (jit_engine == nullptr) { @@ -148,15 +149,15 @@ ShaderEngine* GetEngine() { } return jit_engine.get(); } -#endif // ARCHITECTURE_x86_64 +#endif // CITRA_ARCH(x86_64) return &interpreter_engine; } void Shutdown() { -#ifdef ARCHITECTURE_x86_64 +#if CITRA_ARCH(x86_64) jit_engine = nullptr; -#endif // ARCHITECTURE_x86_64 +#endif // CITRA_ARCH(x86_64) } } // namespace Pica::Shader diff --git a/src/video_core/shader/shader_jit_x64.cpp b/src/video_core/shader/shader_jit_x64.cpp index e70d6fdad..513e128cb 100644 --- a/src/video_core/shader/shader_jit_x64.cpp +++ b/src/video_core/shader/shader_jit_x64.cpp @@ -2,6 +2,9 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include "common/arch.h" +#if CITRA_ARCH(x86_64) + #include "common/microprofile.h" #include "video_core/shader/shader.h" #include "video_core/shader/shader_jit_x64.h" @@ -43,3 +46,5 @@ void JitX64Engine::Run(const ShaderSetup& setup, UnitState& state) const { } } // namespace Pica::Shader + +#endif // CITRA_ARCH(x86_64) diff --git a/src/video_core/shader/shader_jit_x64.h b/src/video_core/shader/shader_jit_x64.h index 3f6b52cd6..b6bbdf317 100644 --- a/src/video_core/shader/shader_jit_x64.h +++ b/src/video_core/shader/shader_jit_x64.h @@ -4,6 +4,9 @@ #pragma once +#include "common/arch.h" +#if CITRA_ARCH(x86_64) + #include #include #include "common/common_types.h" @@ -26,3 +29,5 @@ private: }; } // namespace Pica::Shader + +#endif // CITRA_ARCH(x86_64) diff --git a/src/video_core/shader/shader_jit_x64_compiler.cpp b/src/video_core/shader/shader_jit_x64_compiler.cpp index bcf3d21ec..126596357 100644 --- a/src/video_core/shader/shader_jit_x64_compiler.cpp +++ b/src/video_core/shader/shader_jit_x64_compiler.cpp @@ -2,6 +2,9 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include "common/arch.h" +#if CITRA_ARCH(x86_64) + #include #include #include @@ -1131,3 +1134,5 @@ Xbyak::Label JitShader::CompilePrelude_Exp2() { } } // namespace Pica::Shader + +#endif // CITRA_ARCH(x86_64) diff --git a/src/video_core/shader/shader_jit_x64_compiler.h b/src/video_core/shader/shader_jit_x64_compiler.h index b6e62f01e..96dbfe82a 100644 --- a/src/video_core/shader/shader_jit_x64_compiler.h +++ b/src/video_core/shader/shader_jit_x64_compiler.h @@ -4,6 +4,9 @@ #pragma once +#include "common/arch.h" +#if CITRA_ARCH(x86_64) + #include #include #include @@ -138,3 +141,5 @@ private: }; } // namespace Pica::Shader + +#endif