Compare commits

..

3 commits

Author SHA1 Message Date
47b0ede755 [vulkan] Fix VUID-VkImageMemoryBarrier-synchronization2-07794
Since we don't use synchronization2, the said layout is wrong and must be VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL.
P.s. in future if we do use synchronization2, this change is compatible.
2025-08-08 22:27:37 +02:00
94ffebe6ea [vulkan] Enable Reset Query Pool per spec
Vulkan, by spec, requires that every query must be reset before use now for that we require vkCmdResetQueryPool and it must be called outside the renderpass but once we reset the query, it throws us outside the render pass which we must resume using scheduler.RequestRenderpass(texture_cache.GetFramebuffer());
2025-08-08 22:27:37 +02:00
5fb54f5bc2 [vulkan] Provides fix for Validation Error
Fixes the following validation error: Render.Vulkan <Critical> video_core/vulkan_common/vulkan_debug_callback.cpp:DebugUtilCallback:55: Validation Error: [ VUID-vkCmdPipelineBarrier-dstAccessMask-02816 ] Object 0: handle = 0xb4000079082fd070, type = VK_OBJECT_TYPE_COMMAND_BUFFER; | MessageID = 0x69c8467d | vkCmdPipelineBarrier(): INVALID_EMPTYpImageMemoryBarriers[0].dstAccessMask bit VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT is not supported by stage mask (VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT).
2025-08-08 22:27:37 +02:00
42 changed files with 481 additions and 2405 deletions

View file

@ -216,14 +216,14 @@ if (YUZU_USE_BUNDLED_VCPKG)
list(APPEND VCPKG_MANIFEST_FEATURES "android") list(APPEND VCPKG_MANIFEST_FEATURES "android")
endif() endif()
include(CPMUtil) include(CPM)
set(CPM_USE_LOCAL_PACKAGES OFF)
AddPackage( CPMAddPackage(
NAME vcpkg
DOWNLOAD_ONLY YES DOWNLOAD_ONLY YES
URL "https://github.com/microsoft/vcpkg.git" GIT_REPOSITORY "https://github.com/microsoft/vcpkg.git"
GIT_TAG "ea2a964f93" GIT_TAG "ea2a964f93"
SHA "ea2a964f93" CUSTOM_CACHE_KEY "ea2a"
) )
include(${vcpkg_SOURCE_DIR}/scripts/buildsystems/vcpkg.cmake) include(${vcpkg_SOURCE_DIR}/scripts/buildsystems/vcpkg.cmake)
@ -277,30 +277,6 @@ function(check_submodules_present)
message(FATAL_ERROR "Git submodule ${module} not found. " message(FATAL_ERROR "Git submodule ${module} not found. "
"Please run: \ngit submodule update --init --recursive") "Please run: \ngit submodule update --init --recursive")
endif() endif()
set(SUBMODULE_DIR "${PROJECT_SOURCE_DIR}/${module}")
execute_process(
COMMAND git rev-parse --short=10 HEAD
WORKING_DIRECTORY ${SUBMODULE_DIR}
OUTPUT_VARIABLE SUBMODULE_SHA
)
# would probably be better to do string parsing, but whatever
execute_process(
COMMAND git remote get-url origin
WORKING_DIRECTORY ${SUBMODULE_DIR}
OUTPUT_VARIABLE SUBMODULE_URL
)
string(REGEX REPLACE "\n|\r" "" SUBMODULE_SHA ${SUBMODULE_SHA})
string(REGEX REPLACE "\n|\r|\\.git" "" SUBMODULE_URL ${SUBMODULE_URL})
get_filename_component(SUBMODULE_NAME ${SUBMODULE_DIR} NAME)
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${SUBMODULE_NAME})
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${SUBMODULE_SHA})
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS ${SUBMODULE_URL})
endforeach() endforeach()
endfunction() endfunction()
@ -477,7 +453,7 @@ if (ENABLE_SDL2)
endif() endif()
if (DEFINED SDL2_VER) if (DEFINED SDL2_VER)
download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" SDL2_PREFIX 2.32.8) download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" SDL2_PREFIX)
endif() endif()
set(SDL2_FOUND YES) set(SDL2_FOUND YES)
@ -608,7 +584,7 @@ endif()
if (WIN32 AND YUZU_CRASH_DUMPS) if (WIN32 AND YUZU_CRASH_DUMPS)
set(BREAKPAD_VER "breakpad-c89f9dd") set(BREAKPAD_VER "breakpad-c89f9dd")
download_bundled_external("breakpad/" ${BREAKPAD_VER} "breakpad-win" BREAKPAD_PREFIX "c89f9dd") download_bundled_external("breakpad/" ${BREAKPAD_VER} "breakpad-win" BREAKPAD_PREFIX)
set(BREAKPAD_CLIENT_INCLUDE_DIR "${BREAKPAD_PREFIX}/include") set(BREAKPAD_CLIENT_INCLUDE_DIR "${BREAKPAD_PREFIX}/include")
set(BREAKPAD_CLIENT_LIBRARY "${BREAKPAD_PREFIX}/lib/libbreakpad_client.lib") set(BREAKPAD_CLIENT_LIBRARY "${BREAKPAD_PREFIX}/lib/libbreakpad_client.lib")
@ -746,6 +722,7 @@ else()
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT yuzu-cmd) set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT yuzu-cmd)
endif() endif()
# Installation instructions # Installation instructions
# ========================= # =========================

File diff suppressed because it is too large Load diff

View file

@ -1,117 +0,0 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# Created-By: crueter
# Docs will come at a later date, mostly this is to just reduce boilerplate
# and some cmake magic to allow for runtime viewing of dependency versions
cmake_minimum_required(VERSION 3.22)
include(CPM)
function(AddPackage)
cpm_set_policies()
set(oneValueArgs
NAME
VERSION
REPO
SHA
HASH
KEY
URL # Only for custom non-GitHub urls
DOWNLOAD_ONLY
FIND_PACKAGE_ARGUMENTS
SYSTEM_PACKAGE
BUNDLED_PACKAGE
)
set(multiValueArgs OPTIONS PATCHES)
cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
if (NOT DEFINED PKG_ARGS_NAME)
message(FATAL_ERROR "CPMUtil: No package name defined")
endif()
if (NOT DEFINED PKG_ARGS_URL)
if (DEFINED PKG_ARGS_REPO AND DEFINED PKG_ARGS_SHA)
set(PKG_GIT_URL https://github.com/${PKG_ARGS_REPO})
set(PKG_URL "${PKG_GIT_URL}/archive/${PKG_ARGS_SHA}.zip")
else()
message(FATAL_ERROR "CPMUtil: No custom URL and no repository + sha defined")
endif()
else()
set(PKG_URL ${PKG_ARGS_URL})
set(PKG_GIT_URL ${PKG_URL})
endif()
message(STATUS "CPMUtil: Downloading package ${PKG_ARGS_NAME} from ${PKG_URL}")
if (NOT DEFINED PKG_ARGS_KEY)
if (DEFINED PKG_ARGS_SHA)
string(SUBSTRING ${PKG_ARGS_SHA} 0 4 PKG_KEY)
message(STATUS "CPMUtil: No custom key defined, using ${PKG_KEY} from sha")
else()
message(FATAL_ERROR "CPMUtil: No custom key and no commit sha defined")
endif()
else()
set(PKG_KEY ${PKG_ARGS_KEY})
endif()
if (DEFINED PKG_ARGS_HASH)
set(PKG_HASH "SHA512=${PKG_ARGS_HASH}")
endif()
# Default behavior is bundled
if (DEFINED PKG_ARGS_SYSTEM_PACKAGE)
set(CPM_USE_LOCAL_PACKAGES ${PKG_ARGS_SYSTEM_PACKAGE})
elseif (DEFINED PKG_ARGS_BUNDLED_PACKAGE)
if (PKG_ARGS_BUNDLED_PACKAGE)
set(CPM_USE_LOCAL_PACKAGES OFF)
else()
set(CPM_USE_LOCAL_PACKAGES ON)
endif()
else()
set(CPM_USE_LOCAL_PACKAGES OFF)
endif()
CPMAddPackage(
NAME ${PKG_ARGS_NAME}
VERSION ${PKG_ARGS_VERSION}
URL ${PKG_URL}
URL_HASH ${PKG_HASH}
CUSTOM_CACHE_KEY ${PKG_KEY}
DOWNLOAD_ONLY ${PKG_ARGS_DOWNLOAD_ONLY}
FIND_PACKAGE_ARGUMENTS ${PKG_ARGS_FIND_PACKAGE_ARGUMENTS}
OPTIONS ${PKG_ARGS_OPTIONS}
PATCHES ${PKG_ARGS_PATCHES}
${PKG_ARGS_UNPARSED_ARGUMENTS}
)
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${PKG_ARGS_NAME})
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS ${PKG_GIT_URL})
if (${PKG_ARGS_NAME}_ADDED)
if (DEFINED PKG_ARGS_SHA)
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${PKG_ARGS_SHA})
elseif(DEFINED PKG_ARGS_VERSION)
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${PKG_ARGS_VERSION})
else()
message(WARNING "CPMUtil: Package ${PKG_ARGS_NAME} has no specified sha or version")
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown")
endif()
else()
if (DEFINED CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION)
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "${CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION} (system)")
else()
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown (system)")
endif()
endif()
# pass stuff to parent scope
set(${PKG_ARGS_NAME}_ADDED "${${PKG_ARGS_NAME}_ADDED}" PARENT_SCOPE)
set(${PKG_ARGS_NAME}_SOURCE_DIR "${${PKG_ARGS_NAME}_SOURCE_DIR}" PARENT_SCOPE)
set(${PKG_ARGS_NAME}_BINARY_DIR "${${PKG_ARGS_NAME}_BINARY_DIR}" PARENT_SCOPE)
endfunction()

View file

@ -63,4 +63,6 @@ function(copy_yuzu_Qt6_deps target_dir)
else() else()
# Update for non-MSVC platforms if needed # Update for non-MSVC platforms if needed
endif() endif()
# Fixes dark mode being forced automatically even when light theme is set in app settings.
file(WRITE "${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE}/qt.conf" "[Platforms]\nWindowsArguments = darkmode=0")
endfunction(copy_yuzu_Qt6_deps) endfunction(copy_yuzu_Qt6_deps)

View file

@ -6,7 +6,7 @@
# remote_path: path to the file to download, relative to the remote repository root # remote_path: path to the file to download, relative to the remote repository root
# prefix_var: name of a variable which will be set with the path to the extracted contents # prefix_var: name of a variable which will be set with the path to the extracted contents
set(CURRENT_MODULE_DIR ${CMAKE_CURRENT_LIST_DIR}) set(CURRENT_MODULE_DIR ${CMAKE_CURRENT_LIST_DIR})
function(download_bundled_external remote_path lib_name cpm_key prefix_var version) function(download_bundled_external remote_path lib_name cpm_key prefix_var)
set(package_base_url "https://github.com/eden-emulator/") set(package_base_url "https://github.com/eden-emulator/")
set(package_repo "no_platform") set(package_repo "no_platform")
set(package_extension "no_platform") set(package_extension "no_platform")
@ -29,13 +29,13 @@ function(download_bundled_external remote_path lib_name cpm_key prefix_var versi
set(package_url "${package_base_url}${package_repo}") set(package_url "${package_base_url}${package_repo}")
set(full_url ${package_url}${remote_path}${lib_name}${package_extension}) set(full_url ${package_url}${remote_path}${lib_name}${package_extension})
AddPackage( set(CPM_USE_LOCAL_PACKAGES OFF)
CPMAddPackage(
NAME ${cpm_key} NAME ${cpm_key}
VERSION ${version}
URL ${full_url} URL ${full_url}
DOWNLOAD_ONLY YES DOWNLOAD_ONLY YES
KEY ${CACHE_KEY} CUSTOM_CACHE_KEY ${CACHE_KEY}
# TODO(crueter): hash
) )
set(${prefix_var} "${${cpm_key}_SOURCE_DIR}" PARENT_SCOPE) set(${prefix_var} "${${cpm_key}_SOURCE_DIR}" PARENT_SCOPE)
@ -46,11 +46,11 @@ function(download_win_archives)
set(FORCE_WIN_ARCHIVES ON) set(FORCE_WIN_ARCHIVES ON)
set(FFmpeg_EXT_NAME "ffmpeg-7.1.1") set(FFmpeg_EXT_NAME "ffmpeg-7.1.1")
download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" "" 7.1.1) download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" "")
# TODO(crueter): separate handling for arm64 # TODO(crueter): separate handling for arm64
set(SDL2_VER "SDL2-2.32.8") set(SDL2_VER "SDL2-2.32.8")
download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" "" 2.32.8) download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" "")
set(FORCE_WIN_ARCHIVES OFF) set(FORCE_WIN_ARCHIVES OFF)
endfunction() endfunction()

View file

@ -1,21 +0,0 @@
# SPDX-FileCopyrightText: 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
get_property(NAMES GLOBAL PROPERTY CPM_PACKAGE_NAMES)
get_property(SHAS GLOBAL PROPERTY CPM_PACKAGE_SHAS)
get_property(URLS GLOBAL PROPERTY CPM_PACKAGE_URLS)
list(LENGTH NAMES DEPS_LENGTH)
list(JOIN NAMES "\",\n\t\"" DEP_NAME_DIRTY)
set(DEP_NAMES "\t\"${DEP_NAME_DIRTY}\"")
list(JOIN SHAS "\",\n\t\"" DEP_SHAS_DIRTY)
set(DEP_SHAS "\t\"${DEP_SHAS_DIRTY}\"")
list(JOIN URLS "\",\n\t\"" DEP_URLS_DIRTY)
set(DEP_URLS "\t\"${DEP_URLS_DIRTY}\"")
configure_file(dep_hashes.h.in dep_hashes.h @ONLY)
target_sources(common PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/dep_hashes.h)
target_include_directories(common PUBLIC ${CMAKE_CURRENT_BINARY_DIR})

View file

