diff --git a/.ci/linux/build.sh b/.ci/linux/build.sh index 114df7051b..a92cb3fd91 100755 --- a/.ci/linux/build.sh +++ b/.ci/linux/build.sh @@ -3,53 +3,47 @@ # SPDX-FileCopyrightText: 2025 eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later + case "$1" in -amd64 | "") - echo "Making amd64-v3 optimized build of Eden" - ARCH="amd64_v3" - ARCH_FLAGS="-march=x86-64-v3" - export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=v3) - ;; -steamdeck | zen2) - echo "Making Steam Deck (Zen 2) optimized build of Eden" - ARCH="steamdeck" - ARCH_FLAGS="-march=znver2 -mtune=znver2" - export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=zen2 -DYUZU_SYSTEM_PROFILE=steamdeck) - ;; -rog-ally | allyx | zen4) - echo "Making ROG Ally X (Zen 4) optimized build of Eden" - ARCH="rog-ally-x" - ARCH_FLAGS="-march=znver4 -mtune=znver4" - export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=zen2 -DYUZU_SYSTEM_PROFILE=steamdeck) - ;; -legacy) - echo "Making amd64 generic build of Eden" - ARCH=amd64 - ARCH_FLAGS="-march=x86-64 -mtune=generic" - export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=generic) - ;; -aarch64) - echo "Making armv8-a build of Eden" - ARCH=aarch64 - ARCH_FLAGS="-march=armv8-a -mtune=generic -w" - export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=generic) - ;; -armv9) - echo "Making armv9-a build of Eden" - ARCH=armv9 - ARCH_FLAGS="-march=armv9-a -mtune=generic -w" - export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=armv9) - ;; -native) - echo "Making native build of Eden" - ARCH="$(uname -m)" - ARCH_FLAGS="-march=native -mtune=native" - export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=native) - ;; -*) - echo "Invalid target $1 specified, must be one of native, amd64, steamdeck, zen2, allyx, rog-ally, zen4, legacy, aarch64, armv9" - exit 1 - ;; + amd64|"") + echo "Making amd64-v3 optimized build of Eden" + ARCH="amd64_v3" + ARCH_FLAGS="-march=x86-64-v3" + ;; + steamdeck|zen2) + echo "Making Steam Deck (Zen 2) optimized build of Eden" + ARCH="steamdeck" + ARCH_FLAGS="-march=znver2 -mtune=znver2" + ;; + rog-ally|allyx|zen4) + echo "Making ROG Ally X (Zen 4) optimized build of Eden" + ARCH="rog-ally-x" + ARCH_FLAGS="-march=znver4 -mtune=znver4" + ;; + legacy) + echo "Making amd64 generic build of Eden" + ARCH=amd64 + ARCH_FLAGS="-march=x86-64 -mtune=generic" + ;; + aarch64) + echo "Making armv8-a build of Eden" + ARCH=aarch64 + ARCH_FLAGS="-march=armv8-a -mtune=generic -w" + ;; + armv9) + echo "Making armv9-a build of Eden" + ARCH=armv9 + ARCH_FLAGS="-march=armv9-a -mtune=generic -w" + ;; + native) + echo "Making native build of Eden" + ARCH="$(uname -m)" + ARCH_FLAGS="-march=native -mtune=native" + ;; + *) + echo "Invalid target $1 specified, must be one of native, amd64, steamdeck, zen2, allyx, rog-ally, zen4, legacy, aarch64, armv9" + exit 1 + ;; esac export ARCH_FLAGS="$ARCH_FLAGS -O3" @@ -61,10 +55,10 @@ fi if [ "$1" != "" ]; then shift; fi if [ "$TARGET" = "appimage" ]; then - export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DCMAKE_INSTALL_PREFIX=/usr -DYUZU_ROOM=ON -DYUZU_ROOM_STANDALONE=OFF -DYUZU_CMD=OFF) + export EXTRA_CMAKE_FLAGS=(-DCMAKE_INSTALL_PREFIX=/usr -DYUZU_ROOM=ON -DYUZU_ROOM_STANDALONE=OFF -DYUZU_CMD=OFF) else # For the linux-fresh verification target, verify compilation without PCH as well. - export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DYUZU_USE_PRECOMPILED_HEADERS=OFF) + export EXTRA_CMAKE_FLAGS=(-DYUZU_USE_PRECOMPILED_HEADERS=OFF) fi if [ "$DEVEL" != "true" ]; then @@ -92,7 +86,7 @@ export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@) mkdir -p build && cd build cmake .. -G Ninja \ -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \ - -DENABLE_QT_TRANSLATION=ON \ + -DENABLE_QT_TRANSLATION=ON \ -DUSE_DISCORD_PRESENCE=ON \ -DCMAKE_CXX_FLAGS="$ARCH_FLAGS" \ -DCMAKE_C_FLAGS="$ARCH_FLAGS" \ @@ -105,12 +99,12 @@ cmake .. -G Ninja \ -DYUZU_USE_QT_WEB_ENGINE=$WEBENGINE \ -DYUZU_USE_FASTER_LD=ON \ -DYUZU_ENABLE_LTO=ON \ - "${EXTRA_CMAKE_FLAGS[@]}" + "${EXTRA_CMAKE_FLAGS[@]}" ninja -j${NPROC} if [ -d "bin/Release" ]; then - strip -s bin/Release/* + strip -s bin/Release/* else - strip -s bin/* + strip -s bin/* fi diff --git a/.ci/linux/package.sh b/.ci/linux/package.sh index 911fea2f7b..41e07ea207 100755 --- a/.ci/linux/package.sh +++ b/.ci/linux/package.sh @@ -92,6 +92,7 @@ chmod +x ./sharun-aio xvfb-run -a ./sharun-aio l -p -v -e -s -k \ ../$BUILDDIR/bin/eden* \ $LIBDIR/lib*GL*.so* \ + $LIBDIR/libSDL2*.so* \ $LIBDIR/dri/* \ $LIBDIR/vdpau/* \ $LIBDIR/libvulkan* \ diff --git a/.gitmodules b/.gitmodules index c8fcad98ec..371b62a605 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,6 +16,9 @@ [submodule "opus"] path = externals/opus url = https://github.com/xiph/opus.git +[submodule "SDL"] + path = externals/SDL + url = https://github.com/libsdl-org/SDL.git [submodule "cpp-httplib"] path = externals/cpp-httplib url = https://github.com/yhirose/cpp-httplib.git @@ -46,6 +49,9 @@ [submodule "externals/dynarmic/externals/unordered_dense"] path = externals/dynarmic/externals/unordered_dense url = https://github.com/Lizzie841/unordered_dense.git +[submodule "externals/dynarmic/externals/xbyak"] + path = externals/dynarmic/externals/xbyak + url = https://github.com/Lizzie841/xbyak.git [submodule "externals/dynarmic/externals/zycore-c"] path = externals/dynarmic/externals/zycore-c url = https://github.com/zyantific/zycore-c.git diff --git a/CMakeLists.txt b/CMakeLists.txt index b9d19b3c1b..007debd047 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,9 +33,9 @@ endif() option(ENABLE_SDL2 "Enable the SDL2 frontend" ON) CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 binaries" ON "ENABLE_SDL2;MSVC" OFF) if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") - CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" OFF "ENABLE_SDL2;NOT MSVC" OFF) + CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" OFF "ENABLE_SDL2;NOT MSVC" OFF) else() - CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" ON "ENABLE_SDL2;NOT MSVC" OFF) + CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" ON "ENABLE_SDL2;NOT MSVC" OFF) endif() cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" OFF) @@ -332,41 +332,6 @@ if (YUZU_ROOM) add_definitions(-DYUZU_ROOM) endif() -# Build/optimization presets -if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - if (ARCHITECTURE_x86_64) - set(YUZU_BUILD_PRESET "generic" CACHE STRING "Build preset to use. One of: generic, v3, zen2, zen4, native") - if (${YUZU_BUILD_PRESET} STREQUAL "generic") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64 -mtune=generic") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=x86-64 -mtune=generic") - elseif (${YUZU_BUILD_PRESET} STREQUAL "v3") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64-v3 -mtune=generic") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=x86-64-v3 -mtune=generic") - elseif (${YUZU_BUILD_PRESET} STREQUAL "zen2") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=znver2 -mtune=znver2") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=znver2 -mtune=znver2") - elseif (${YUZU_BUILD_PRESET} STREQUAL "zen4") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=znver4 -mtune=znver4") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=znver4 -mtune=znver4") - elseif (${YUZU_BUILD_PRESET} STREQUAL "native") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -mtune=native") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native -mtune=native") - endif() - elseif(ARCHITECTURE_arm64) - set(YUZU_BUILD_PRESET "generic" CACHE STRING "Build preset to use. One of: generic, armv9") - if (${YUZU_BUILD_PRESET} STREQUAL "generic") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a -mtune=generic") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a -mtune=generic") - elseif (${YUZU_BUILD_PRESET} STREQUAL "armv9") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv9-a -mtune=generic") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv9-a -mtune=generic") - endif() - endif() -endif() - -# Other presets, e.g. steamdeck -set(YUZU_SYSTEM_PROFILE "generic" CACHE STRING "CMake and Externals profile to use. One of: generic, steamdeck") - # Configure C++ standard # =========================== @@ -455,7 +420,6 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR ANDROID) endif() # find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the YUZU_find_package -# TODO(crueter): combine this all with CPM. if (ENABLE_SDL2) if (YUZU_USE_BUNDLED_SDL2) # Detect toolchain and platform diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index cdb0c0bb5b..e5b35954f7 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -83,18 +83,7 @@ if (YUZU_USE_EXTERNAL_SDL2) set(SDL_FILE ON) endif() - include(CPM) - set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm) - set(CPM_USE_LOCAL_PACKAGES OFF) - - if ("${YUZU_SYSTEM_PROFILE}" STREQUAL "steamdeck") - set(SDL_HASH cc016b0046) - set(SDL_PIPEWIRE OFF) # build errors out with this on - else() - set(SDL_HASH 2e4c12cd2c) - endif() - - CPMAddPackage("gh:libsdl-org/SDL#${SDL_HASH}") + add_subdirectory(SDL) endif() # ENet diff --git a/externals/SDL b/externals/SDL new file mode 160000 index 0000000000..2e4c12cd2c --- /dev/null +++ b/externals/SDL @@ -0,0 +1 @@ +Subproject commit 2e4c12cd2cb2c5d0b60ef2196b400339591e733c diff --git a/externals/Vulkan-Headers b/externals/Vulkan-Headers index 89268a6d17..16cedde356 160000 --- a/externals/Vulkan-Headers +++ b/externals/Vulkan-Headers @@ -1 +1 @@ -Subproject commit 89268a6d17fc87003b209a1422c17ab288be99a0 +Subproject commit 16cedde3564629c43808401ad1eb3ca6ef24709a diff --git a/externals/Vulkan-Utility-Libraries b/externals/Vulkan-Utility-Libraries index df2e358152..f216bb107b 160000 --- a/externals/Vulkan-Utility-Libraries +++ b/externals/Vulkan-Utility-Libraries @@ -1 +1 @@ -Subproject commit df2e3581520f36776cd42b9fec3ec4a51ab878ef +Subproject commit f216bb107bfc6d99a9605572963613e828b10880 diff --git a/externals/VulkanMemoryAllocator b/externals/VulkanMemoryAllocator index 1076b348ab..6ec8481c8a 160000 --- a/externals/VulkanMemoryAllocator +++ b/externals/VulkanMemoryAllocator @@ -1 +1 @@ -Subproject commit 1076b348abd17859a116f4b111c43d58a588a086 +Subproject commit 6ec8481c8a13db586d7b3ba58f4eb9bbf017edf0 diff --git a/externals/cubeb b/externals/cubeb index fa02160712..832fcf38e6 160000 --- a/externals/cubeb +++ b/externals/cubeb @@ -1 +1 @@ -Subproject commit fa021607121360af7c171d881dc5bc8af7bb56eb +Subproject commit 832fcf38e600bf80b4b728a3e0227403088d992c diff --git a/externals/dynarmic/externals/CMakeLists.txt b/externals/dynarmic/externals/CMakeLists.txt index 67fb0f4190..f96497db7a 100644 --- a/externals/dynarmic/externals/CMakeLists.txt +++ b/externals/dynarmic/externals/CMakeLists.txt @@ -64,13 +64,12 @@ if (NOT TARGET ankerl::unordered_dense) endif() # xbyak -# uncomment if in an independent repo. -# if (NOT TARGET xbyak::xbyak) -# if ("x86_64" IN_LIST ARCHITECTURE) -# add_subdirectory(xbyak) -# endif() -# endif() +if (NOT TARGET xbyak::xbyak) + if ("x86_64" IN_LIST ARCHITECTURE) + add_subdirectory(xbyak) + endif() +endif() # zydis diff --git a/externals/dynarmic/externals/xbyak b/externals/dynarmic/externals/xbyak new file mode 160000 index 0000000000..12557954c6 --- /dev/null +++ b/externals/dynarmic/externals/xbyak @@ -0,0 +1 @@ +Subproject commit 12557954c68a780563f9ab9fc24a3a156c96cba1 diff --git a/externals/libusb/libusb b/externals/libusb/libusb index 3dbfa16f0c..c060e9ce30 160000 --- a/externals/libusb/libusb +++ b/externals/libusb/libusb @@ -1 +1 @@ -Subproject commit 3dbfa16f0cd9e8ed4fec916c6c00f41c738cb8f4 +Subproject commit c060e9ce30ac2e3ffb49d94209c4dae77b6642f7 diff --git a/externals/opus b/externals/opus index 5ded705cf4..df02d25f0c 160000 --- a/externals/opus +++ b/externals/opus @@ -1 +1 @@ -Subproject commit 5ded705cf4ffa13702c78eebecea0fdb2f4ef0de +Subproject commit df02d25f0c6334a60f8c01c5ecf63081845d6c9d diff --git a/externals/xbyak b/externals/xbyak index 4e44f4614d..12557954c6 160000 --- a/externals/xbyak +++ b/externals/xbyak @@ -1 +1 @@ -Subproject commit 4e44f4614ddbf038f2a6296f5b906d5c72691e0f +Subproject commit 12557954c68a780563f9ab9fc24a3a156c96cba1 diff --git a/src/audio_core/sink/cubeb_sink.cpp b/src/audio_core/sink/cubeb_sink.cpp index a33162b806..7f4b1c365a 100644 --- a/src/audio_core/sink/cubeb_sink.cpp +++ b/src/audio_core/sink/cubeb_sink.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -337,48 +334,6 @@ std::vector ListCubebSinkDevices(bool capture) { return device_list; } -/* REVERSION TO 3833 - function GetCubebLatency REINTRODUCED FROM 3833 - DIABLO 3 FIX */ -u32 GetCubebLatency() { - cubeb* ctx; - -#ifdef _WIN32 - auto com_init_result = CoInitializeEx(nullptr, COINIT_MULTITHREADED); -#endif - - // Init cubeb - if (cubeb_init(&ctx, "yuzu Latency Getter", nullptr) != CUBEB_OK) { - LOG_CRITICAL(Audio_Sink, "cubeb_init failed"); - // Return a large latency so we choose SDL instead. - return 10000u; - } - -#ifdef _WIN32 - if (SUCCEEDED(com_init_result)) { - CoUninitialize(); - } -#endif - - // Get min latency - cubeb_stream_params params{}; - params.rate = TargetSampleRate; - params.channels = 2; - params.format = CUBEB_SAMPLE_S16LE; - params.prefs = CUBEB_STREAM_PREF_NONE; - params.layout = CUBEB_LAYOUT_STEREO; - - u32 latency{0}; - const auto latency_error = cubeb_get_min_latency(ctx, ¶ms, &latency); - if (latency_error != CUBEB_OK) { - LOG_CRITICAL(Audio_Sink, "Error getting minimum latency, error: {}", latency_error); - latency = TargetSampleCount * 2; - } - latency = std::max(latency, TargetSampleCount * 2); - cubeb_destroy(ctx); - return latency; -} - -// REVERTED back to 3833 - Below namespace section and function IsCubebSuitable() removed, reverting to GetCubebLatency() above. - DIABLO 3 FIX -/* namespace { static long TmpDataCallback(cubeb_stream*, void*, const void*, void*, long) { return TargetSampleCount; @@ -445,6 +400,5 @@ bool IsCubebSuitable() { return true; #endif } -*/ } // namespace AudioCore::Sink diff --git a/src/audio_core/sink/cubeb_sink.h b/src/audio_core/sink/cubeb_sink.h index 6dc7d3d296..f49a6fdaa7 100644 --- a/src/audio_core/sink/cubeb_sink.h +++ b/src/audio_core/sink/cubeb_sink.h @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -99,20 +96,12 @@ private: */ std::vector ListCubebSinkDevices(bool capture); -// REVERSION - function GetCubebLatency() reintroduced from EA-3833 - DIABLO 3 FIX -/** - * Get the reported latency for this sink. - * - * @return Minimum latency for this sink. - */ -u32 GetCubebLatency(); - /** * Check if this backend is suitable for use. * Checks if enabled, its latency, whether it opens successfully, etc. * * @return True is this backend is suitable, false otherwise. */ -// bool IsCubebSuitable(); // REVERTED BACK TO GetCubebLatency() FROM 3833 +bool IsCubebSuitable(); } // namespace AudioCore::Sink diff --git a/src/audio_core/sink/sdl2_sink.cpp b/src/audio_core/sink/sdl2_sink.cpp index 25ed58620e..ffdd77042e 100644 --- a/src/audio_core/sink/sdl2_sink.cpp +++ b/src/audio_core/sink/sdl2_sink.cpp @@ -234,13 +234,6 @@ std::vector ListSDLSinkDevices(bool capture) { return device_list; } -/* REVERSION to 3833 - function GetSDLLatency() REINTRODUCED FROM 3833 - DIABLO 3 FIX */ -u32 GetSDLLatency() { - return TargetSampleCount * 2; -} - -// REVERTED back to 3833 - Below function IsSDLSuitable() removed, reverting to GetSDLLatency() above. - DIABLO 3 FIX -/* bool IsSDLSuitable() { #if !defined(HAVE_SDL2) return false; @@ -278,6 +271,5 @@ bool IsSDLSuitable() { return true; #endif } -*/ } // namespace AudioCore::Sink diff --git a/src/audio_core/sink/sdl2_sink.h b/src/audio_core/sink/sdl2_sink.h index 19ea32595f..9211d2e978 100644 --- a/src/audio_core/sink/sdl2_sink.h +++ b/src/audio_core/sink/sdl2_sink.h @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -90,20 +87,12 @@ private: */ std::vector ListSDLSinkDevices(bool capture); -// REVERSION - function GetSDLLatency() reintroduced from EA-3833 - DIABLO 3 FIX /** - * Get the reported latency for this sink. - * - * @return Minimum latency for this sink. - */ -u32 GetSDLLatency(); - -/** REVERTED back to 3833 - Below function IsSDLSuitable() removed, reverting to GetSDLLatency() above. - DIABLO 3 FIX * Check if this backend is suitable for use. * Checks if enabled, its latency, whether it opens successfully, etc. * * @return True is this backend is suitable, false otherwise. */ -//bool IsSDLSuitable(); // REVERTED for GetSDLLatency() from EA-3833 +bool IsSDLSuitable(); } // namespace AudioCore::Sink diff --git a/src/audio_core/sink/sink_details.cpp b/src/audio_core/sink/sink_details.cpp index 70bf75018b..449af659d0 100644 --- a/src/audio_core/sink/sink_details.cpp +++ b/src/audio_core/sink/sink_details.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -28,8 +25,7 @@ namespace { struct SinkDetails { using FactoryFn = std::unique_ptr (*)(std::string_view); using ListDevicesFn = std::vector (*)(bool); - using LatencyFn = u32 (*)(); // REINTRODUCED FROM 3833 - DIABLO 3 FIX - // using SuitableFn = bool (*)(); // REVERTED FOR ABOVE - DIABLO 3 FIX + using SuitableFn = bool (*)(); /// Name for this sink. Settings::AudioEngine id; @@ -37,18 +33,10 @@ struct SinkDetails { FactoryFn factory; /// A method to call to list available devices. ListDevicesFn list_devices; - /// Method to get the latency of this backend - REINTRODUCED FROM 3833 - DIABLO 3 FIX - LatencyFn latency; /// Check whether this backend is suitable to be used. - /// SuitableFn is_suitable; // REVERTED FOR LatencyFn latency ABOVE - DIABLO 3 FIX + SuitableFn is_suitable; }; -// NOTE TO PROBABLY FIX LATER FOR ANDROID - the return value "0u" for the first HAVE_OBOE -// section below was just copied from the null section so there's a somewhat valid value -// being returned, since the previous "true" value probably isn't compatible with the -// previous EA-3833 code. (HAVE_OBOE was introduced in a later release.) Eventually need -// to change "0u" for something else directly from the oboe_sink.cpp functions. - // sink_details is ordered in terms of desirability, with the best choice at the top. constexpr SinkDetails sink_details[] = { #ifdef HAVE_OBOE @@ -58,7 +46,7 @@ constexpr SinkDetails sink_details[] = { return std::make_unique(); }, [](bool capture) { return std::vector{"Default"}; }, - []() { return 0u; }, + []() { return true; }, }, #endif #ifdef HAVE_CUBEB @@ -68,7 +56,7 @@ constexpr SinkDetails sink_details[] = { return std::make_unique(device_id); }, &ListCubebSinkDevices, - &GetCubebLatency, + &IsCubebSuitable, }, #endif #ifdef HAVE_SDL2 @@ -78,7 +66,7 @@ constexpr SinkDetails sink_details[] = { return std::make_unique(device_id); }, &ListSDLSinkDevices, - &GetSDLLatency, + &IsSDLSuitable, }, #endif SinkDetails{ @@ -87,7 +75,7 @@ constexpr SinkDetails sink_details[] = { return std::make_unique(device_id); }, [](bool capture) { return std::vector{"null"}; }, - []() { return 0u; }, + []() { return true; }, }, }; @@ -100,8 +88,6 @@ const SinkDetails& GetOutputSinkDetails(Settings::AudioEngine sink_id) { auto iter = find_backend(sink_id); if (sink_id == Settings::AudioEngine::Auto) { - // REVERTED TO 3833 BELOW - DIABLO 3 FIX - /* // Auto-select a backend. Use the sink details ordering, preferring cubeb first, checking // that the backend is available and suitable to use. for (auto& details : sink_details) { @@ -110,29 +96,14 @@ const SinkDetails& GetOutputSinkDetails(Settings::AudioEngine sink_id) { break; } } - */ // END REVERTED CODE - DIABLO 3 FIX - - // BEGIN REINTRODUCED FROM 3833 - REPLACED CODE BLOCK ABOVE - DIABLO 3 FIX - // Auto-select a backend. Prefer CubeB, but it may report a large minimum latency which - // causes audio issues, in that case go with SDL. -#if defined(HAVE_CUBEB) && defined(HAVE_SDL2) - iter = find_backend(Settings::AudioEngine::Cubeb); - if (iter->latency() > TargetSampleCount * 3) { - iter = find_backend(Settings::AudioEngine::Sdl2); - } -#else - iter = std::begin(sink_details); -#endif - // END REINTRODUCED SECTION FROM 3833 - DIABLO 3 FIX LOG_INFO(Service_Audio, "Auto-selecting the {} backend", Settings::CanonicalizeEnum(iter->id)); - /* BEGIN REMOVED - REVERTING BACK TO 3833, this didn't exist at all. - DIABLO 3 FIX } else { if (iter != std::end(sink_details) && !iter->is_suitable()) { LOG_ERROR(Service_Audio, "Selected backend {} is not suitable, falling back to null", Settings::CanonicalizeEnum(iter->id)); iter = find_backend(Settings::AudioEngine::Null); - } */ // END REMOVED REVERT - DIABLO 3 FIX + } } if (iter == std::end(sink_details)) { diff --git a/src/core/hle/service/am/applet.h b/src/core/hle/service/am/applet.h index 835cfe6ec8..571904fab4 100644 --- a/src/core/hle/service/am/applet.h +++ b/src/core/hle/service/am/applet.h @@ -92,7 +92,6 @@ struct Applet { // Channels std::deque> user_channel_launch_parameter{}; std::deque> preselected_user_launch_parameter{}; - std::deque> friend_invitation_storage_channel{}; // Caller applet std::weak_ptr caller_applet{}; diff --git a/src/core/hle/service/am/service/application_functions.cpp b/src/core/hle/service/am/service/application_functions.cpp index 560244c714..3bab5ac5f1 100644 --- a/src/core/hle/service/am/service/application_functions.cpp +++ b/src/core/hle/service/am/service/application_functions.cpp @@ -456,21 +456,8 @@ Result IApplicationFunctions::GetFriendInvitationStorageChannelEvent( Result IApplicationFunctions::TryPopFromFriendInvitationStorageChannel( Out> out_storage) { - LOG_DEBUG(Service_AM, "called"); - - std::scoped_lock lk{m_applet->lock}; - - auto& channel = m_applet->friend_invitation_storage_channel; - - if (channel.empty()) { - return AM::ResultNoDataInChannel; - } - - auto data = channel.back(); - channel.pop_back(); - - *out_storage = std::make_shared(system, std::move(data)); - R_SUCCEED(); + LOG_INFO(Service_AM, "(STUBBED) called"); + R_THROW(AM::ResultNoDataInChannel); } Result IApplicationFunctions::GetNotificationStorageChannelEvent( diff --git a/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp b/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp index 4317aee1c4..1bb88a45fa 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp +++ b/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp @@ -728,22 +728,26 @@ Status BufferQueueProducer::Connect(const std::shared_ptr& li return status; } +// https://android.googlesource.com/platform/frameworks/native/%2B/master/libs/gui/BufferQueueProducer.cpp#1457 Status BufferQueueProducer::Disconnect(NativeWindowApi api) { - LOG_DEBUG(Service_Nvnflinger, "api = {}", api); + LOG_DEBUG(Service_Nvnflinger, "disconnect api = {}", api); - Status status = Status::NoError; std::shared_ptr listener; + Status status = Status::NoError; { std::scoped_lock lock{core->mutex}; - core->WaitWhileAllocatingLocked(); if (core->is_abandoned) { - // Disconnecting after the surface has been abandoned is a no-op. return Status::NoError; } + if (core->connected_api == NativeWindowApi::NoConnectedApi) { + LOG_DEBUG(Service_Nvnflinger, "disconnect: not connected (req = {})", api); + return Status::NoInit; + } + switch (api) { case NativeWindowApi::Egl: case NativeWindowApi::Cpu: @@ -758,20 +762,20 @@ Status BufferQueueProducer::Disconnect(NativeWindowApi api) { buffer_wait_event->Signal(); listener = core->consumer_listener; } else { - LOG_ERROR(Service_Nvnflinger, "still connected to another api (cur = {} req = {})", + LOG_ERROR(Service_Nvnflinger, + "disconnect: still connected to another api (cur = {} req = {})", core->connected_api, api); status = Status::BadValue; } break; default: - LOG_ERROR(Service_Nvnflinger, "unknown api = {}", api); + LOG_ERROR(Service_Nvnflinger, "disconnect: unknown api = {}", api); status = Status::BadValue; break; } } - // Call back without lock held - if (listener != nullptr) { + if (listener) { listener->OnBuffersReleased(); } diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp index 8629a2e89b..d30aa3717d 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp +++ b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp @@ -40,17 +40,22 @@ Result IHOSBinderDriver::TransactParcel(s32 binder_id, u32 transaction_id, } Result IHOSBinderDriver::AdjustRefcount(s32 binder_id, s32 addval, s32 type) { - LOG_WARNING(Service_VI, "(STUBBED) called id={}, addval={}, type={}", binder_id, addval, type); + LOG_DEBUG(Service_VI, "called id={}, addval={}, type={}", binder_id, addval, type); + R_UNLESS(type == 0 || type == 1, ResultUnknown); + m_server->AdjustRefcount(binder_id, addval, type == 1); R_SUCCEED(); } Result IHOSBinderDriver::GetNativeHandle(s32 binder_id, u32 type_id, OutCopyHandle out_handle) { - LOG_WARNING(Service_VI, "(STUBBED) called id={}, type_id={}", binder_id, type_id); + LOG_DEBUG(Service_VI, "called id={}, type_id={}", binder_id, type_id); const auto binder = m_server->TryGetBinder(binder_id); R_UNLESS(binder != nullptr, ResultUnknown); + auto native_handle = binder->GetNativeHandle(type_id); + R_UNLESS(native_handle != nullptr, ResultUnknown); + *out_handle = binder->GetNativeHandle(type_id); R_SUCCEED(); diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp b/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp index 29addda44d..b85f1a4fa4 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp +++ b/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp @@ -17,6 +17,7 @@ s32 HosBinderDriverServer::RegisterBinder(std::shared_ptr&& bi last_id++; binders[last_id] = std::move(binder); + refcounts[last_id] = {}; // strong = 1, weak = 0 return last_id; } @@ -25,6 +26,29 @@ void HosBinderDriverServer::UnregisterBinder(s32 binder_id) { std::scoped_lock lk{lock}; binders.erase(binder_id); + refcounts.erase(binder_id); +} + +void HosBinderDriverServer::AdjustRefcount(s32 binder_id, s32 delta, bool is_weak) { + std::scoped_lock lk{lock}; + + auto search_rc = refcounts.find(binder_id); + if (search_rc == refcounts.end()) { + LOG_WARNING(Service_VI, "AdjustRefcount called for unknown binder id {}", binder_id); + return; + } + + auto& rc = search_rc->second; + s32& counter = is_weak ? rc.weak : rc.strong; + counter += delta; + + if (counter < 0) + counter = 0; + + if (rc.strong == 0 && rc.weak == 0) { + binders.erase(binder_id); + refcounts.erase(search_rc); + } } std::shared_ptr HosBinderDriverServer::TryGetBinder(s32 id) const { diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver_server.h b/src/core/hle/service/nvnflinger/hos_binder_driver_server.h index d72b50833d..f4b4060115 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver_server.h +++ b/src/core/hle/service/nvnflinger/hos_binder_driver_server.h @@ -26,10 +26,18 @@ public: std::shared_ptr TryGetBinder(s32 id) const; + void AdjustRefcount(s32 binder_id, s32 delta, bool is_weak); + private: - std::unordered_map> binders; + struct RefCounts { + s32 strong{1}; + s32 weak{0}; + }; + mutable std::mutex lock; - s32 last_id{}; + s32 last_id = 0; + std::unordered_map> binders; + std::unordered_map refcounts; }; } // namespace Service::Nvnflinger diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp index 2d10bd04d2..67e37e0823 100644 --- a/src/core/hle/service/ssl/ssl.cpp +++ b/src/core/hle/service/ssl/ssl.cpp @@ -41,8 +41,6 @@ enum class IoMode : u32 { enum class OptionType : u32 { DoNotCloseSocket = 0, GetServerCertChain = 1, - SkipDefaultVerify = 2, - EnableAlpn = 3, }; // This is nn::ssl::sf::SslVersion @@ -95,11 +93,11 @@ public: {20, nullptr, "SetRenegotiationMode"}, {21, nullptr, "GetRenegotiationMode"}, {22, &ISslConnection::SetOption, "SetOption"}, - {23, &ISslConnection::GetOption, "GetOption"}, + {23, nullptr, "GetOption"}, {24, nullptr, "GetVerifyCertErrors"}, {25, nullptr, "GetCipherInfo"}, - {26, &ISslConnection::SetNextAlpnProto, "SetNextAlpnProto"}, - {27, &ISslConnection::GetNextAlpnProto, "GetNextAlpnProto"}, + {26, nullptr, "SetNextAlpnProto"}, + {27, nullptr, "GetNextAlpnProto"}, {28, nullptr, "SetDtlsSocketDescriptor"}, {29, nullptr, "GetDtlsHandshakeTimeout"}, {30, nullptr, "SetPrivateOption"}, @@ -142,10 +140,7 @@ private: std::optional fd_to_close; bool do_not_close_socket = false; bool get_server_cert_chain = false; - bool skip_default_verify = false; - bool enable_alpn = false; std::shared_ptr socket; - std::vector next_alpn_proto; bool did_handshake = false; Result SetSocketDescriptorImpl(s32* out_fd, s32 fd) { @@ -386,12 +381,6 @@ private: case OptionType::GetServerCertChain: get_server_cert_chain = static_cast(parameters.value); break; - case OptionType::SkipDefaultVerify: - skip_default_verify = static_cast(parameters.value); - break; - case OptionType::EnableAlpn: - enable_alpn = static_cast(parameters.value); - break; default: LOG_WARNING(Service_SSL, "Unknown option={}, value={}", parameters.option, parameters.value); @@ -400,63 +389,6 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } - - void GetOption(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto option = rp.PopRaw(); - - u8 value = 0; - - switch (option) { - case OptionType::DoNotCloseSocket: - value = static_cast(do_not_close_socket); - break; - case OptionType::GetServerCertChain: - value = static_cast(get_server_cert_chain); - break; - case OptionType::SkipDefaultVerify: - value = static_cast(skip_default_verify); - break; - case OptionType::EnableAlpn: - value = static_cast(enable_alpn); - break; - default: - LOG_WARNING(Service_SSL, "Unknown option={}", option); - value = 0; - break; - } - - LOG_DEBUG(Service_SSL, "GetOption called, option={}, ret value={}", option, value); - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(value); - } - - void SetNextAlpnProto(HLERequestContext& ctx) { - const auto data = ctx.ReadBuffer(0); - next_alpn_proto.assign(data.begin(), data.end()); - - LOG_DEBUG(Service_SSL, "SetNextAlpnProto called, size={}", next_alpn_proto.size()); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - void GetNextAlpnProto(HLERequestContext& ctx) { - const size_t writable = ctx.GetWriteBufferSize(); - const size_t to_write = std::min(next_alpn_proto.size(), writable); - - if (to_write != 0) { - ctx.WriteBuffer(std::span(next_alpn_proto.data(), to_write)); - } - - LOG_DEBUG(Service_SSL, "GetNextAlpnProto called, size={}", to_write); - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(static_cast(to_write)); - } }; class ISslContext final : public ServiceFramework { @@ -466,7 +398,7 @@ public: shared_data{std::make_shared()} { static const FunctionInfo functions[] = { {0, &ISslContext::SetOption, "SetOption"}, - {1, &ISslContext::GetOption, "GetOption"}, + {1, nullptr, "GetOption"}, {2, &ISslContext::CreateConnection, "CreateConnection"}, {3, &ISslContext::GetConnectionCount, "GetConnectionCount"}, {4, &ISslContext::ImportServerPki, "ImportServerPki"}, @@ -502,17 +434,6 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); - - } - - void GetOption(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto parameters = rp.PopRaw(); - - LOG_WARNING(Service_SSL, "(STUBBED) called. option={}", parameters); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); } void CreateConnection(HLERequestContext& ctx) { diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 66db162c5d..a6e87a3583 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -467,10 +467,6 @@ void BufferCache

