early-access version 3829
This commit is contained in:
parent
3e1870d567
commit
8c4ecdc426
9 changed files with 63 additions and 35 deletions
|
@ -49,7 +49,7 @@ option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}")
|
||||||
|
|
||||||
option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ON)
|
option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ON)
|
||||||
|
|
||||||
cmake_dependent_option(YUZU_ROOM "Compile LDN room server" ON "NOT ANDROID" OFF)
|
CMAKE_DEPENDENT_OPTION(YUZU_ROOM "Compile LDN room server" ON "NOT ANDROID" OFF)
|
||||||
|
|
||||||
CMAKE_DEPENDENT_OPTION(YUZU_CRASH_DUMPS "Compile Windows crash dump (Minidump) support" OFF "WIN32" OFF)
|
CMAKE_DEPENDENT_OPTION(YUZU_CRASH_DUMPS "Compile Windows crash dump (Minidump) support" OFF "WIN32" OFF)
|
||||||
|
|
||||||
|
@ -63,6 +63,8 @@ option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" OFF)
|
||||||
|
|
||||||
CMAKE_DEPENDENT_OPTION(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "NOT WIN32" OFF)
|
CMAKE_DEPENDENT_OPTION(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "NOT WIN32" OFF)
|
||||||
|
|
||||||
|
CMAKE_DEPENDENT_OPTION(USE_SYSTEM_MOLTENVK "Use the system MoltenVK lib (instead of the bundled one)" OFF "APPLE" OFF)
|
||||||
|
|
||||||
set(DEFAULT_ENABLE_OPENSSL ON)
|
set(DEFAULT_ENABLE_OPENSSL ON)
|
||||||
if (ANDROID OR WIN32 OR APPLE)
|
if (ANDROID OR WIN32 OR APPLE)
|
||||||
# - Windows defaults to the Schannel backend.
|
# - Windows defaults to the Schannel backend.
|
||||||
|
|
|
@ -36,3 +36,21 @@ endif()
|
||||||
message(STATUS "Using bundled binaries at ${prefix}")
|
message(STATUS "Using bundled binaries at ${prefix}")
|
||||||
set(${prefix_var} "${prefix}" PARENT_SCOPE)
|
set(${prefix_var} "${prefix}" PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
function(download_moltenvk_external platform version)
|
||||||
|
set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK")
|
||||||
|
set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar")
|
||||||
|
if (NOT EXISTS ${MOLTENVK_DIR})
|
||||||
|
if (NOT EXISTS ${MOLTENVK_TAR})
|
||||||
|
file(DOWNLOAD https://github.com/KhronosGroup/MoltenVK/releases/download/${version}/MoltenVK-${platform}.tar
|
||||||
|
${MOLTENVK_TAR} SHOW_PROGRESS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}"
|
||||||
|
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Add the MoltenVK library path to the prefix so find_library can locate it.
|
||||||
|
list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/dylib/${platform}")
|
||||||
|
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 3828.
|
This is the source code for early-access 3829.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,6 @@ private:
|
||||||
bool do_not_close_socket = false;
|
bool do_not_close_socket = false;
|
||||||
bool get_server_cert_chain = false;
|
bool get_server_cert_chain = false;
|
||||||
std::shared_ptr<Network::SocketBase> socket;
|
std::shared_ptr<Network::SocketBase> socket;
|
||||||
bool did_set_host_name = false;
|
|
||||||
bool did_handshake = false;
|
bool did_handshake = false;
|
||||||
|
|
||||||
Result SetSocketDescriptorImpl(s32* out_fd, s32 fd) {
|
Result SetSocketDescriptorImpl(s32* out_fd, s32 fd) {
|
||||||
|
@ -174,11 +173,7 @@ private:
|
||||||
Result SetHostNameImpl(const std::string& hostname) {
|
Result SetHostNameImpl(const std::string& hostname) {
|
||||||
LOG_DEBUG(Service_SSL, "called. hostname={}", hostname);
|
LOG_DEBUG(Service_SSL, "called. hostname={}", hostname);
|
||||||
ASSERT(!did_handshake);
|
ASSERT(!did_handshake);
|
||||||
Result res = backend->SetHostName(hostname);
|
return backend->SetHostName(hostname);
|
||||||
if (res == ResultSuccess) {
|
|
||||||
did_set_host_name = true;
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Result SetVerifyOptionImpl(u32 option) {
|
Result SetVerifyOptionImpl(u32 option) {
|
||||||
|
@ -208,9 +203,6 @@ private:
|
||||||
|
|
||||||
Result DoHandshakeImpl() {
|
Result DoHandshakeImpl() {
|
||||||
ASSERT_OR_EXECUTE(!did_handshake && socket, { return ResultNoSocket; });
|
ASSERT_OR_EXECUTE(!did_handshake && socket, { return ResultNoSocket; });
|
||||||
ASSERT_OR_EXECUTE_MSG(
|
|
||||||
did_set_host_name, { return ResultInternalError; },
|
|
||||||
"Expected SetHostName before DoHandshake");
|
|
||||||
Result res = backend->DoHandshake();
|
Result res = backend->DoHandshake();
|
||||||
did_handshake = res.IsSuccess();
|
did_handshake = res.IsSuccess();
|
||||||
return res;
|
return res;
|
||||||
|
|
|
@ -167,9 +167,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
~SSLConnectionBackendOpenSSL() {
|
~SSLConnectionBackendOpenSSL() {
|
||||||
// these are null-tolerant:
|
// this is null-tolerant:
|
||||||
SSL_free(ssl);
|
SSL_free(ssl);
|
||||||
BIO_free(bio);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void KeyLogCallback(const SSL* ssl, const char* line) {
|
static void KeyLogCallback(const SSL* ssl, const char* line) {
|
||||||
|
|
|
@ -31,9 +31,9 @@ CredHandle cred_handle;
|
||||||
static void OneTimeInit() {
|
static void OneTimeInit() {
|
||||||
schannel_cred.dwVersion = SCHANNEL_CRED_VERSION;
|
schannel_cred.dwVersion = SCHANNEL_CRED_VERSION;
|
||||||
schannel_cred.dwFlags =
|
schannel_cred.dwFlags =
|
||||||
SCH_USE_STRONG_CRYPTO | // don't allow insecure protocols
|
SCH_USE_STRONG_CRYPTO | // don't allow insecure protocols
|
||||||
SCH_CRED_AUTO_CRED_VALIDATION | // validate certs
|
SCH_CRED_NO_SERVERNAME_CHECK | // don't validate server names
|
||||||
SCH_CRED_NO_DEFAULT_CREDS; // don't automatically present a client certificate
|
SCH_CRED_NO_DEFAULT_CREDS; // don't automatically present a client certificate
|
||||||
// ^ I'm assuming that nobody would want to connect Yuzu to a
|
// ^ I'm assuming that nobody would want to connect Yuzu to a
|
||||||
// service that requires some OS-provided corporate client
|
// service that requires some OS-provided corporate client
|
||||||
// certificate, and presenting one to some arbitrary server
|
// certificate, and presenting one to some arbitrary server
|
||||||
|
@ -227,16 +227,15 @@ public:
|
||||||
ciphertext_read_buf.size());
|
ciphertext_read_buf.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
const SECURITY_STATUS ret =
|
char* hostname_ptr = hostname ? const_cast<char*>(hostname->c_str()) : nullptr;
|
||||||
InitializeSecurityContextA(&cred_handle, initial_call_done ? &ctxt : nullptr,
|
const SECURITY_STATUS ret = InitializeSecurityContextA(
|
||||||
// Caller ensured we have set a hostname:
|
&cred_handle, initial_call_done ? &ctxt : nullptr, hostname_ptr, req,
|
||||||
const_cast<char*>(hostname.value().c_str()), req,
|
0, // Reserved1
|
||||||
0, // Reserved1
|
0, // TargetDataRep not used with Schannel
|
||||||
0, // TargetDataRep not used with Schannel
|
initial_call_done ? &input_desc : nullptr,
|
||||||
initial_call_done ? &input_desc : nullptr,
|
0, // Reserved2
|
||||||
0, // Reserved2
|
initial_call_done ? nullptr : &ctxt, &output_desc, &attr,
|
||||||
initial_call_done ? nullptr : &ctxt, &output_desc, &attr,
|
nullptr); // ptsExpiry
|
||||||
nullptr); // ptsExpiry
|
|
||||||
|
|
||||||
if (output_buffers[0].pvBuffer) {
|
if (output_buffers[0].pvBuffer) {
|
||||||
const std::span span(static_cast<u8*>(output_buffers[0].pvBuffer),
|
const std::span span(static_cast<u8*>(output_buffers[0].pvBuffer),
|
||||||
|
|
|
@ -41,9 +41,6 @@ namespace {
|
||||||
bool enable_validation) {
|
bool enable_validation) {
|
||||||
std::vector<const char*> extensions;
|
std::vector<const char*> extensions;
|
||||||
extensions.reserve(6);
|
extensions.reserve(6);
|
||||||
#ifdef __APPLE__
|
|
||||||
extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME);
|
|
||||||
#endif
|
|
||||||
switch (window_type) {
|
switch (window_type) {
|
||||||
case Core::Frontend::WindowSystemType::Headless:
|
case Core::Frontend::WindowSystemType::Headless:
|
||||||
break;
|
break;
|
||||||
|
@ -74,6 +71,11 @@ namespace {
|
||||||
if (window_type != Core::Frontend::WindowSystemType::Headless) {
|
if (window_type != Core::Frontend::WindowSystemType::Headless) {
|
||||||
extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
|
extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
|
||||||
}
|
}
|
||||||
|
#ifdef __APPLE__
|
||||||
|
if (AreExtensionsSupported(dld, std::array{VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME})) {
|
||||||
|
extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (enable_validation) {
|
if (enable_validation) {
|
||||||
const bool debug_utils =
|
const bool debug_utils =
|
||||||
AreExtensionsSupported(dld, std::array{VK_EXT_DEBUG_UTILS_EXTENSION_NAME});
|
AreExtensionsSupported(dld, std::array{VK_EXT_DEBUG_UTILS_EXTENSION_NAME});
|
||||||
|
|
|
@ -19,13 +19,17 @@ std::shared_ptr<Common::DynamicLibrary> OpenLibrary(
|
||||||
#else
|
#else
|
||||||
auto library = std::make_shared<Common::DynamicLibrary>();
|
auto library = std::make_shared<Common::DynamicLibrary>();
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
|
const auto libvulkan_filename =
|
||||||
|
Common::FS::GetBundleDirectory() / "Contents/Frameworks/libvulkan.1.dylib";
|
||||||
|
const auto libmoltenvk_filename =
|
||||||
|
Common::FS::GetBundleDirectory() / "Contents/Frameworks/libMoltenVK.dylib";
|
||||||
|
const char* library_paths[] = {std::getenv("LIBVULKAN_PATH"), libvulkan_filename.c_str(),
|
||||||
|
libmoltenvk_filename.c_str()};
|
||||||
// Check if a path to a specific Vulkan library has been specified.
|
// Check if a path to a specific Vulkan library has been specified.
|
||||||
char* const libvulkan_env = std::getenv("LIBVULKAN_PATH");
|
for (const auto& library_path : library_paths) {
|
||||||
if (!libvulkan_env || !library->Open(libvulkan_env)) {
|
if (library_path && library->Open(library_path)) {
|
||||||
// Use the libvulkan.dylib from the application bundle.
|
break;
|
||||||
const auto filename =
|
}
|
||||||
Common::FS::GetBundleDirectory() / "Contents/Frameworks/libvulkan.dylib";
|
|
||||||
void(library->Open(Common::FS::PathToUTF8String(filename).c_str()));
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
std::string filename = Common::DynamicLibrary::GetVersionedFilename("vulkan", 1);
|
std::string filename = Common::DynamicLibrary::GetVersionedFilename("vulkan", 1);
|
||||||
|
|
|
@ -313,6 +313,18 @@ if (APPLE)
|
||||||
target_sources(yuzu PRIVATE ${MACOSX_ICON})
|
target_sources(yuzu PRIVATE ${MACOSX_ICON})
|
||||||
set_target_properties(yuzu PROPERTIES MACOSX_BUNDLE TRUE)
|
set_target_properties(yuzu PROPERTIES MACOSX_BUNDLE TRUE)
|
||||||
set_target_properties(yuzu PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
|
set_target_properties(yuzu PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
|
||||||
|
|
||||||
|
if (NOT USE_SYSTEM_MOLTENVK)
|
||||||
|
set(MOLTENVK_PLATFORM "macOS")
|
||||||
|
set(MOLTENVK_VERSION "v1.2.5")
|
||||||
|
download_moltenvk_external(${MOLTENVK_PLATFORM} ${MOLTENVK_VERSION})
|
||||||
|
endif()
|
||||||
|
find_library(MOLTENVK_LIBRARY MoltenVK REQUIRED)
|
||||||
|
message(STATUS "Using MoltenVK at ${MOLTENVK_LIBRARY}.")
|
||||||
|
set_source_files_properties(${MOLTENVK_LIBRARY} PROPERTIES MACOSX_PACKAGE_LOCATION Frameworks
|
||||||
|
XCODE_FILE_ATTRIBUTES "CodeSignOnCopy")
|
||||||
|
target_sources(yuzu PRIVATE ${MOLTENVK_LIBRARY})
|
||||||
|
|
||||||
elseif(WIN32)
|
elseif(WIN32)
|
||||||
# compile as a win32 gui application instead of a console application
|
# compile as a win32 gui application instead of a console application
|
||||||
if (QT_VERSION VERSION_GREATER_EQUAL 6)
|
if (QT_VERSION VERSION_GREATER_EQUAL 6)
|
||||||
|
|
Loading…
Reference in a new issue