@ -5,7 +5,7 @@
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
# cpm # cpm
include(CPMUtil) include(CPM)
# Explicitly declare this option here to propagate to the oaknut CPM call # Explicitly declare this option here to propagate to the oaknut CPM call
option(DYNARMIC_TESTS "Build tests" ${BUILD_TESTING}) option(DYNARMIC_TESTS "Build tests" ${BUILD_TESTING})
@ -29,6 +29,8 @@ endif()
# Xbyak (also used by Dynarmic, so needs to be added first) # Xbyak (also used by Dynarmic, so needs to be added first)
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
set(CPM_USE_LOCAL_PACKAGES OFF)
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS") if ("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS")
# Fix regset.h collisions # Fix regset.h collisions
set(XBYAK_HASH 51f507b0b3) set(XBYAK_HASH 51f507b0b3)
@ -38,22 +40,22 @@ if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
set(XBYAK_SHA512SUM 5824e92159e07fa36a774aedd3b3ef3541d0241371d522cffa4ab3e1f215fa5097b1b77865b47b2481376c704fa079875557ea463ca63d0a7fd6a8a20a589e70) set(XBYAK_SHA512SUM 5824e92159e07fa36a774aedd3b3ef3541d0241371d522cffa4ab3e1f215fa5097b1b77865b47b2481376c704fa079875557ea463ca63d0a7fd6a8a20a589e70)
endif() endif()
AddPackage( CPMAddPackage(
NAME xbyak NAME xbyak
REPO "Lizzie841/xbyak" URL "https://github.com/Lizzie841/xbyak/archive/${XBYAK_HASH}.zip"
SHA ${XBYAK_HASH} URL_HASH SHA512=${XBYAK_SHA512SUM}
HASH ${XBYAK_SHA512SUM} CUSTOM_CACHE_KEY ${XBYAK_HASH}
) )
endif() endif()
# Oaknut (also used by Dynarmic, so needs to be added first) # Oaknut (also used by Dynarmic, so needs to be added first)
if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS) if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS)
AddPackage( CPMAddPackage(
NAME oaknut NAME oaknut
VERSION 2.0.1 VERSION 2.0.1
REPO "merryhime/oaknut" URL "https://github.com/merryhime/oaknut/archive/94c726ce03.zip"
SHA 94c726ce03 URL_HASH SHA512=d8d082242fa1881abce3c82f8dafa002c4e561e66a69e7fc038af67faa5eff2630f082d3d19579c88c4c9f9488e54552accc8cb90e7ce743efe043b6230c08ac
HASH d8d082242fa1881abce3c82f8dafa002c4e561e66a69e7fc038af67faa5eff2630f082d3d19579c88c4c9f9488e54552accc8cb90e7ce743efe043b6230c08ac CUSTOM_CACHE_KEY "94c7"
) )
endif() endif()
@ -67,14 +69,15 @@ add_subdirectory(glad)
# mbedtls # mbedtls
# TODO(crueter): test local mbedtls # TODO(crueter): test local mbedtls
AddPackage( set(CPM_USE_LOCAL_PACKAGES ON)
CPMAddPackage(
NAME mbedtls NAME mbedtls
REPO "Mbed-TLS/mbedtls" URL "https://github.com/Mbed-TLS/mbedtls/archive/8c88150ca1.zip"
SHA "8c88150ca1" URL_HASH SHA512=769ad1e94c570671071e1f2a5c0f1027e0bf6bcdd1a80ea8ac970f2c86bc45ce4e31aa88d6d8110fc1bed1de81c48bc624df1b38a26f8b340a44e109d784a966
HASH 769ad1e94c570671071e1f2a5c0f1027e0bf6bcdd1a80ea8ac970f2c86bc45ce4e31aa88d6d8110fc1bed1de81c48bc624df1b38a26f8b340a44e109d784a966
PATCHES PATCHES
${CMAKE_SOURCE_DIR}/.patch/mbedtls/0001-cmake-version.patch ${CMAKE_SOURCE_DIR}/.patch/mbedtls/0001-cmake-version.patch
SYSTEM_PACKAGE ON CUSTOM_CACHE_KEY "8c88"
) )
if (mbedtls_ADDED) if (mbedtls_ADDED)
@ -128,12 +131,11 @@ if (YUZU_USE_EXTERNAL_SDL2)
set(SDL_SHA512SUM d95af47f469a312876f8ab361074a1e7b8083db19935a102d9c6e5887ace6008e64475a8c54b00164b40cad86492bb1b2366084efdd0b2555e5fea6d9c5da80e) set(SDL_SHA512SUM d95af47f469a312876f8ab361074a1e7b8083db19935a102d9c6e5887ace6008e64475a8c54b00164b40cad86492bb1b2366084efdd0b2555e5fea6d9c5da80e)
endif() endif()
AddPackage( CPMAddPackage(
NAME SDL2 NAME SDL2
REPO "libsdl-org/SDL" URL "https://github.com/libsdl-org/SDL/archive/${SDL_HASH}.zip"
SHA ${SDL_HASH} URL_HASH SHA512=${SDL_SHA512SUM}
HASH ${SDL_SHA512SUM} CUSTOM_CACHE_KEY "${YUZU_SYSTEM_PROFILE}"
KEY ${YUZU_SYSTEM_PROFILE}
) )
endif() endif()
@ -144,17 +146,18 @@ if (NOT TARGET enet::enet)
add_library(enet::enet ALIAS enet) add_library(enet::enet ALIAS enet)
endif() endif()
AddPackage( # TODO(crueter): Create a common CPMUtil.cmake that does this for me
set(CPM_USE_LOCAL_PACKAGES ON)
CPMAddPackage(
NAME cubeb NAME cubeb
REPO "mozilla/cubeb" URL "https://github.com/mozilla/cubeb/archive/fa02160712.zip"
SHA fa02160712
HASH 82d808356752e4064de48c8fecbe7856715ade1e76b53937116bf07129fc1cc5b3de5e4b408de3cd000187ba8dc32ca4109661cb7e0355a52e54bd81b9be1c61
FIND_PACKAGE_ARGUMENTS "CONFIG" # not sure this works outside of gentoo FIND_PACKAGE_ARGUMENTS "CONFIG" # not sure this works outside of gentoo
OPTIONS OPTIONS
"USE_SANITIZERS OFF" "USE_SANITIZERS OFF"
"BUILD_TESTS OFF" "BUILD_TESTS OFF"
"BUILD_TOOLS OFF" "BUILD_TOOLS OFF"
SYSTEM_PACKAGE ON CUSTOM_CACHE_KEY "fa02"
) )
if (cubeb_ADDED) if (cubeb_ADDED)
@ -181,17 +184,19 @@ endif()
# DiscordRPC # DiscordRPC
if (USE_DISCORD_PRESENCE) if (USE_DISCORD_PRESENCE)
AddPackage( set(CPM_USE_LOCAL_PACKAGES OFF)
CPMAddPackage(
NAME discord-rpc NAME discord-rpc
REPO "discord/discord-rpc" URL "https://github.com/discord/discord-rpc/archive/963aa9f3e5.zip"
SHA 963aa9f3e5 URL_HASH SHA512=386e1344e9a666d730f2d335ee3aef1fd05b1039febefd51aa751b705009cc764411397f3ca08dffd46205c72f75b235c870c737b2091a4ed0c3b061f5919bde
HASH 386e1344e9a666d730f2d335ee3aef1fd05b1039febefd51aa751b705009cc764411397f3ca08dffd46205c72f75b235c870c737b2091a4ed0c3b061f5919bde
OPTIONS OPTIONS
"BUILD_EXAMPLES OFF" "BUILD_EXAMPLES OFF"
PATCHES PATCHES
${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0001-cmake-version.patch ${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0001-cmake-version.patch
${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0002-no-clang-format.patch ${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0002-no-clang-format.patch
${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0003-fix-cpp17.patch ${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0003-fix-cpp17.patch
CUSTOM_CACHE_KEY "963a"
) )
target_include_directories(discord-rpc INTERFACE ${discord-rpc_SOURCE_DIR}/include) target_include_directories(discord-rpc INTERFACE ${discord-rpc_SOURCE_DIR}/include)
@ -200,68 +205,76 @@ endif()
# Sirit # Sirit
# TODO(crueter): spirv-tools doesn't work w/ system # TODO(crueter): spirv-tools doesn't work w/ system
AddPackage( set(CPM_USE_LOCAL_PACKAGES OFF)
CPMAddPackage(
NAME SPIRV-Headers NAME SPIRV-Headers
REPO "KhronosGroup/SPIRV-Headers" URL "https://github.com/KhronosGroup/SPIRV-Headers/archive/4e209d3d7e.zip"
SHA 4e209d3d7e URL_HASH SHA512=f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4
HASH f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4 CUSTOM_CACHE_KEY "4e20"
) )
AddPackage( set(CPM_USE_LOCAL_PACKAGES ON)
CPMAddPackage(
NAME sirit NAME sirit
REPO "eden-emulator/sirit" URL "https://github.com/raphaelthegreat/sirit/archive/51fcf9720f.zip"
SHA db1f1e8ab5 URL_HASH SHA512=a8f98ea0c51763b89924d836ad482ebdfe9130251cf4e14733ccaacc885ae8cc4c8b03d1dc43e8861609e5f7929c16f935879c1f6bf61866fd75077954774394
HASH 73eb3a042848c63a10656545797e85f40d142009dfb7827384548a385e1e28e1ac72f42b25924ce530d58275f8638554281e884d72f9c7aaf4ed08690a414b05
OPTIONS OPTIONS
"SIRIT_USE_SYSTEM_SPIRV_HEADERS ON" "SIRIT_USE_SYSTEM_SPIRV_HEADERS ON"
SYSTEM_PACKAGE ON CUSTOM_CACHE_KEY "51fc"
) )
# httplib # httplib
if ((ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER)) if ((ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER))
AddPackage( set(CPM_USE_LOCAL_PACKAGES ${YUZU_USE_SYSTEM_HTTPLIB})
# TODO(crueter): fix local package (gentoo?)
CPMAddPackage(
NAME httplib NAME httplib
VERSION 0.12 VERSION 0.12
REPO "yhirose/cpp-httplib" URL "https://github.com/yhirose/cpp-httplib/archive/a609330e4c.zip"
SHA a609330e4c URL_HASH SHA512=dd3fd0572f8367d8549e1319fd98368b3e75801a293b0c3ac9b4adb806473a4506a484b3d389dc5bee5acc460cb90af7a20e5df705a1696b56496b30b9ce7ed2
HASH dd3fd0572f8367d8549e1319fd98368b3e75801a293b0c3ac9b4adb806473a4506a484b3d389dc5bee5acc460cb90af7a20e5df705a1696b56496b30b9ce7ed2
FIND_PACKAGE_ARGUMENTS "MODULE" FIND_PACKAGE_ARGUMENTS "MODULE"
OPTIONS OPTIONS
"HTTPLIB_REQUIRE_OPENSSL ON" "HTTPLIB_REQUIRE_OPENSSL ON"
SYSTEM_PACKAGE ${YUZU_USE_SYSTEM_HTTPLIB} CUSTOM_CACHE_KEY "a609"
) )
endif() endif()
# cpp-jwt # cpp-jwt
if (ENABLE_WEB_SERVICE) if (ENABLE_WEB_SERVICE)
AddPackage( set(CPM_USE_LOCAL_PACKAGES OFF)
CPMAddPackage(
NAME cpp-jwt NAME cpp-jwt
VERSION 1.4 VERSION 1.4
REPO "arun11299/cpp-jwt" URL "https://github.com/arun11299/cpp-jwt/archive/10ef5735d8.zip"
SHA 10ef5735d8 URL_HASH SHA512=ebba3d26b33a3b0aa909f475e099594560edbce10ecd03e76d7fea68549a28713ea606d363808f88a5495b62c54c3cdb7e47aee2d946eceabd36e310479dadb7
HASH ebba3d26b33a3b0aa909f475e099594560edbce10ecd03e76d7fea68549a28713ea606d363808f88a5495b62c54c3cdb7e47aee2d946eceabd36e310479dadb7
FIND_PACKAGE_ARGUMENTS "CONFIG" FIND_PACKAGE_ARGUMENTS "CONFIG"
OPTIONS OPTIONS
"CPP_JWT_BUILD_EXAMPLES OFF" "CPP_JWT_BUILD_EXAMPLES OFF"
"CPP_JWT_BUILD_TESTS OFF" "CPP_JWT_BUILD_TESTS OFF"
"CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF" "CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF"
CUSTOM_CACHE_KEY "10ef"
) )
endif() endif()
# Opus # Opus
AddPackage( set(CPM_USE_LOCAL_PACKAGES ${YUZU_USE_SYSTEM_OPUS})
CPMAddPackage(
NAME Opus NAME Opus
VERSION 1.3 VERSION 1.3
REPO "xiph/opus" URL "https://github.com/xiph/opus/archive/5ded705cf4.zip"
SHA 5ded705cf4 URL_HASH SHA512=0dc89e58ddda1f3bc6a7037963994770c5806c10e66f5cc55c59286fc76d0544fe4eca7626772b888fd719f434bc8a92f792bdb350c807968b2ac14cfc04b203
HASH 0dc89e58ddda1f3bc6a7037963994770c5806c10e66f5cc55c59286fc76d0544fe4eca7626772b888fd719f434bc8a92f792bdb350c807968b2ac14cfc04b203
FIND_PACKAGE_ARGUMENTS "MODULE" FIND_PACKAGE_ARGUMENTS "MODULE"
OPTIONS OPTIONS
"OPUS_BUILD_TESTING OFF" "OPUS_BUILD_TESTING OFF"
"OPUS_BUILD_PROGRAMS OFF" "OPUS_BUILD_PROGRAMS OFF"
"OPUS_INSTALL_PKG_CONFIG_MODULE OFF" "OPUS_INSTALL_PKG_CONFIG_MODULE OFF"
"OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF" "OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF"
SYSTEM_PACKAGE ${YUZU_USE_SYSTEM_OPUS} CUSTOM_CACHE_KEY "5ded"
) )
# FFMpeg # FFMpeg
@ -277,36 +290,31 @@ endif()
if (YUZU_USE_EXTERNAL_VULKAN_HEADERS) if (YUZU_USE_EXTERNAL_VULKAN_HEADERS)
set(CPM_USE_LOCAL_PACKAGES OFF) set(CPM_USE_LOCAL_PACKAGES OFF)
else() else()
set(CPM_USE_LOCAL_PACKAGES OFF) set(CPM_USE_LOCAL_PACKAGES ON)
endif() endif()
# TODO(crueter): Vk1.4 impl # TODO(crueter): System vk-headers are too new for externals vk-util
# TODO(crueter): allow sys packages? CPMAddPackage(
AddPackage(
NAME VulkanHeaders NAME VulkanHeaders
VERSION 1.3.274 VERSION 1.3.274
REPO "KhronosGroup/Vulkan-Headers" URL "https://github.com/KhronosGroup/Vulkan-Headers/archive/89268a6d17.zip"
SHA 89268a6d17 URL_HASH SHA512=3ab349f74298ba72cafb8561015690c0674d428a09fb91ccd3cd3daca83650d190d46d33fd97b0a8fd4223fe6df2bcabae89136fbbf7c0bfeb8776f9448304c8
HASH 3ab349f74298ba72cafb8561015690c0674d428a09fb91ccd3cd3daca83650d190d46d33fd97b0a8fd4223fe6df2bcabae89136fbbf7c0bfeb8776f9448304c8 CUSTOM_CACHE_KEY "8926"
BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_HEADERS}
) )
# CMake's interface generator sucks # Vulkan-Utility-Libraries
if (VulkanHeaders_ADDED) if (YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES)
target_include_directories(Vulkan-Headers INTERFACE ${VulkanHeaders_SOURCE_DIR}/include) set(CPM_USE_LOCAL_PACKAGES OFF)
else()
set(CPM_USE_LOCAL_PACKAGES ON)
endif() endif()
set(VulkanHeaders_SOURCE_DIR "${VulkanHeaders_SOURCE_DIR}" PARENT_SCOPE) CPMAddPackage(
set(VulkanHeaders_ADDED "${VulkanHeaders_ADDED}" PARENT_SCOPE)
# Vulkan-Utility-Libraries
AddPackage(
NAME VulkanUtilityLibraries NAME VulkanUtilityLibraries
REPO "KhronosGroup/Vulkan-Utility-Libraries" URL "https://github.com/KhronosGroup/Vulkan-Utility-Libraries/archive/df2e358152.zip"
SHA df2e358152 URL_HASH SHA512=3e468c3d9ff93f6d418d71e5527abe0a12c8c7ab5b0b52278bbbee4d02bb87e99073906729b727e0147242b7e3fd5dedf68b803f1878cb4c0e4f730bc2238d79
HASH 3e468c3d9ff93f6d418d71e5527abe0a12c8c7ab5b0b52278bbbee4d02bb87e99073906729b727e0147242b7e3fd5dedf68b803f1878cb4c0e4f730bc2238d79 CUSTOM_CACHE_KEY "df2e"
BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES}
) )
set(VulkanUtilityLibraries_SOURCE_DIR "${VulkanUtilityLibraries_SOURCE_DIR}" PARENT_SCOPE) set(VulkanUtilityLibraries_SOURCE_DIR "${VulkanUtilityLibraries_SOURCE_DIR}" PARENT_SCOPE)
@ -314,35 +322,38 @@ set(VulkanUtilityLibraries_ADDED "${VulkanUtilityLibraries_ADDED}" PARENT_SCOPE)
# SPIRV-Tools # SPIRV-Tools
if (YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS) if (YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS)
AddPackage( CPMAddPackage(
NAME SPIRV-Tools NAME SPIRV-Tools
REPO "KhronosGroup/SPIRV-Tools" URL "https://github.com/KhronosGroup/SPIRV-Tools/archive/40eb301f32.zip"
SHA 40eb301f32 URL_HASH SHA512=58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa
HASH 58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa
OPTIONS OPTIONS
"SPIRV_SKIP_EXECUTABLES ON" "SPIRV_SKIP_EXECUTABLES ON"
CUSTOM_CACHE_KEY "40eb"
) )
endif() endif()
# Boost headers # Boost headers
AddPackage( set(CPM_USE_LOCAL_PACKAGES OFF)
CPMAddPackage(
NAME boost_headers NAME boost_headers
REPO "boostorg/headers" URL "https://github.com/boostorg/headers/archive/0456900fad.zip"
SHA 0456900fad URL_HASH SHA512=50cd75dcdfc5f082225cdace058f47b4fb114a47585f7aee1d22236a910a80b667186254c214fa2fcebac67ae6d37ba4b6e695e1faea8affd6fd42a03cf996e3
HASH 50cd75dcdfc5f082225cdace058f47b4fb114a47585f7aee1d22236a910a80b667186254c214fa2fcebac67ae6d37ba4b6e695e1faea8affd6fd42a03cf996e3 CUSTOM_CACHE_KEY "0456"
) )
# TZDB (Time Zone Database) # TZDB (Time Zone Database)
add_subdirectory(nx_tzdb) add_subdirectory(nx_tzdb)
# VMA # VMA
AddPackage( set(CPM_USE_LOCAL_PACKAGES ON)
CPMAddPackage(
NAME VulkanMemoryAllocator NAME VulkanMemoryAllocator
REPO "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator" URL "https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/archive/1076b348ab.zip"
SHA 1076b348ab URL_HASH SHA512=a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772
HASH a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772
FIND_PACKAGE_ARGUMENTS "CONFIG" FIND_PACKAGE_ARGUMENTS "CONFIG"
# SYSTEM_PACKAGE ON CUSTOM_CACHE_KEY "1076"
) )
set(VulkanMemoryAllocator_SOURCE_DIR "${VulkanMemoryAllocator_SOURCE_DIR}" PARENT_SCOPE) set(VulkanMemoryAllocator_SOURCE_DIR "${VulkanMemoryAllocator_SOURCE_DIR}" PARENT_SCOPE)
@ -378,13 +389,15 @@ endif()
if (ANDROID) if (ANDROID)
if (ARCHITECTURE_arm64) if (ARCHITECTURE_arm64)
AddPackage( set(CPM_USE_LOCAL_PACKAGES OFF)
CPMAddPackage(
NAME libadrenotools NAME libadrenotools
REPO "bylaws/libadrenotools" URL "https://github.com/bylaws/libadrenotools/archive/8fae8ce254.zip"
SHA 8fae8ce254 URL_HASH SHA512=c74fa855f0edebbf25c9bce40b00966daa2447bfc5e15f0cf1a95f86cbf70fc6b02590707edbde16328a0a2a4fb9a1fc419d2dfc22a4a4150971be91892d4edb
HASH c74fa855f0edebbf25c9bce40b00966daa2447bfc5e15f0cf1a95f86cbf70fc6b02590707edbde16328a0a2a4fb9a1fc419d2dfc22a4a4150971be91892d4edb
PATCHES PATCHES
${CMAKE_SOURCE_DIR}/.patch/libadrenotools/0001-linkerns-cpm.patch ${CMAKE_SOURCE_DIR}/.patch/libadrenotools/0001-linkerns-cpm.patch
CUSTOM_CACHE_KEY "8fae"
) )
endif() endif()
endif() endif()
@ -409,12 +422,13 @@ if (YUZU_CRASH_DUMPS AND NOT TARGET libbreakpad_client)
_CRT_NONSTDC_NO_DEPRECATE _CRT_NONSTDC_NO_DEPRECATE
) )
AddPackage( set(CPM_USE_LOCAL_PACKAGES OFF)
CPMAddPackage(
NAME breakpad NAME breakpad
URL "google/breakpad" URL "https://github.com/google/breakpad/archive/f80f288803.zip"
SHA f80f288803 URL_HASH SHA512=4a87ee88cea99bd633d52a5b00135a649f1475e3b65db325a6df9c804ab82b054ad7e62419b35f6e22cc5dfbbb569214041d7ad5d10fab10106e700bb5050e1d
HASH 4a87ee88cea99bd633d52a5b00135a649f1475e3b65db325a6df9c804ab82b054ad7e62419b35f6e22cc5dfbbb569214041d7ad5d10fab10106e700bb5050e1d
DOWNLOAD_ONLY YES DOWNLOAD_ONLY YES
CUSTOM_CACHE_KEY "f80f"
) )
# libbreakpad # libbreakpad
@ -514,11 +528,14 @@ endif()
# oboe # oboe
if (ANDROID) if (ANDROID)
AddPackage( set(CPM_USE_LOCAL_PACKAGES ON)
CPMAddPackage(
NAME oboe NAME oboe
REPO "google/oboe" URL "https://github.com/google/oboe/archive/2bc873e53c.zip"
SHA 2bc873e53c URL_HASH SHA512=02329058a7f9cf7d5039afaae5ab170d9f42f60f4c01e21eaf4f46073886922b057a9ae30eeac040b3ac182f51b9c1bfe9fe1050a2c9f6ce567a1a9a0ec2c768
HASH 02329058a7f9cf7d5039afaae5ab170d9f42f60f4c01e21eaf4f46073886922b057a9ae30eeac040b3ac182f51b9c1bfe9fe1050a2c9f6ce567a1a9a0ec2c768 OPTIONS
"SPIRV_SKIP_EXECUTABLES ON"
CUSTOM_CACHE_KEY "2bc8"
) )
add_library(oboe::oboe ALIAS oboe) add_library(oboe::oboe ALIAS oboe)

View file

@ -19,11 +19,14 @@ if (NOT WIN32 AND NOT ANDROID)
message(FATAL_ERROR "Required program `autoconf` not found.") message(FATAL_ERROR "Required program `autoconf` not found.")
endif() endif()
AddPackage( include(CPM)
set(CPM_USE_LOCAL_PACKAGES OFF)
CPMAddPackage(
NAME ffmpeg NAME ffmpeg
REPO "FFmpeg/FFmpeg" URL "https://github.com/FFmpeg/FFmpeg/archive/c2184b65d2.zip"
SHA c2184b65d2 URL_HASH SHA512=2a89d664119debbb3c006ab1c48d5d7f26e889f4a65ad2e25c8b0503308295123d5a9c5c78bf683aef5ff09acef8c3fc2837f22d3e8c611528b933bf03bcdd97
HASH 2a89d664119debbb3c006ab1c48d5d7f26e889f4a65ad2e25c8b0503308295123d5a9c5c78bf683aef5ff09acef8c3fc2837f22d3e8c611528b933bf03bcdd97 CUSTOM_CACHE_KEY "c218"
) )
set(FFmpeg_PREFIX ${ffmpeg_SOURCE_DIR}) set(FFmpeg_PREFIX ${ffmpeg_SOURCE_DIR})
@ -240,7 +243,7 @@ elseif(ANDROID)
message(FATAL_ERROR "Unsupported architecture for Android FFmpeg") message(FATAL_ERROR "Unsupported architecture for Android FFmpeg")
endif() endif()
download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH 7.1.1) download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH)
set(FFmpeg_FOUND YES) set(FFmpeg_FOUND YES)
set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE) set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE)
set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/lib" CACHE PATH "Path to FFmpeg library directory" FORCE) set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/lib" CACHE PATH "Path to FFmpeg library directory" FORCE)
@ -265,7 +268,7 @@ elseif(WIN32)
# Use yuzu FFmpeg binaries # Use yuzu FFmpeg binaries
set(FFmpeg_EXT_NAME "ffmpeg-7.1.1") set(FFmpeg_EXT_NAME "ffmpeg-7.1.1")
download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH 7.1.1) download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH)
set(FFmpeg_FOUND YES) set(FFmpeg_FOUND YES)
set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE) set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE)
set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/bin" CACHE PATH "Path to FFmpeg library directory" FORCE) set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/bin" CACHE PATH "Path to FFmpeg library directory" FORCE)

