build: Update to support multi-arch builds.

This commit is contained in:
Steveice10 2023-01-06 07:28:02 -08:00
parent 0e325255f3
commit a8848cce43
25 changed files with 114 additions and 66 deletions

View file

@ -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.")

View file

@ -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)

2
externals/dynarmic vendored

@ -1 +1 @@
Subproject commit cd2bee17f20d8ec1df09f458c0f75114b65ed470
Subproject commit 9af4b970d302389829448a30608c7cb4fce9b662

View file

@ -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) {

View file

@ -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()

View file

@ -2,6 +2,9 @@
// Licensed under GPLv2+
// Refer to the license.txt file included.
#include "common/arch.h"
#if CITRA_ARCH(arm64)
#include <cstring>
#include <fstream>
#include <string>
@ -110,3 +113,5 @@ const CPUCaps& GetCPUCaps() {
}
} // namespace Common
#endif // CITRA_ARCH(arm64)

View file

@ -4,6 +4,9 @@
#pragma once
#include "common/arch.h"
#if CITRA_ARCH(arm64)
#include <string>
namespace Common {
@ -29,3 +32,5 @@ struct CPUCaps {
const CPUCaps& GetCPUCaps();
} // namespace Common
#endif // CITRA_ARCH(arm64)

13
src/common/arch.h Normal file
View file

@ -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 <boost/predef.h>
#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)

View file

@ -5,8 +5,9 @@
#pragma once
#include <string>
#include "common/arch.h"
#if !defined(ARCHITECTURE_x86_64)
#if !CITRA_ARCH(x86_64)
#include <cstdlib> // 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)

View file

@ -4,11 +4,12 @@
#include <algorithm>
#include <cstring>
#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);

View file

@ -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 <cstring>
#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)

View file

@ -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)

View file

@ -4,6 +4,9 @@
#pragma once
#include "common/arch.h"
#if CITRA_ARCH(x86_64)
#include <bitset>
#include <initializer_list>
#include <xbyak/xbyak.h>
@ -228,3 +231,5 @@ inline void ABI_PopRegistersAndAdjustStack(Xbyak::CodeGenerator& code, std::bits
}
} // namespace Common::X64
#endif // CITRA_ARCH(x86_64)

View file

@ -4,6 +4,9 @@
#pragma once
#include "common/arch.h"
#if CITRA_ARCH(x86_64)
#include <type_traits>
#include <xbyak/xbyak.h>
#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)

View file

@ -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

View file

@ -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<Core::ExclusiveMonitor> 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<Core::DynarmicExclusiveMonitor>(memory, num_cores);
}

View file

@ -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<ARM_Dynarmic>(
this, *memory, i, timing->GetTimer(i), *exclusive_monitor));

View file

@ -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)

View file

@ -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 <algorithm>
#include <cmath>
#include <memory>
@ -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)

View file

@ -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()

View file

@ -4,6 +4,7 @@
#include <cmath>
#include <cstring>
#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<JitX64Engine> 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

View file

@ -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)

View file

@ -4,6 +4,9 @@
#pragma once
#include "common/arch.h"
#if CITRA_ARCH(x86_64)
#include <memory>
#include <unordered_map>
#include "common/common_types.h"
@ -26,3 +29,5 @@ private:
};
} // namespace Pica::Shader
#endif // CITRA_ARCH(x86_64)

View file

@ -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 <algorithm>
#include <cmath>
#include <cstdint>
@ -1131,3 +1134,5 @@ Xbyak::Label JitShader::CompilePrelude_Exp2() {
}
} // namespace Pica::Shader
#endif // CITRA_ARCH(x86_64)

View file

@ -4,6 +4,9 @@
#pragma once
#include "common/arch.h"
#if CITRA_ARCH(x86_64)
#include <array>
#include <bitset>
#include <cstddef>
@ -138,3 +141,5 @@ private:
};
} // namespace Pica::Shader
#endif