::BindComputeStorageBuffer(size_t ssbo_index, u32 cbuf_index, channel_state->written_compute_storage_buffers |= (is_written ? 1U : 0U) << ssbo_index; const auto& launch_desc = kepler_compute->launch_description; - if (((launch_desc.const_buffer_enable_mask >> cbuf_index) & 1) == 0) { - LOG_WARNING(HW_GPU, "Skipped binding SSBO: cbuf index {} is not enabled", cbuf_index); - return; - } ASSERT(((launch_desc.const_buffer_enable_mask >> cbuf_index) & 1) != 0); const auto& cbufs = launch_desc.const_buffer_config; @@ -1705,11 +1701,6 @@ template Binding BufferCache

::StorageBufferBinding(GPUVAddr ssbo_addr, u32 cbuf_index, bool is_written) const { const GPUVAddr gpu_addr = gpu_memory->Read(ssbo_addr); - - if (gpu_addr == 0) { - return NULL_BINDING; - } - const auto size = [&]() { const bool is_nvn_cbuf = cbuf_index == 0; // The NVN driver buffer (index 0) is known to pack the SSBO address followed by its size. @@ -1732,7 +1723,7 @@ Binding BufferCache

::StorageBufferBinding(GPUVAddr ssbo_addr, u32 cbuf_index, const std::optional aligned_device_addr = gpu_memory->GpuToCpuAddress(aligned_gpu_addr); if (!aligned_device_addr || size == 0) { - LOG_DEBUG(HW_GPU, "Failed to find storage buffer for cbuf index {}", cbuf_index); + LOG_WARNING(HW_GPU, "Failed to find storage buffer for cbuf index {}", cbuf_index); return NULL_BINDING; } const std::optional device_addr = gpu_memory->GpuToCpuAddress(gpu_addr); diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index ddd29e7acf..0d07e89b6b 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -324,8 +324,9 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { size_t ssbo_index{}; for (const auto& desc : info.storage_buffers_descriptors) { ASSERT(desc.count == 1); - buffer_cache.BindGraphicsStorageBuffer(stage, ssbo_index, desc.cbuf_index, - desc.cbuf_offset, desc.is_written); + if (!buffer_cache.BindGraphicsStorageBuffer(stage, ssbo_index, desc.cbuf_index, + desc.cbuf_offset, desc.is_written)) + return false; ++ssbo_index; } } diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 9259639107..6272d6231a 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -1371,7 +1368,8 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src, std::span copies) { // As per the size-compatible formats section of vulkan, copy manually via ReinterpretImage // these images that aren't size-compatible - if (BytesPerBlock(src.info.format) != BytesPerBlock(dst.info.format)) { + if (HasAlpha(src.info.format) != HasAlpha(dst.info.format) || + BytesPerBlock(src.info.format) != BytesPerBlock(dst.info.format)) { auto oneCopy = VideoCommon::ImageCopy{ .src_offset = VideoCommon::Offset3D(0, 0, 0), .dst_offset = VideoCommon::Offset3D(0, 0, 0), diff --git a/src/video_core/surface.cpp b/src/video_core/surface.cpp index 1998849e84..c791bfa4e4 100644 --- a/src/video_core/surface.cpp +++ b/src/video_core/surface.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -266,12 +263,6 @@ bool HasAlpha(PixelFormat pixel_format) { case PixelFormat::B8G8R8A8_SRGB: case PixelFormat::BC1_RGBA_SRGB: case PixelFormat::A4B4G4R4_UNORM: - case PixelFormat::BC2_SRGB: - case PixelFormat::BC2_UNORM: - case PixelFormat::BC3_SRGB: - case PixelFormat::BC3_UNORM: - case PixelFormat::BC7_SRGB: - case PixelFormat::BC7_UNORM: return true; default: return false; diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 90aeaf71af..40136c3fbf 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp @@ -444,7 +444,7 @@ Instance Instance::Create(u32 version, Span layers, Span