View file

@ -232,5 +232,3 @@ if (ANDROID)
add_subdirectory(android/app/src/main/jni) add_subdirectory(android/app/src/main/jni)
target_include_directories(yuzu-android PRIVATE android/app/src/main) target_include_directories(yuzu-android PRIVATE android/app/src/main)
endif() endif()
include(GenerateDepHashes)

View file

@ -3,7 +3,6 @@
package org.yuzu.yuzu_emu.ui package org.yuzu.yuzu_emu.ui
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.Configuration import android.content.res.Configuration
@ -95,7 +94,6 @@ class GamesFragment : Fragment() {
return binding.root return binding.root
} }
@SuppressLint("NotifyDataSetChanged")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
homeViewModel.setStatusBarShadeVisibility(true) homeViewModel.setStatusBarShadeVisibility(true)

View file

@ -226,64 +226,6 @@
<color name="yuzu_inversePrimary_gray">#B7B7B7</color> <color name="yuzu_inversePrimary_gray">#B7B7B7</color>
<color name="yuzu_surfaceTint_gray">#B7B7B7</color> <color name="yuzu_surfaceTint_gray">#B7B7B7</color>
<!-- Eden Theme Colors -->
<!-- Synthwave/Vaporwave Primary Colors -->
<color name="eden_primary">#FF0080</color> <!-- Neon magenta -->
<color name="eden_primary_variant">#E6006B</color> <!-- Darker magenta -->
<color name="eden_secondary">#00FFFF</color> <!-- Electric cyan -->
<color name="eden_secondary_variant">#00E6E6</color> <!-- Darker cyan -->
<!-- Background Colors - Deep space black -->
<color name="eden_background">#000000</color> <!-- Pure black background -->
<color name="eden_surface">#0D0D0D</color> <!-- Card surface -->
<color name="eden_surface_variant">#1A1A1A</color> <!-- Elevated surface -->
<!-- Text Colors - High contrast for readability -->
<color name="eden_on_background">#FFFFFF</color> <!-- Pure white text -->
<color name="eden_on_surface">#FFFFFF</color> <!-- Pure white text -->
<color name="eden_on_primary">#FFFFFF</color> <!-- White on neon -->
<color name="eden_on_secondary">#000000</color> <!-- Black on cyan -->
<!-- Synthwave Status Colors -->
<color name="eden_error">#FF0040</color> <!-- Neon red -->
<color name="eden_success">#00FF80</color> <!-- Neon green -->
<color name="eden_warning">#FFFF00</color> <!-- Neon yellow -->
<color name="eden_info">#0080FF</color> <!-- Electric blue -->
<!-- Synthwave Accent Colors -->
<color name="eden_accent_purple">#9D00FF</color> <!-- Electric purple -->
<color name="eden_accent_blue">#0080FF</color> <!-- Electric blue -->
<color name="eden_accent_orange">#FF8000</color> <!-- Neon orange -->
<!-- Neon Glow Effects -->
<color name="eden_glow_pink">#80FF0080</color> <!-- Magenta glow -->
<color name="eden_glow_cyan">#8060D1F6</color> <!-- Cyan glow -->
<color name="eden_glow_orange">#80FF8000</color> <!-- Orange glow -->
<!-- Neon Border Colors -->
<color name="eden_border">#7c757f</color> <!-- Subtle border -->
<color name="eden_border_light">#948b98</color> <!-- Lighter border -->
<color name="eden_border_gradient_start">#FF0080</color> <!-- Neon magenta -->
<color name="eden_border_gradient_end">#60D1F6</color> <!-- Electric cyan -->
<!-- Overlay Colors -->
<color name="eden_overlay">#CC000000</color>
<!-- Neon Button Colors -->
<color name="eden_button_primary_bg">#FF0080</color> <!-- Neon magenta -->
<color name="eden_button_secondary_bg">#00000000</color> <!-- Transparent -->
<color name="eden_button_secondary_border">#00FFFF</color> <!-- Electric cyan -->
<!-- Synthwave Card Colors -->
<color name="eden_card_background">#0D0D0D</color> <!-- Almost black -->
<color name="eden_card_background_elevated">#1A1A1A</color> <!-- Elevated black -->
<!-- Transparent versions for gradients -->
<color name="eden_transparent">#00000000</color>
<color name="eden_primary_transparent">#05FF0080</color>
<color name="eden_secondary_transparent">#0500FFFF</color>
<!-- Common Colors Across All Themes --> <!-- Common Colors Across All Themes -->
<color name="yuzu_transparent_black">#80000000</color> <color name="yuzu_transparent_black">#80000000</color>
<color name="yuzu_outlineVariant">#C6C5D0</color> <color name="yuzu_outlineVariant">#C6C5D0</color>

