From 8193805584efb7ba9eb986ee922ed8f5dc95932a Mon Sep 17 00:00:00 2001 From: Marco Rodolfi Date: Thu, 16 Jan 2025 12:07:56 +0100 Subject: [PATCH 1/3] [BUILD] Fix miscellaneous build failures on Linux These are a collection of miscellaneous required changes to make Clang happy to compile this codebase under Linux. --- premake5.lua | 4 ++++ src/xenia/apu/audio_media_player.h | 1 + src/xenia/apu/xma_context.h | 18 +++++++++--------- src/xenia/apu/xma_context_new.h | 30 +++++++++++++++--------------- src/xenia/base/memory.cc | 7 ++++++- src/xenia/gpu/command_processor.h | 3 +++ third_party/zarchive.lua | 1 + third_party/zstd.lua | 2 ++ 8 files changed, 41 insertions(+), 25 deletions(-) diff --git a/premake5.lua b/premake5.lua index 0a36f5da3..a5508ba75 100644 --- a/premake5.lua +++ b/premake5.lua @@ -145,6 +145,10 @@ filter({"platforms:Linux", "language:C++", "toolset:clang"}) "deprecated-volatile", "switch", "deprecated-enum-enum-conversion", + "attributes", + }) + removeflags({ + "FatalWarnings" }) filter({"platforms:Linux", "language:C++", "toolset:clang", "files:*.cc or *.cpp"}) buildoptions({ diff --git a/src/xenia/apu/audio_media_player.h b/src/xenia/apu/audio_media_player.h index 0b2dc30c8..703ab82f4 100644 --- a/src/xenia/apu/audio_media_player.h +++ b/src/xenia/apu/audio_media_player.h @@ -11,6 +11,7 @@ #define XENIA_APU_AUDIO_MEDIA_PLAYER_H_ #include "xenia/apu/audio_system.h" +#include "xenia/apu/audio_driver.h" #include "xenia/kernel/xam/apps/xmp_app.h" namespace xe { diff --git a/src/xenia/apu/xma_context.h b/src/xenia/apu/xma_context.h index c08d36753..b5cda436b 100644 --- a/src/xenia/apu/xma_context.h +++ b/src/xenia/apu/xma_context.h @@ -160,23 +160,23 @@ static_assert_size(Xma2ExtraData, 34); class XmaContext { public: - static const uint32_t kBytesPerPacket = 2048; - static const uint32_t kBitsPerPacket = kBytesPerPacket * 8; - static const uint32_t kBitsPerHeader = 32; + static constexpr uint32_t kBytesPerPacket = 2048; + static constexpr uint32_t kBitsPerPacket = kBytesPerPacket * 8; + static constexpr uint32_t kBitsPerHeader = 32; - static const uint32_t kBytesPerSample = 2; - static const uint32_t kSamplesPerFrame = 512; - static const uint32_t kSamplesPerSubframe = 128; - static const uint32_t kBytesPerFrameChannel = + static constexpr uint32_t kBytesPerSample = 2; + static constexpr uint32_t kSamplesPerFrame = 512; + static constexpr uint32_t kSamplesPerSubframe = 128; + static constexpr uint32_t kBytesPerFrameChannel = kSamplesPerFrame * kBytesPerSample; - static const uint32_t kBytesPerSubframeChannel = + static constexpr uint32_t kBytesPerSubframeChannel = kSamplesPerSubframe * kBytesPerSample; // static const uint32_t kOutputBytesPerBlock = 256; // static const uint32_t kOutputMaxSizeBytes = 31 * kOutputBytesPerBlock; explicit XmaContext(); - ~XmaContext(); + virtual ~XmaContext(); virtual int Setup(uint32_t id, Memory* memory, uint32_t guest_ptr) { return 0; diff --git a/src/xenia/apu/xma_context_new.h b/src/xenia/apu/xma_context_new.h index 6a6ca5757..71f9b9227 100644 --- a/src/xenia/apu/xma_context_new.h +++ b/src/xenia/apu/xma_context_new.h @@ -45,28 +45,28 @@ static constexpr int kIdToSampleRate[4] = {24000, 32000, 44100, 48000}; class XmaContextNew : public XmaContext { public: - static const uint32_t kBytesPerPacket = 2048; - static const uint32_t kBytesPerPacketHeader = 4; - static const uint32_t kBytesPerPacketData = + static constexpr uint32_t kBytesPerPacket = 2048; + static constexpr uint32_t kBytesPerPacketHeader = 4; + static constexpr uint32_t kBytesPerPacketData = kBytesPerPacket - kBytesPerPacketHeader; - static const uint32_t kBitsPerPacket = kBytesPerPacket * 8; - static const uint32_t kBitsPerPacketHeader = 32; - static const uint32_t kBitsPerFrameHeader = 15; + static constexpr uint32_t kBitsPerPacket = kBytesPerPacket * 8; + static constexpr uint32_t kBitsPerPacketHeader = 32; + static constexpr uint32_t kBitsPerFrameHeader = 15; - static const uint32_t kBytesPerSample = 2; - static const uint32_t kSamplesPerFrame = 512; - static const uint32_t kSamplesPerSubframe = 128; - static const uint32_t kBytesPerFrameChannel = + static constexpr uint32_t kBytesPerSample = 2; + static constexpr uint32_t kSamplesPerFrame = 512; + static constexpr uint32_t kSamplesPerSubframe = 128; + static constexpr uint32_t kBytesPerFrameChannel = kSamplesPerFrame * kBytesPerSample; - static const uint32_t kBytesPerSubframeChannel = + static constexpr uint32_t kBytesPerSubframeChannel = kSamplesPerSubframe * kBytesPerSample; - static const uint32_t kOutputBytesPerBlock = 256; - static const uint32_t kOutputMaxSizeBytes = 31 * kOutputBytesPerBlock; + static constexpr uint32_t kOutputBytesPerBlock = 256; + static constexpr uint32_t kOutputMaxSizeBytes = 31 * kOutputBytesPerBlock; - static const uint32_t kLastFrameMarker = 0x7FFF; - static const uint32_t kMaxFrameSizeinBits = 0x4000 - kBitsPerPacketHeader; + static constexpr uint32_t kLastFrameMarker = 0x7FFF; + static constexpr uint32_t kMaxFrameSizeinBits = 0x4000 - kBitsPerPacketHeader; explicit XmaContextNew(); ~XmaContextNew(); diff --git a/src/xenia/base/memory.cc b/src/xenia/base/memory.cc index 604cf2383..303d3bc67 100644 --- a/src/xenia/base/memory.cc +++ b/src/xenia/base/memory.cc @@ -76,6 +76,9 @@ static void XeCopy16384StreamingAVX(CacheLine* XE_RESTRICT to, } XE_MSVC_REORDER_BARRIER(); } +#ifdef XE_PLATFORM_LINUX +__attribute__((__target__("movdir64b"))) +#endif XE_FORCEINLINE static void XeCopy16384Movdir64M(CacheLine* XE_RESTRICT to, CacheLine* XE_RESTRICT from) { @@ -142,7 +145,9 @@ static void vastcpy_impl_avx(CacheLine* XE_RESTRICT physaddr, xe::swcache::WriteLineNT(physaddr + i, &line0); } } - +#ifdef XE_PLATFORM_LINUX +__attribute__((__target__("movdir64b"))) +#endif static void vastcpy_impl_movdir64m(CacheLine* XE_RESTRICT physaddr, CacheLine* XE_RESTRICT rdmapping, uint32_t written_length) { diff --git a/src/xenia/gpu/command_processor.h b/src/xenia/gpu/command_processor.h index 90f5060a6..6ca90af4e 100644 --- a/src/xenia/gpu/command_processor.h +++ b/src/xenia/gpu/command_processor.h @@ -171,7 +171,10 @@ class CommandProcessor { virtual void WriteRegistersFromMem(uint32_t start_index, uint32_t* base, uint32_t num_registers); + //FIXME(RodoMa92): This fails on Clang with Linux +#ifdef XE_PLATFORM_WINDOWS XE_FORCEINLINE +#endif virtual void WriteRegisterRangeFromRing(xe::RingBuffer* ring, uint32_t base, uint32_t num_registers); diff --git a/third_party/zarchive.lua b/third_party/zarchive.lua index 0abe4f724..4aa9ec820 100644 --- a/third_party/zarchive.lua +++ b/third_party/zarchive.lua @@ -4,6 +4,7 @@ project("zarchive") kind("StaticLib") language("C++") links({ + "zstd", }) defines({ "_LIB", diff --git a/third_party/zstd.lua b/third_party/zstd.lua index f273a6748..1b12581d1 100644 --- a/third_party/zstd.lua +++ b/third_party/zstd.lua @@ -75,6 +75,8 @@ function project_zstd(dir, compression, decompression, deprecated, dictbuilder, defines { 'XXH_NAMESPACE=ZSTD_', + -- See here on why: https://gitlab.kitware.com/cmake/cmake/-/issues/25744 + 'ZSTD_DISABLE_ASM=1', 'ZSTD_LEGACY_SUPPORT=' .. legacy } end From 1e3f256bb7095dbf22d3ff496a95264d5e89912f Mon Sep 17 00:00:00 2001 From: Marco Rodolfi Date: Thu, 16 Jan 2025 12:11:21 +0100 Subject: [PATCH 2/3] [BUILD] Fix miscellaneous build failures on Linux part 2 Missed a couple of changes required that didn't fit on any other category. --- src/xenia/base/memory.h | 8 +++++++- src/xenia/kernel/kernel_state.h | 11 ++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/xenia/base/memory.h b/src/xenia/base/memory.h index bf26ce220..bbff063e3 100644 --- a/src/xenia/base/memory.h +++ b/src/xenia/base/memory.h @@ -724,11 +724,17 @@ static void ReadLineNT(CacheLine* XE_RESTRICT destination, const CacheLine* XE_RESTRICT source) { assert_true((reinterpret_cast(source) & 63ULL) == 0); +#ifdef XENIA_PLATFORM_WINDOWS __m128i first = _mm_stream_load_si128(&source->xmms[0]); __m128i second = _mm_stream_load_si128(&source->xmms[1]); __m128i third = _mm_stream_load_si128(&source->xmms[2]); __m128i fourth = _mm_stream_load_si128(&source->xmms[3]); - +#else + __m128i first = _mm_stream_load_si128(const_cast<__m128i*>(&source->xmms[0])); + __m128i second = _mm_stream_load_si128(const_cast<__m128i*>(&source->xmms[1])); + __m128i third = _mm_stream_load_si128(const_cast<__m128i*>(&source->xmms[2])); + __m128i fourth = _mm_stream_load_si128(const_cast<__m128i*>(&source->xmms[3])); +#endif destination->xmms[0] = first; destination->xmms[1] = second; destination->xmms[2] = third; diff --git a/src/xenia/kernel/kernel_state.h b/src/xenia/kernel/kernel_state.h index d04a4cee2..a67ee35d8 100644 --- a/src/xenia/kernel/kernel_state.h +++ b/src/xenia/kernel/kernel_state.h @@ -153,13 +153,10 @@ struct DPCImpersonationScope { struct KernelVersion { union { xe::be value; - - struct { - xe::be major; - xe::be minor; - xe::be build; - xe::be qfe; - }; + xe::be major; + xe::be minor; + xe::be build; + xe::be qfe; }; KernelVersion(uint16_t build_ver = kBaseKernelBuildVersion) { From 31433106da022702a77d7aee41fe20ab00880cf4 Mon Sep 17 00:00:00 2001 From: Marco Rodolfi Date: Fri, 17 Jan 2025 09:23:53 +0100 Subject: [PATCH 3/3] [kernel] Revert incorrectly modified KernelVersion struct --- src/xenia/kernel/kernel_state.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/xenia/kernel/kernel_state.h b/src/xenia/kernel/kernel_state.h index a67ee35d8..38a82e51f 100644 --- a/src/xenia/kernel/kernel_state.h +++ b/src/xenia/kernel/kernel_state.h @@ -153,10 +153,12 @@ struct DPCImpersonationScope { struct KernelVersion { union { xe::be value; - xe::be major; - xe::be minor; - xe::be build; - xe::be qfe; + union { + xe::be major; + xe::be minor; + xe::be build; + xe::be qfe; + }; }; KernelVersion(uint16_t build_ver = kBaseKernelBuildVersion) {