From 8193805584efb7ba9eb986ee922ed8f5dc95932a Mon Sep 17 00:00:00 2001 From: Marco Rodolfi Date: Thu, 16 Jan 2025 12:07:56 +0100 Subject: [PATCH] [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