View file

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Synthwave/Vaporwave Primary Colors -->
<color name="eden_primary">#FF0080</color> <!-- Neon magenta -->
<color name="eden_primary_variant">#E6006B</color> <!-- Darker magenta -->
<color name="eden_secondary">#00FFFF</color> <!-- Electric cyan -->
<color name="eden_secondary_variant">#00E6E6</color> <!-- Darker cyan -->
<!-- Background Colors - Deep space black -->
<color name="eden_background">#000000</color> <!-- Pure black background -->
<color name="eden_surface">#0D0D0D</color> <!-- Card surface -->
<color name="eden_surface_variant">#1A1A1A</color> <!-- Elevated surface -->
<!-- Text Colors - High contrast for readability -->
<color name="eden_on_background">#FFFFFF</color> <!-- Pure white text -->
<color name="eden_on_surface">#FFFFFF</color> <!-- Pure white text -->
<color name="eden_on_primary">#FFFFFF</color> <!-- White on neon -->
<color name="eden_on_secondary">#000000</color> <!-- Black on cyan -->
<!-- Synthwave Accent Colors -->
<color name="eden_accent_pink">#FF0080</color> <!-- Neon magenta -->
<color name="eden_accent_purple">#9D00FF</color> <!-- Electric purple -->
<color name="eden_accent_blue">#0080FF</color> <!-- Electric blue -->
<color name="eden_accent_orange">#FF8000</color> <!-- Neon orange -->
<!-- Synthwave Gradient Colors -->
<color name="eden_gradient_start">#FF0080</color> <!-- Neon magenta -->
<color name="eden_gradient_middle">#9D00FF</color> <!-- Electric purple -->
<color name="eden_gradient_end">#00FFFF</color> <!-- Electric cyan -->
<!-- Neon Glow Effects -->
<color name="eden_glow_pink">#80FF0080</color> <!-- Magenta glow -->
<color name="eden_glow_cyan">#8000FFFF</color> <!-- Cyan glow -->
<color name="eden_glow_purple">#809D00FF</color> <!-- Purple glow -->
<color name="eden_glow_orange">#80FF8000</color> <!-- Orange glow -->
<!-- Neon Border Colors -->
<color name="eden_border">#7c757f</color> <!-- Subtle border -->
<color name="eden_border_light">#948b98</color> <!-- Lighter border -->
<color name="eden_border_gradient_start">#FF0080</color> <!-- Neon magenta -->
<color name="eden_border_gradient_end">#00FFFF</color> <!-- Electric cyan -->
<!-- Retro Grid Pattern -->
<color name="eden_grid_line">#1A1A1A</color> <!-- Grid lines -->
<color name="eden_grid_line_accent">#FF0080</color> <!-- Neon grid lines -->
<color name="eden_grid_line_cyan">#00FFFF</color> <!-- Cyan grid lines -->
<!-- Synthwave Status Colors -->
<color name="eden_error">#FF0040</color> <!-- Neon red -->
<color name="eden_success">#00FF80</color> <!-- Neon green -->
<color name="eden_warning">#FFFF00</color> <!-- Neon yellow -->
<color name="eden_info">#0080FF</color> <!-- Electric blue -->
<!-- Overlay Colors -->
<color name="eden_overlay_dark">#CC000000</color>
<color name="eden_overlay_medium">#80000000</color>
<color name="eden_overlay_light">#33000000</color>
<!-- Neon Button Colors -->
<color name="eden_button_primary_bg">#FF0080</color> <!-- Neon magenta -->
<color name="eden_button_secondary_bg">#00000000</color> <!-- Transparent -->
<color name="eden_button_secondary_border">#00FFFF</color> <!-- Electric cyan -->
<!-- Synthwave Card Colors -->
<color name="eden_card_background">#0D0D0D</color> <!-- Almost black -->
<color name="eden_card_background_elevated">#1A1A1A</color> <!-- Elevated black -->
<!-- Retro Navigation Colors -->
<color name="eden_nav_background">#000000</color> <!-- Pure black -->
<color name="eden_nav_selected">#FF0080</color> <!-- Neon magenta -->
<color name="eden_nav_unselected">#666666</color> <!-- Gray -->
<!-- Transparent versions for gradients -->
<color name="eden_transparent">#00000000</color>
<color name="eden_primary_transparent">#05FF0080</color>
<color name="eden_secondary_transparent">#0500FFFF</color>
<!-- Additional Synthwave Colors -->
<color name="eden_scan_line">#33FF0080</color> <!-- Scan line effect -->
<color name="eden_hologram">#1A00FFFF</color> <!-- Holographic effect -->
<color name="eden_neon_outline">#FFFF0080</color> <!-- Neon outline -->
</resources>

View file

@ -64,7 +64,7 @@
<item name="android:windowLightStatusBar">false</item> <item name="android:windowLightStatusBar">false</item>
<item name="android:windowLightNavigationBar">false</item> <item name="android:windowLightNavigationBar">false</item>
<!-- Other theme attributes --> <!-- Other theme attributes -->
<item name="android:shadowColor">@color/eden_overlay</item> <item name="android:shadowColor">@color/eden_overlay_dark</item>
<item name="sliderStyle">@style/EdenSlider</item> <item name="sliderStyle">@style/EdenSlider</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:enforceStatusBarContrast">false</item> <item name="android:enforceStatusBarContrast">false</item>

View file

@ -221,64 +221,6 @@
<color name="yuzu_inversePrimary_gray">#BDBDBD</color> <color name="yuzu_inversePrimary_gray">#BDBDBD</color>
<color name="yuzu_surfaceTint_gray">#9E9E9E</color> <color name="yuzu_surfaceTint_gray">#9E9E9E</color>
<!-- Eden Theme Colors -->
<!-- Synthwave/Vaporwave Primary Colors -->
<color name="eden_primary">#FF0080</color> <!-- Neon magenta -->
<color name="eden_primary_variant">#E6006B</color> <!-- Darker magenta -->
<color name="eden_secondary">#60D1F6</color> <!-- Electric cyan -->
<color name="eden_secondary_variant">#00E6E6</color> <!-- Darker cyan -->
<!-- Background Colors - White -->
<color name="eden_background">#FFFFFF</color> <!-- Pure black background -->
<color name="eden_surface">#FFFFFF</color> <!-- Card surface -->
<color name="eden_surface_variant">#D3D3D3</color> <!-- Elevated surface -->
<!-- Text Colors - High contrast for readability -->
<color name="eden_on_background">#000000</color> <!-- Pure black text -->
<color name="eden_on_surface">#000000</color> <!-- Pure black text -->
<color name="eden_on_primary">#FFFFFF</color> <!-- White on neon -->
<color name="eden_on_secondary">#C0C0C0</color> <!-- Milky White on cyan -->
<!-- Synthwave Accent Colors -->
<color name="eden_accent_purple">#9D00FF</color> <!-- Electric purple -->
<color name="eden_accent_blue">#0080FF</color> <!-- Electric blue -->
<color name="eden_accent_orange">#FF8000</color> <!-- Neon orange -->
<!-- Neon Glow Effects -->
<color name="eden_glow_pink">#80FF0080</color> <!-- Magenta glow -->
<color name="eden_glow_cyan">#8060D1F6</color> <!-- Cyan glow -->
<color name="eden_glow_orange">#80FF8000</color> <!-- Orange glow -->
<!-- Neon Border Colors -->
<color name="eden_border">#7c757f</color> <!-- Subtle border -->
<color name="eden_border_light">#948b98</color> <!-- Lighter border -->
<color name="eden_border_gradient_start">#FF0080</color> <!-- Neon magenta -->
<color name="eden_border_gradient_end">#60D1F6</color> <!-- Electric cyan -->
<!-- Synthwave Status Colors -->
<color name="eden_error">#FF0040</color> <!-- Neon red -->
<color name="eden_success">#00FF80</color> <!-- Neon green -->
<color name="eden_warning">#FFFF00</color> <!-- Neon yellow -->
<color name="eden_info">#0080FF</color> <!-- Electric blue -->
<!-- Overlay Colors -->
<color name="eden_overlay">#CCFFFFFF</color>
<!-- Neon Button Colors -->
<color name="eden_button_primary_bg">#FF0080</color> <!-- Neon magenta -->
<color name="eden_button_secondary_bg">#00000000</color> <!-- Transparent -->
<color name="eden_button_secondary_border">#60D1F6</color> <!-- Electric cyan -->
<!-- Synthwave Card Colors -->
<color name="eden_card_background">#F0F0F0</color> <!-- Almost white -->
<color name="eden_card_background_elevated">#D8D8D8</color> <!-- Elevated white -->
<!-- Transparent versions for gradients -->
<color name="eden_transparent">#00000000</color>
<color name="eden_primary_transparent">#05FF0080</color>
<color name="eden_secondary_transparent">#0500FFFF</color>
<!-- Common Colors Across All Themes --> <!-- Common Colors Across All Themes -->
<color name="yuzu_outlineVariant">#C6C5D0</color> <color name="yuzu_outlineVariant">#C6C5D0</color>
<color name="yuzu_error">#BA1A1A</color> <color name="yuzu_error">#BA1A1A</color>
@ -288,8 +230,7 @@
<color name="yuzu_shadow">#000000</color> <color name="yuzu_shadow">#000000</color>
<color name="yuzu_scrim">#000000</color> <color name="yuzu_scrim">#000000</color>
<color name="yuzu_transparent_black">#80000000</color> <color name="yuzu_transparent_black">#80000000</color>
<!-- Values used in dark mode but here are jsut white / black values-->
<!-- Values used in dark mode but here are just white / black values-->
<color name="yuzu_onPrimary_blue">#FFFFFF</color> <color name="yuzu_onPrimary_blue">#FFFFFF</color>
<color name="yuzu_onSecondary_blue">#FFFFFF</color> <color name="yuzu_onSecondary_blue">#FFFFFF</color>
<color name="yuzu_onTertiary_blue">#FFFFFF</color> <color name="yuzu_onTertiary_blue">#FFFFFF</color>

View file

@ -159,8 +159,7 @@ add_library(
wall_clock.cpp wall_clock.cpp
wall_clock.h wall_clock.h
zstd_compression.cpp zstd_compression.cpp
zstd_compression.h zstd_compression.h)
)
if(YUZU_ENABLE_PORTABLE) if(YUZU_ENABLE_PORTABLE)
add_compile_definitions(YUZU_ENABLE_PORTABLE) add_compile_definitions(YUZU_ENABLE_PORTABLE)

View file

@ -1,20 +0,0 @@
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
namespace Common {
static const constexpr std::array<const char *, @DEPS_LENGTH@> dep_names = {
@DEP_NAMES@
};
static const constexpr std::array<const char *, @DEPS_LENGTH@> dep_hashes = {
@DEP_SHAS@
};
static const constexpr std::array<const char *, @DEPS_LENGTH@> dep_urls = {
@DEP_URLS@
};
} // namespace Common

View file

