diff --git a/.ci/build-windows-clang-cl.sh b/.ci/build-windows-clang-cl.sh new file mode 100755 index 000000000000..f6feea350b30 --- /dev/null +++ b/.ci/build-windows-clang-cl.sh @@ -0,0 +1,102 @@ +#!/bin/sh -e + +echo "Starting RPCS3 build (Bash script)" + +# Automatically find clang_rt.builtins-x86_64.lib +echo "Searching for clang_rt.builtins-x86_64.lib ..." +clangBuiltinsLibPath=$(find "C:\Program Files\LLVM\lib\clang" -name "clang_rt.builtins-x86_64.lib" | sed 's|Program Files|PROGRA~1|g') + +if [ -z "$clangBuiltinsLibPath" ]; then + echo "ERROR: Could not find clang_rt.builtins-x86_64.lib in LLVM installation." + exit 1 +fi + +clangBuiltinsDir=$(dirname "$clangBuiltinsLibPath") +clangBuiltinsLib=$(basename "$clangBuiltinsLibPath") +# shellcheck disable=SC2028 +clangPath=$(echo "C:\Program Files\LLVM\bin" | sed 's|Program Files|PROGRA~1|g') + +echo "Found Clang builtins library: $clangBuiltinsLib in $clangBuiltinsDir" +echo "Found Clang Path: $clangPath" + +# Search for mt.exe in SDK bin directories +echo "Searching for llvm-mt.exe ..." +mtPath=$(find "$clangPath" -name "llvm-mt.exe") + +if [ -z "$mtPath" ]; then + echo "ERROR: Could not find llvm-mt.exe in SDK directories." + exit 1 +fi + +echo "Found llvm-mt.exe at: $mtPath" + +VcpkgRoot="$VCPKG_ROOT" +VcpkgBuildRoot="$GITHUB_WORKSPACE/build" +VcpkgTriplet="$VCPKG_TRIPLET" +VcpkgInstall="$VcpkgBuildRoot/vcpkg_installed/$VcpkgTriplet" +VcpkgInclude="$VcpkgInstall/include" +VcpkgLib="$VcpkgInstall/lib" + +# Configure git safe directory +echo "Configuring git safe directory" +git config --global --add safe.directory '*' + +# Initialize submodules except certain ones +echo "Initializing submodules" +set -x +# shellcheck disable=SC2046 +git submodule -q update --init $(awk '/path/ && !/llvm/ && !/opencv/ && !/FAudio/ && !/libpng/ && !/zlib/ && !/feralinteractive/ { print $3 }' .gitmodules) +set +x + +# Create and enter build directory +echo "Creating build directory" +mkdir -p build +cd build || exit +echo "Changed directory to: $(pwd)" + +# Run CMake with Ninja generator and required flags +echo "Running CMake configuration" +cmake .. \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_C_COMPILER="${clangPath}/clang-cl.exe" \ + -DCMAKE_CXX_COMPILER="${clangPath}/clang-cl.exe" \ + -DCMAKE_LINKER="${clangPath}/lld-link.exe" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_TOOLCHAIN_FILE="$VcpkgRoot/scripts/buildsystems/vcpkg.cmake" \ + -DCMAKE_EXE_LINKER_FLAGS="/LIBPATH:${clangBuiltinsDir} /defaultlib:${clangBuiltinsLib}" \ + -DCMAKE_MT="${mtPath}" \ + -DUSE_NATIVE_INSTRUCTIONS=OFF \ + -DUSE_PRECOMPILED_HEADERS=OFF \ + -DVCPKG_TARGET_TRIPLET="$VcpkgTriplet" \ + -DFFMPEG_INCLUDE_DIR="$VcpkgInclude" \ + -DFFMPEG_LIBAVCODEC="$VcpkgLib/avcodec.lib" \ + -DFFMPEG_LIBAVFORMAT="$VcpkgLib/avformat.lib" \ + -DFFMPEG_LIBAVUTIL="$VcpkgLib/avutil.lib" \ + -DFFMPEG_LIBSWSCALE="$VcpkgLib/swscale.lib" \ + -DFFMPEG_LIBSWRESAMPLE="$VcpkgLib/swresample.lib" \ + -DUSE_SYSTEM_CURL=OFF \ + -DUSE_FAUDIO=OFF \ + -DUSE_SDL=ON \ + -DUSE_SYSTEM_SDL=OFF \ + -DUSE_SYSTEM_FFMPEG=ON \ + -DUSE_SYSTEM_OPENCV=ON \ + -DUSE_SYSTEM_OPENAL=OFF \ + -DUSE_SYSTEM_LIBPNG=ON \ + -DUSE_DISCORD_RPC=ON \ + -DUSE_SYSTEM_ZSTD=ON \ + -DWITH_LLVM=ON \ + -DSTATIC_LINK_LLVM=ON \ + -DBUILD_RPCS3_TESTS=OFF + +echo "CMake configuration complete" + +# Build with ninja +echo "Starting build with Ninja..." +ninja + +echo "Build succeeded" + +# Go back to root directory +cd .. +echo "Returned to root directory: $(pwd)" diff --git a/.ci/build-windows-clang.sh b/.ci/build-windows-clang.sh index 0880e7f5edae..06482dd63a65 100644 --- a/.ci/build-windows-clang.sh +++ b/.ci/build-windows-clang.sh @@ -57,5 +57,5 @@ cd .. # If it compiled succesfully let's deploy. if [ "$build_status" -eq 0 ]; then - .ci/deploy-windows-clang.sh "x86_64" + echo "Build succeeded" fi diff --git a/.ci/deploy-windows-clang-cl.sh b/.ci/deploy-windows-clang-cl.sh new file mode 100644 index 000000000000..08bc60a66f8b --- /dev/null +++ b/.ci/deploy-windows-clang-cl.sh @@ -0,0 +1,42 @@ +#!/bin/sh -ex + +# source ci-vars.env +# shellcheck disable=SC1091 +. .ci/ci-vars.env + +cd build || exit 1 + +CPU_ARCH="${1:-x86_64}" + +echo "Deploying rpcs3 windows clang-cl $CPU_ARCH" + +# First let's print some info about our caches +C:/Strawberry/c/bin/ccache.exe --show-stats -v + +# BUILD_blablabla is CI specific, so we wrap it for portability +ARTIFACT_DIR="$BUILD_ARTIFACTSTAGINGDIRECTORY" + +# Remove unecessary files +rm -f ./bin/vulkan-1.dll + +# Prepare compatibility and SDL database for packaging +mkdir ./bin/config +mkdir ./bin/config/input_configs +curl -fsSL 'https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt' 1> ./bin/config/input_configs/gamecontrollerdb.txt +curl -fsSL 'https://rpcs3.net/compatibility?api=v1&export' | iconv -t UTF-8 1> ./bin/GuiConfigs/compat_database.dat + +# Download SSL certificate (not needed with CURLSSLOPT_NATIVE_CA) +#curl -fsSL 'https://curl.haxx.se/ca/cacert.pem' 1> ./bin/cacert.pem + +# Package artifacts +7z a -m0=LZMA2 -mx9 "$BUILD" ./bin/* + +# Generate sha256 hashes +# Write to file for GitHub releases +sha256sum "$BUILD" | awk '{ print $1 }' | tee "$BUILD.sha256" +echo "$(cat "$BUILD.sha256");$(stat -c %s "$BUILD")B" > GitHubReleaseMessage.txt + +# Move files to publishing directory +mkdir "$ARTIFACT_DIR" +cp -- "$BUILD" "$ARTIFACT_DIR" +cp -- "$BUILD.sha256" "$ARTIFACT_DIR" diff --git a/.github/workflows/rpcs3.yml b/.github/workflows/rpcs3.yml index 9964c045f5fb..8cf871a8f435 100644 --- a/.github/workflows/rpcs3.yml +++ b/.github/workflows/rpcs3.yml @@ -10,6 +10,9 @@ on: pull_request: workflow_dispatch: +permissions: + packages: write + concurrency: group: ${{ github.ref }}-${{ github.event_name }} cancel-in-progress: true @@ -325,10 +328,10 @@ jobs: path: ${{ env.DEPS_CACHE_DIR }} key: ${{ steps.restore-dependencies-cache.outputs.cache-primary-key }} - Windows_Build_Clang: + + Windows_Build_MSYS2: # Only run push event on master branch of main repo, but run all PRs if: github.event_name != 'push' || (github.repository == 'RPCS3/rpcs3' && github.ref_name == 'master') - name: RPCS3 Windows Clang runs-on: windows-2025 strategy: matrix: @@ -338,6 +341,7 @@ jobs: arch: win64 env: CCACHE_DIR: 'C:\ccache' + name: RPCS3 Windows Clang (MSYS2) steps: - name: Checkout repository uses: actions/checkout@main @@ -386,8 +390,119 @@ jobs: run: | export CCACHE_DIR=$(cygpath -u "$CCACHE_DIR") echo "CCACHE_DIR=$CCACHE_DIR" - .ci/setup-windows-ci-vars.sh ${{ matrix.arch }} ${{ matrix.compiler }} .ci/build-windows-clang.sh + .ci/setup-windows-ci-vars.sh ${{ matrix.arch }} ${{ matrix.compiler }} + .ci/deploy-windows-${{ matrix.compiler }}.sh + + - name: Save build Ccache + if: github.ref == 'refs/heads/master' + uses: actions/cache/save@main + with: + path: ${{ env.CCACHE_DIR }} + key: ${{ steps.restore-build-ccache.outputs.cache-primary-key }} + + - name: Upload artifacts + uses: actions/upload-artifact@main + with: + name: RPCS3 for Windows (${{ runner.arch }}, ${{ matrix.compiler }}) + path: ${{ env.BUILD_ARTIFACTSTAGINGDIRECTORY }} + compression-level: 0 + if-no-files-found: error + + Windows_Build_CLANG-CL: + # Only run push event on master branch of main repo, but run all PRs + if: github.event_name != 'push' || (github.repository == 'RPCS3/rpcs3' && github.ref_name == 'master') + runs-on: windows-2025 + strategy: + fail-fast: false + matrix: + include: + - compiler: clang-cl + llvmver: 19.1.7 + arch: win64 + + env: + CCACHE_DIR: 'C:\ccache' + VCPKG_TRIPLET: x64-windows + VCPKG_BUILD_TYPE: release + VCPKG_ROOT: "${{github.workspace}}/vcpkg" + VCPKG_BINARY_SOURCES: 'clear;nuget,GitHub,readwrite' + name: RPCS3 Windows Clang (Clang-CL) + steps: + - name: Checkout repository + uses: actions/checkout@main + with: + fetch-depth: 0 + + - name: Clone and bootstrap vcpkg + shell: pwsh + run: | + git clone https://github.com/microsoft/vcpkg.git + .\vcpkg\bootstrap-vcpkg.bat + + - name: 'Setup NuGet Credentials for vcpkg' + run: | + `./vcpkg/vcpkg fetch nuget | tail -n 1` \ + sources add \ + -source "https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json" \ + -storepasswordincleartext \ + -name "GitHub" \ + -username "${{ github.repository_owner }}" \ + -password "${{ secrets.GITHUB_TOKEN }}" + `./vcpkg/vcpkg fetch nuget | tail -n 1` \ + setapikey "${{ secrets.GITHUB_TOKEN }}" \ + -source "https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json" + + - name: Restore LLVM Cache + uses: actions/cache/restore@main + id: llvm-cache + with: + path: ./llvm-${{ matrix.llvmver }} + key: ${{ runner.os }}-llvm-dl-cache-${{ hashFiles('**/llvm-${{ matrix.llvmver }}') }} + restore-keys: ${{ runner.os }}-clang-dl-cache- + + - name: Add LLVM + shell: pwsh + run: | + if (!(Test-Path -Path D:\a\rpcs3\rpcs3\llvm-${{ matrix.llvmver }}\)) { + rm -r llvm-* + curl -fsSLO https://github.com/vovkos/llvm-package-windows/releases/download/llvm-${{ matrix.llvmver }}/llvm-${{ matrix.llvmver }}-windows-amd64-msvc17-msvcrt.7z + curl -fsSLO https://github.com/vovkos/llvm-package-windows/releases/download/clang-${{ matrix.llvmver }}/clang-${{ matrix.llvmver }}-windows-amd64-msvc17-msvcrt.7z + 7z x llvm-*.7z + mv llvm* llvm-${{ matrix.llvmver }} + rm llvm-*.7z + 7z x clang-*.7z + Copy-Item -Path "D:\a\rpcs3\rpcs3\clang*\*" -Destination "D:\a\rpcs3\rpcs3\llvm-${{ matrix.llvmver }}" -Recurse -Force + rm -r clang* + } + Add-Content -Path $env:GITHUB_PATH -Value "D:\a\rpcs3\rpcs3\llvm-${{ matrix.llvmver }}\bin" + + - name: Save LLVM Cache + if: ${{ github.ref == 'refs/heads/master' }} + uses: actions/cache/save@main + with: + path: ./llvm-${{ matrix.llvmver }} + key: ${{ steps.llvm-cache.outputs.cache-primary-key }} + + - name: Restore build Ccache + uses: actions/cache/restore@main + id: restore-build-ccache + with: + path: ${{ env.CCACHE_DIR }} + key: ${{ runner.os }}-ccache-${{ matrix.compiler }}-${{ runner.arch }}-${{ github.run_id }} + restore-keys: ${{ runner.os }}-ccache-${{ matrix.compiler }}-${{ runner.arch }}- + + - name: install DIA SDK + run: | + mkdir -p "C:/Program Files (x86)/Microsoft Visual Studio/2019/Professional" || true + cp -r "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/DIA SDK" "C:/Program Files (x86)/Microsoft Visual Studio/2019/Professional/DIA SDK" + "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" amd64 + + - name: Build RPCS3 + run: | + .ci/build-windows-clang-cl.sh + .ci/setup-windows-ci-vars.sh ${{ matrix.arch }} ${{ matrix.compiler }} + .ci/deploy-windows-${{ matrix.compiler }}.sh - name: Save build Ccache if: github.ref == 'refs/heads/master' @@ -405,7 +520,7 @@ jobs: if-no-files-found: error FreeBSD_Build: - # Only run push event on master branch of main repo, but run all PRs + # Only run push event on master branch of main repo, but run all PRs if: github.event_name != 'push' || (github.repository == 'RPCS3/rpcs3' && github.ref_name == 'master') name: RPCS3 FreeBSD runs-on: ubuntu-latest diff --git a/3rdparty/OpenAL/CMakeLists.txt b/3rdparty/OpenAL/CMakeLists.txt index b9fee23ce5fc..2889eafb4533 100644 --- a/3rdparty/OpenAL/CMakeLists.txt +++ b/3rdparty/OpenAL/CMakeLists.txt @@ -11,8 +11,10 @@ if(USE_SYSTEM_OPENAL) else() option(ALSOFT_UTILS "Build utility programs" OFF) option(ALSOFT_EXAMPLES "Build example programs" OFF) + option(ALSOFT_ENABLE_MODULES "Enable use of C++20 modules when supported" OFF) set(LIBTYPE "STATIC") add_subdirectory(openal-soft EXCLUDE_FROM_ALL) add_library(3rdparty_openal INTERFACE) target_link_libraries(3rdparty_openal INTERFACE OpenAL::OpenAL) + target_compile_options(3rdparty_openal INTERFACE -Wno-deprecated-literal-operator) endif() diff --git a/3rdparty/OpenAL/openal-soft.vcxproj b/3rdparty/OpenAL/openal-soft.vcxproj index 7782ddc94013..b0614f89e39f 100644 --- a/3rdparty/OpenAL/openal-soft.vcxproj +++ b/3rdparty/OpenAL/openal-soft.vcxproj @@ -49,11 +49,11 @@ call vsdevcmd.bat -arch=amd64 cd "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)" - cmake -G Ninja -DCMAKE_CXX_COMPILER="cl.exe" -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_BUILD_TYPE="Release" -DCMAKE_INSTALL_PREFIX="./Release" -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DCMAKE_SYSTEM_VERSION=10.0 -DLIBTYPE=STATIC -DFORCE_STATIC_VCRT=true -DALSOFT_UTILS=false -DALSOFT_EXAMPLES=false -DALSOFT_INSTALL=false -DALSOFT_INSTALL_CONFIG=false -DALSOFT_INSTALL_HRTF_DATA=false -DALSOFT_INSTALL_AMBDEC_PRESETS=false -DALSOFT_INSTALL_EXAMPLES=false -DALSOFT_INSTALL_UTILS=false "$(SolutionDir)3rdparty\OpenAL\openal-soft" + cmake -G Ninja -DCMAKE_CXX_COMPILER="cl.exe" -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_BUILD_TYPE="Release" -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DCMAKE_INSTALL_PREFIX="./Release" -DCMAKE_SYSTEM_VERSION=10.0 -DLIBTYPE=STATIC -DFORCE_STATIC_VCRT=true -DALSOFT_UTILS=false -DALSOFT_EXAMPLES=false -DALSOFT_INSTALL=false -DALSOFT_INSTALL_CONFIG=false -DALSOFT_INSTALL_HRTF_DATA=false -DALSOFT_INSTALL_AMBDEC_PRESETS=false -DALSOFT_INSTALL_EXAMPLES=false -DALSOFT_INSTALL_UTILS=false "$(SolutionDir)3rdparty\OpenAL\openal-soft" call vsdevcmd.bat -arch=amd64 cd "$(SolutionDir)build\tmp\$(ProjectName)-$(Configuration)-$(Platform)" - cmake -G Ninja -DCMAKE_CXX_COMPILER="cl.exe" -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_INSTALL_PREFIX="./Debug" -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug -DCMAKE_SYSTEM_VERSION=10.0 -DLIBTYPE=STATIC -DALSOFT_UTILS=false -DALSOFT_EXAMPLES=false -DALSOFT_INSTALL=false -DALSOFT_INSTALL_CONFIG=false -DALSOFT_INSTALL_HRTF_DATA=false -DALSOFT_INSTALL_AMBDEC_PRESETS=false -DALSOFT_INSTALL_EXAMPLES=false -DALSOFT_INSTALL_UTILS=false "$(SolutionDir)3rdparty\OpenAL\openal-soft" + cmake -G Ninja -DCMAKE_CXX_COMPILER="cl.exe" -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_BUILD_TYPE="Debug" -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug -DCMAKE_INSTALL_PREFIX="./Debug" -DCMAKE_SYSTEM_VERSION=10.0 -DLIBTYPE=STATIC -DALSOFT_UTILS=false -DALSOFT_EXAMPLES=false -DALSOFT_INSTALL=false -DALSOFT_INSTALL_CONFIG=false -DALSOFT_INSTALL_HRTF_DATA=false -DALSOFT_INSTALL_AMBDEC_PRESETS=false -DALSOFT_INSTALL_EXAMPLES=false -DALSOFT_INSTALL_UTILS=false "$(SolutionDir)3rdparty\OpenAL\openal-soft" echo Copying.. diff --git a/3rdparty/asmjit/CMakeLists.txt b/3rdparty/asmjit/CMakeLists.txt index ae88ce2fe83c..dbbf85f36273 100644 --- a/3rdparty/asmjit/CMakeLists.txt +++ b/3rdparty/asmjit/CMakeLists.txt @@ -11,6 +11,7 @@ include("${ASMJIT_DIR}/CMakeLists.txt") add_library(asmjit ${ASMJIT_SRC}) target_include_directories(asmjit PUBLIC ${ASMJIT_DIR}/src) target_link_libraries(asmjit PRIVATE ${ASMJIT_DEPS}) +target_compile_options(asmjit PRIVATE -Wno-nontrivial-memcall -Wno-deprecated-anon-enum-enum-conversion) # ASMJIT should have a option for disabling installing and this wouldnt # be required to avoid installing ASMJIT... diff --git a/3rdparty/cubeb/CMakeLists.txt b/3rdparty/cubeb/CMakeLists.txt index 6d1f231f0b72..427bb0eff54f 100644 --- a/3rdparty/cubeb/CMakeLists.txt +++ b/3rdparty/cubeb/CMakeLists.txt @@ -10,6 +10,11 @@ set(USE_SANITIZERS FALSE CACHE BOOL "Dont't use sanitizers") add_subdirectory(cubeb EXCLUDE_FROM_ALL) add_library(3rdparty::cubeb ALIAS cubeb) +target_compile_options(cubeb PRIVATE + -Wno-int-to-void-pointer-cast + -Wno-deprecated-declarations + -Wno-implicit-const-int-float-conversion + ) if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm|ARM|aarch64|AArch64|Aarch64)") target_compile_definitions(speex PUBLIC diff --git a/3rdparty/libusb/config.cmake b/3rdparty/libusb/config.cmake index 1a9833eb9b2b..8166c1773e1b 100644 --- a/3rdparty/libusb/config.cmake +++ b/3rdparty/libusb/config.cmake @@ -33,6 +33,13 @@ if (${CMAKE_CXX_COMPILER_ID} MATCHES "GNU") ) elseif(MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS) + if (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang") + append_compiler_flags( + -Wno-unused-value + -Wno-pragma-pack + ${ADDITIONAL_CC_FLAGS} + ) + endif() endif() check_include_files(sys/timerfd.h USBI_TIMERFD_AVAILABLE) diff --git a/3rdparty/llvm/llvm_build_clang_cl.vcxproj b/3rdparty/llvm/llvm_build_clang_cl.vcxproj index c0ccb204c6a1..4495806eb75e 100644 --- a/3rdparty/llvm/llvm_build_clang_cl.vcxproj +++ b/3rdparty/llvm/llvm_build_clang_cl.vcxproj @@ -106,4 +106,4 @@ - \ No newline at end of file + diff --git a/3rdparty/wolfssl/CMakeLists.txt b/3rdparty/wolfssl/CMakeLists.txt index cf1a66a1f52a..0b3f00872c1b 100644 --- a/3rdparty/wolfssl/CMakeLists.txt +++ b/3rdparty/wolfssl/CMakeLists.txt @@ -22,5 +22,17 @@ else() add_subdirectory(wolfssl EXCLUDE_FROM_ALL) - target_compile_definitions(wolfssl PUBLIC WOLFSSL_DES_ECB HAVE_WRITE_DUP FP_MAX_BITS=8192 WOLFSSL_NO_OPTIONS_H) -endif() + target_compile_definitions(wolfssl PUBLIC WOLFSSL_DES_ECB HAVE_WRITE_DUP WOLFSSL_NO_OPTIONS_H) + + if(MSVC AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + # Disable 128-bit Math + set(WOLFSSL_ASM ON CACHE BOOL "" FORCE) + set(WOLFSSL_FAST_MATH OFF CACHE BOOL "" FORCE) + target_compile_definitions(wolfssl PUBLIC WOLFSSL_SP_NO_128BIT FP_MAX_BITS=4096) + + # Disable warnings + target_compile_options(wolfssl PRIVATE /w) + else() + target_compile_definitions(wolfssl PUBLIC FP_MAX_BITS=8192) + endif() + endif() diff --git a/3rdparty/yaml-cpp/CMakeLists.txt b/3rdparty/yaml-cpp/CMakeLists.txt index 0c123a37b8e7..41fdf4173c6b 100644 --- a/3rdparty/yaml-cpp/CMakeLists.txt +++ b/3rdparty/yaml-cpp/CMakeLists.txt @@ -12,5 +12,6 @@ set(YAML_CPP_BUILD_TESTS OFF CACHE BOOL "Enable testing" FORCE) set(YAML_CPP_BUILD_TOOLS OFF CACHE BOOL "Enable parse tools" FORCE) set(YAML_CPP_BUILD_CONTRIB OFF CACHE BOOL "Enable contrib stuff in library" FORCE) add_subdirectory(yaml-cpp EXCLUDE_FROM_ALL) +target_compile_options(yaml-cpp PRIVATE -Wno-ignored-attributes -Wno-unused-value) set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX_OLD}) diff --git a/CMakeLists.txt b/CMakeLists.txt index f459351379e5..0320df4d4eec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -129,7 +129,9 @@ if(MSVC) message(AUTHOR_WARNING "Debug build currently can not work with static CRT.") endif() endif() - add_compile_options(/MP) + if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + add_compile_options(/MP) + endif() endif() if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) diff --git a/Utilities/StrFmt.cpp b/Utilities/StrFmt.cpp index c628a90a8aca..189773731eb1 100644 --- a/Utilities/StrFmt.cpp +++ b/Utilities/StrFmt.cpp @@ -525,7 +525,7 @@ void fmt_class_string::format(std::string& out, u64 arg) return; } -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) fmt::append(out, "0x%016llx%016llx", num.hi, num.lo); #else fmt::append(out, "0x%016llx%016llx", static_cast(num >> 64), static_cast(num)); diff --git a/buildfiles/cmake/ConfigureCompiler.cmake b/buildfiles/cmake/ConfigureCompiler.cmake index be900d13c250..1685e4d13e6f 100644 --- a/buildfiles/cmake/ConfigureCompiler.cmake +++ b/buildfiles/cmake/ConfigureCompiler.cmake @@ -1,7 +1,18 @@ # Check and configure compiler options for RPCS3 if(MSVC) - add_compile_options(/Zc:throwingNew- /constexpr:steps16777216) + if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + check_cxx_compiler_flag("-msse -msse2 -mcx16" COMPILER_X86) + check_cxx_compiler_flag("-march=native" COMPILER_SUPPORTS_MARCH_NATIVE) + if (COMPILER_X86) + add_compile_options(-msse -msse2 -mcx16) + endif() + if(COMPILER_SUPPORTS_MARCH_NATIVE) + add_compile_options(-march=native) + endif() + else() + add_compile_options(/Zc:throwingNew- /constexpr:steps16777216) + endif() add_compile_definitions( _CRT_SECURE_NO_DEPRECATE=1 _CRT_NON_CONFORMING_SWPRINTFS=1 _SCL_SECURE_NO_WARNINGS=1 NOMINMAX _ENABLE_EXTENDED_ALIGNED_STORAGE=1 _HAS_EXCEPTIONS=0) diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index 3217cc38f59e..e8ccc21d22fd 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -147,10 +147,15 @@ if (NOT ANDROID) COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/bin/Icons $/Icons COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/bin/GuiConfigs $/GuiConfigs COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/bin/test $/test - COMMAND "${WINDEPLOYQT_EXECUTABLE}" --no-compiler-runtime --no-opengl-sw --no-patchqt + ) + get_target_property(WINDEPLOYQT_EXECUTABLE Qt6::windeployqt IMPORTED_LOCATION) + add_custom_command(TARGET rpcs3 POST_BUILD + COMMAND ${WINDEPLOYQT_EXECUTABLE} --no-compiler-runtime --no-opengl-sw --no-patchqt --no-translations --no-system-d3d-compiler --no-system-dxc-compiler --no-quick-import - --plugindir "$,$/plugins,$/share/qt6/plugins>" - --verbose 0 "$") + --plugindir "$,$/qt6/plugins,$/share/qt6/plugins>" + --verbose 0 + $ + ) endif() # Unix installation diff --git a/rpcs3/Crypto/aesni.cpp b/rpcs3/Crypto/aesni.cpp index 05bb65fe7f54..e75333c24925 100644 --- a/rpcs3/Crypto/aesni.cpp +++ b/rpcs3/Crypto/aesni.cpp @@ -35,6 +35,9 @@ #if defined(_MSC_VER) && defined(_M_X64) #define POLARSSL_HAVE_MSVC_X64_INTRINSICS #include +#ifdef __clang__ +#include +#endif #endif /* @@ -197,6 +200,21 @@ void aesni_gcm_mult( unsigned char c[16], const unsigned char b[16] ) { #if defined(POLARSSL_HAVE_MSVC_X64_INTRINSICS) + #ifdef __clang__ + __m128i xa, xb, m0, m1, x10, x32, r; + + xa[1] = _byteswap_uint64( *((unsigned __int64*)a + 0) ); + xa[0] = _byteswap_uint64( *((unsigned __int64*)a + 1) ); + xb[1] = _byteswap_uint64( *((unsigned __int64*)b + 0) ); + xb[0] = _byteswap_uint64( *((unsigned __int64*)b + 1) ); + + clmul256( xa, xb, &m0, &m1 ); + sll256( m0, m1, &x10, &x32 ); + r = reducemod128( x10, x32 ); + + *((unsigned __int64*)c + 0) = _byteswap_uint64( r[1] ); + *((unsigned __int64*)c + 1) = _byteswap_uint64( r[0] ); +#else __m128i xa, xb, m0, m1, x10, x32, r; xa.m128i_u64[1] = _byteswap_uint64( *((unsigned __int64*)a + 0) ); @@ -210,6 +228,7 @@ void aesni_gcm_mult( unsigned char c[16], *((unsigned __int64*)c + 0) = _byteswap_uint64( r.m128i_u64[1] ); *((unsigned __int64*)c + 1) = _byteswap_uint64( r.m128i_u64[0] ); +#endif #else unsigned char aa[16], bb[16], cc[16]; size_t i; diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 139688947dc4..294241d07e5c 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -81,6 +81,7 @@ target_sources(rpcs3_emu PRIVATE ../../Utilities/Thread.cpp ../../Utilities/version.cpp ) + if(APPLE) target_sources(rpcs3_emu PRIVATE ../../darwin/util/sysinfo_darwin.mm @@ -90,12 +91,12 @@ endif() target_include_directories(rpcs3_emu PUBLIC "${CMAKE_SOURCE_DIR}") set_source_files_properties("../../Utilities/JITLLVM.cpp" "../../Utilities/JITASM.cpp" PROPERTIES - COMPILE_FLAGS "$,/GR-,-fno-rtti>" + COMPILE_FLAGS "$,$,/GR-,>,-fno-rtti>" SKIP_PRECOMPILE_HEADERS ON ) set_source_files_properties("../util/yaml.cpp" PROPERTIES - COMPILE_FLAGS "$,/EHsc,-fexceptions>" + COMPILE_FLAGS "$,$,/EHsc,>,-fexceptions>" SKIP_PRECOMPILE_HEADERS ON ) diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 2673685bb247..80d1b4d9569e 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -452,7 +452,7 @@ extern void mov_rdata_nt(spu_rdata_t& _dst, const spu_rdata_t& _src) #endif } -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) #define mwaitx_func #define waitpkg_func #else diff --git a/rpcs3/Emu/Cell/lv2/lv2.cpp b/rpcs3/Emu/Cell/lv2/lv2.cpp index c405b98a2c4d..a81eb949b543 100644 --- a/rpcs3/Emu/Cell/lv2/lv2.cpp +++ b/rpcs3/Emu/Cell/lv2/lv2.cpp @@ -2063,7 +2063,7 @@ void lv2_obj::set_yield_frequency(u64 freq, u64 max_allowed_tsc) g_lv2_preempts_taken.release(0); } -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) #define mwaitx_func #define waitpkg_func #else diff --git a/rpcs3/Emu/RSX/Common/BufferUtils.cpp b/rpcs3/Emu/RSX/Common/BufferUtils.cpp index d6ee2349d202..d0704e5ad671 100644 --- a/rpcs3/Emu/RSX/Common/BufferUtils.cpp +++ b/rpcs3/Emu/RSX/Common/BufferUtils.cpp @@ -19,7 +19,7 @@ #include "Emu/CPU/sse2neon.h" #endif -#if defined(_MSC_VER) || !defined(__SSE2__) +#if defined(_MSC_VER) && !defined(__clang__) || !defined(__SSE2__) #define SSE4_1_FUNC #define AVX2_FUNC #define AVX3_FUNC diff --git a/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp b/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp index 45b2da4af66b..32476dc62cf4 100644 --- a/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp +++ b/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp @@ -23,7 +23,7 @@ #endif #endif -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) #define AVX512_ICL_FUNC #else #define AVX512_ICL_FUNC __attribute__((__target__("avx512f,avx512bw,avx512dq,avx512cd,avx512vl,avx512bitalg,avx512ifma,avx512vbmi,avx512vbmi2,avx512vnni,avx512vpopcntdq"))) diff --git a/rpcs3/util/asm.hpp b/rpcs3/util/asm.hpp index deca38b4130d..6441a00f6b9e 100644 --- a/rpcs3/util/asm.hpp +++ b/rpcs3/util/asm.hpp @@ -6,7 +6,7 @@ #include #ifdef ARCH_X64 -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) #include #else #include @@ -66,7 +66,7 @@ namespace utils constexpr u32 popcnt128(const u128& v) { -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) return std::popcount(v.lo) + std::popcount(v.hi); #else return std::popcount(v); @@ -98,7 +98,7 @@ namespace utils inline s64 div128(s64 high, s64 low, s64 divisor, s64* remainder = nullptr) { -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) s64 rem = 0; s64 r = _div128(high, low, divisor, &rem); @@ -120,7 +120,7 @@ namespace utils inline u64 udiv128(u64 high, u64 low, u64 divisor, u64* remainder = nullptr) { -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) u64 rem = 0; u64 r = _udiv128(high, low, divisor, &rem); @@ -140,7 +140,7 @@ namespace utils return r; } -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) inline u128 operator/(u128 lhs, u64 rhs) { u64 rem = 0; @@ -150,7 +150,7 @@ namespace utils constexpr u32 ctz128(u128 arg) { -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) if (!arg.lo) return std::countr_zero(arg.hi) + 64u; else @@ -162,7 +162,7 @@ namespace utils constexpr u32 clz128(u128 arg) { -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) if (arg.hi) return std::countl_zero(arg.hi); else @@ -279,6 +279,6 @@ namespace utils using utils::busy_wait; -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) using utils::operator/; #endif diff --git a/rpcs3/util/sysinfo.cpp b/rpcs3/util/sysinfo.cpp index bf9376239c5f..140f608d3532 100755 --- a/rpcs3/util/sysinfo.cpp +++ b/rpcs3/util/sysinfo.cpp @@ -46,7 +46,7 @@ static inline std::array get_cpuid(u32 func, u32 subfunc) static inline u64 get_xgetbv(u32 xcr) { -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) return _xgetbv(xcr); #else u32 eax, edx; diff --git a/rpcs3/util/types.hpp b/rpcs3/util/types.hpp index 690f51c0e75b..2ef140e94181 100644 --- a/rpcs3/util/types.hpp +++ b/rpcs3/util/types.hpp @@ -249,13 +249,13 @@ class b8 } }; -#if defined(ARCH_X64) && !defined(_MSC_VER) +#if defined(ARCH_X64) && !defined(_MSC_VER) && !defined(__m128) using __m128i = long long __attribute__((vector_size(16))); using __m128d = double __attribute__((vector_size(16))); using __m128 = float __attribute__((vector_size(16))); #endif -#ifndef _MSC_VER +#if !defined(_MSC_VER) || defined(__clang__) using u128 = __uint128_t; using s128 = __int128_t; #else @@ -266,8 +266,8 @@ extern "C" union __m128i; struct __m128d; - uchar _addcarry_u64(uchar, u64, u64, u64*); - uchar _subborrow_u64(uchar, u64, u64, u64*); + constexpr uchar _addcarry_u64(uchar, u64, u64, u64*); + constexpr uchar _subborrow_u64(uchar, u64, u64, u64*); u64 __shiftleft128(u64, u64, uchar); u64 __shiftright128(u64, u64, uchar); u64 _umul128(u64, u64, u64*); @@ -579,7 +579,7 @@ struct s128 : u128 // Optimization for u64*u64=u128 constexpr u128 u128_from_mul(u64 a, u64 b) { -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) if (!std::is_constant_evaluated()) { u64 hi; diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 000000000000..9b5d53aaae6c --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,24 @@ +{ + "name": "rpcs3", + "version-string": "1.0", + "builtin-baseline": "b94ab47c998b93fe72b0f501eaac70f96328019e", + "dependencies": [ + { + "name": "ffmpeg", + "features": [ + "avcodec", + "avformat", + "swscale", + "swresample" + ] + }, + "libpng", + "opencv", + "qtbase", + "qtmultimedia", + "qtsvg", + "qttools", + "vulkan", + "zlib" + ] +}