mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-11-01 20:01:53 +00:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cf1d905786 | |||
| 60003ea642 | |||
| 43607d0b7e |
@@ -24,7 +24,7 @@ std::string NativeErrorToString(int e) {
|
|||||||
DWORD res = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
DWORD res = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
nullptr, e, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
nullptr, e, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||||
LPSTR(&err_str), 1, nullptr);
|
reinterpret_cast<LPSTR>(&err_str), 1, nullptr);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
return "(FormatMessageA failed to format error)";
|
return "(FormatMessageA failed to format error)";
|
||||||
}
|
}
|
||||||
@@ -32,10 +32,9 @@ std::string NativeErrorToString(int e) {
|
|||||||
LocalFree(err_str);
|
LocalFree(err_str);
|
||||||
return ret;
|
return ret;
|
||||||
#else
|
#else
|
||||||
char err_str[256];
|
char err_str[255];
|
||||||
// See https://github.com/llvm/llvm-project/blob/c8fdb5f8b93c3e1da5e2ff3ba8b18627d6147b51/openmp/runtime/src/kmp_i18n.cpp#L711
|
#if defined(__ANDROID__) || \
|
||||||
// musl doesn't provide a macro gate but defines strerror_r() even if _GNU_SOURCE is defined
|
(defined(__GLIBC__) && (_GNU_SOURCE || (_POSIX_C_SOURCE < 200112L && _XOPEN_SOURCE < 600)))
|
||||||
#if defined(__managarm__) || (defined(__GLIBC__) || defined(__BIONIC__)) || defined(_GNU_SOURCE)
|
|
||||||
// Thread safe (GNU-specific)
|
// Thread safe (GNU-specific)
|
||||||
const char* str = strerror_r(e, err_str, sizeof(err_str));
|
const char* str = strerror_r(e, err_str, sizeof(err_str));
|
||||||
return std::string(str);
|
return std::string(str);
|
||||||
|
|||||||
@@ -796,8 +796,6 @@ add_library(core STATIC
|
|||||||
hle/service/ns/application_manager_interface.h
|
hle/service/ns/application_manager_interface.h
|
||||||
hle/service/ns/application_version_interface.cpp
|
hle/service/ns/application_version_interface.cpp
|
||||||
hle/service/ns/application_version_interface.h
|
hle/service/ns/application_version_interface.h
|
||||||
hle/service/ns/async_result.cpp
|
|
||||||
hle/service/ns/async_result.h
|
|
||||||
hle/service/ns/content_management_interface.cpp
|
hle/service/ns/content_management_interface.cpp
|
||||||
hle/service/ns/content_management_interface.h
|
hle/service/ns/content_management_interface.h
|
||||||
hle/service/ns/develop_interface.cpp
|
hle/service/ns/develop_interface.cpp
|
||||||
@@ -812,6 +810,8 @@ add_library(core STATIC
|
|||||||
hle/service/ns/ecommerce_interface.h
|
hle/service/ns/ecommerce_interface.h
|
||||||
hle/service/ns/factory_reset_interface.cpp
|
hle/service/ns/factory_reset_interface.cpp
|
||||||
hle/service/ns/factory_reset_interface.h
|
hle/service/ns/factory_reset_interface.h
|
||||||
|
hle/service/ns/i_async_result.cpp
|
||||||
|
hle/service/ns/i_async_result.h
|
||||||
hle/service/ns/language.cpp
|
hle/service/ns/language.cpp
|
||||||
hle/service/ns/language.h
|
hle/service/ns/language.h
|
||||||
hle/service/ns/ns.cpp
|
hle/service/ns/ns.cpp
|
||||||
|
|||||||
@@ -12,7 +12,6 @@
|
|||||||
#include "hid_core/frontend/emulated_controller.h"
|
#include "hid_core/frontend/emulated_controller.h"
|
||||||
#include "hid_core/hid_core.h"
|
#include "hid_core/hid_core.h"
|
||||||
#include "hid_core/hid_types.h"
|
#include "hid_core/hid_types.h"
|
||||||
#include <array>
|
|
||||||
|
|
||||||
namespace Core::Frontend {
|
namespace Core::Frontend {
|
||||||
|
|
||||||
@@ -30,39 +29,23 @@ void DefaultControllerApplet::ReconfigureControllers(ReconfigureCallback callbac
|
|||||||
|
|
||||||
const std::size_t min_supported_players =
|
const std::size_t min_supported_players =
|
||||||
parameters.enable_single_mode ? 1 : parameters.min_players;
|
parameters.enable_single_mode ? 1 : parameters.min_players;
|
||||||
using Core::HID::NpadStyleIndex;
|
|
||||||
const std::size_t max_supported_players = parameters.enable_single_mode ? 1 : parameters.max_players;
|
|
||||||
std::size_t num_selected_players = 0;
|
|
||||||
std::array<bool, HID::HIDCore::available_controllers> keep_connected{};
|
|
||||||
|
|
||||||
// reserve existing AND valid players before filling slots. include Handheld, but not other
|
// Disconnect Handheld first.
|
||||||
for (std::size_t index = 0; index < hid_core.available_controllers - 1; ++index) {
|
|
||||||
const auto* controller = hid_core.GetEmulatedControllerByIndex(index);
|
|
||||||
if (!parameters.keep_controllers_connected || !controller->IsConnected() || num_selected_players >= max_supported_players) continue;
|
|
||||||
|
|
||||||
const auto style = controller->GetNpadStyleIndex();
|
|
||||||
keep_connected[index] =
|
|
||||||
(style == NpadStyleIndex::Fullkey && parameters.allow_pro_controller) ||
|
|
||||||
(style == NpadStyleIndex::JoyconDual && parameters.allow_dual_joycons) ||
|
|
||||||
(style == NpadStyleIndex::JoyconLeft && parameters.allow_left_joycon) ||
|
|
||||||
(style == NpadStyleIndex::JoyconRight && parameters.allow_right_joycon) ||
|
|
||||||
(style == NpadStyleIndex::Handheld && parameters.enable_single_mode && parameters.allow_handheld && !Settings::IsDockedMode()) ||
|
|
||||||
(style == NpadStyleIndex::GameCube && parameters.allow_gamecube_controller);
|
|
||||||
num_selected_players += keep_connected[index];
|
|
||||||
}
|
|
||||||
auto* handheld = hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld);
|
auto* handheld = hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld);
|
||||||
if (!keep_connected[hid_core.available_controllers - 2]) handheld->Disconnect();
|
handheld->Disconnect();
|
||||||
|
|
||||||
// Deduce the best configuration based on the input parameters.
|
// Deduce the best configuration based on the input parameters.
|
||||||
for (std::size_t index = 0; index < hid_core.available_controllers - 2; ++index) {
|
for (std::size_t index = 0; index < hid_core.available_controllers - 2; ++index) {
|
||||||
auto* controller = hid_core.GetEmulatedControllerByIndex(index);
|
auto* controller = hid_core.GetEmulatedControllerByIndex(index);
|
||||||
|
|
||||||
if (keep_connected[index]) continue;
|
// First, disconnect all controllers regardless of the value of keep_controllers_connected.
|
||||||
|
// This makes it easy to connect the desired controllers.
|
||||||
controller->Disconnect();
|
controller->Disconnect();
|
||||||
|
|
||||||
// only add players still needed to reach the minimum
|
// Only connect the minimum number of required players.
|
||||||
if (num_selected_players >= min_supported_players) continue;
|
if (index >= min_supported_players) {
|
||||||
++num_selected_players;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Connect controllers based on the following priority list from highest to lowest priority:
|
// Connect controllers based on the following priority list from highest to lowest priority:
|
||||||
// Pro Controller -> Dual Joycons -> Left Joycon/Right Joycon -> Handheld
|
// Pro Controller -> Dual Joycons -> Left Joycon/Right Joycon -> Handheld
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "core/hle/service/cmif_types.h"
|
#include "core/hle/service/cmif_types.h"
|
||||||
#include "core/hle/service/ns/async_result.h"
|
#include "core/hle/service/ns/i_async_result.h"
|
||||||
#include "core/hle/service/ns/language.h"
|
#include "core/hle/service/ns/language.h"
|
||||||
#include "core/hle/service/ns/ns_types.h"
|
#include "core/hle/service/ns/ns_types.h"
|
||||||
#include "core/hle/service/os/event.h"
|
#include "core/hle/service/os/event.h"
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
#include "core/hle/service/cmif_serialization.h"
|
#include "core/hle/service/cmif_serialization.h"
|
||||||
#include "core/hle/service/ns/async_result.h"
|
#include "core/hle/service/ns/i_async_result.h"
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
@@ -311,30 +311,27 @@ void IReadOnlyApplicationControlDataInterface::ListApplicationIcon(HLERequestCon
|
|||||||
// u64 - app count
|
// u64 - app count
|
||||||
memory.WriteBlock(t_mem_address + out_length, &app_count, sizeof(u64));
|
memory.WriteBlock(t_mem_address + out_length, &app_count, sizeof(u64));
|
||||||
out_length += sizeof(u64);
|
out_length += sizeof(u64);
|
||||||
ASSERT(out_length <= t_mem->GetSize());
|
|
||||||
// [list of u64] - size of icons
|
// [list of u64] - size of icons
|
||||||
for (size_t i = 0; i < app_count; ++i) {
|
for (size_t i = 0; i < app_count; ++i) {
|
||||||
const u64 app_id = app_ids_buffer[i];
|
const u64 app_id = app_ids_buffer[i];
|
||||||
const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), system.GetContentProvider()};
|
const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), system.GetContentProvider()};
|
||||||
if (const auto control = pm.GetControlMetadata(); control.second) {
|
const auto control = pm.GetControlMetadata();
|
||||||
u64 full_size = control.second->GetSize();
|
u64 full_size = control.second->GetSize();
|
||||||
memory.WriteBlock(t_mem_address + out_length, &full_size, sizeof(u64));
|
memory.WriteBlock(t_mem_address + out_length, &full_size, sizeof(u64));
|
||||||
}
|
|
||||||
out_length += sizeof(u64);
|
out_length += sizeof(u64);
|
||||||
ASSERT(out_length <= t_mem->GetSize());
|
|
||||||
}
|
}
|
||||||
// [list of raw icon data]
|
// [list of raw icon data]
|
||||||
|
std::vector<u8> full_icon_data;
|
||||||
for (size_t i = 0; i < app_count; ++i) {
|
for (size_t i = 0; i < app_count; ++i) {
|
||||||
const u64 app_id = app_ids_buffer[i];
|
const u64 app_id = app_ids_buffer[i];
|
||||||
const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), system.GetContentProvider()};
|
const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), system.GetContentProvider()};
|
||||||
if (const auto control = pm.GetControlMetadata(); control.second) {
|
const auto control = pm.GetControlMetadata();
|
||||||
if (auto const full_size = control.second->GetSize(); full_size > 0) {
|
auto const full_size = control.second->GetSize();
|
||||||
std::vector<u8> full_icon_data(full_size);
|
if (full_size > 0) {
|
||||||
control.second->Read(full_icon_data.data(), full_size, 0);
|
full_icon_data.resize(full_size);
|
||||||
memory.WriteBlock(t_mem_address + out_length, full_icon_data.data(), full_size);
|
control.second->Read(full_icon_data.data(), full_size, 0);
|
||||||
out_length += full_size;
|
memory.WriteBlock(t_mem_address + out_length, full_icon_data.data(), full_size);
|
||||||
ASSERT(out_length <= t_mem->GetSize());
|
out_length += full_size;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -348,12 +345,6 @@ void IReadOnlyApplicationControlDataInterface::ListApplicationIcon(HLERequestCon
|
|||||||
void IReadOnlyApplicationControlDataInterface::ListApplicationTitle(HLERequestContext& ctx) {
|
void IReadOnlyApplicationControlDataInterface::ListApplicationTitle(HLERequestContext& ctx) {
|
||||||
const auto app_ids_buffer = ctx.ReadBuffer();
|
const auto app_ids_buffer = ctx.ReadBuffer();
|
||||||
const size_t app_count = app_ids_buffer.size() / sizeof(u64);
|
const size_t app_count = app_ids_buffer.size() / sizeof(u64);
|
||||||
|
|
||||||
std::vector<u64> application_ids(app_count);
|
|
||||||
if (app_count > 0) {
|
|
||||||
std::memcpy(application_ids.data(), app_ids_buffer.data(), app_count * sizeof(u64));
|
|
||||||
}
|
|
||||||
|
|
||||||
auto t_mem_obj = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(ctx.GetCopyHandle(0));
|
auto t_mem_obj = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(ctx.GetCopyHandle(0));
|
||||||
auto* t_mem = t_mem_obj.GetPointerUnsafe();
|
auto* t_mem = t_mem_obj.GetPointerUnsafe();
|
||||||
constexpr size_t title_entry_size = sizeof(FileSys::LanguageEntry);
|
constexpr size_t title_entry_size = sizeof(FileSys::LanguageEntry);
|
||||||
@@ -363,9 +354,8 @@ void IReadOnlyApplicationControlDataInterface::ListApplicationTitle(HLERequestCo
|
|||||||
auto& memory = system.ApplicationMemory();
|
auto& memory = system.ApplicationMemory();
|
||||||
const auto t_mem_address = t_mem->GetSourceAddress();
|
const auto t_mem_address = t_mem->GetSourceAddress();
|
||||||
for (size_t i = 0; i < app_count; ++i) {
|
for (size_t i = 0; i < app_count; ++i) {
|
||||||
const u64 app_id = application_ids[i];
|
const u64 app_id = app_ids_buffer[i];
|
||||||
const FileSys::PatchManager pm{app_id, system.GetFileSystemController(),
|
const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), system.GetContentProvider()};
|
||||||
system.GetContentProvider()};
|
|
||||||
const auto control = pm.GetControlMetadata();
|
const auto control = pm.GetControlMetadata();
|
||||||
FileSys::LanguageEntry entry{};
|
FileSys::LanguageEntry entry{};
|
||||||
if (control.first != nullptr) {
|
if (control.first != nullptr) {
|
||||||
|
|||||||
@@ -2850,6 +2850,8 @@ Sampler::VariantKey Sampler::MakeKey(const ImageView& image_view, bool is_depth)
|
|||||||
VariantKey key{};
|
VariantKey key{};
|
||||||
key.reduce_anisotropy = has_added_anisotropy && !image_view.SupportsAnisotropy();
|
key.reduce_anisotropy = has_added_anisotropy && !image_view.SupportsAnisotropy();
|
||||||
key.force_nearest = has_linear_filtering && IsPixelFormatInteger(image_view.format);
|
key.force_nearest = has_linear_filtering && IsPixelFormatInteger(image_view.format);
|
||||||
|
key.drop_depth_comparison =
|
||||||
|
is_depth && has_depth_comparison && !image_view.SupportsDepthComparison();
|
||||||
key.drop_reduction = has_minmax_reduction && !image_view.SupportsMinmaxFilter();
|
key.drop_reduction = has_minmax_reduction && !image_view.SupportsMinmaxFilter();
|
||||||
key.drop_custom_border = has_custom_border_colors && image_view.RequiresBorderColorFormat();
|
key.drop_custom_border = has_custom_border_colors && image_view.RequiresBorderColorFormat();
|
||||||
key.srgb_border = has_srgb_border_color && IsPixelFormatSRGB(image_view.format);
|
key.srgb_border = has_srgb_border_color && IsPixelFormatSRGB(image_view.format);
|
||||||
@@ -2927,6 +2929,9 @@ VkSampler Sampler::Emplace(VariantKey key) {
|
|||||||
create_info.anisotropyEnable = static_cast<VkBool32>(default_anisotropy > 1.0f);
|
create_info.anisotropyEnable = static_cast<VkBool32>(default_anisotropy > 1.0f);
|
||||||
create_info.maxAnisotropy = default_anisotropy;
|
create_info.maxAnisotropy = default_anisotropy;
|
||||||
}
|
}
|
||||||
|
if (key.drop_depth_comparison) {
|
||||||
|
create_info.compareEnable = VK_FALSE;
|
||||||
|
}
|
||||||
if (!custom_border) {
|
if (!custom_border) {
|
||||||
create_info.borderColor = ConvertBorderColor(color);
|
create_info.borderColor = ConvertBorderColor(color);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -536,6 +536,7 @@ private:
|
|||||||
struct VariantKey {
|
struct VariantKey {
|
||||||
bool reduce_anisotropy;
|
bool reduce_anisotropy;
|
||||||
bool force_nearest;
|
bool force_nearest;
|
||||||
|
bool drop_depth_comparison;
|
||||||
bool drop_reduction;
|
bool drop_reduction;
|
||||||
bool drop_custom_border;
|
bool drop_custom_border;
|
||||||
bool srgb_border;
|
bool srgb_border;
|
||||||
|
|||||||
@@ -444,6 +444,10 @@ if (YUZU_ROOM)
|
|||||||
target_link_libraries(yuzu PRIVATE yuzu-room)
|
target_link_libraries(yuzu PRIVATE yuzu-room)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (LINKER STREQUAL "lld")
|
||||||
|
target_link_options(yuzu-cmd PRIVATE "LINKER:--icf=all")
|
||||||
|
endif()
|
||||||
|
|
||||||
if (NOT MSVC AND (APPLE OR NOT YUZU_STATIC_BUILD))
|
if (NOT MSVC AND (APPLE OR NOT YUZU_STATIC_BUILD))
|
||||||
# needed for vma
|
# needed for vma
|
||||||
target_compile_options(yuzu PRIVATE
|
target_compile_options(yuzu PRIVATE
|
||||||
|
|||||||
@@ -67,6 +67,10 @@ endif()
|
|||||||
|
|
||||||
create_target_directory_groups(yuzu-cmd)
|
create_target_directory_groups(yuzu-cmd)
|
||||||
|
|
||||||
|
if (LINKER STREQUAL "lld")
|
||||||
|
target_link_options(yuzu-cmd PRIVATE "LINKER:--icf=all")
|
||||||
|
endif()
|
||||||
|
|
||||||
# needed for vma
|
# needed for vma
|
||||||
if (NOT MSVC)
|
if (NOT MSVC)
|
||||||
target_compile_options(yuzu-cmd PRIVATE
|
target_compile_options(yuzu-cmd PRIVATE
|
||||||
|
|||||||
Reference in New Issue
Block a user