@ -1,4 +1,4 @@
include(CPMUtil) include(CPM)
# Always build externals as static libraries, even when dynarmic is built as shared # Always build externals as static libraries, even when dynarmic is built as shared
if (BUILD_SHARED_LIBS) if (BUILD_SHARED_LIBS)
@ -22,12 +22,12 @@ set(BUILD_TESTING OFF)
if ("riscv" IN_LIST ARCHITECTURE) if ("riscv" IN_LIST ARCHITECTURE)
add_subdirectory(biscuit) add_subdirectory(biscuit)
AddPackage( CPMAddPackage(
NAME biscuit NAME biscuit
VERSION 0.9.1 VERSION 0.9.1
REPO "lioncash/biscuit" URL "https://github.com/lioncash/biscuit/archive/76b0be8dae.zip"
SHA 76b0be8dae URL_HASH SHA512=47d55ed02d032d6cf3dc107c6c0a9aea686d5f25aefb81d1af91db027b6815bd5add1755505e19d76625feeb17aa2db6cd1668fe0dad2e6a411519bde6ca4489
HASH 47d55ed02d032d6cf3dc107c6c0a9aea686d5f25aefb81d1af91db027b6815bd5add1755505e19d76625feeb17aa2db6cd1668fe0dad2e6a411519bde6ca4489 CUSTOM_CACHE_KEY "76b0"
) )
endif() endif()
@ -49,14 +49,14 @@ if (NOT TARGET fmt::fmt)
endif() endif()
# mcl # mcl
AddPackage( CPMAddPackage(
NAME mcl NAME mcl
VERSION 0.1.12 VERSION 0.1.12
REPO "azahar-emu/mcl" URL "https://github.com/azahar-emu/mcl/archive/7b08d83418.zip"
SHA 7b08d83418 URL_HASH SHA512=f943bac39c1879986decad7a442ff4288eaeca4a2907684c7914e115a55ecc43c2782ded85c0835763fe04e40d5c82220ce864423e489e648e408a84f54dc4f3
HASH f943bac39c1879986decad7a442ff4288eaeca4a2907684c7914e115a55ecc43c2782ded85c0835763fe04e40d5c82220ce864423e489e648e408a84f54dc4f3
OPTIONS OPTIONS
"MCL_INSTALL OFF" "MCL_INSTALL OFF"
CUSTOM_CACHE_KEY "7b08"
) )
# oaknut # oaknut
@ -71,14 +71,14 @@ AddPackage(
# unordered_dense # unordered_dense
AddPackage( CPMAddPackage(
NAME unordered_dense NAME unordered_dense
REPO "Lizzie841/unordered_dense" URL "https://github.com/Lizzie841/unordered_dense/archive/e59d30b7b1.zip"
SHA e59d30b7b1 URL_HASH SHA512=71eff7bd9ba4b9226967bacd56a8ff000946f8813167cb5664bb01e96fb79e4e220684d824fe9c59c4d1cc98c606f13aff05b7940a1ed8ab3c95d6974ee34fa0
HASH 71eff7bd9ba4b9226967bacd56a8ff000946f8813167cb5664bb01e96fb79e4e220684d824fe9c59c4d1cc98c606f13aff05b7940a1ed8ab3c95d6974ee34fa0
FIND_PACKAGE_ARGUMENTS "CONFIG" FIND_PACKAGE_ARGUMENTS "CONFIG"
OPTIONS OPTIONS
"UNORDERED_DENSE_INSTALL OFF" "UNORDERED_DENSE_INSTALL OFF"
CUSTOM_CACHE_KEY "e59d"
) )
# xbyak # xbyak
@ -93,24 +93,24 @@ AddPackage(
# zydis # zydis
if ("x86_64" IN_LIST ARCHITECTURE) if ("x86_64" IN_LIST ARCHITECTURE)
AddPackage( CPMAddPackage(
NAME Zycore NAME Zycore
REPO "zyantific/zycore-c" URL "https://github.com/zyantific/zycore-c/archive/75a36c45ae.zip"
SHA 75a36c45ae URL_HASH SHA512=15aa399f39713e042c4345bc3175c82f14dca849fde2a21d4f591f62c43e227b70d868d8bb86beb5f4eb68b1d6bd3792cdd638acf89009e787e3d10ee7401924
HASH 15aa399f39713e042c4345bc3175c82f14dca849fde2a21d4f591f62c43e227b70d868d8bb86beb5f4eb68b1d6bd3792cdd638acf89009e787e3d10ee7401924 CUSTOM_CACHE_KEY "75a3"
) )
AddPackage( CPMAddPackage(
NAME Zydis NAME Zydis
VERSION 4 VERSION 4
REPO "zyantific/zydis" URL "https://github.com/zyantific/zydis/archive/c2d2bab025.zip"
SHA c2d2bab025 URL_HASH SHA512=7b48f213ff7aab2926f8c9c65195959143bebbfb2b9a25051ffd8b8b0f1baf1670d9739781de674577d955925f91ac89376e16b476a03828c84e2fd765d45020
HASH 7b48f213ff7aab2926f8c9c65195959143bebbfb2b9a25051ffd8b8b0f1baf1670d9739781de674577d955925f91ac89376e16b476a03828c84e2fd765d45020
OPTIONS OPTIONS
"ZYDIS_BUILD_TOOLS OFF" "ZYDIS_BUILD_TOOLS OFF"
"ZYDIS_BUILD_EXAMPLES OFF" "ZYDIS_BUILD_EXAMPLES OFF"
"ZYDIS_BUILD_DOXYGEN OFF" "ZYDIS_BUILD_DOXYGEN OFF"
"ZYAN_ZYCORE_PATH ${Zycore_SOURCE_DIR}" "ZYAN_ZYCORE_PATH ${Zycore_SOURCE_DIR}"
"CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON" "CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON"
CUSTOM_CACHE_KEY "c2d2"
) )
endif() endif()

View file

@ -14,34 +14,19 @@ template<typename... Ts>
assert_terminate_impl(expr_str, msg, fmt::make_format_args(args...)); assert_terminate_impl(expr_str, msg, fmt::make_format_args(args...));
} }
// Temporary until MCL is fully removed
#ifndef ASSERT_MSG
#define ASSERT_MSG(_a_, ...) \ #define ASSERT_MSG(_a_, ...) \
([&]() { \ ([&]() { \
if (!(_a_)) [[unlikely]] { \ if (!(_a_)) [[unlikely]] { \
assert_terminate(#_a_, __VA_ARGS__); \ assert_terminate(#_a_, __VA_ARGS__); \
} \ } \
}()) }())
#endif
#ifndef ASSERT
#define ASSERT(_a_) ASSERT_MSG(_a_, "") #define ASSERT(_a_) ASSERT_MSG(_a_, "")
#endif
#ifndef UNREACHABLE
#define UNREACHABLE() ASSERT_MSG(false, "unreachable") #define UNREACHABLE() ASSERT_MSG(false, "unreachable")
#endif
#ifdef _DEBUG #ifdef _DEBUG
#ifndef DEBUG_ASSERT
#define DEBUG_ASSERT(_a_) ASSERT(_a_) #define DEBUG_ASSERT(_a_) ASSERT(_a_)
#endif
#ifndef DEBUG_ASSERT_MSG
#define DEBUG_ASSERT_MSG(_a_, ...) ASSERT_MSG(_a_, __VA_ARGS__) #define DEBUG_ASSERT_MSG(_a_, ...) ASSERT_MSG(_a_, __VA_ARGS__)
#endif
#else // not debug #else // not debug
#ifndef DEBUG_ASSERT
#define DEBUG_ASSERT(_a_) #define DEBUG_ASSERT(_a_)
#endif
#ifndef DEBUG_ASSERT_MSG
#define DEBUG_ASSERT_MSG(_a_, _desc_, ...) #define DEBUG_ASSERT_MSG(_a_, _desc_, ...)
#endif #endif
#endif

View file

@ -23,13 +23,13 @@ namespace Core {
static constexpr std::chrono::seconds announce_time_interval(15); static constexpr std::chrono::seconds announce_time_interval(15);
AnnounceMultiplayerSession::AnnounceMultiplayerSession() { AnnounceMultiplayerSession::AnnounceMultiplayerSession() {
#ifdef ENABLE_WEB_SERVICE //#ifdef ENABLE_WEB_SERVICE
backend = std::make_unique<WebService::RoomJson>(Settings::values.web_api_url.GetValue(), backend = std::make_unique<WebService::RoomJson>(Settings::values.web_api_url.GetValue(),
Settings::values.eden_username.GetValue(), Settings::values.eden_username.GetValue(),
Settings::values.eden_token.GetValue()); Settings::values.eden_token.GetValue());
#else //#else
backend = std::make_unique<AnnounceMultiplayerRoom::NullBackend>(); // backend = std::make_unique<AnnounceMultiplayerRoom::NullBackend>();
#endif //#endif
} }
WebService::WebResult AnnounceMultiplayerSession::Register() { WebService::WebResult AnnounceMultiplayerSession::Register() {
@ -156,11 +156,11 @@ bool AnnounceMultiplayerSession::IsRunning() const {
void AnnounceMultiplayerSession::UpdateCredentials() { void AnnounceMultiplayerSession::UpdateCredentials() {
ASSERT_MSG(!IsRunning(), "Credentials can only be updated when session is not running"); ASSERT_MSG(!IsRunning(), "Credentials can only be updated when session is not running");
#ifdef ENABLE_WEB_SERVICE //#ifdef ENABLE_WEB_SERVICE
backend = std::make_unique<WebService::RoomJson>(Settings::values.web_api_url.GetValue(), backend = std::make_unique<WebService::RoomJson>(Settings::values.web_api_url.GetValue(),
Settings::values.eden_username.GetValue(), Settings::values.eden_username.GetValue(),
Settings::values.eden_token.GetValue()); Settings::values.eden_token.GetValue());
#endif //#endif
} }
} // namespace Core } // namespace Core

View file

@ -70,7 +70,7 @@ Id GetMaxThreadId(EmitContext& ctx, Id thread_id, Id clamp, Id segmentation_mask
Id SelectValue(EmitContext& ctx, Id in_range, Id value, Id src_thread_id) { Id SelectValue(EmitContext& ctx, Id in_range, Id value, Id src_thread_id) {
return ctx.OpSelect( return ctx.OpSelect(
ctx.U32[1], in_range, ctx.U32[1], in_range,
ctx.OpGroupNonUniformShuffle(ctx.U32[1], SubgroupScope(ctx), value, src_thread_id), value); ctx.OpGroupNonUniformShuffleXor(ctx.U32[1], SubgroupScope(ctx), value, src_thread_id), value);
} }
Id AddPartitionBase(EmitContext& ctx, Id thread_id) { Id AddPartitionBase(EmitContext& ctx, Id thread_id) {

View file

@ -337,10 +337,6 @@ if (VulkanUtilityLibraries_ADDED)
target_include_directories(video_core PUBLIC ${VulkanUtilityLibraries_SOURCE_DIR}/include) target_include_directories(video_core PUBLIC ${VulkanUtilityLibraries_SOURCE_DIR}/include)
endif() endif()
if (VulkanHeaders_ADDED)
target_include_directories(video_core PUBLIC ${VulkanHeaders_SOURCE_DIR}/include)
endif()
target_link_libraries(video_core PRIVATE sirit Vulkan::Headers) target_link_libraries(video_core PRIVATE sirit Vulkan::Headers)
if (ENABLE_NSIGHT_AFTERMATH) if (ENABLE_NSIGHT_AFTERMATH)

View file

@ -518,7 +518,7 @@ void BlitImageHelper::BlitColor(const Framebuffer* dst_framebuffer, VkImageView
scheduler.RequestOutsideRenderPassOperationContext(); scheduler.RequestOutsideRenderPassOperationContext();
scheduler.Record([this, dst_framebuffer, src_image_view, src_image, src_sampler, dst_region, scheduler.Record([this, dst_framebuffer, src_image_view, src_image, src_sampler, dst_region,
src_region, src_size, pipeline, layout](vk::CommandBuffer cmdbuf) { src_region, src_size, pipeline, layout](vk::CommandBuffer cmdbuf) {
TransitionImageLayout(cmdbuf, src_image, VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL); TransitionImageLayout(cmdbuf, src_image, VK_IMAGE_LAYOUT_GENERAL);
BeginRenderPass(cmdbuf, dst_framebuffer); BeginRenderPass(cmdbuf, dst_framebuffer);
const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit(); const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit();
UpdateOneTextureDescriptorSet(device, descriptor_set, src_sampler, src_image_view); UpdateOneTextureDescriptorSet(device, descriptor_set, src_sampler, src_image_view);

View file

@ -502,7 +502,6 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) {
void GraphicsPipeline::ConfigureDraw(const RescalingPushConstant& rescaling, void GraphicsPipeline::ConfigureDraw(const RescalingPushConstant& rescaling,
const RenderAreaPushConstant& render_area) { const RenderAreaPushConstant& render_area) {
scheduler.RequestRenderpass(texture_cache.GetFramebuffer()); scheduler.RequestRenderpass(texture_cache.GetFramebuffer());
if (!is_built.load(std::memory_order::relaxed)) { if (!is_built.load(std::memory_order::relaxed)) {
// Wait for the pipeline to be built // Wait for the pipeline to be built
scheduler.Record([this](vk::CommandBuffer) { scheduler.Record([this](vk::CommandBuffer) {

View file

@ -13,7 +13,7 @@
#include <unordered_map> #include <unordered_map>
#include <utility> #include <utility>
#include <vector> #include <vector>
#include "video_core/renderer_vulkan/vk_texture_cache.h"
#include "common/bit_util.h" #include "common/bit_util.h"
#include "common/common_types.h" #include "common/common_types.h"
#include "video_core/engines/draw_manager.h" #include "video_core/engines/draw_manager.h"
@ -116,11 +116,11 @@ struct HostSyncValues {
class SamplesStreamer : public BaseStreamer { class SamplesStreamer : public BaseStreamer {
public: public:
explicit SamplesStreamer(size_t id_, QueryCacheRuntime& runtime_, explicit SamplesStreamer(size_t id_, QueryCacheRuntime& runtime_,
VideoCore::RasterizerInterface* rasterizer_, const Device& device_, VideoCore::RasterizerInterface* rasterizer_, TextureCache& texture_cache_, const Device& device_,
Scheduler& scheduler_, const MemoryAllocator& memory_allocator_, Scheduler& scheduler_, const MemoryAllocator& memory_allocator_,
ComputePassDescriptorQueue& compute_pass_descriptor_queue, ComputePassDescriptorQueue& compute_pass_descriptor_queue,
DescriptorPool& descriptor_pool) DescriptorPool& descriptor_pool)
: BaseStreamer(id_), runtime{runtime_}, rasterizer{rasterizer_}, device{device_}, : BaseStreamer(id_), texture_cache{texture_cache_}, runtime{runtime_}, rasterizer{rasterizer_}, device{device_},
scheduler{scheduler_}, memory_allocator{memory_allocator_} { scheduler{scheduler_}, memory_allocator{memory_allocator_} {
current_bank = nullptr; current_bank = nullptr;
current_query = nullptr; current_query = nullptr;
@ -153,16 +153,33 @@ public:
if (has_started) { if (has_started) {
return; return;
} }
ReserveHostQuery(); ReserveHostQuery();
// Ensure outside render pass
scheduler.RequestOutsideRenderPassOperationContext();
// Reset query pool outside render pass
scheduler.Record([query_pool = current_query_pool, scheduler.Record([query_pool = current_query_pool,
query_index = current_bank_slot](vk::CommandBuffer cmdbuf) { query_index = current_bank_slot](vk::CommandBuffer cmdbuf) {
cmdbuf.ResetQueryPool(query_pool, static_cast<u32>(query_index), 1);
});
// Manually restart the render pass (required for vkCmdClearAttachments, etc.)
scheduler.RequestRenderpass(texture_cache.GetFramebuffer());
// Begin query inside the newly started render pass
scheduler.Record([query_pool = current_query_pool,
query_index = current_bank_slot](vk::CommandBuffer cmdbuf) {
const bool use_precise = Settings::IsGPULevelHigh(); const bool use_precise = Settings::IsGPULevelHigh();
cmdbuf.BeginQuery(query_pool, static_cast<u32>(query_index), cmdbuf.BeginQuery(query_pool, static_cast<u32>(query_index),
use_precise ? VK_QUERY_CONTROL_PRECISE_BIT : 0); use_precise ? VK_QUERY_CONTROL_PRECISE_BIT : 0);
}); });
has_started = true; has_started = true;
} }
void PauseCounter() override { void PauseCounter() override {
if (!has_started) { if (!has_started) {
return; return;
@ -404,7 +421,7 @@ private:
size_slots -= amount; size_slots -= amount;
} }
} }
TextureCache& texture_cache;
template <bool is_ordered, typename Func> template <bool is_ordered, typename Func>
void ApplyBanksWideOp(std::vector<size_t>& queries, Func&& func) { void ApplyBanksWideOp(std::vector<size_t>& queries, Func&& func) {
std::conditional_t<is_ordered, std::map<size_t, std::pair<size_t, size_t>>, std::conditional_t<is_ordered, std::map<size_t, std::pair<size_t, size_t>>,
@ -1163,13 +1180,13 @@ struct QueryCacheRuntimeImpl {
const MemoryAllocator& memory_allocator_, Scheduler& scheduler_, const MemoryAllocator& memory_allocator_, Scheduler& scheduler_,
StagingBufferPool& staging_pool_, StagingBufferPool& staging_pool_,
ComputePassDescriptorQueue& compute_pass_descriptor_queue, ComputePassDescriptorQueue& compute_pass_descriptor_queue,
DescriptorPool& descriptor_pool) DescriptorPool& descriptor_pool, TextureCache& texture_cache_)
: rasterizer{rasterizer_}, device_memory{device_memory_}, buffer_cache{buffer_cache_}, : rasterizer{rasterizer_}, device_memory{device_memory_}, buffer_cache{buffer_cache_},
device{device_}, memory_allocator{memory_allocator_}, scheduler{scheduler_}, device{device_}, memory_allocator{memory_allocator_}, scheduler{scheduler_},
staging_pool{staging_pool_}, guest_streamer(0, runtime), staging_pool{staging_pool_}, guest_streamer(0, runtime),
sample_streamer(static_cast<size_t>(QueryType::ZPassPixelCount64), runtime, rasterizer, sample_streamer(static_cast<size_t>(QueryType::ZPassPixelCount64), runtime, rasterizer,
device, scheduler, memory_allocator, compute_pass_descriptor_queue, texture_cache_, device, scheduler, memory_allocator,
descriptor_pool), compute_pass_descriptor_queue, descriptor_pool),
tfb_streamer(static_cast<size_t>(QueryType::StreamingByteCount), runtime, device, tfb_streamer(static_cast<size_t>(QueryType::StreamingByteCount), runtime, device,
scheduler, memory_allocator, staging_pool), scheduler, memory_allocator, staging_pool),
primitives_succeeded_streamer( primitives_succeeded_streamer(
@ -1240,10 +1257,10 @@ QueryCacheRuntime::QueryCacheRuntime(VideoCore::RasterizerInterface* rasterizer,
const MemoryAllocator& memory_allocator_, const MemoryAllocator& memory_allocator_,
Scheduler& scheduler_, StagingBufferPool& staging_pool_, Scheduler& scheduler_, StagingBufferPool& staging_pool_,
ComputePassDescriptorQueue& compute_pass_descriptor_queue, ComputePassDescriptorQueue& compute_pass_descriptor_queue,
DescriptorPool& descriptor_pool) { DescriptorPool& descriptor_pool, TextureCache& texture_cache_) {
impl = std::make_unique<QueryCacheRuntimeImpl>( impl = std::make_unique<QueryCacheRuntimeImpl>(
*this, rasterizer, device_memory_, buffer_cache_, device_, memory_allocator_, scheduler_, *this, rasterizer, device_memory_, buffer_cache_, device_, memory_allocator_, scheduler_,
staging_pool_, compute_pass_descriptor_queue, descriptor_pool); staging_pool_, compute_pass_descriptor_queue, descriptor_pool, texture_cache_);
} }
void QueryCacheRuntime::Bind3DEngine(Maxwell3D* maxwell3d) { void QueryCacheRuntime::Bind3DEngine(Maxwell3D* maxwell3d) {

View file

@ -7,7 +7,7 @@
#include "video_core/query_cache/query_cache_base.h" #include "video_core/query_cache/query_cache_base.h"
#include "video_core/renderer_vulkan/vk_buffer_cache.h" #include "video_core/renderer_vulkan/vk_buffer_cache.h"
#include "video_core/renderer_vulkan/vk_texture_cache.h"
namespace VideoCore { namespace VideoCore {
class RasterizerInterface; class RasterizerInterface;
} }
@ -17,7 +17,6 @@ class StreamerInterface;
} }
namespace Vulkan { namespace Vulkan {
class Device; class Device;
class Scheduler; class Scheduler;
class StagingBufferPool; class StagingBufferPool;
@ -32,7 +31,7 @@ public:
const MemoryAllocator& memory_allocator_, Scheduler& scheduler_, const MemoryAllocator& memory_allocator_, Scheduler& scheduler_,
StagingBufferPool& staging_pool_, StagingBufferPool& staging_pool_,
ComputePassDescriptorQueue& compute_pass_descriptor_queue, ComputePassDescriptorQueue& compute_pass_descriptor_queue,
DescriptorPool& descriptor_pool); DescriptorPool& descriptor_pool, TextureCache& texture_cache_);
~QueryCacheRuntime(); ~QueryCacheRuntime();
template <typename SyncValuesType> template <typename SyncValuesType>

View file

@ -189,7 +189,7 @@ RasterizerVulkan::RasterizerVulkan(Core::Frontend::EmuWindow& emu_window_, Tegra
guest_descriptor_queue, compute_pass_descriptor_queue, descriptor_pool), guest_descriptor_queue, compute_pass_descriptor_queue, descriptor_pool),
buffer_cache(device_memory, buffer_cache_runtime), buffer_cache(device_memory, buffer_cache_runtime),
query_cache_runtime(this, device_memory, buffer_cache, device, memory_allocator, scheduler, query_cache_runtime(this, device_memory, buffer_cache, device, memory_allocator, scheduler,
staging_pool, compute_pass_descriptor_queue, descriptor_pool), staging_pool, compute_pass_descriptor_queue, descriptor_pool, texture_cache),
query_cache(gpu, *this, device_memory, query_cache_runtime), query_cache(gpu, *this, device_memory, query_cache_runtime),
pipeline_cache(device_memory, device, scheduler, descriptor_pool, guest_descriptor_queue, pipeline_cache(device_memory, device, scheduler, descriptor_pool, guest_descriptor_queue,
render_pass_cache, buffer_cache, texture_cache, gpu.ShaderNotify()), render_pass_cache, buffer_cache, texture_cache, gpu.ShaderNotify()),

View file

@ -136,7 +136,6 @@ public:
void BindChannel(Tegra::Control::ChannelState& channel) override; void BindChannel(Tegra::Control::ChannelState& channel) override;
void ReleaseChannel(s32 channel_id) override; void ReleaseChannel(s32 channel_id) override;
std::optional<FramebufferTextureInfo> AccelerateDisplay(const Tegra::FramebufferConfig& config, std::optional<FramebufferTextureInfo> AccelerateDisplay(const Tegra::FramebufferConfig& config,
VAddr framebuffer_addr, VAddr framebuffer_addr,
u32 pixel_stride); u32 pixel_stride);
@ -147,7 +146,6 @@ private:
0x0100E95004038000ULL, // XC2 0x0100E95004038000ULL, // XC2
0x0100A6301214E000ULL, // FE:Engage 0x0100A6301214E000ULL, // FE:Engage
}; };
static constexpr size_t MAX_TEXTURES = 192; static constexpr size_t MAX_TEXTURES = 192;
static constexpr size_t MAX_IMAGES = 48; static constexpr size_t MAX_IMAGES = 48;
static constexpr size_t MAX_IMAGE_VIEWS = MAX_TEXTURES + MAX_IMAGES; static constexpr size_t MAX_IMAGE_VIEWS = MAX_TEXTURES + MAX_IMAGES;

View file

@ -270,46 +270,73 @@ void Scheduler::EndPendingOperations() {
EndRenderPass(); EndRenderPass();
} }
void Scheduler::EndRenderPass() { void Scheduler::EndRenderPass() {
if (!state.renderpass) { if (!state.renderpass) {
return; return;
}
query_cache->CounterEnable(VideoCommon::QueryType::ZPassPixelCount64, false);
query_cache->NotifySegment(false);
Record([num_images = num_renderpass_images, images = renderpass_images,
ranges = renderpass_image_ranges](vk::CommandBuffer cmdbuf) {
std::array<VkImageMemoryBarrier, 9> barriers;
for (size_t i = 0; i < num_images; ++i) {
barriers[i] = VkImageMemoryBarrier{
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
.pNext = nullptr,
.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
.oldLayout = VK_IMAGE_LAYOUT_GENERAL,
.newLayout = VK_IMAGE_LAYOUT_GENERAL,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = images[i],
.subresourceRange = ranges[i],
};
} }
cmdbuf.EndRenderPass();
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | query_cache->CounterEnable(VideoCommon::QueryType::ZPassPixelCount64, false);
VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | query_cache->NotifySegment(false);
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, nullptr, Record([num_images = num_renderpass_images, images = renderpass_images,
vk::Span(barriers.data(), num_images)); ranges = renderpass_image_ranges](vk::CommandBuffer cmdbuf) {
}); std::array<VkImageMemoryBarrier, 9> barriers;
state.renderpass = nullptr; VkPipelineStageFlags src_stages = 0;
num_renderpass_images = 0;
} for (size_t i = 0; i < num_images; ++i) {
const VkImageSubresourceRange& range = ranges[i];
const bool is_color = range.aspectMask & VK_IMAGE_ASPECT_COLOR_BIT;
const bool is_depth_stencil = range.aspectMask &
(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
VkAccessFlags src_access = 0;
VkPipelineStageFlags this_stage = 0;
if (is_color) {
src_access |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
this_stage |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
}
if (is_depth_stencil) {
src_access |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
this_stage |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
}
src_stages |= this_stage;
barriers[i] = VkImageMemoryBarrier{
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
.pNext = nullptr,
.srcAccessMask = src_access,
.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
.oldLayout = VK_IMAGE_LAYOUT_GENERAL,
.newLayout = VK_IMAGE_LAYOUT_GENERAL,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = images[i],
.subresourceRange = range,
};
}
cmdbuf.EndRenderPass();
for (size_t i = 0; i < num_images; ++i) {
cmdbuf.PipelineBarrier(
src_stages, // OR compute per-image if needed
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
0,
barriers[i]);
}
});
state.renderpass = nullptr;
num_renderpass_images = 0;
}
void Scheduler::AcquireNewChunk() { void Scheduler::AcquireNewChunk() {
std::scoped_lock rl{reserve_mutex}; std::scoped_lock rl{reserve_mutex};

View file

@ -507,58 +507,84 @@ TransformBufferCopies(std::span<const VideoCommon::BufferCopy> copies, size_t bu
return value; return value;
} }
} }
struct RangedBarrierRange {
u32 min_mip = std::numeric_limits<u32>::max();
u32 max_mip = std::numeric_limits<u32>::min();
u32 min_layer = std::numeric_limits<u32>::max();
u32 max_layer = std::numeric_limits<u32>::min();
void AddLayers(const VkImageSubresourceLayers& layers) {
min_mip = std::min(min_mip, layers.mipLevel);
max_mip = std::max(max_mip, layers.mipLevel + 1);
min_layer = std::min(min_layer, layers.baseArrayLayer);
max_layer = std::max(max_layer, layers.baseArrayLayer + layers.layerCount);
}
VkImageSubresourceRange SubresourceRange(VkImageAspectFlags aspect_mask) const noexcept {
return VkImageSubresourceRange{
.aspectMask = aspect_mask,
.baseMipLevel = min_mip,
.levelCount = max_mip - min_mip,
.baseArrayLayer = min_layer,
.layerCount = max_layer - min_layer,
};
}
};
void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image, void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image,
VkImageAspectFlags aspect_mask, bool is_initialized, VkImageAspectFlags aspect_mask, bool is_initialized,
std::span<const VkBufferImageCopy> copies) { std::span<const VkBufferImageCopy> copies) {
static constexpr VkAccessFlags WRITE_ACCESS_FLAGS = static constexpr VkAccessFlags WRITE_ACCESS_FLAGS =
VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
static constexpr VkAccessFlags READ_ACCESS_FLAGS = VK_ACCESS_SHADER_READ_BIT | static constexpr VkAccessFlags READ_ACCESS_FLAGS = VK_ACCESS_SHADER_READ_BIT |
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
// Compute exact mip/layer range being written to
RangedBarrierRange range;
for (const auto& region : copies) {
range.AddLayers(region.imageSubresource);
}
const VkImageSubresourceRange subresource_range = range.SubresourceRange(aspect_mask);
const VkImageMemoryBarrier read_barrier{ const VkImageMemoryBarrier read_barrier{
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
.pNext = nullptr, .pNext = nullptr,
.srcAccessMask = WRITE_ACCESS_FLAGS, .srcAccessMask = WRITE_ACCESS_FLAGS,
.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
.oldLayout = is_initialized ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_UNDEFINED, .oldLayout = is_initialized ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_UNDEFINED,
.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, .newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = image, .image = image,
.subresourceRange{ .subresourceRange = subresource_range,
.aspectMask = aspect_mask,
.baseMipLevel = 0,
.levelCount = VK_REMAINING_MIP_LEVELS,
.baseArrayLayer = 0,
.layerCount = VK_REMAINING_ARRAY_LAYERS,
},
}; };
const VkImageMemoryBarrier write_barrier{ const VkImageMemoryBarrier write_barrier{
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
.pNext = nullptr, .pNext = nullptr,
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
.dstAccessMask = WRITE_ACCESS_FLAGS | READ_ACCESS_FLAGS, .dstAccessMask = WRITE_ACCESS_FLAGS | READ_ACCESS_FLAGS,
.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
.newLayout = VK_IMAGE_LAYOUT_GENERAL, .newLayout = VK_IMAGE_LAYOUT_GENERAL,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = image, .image = image,
.subresourceRange{ .subresourceRange = subresource_range,
.aspectMask = aspect_mask,
.baseMipLevel = 0,
.levelCount = VK_REMAINING_MIP_LEVELS,
.baseArrayLayer = 0,
.layerCount = VK_REMAINING_ARRAY_LAYERS,
},
}; };
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0,
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0,
read_barrier); read_barrier);
cmdbuf.CopyBufferToImage(src_buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, copies); cmdbuf.CopyBufferToImage(src_buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, copies);
// TODO: Move this to another API // TODO: Move this to another API
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, cmdbuf.PipelineBarrier(
write_barrier); VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
0, nullptr, nullptr, write_barrier);
} }
[[nodiscard]] VkImageBlit MakeImageBlit(const Region2D& dst_region, const Region2D& src_region, [[nodiscard]] VkImageBlit MakeImageBlit(const Region2D& dst_region, const Region2D& src_region,
@ -651,29 +677,7 @@ void TryTransformSwizzleIfNeeded(PixelFormat format, std::array<SwizzleSource, 4
} }
} }
struct RangedBarrierRange {
u32 min_mip = std::numeric_limits<u32>::max();
u32 max_mip = std::numeric_limits<u32>::min();
u32 min_layer = std::numeric_limits<u32>::max();
u32 max_layer = std::numeric_limits<u32>::min();
void AddLayers(const VkImageSubresourceLayers& layers) {
min_mip = std::min(min_mip, layers.mipLevel);
max_mip = std::max(max_mip, layers.mipLevel + 1);
min_layer = std::min(min_layer, layers.baseArrayLayer);
max_layer = std::max(max_layer, layers.baseArrayLayer + layers.layerCount);
}
VkImageSubresourceRange SubresourceRange(VkImageAspectFlags aspect_mask) const noexcept {
return VkImageSubresourceRange{
.aspectMask = aspect_mask,
.baseMipLevel = min_mip,
.levelCount = max_mip - min_mip,
.baseArrayLayer = min_layer,
.layerCount = max_layer - min_layer,
};
}
};
[[nodiscard]] VkFormat Format(Shader::ImageFormat format) { [[nodiscard]] VkFormat Format(Shader::ImageFormat format) {
switch (format) { switch (format) {
@ -1457,12 +1461,18 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src,
.subresourceRange = dst_range.SubresourceRange(aspect_mask), .subresourceRange = dst_range.SubresourceRange(aspect_mask),
}, },
}; };
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, cmdbuf.PipelineBarrier(
0, {}, {}, pre_barriers); VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT,
0, nullptr, nullptr, pre_barriers);
cmdbuf.CopyImage(src_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_image, cmdbuf.CopyImage(src_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_image,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, vk_copies); VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, vk_copies);
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, cmdbuf.PipelineBarrier(
0, {}, {}, post_barriers); VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT,
0, nullptr, nullptr, post_barriers);
}); });
} }
@ -1546,7 +1556,7 @@ void Image::UploadMemory(VkBuffer buffer, VkDeviceSize offset,
} }
// Handle MSAA upload if necessary // Handle MSAA upload if necessary
/* WARNING, TODO: This code uses some hacks, besides being fundamentally ugly /* WARNING, TODO: This code uses some hacks, besides being fundamentally ugly
since tropic didn't want to touch it for a long time, so it needs a rewrite from someone better than me at vulkan.*/ since tropic didn't want to touch it for a long time, so it needs a rewrite from someone better than me at vulkan.*/
if (info.num_samples > 1 && runtime->CanUploadMSAA()) { if (info.num_samples > 1 && runtime->CanUploadMSAA()) {
// Only use MSAA copy pass for color formats // Only use MSAA copy pass for color formats
@ -2352,7 +2362,7 @@ void TextureCacheRuntime::TransitionImageLayout(Image& image) {
}; };
scheduler.RequestOutsideRenderPassOperationContext(); scheduler.RequestOutsideRenderPassOperationContext();
scheduler.Record([barrier](vk::CommandBuffer cmdbuf) { scheduler.Record([barrier](vk::CommandBuffer cmdbuf) {
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, barrier); VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, barrier);
}); });
} }

View file

@ -974,6 +974,7 @@ bool Device::GetSuitability(bool requires_swapchain) {
// Configure properties. // Configure properties.
VkPhysicalDeviceVulkan12Features features_1_2{}; VkPhysicalDeviceVulkan12Features features_1_2{};
VkPhysicalDeviceVulkan13Features features_1_3{}; VkPhysicalDeviceVulkan13Features features_1_3{};
VkPhysicalDeviceVulkan14Features features_1_4{};
// Configure properties. // Configure properties.
properties.properties = physical.GetProperties(); properties.properties = physical.GetProperties();
@ -1052,10 +1053,13 @@ bool Device::GetSuitability(bool requires_swapchain) {
if (instance_version >= VK_API_VERSION_1_2) { if (instance_version >= VK_API_VERSION_1_2) {
features_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES; features_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
features_1_3.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES; features_1_3.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
features_1_4.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_FEATURES;
features_1_2.pNext = &features_1_3; features_1_2.pNext = &features_1_3;
features_1_3.pNext = &features_1_4;
*next = &features_1_2; *next = &features_1_2;
// next = &features_1_4.pNext;
} }
// Test all features we know about. If the feature is not available in core at our // Test all features we know about. If the feature is not available in core at our

View file

@ -120,6 +120,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept {
X(vkCmdEndConditionalRenderingEXT); X(vkCmdEndConditionalRenderingEXT);
X(vkCmdEndQuery); X(vkCmdEndQuery);
X(vkCmdEndRenderPass); X(vkCmdEndRenderPass);
X(vkCmdResetQueryPool);
X(vkCmdEndTransformFeedbackEXT); X(vkCmdEndTransformFeedbackEXT);
X(vkCmdEndDebugUtilsLabelEXT); X(vkCmdEndDebugUtilsLabelEXT);
X(vkCmdFillBuffer); X(vkCmdFillBuffer);

View file

@ -219,6 +219,7 @@ struct DeviceDispatch : InstanceDispatch {
PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT{}; PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT{};
PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT{}; PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT{};
PFN_vkCmdEndQuery vkCmdEndQuery{}; PFN_vkCmdEndQuery vkCmdEndQuery{};
PFN_vkCmdResetQueryPool vkCmdResetQueryPool{};
PFN_vkCmdEndRenderPass vkCmdEndRenderPass{}; PFN_vkCmdEndRenderPass vkCmdEndRenderPass{};
PFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT{}; PFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT{};
PFN_vkCmdFillBuffer vkCmdFillBuffer{}; PFN_vkCmdFillBuffer vkCmdFillBuffer{};
@ -1137,7 +1138,9 @@ public:
VkCommandBuffer operator*() const noexcept { VkCommandBuffer operator*() const noexcept {
return handle; return handle;
} }
void ResetQueryPool(VkQueryPool query_pool, uint32_t first, uint32_t count) const noexcept {
dld->vkCmdResetQueryPool(handle, query_pool, first, count);
}
void Begin(const VkCommandBufferBeginInfo& begin_info) const { void Begin(const VkCommandBufferBeginInfo& begin_info) const {
Check(dld->vkBeginCommandBuffer(handle, &begin_info)); Check(dld->vkBeginCommandBuffer(handle, &begin_info));
} }

View file

@ -238,10 +238,6 @@ add_executable(yuzu
migration_dialog.h migration_dialog.cpp migration_dialog.h migration_dialog.cpp
migration_worker.h migration_worker.h
migration_worker.cpp migration_worker.cpp
deps_dialog.cpp
deps_dialog.h
deps_dialog.ui
) )
set_target_properties(yuzu PROPERTIES OUTPUT_NAME "eden") set_target_properties(yuzu PROPERTIES OUTPUT_NAME "eden")

View file

@ -11,7 +11,7 @@
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>About Eden</string> <string>About eden</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item> <item>

View file

@ -1,121 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#include "yuzu/deps_dialog.h"
#include <QAbstractTextDocumentLayout>
#include <QDesktopServices>
#include <QIcon>
#include <QPainter>
#include <QTableWidget>
#include <QTextEdit>
#include "dep_hashes.h"
#include "ui_deps_dialog.h"
#include <fmt/ranges.h>
DepsDialog::DepsDialog(QWidget* parent)
: QDialog(parent)
, ui{std::make_unique<Ui::DepsDialog>()}
{
ui->setupUi(this);
constexpr size_t rows = Common::dep_hashes.size();
ui->tableDeps->setRowCount(rows);
QStringList labels;
labels << tr("Dependency") << tr("Version");
ui->tableDeps->setHorizontalHeaderLabels(labels);
ui->tableDeps->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeMode::Stretch);
ui->tableDeps->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeMode::Fixed);
ui->tableDeps->horizontalHeader()->setMinimumSectionSize(200);
for (size_t i = 0; i < rows; ++i) {
const std::string name = Common::dep_names.at(i);
const std::string sha = Common::dep_hashes.at(i);
const std::string url = Common::dep_urls.at(i);
std::string dependency = fmt::format("<a href=\"{}\">{}</a>", url, name);
QTableWidgetItem *nameItem = new QTableWidgetItem(QString::fromStdString(dependency));
QTableWidgetItem *shaItem = new QTableWidgetItem(QString::fromStdString(sha));
ui->tableDeps->setItem(i, 0, nameItem);
ui->tableDeps->setItem(i, 1, shaItem);
}
ui->tableDeps->setItemDelegateForColumn(0, new LinkItemDelegate(this));
}
DepsDialog::~DepsDialog() = default;
LinkItemDelegate::LinkItemDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{}
void LinkItemDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
auto options = option;
initStyleOption(&options, index);
QTextDocument doc;
QString html = index.data(Qt::DisplayRole).toString();
doc.setHtml(html);
options.text.clear();
painter->save();
painter->translate(options.rect.topLeft());
doc.drawContents(painter, QRectF(0, 0, options.rect.width(), options.rect.height()));
painter->restore();
}
QSize LinkItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItem options = option;
initStyleOption(&options, index);
QTextDocument doc;
doc.setHtml(options.text);
doc.setTextWidth(options.rect.width());
return QSize(doc.idealWidth(), doc.size().height());
}
bool LinkItemDelegate::editorEvent(QEvent *event,
QAbstractItemModel *model,
const QStyleOptionViewItem &option,
const QModelIndex &index)
{
if (event->type() == QEvent::MouseButtonRelease) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
if (mouseEvent->button() == Qt::LeftButton) {
QString html = index.data(Qt::DisplayRole).toString();
QTextDocument doc;
doc.setHtml(html);
doc.setTextWidth(option.rect.width());
// this is kinda silly but it werks
QAbstractTextDocumentLayout *layout = doc.documentLayout();
QPoint pos = mouseEvent->pos() - option.rect.topLeft();
int charPos = layout->hitTest(pos, Qt::ExactHit);
if (charPos >= 0) {
QTextCursor cursor(&doc);
cursor.setPosition(charPos);
QTextCharFormat format = cursor.charFormat();
if (format.isAnchor()) {
QString href = format.anchorHref();
if (!href.isEmpty()) {
QDesktopServices::openUrl(QUrl(href));
return true;
}
}
}
}
}
return QStyledItemDelegate::editorEvent(event, model, option, index);
}

View file

@ -1,41 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QDialog>
#include <QStyledItemDelegate>
#include <QTableView>
#include <memory>
namespace Ui { class DepsDialog; }
class DepsDialog : public QDialog
{
Q_OBJECT
public:
explicit DepsDialog(QWidget *parent);
~DepsDialog() override;
private:
std::unique_ptr<Ui::DepsDialog> ui;
};
class LinkItemDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
explicit LinkItemDelegate(QObject *parent = 0);
protected:
void paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const override;
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
bool editorEvent(QEvent *event,
QAbstractItemModel *model,
const QStyleOptionViewItem &option,
const QModelIndex &index) override;
};

View file

@ -1,166 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DepsDialog</class>
<widget class="QDialog" name="DepsDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>701</width>
<height>500</height>
</rect>
</property>
<property name="windowTitle">
<string>Eden Dependencies</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="labelLogo">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>200</width>
<height>200</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="../../dist/qt_themes/default/default.qrc">:/icons/default/256x256/eden.png</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="labelEden">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:28pt;&quot;&gt;Eden Dependencies&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelInfo">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The projects that make Eden possible&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QTableWidget" name="tableDeps">
<property name="editTriggers">
<set>QAbstractItemView::EditTrigger::NoEditTriggers</set>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SelectionMode::NoSelection</enum>
</property>
<property name="columnCount">
<number>2</number>
</property>
<attribute name="horizontalHeaderShowSortIndicator" stdset="0">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
<column/>
<column/>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="../../dist/qt_themes/default/default.qrc"/>
</resources>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>DepsDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>20</x>
<y>20</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>DepsDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>20</x>
<y>20</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View file

@ -2,7 +2,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
# cpm # cpm
include(CPMUtil) include(CPM)
# Disable tests/tools in all externals supporting the standard option name # Disable tests/tools in all externals supporting the standard option name
set(BUILD_TESTING OFF) set(BUILD_TESTING OFF)
@ -14,11 +14,11 @@ set(BUILD_SHARED_LIBS OFF)
set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON) set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON)
# QuaZip # QuaZip
AddPackage( set(CPM_USE_LOCAL_PACKAGES ON)
CPMAddPackage(
NAME QuaZip-Qt6 NAME QuaZip-Qt6
VERSION 1.3 VERSION 1.3
REPO "crueter/quazip-qt6" URL "https://github.com/crueter/quazip-qt6/archive/f838774d63.zip"
SHA f838774d63 CUSTOM_CACHE_KEY "f838"
HASH 9f629a438699801244a106c8df6d5f8f8d19e80df54f530a89403a10c8c4e37a6e95606bbdd307f23636961e8ce34eb37a2186d589a1f227ac9c8e2c678e326e
SYSTEM_PACKAGE ON
) )

View file

@ -96,7 +96,6 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#include <QStandardPaths> #include <QStandardPaths>
#include <QStatusBar> #include <QStatusBar>
#include <QString> #include <QString>
#include <QStyleHints>
#include <QSysInfo> #include <QSysInfo>
#include <QUrl> #include <QUrl>
#include <QtConcurrent/QtConcurrent> #include <QtConcurrent/QtConcurrent>
@ -160,7 +159,6 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#include "yuzu/debugger/console.h" #include "yuzu/debugger/console.h"
#include "yuzu/debugger/controller.h" #include "yuzu/debugger/controller.h"
#include "yuzu/debugger/wait_tree.h" #include "yuzu/debugger/wait_tree.h"
#include "yuzu/deps_dialog.h"
#include "yuzu/discord.h" #include "yuzu/discord.h"
#include "yuzu/game_list.h" #include "yuzu/game_list.h"
#include "yuzu/game_list_p.h" #include "yuzu/game_list_p.h"
@ -174,91 +172,6 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#include "yuzu/util/clickable_label.h" #include "yuzu/util/clickable_label.h"
#include "yuzu/vk_device_info.h" #include "yuzu/vk_device_info.h"
#ifdef _WIN32
#include <QPlatformSurfaceEvent>
#include <dwmapi.h>
#include <windows.h>
#pragma comment(lib, "Dwmapi.lib")
static inline void ApplyWindowsTitleBarDarkMode(HWND hwnd, bool enabled) {
if (!hwnd)
return;
BOOL val = enabled ? TRUE : FALSE;
// 20 = Win11/21H2+
if (SUCCEEDED(DwmSetWindowAttribute(hwnd, 20, &val, sizeof(val))))
return;
// 19 = pre-21H2
DwmSetWindowAttribute(hwnd, 19, &val, sizeof(val));
}
static inline void ApplyDarkToTopLevel(QWidget* w, bool on) {
if (!w || !w->isWindow())
return;
ApplyWindowsTitleBarDarkMode(reinterpret_cast<HWND>(w->winId()), on);
}
namespace {
struct TitlebarFilter final : QObject {
bool dark;
explicit TitlebarFilter(bool is_dark) : QObject(qApp), dark(is_dark) {}
void setDark(bool is_dark) {
dark = is_dark;
}
void onFocusChanged(QWidget*, QWidget* now) {
if (now)
ApplyDarkToTopLevel(now->window(), dark);
}
bool eventFilter(QObject* obj, QEvent* ev) override {
if (auto* w = qobject_cast<QWidget*>(obj)) {
switch (ev->type()) {
case QEvent::WinIdChange:
case QEvent::Show:
case QEvent::ShowToParent:
case QEvent::Polish:
case QEvent::WindowStateChange:
case QEvent::ZOrderChange:
ApplyDarkToTopLevel(w, dark);
break;
default:
break;
}
}
return QObject::eventFilter(obj, ev);
}
};
static TitlebarFilter* g_filter = nullptr;
static QMetaObject::Connection g_focusConn;
} // namespace
static void ApplyGlobalDarkTitlebar(bool is_dark) {
if (!g_filter) {
g_filter = new TitlebarFilter(is_dark);
qApp->installEventFilter(g_filter);
g_focusConn = QObject::connect(qApp, &QApplication::focusChanged, g_filter,
&TitlebarFilter::onFocusChanged);
} else {
g_filter->setDark(is_dark);
}
for (QWidget* w : QApplication::topLevelWidgets())
ApplyDarkToTopLevel(w, is_dark);
}
static void RemoveTitlebarFilter() {
if (!g_filter)
return;
qApp->removeEventFilter(g_filter);
QObject::disconnect(g_focusConn);
g_filter->deleteLater();
g_filter = nullptr;
}
#endif
#ifdef YUZU_CRASH_DUMPS #ifdef YUZU_CRASH_DUMPS
#include "yuzu/breakpad.h" #include "yuzu/breakpad.h"
#endif #endif
@ -386,16 +299,16 @@ static void OverrideWindowsFont() {
} }
#endif #endif
inline static bool isDarkMode() { bool GMainWindow::CheckDarkMode() {
#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) #ifdef __unix__
const auto scheme = QGuiApplication::styleHints()->colorScheme(); const QPalette test_palette(qApp->palette());
return scheme == Qt::ColorScheme::Dark; const QColor text_color = test_palette.color(QPalette::Active, QPalette::Text);
const QColor window_color = test_palette.color(QPalette::Active, QPalette::Window);
return (text_color.value() > window_color.value());
#else #else
const QPalette defaultPalette; // TODO: Windows
const auto text = defaultPalette.color(QPalette::WindowText); return false;
const auto window = defaultPalette.color(QPalette::Window); #endif // __unix__
return text.lightness() > window.lightness();
#endif // QT_VERSION
} }
GMainWindow::GMainWindow(bool has_broken_vulkan) GMainWindow::GMainWindow(bool has_broken_vulkan)
@ -445,6 +358,7 @@ GMainWindow::GMainWindow(bool has_broken_vulkan)
statusBar()->hide(); statusBar()->hide();
// Check dark mode before a theme is loaded // Check dark mode before a theme is loaded
os_dark_mode = CheckDarkMode();
startup_icon_theme = QIcon::themeName(); startup_icon_theme = QIcon::themeName();
// fallback can only be set once, colorful theme icons are okay on both light/dark // fallback can only be set once, colorful theme icons are okay on both light/dark
QIcon::setFallbackThemeName(QStringLiteral("colorful")); QIcon::setFallbackThemeName(QStringLiteral("colorful"));
@ -1770,7 +1684,6 @@ void GMainWindow::ConnectMenuEvents() {
connect_menu(ui->action_Firmware_From_ZIP, &GMainWindow::OnInstallFirmwareFromZIP); connect_menu(ui->action_Firmware_From_ZIP, &GMainWindow::OnInstallFirmwareFromZIP);
connect_menu(ui->action_Install_Keys, &GMainWindow::OnInstallDecryptionKeys); connect_menu(ui->action_Install_Keys, &GMainWindow::OnInstallDecryptionKeys);
connect_menu(ui->action_About, &GMainWindow::OnAbout); connect_menu(ui->action_About, &GMainWindow::OnAbout);
connect_menu(ui->action_Eden_Dependencies, &GMainWindow::OnEdenDependencies);
} }
void GMainWindow::UpdateMenuState() { void GMainWindow::UpdateMenuState() {
@ -3744,7 +3657,7 @@ void GMainWindow::OnOpenFAQ() {
} }
void GMainWindow::OnOpenDiscord() { void GMainWindow::OnOpenDiscord() {
OpenURL(QUrl(QStringLiteral("https://discord.gg/HstXbPch7X"))); OpenURL(QUrl(QStringLiteral("https://discord.gg/kXAmGCXBGD")));
} }
void GMainWindow::OnOpenRevolt() { void GMainWindow::OnOpenRevolt() {
@ -4584,11 +4497,6 @@ void GMainWindow::OnAbout() {
aboutDialog.exec(); aboutDialog.exec();
} }
void GMainWindow::OnEdenDependencies() {
DepsDialog depsDialog(this);
depsDialog.exec();
}
void GMainWindow::OnToggleFilterBar() { void GMainWindow::OnToggleFilterBar() {
game_list->SetFilterVisible(ui->action_Show_Filter_Bar->isChecked()); game_list->SetFilterVisible(ui->action_Show_Filter_Bar->isChecked());
if (ui->action_Show_Filter_Bar->isChecked()) { if (ui->action_Show_Filter_Bar->isChecked()) {
@ -5475,11 +5383,15 @@ void GMainWindow::UpdateUITheme() {
current_theme = default_theme; current_theme = default_theme;
} }
#ifdef _WIN32
QIcon::setThemeName(current_theme);
AdjustLinkColor();
#else
if (current_theme == QStringLiteral("default") || current_theme == QStringLiteral("colorful")) { if (current_theme == QStringLiteral("default") || current_theme == QStringLiteral("colorful")) {
QIcon::setThemeName(current_theme == QStringLiteral("colorful") ? current_theme QIcon::setThemeName(current_theme == QStringLiteral("colorful") ? current_theme
: startup_icon_theme); : startup_icon_theme);
QIcon::setThemeSearchPaths(QStringList(default_theme_paths)); QIcon::setThemeSearchPaths(QStringList(default_theme_paths));
if (isDarkMode()) { if (CheckDarkMode()) {
current_theme = QStringLiteral("default_dark"); current_theme = QStringLiteral("default_dark");
} }
} else { } else {
@ -5487,7 +5399,7 @@ void GMainWindow::UpdateUITheme() {
QIcon::setThemeSearchPaths(QStringList(QStringLiteral(":/icons"))); QIcon::setThemeSearchPaths(QStringList(QStringLiteral(":/icons")));
AdjustLinkColor(); AdjustLinkColor();
} }
#endif
if (current_theme != default_theme) { if (current_theme != default_theme) {
QString theme_uri{QStringLiteral(":%1/style.qss").arg(current_theme)}; QString theme_uri{QStringLiteral(":%1/style.qss").arg(current_theme)};
QFile f(theme_uri); QFile f(theme_uri);
@ -5510,11 +5422,6 @@ void GMainWindow::UpdateUITheme() {
qApp->setStyleSheet({}); qApp->setStyleSheet({});
setStyleSheet({}); setStyleSheet({});
} }
#ifdef _WIN32
RemoveTitlebarFilter();
ApplyGlobalDarkTitlebar(UISettings::IsDarkTheme());
#endif
} }
void GMainWindow::LoadTranslation() { void GMainWindow::LoadTranslation() {

View file

@ -397,7 +397,6 @@ private slots:
void OnInstallFirmwareFromZIP(); void OnInstallFirmwareFromZIP();
void OnInstallDecryptionKeys(); void OnInstallDecryptionKeys();
void OnAbout(); void OnAbout();
void OnEdenDependencies();
void OnToggleFilterBar(); void OnToggleFilterBar();
void OnToggleStatusBar(); void OnToggleStatusBar();
void OnGameListRefresh(); void OnGameListRefresh();
@ -467,6 +466,7 @@ private:
void OpenURL(const QUrl& url); void OpenURL(const QUrl& url);
void LoadTranslation(); void LoadTranslation();
void OpenPerGameConfiguration(u64 title_id, const std::string& file_name); void OpenPerGameConfiguration(u64 title_id, const std::string& file_name);
bool CheckDarkMode();
bool CheckFirmwarePresence(); bool CheckFirmwarePresence();
void SetFirmwareVersion(); void SetFirmwareVersion();
void ConfigureFilesystemProvider(const std::string& filepath); void ConfigureFilesystemProvider(const std::string& filepath);
@ -557,6 +557,7 @@ private:
QTimer update_input_timer; QTimer update_input_timer;
QString startup_icon_theme; QString startup_icon_theme;
bool os_dark_mode = false;
// FS // FS
std::shared_ptr<FileSys::VfsFilesystem> vfs; std::shared_ptr<FileSys::VfsFilesystem> vfs;

View file

@ -217,7 +217,6 @@
<addaction name="action_Revolt"/> <addaction name="action_Revolt"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="action_About"/> <addaction name="action_About"/>
<addaction name="action_Eden_Dependencies"/>
</widget> </widget>
<addaction name="menu_File"/> <addaction name="menu_File"/>
<addaction name="menu_Emulation"/> <addaction name="menu_Emulation"/>
@ -576,11 +575,6 @@
<string/> <string/>
</property> </property>
</action> </action>
<action name="action_Eden_Dependencies">
<property name="text">
<string>&amp;Eden Dependencies</string>
</property>
</action>
</widget> </widget>
<resources> <resources>
<include location="yuzu.qrc"/> <include location="yuzu.qrc"/>

View file

@ -1,4 +1,7 @@
#!/bin/sh #!/bin/sh
SUM=`wget -q https://github.com/$1/archive/$2.zip -O - | sha512sum` for i in $@; do
echo "$SUM" | cut -d " " -f1 SUM=`wget -q $i -O - | sha512sum`
echo "$i"
echo "URL_HASH SHA512=$SUM" | cut -d " " -f1-2
done